!function(e){function r(r){for(var n,l,f=r[0],i=r[1],p=r[2],c=0,s=[];c<f.length;c++)l=f[c],Object.prototype.hasOwnProperty.call(o,l)&&o[l]&&s.push(o[l][0]),o[l]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(a&&a(r);s.length;)s.shift()();return u.push.apply(u,p||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,f=1;f<t.length;f++)0!==o[t[f]]&&(n=!1);n&&(u.splice(r--,1),e=l(l.s=t[0]))}return e}var n={},o={0:0},u=[];function l(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,l),t.l=!0,t.exports}l.m=e,l.c=n,l.d=function(e,r,t){l.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},l.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(e,r){if(1&r&&(e=l(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(l.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)l.d(t,n,(function(r){return e[r]}).bind(null,n));return t},l.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(r,"a",r),r},l.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},l.p="";var f=window.webpackJsonp=window.webpackJsonp||[],i=f.push.bind(f);f.push=r,f=f.slice();for(var p=0;p<f.length;p++)r(f[p]);var a=i;t()}([]);
(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{2:function(e,t,n){e.exports=n("hN/g")},"hN/g":function(e,t,n){"use strict";n.r(t),n("nf2o")},nf2o:function(e,t,n){var o,r;void 0===(r="function"==typeof(o=function(){"use strict";!function(e){const t=e.performance;function n(e){t&&t.mark&&t.mark(e)}function o(e,n){t&&t.measure&&t.measure(e,n)}n("Zone");const r=e.__Zone_symbol_prefix||"__zone_symbol__";function s(e){return r+e}const a=!0===e[s("forceDuplicateZoneCheck")];if(e.Zone){if(a||"function"!=typeof e.Zone.__symbol__)throw new Error("Zone already loaded.");return e.Zone}class i{constructor(e,t){this._parent=e,this._name=t?t.name||"unnamed":"<root>",this._properties=t&&t.properties||{},this._zoneDelegate=new l(this,this._parent&&this._parent._zoneDelegate,t)}static assertZonePatched(){if(e.Promise!==z.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")}static get root(){let e=i.current;for(;e.parent;)e=e.parent;return e}static get current(){return O.zone}static get currentTask(){return j}static __load_patch(t,r){if(z.hasOwnProperty(t)){if(a)throw Error("Already loaded patch: "+t)}else if(!e["__Zone_disable_"+t]){const s="Zone:"+t;n(s),z[t]=r(e,i,C),o(s,s)}}get parent(){return this._parent}get name(){return this._name}get(e){const t=this.getZoneWith(e);if(t)return t._properties[e]}getZoneWith(e){let t=this;for(;t;){if(t._properties.hasOwnProperty(e))return t;t=t._parent}return null}fork(e){if(!e)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,e)}wrap(e,t){if("function"!=typeof e)throw new Error("Expecting function got: "+e);const n=this._zoneDelegate.intercept(this,e,t),o=this;return function(){return o.runGuarded(n,this,arguments,t)}}run(e,t,n,o){O={parent:O,zone:this};try{return this._zoneDelegate.invoke(this,e,t,n,o)}finally{O=O.parent}}runGuarded(e,t=null,n,o){O={parent:O,zone:this};try{try{return this._zoneDelegate.invoke(this,e,t,n,o)}catch(r){if(this._zoneDelegate.handleError(this,r))throw r}}finally{O=O.parent}}runTask(e,t,n){if(e.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(e.zone||y).name+"; Execution: "+this.name+")");if(e.state===v&&(e.type===P||e.type===D))return;const o=e.state!=E;o&&e._transitionTo(E,b),e.runCount++;const r=j;j=e,O={parent:O,zone:this};try{e.type==D&&e.data&&!e.data.isPeriodic&&(e.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,e,t,n)}catch(s){if(this._zoneDelegate.handleError(this,s))throw s}}finally{e.state!==v&&e.state!==Z&&(e.type==P||e.data&&e.data.isPeriodic?o&&e._transitionTo(b,E):(e.runCount=0,this._updateTaskCount(e,-1),o&&e._transitionTo(v,E,v))),O=O.parent,j=r}}scheduleTask(e){if(e.zone&&e.zone!==this){let t=this;for(;t;){if(t===e.zone)throw Error(`can not reschedule task to ${this.name} which is descendants of the original zone ${e.zone.name}`);t=t.parent}}e._transitionTo(T,v);const t=[];e._zoneDelegates=t,e._zone=this;try{e=this._zoneDelegate.scheduleTask(this,e)}catch(n){throw e._transitionTo(Z,T,v),this._zoneDelegate.handleError(this,n),n}return e._zoneDelegates===t&&this._updateTaskCount(e,1),e.state==T&&e._transitionTo(b,T),e}scheduleMicroTask(e,t,n,o){return this.scheduleTask(new u(S,e,t,n,o,void 0))}scheduleMacroTask(e,t,n,o,r){return this.scheduleTask(new u(D,e,t,n,o,r))}scheduleEventTask(e,t,n,o,r){return this.scheduleTask(new u(P,e,t,n,o,r))}cancelTask(e){if(e.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(e.zone||y).name+"; Execution: "+this.name+")");e._transitionTo(w,b,E);try{this._zoneDelegate.cancelTask(this,e)}catch(t){throw e._transitionTo(Z,w),this._zoneDelegate.handleError(this,t),t}return this._updateTaskCount(e,-1),e._transitionTo(v,w),e.runCount=0,e}_updateTaskCount(e,t){const n=e._zoneDelegates;-1==t&&(e._zoneDelegates=null);for(let o=0;o<n.length;o++)n[o]._updateTaskCount(e.type,t)}}i.__symbol__=s;const c={name:"",onHasTask:(e,t,n,o)=>e.hasTask(n,o),onScheduleTask:(e,t,n,o)=>e.scheduleTask(n,o),onInvokeTask:(e,t,n,o,r,s)=>e.invokeTask(n,o,r,s),onCancelTask:(e,t,n,o)=>e.cancelTask(n,o)};class l{constructor(e,t,n){this._taskCounts={microTask:0,macroTask:0,eventTask:0},this.zone=e,this._parentDelegate=t,this._forkZS=n&&(n&&n.onFork?n:t._forkZS),this._forkDlgt=n&&(n.onFork?t:t._forkDlgt),this._forkCurrZone=n&&(n.onFork?this.zone:t._forkCurrZone),this._interceptZS=n&&(n.onIntercept?n:t._interceptZS),this._interceptDlgt=n&&(n.onIntercept?t:t._interceptDlgt),this._interceptCurrZone=n&&(n.onIntercept?this.zone:t._interceptCurrZone),this._invokeZS=n&&(n.onInvoke?n:t._invokeZS),this._invokeDlgt=n&&(n.onInvoke?t:t._invokeDlgt),this._invokeCurrZone=n&&(n.onInvoke?this.zone:t._invokeCurrZone),this._handleErrorZS=n&&(n.onHandleError?n:t._handleErrorZS),this._handleErrorDlgt=n&&(n.onHandleError?t:t._handleErrorDlgt),this._handleErrorCurrZone=n&&(n.onHandleError?this.zone:t._handleErrorCurrZone),this._scheduleTaskZS=n&&(n.onScheduleTask?n:t._scheduleTaskZS),this._scheduleTaskDlgt=n&&(n.onScheduleTask?t:t._scheduleTaskDlgt),this._scheduleTaskCurrZone=n&&(n.onScheduleTask?this.zone:t._scheduleTaskCurrZone),this._invokeTaskZS=n&&(n.onInvokeTask?n:t._invokeTaskZS),this._invokeTaskDlgt=n&&(n.onInvokeTask?t:t._invokeTaskDlgt),this._invokeTaskCurrZone=n&&(n.onInvokeTask?this.zone:t._invokeTaskCurrZone),this._cancelTaskZS=n&&(n.onCancelTask?n:t._cancelTaskZS),this._cancelTaskDlgt=n&&(n.onCancelTask?t:t._cancelTaskDlgt),this._cancelTaskCurrZone=n&&(n.onCancelTask?this.zone:t._cancelTaskCurrZone),this._hasTaskZS=null,this._hasTaskDlgt=null,this._hasTaskDlgtOwner=null,this._hasTaskCurrZone=null;const o=n&&n.onHasTask;(o||t&&t._hasTaskZS)&&(this._hasTaskZS=o?n:c,this._hasTaskDlgt=t,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=e,n.onScheduleTask||(this._scheduleTaskZS=c,this._scheduleTaskDlgt=t,this._scheduleTaskCurrZone=this.zone),n.onInvokeTask||(this._invokeTaskZS=c,this._invokeTaskDlgt=t,this._invokeTaskCurrZone=this.zone),n.onCancelTask||(this._cancelTaskZS=c,this._cancelTaskDlgt=t,this._cancelTaskCurrZone=this.zone))}fork(e,t){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,e,t):new i(e,t)}intercept(e,t,n){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,e,t,n):t}invoke(e,t,n,o,r){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,e,t,n,o,r):t.apply(n,o)}handleError(e,t){return!this._handleErrorZS||this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,e,t)}scheduleTask(e,t){let n=t;if(this._scheduleTaskZS)this._hasTaskZS&&n._zoneDelegates.push(this._hasTaskDlgtOwner),n=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,e,t),n||(n=t);else if(t.scheduleFn)t.scheduleFn(t);else{if(t.type!=S)throw new Error("Task is missing scheduleFn.");_(t)}return n}invokeTask(e,t,n,o){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,e,t,n,o):t.callback.apply(n,o)}cancelTask(e,t){let n;if(this._cancelTaskZS)n=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this._cancelTaskCurrZone,e,t);else{if(!t.cancelFn)throw Error("Task is not cancelable");n=t.cancelFn(t)}return n}hasTask(e,t){try{this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,e,t)}catch(n){this.handleError(e,n)}}_updateTaskCount(e,t){const n=this._taskCounts,o=n[e],r=n[e]=o+t;if(r<0)throw new Error("More tasks executed then were scheduled.");0!=o&&0!=r||this.hasTask(this.zone,{microTask:n.microTask>0,macroTask:n.macroTask>0,eventTask:n.eventTask>0,change:e})}}class u{constructor(t,n,o,r,s,a){if(this._zone=null,this.runCount=0,this._zoneDelegates=null,this._state="notScheduled",this.type=t,this.source=n,this.data=r,this.scheduleFn=s,this.cancelFn=a,!o)throw new Error("callback is not defined");this.callback=o;const i=this;this.invoke=t===P&&r&&r.useG?u.invokeTask:function(){return u.invokeTask.call(e,i,this,arguments)}}static invokeTask(e,t,n){e||(e=this),I++;try{return e.runCount++,e.zone.runTask(e,t,n)}finally{1==I&&m(),I--}}get zone(){return this._zone}get state(){return this._state}cancelScheduleRequest(){this._transitionTo(v,T)}_transitionTo(e,t,n){if(this._state!==t&&this._state!==n)throw new Error(`${this.type} '${this.source}': can not transition to '${e}', expecting state '${t}'${n?" or '"+n+"'":""}, was '${this._state}'.`);this._state=e,e==v&&(this._zoneDelegates=null)}toString(){return this.data&&void 0!==this.data.handleId?this.data.handleId.toString():Object.prototype.toString.call(this)}toJSON(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,runCount:this.runCount}}}const h=s("setTimeout"),p=s("Promise"),f=s("then");let d,g=[],k=!1;function _(t){if(0===I&&0===g.length)if(d||e[p]&&(d=e[p].resolve(0)),d){let e=d[f];e||(e=d.then),e.call(d,m)}else e[h](m,0);t&&g.push(t)}function m(){if(!k){for(k=!0;g.length;){const t=g;g=[];for(let n=0;n<t.length;n++){const o=t[n];try{o.zone.runTask(o,null,null)}catch(e){C.onUnhandledError(e)}}}C.microtaskDrainDone(),k=!1}}const y={name:"NO ZONE"},v="notScheduled",T="scheduling",b="scheduled",E="running",w="canceling",Z="unknown",S="microTask",D="macroTask",P="eventTask",z={},C={symbol:s,currentZoneFrame:()=>O,onUnhandledError:R,microtaskDrainDone:R,scheduleMicroTask:_,showUncaughtError:()=>!i[s("ignoreConsoleErrorUncaughtError")],patchEventTarget:()=>[],patchOnProperties:R,patchMethod:()=>R,bindArguments:()=>[],patchThen:()=>R,patchMacroTask:()=>R,setNativePromise:e=>{e&&"function"==typeof e.resolve&&(d=e.resolve(0))},patchEventPrototype:()=>R,isIEOrEdge:()=>!1,getGlobalObjects:()=>{},ObjectDefineProperty:()=>R,ObjectGetOwnPropertyDescriptor:()=>{},ObjectCreate:()=>{},ArraySlice:()=>[],patchClass:()=>R,wrapWithCurrentZone:()=>R,filterProperties:()=>[],attachOriginToPatched:()=>R,_redefineProperty:()=>R,patchCallbacks:()=>R};let O={parent:null,zone:new i(null,null)},j=null,I=0;function R(){}o("Zone","Zone"),e.Zone=i}("undefined"!=typeof window&&window||"undefined"!=typeof self&&self||global),Zone.__load_patch("ZoneAwarePromise",(e,t,n)=>{const o=Object.getOwnPropertyDescriptor,r=Object.defineProperty,s=n.symbol,a=[],i=s("Promise"),c=s("then");n.onUnhandledError=e=>{if(n.showUncaughtError()){const t=e&&e.rejection;t?console.error("Unhandled Promise rejection:",t instanceof Error?t.message:t,"; Zone:",e.zone.name,"; Task:",e.task&&e.task.source,"; Value:",t,t instanceof Error?t.stack:void 0):console.error(e)}},n.microtaskDrainDone=()=>{for(;a.length;)for(;a.length;){const t=a.shift();try{t.zone.runGuarded(()=>{throw t})}catch(e){u(e)}}};const l=s("unhandledPromiseRejectionHandler");function u(e){n.onUnhandledError(e);try{const n=t[l];n&&"function"==typeof n&&n.call(this,e)}catch(o){}}function h(e){return e&&e.then}function p(e){return e}function f(e){return Z.reject(e)}const d=s("state"),g=s("value"),k=s("finally"),_=s("parentPromiseValue"),m=s("parentPromiseState");function y(e,t){return n=>{try{T(e,t,n)}catch(o){T(e,!1,o)}}}const v=s("currentTaskTrace");function T(e,o,s){const i=function(){let e=!1;return function(t){return function(){e||(e=!0,t.apply(null,arguments))}}}();if(e===s)throw new TypeError("Promise resolved with itself");if(null===e[d]){let u=null;try{"object"!=typeof s&&"function"!=typeof s||(u=s&&s.then)}catch(l){return i(()=>{T(e,!1,l)})(),e}if(!1!==o&&s instanceof Z&&s.hasOwnProperty(d)&&s.hasOwnProperty(g)&&null!==s[d])E(s),T(e,s[d],s[g]);else if(!1!==o&&"function"==typeof u)try{u.call(s,i(y(e,o)),i(y(e,!1)))}catch(l){i(()=>{T(e,!1,l)})()}else{e[d]=o;const i=e[g];if(e[g]=s,e[k]===k&&!0===o&&(e[d]=e[m],e[g]=e[_]),!1===o&&s instanceof Error){const e=t.currentTask&&t.currentTask.data&&t.currentTask.data.__creationTrace__;e&&r(s,v,{configurable:!0,enumerable:!1,writable:!0,value:e})}for(let t=0;t<i.length;)w(e,i[t++],i[t++],i[t++],i[t++]);if(0==i.length&&0==o){e[d]=0;try{throw new Error("Uncaught (in promise): "+((c=s)&&c.toString===Object.prototype.toString?(c.constructor&&c.constructor.name||"")+": "+JSON.stringify(c):c?c.toString():Object.prototype.toString.call(c))+(s&&s.stack?"\n"+s.stack:""))}catch(l){const o=l;o.rejection=s,o.promise=e,o.zone=t.current,o.task=t.currentTask,a.push(o),n.scheduleMicroTask()}}}}var c;return e}const b=s("rejectionHandledHandler");function E(e){if(0===e[d]){try{const n=t[b];n&&"function"==typeof n&&n.call(this,{rejection:e[g],promise:e})}catch(n){}e[d]=!1;for(let t=0;t<a.length;t++)e===a[t].promise&&a.splice(t,1)}}function w(e,t,n,o,r){E(e);const s=e[d],a=s?"function"==typeof o?o:p:"function"==typeof r?r:f;t.scheduleMicroTask("Promise.then",()=>{try{const o=e[g],r=!!n&&k===n[k];r&&(n[_]=o,n[m]=s);const i=t.run(a,void 0,r&&a!==f&&a!==p?[]:[o]);T(n,!0,i)}catch(o){T(n,!1,o)}},n)}class Z{constructor(e){const t=this;if(!(t instanceof Z))throw new Error("Must be an instanceof Promise.");t[d]=null,t[g]=[];try{e&&e(y(t,!0),y(t,!1))}catch(n){T(t,!1,n)}}static toString(){return"function ZoneAwarePromise() { [native code] }"}static resolve(e){return T(new this(null),!0,e)}static reject(e){return T(new this(null),!1,e)}static race(e){let t,n,o=new this((e,o)=>{t=e,n=o});function r(e){t(e)}function s(e){n(e)}for(let a of e)h(a)||(a=this.resolve(a)),a.then(r,s);return o}static all(e){return Z.allWithCallback(e)}static allSettled(e){return(this&&this.prototype instanceof Z?this:Z).allWithCallback(e,{thenCallback:e=>({status:"fulfilled",value:e}),errorCallback:e=>({status:"rejected",reason:e})})}static allWithCallback(e,t){let n,o,r=new this((e,t)=>{n=e,o=t}),s=2,a=0;const i=[];for(let l of e){h(l)||(l=this.resolve(l));const e=a;try{l.then(o=>{i[e]=t?t.thenCallback(o):o,s--,0===s&&n(i)},r=>{t?(i[e]=t.errorCallback(r),s--,0===s&&n(i)):o(r)})}catch(c){o(c)}s++,a++}return s-=2,0===s&&n(i),r}get[Symbol.toStringTag](){return"Promise"}then(e,n){const o=new this.constructor(null),r=t.current;return null==this[d]?this[g].push(r,o,e,n):w(this,r,o,e,n),o}catch(e){return this.then(null,e)}finally(e){const n=new this.constructor(null);n[k]=k;const o=t.current;return null==this[d]?this[g].push(o,n,e,e):w(this,o,n,e,e),n}}Z.resolve=Z.resolve,Z.reject=Z.reject,Z.race=Z.race,Z.all=Z.all;const S=e[i]=e.Promise,D=t.__symbol__("ZoneAwarePromise");let P=o(e,"Promise");P&&!P.configurable||(P&&delete P.writable,P&&delete P.value,P||(P={configurable:!0,enumerable:!0}),P.get=function(){return e[D]?e[D]:e[i]},P.set=function(t){t===Z?e[D]=t:(e[i]=t,t.prototype[c]||C(t),n.setNativePromise(t))},r(e,"Promise",P)),e.Promise=Z;const z=s("thenPatched");function C(e){const t=e.prototype,n=o(t,"then");if(n&&(!1===n.writable||!n.configurable))return;const r=t.then;t[c]=r,e.prototype.then=function(e,t){return new Z((e,t)=>{r.call(this,e,t)}).then(e,t)},e[z]=!0}if(n.patchThen=C,S){C(S);const t=e.fetch;"function"==typeof t&&(e[n.symbol("fetch")]=t,e.fetch=(O=t,function(){let e=O.apply(this,arguments);if(e instanceof Z)return e;let t=e.constructor;return t[z]||C(t),e}))}var O;return Promise[t.__symbol__("uncaughtPromiseErrors")]=a,Z});const e=Object.getOwnPropertyDescriptor,t=Object.defineProperty,n=Object.getPrototypeOf,o=Object.create,r=Array.prototype.slice,s=Zone.__symbol__("addEventListener"),a=Zone.__symbol__("removeEventListener"),i=Zone.__symbol__("");function c(e,t){return Zone.current.wrap(e,t)}function l(e,t,n,o,r){return Zone.current.scheduleMacroTask(e,t,n,o,r)}const u=Zone.__symbol__,h="undefined"!=typeof window,p=h?window:void 0,f=h&&p||"object"==typeof self&&self||global,d=[null];function g(e,t){for(let n=e.length-1;n>=0;n--)"function"==typeof e[n]&&(e[n]=c(e[n],t+"_"+n));return e}function k(e){return!e||!1!==e.writable&&!("function"==typeof e.get&&void 0===e.set)}const _="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,m=!("nw"in f)&&void 0!==f.process&&"[object process]"==={}.toString.call(f.process),y=!m&&!_&&!(!h||!p.HTMLElement),v=void 0!==f.process&&"[object process]"==={}.toString.call(f.process)&&!_&&!(!h||!p.HTMLElement),T={},b=function(e){if(!(e=e||f.event))return;let t=T[e.type];t||(t=T[e.type]=u("ON_PROPERTY"+e.type));const n=this||e.target||f,o=n[t];let r;if(y&&n===p&&"error"===e.type){const t=e;r=o&&o.call(this,t.message,t.filename,t.lineno,t.colno,t.error),!0===r&&e.preventDefault()}else r=o&&o.apply(this,arguments),null==r||r||e.preventDefault();return r};function E(n,o,r){let s=e(n,o);if(!s&&r&&e(r,o)&&(s={enumerable:!0,configurable:!0}),!s||!s.configurable)return;const a=u("on"+o+"patched");if(n.hasOwnProperty(a)&&n[a])return;delete s.writable,delete s.value;const i=s.get,c=s.set,l=o.substr(2);let h=T[l];h||(h=T[l]=u("ON_PROPERTY"+l)),s.set=function(e){let t=this;t||n!==f||(t=f),t&&(t[h]&&t.removeEventListener(l,b),c&&c.apply(t,d),"function"==typeof e?(t[h]=e,t.addEventListener(l,b,!1)):t[h]=null)},s.get=function(){let e=this;if(e||n!==f||(e=f),!e)return null;const t=e[h];if(t)return t;if(i){let t=i&&i.call(this);if(t)return s.set.call(this,t),"function"==typeof e.removeAttribute&&e.removeAttribute(o),t}return null},t(n,o,s),n[a]=!0}function w(e,t,n){if(t)for(let o=0;o<t.length;o++)E(e,"on"+t[o],n);else{const t=[];for(const n in e)"on"==n.substr(0,2)&&t.push(n);for(let o=0;o<t.length;o++)E(e,t[o],n)}}const Z=u("originalInstance");function S(e){const n=f[e];if(!n)return;f[u(e)]=n,f[e]=function(){const t=g(arguments,e);switch(t.length){case 0:this[Z]=new n;break;case 1:this[Z]=new n(t[0]);break;case 2:this[Z]=new n(t[0],t[1]);break;case 3:this[Z]=new n(t[0],t[1],t[2]);break;case 4:this[Z]=new n(t[0],t[1],t[2],t[3]);break;default:throw new Error("Arg list too long.")}},z(f[e],n);const o=new n((function(){}));let r;for(r in o)"XMLHttpRequest"===e&&"responseBlob"===r||function(n){"function"==typeof o[n]?f[e].prototype[n]=function(){return this[Z][n].apply(this[Z],arguments)}:t(f[e].prototype,n,{set:function(t){"function"==typeof t?(this[Z][n]=c(t,e+"."+n),z(this[Z][n],t)):this[Z][n]=t},get:function(){return this[Z][n]}})}(r);for(r in n)"prototype"!==r&&n.hasOwnProperty(r)&&(f[e][r]=n[r])}function D(t,o,r){let s=t;for(;s&&!s.hasOwnProperty(o);)s=n(s);!s&&t[o]&&(s=t);const a=u(o);let i=null;if(s&&!(i=s[a])&&(i=s[a]=s[o],k(s&&e(s,o)))){const e=r(i,a,o);s[o]=function(){return e(this,arguments)},z(s[o],i)}return i}function P(e,t,n){let o=null;function r(e){const t=e.data;return t.args[t.cbIdx]=function(){e.invoke.apply(this,arguments)},o.apply(t.target,t.args),e}o=D(e,t,e=>function(t,o){const s=n(t,o);return s.cbIdx>=0&&"function"==typeof o[s.cbIdx]?l(s.name,o[s.cbIdx],s,r):e.apply(t,o)})}function z(e,t){e[u("OriginalDelegate")]=t}let C=!1,O=!1;function j(){try{const e=p.navigator.userAgent;if(-1!==e.indexOf("MSIE ")||-1!==e.indexOf("Trident/"))return!0}catch(e){}return!1}function I(){if(C)return O;C=!0;try{const e=p.navigator.userAgent;-1===e.indexOf("MSIE ")&&-1===e.indexOf("Trident/")&&-1===e.indexOf("Edge/")||(O=!0)}catch(e){}return O}Zone.__load_patch("toString",e=>{const t=Function.prototype.toString,n=u("OriginalDelegate"),o=u("Promise"),r=u("Error"),s=function(){if("function"==typeof this){const s=this[n];if(s)return"function"==typeof s?t.call(s):Object.prototype.toString.call(s);if(this===Promise){const n=e[o];if(n)return t.call(n)}if(this===Error){const n=e[r];if(n)return t.call(n)}}return t.call(this)};s[n]=t,Function.prototype.toString=s;const a=Object.prototype.toString;Object.prototype.toString=function(){return this instanceof Promise?"[object Promise]":a.call(this)}});let R=!1;if("undefined"!=typeof window)try{const e=Object.defineProperty({},"passive",{get:function(){R=!0}});window.addEventListener("test",e,e),window.removeEventListener("test",e,e)}catch(ae){R=!1}const x={useG:!0},L={},N={},M=new RegExp("^"+i+"(\\w+)(true|false)$"),A=u("propagationStopped");function H(e,t,o){const r=o&&o.add||"addEventListener",s=o&&o.rm||"removeEventListener",a=o&&o.listeners||"eventListeners",c=o&&o.rmAll||"removeAllListeners",l=u(r),h="."+r+":",p=function(e,t,n){if(e.isRemoved)return;const o=e.callback;"object"==typeof o&&o.handleEvent&&(e.callback=e=>o.handleEvent(e),e.originalDelegate=o),e.invoke(e,t,[n]);const r=e.options;r&&"object"==typeof r&&r.once&&t[s].call(t,n.type,e.originalDelegate?e.originalDelegate:e.callback,r)},f=function(t){if(!(t=t||e.event))return;const n=this||t.target||e,o=n[L[t.type].false];if(o)if(1===o.length)p(o[0],n,t);else{const e=o.slice();for(let o=0;o<e.length&&(!t||!0!==t[A]);o++)p(e[o],n,t)}},d=function(t){if(!(t=t||e.event))return;const n=this||t.target||e,o=n[L[t.type].true];if(o)if(1===o.length)p(o[0],n,t);else{const e=o.slice();for(let o=0;o<e.length&&(!t||!0!==t[A]);o++)p(e[o],n,t)}};function g(t,o){if(!t)return!1;let p=!0;o&&void 0!==o.useG&&(p=o.useG);const g=o&&o.vh;let k=!0;o&&void 0!==o.chkDup&&(k=o.chkDup);let _=!1;o&&void 0!==o.rt&&(_=o.rt);let y=t;for(;y&&!y.hasOwnProperty(r);)y=n(y);if(!y&&t[r]&&(y=t),!y)return!1;if(y[l])return!1;const v=o&&o.eventNameToString,T={},b=y[l]=y[r],E=y[u(s)]=y[s],w=y[u(a)]=y[a],Z=y[u(c)]=y[c];let S;function D(e){R||"boolean"==typeof T.options||null==T.options||(e.options=!!T.options.capture,T.options=e.options)}o&&o.prepend&&(S=y[u(o.prepend)]=y[o.prepend]);const P=p?function(e){if(!T.isExisting)return D(e),b.call(T.target,T.eventName,T.capture?d:f,T.options)}:function(e){return D(e),b.call(T.target,T.eventName,e.invoke,T.options)},C=p?function(e){if(!e.isRemoved){const t=L[e.eventName];let n;t&&(n=t[e.capture?"true":"false"]);const o=n&&e.target[n];if(o)for(let r=0;r<o.length;r++)if(o[r]===e){o.splice(r,1),e.isRemoved=!0,0===o.length&&(e.allRemoved=!0,e.target[n]=null);break}}if(e.allRemoved)return E.call(e.target,e.eventName,e.capture?d:f,e.options)}:function(e){return E.call(e.target,e.eventName,e.invoke,e.options)},O=o&&o.diff?o.diff:function(e,t){const n=typeof t;return"function"===n&&e.callback===t||"object"===n&&e.originalDelegate===t},j=Zone[u("BLACK_LISTED_EVENTS")],I=function(t,n,r,s,a=!1,c=!1){return function(){const l=this||e;let u=arguments[0];o&&o.transferEventName&&(u=o.transferEventName(u));let h=arguments[1];if(!h)return t.apply(this,arguments);if(m&&"uncaughtException"===u)return t.apply(this,arguments);let f=!1;if("function"!=typeof h){if(!h.handleEvent)return t.apply(this,arguments);f=!0}if(g&&!g(t,h,l,arguments))return;const d=arguments[2];if(j)for(let e=0;e<j.length;e++)if(u===j[e])return t.apply(this,arguments);let _,y=!1;void 0===d?_=!1:!0===d?_=!0:!1===d?_=!1:(_=!!d&&!!d.capture,y=!!d&&!!d.once);const b=Zone.current,E=L[u];let w;if(E)w=E[_?"true":"false"];else{const e=(v?v(u):u)+"false",t=(v?v(u):u)+"true",n=i+e,o=i+t;L[u]={},L[u].false=n,L[u].true=o,w=_?o:n}let Z,S=l[w],D=!1;if(S){if(D=!0,k)for(let e=0;e<S.length;e++)if(O(S[e],h))return}else S=l[w]=[];const P=l.constructor.name,z=N[P];z&&(Z=z[u]),Z||(Z=P+n+(v?v(u):u)),T.options=d,y&&(T.options.once=!1),T.target=l,T.capture=_,T.eventName=u,T.isExisting=D;const C=p?x:void 0;C&&(C.taskData=T);const I=b.scheduleEventTask(Z,h,C,r,s);return T.target=null,C&&(C.taskData=null),y&&(d.once=!0),(R||"boolean"!=typeof I.options)&&(I.options=d),I.target=l,I.capture=_,I.eventName=u,f&&(I.originalDelegate=h),c?S.unshift(I):S.push(I),a?l:void 0}};return y[r]=I(b,h,P,C,_),S&&(y.prependListener=I(S,".prependListener:",(function(e){return S.call(T.target,T.eventName,e.invoke,T.options)}),C,_,!0)),y[s]=function(){const t=this||e;let n=arguments[0];o&&o.transferEventName&&(n=o.transferEventName(n));const r=arguments[2];let s;s=void 0!==r&&(!0===r||!1!==r&&!!r&&!!r.capture);const a=arguments[1];if(!a)return E.apply(this,arguments);if(g&&!g(E,a,t,arguments))return;const c=L[n];let l;c&&(l=c[s?"true":"false"]);const u=l&&t[l];if(u)for(let e=0;e<u.length;e++){const o=u[e];if(O(o,a))return u.splice(e,1),o.isRemoved=!0,0===u.length&&(o.allRemoved=!0,t[l]=null,"string"==typeof n)&&(t[i+"ON_PROPERTY"+n]=null),o.zone.cancelTask(o),_?t:void 0}return E.apply(this,arguments)},y[a]=function(){const t=this||e;let n=arguments[0];o&&o.transferEventName&&(n=o.transferEventName(n));const r=[],s=F(t,v?v(n):n);for(let e=0;e<s.length;e++){const t=s[e];r.push(t.originalDelegate?t.originalDelegate:t.callback)}return r},y[c]=function(){const t=this||e;let n=arguments[0];if(n){o&&o.transferEventName&&(n=o.transferEventName(n));const e=L[n];if(e){const o=t[e.false],r=t[e.true];if(o){const e=o.slice();for(let t=0;t<e.length;t++){const o=e[t];this[s].call(this,n,o.originalDelegate?o.originalDelegate:o.callback,o.options)}}if(r){const e=r.slice();for(let t=0;t<e.length;t++){const o=e[t];this[s].call(this,n,o.originalDelegate?o.originalDelegate:o.callback,o.options)}}}}else{const e=Object.keys(t);for(let t=0;t<e.length;t++){const n=M.exec(e[t]);let o=n&&n[1];o&&"removeListener"!==o&&this[c].call(this,o)}this[c].call(this,"removeListener")}if(_)return this},z(y[r],b),z(y[s],E),Z&&z(y[c],Z),w&&z(y[a],w),!0}let k=[];for(let n=0;n<t.length;n++)k[n]=g(t[n],o);return k}function F(e,t){const n=[];for(let o in e){const r=M.exec(o);let s=r&&r[1];if(s&&(!t||s===t)){const t=e[o];if(t)for(let e=0;e<t.length;e++)n.push(t[e])}}return n}function G(e,t){const n=e.Event;n&&n.prototype&&t.patchMethod(n.prototype,"stopImmediatePropagation",e=>function(t,n){t[A]=!0,e&&e.apply(t,n)})}function q(e,t,n,o,r){const s=Zone.__symbol__(o);if(t[s])return;const a=t[s]=t[o];t[o]=function(s,i,c){return i&&i.prototype&&r.forEach((function(t){const r=`${n}.${o}::`+t,s=i.prototype;if(s.hasOwnProperty(t)){const n=e.ObjectGetOwnPropertyDescriptor(s,t);n&&n.value?(n.value=e.wrapWithCurrentZone(n.value,r),e._redefineProperty(i.prototype,t,n)):s[t]&&(s[t]=e.wrapWithCurrentZone(s[t],r))}else s[t]&&(s[t]=e.wrapWithCurrentZone(s[t],r))})),a.call(t,s,i,c)},e.attachOriginToPatched(t[o],a)}const B=["absolutedeviceorientation","afterinput","afterprint","appinstalled","beforeinstallprompt","beforeprint","beforeunload","devicelight","devicemotion","deviceorientation","deviceorientationabsolute","deviceproximity","hashchange","languagechange","message","mozbeforepaint","offline","online","paint","pageshow","pagehide","popstate","rejectionhandled","storage","unhandledrejection","unload","userproximity","vrdisplyconnected","vrdisplaydisconnected","vrdisplaypresentchange"],W=["encrypted","waitingforkey","msneedkey","mozinterruptbegin","mozinterruptend"],U=["load"],$=["blur","error","focus","load","resize","scroll","messageerror"],V=["bounce","finish","start"],X=["loadstart","progress","abort","error","load","progress","timeout","loadend","readystatechange"],Y=["upgradeneeded","complete","abort","success","error","blocked","versionchange","close"],J=["close","error","open","message"],K=["error","message"],Q=["abort","animationcancel","animationend","animationiteration","auxclick","beforeinput","blur","cancel","canplay","canplaythrough","change","compositionstart","compositionupdate","compositionend","cuechange","click","close","contextmenu","curechange","dblclick","drag","dragend","dragenter","dragexit","dragleave","dragover","drop","durationchange","emptied","ended","error","focus","focusin","focusout","gotpointercapture","input","invalid","keydown","keypress","keyup","load","loadstart","loadeddata","loadedmetadata","lostpointercapture","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","mousewheel","orientationchange","pause","play","playing","pointercancel","pointerdown","pointerenter","pointerleave","pointerlockchange","mozpointerlockchange","webkitpointerlockerchange","pointerlockerror","mozpointerlockerror","webkitpointerlockerror","pointermove","pointout","pointerover","pointerup","progress","ratechange","reset","resize","scroll","seeked","seeking","select","selectionchange","selectstart","show","sort","stalled","submit","suspend","timeupdate","volumechange","touchcancel","touchmove","touchstart","touchend","transitioncancel","transitionend","waiting","wheel"].concat(["webglcontextrestored","webglcontextlost","webglcontextcreationerror"],["autocomplete","autocompleteerror"],["toggle"],["afterscriptexecute","beforescriptexecute","DOMContentLoaded","freeze","fullscreenchange","mozfullscreenchange","webkitfullscreenchange","msfullscreenchange","fullscreenerror","mozfullscreenerror","webkitfullscreenerror","msfullscreenerror","readystatechange","visibilitychange","resume"],B,["beforecopy","beforecut","beforepaste","copy","cut","paste","dragstart","loadend","animationstart","search","transitionrun","transitionstart","webkitanimationend","webkitanimationiteration","webkitanimationstart","webkittransitionend"],["activate","afterupdate","ariarequest","beforeactivate","beforedeactivate","beforeeditfocus","beforeupdate","cellchange","controlselect","dataavailable","datasetchanged","datasetcomplete","errorupdate","filterchange","layoutcomplete","losecapture","move","moveend","movestart","propertychange","resizeend","resizestart","rowenter","rowexit","rowsdelete","rowsinserted","command","compassneedscalibration","deactivate","help","mscontentzoom","msmanipulationstatechanged","msgesturechange","msgesturedoubletap","msgestureend","msgesturehold","msgesturestart","msgesturetap","msgotpointercapture","msinertiastart","mslostpointercapture","mspointercancel","mspointerdown","mspointerenter","mspointerhover","mspointerleave","mspointermove","mspointerout","mspointerover","mspointerup","pointerout","mssitemodejumplistitemremoved","msthumbnailclick","stop","storagecommit"]);function ee(e,t,n){if(!n||0===n.length)return t;const o=n.filter(t=>t.target===e);if(!o||0===o.length)return t;const r=o[0].ignoreProperties;return t.filter(e=>-1===r.indexOf(e))}function te(e,t,n,o){e&&w(e,ee(e,t,n),o)}function ne(e,t){if(m&&!v)return;if(Zone[e.symbol("patchEvents")])return;const o="undefined"!=typeof WebSocket,r=t.__Zone_ignore_on_properties;if(y){const e=window,t=j?[{target:e,ignoreProperties:["error"]}]:[];te(e,Q.concat(["messageerror"]),r?r.concat(t):r,n(e)),te(Document.prototype,Q,r),void 0!==e.SVGElement&&te(e.SVGElement.prototype,Q,r),te(Element.prototype,Q,r),te(HTMLElement.prototype,Q,r),te(HTMLMediaElement.prototype,W,r),te(HTMLFrameSetElement.prototype,B.concat($),r),te(HTMLBodyElement.prototype,B.concat($),r),te(HTMLFrameElement.prototype,U,r),te(HTMLIFrameElement.prototype,U,r);const o=e.HTMLMarqueeElement;o&&te(o.prototype,V,r);const s=e.Worker;s&&te(s.prototype,K,r)}const s=t.XMLHttpRequest;s&&te(s.prototype,X,r);const a=t.XMLHttpRequestEventTarget;a&&te(a&&a.prototype,X,r),"undefined"!=typeof IDBIndex&&(te(IDBIndex.prototype,Y,r),te(IDBRequest.prototype,Y,r),te(IDBOpenDBRequest.prototype,Y,r),te(IDBDatabase.prototype,Y,r),te(IDBTransaction.prototype,Y,r),te(IDBCursor.prototype,Y,r)),o&&te(WebSocket.prototype,J,r)}Zone.__load_patch("util",(n,s,a)=>{a.patchOnProperties=w,a.patchMethod=D,a.bindArguments=g,a.patchMacroTask=P;const l=s.__symbol__("BLACK_LISTED_EVENTS"),u=s.__symbol__("UNPATCHED_EVENTS");n[u]&&(n[l]=n[u]),n[l]&&(s[l]=s[u]=n[l]),a.patchEventPrototype=G,a.patchEventTarget=H,a.isIEOrEdge=I,a.ObjectDefineProperty=t,a.ObjectGetOwnPropertyDescriptor=e,a.ObjectCreate=o,a.ArraySlice=r,a.patchClass=S,a.wrapWithCurrentZone=c,a.filterProperties=ee,a.attachOriginToPatched=z,a._redefineProperty=Object.defineProperty,a.patchCallbacks=q,a.getGlobalObjects=()=>({globalSources:N,zoneSymbolEventNames:L,eventNames:Q,isBrowser:y,isMix:v,isNode:m,TRUE_STR:"true",FALSE_STR:"false",ZONE_SYMBOL_PREFIX:i,ADD_EVENT_LISTENER_STR:"addEventListener",REMOVE_EVENT_LISTENER_STR:"removeEventListener"})});const oe=u("zoneTask");function re(e,t,n,o){let r=null,s=null;n+=o;const a={};function i(t){const n=t.data;return n.args[0]=function(){try{t.invoke.apply(this,arguments)}finally{t.data&&t.data.isPeriodic||("number"==typeof n.handleId?delete a[n.handleId]:n.handleId&&(n.handleId[oe]=null))}},n.handleId=r.apply(e,n.args),t}function c(e){return s(e.data.handleId)}r=D(e,t+=o,n=>function(r,s){if("function"==typeof s[0]){const e=l(t,s[0],{isPeriodic:"Interval"===o,delay:"Timeout"===o||"Interval"===o?s[1]||0:void 0,args:s},i,c);if(!e)return e;const n=e.data.handleId;return"number"==typeof n?a[n]=e:n&&(n[oe]=e),n&&n.ref&&n.unref&&"function"==typeof n.ref&&"function"==typeof n.unref&&(e.ref=n.ref.bind(n),e.unref=n.unref.bind(n)),"number"==typeof n||n?n:e}return n.apply(e,s)}),s=D(e,n,t=>function(n,o){const r=o[0];let s;"number"==typeof r?s=a[r]:(s=r&&r[oe],s||(s=r)),s&&"string"==typeof s.type?"notScheduled"!==s.state&&(s.cancelFn&&s.data.isPeriodic||0===s.runCount)&&("number"==typeof r?delete a[r]:r&&(r[oe]=null),s.zone.cancelTask(s)):t.apply(e,o)})}function se(e,t){if(Zone[t.symbol("patchEventTarget")])return;const{eventNames:n,zoneSymbolEventNames:o,TRUE_STR:r,FALSE_STR:s,ZONE_SYMBOL_PREFIX:a}=t.getGlobalObjects();for(let c=0;c<n.length;c++){const e=n[c],t=a+(e+s),i=a+(e+r);o[e]={},o[e][s]=t,o[e][r]=i}const i=e.EventTarget;return i&&i.prototype?(t.patchEventTarget(e,[i&&i.prototype]),!0):void 0}Zone.__load_patch("legacy",e=>{const t=e[Zone.__symbol__("legacyPatch")];t&&t()}),Zone.__load_patch("timers",e=>{re(e,"set","clear","Timeout"),re(e,"set","clear","Interval"),re(e,"set","clear","Immediate")}),Zone.__load_patch("requestAnimationFrame",e=>{re(e,"request","cancel","AnimationFrame"),re(e,"mozRequest","mozCancel","AnimationFrame"),re(e,"webkitRequest","webkitCancel","AnimationFrame")}),Zone.__load_patch("blocking",(e,t)=>{const n=["alert","prompt","confirm"];for(let o=0;o<n.length;o++)D(e,n[o],(n,o,r)=>function(o,s){return t.current.run(n,e,s,r)})}),Zone.__load_patch("EventTarget",(e,t,n)=>{!function(e,t){t.patchEventPrototype(e,t)}(e,n),se(e,n);const o=e.XMLHttpRequestEventTarget;o&&o.prototype&&n.patchEventTarget(e,[o.prototype]),S("MutationObserver"),S("WebKitMutationObserver"),S("IntersectionObserver"),S("FileReader")}),Zone.__load_patch("on_property",(e,t,n)=>{ne(n,e)}),Zone.__load_patch("customElements",(e,t,n)=>{!function(e,t){const{isBrowser:n,isMix:o}=t.getGlobalObjects();(n||o)&&e.customElements&&"customElements"in e&&t.patchCallbacks(t,e.customElements,"customElements","define",["connectedCallback","disconnectedCallback","adoptedCallback","attributeChangedCallback"])}(e,n)}),Zone.__load_patch("XHR",(e,t)=>{!function(e){const p=e.XMLHttpRequest;if(!p)return;const f=p.prototype;let d=f[s],g=f[a];if(!d){const t=e.XMLHttpRequestEventTarget;if(t){const e=t.prototype;d=e[s],g=e[a]}}function k(e){const o=e.data,c=o.target;c[i]=!1,c[h]=!1;const l=c[r];d||(d=c[s],g=c[a]),l&&g.call(c,"readystatechange",l);const u=c[r]=()=>{if(c.readyState===c.DONE)if(!o.aborted&&c[i]&&"scheduled"===e.state){const n=c[t.__symbol__("loadfalse")];if(n&&n.length>0){const r=e.invoke;e.invoke=function(){const n=c[t.__symbol__("loadfalse")];for(let t=0;t<n.length;t++)n[t]===e&&n.splice(t,1);o.aborted||"scheduled"!==e.state||r.call(e)},n.push(e)}else e.invoke()}else o.aborted||!1!==c[i]||(c[h]=!0)};return d.call(c,"readystatechange",u),c[n]||(c[n]=e),b.apply(c,o.args),c[i]=!0,e}function _(){}function m(e){const t=e.data;return t.aborted=!0,E.apply(t.target,t.args)}const y=D(f,"open",()=>function(e,t){return e[o]=0==t[2],e[c]=t[1],y.apply(e,t)}),v=u("fetchTaskAborting"),T=u("fetchTaskScheduling"),b=D(f,"send",()=>function(e,n){if(!0===t.current[T])return b.apply(e,n);if(e[o])return b.apply(e,n);{const t={target:e,url:e[c],isPeriodic:!1,args:n,aborted:!1},o=l("XMLHttpRequest.send",_,t,k,m);e&&!0===e[h]&&!t.aborted&&"scheduled"===o.state&&o.invoke()}}),E=D(f,"abort",()=>function(e,o){const r=e[n];if(r&&"string"==typeof r.type){if(null==r.cancelFn||r.data&&r.data.aborted)return;r.zone.cancelTask(r)}else if(!0===t.current[v])return E.apply(e,o)})}(e);const n=u("xhrTask"),o=u("xhrSync"),r=u("xhrListener"),i=u("xhrScheduled"),c=u("xhrURL"),h=u("xhrErrorBeforeScheduled")}),Zone.__load_patch("geolocation",t=>{t.navigator&&t.navigator.geolocation&&function(t,n){const o=t.constructor.name;for(let r=0;r<n.length;r++){const s=n[r],a=t[s];if(a){if(!k(e(t,s)))continue;t[s]=(e=>{const t=function(){return e.apply(this,g(arguments,o+"."+s))};return z(t,e),t})(a)}}}(t.navigator.geolocation,["getCurrentPosition","watchPosition"])}),Zone.__load_patch("PromiseRejectionEvent",(e,t)=>{function n(t){return function(n){F(e,t).forEach(o=>{const r=e.PromiseRejectionEvent;if(r){const e=new r(t,{promise:n.promise,reason:n.rejection});o.invoke(e)}})}}e.PromiseRejectionEvent&&(t[u("unhandledPromiseRejectionHandler")]=n("unhandledrejection"),t[u("rejectionHandledHandler")]=n("rejectionhandled"))})})?o.call(t,n,t,e):o)||(e.exports=r)}},[[2,0]]]);
!function(e,t){"use strict";function n(){var e=x.splice(0,x.length);for(Ge=0;e.length;)e.shift().call(null,e.shift())}function i(e,t){for(var n=0,i=e.length;n<i;n++)p(e[n],t)}function r(e){return function(t){Me(t)&&(p(t,e),oe.length&&i(t.querySelectorAll(oe),e))}}function o(e){var t=Be.call(e,"is"),n=e.nodeName.toUpperCase(),i=ae.call(ie,t?ee+t.toUpperCase():Z+n);return t&&-1<i&&!s(n,t)?-1:i}function s(e,t){return-1<oe.indexOf(e+'[is="'+t+'"]')}function a(e){var t=e.currentTarget,n=e.attrChange,i=e.attrName,r=e.target,o=e[z]||2,s=e[Y]||3;!it||r&&r!==t||!t[B]||"style"===i||e.prevValue===e.newValue&&(""!==e.newValue||n!==o&&n!==s)||t[B](i,n===o?null:e.prevValue,n===s?null:e.newValue)}function l(e){var t=r(e);return function(e){x.push(t,e.target),Ge&&clearTimeout(Ge),Ge=setTimeout(n,1)}}function u(e){nt&&(nt=!1,e.currentTarget.removeEventListener(G,u)),oe.length&&i((e.target||T).querySelectorAll(oe),e.detail===F?F:q),He&&function(){for(var e,t=0,n=Pe.length;t<n;t++)se.contains(e=Pe[t])||(n--,Pe.splice(t--,1),p(e,F))}()}function c(e,t){var n=this;Ke.call(n,e,t),S.call(n,{target:n})}function f(e,t,n){var i=t.apply(e,n),r=o(i);return-1<r&&I(i,re[r]),n.pop()&&oe.length&&function(e){for(var t,n=0,i=e.length;n<i;n++)I(t=e[n],re[o(t)])}(i.querySelectorAll(oe)),i}function d(e,t){Le(e,t),N?N.observe(e,Ye):(tt&&(e.setAttribute=c,e[M]=A(e),e[P](J,S)),e[P](X,a)),e[Q]&&it&&(e.created=!0,e[Q](),e.created=!1)}function h(e){throw new Error("A "+e+" type is already registered")}function p(e,t){var n,i,r=o(e);-1<r&&!Fe.call(e,"TEMPLATE")&&(O(e,re[r]),r=0,t!==q||e[q]?t!==F||e[F]||(e[q]=!1,e[F]=!0,i="disconnected",r=1):(e[F]=!1,e[q]=!0,i="connected",r=1,He&&ae.call(Pe,e)<0&&Pe.push(e)),r&&(n=e[t+R]||e[i+R])&&n.call(e))}function m(){}function g(e,t,n){var i=n&&n[W]||"",r=t.prototype,o=Ne(r),s=t.observedAttributes||de,a={prototype:o};je(o,Q,{value:function(){if(Ce)Ce=!1;else if(!this[ye]){this[ye]=!0,new t(this),r[Q]&&r[Q].call(this);var e=xe[De.get(t)];(!be||e.create.length>1)&&_(this)}}}),je(o,B,{value:function(e){-1<ae.call(s,e)&&r[B]&&r[B].apply(this,arguments)}}),r[V]&&je(o,U,{value:r[V]}),r[K]&&je(o,$,{value:r[K]}),i&&(a[W]=i),e=e.toUpperCase(),xe[e]={constructor:t,create:i?[i,Ae(e)]:[e]},De.set(t,e),T[H](e.toLowerCase(),a),b(e),Se[e].r()}function v(e){var t=xe[e.toUpperCase()];return t&&t.constructor}function y(e){return"string"==typeof e?e:e&&e.is||""}function _(e){for(var t,n=e[B],i=n?e.attributes:de,r=i.length;r--;)n.call(e,(t=i[r]).name||t.nodeName,null,t.value||t.nodeValue)}function b(e){return(e=e.toUpperCase())in Se||(Se[e]={},Se[e].p=new we((function(t){Se[e].r=t}))),Se[e].p}function E(){_e&&delete e.customElements,fe(e,"customElements",{configurable:!0,value:new m}),fe(e,"CustomElementRegistry",{configurable:!0,value:m});for(var t=C.get(/^HTML[A-Z]*[a-z]/),n=t.length;n--;function(t){var n=e[t];if(n){e[t]=function(e){var t,i;return e||(e=this),e[ye]||(Ce=!0,t=xe[De.get(e.constructor)],(e=(i=be&&1===t.create.length)?Reflect.construct(n,de,t.constructor):T.createElement.apply(T,t.create))[ye]=!0,Ce=!1,i||_(e)),e},e[t].prototype=n.prototype;try{n.prototype.constructor=e[t]}catch(i){fe(n,ye,{value:e[t]})}}}(t[n]));T.createElement=function(e,t){var n=y(t);return n?ze.call(this,e,Ae(n)):ze.call(this,e)},Je||(et=!0,T[H](""))}var T=e.document,w=e.Object,C=function(e){var t,n,i,r,o=/^[A-Z]+[a-z]/,s=function(e,t){(t=t.toLowerCase())in a||(a[e]=(a[e]||[]).concat(t),a[t]=a[t.toUpperCase()]=e)},a=(w.create||w)(null),l={};for(n in e)for(r in e[n])for(a[r]=i=e[n][r],t=0;t<i.length;t++)a[i[t].toLowerCase()]=a[i[t].toUpperCase()]=r;return l.get=function(e){return"string"==typeof e?a[e]||(o.test(e)?[]:""):function(e){var t,n=[];for(t in a)e.test(t)&&n.push(t);return n}(e)},l.set=function(e,t){return o.test(e)?s(e,t):s(t,e),l},l}({collections:{HTMLAllCollection:["all"],HTMLCollection:["forms"],HTMLFormControlsCollection:["elements"],HTMLOptionsCollection:["options"]},elements:{Element:["element"],HTMLAnchorElement:["a"],HTMLAppletElement:["applet"],HTMLAreaElement:["area"],HTMLAttachmentElement:["attachment"],HTMLAudioElement:["audio"],HTMLBRElement:["br"],HTMLBaseElement:["base"],HTMLBodyElement:["body"],HTMLButtonElement:["button"],HTMLCanvasElement:["canvas"],HTMLContentElement:["content"],HTMLDListElement:["dl"],HTMLDataElement:["data"],HTMLDataListElement:["datalist"],HTMLDetailsElement:["details"],HTMLDialogElement:["dialog"],HTMLDirectoryElement:["dir"],HTMLDivElement:["div"],HTMLDocument:["document"],HTMLElement:["element","abbr","address","article","aside","b","bdi","bdo","cite","code","command","dd","dfn","dt","em","figcaption","figure","footer","header","i","kbd","mark","nav","noscript","rp","rt","ruby","s","samp","section","small","strong","sub","summary","sup","u","var","wbr"],HTMLEmbedElement:["embed"],HTMLFieldSetElement:["fieldset"],HTMLFontElement:["font"],HTMLFormElement:["form"],HTMLFrameElement:["frame"],HTMLFrameSetElement:["frameset"],HTMLHRElement:["hr"],HTMLHeadElement:["head"],HTMLHeadingElement:["h1","h2","h3","h4","h5","h6"],HTMLHtmlElement:["html"],HTMLIFrameElement:["iframe"],HTMLImageElement:["img"],HTMLInputElement:["input"],HTMLKeygenElement:["keygen"],HTMLLIElement:["li"],HTMLLabelElement:["label"],HTMLLegendElement:["legend"],HTMLLinkElement:["link"],HTMLMapElement:["map"],HTMLMarqueeElement:["marquee"],HTMLMediaElement:["media"],HTMLMenuElement:["menu"],HTMLMenuItemElement:["menuitem"],HTMLMetaElement:["meta"],HTMLMeterElement:["meter"],HTMLModElement:["del","ins"],HTMLOListElement:["ol"],HTMLObjectElement:["object"],HTMLOptGroupElement:["optgroup"],HTMLOptionElement:["option"],HTMLOutputElement:["output"],HTMLParagraphElement:["p"],HTMLParamElement:["param"],HTMLPictureElement:["picture"],HTMLPreElement:["pre"],HTMLProgressElement:["progress"],HTMLQuoteElement:["blockquote","q","quote"],HTMLScriptElement:["script"],HTMLSelectElement:["select"],HTMLShadowElement:["shadow"],HTMLSlotElement:["slot"],HTMLSourceElement:["source"],HTMLSpanElement:["span"],HTMLStyleElement:["style"],HTMLTableCaptionElement:["caption"],HTMLTableCellElement:["td","th"],HTMLTableColElement:["col","colgroup"],HTMLTableElement:["table"],HTMLTableRowElement:["tr"],HTMLTableSectionElement:["thead","tbody","tfoot"],HTMLTemplateElement:["template"],HTMLTextAreaElement:["textarea"],HTMLTimeElement:["time"],HTMLTitleElement:["title"],HTMLTrackElement:["track"],HTMLUListElement:["ul"],HTMLUnknownElement:["unknown","vhgroupv","vkeygen"],HTMLVideoElement:["video"]},nodes:{Attr:["node"],Audio:["audio"],CDATASection:["node"],CharacterData:["node"],Comment:["#comment"],Document:["#document"],DocumentFragment:["#document-fragment"],DocumentType:["node"],HTMLDocument:["#document"],Image:["img"],Option:["option"],ProcessingInstruction:["node"],ShadowRoot:["#shadow-root"],Text:["#text"],XMLDocument:["xml"]}});"object"!=typeof t&&(t={type:t||"auto"});var x,S,D,A,N,L,O,I,k,H="registerElement",j=1e5*e.Math.random()>>0,M="__"+H+j,P="addEventListener",q="attached",R="Callback",F="detached",W="extends",B="attributeChanged"+R,U=q+R,V="connected"+R,K="disconnected"+R,Q="created"+R,$=F+R,z="ADDITION",Y="REMOVAL",X="DOMAttrModified",G="DOMContentLoaded",J="DOMSubtreeModified",Z="<",ee="=",te=/^[A-Z][._A-Z0-9]*-[-._A-Z0-9]*$/,ne=["ANNOTATION-XML","COLOR-PROFILE","FONT-FACE","FONT-FACE-SRC","FONT-FACE-URI","FONT-FACE-FORMAT","FONT-FACE-NAME","MISSING-GLYPH"],ie=[],re=[],oe="",se=T.documentElement,ae=ie.indexOf||function(e){for(var t=this.length;t--&&this[t]!==e;);return t},le=w.prototype,ue=le.hasOwnProperty,ce=le.isPrototypeOf,fe=w.defineProperty,de=[],he=w.getOwnPropertyDescriptor,pe=w.getOwnPropertyNames,me=w.getPrototypeOf,ge=w.setPrototypeOf,ve=!!w.__proto__,ye="__dreCEv1",_e=e.customElements,be=!/^force/.test(t.type)&&!!(_e&&_e.define&&_e.get&&_e.whenDefined),Ee=w.create||w,Te=e.Map||function(){var e,t=[],n=[];return{get:function(e){return n[ae.call(t,e)]},set:function(i,r){(e=ae.call(t,i))<0?n[t.push(i)-1]=r:n[e]=r}}},we=e.Promise||function(e){function t(e){for(i=!0;n.length;)n.shift()(e)}var n=[],i=!1,r={catch:function(){return r},then:function(e){return n.push(e),i&&setTimeout(t,1),r}};return e(t),r},Ce=!1,xe=Ee(null),Se=Ee(null),De=new Te,Ae=function(e){return e.toLowerCase()},Ne=w.create||function e(t){return t?(e.prototype=t,new e):this},Le=ge||(ve?function(e,t){return e.__proto__=t,e}:pe&&he?function(){function e(e,t){for(var n,i=pe(t),r=0,o=i.length;r<o;r++)ue.call(e,n=i[r])||fe(e,n,he(t,n))}return function(t,n){do{e(t,n)}while((n=me(n))&&!ce.call(n,t));return t}}():function(e,t){for(var n in t)e[n]=t[n];return e}),Oe=e.MutationObserver||e.WebKitMutationObserver,Ie=e.HTMLAnchorElement,ke=(e.HTMLElement||e.Element||e.Node).prototype,He=!ce.call(ke,se),je=He?function(e,t,n){return e[t]=n.value,e}:fe,Me=He?function(e){return 1===e.nodeType}:function(e){return ce.call(ke,e)},Pe=He&&[],qe=ke.attachShadow,Re=ke.cloneNode,Fe=ke.closest||function(e){for(var t=this;t&&t.nodeName!==e;)t=t.parentNode;return t},We=ke.dispatchEvent,Be=ke.getAttribute,Ue=ke.hasAttribute,Ve=ke.removeAttribute,Ke=ke.setAttribute,Qe=T.createElement,$e=T.importNode,ze=Qe,Ye=Oe&&{attributes:!0,characterData:!0,attributeOldValue:!0},Xe=Oe||function(e){tt=!1,se.removeEventListener(X,Xe)},Ge=0,Je=H in T&&!/^force-all/.test(t.type),Ze=!0,et=!1,tt=!0,nt=!0,it=!0;if(Oe&&((k=T.createElement("div")).innerHTML="<div><div></div></div>",new Oe((function(e,t){if(e[0]&&"childList"==e[0].type&&!e[0].removedNodes[0].childNodes.length){var n=(k=he(ke,"innerHTML"))&&k.set;n&&fe(ke,"innerHTML",{set:function(e){for(;this.lastChild;)this.removeChild(this.lastChild);n.call(this,e)}})}t.disconnect(),k=null})).observe(k,{childList:!0,subtree:!0}),k.innerHTML=""),Je||(ge||ve?(O=function(e,t){ce.call(t,e)||d(e,t)},I=d):I=O=function(e,t){e[M]||(e[M]=w(!0),d(e,t))},He?(tt=!1,function(){var e=he(ke,P),t=e.value,n=function(e){var t=new CustomEvent(X,{bubbles:!0});t.attrName=e,t.prevValue=Be.call(this,e),t.newValue=null,t[Y]=t.attrChange=2,Ve.call(this,e),We.call(this,t)},i=function(e,t){var n=Ue.call(this,e),i=n&&Be.call(this,e),r=new CustomEvent(X,{bubbles:!0});Ke.call(this,e,t),r.attrName=e,r.prevValue=n?i:null,r.newValue=t,n?r.MODIFICATION=r.attrChange=1:r[z]=r.attrChange=0,We.call(this,r)},r=function(e){var t,n=e.currentTarget,i=n[M],r=e.propertyName;i.hasOwnProperty(r)&&(i=i[r],(t=new CustomEvent(X,{bubbles:!0})).attrName=i.name,t.prevValue=i.value||null,t.newValue=i.value=n[r]||null,null==t.prevValue?t[z]=t.attrChange=0:t.MODIFICATION=t.attrChange=1,We.call(n,t))};e.value=function(e,o,s){e===X&&this[B]&&this.setAttribute!==i&&(this[M]={className:{name:"class",value:this.className}},this.setAttribute=i,this.removeAttribute=n,t.call(this,"propertychange",r)),t.call(this,e,o,s)},fe(ke,P,e)}()):Oe||(se[P](X,Xe),se.setAttribute(M,1),se.removeAttribute(M),tt&&(S=function(e){var t,n,i,r=this;if(r===e.target){for(i in t=r[M],r[M]=n=A(r),n){if(!(i in t))return D(0,r,i,t[i],n[i],z);if(n[i]!==t[i])return D(1,r,i,t[i],n[i],"MODIFICATION")}for(i in t)if(!(i in n))return D(2,r,i,t[i],n[i],Y)}},D=function(e,t,n,i,r,o){var s={attrChange:e,currentTarget:t,attrName:n,prevValue:i,newValue:r};s[o]=e,a(s)},A=function(e){for(var t,n,i={},r=e.attributes,o=0,s=r.length;o<s;o++)"setAttribute"!==(n=(t=r[o]).name)&&(i[n]=t.value);return i})),T[H]=function(e,t){if(n=e.toUpperCase(),Ze&&(Ze=!1,Oe?(N=function(e,t){function n(e,t){for(var n=0,i=e.length;n<i;t(e[n++]));}return new Oe((function(i){for(var r,o,s,a=0,l=i.length;a<l;a++)"childList"===(r=i[a]).type?(n(r.addedNodes,e),n(r.removedNodes,t)):(o=r.target,it&&o[B]&&"style"!==r.attributeName&&(s=Be.call(o,r.attributeName))!==r.oldValue&&o[B](r.attributeName,r.oldValue,s))}))}(r(q),r(F)),(L=function(e){return N.observe(e,{childList:!0,subtree:!0}),e})(T),qe&&(ke.attachShadow=function(){return L(qe.apply(this,arguments))})):(x=[],T[P]("DOMNodeInserted",l(q)),T[P]("DOMNodeRemoved",l(F))),T[P](G,u),T[P]("readystatechange",u),T.importNode=function(e,t){switch(e.nodeType){case 1:return f(T,$e,[e,!!t]);case 11:for(var n=T.createDocumentFragment(),i=e.childNodes,r=i.length,o=0;o<r;o++)n.appendChild(T.importNode(i[o],!!t));return n;default:return Re.call(e,!!t)}},ke.cloneNode=function(e){return f(this,Re,[!!e])}),et)return et=!1;if(-2<ae.call(ie,ee+n)+ae.call(ie,Z+n)&&h(e),!te.test(n)||-1<ae.call(ne,n))throw new Error("The type "+e+" is invalid");var n,o,s=function(){return c?T.createElement(d,n):T.createElement(d)},a=t||le,c=ue.call(a,W),d=c?t[W].toUpperCase():n;return c&&-1<ae.call(ie,Z+d)&&h(d),o=ie.push((c?ee:Z)+n)-1,oe=oe.concat(oe.length?",":"",c?d+'[is="'+e.toLowerCase()+'"]':d),s.prototype=re[o]=ue.call(a,"prototype")?a.prototype:Ne(ke),oe.length&&i(T.querySelectorAll(oe),q),s},T.createElement=ze=function(e,t){var n=y(t),i=n?Qe.call(T,e,Ae(n)):Qe.call(T,e),r=""+e,o=ae.call(ie,(n?ee:Z)+(n||r).toUpperCase()),a=-1<o;return n&&(i.setAttribute("is",n=n.toLowerCase()),a&&(a=s(r.toUpperCase(),n))),it=!T.createElement.innerHTMLHelper,a&&I(i,re[o]),i}),addEventListener("beforeunload",(function(){delete T.createElement,delete T.importNode,delete T[H]}),!1),m.prototype={constructor:m,define:be?function(e,t,n){if(n)g(e,t,n);else{var i=e.toUpperCase();xe[i]={constructor:t,create:[i]},De.set(t,i),_e.define(e,t)}}:g,get:be?function(e){return _e.get(e)||v(e)}:v,whenDefined:be?function(e){return we.race([_e.whenDefined(e),b(e)])}:b},!_e||/^force/.test(t.type))E();else if(!t.noBuiltIn)try{!function(t,n,i){var r=new RegExp("^<a\\s+is=('|\")"+i+"\\1></a>$");if(n[W]="a",(t.prototype=Ne(Ie.prototype)).constructor=t,e.customElements.define(i,t,n),!r.test(T.createElement("a",{is:i}).outerHTML)||!r.test((new t).outerHTML))throw n}((function e(){return Reflect.construct(Ie,[],e)}),{},"document-register-element-a"+j)}catch(rt){E()}if(!t.noBuiltIn)try{if(Qe.call(T,"a","a").outerHTML.indexOf("is")<0)throw{}}catch(ot){Ae=function(e){return{is:e.toLowerCase()}}}}(window),function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,(function(e,t){"use strict";var n=[],i=e.document,r=Object.getPrototypeOf,o=n.slice,s=n.concat,a=n.push,l=n.indexOf,u={},c=u.toString,f=u.hasOwnProperty,d=f.toString,h=d.call(Object),p={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},g=function(e){return null!=e&&e===e.window},v={type:!0,src:!0,nonce:!0,noModule:!0};function y(e,t,n){var r,o,s=(n=n||i).createElement("script");if(s.text=e,t)for(r in v)(o=t[r]||t.getAttribute&&t.getAttribute(r))&&s.setAttribute(r,o);n.head.appendChild(s).parentNode.removeChild(s)}function _(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?u[c.call(e)]||"object":typeof e}var b="3.4.1",E=function(e,t){return new E.fn.init(e,t)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function w(e){var t=!!e&&"length"in e&&e.length,n=_(e);return!m(e)&&!g(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}E.fn=E.prototype={jquery:b,constructor:E,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=E.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return E.each(this,e)},map:function(e){return this.pushStack(E.map(this,(function(t,n){return e.call(t,n,t)})))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:a,sort:n.sort,splice:n.splice},E.extend=E.fn.extend=function(){var e,t,n,i,r,o,s=arguments[0]||{},a=1,l=arguments.length,u=!1;for("boolean"==typeof s&&(u=s,s=arguments[a]||{},a++),"object"==typeof s||m(s)||(s={}),a===l&&(s=this,a--);a<l;a++)if(null!=(e=arguments[a]))for(t in e)i=e[t],"__proto__"!==t&&s!==i&&(u&&i&&(E.isPlainObject(i)||(r=Array.isArray(i)))?(n=s[t],o=r&&!Array.isArray(n)?[]:r||E.isPlainObject(n)?n:{},r=!1,s[t]=E.extend(u,o,i)):void 0!==i&&(s[t]=i));return s},E.extend({expando:"jQuery"+(b+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==c.call(e)||(t=r(e))&&("function"!=typeof(n=f.call(t,"constructor")&&t.constructor)||d.call(n)!==h))},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t){y(e,{nonce:t&&t.nonce})},each:function(e,t){var n,i=0;if(w(e))for(n=e.length;i<n&&!1!==t.call(e[i],i,e[i]);i++);else for(i in e)if(!1===t.call(e[i],i,e[i]))break;return e},trim:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(w(Object(e))?E.merge(n,"string"==typeof e?[e]:e):a.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:l.call(t,e,n)},merge:function(e,t){for(var n=+t.length,i=0,r=e.length;i<n;i++)e[r++]=t[i];return e.length=r,e},grep:function(e,t,n){for(var i=[],r=0,o=e.length,s=!n;r<o;r++)!t(e[r],r)!==s&&i.push(e[r]);return i},map:function(e,t,n){var i,r,o=0,a=[];if(w(e))for(i=e.length;o<i;o++)null!=(r=t(e[o],o,n))&&a.push(r);else for(o in e)null!=(r=t(e[o],o,n))&&a.push(r);return s.apply([],a)},guid:1,support:p}),"function"==typeof Symbol&&(E.fn[Symbol.iterator]=n[Symbol.iterator]),E.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),(function(e,t){u["[object "+t+"]"]=t.toLowerCase()}));var C=function(e){var t,n,i,r,o,s,a,l,u,c,f,d,h,p,m,g,v,y,_,b="sizzle"+1*new Date,E=e.document,T=0,w=0,C=le(),x=le(),S=le(),D=le(),A=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,L=[],O=L.pop,I=L.push,k=L.push,H=L.slice,j=function(e,t){for(var n=0,i=e.length;n<i;n++)if(e[n]===t)return n;return-1},M="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",q="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",R="\\["+P+"*("+q+")(?:"+P+"*([*^$|!~]?=)"+P+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+q+"))|)"+P+"*\\]",F=":("+q+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+R+")*)|.*)\\)|)",W=new RegExp(P+"+","g"),B=new RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),U=new RegExp("^"+P+"*,"+P+"*"),V=new RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),K=new RegExp(P+"|>"),Q=new RegExp(F),$=new RegExp("^"+q+"$"),z={ID:new RegExp("^#("+q+")"),CLASS:new RegExp("^\\.("+q+")"),TAG:new RegExp("^("+q+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:new RegExp("^(?:"+M+")$","i"),needsContext:new RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,X=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,J=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),ne=function(e,t,n){var i="0x"+t-65536;return i!=i||n?t:i<0?String.fromCharCode(i+65536):String.fromCharCode(i>>10|55296,1023&i|56320)},ie=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,re=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){d()},se=be((function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{k.apply(L=H.call(E.childNodes),E.childNodes)}catch(t){k={apply:L.length?function(e,t){I.apply(e,H.call(t))}:function(e,t){for(var n=e.length,i=0;e[n++]=t[i++];);e.length=n-1}}}function ae(e,t,i,r){var o,a,u,c,f,p,v,y=t&&t.ownerDocument,T=t?t.nodeType:9;if(i=i||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return i;if(!r&&((t?t.ownerDocument||t:E)!==h&&d(t),t=t||h,m)){if(11!==T&&(f=Z.exec(e)))if(o=f[1]){if(9===T){if(!(u=t.getElementById(o)))return i;if(u.id===o)return i.push(u),i}else if(y&&(u=y.getElementById(o))&&_(t,u)&&u.id===o)return i.push(u),i}else{if(f[2])return k.apply(i,t.getElementsByTagName(e)),i;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return k.apply(i,t.getElementsByClassName(o)),i}if(n.qsa&&!D[e+" "]&&(!g||!g.test(e))&&(1!==T||"object"!==t.nodeName.toLowerCase())){if(v=e,y=t,1===T&&K.test(e)){for((c=t.getAttribute("id"))?c=c.replace(ie,re):t.setAttribute("id",c=b),a=(p=s(e)).length;a--;)p[a]="#"+c+" "+_e(p[a]);v=p.join(","),y=ee.test(e)&&ve(t.parentNode)||t}try{return k.apply(i,y.querySelectorAll(v)),i}catch(t){D(e,!0)}finally{c===b&&t.removeAttribute("id")}}}return l(e.replace(B,"$1"),t,i,r)}function le(){var e=[];return function t(n,r){return e.push(n+" ")>i.cacheLength&&delete t[e.shift()],t[n+" "]=r}}function ue(e){return e[b]=!0,e}function ce(e){var t=h.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){for(var n=e.split("|"),r=n.length;r--;)i.attrHandle[n[r]]=t}function de(e,t){var n=t&&e,i=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(i)return i;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function he(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function me(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&se(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function ge(e){return ue((function(t){return t=+t,ue((function(n,i){for(var r,o=e([],n.length,t),s=o.length;s--;)n[r=o[s]]&&(n[r]=!(i[r]=n[r]))}))}))}function ve(e){return e&&void 0!==e.getElementsByTagName&&e}for(t in n=ae.support={},o=ae.isXML=function(e){var t=(e.ownerDocument||e).documentElement;return!Y.test(e.namespaceURI||t&&t.nodeName||"HTML")},d=ae.setDocument=function(e){var t,r,s=e?e.ownerDocument||e:E;return s!==h&&9===s.nodeType&&s.documentElement&&(p=(h=s).documentElement,m=!o(h),E!==h&&(r=h.defaultView)&&r.top!==r&&(r.addEventListener?r.addEventListener("unload",oe,!1):r.attachEvent&&r.attachEvent("onunload",oe)),n.attributes=ce((function(e){return e.className="i",!e.getAttribute("className")})),n.getElementsByTagName=ce((function(e){return e.appendChild(h.createComment("")),!e.getElementsByTagName("*").length})),n.getElementsByClassName=J.test(h.getElementsByClassName),n.getById=ce((function(e){return p.appendChild(e).id=b,!h.getElementsByName||!h.getElementsByName(b).length})),n.getById?(i.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},i.find.ID=function(e,t){if(void 0!==t.getElementById&&m){var n=t.getElementById(e);return n?[n]:[]}}):(i.filter.ID=function(e){var t=e.replace(te,ne);return function(e){var n=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},i.find.ID=function(e,t){if(void 0!==t.getElementById&&m){var n,i,r,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];for(r=t.getElementsByName(e),i=0;o=r[i++];)if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),i.find.TAG=n.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,i=[],r=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[r++];)1===n.nodeType&&i.push(n);return i}return o},i.find.CLASS=n.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&m)return t.getElementsByClassName(e)},v=[],g=[],(n.qsa=J.test(h.querySelectorAll))&&(ce((function(e){p.appendChild(e).innerHTML="<a id='"+b+"'></a><select id='"+b+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+M+")"),e.querySelectorAll("[id~="+b+"-]").length||g.push("~="),e.querySelectorAll(":checked").length||g.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||g.push(".#.+[+~]")})),ce((function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=h.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&g.push("name"+P+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&g.push(":enabled",":disabled"),p.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")}))),(n.matchesSelector=J.test(y=p.matches||p.webkitMatchesSelector||p.mozMatchesSelector||p.oMatchesSelector||p.msMatchesSelector))&&ce((function(e){n.disconnectedMatch=y.call(e,"*"),y.call(e,"[s!='']:x"),v.push("!=",F)})),g=g.length&&new RegExp(g.join("|")),v=v.length&&new RegExp(v.join("|")),t=J.test(p.compareDocumentPosition),_=t||J.test(p.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,i=t&&t.parentNode;return e===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):e.compareDocumentPosition&&16&e.compareDocumentPosition(i)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},A=t?function(e,t){if(e===t)return f=!0,0;var i=!e.compareDocumentPosition-!t.compareDocumentPosition;return i||(1&(i=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===i?e===h||e.ownerDocument===E&&_(E,e)?-1:t===h||t.ownerDocument===E&&_(E,t)?1:c?j(c,e)-j(c,t):0:4&i?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,i=0,r=e.parentNode,o=t.parentNode,s=[e],a=[t];if(!r||!o)return e===h?-1:t===h?1:r?-1:o?1:c?j(c,e)-j(c,t):0;if(r===o)return de(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)a.unshift(n);for(;s[i]===a[i];)i++;return i?de(s[i],a[i]):s[i]===E?-1:a[i]===E?1:0}),h},ae.matches=function(e,t){return ae(e,null,null,t)},ae.matchesSelector=function(e,t){if((e.ownerDocument||e)!==h&&d(e),n.matchesSelector&&m&&!D[t+" "]&&(!v||!v.test(t))&&(!g||!g.test(t)))try{var i=y.call(e,t);if(i||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return i}catch(e){D(t,!0)}return 0<ae(t,h,null,[e]).length},ae.contains=function(e,t){return(e.ownerDocument||e)!==h&&d(e),_(e,t)},ae.attr=function(e,t){(e.ownerDocument||e)!==h&&d(e);var r=i.attrHandle[t.toLowerCase()],o=r&&N.call(i.attrHandle,t.toLowerCase())?r(e,t,!m):void 0;return void 0!==o?o:n.attributes||!m?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},ae.escape=function(e){return(e+"").replace(ie,re)},ae.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},ae.uniqueSort=function(e){var t,i=[],r=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(A),f){for(;t=e[o++];)t===e[o]&&(r=i.push(o));for(;r--;)e.splice(i[r],1)}return c=null,e},r=ae.getText=function(e){var t,n="",i=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=r(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[i++];)n+=r(t);return n},(i=ae.selectors={cacheLength:50,createPseudo:ue,match:z,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||ae.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&ae.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return z.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&Q.test(n)&&(t=s(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=C[e+" "];return t||(t=new RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&C(e,(function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")}))},ATTR:function(e,t,n){return function(i){var r=ae.attr(i,e);return null==r?"!="===t:!t||(r+="","="===t?r===n:"!="===t?r!==n:"^="===t?n&&0===r.indexOf(n):"*="===t?n&&-1<r.indexOf(n):"$="===t?n&&r.slice(-n.length)===n:"~="===t?-1<(" "+r.replace(W," ")+" ").indexOf(n):"|="===t&&(r===n||r.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,i,r){var o="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===i&&0===r?function(e){return!!e.parentNode}:function(t,n,l){var u,c,f,d,h,p,m=o!==s?"nextSibling":"previousSibling",g=t.parentNode,v=a&&t.nodeName.toLowerCase(),y=!l&&!a,_=!1;if(g){if(o){for(;m;){for(d=t;d=d[m];)if(a?d.nodeName.toLowerCase()===v:1===d.nodeType)return!1;p=m="only"===e&&!p&&"nextSibling"}return!0}if(p=[s?g.firstChild:g.lastChild],s&&y){for(_=(h=(u=(c=(f=(d=g)[b]||(d[b]={}))[d.uniqueID]||(f[d.uniqueID]={}))[e]||[])[0]===T&&u[1])&&u[2],d=h&&g.childNodes[h];d=++h&&d&&d[m]||(_=h=0)||p.pop();)if(1===d.nodeType&&++_&&d===t){c[e]=[T,h,_];break}}else if(y&&(_=h=(u=(c=(f=(d=t)[b]||(d[b]={}))[d.uniqueID]||(f[d.uniqueID]={}))[e]||[])[0]===T&&u[1]),!1===_)for(;(d=++h&&d&&d[m]||(_=h=0)||p.pop())&&((a?d.nodeName.toLowerCase()!==v:1!==d.nodeType)||!++_||(y&&((c=(f=d[b]||(d[b]={}))[d.uniqueID]||(f[d.uniqueID]={}))[e]=[T,_]),d!==t)););return(_-=r)===i||_%i==0&&0<=_/i}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||ae.error("unsupported pseudo: "+e);return r[b]?r(t):1<r.length?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ue((function(e,n){for(var i,o=r(e,t),s=o.length;s--;)e[i=j(e,o[s])]=!(n[i]=o[s])})):function(e){return r(e,0,n)}):r}},pseudos:{not:ue((function(e){var t=[],n=[],i=a(e.replace(B,"$1"));return i[b]?ue((function(e,t,n,r){for(var o,s=i(e,null,r,[]),a=e.length;a--;)(o=s[a])&&(e[a]=!(t[a]=o))})):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}})),has:ue((function(e){return function(t){return 0<ae(e,t).length}})),contains:ue((function(e){return e=e.replace(te,ne),function(t){return-1<(t.textContent||r(t)).indexOf(e)}})),lang:ue((function(e){return $.test(e||"")||ae.error("unsupported lang: "+e),e=e.replace(te,ne).toLowerCase(),function(t){var n;do{if(n=m?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}})),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===p},focus:function(e){return e===h.activeElement&&(!h.hasFocus||h.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:me(!1),disabled:me(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return G.test(e.nodeName)},input:function(e){return X.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ge((function(){return[0]})),last:ge((function(e,t){return[t-1]})),eq:ge((function(e,t,n){return[n<0?n+t:n]})),even:ge((function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e})),odd:ge((function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e})),lt:ge((function(e,t,n){for(var i=n<0?n+t:t<n?t:n;0<=--i;)e.push(i);return e})),gt:ge((function(e,t,n){for(var i=n<0?n+t:n;++i<t;)e.push(i);return e}))}}).pseudos.nth=i.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[t]=he(t);for(t in{submit:!0,reset:!0})i.pseudos[t]=pe(t);function ye(){}function _e(e){for(var t=0,n=e.length,i="";t<n;t++)i+=e[t].value;return i}function be(e,t,n){var i=t.dir,r=t.next,o=r||i,s=n&&"parentNode"===o,a=w++;return t.first?function(t,n,r){for(;t=t[i];)if(1===t.nodeType||s)return e(t,n,r);return!1}:function(t,n,l){var u,c,f,d=[T,a];if(l){for(;t=t[i];)if((1===t.nodeType||s)&&e(t,n,l))return!0}else for(;t=t[i];)if(1===t.nodeType||s)if(c=(f=t[b]||(t[b]={}))[t.uniqueID]||(f[t.uniqueID]={}),r&&r===t.nodeName.toLowerCase())t=t[i]||t;else{if((u=c[o])&&u[0]===T&&u[1]===a)return d[2]=u[2];if((c[o]=d)[2]=e(t,n,l))return!0}return!1}}function Ee(e){return 1<e.length?function(t,n,i){for(var r=e.length;r--;)if(!e[r](t,n,i))return!1;return!0}:e[0]}function Te(e,t,n,i,r){for(var o,s=[],a=0,l=e.length,u=null!=t;a<l;a++)(o=e[a])&&(n&&!n(o,i,r)||(s.push(o),u&&t.push(a)));return s}function we(e,t,n,i,r,o){return i&&!i[b]&&(i=we(i)),r&&!r[b]&&(r=we(r,o)),ue((function(o,s,a,l){var u,c,f,d=[],h=[],p=s.length,m=o||function(e,t,n){for(var i=0,r=t.length;i<r;i++)ae(e,t[i],n);return n}(t||"*",a.nodeType?[a]:a,[]),g=!e||!o&&t?m:Te(m,d,e,a,l),v=n?r||(o?e:p||i)?[]:s:g;if(n&&n(g,v,a,l),i)for(u=Te(v,h),i(u,[],a,l),c=u.length;c--;)(f=u[c])&&(v[h[c]]=!(g[h[c]]=f));if(o){if(r||e){if(r){for(u=[],c=v.length;c--;)(f=v[c])&&u.push(g[c]=f);r(null,v=[],u,l)}for(c=v.length;c--;)(f=v[c])&&-1<(u=r?j(o,f):d[c])&&(o[u]=!(s[u]=f))}}else v=Te(v===s?v.splice(p,v.length):v),r?r(null,s,v,l):k.apply(s,v)}))}function Ce(e){for(var t,n,r,o=e.length,s=i.relative[e[0].type],a=s||i.relative[" "],l=s?1:0,c=be((function(e){return e===t}),a,!0),f=be((function(e){return-1<j(t,e)}),a,!0),d=[function(e,n,i){var r=!s&&(i||n!==u)||((t=n).nodeType?c(e,n,i):f(e,n,i));return t=null,r}];l<o;l++)if(n=i.relative[e[l].type])d=[be(Ee(d),n)];else{if((n=i.filter[e[l].type].apply(null,e[l].matches))[b]){for(r=++l;r<o&&!i.relative[e[r].type];r++);return we(1<l&&Ee(d),1<l&&_e(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(B,"$1"),n,l<r&&Ce(e.slice(l,r)),r<o&&Ce(e=e.slice(r)),r<o&&_e(e))}d.push(n)}return Ee(d)}return ye.prototype=i.filters=i.pseudos,i.setFilters=new ye,s=ae.tokenize=function(e,t){var n,r,o,s,a,l,u,c=x[e+" "];if(c)return t?0:c.slice(0);for(a=e,l=[],u=i.preFilter;a;){for(s in n&&!(r=U.exec(a))||(r&&(a=a.slice(r[0].length)||a),l.push(o=[])),n=!1,(r=V.exec(a))&&(n=r.shift(),o.push({value:n,type:r[0].replace(B," ")}),a=a.slice(n.length)),i.filter)!(r=z[s].exec(a))||u[s]&&!(r=u[s](r))||(n=r.shift(),o.push({value:n,type:s,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?ae.error(e):x(e,l).slice(0)},a=ae.compile=function(e,t){var n,r,o,a,l,c,f=[],p=[],g=S[e+" "];if(!g){for(t||(t=s(e)),n=t.length;n--;)(g=Ce(t[n]))[b]?f.push(g):p.push(g);(g=S(e,(r=p,a=0<(o=f).length,l=0<r.length,c=function(e,t,n,s,c){var f,p,g,v=0,y="0",_=e&&[],b=[],E=u,w=e||l&&i.find.TAG("*",c),C=T+=null==E?1:Math.random()||.1,x=w.length;for(c&&(u=t===h||t||c);y!==x&&null!=(f=w[y]);y++){if(l&&f){for(p=0,t||f.ownerDocument===h||(d(f),n=!m);g=r[p++];)if(g(f,t||h,n)){s.push(f);break}c&&(T=C)}a&&((f=!g&&f)&&v--,e&&_.push(f))}if(v+=y,a&&y!==v){for(p=0;g=o[p++];)g(_,b,t,n);if(e){if(0<v)for(;y--;)_[y]||b[y]||(b[y]=O.call(s));b=Te(b)}k.apply(s,b),c&&!e&&0<b.length&&1<v+o.length&&ae.uniqueSort(s)}return c&&(T=C,u=E),_},a?ue(c):c))).selector=e}return g},l=ae.select=function(e,t,n,r){var o,l,u,c,f,d="function"==typeof e&&e,h=!r&&s(e=d.selector||e);if(n=n||[],1===h.length){if(2<(l=h[0]=h[0].slice(0)).length&&"ID"===(u=l[0]).type&&9===t.nodeType&&m&&i.relative[l[1].type]){if(!(t=(i.find.ID(u.matches[0].replace(te,ne),t)||[])[0]))return n;d&&(t=t.parentNode),e=e.slice(l.shift().value.length)}for(o=z.needsContext.test(e)?0:l.length;o--&&!i.relative[c=(u=l[o]).type];)if((f=i.find[c])&&(r=f(u.matches[0].replace(te,ne),ee.test(l[0].type)&&ve(t.parentNode)||t))){if(l.splice(o,1),!(e=r.length&&_e(l)))return k.apply(n,r),n;break}}return(d||a(e,h))(r,t,!m,n,!t||ee.test(e)&&ve(t.parentNode)||t),n},n.sortStable=b.split("").sort(A).join("")===b,n.detectDuplicates=!!f,d(),n.sortDetached=ce((function(e){return 1&e.compareDocumentPosition(h.createElement("fieldset"))})),ce((function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")}))||fe("type|href|height|width",(function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)})),n.attributes&&ce((function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")}))||fe("value",(function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue})),ce((function(e){return null==e.getAttribute("disabled")}))||fe(M,(function(e,t,n){var i;if(!n)return!0===e[t]?t.toLowerCase():(i=e.getAttributeNode(t))&&i.specified?i.value:null})),ae}(e);E.find=C,E.expr=C.selectors,E.expr[":"]=E.expr.pseudos,E.uniqueSort=E.unique=C.uniqueSort,E.text=C.getText,E.isXMLDoc=C.isXML,E.contains=C.contains,E.escapeSelector=C.escape;var x=function(e,t,n){for(var i=[],r=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(r&&E(e).is(n))break;i.push(e)}return i},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=E.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function L(e,t,n){return m(t)?E.grep(e,(function(e,i){return!!t.call(e,i,e)!==n})):t.nodeType?E.grep(e,(function(e){return e===t!==n})):"string"!=typeof t?E.grep(e,(function(e){return-1<l.call(t,e)!==n})):E.filter(t,e,n)}E.filter=function(e,t,n){var i=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===i.nodeType?E.find.matchesSelector(i,e)?[i]:[]:E.find.matches(e,E.grep(t,(function(e){return 1===e.nodeType})))},E.fn.extend({find:function(e){var t,n,i=this.length,r=this;if("string"!=typeof e)return this.pushStack(E(e).filter((function(){for(t=0;t<i;t++)if(E.contains(r[t],this))return!0})));for(n=this.pushStack([]),t=0;t<i;t++)E.find(e,r[t],n);return 1<i?E.uniqueSort(n):n},filter:function(e){return this.pushStack(L(this,e||[],!1))},not:function(e){return this.pushStack(L(this,e||[],!0))},is:function(e){return!!L(this,"string"==typeof e&&D.test(e)?E(e):e||[],!1).length}});var O,I=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(E.fn.init=function(e,t,n){var r,o;if(!e)return this;if(n=n||O,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:I.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(E.merge(this,E.parseHTML(r[1],(t=t instanceof E?t[0]:t)&&t.nodeType?t.ownerDocument||t:i,!0)),N.test(r[1])&&E.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(o=i.getElementById(r[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(E):E.makeArray(e,this)}).prototype=E.fn,O=E(i);var k=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function j(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}E.fn.extend({has:function(e){var t=E(e,this),n=t.length;return this.filter((function(){for(var e=0;e<n;e++)if(E.contains(this,t[e]))return!0}))},closest:function(e,t){var n,i=0,r=this.length,o=[],s="string"!=typeof e&&E(e);if(!D.test(e))for(;i<r;i++)for(n=this[i];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(s?-1<s.index(n):1===n.nodeType&&E.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?E.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?l.call(E(e),this[0]):l.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(E.uniqueSort(E.merge(this.get(),E(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),E.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x(e,"parentNode")},parentsUntil:function(e,t,n){return x(e,"parentNode",n)},next:function(e){return j(e,"nextSibling")},prev:function(e){return j(e,"previousSibling")},nextAll:function(e){return x(e,"nextSibling")},prevAll:function(e){return x(e,"previousSibling")},nextUntil:function(e,t,n){return x(e,"nextSibling",n)},prevUntil:function(e,t,n){return x(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return void 0!==e.contentDocument?e.contentDocument:(A(e,"template")&&(e=e.content||e),E.merge([],e.childNodes))}},(function(e,t){E.fn[e]=function(n,i){var r=E.map(this,t,n);return"Until"!==e.slice(-5)&&(i=n),i&&"string"==typeof i&&(r=E.filter(i,r)),1<this.length&&(H[e]||E.uniqueSort(r),k.test(e)&&r.reverse()),this.pushStack(r)}}));var M=/[^\x20\t\r\n\f]+/g;function P(e){return e}function q(e){throw e}function R(e,t,n,i){var r;try{e&&m(r=e.promise)?r.call(e).done(t).fail(n):e&&m(r=e.then)?r.call(e,t,n):t.apply(void 0,[e].slice(i))}catch(e){n.apply(void 0,[e])}}E.Callbacks=function(e){var t;e="string"==typeof e?(t={},E.each(e.match(M)||[],(function(e,n){t[n]=!0})),t):E.extend({},e);var n,i,r,o,s=[],a=[],l=-1,u=function(){for(o=o||e.once,r=n=!0;a.length;l=-1)for(i=a.shift();++l<s.length;)!1===s[l].apply(i[0],i[1])&&e.stopOnFalse&&(l=s.length,i=!1);e.memory||(i=!1),n=!1,o&&(s=i?[]:"")},c={add:function(){return s&&(i&&!n&&(l=s.length-1,a.push(i)),function t(n){E.each(n,(function(n,i){m(i)?e.unique&&c.has(i)||s.push(i):i&&i.length&&"string"!==_(i)&&t(i)}))}(arguments),i&&!n&&u()),this},remove:function(){return E.each(arguments,(function(e,t){for(var n;-1<(n=E.inArray(t,s,n));)s.splice(n,1),n<=l&&l--})),this},has:function(e){return e?-1<E.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return o=a=[],s=i="",this},disabled:function(){return!s},lock:function(){return o=a=[],i||n||(s=i=""),this},locked:function(){return!!o},fireWith:function(e,t){return o||(t=[e,(t=t||[]).slice?t.slice():t],a.push(t),n||u()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},E.extend({Deferred:function(t){var n=[["notify","progress",E.Callbacks("memory"),E.Callbacks("memory"),2],["resolve","done",E.Callbacks("once memory"),E.Callbacks("once memory"),0,"resolved"],["reject","fail",E.Callbacks("once memory"),E.Callbacks("once memory"),1,"rejected"]],i="pending",r={state:function(){return i},always:function(){return o.done(arguments).fail(arguments),this},catch:function(e){return r.then(null,e)},pipe:function(){var e=arguments;return E.Deferred((function(t){E.each(n,(function(n,i){var r=m(e[i[4]])&&e[i[4]];o[i[1]]((function(){var e=r&&r.apply(this,arguments);e&&m(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[i[0]+"With"](this,r?[e]:arguments)}))})),e=null})).promise()},then:function(t,i,r){var o=0;function s(t,n,i,r){return function(){var a=this,l=arguments,u=function(){var e,u;if(!(t<o)){if((e=i.apply(a,l))===n.promise())throw new TypeError("Thenable self-resolution");m(u=e&&("object"==typeof e||"function"==typeof e)&&e.then)?r?u.call(e,s(o,n,P,r),s(o,n,q,r)):(o++,u.call(e,s(o,n,P,r),s(o,n,q,r),s(o,n,P,n.notifyWith))):(i!==P&&(a=void 0,l=[e]),(r||n.resolveWith)(a,l))}},c=r?u:function(){try{u()}catch(u){E.Deferred.exceptionHook&&E.Deferred.exceptionHook(u,c.stackTrace),o<=t+1&&(i!==q&&(a=void 0,l=[u]),n.rejectWith(a,l))}};t?c():(E.Deferred.getStackHook&&(c.stackTrace=E.Deferred.getStackHook()),e.setTimeout(c))}}return E.Deferred((function(e){n[0][3].add(s(0,e,m(r)?r:P,e.notifyWith)),n[1][3].add(s(0,e,m(t)?t:P)),n[2][3].add(s(0,e,m(i)?i:q))})).promise()},promise:function(e){return null!=e?E.extend(e,r):r}},o={};return E.each(n,(function(e,t){var s=t[2],a=t[5];r[t[1]]=s.add,a&&s.add((function(){i=a}),n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),s.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=s.fireWith})),r.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,i=Array(n),r=o.call(arguments),s=E.Deferred(),a=function(e){return function(n){i[e]=this,r[e]=1<arguments.length?o.call(arguments):n,--t||s.resolveWith(i,r)}};if(t<=1&&(R(e,s.done(a(n)).resolve,s.reject,!t),"pending"===s.state()||m(r[n]&&r[n].then)))return s.then();for(;n--;)R(r[n],a(n),s.reject);return s.promise()}});var F=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;E.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&F.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},E.readyException=function(t){e.setTimeout((function(){throw t}))};var W=E.Deferred();function B(){i.removeEventListener("DOMContentLoaded",B),e.removeEventListener("load",B),E.ready()}E.fn.ready=function(e){return W.then(e).catch((function(e){E.readyException(e)})),this},E.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--E.readyWait:E.isReady)||(E.isReady=!0)!==e&&0<--E.readyWait||W.resolveWith(i,[E])}}),E.ready.then=W.then,"complete"===i.readyState||"loading"!==i.readyState&&!i.documentElement.doScroll?e.setTimeout(E.ready):(i.addEventListener("DOMContentLoaded",B),e.addEventListener("load",B));var U=function(e,t,n,i,r,o,s){var a=0,l=e.length,u=null==n;if("object"===_(n))for(a in r=!0,n)U(e,t,a,n[a],!0,o,s);else if(void 0!==i&&(r=!0,m(i)||(s=!0),u&&(s?(t.call(e,i),t=null):(u=t,t=function(e,t,n){return u.call(E(e),n)})),t))for(;a<l;a++)t(e[a],n,s?i:i.call(e[a],a,t(e[a],n)));return r?e:u?t.call(e):l?t(e[0],n):o},V=/^-ms-/,K=/-([a-z])/g;function Q(e,t){return t.toUpperCase()}function $(e){return e.replace(V,"ms-").replace(K,Q)}var z=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function Y(){this.expando=E.expando+Y.uid++}Y.uid=1,Y.prototype={cache:function(e){var t=e[this.expando];return t||(t={},z(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var i,r=this.cache(e);if("string"==typeof t)r[$(t)]=n;else for(i in t)r[$(i)]=t[i];return r},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][$(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,i=e[this.expando];if(void 0!==i){if(void 0!==t){n=(t=Array.isArray(t)?t.map($):(t=$(t))in i?[t]:t.match(M)||[]).length;for(;n--;)delete i[t[n]]}(void 0===t||E.isEmptyObject(i))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!E.isEmptyObject(t)}};var X=new Y,G=new Y,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Z=/[A-Z]/g;function ee(e,t,n){var i,r;if(void 0===n&&1===e.nodeType)if(i="data-"+t.replace(Z,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(i))){try{n="true"===(r=n)||"false"!==r&&("null"===r?null:r===+r+""?+r:J.test(r)?JSON.parse(r):r)}catch(e){}G.set(e,t,n)}else n=void 0;return n}E.extend({hasData:function(e){return G.hasData(e)||X.hasData(e)},data:function(e,t,n){return G.access(e,t,n)},removeData:function(e,t){G.remove(e,t)},_data:function(e,t,n){return X.access(e,t,n)},_removeData:function(e,t){X.remove(e,t)}}),E.fn.extend({data:function(e,t){var n,i,r,o=this[0],s=o&&o.attributes;if(void 0===e){if(this.length&&(r=G.get(o),1===o.nodeType&&!X.get(o,"hasDataAttrs"))){for(n=s.length;n--;)s[n]&&0===(i=s[n].name).indexOf("data-")&&(i=$(i.slice(5)),ee(o,i,r[i]));X.set(o,"hasDataAttrs",!0)}return r}return"object"==typeof e?this.each((function(){G.set(this,e)})):U(this,(function(t){var n;if(o&&void 0===t)return void 0!==(n=G.get(o,e))?n:void 0!==(n=ee(o,e))?n:void 0;this.each((function(){G.set(this,e,t)}))}),null,t,1<arguments.length,null,!0)},removeData:function(e){return this.each((function(){G.remove(this,e)}))}}),E.extend({queue:function(e,t,n){var i;if(e)return i=X.get(e,t=(t||"fx")+"queue"),n&&(!i||Array.isArray(n)?i=X.access(e,t,E.makeArray(n)):i.push(n)),i||[]},dequeue:function(e,t){var n=E.queue(e,t=t||"fx"),i=n.length,r=n.shift(),o=E._queueHooks(e,t);"inprogress"===r&&(r=n.shift(),i--),r&&("fx"===t&&n.unshift("inprogress"),delete o.stop,r.call(e,(function(){E.dequeue(e,t)}),o)),!i&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return X.get(e,n)||X.access(e,n,{empty:E.Callbacks("once memory").add((function(){X.remove(e,[t+"queue",n])}))})}}),E.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length<n?E.queue(this[0],e):void 0===t?this:this.each((function(){var n=E.queue(this,e,t);E._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&E.dequeue(this,e)}))},dequeue:function(e){return this.each((function(){E.dequeue(this,e)}))},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,i=1,r=E.Deferred(),o=this,s=this.length,a=function(){--i||r.resolveWith(o,[o])};for("string"!=typeof e&&(t=e,e=void 0),e=e||"fx";s--;)(n=X.get(o[s],e+"queueHooks"))&&n.empty&&(i++,n.empty.add(a));return a(),r.promise(t)}});var te=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ne=new RegExp("^(?:([+-])=|)("+te+")([a-z%]*)$","i"),ie=["Top","Right","Bottom","Left"],re=i.documentElement,oe=function(e){return E.contains(e.ownerDocument,e)},se={composed:!0};re.getRootNode&&(oe=function(e){return E.contains(e.ownerDocument,e)||e.getRootNode(se)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&oe(e)&&"none"===E.css(e,"display")},le=function(e,t,n,i){var r,o,s={};for(o in t)s[o]=e.style[o],e.style[o]=t[o];for(o in r=n.apply(e,i||[]),t)e.style[o]=s[o];return r};function ue(e,t,n,i){var r,o,s=20,a=i?function(){return i.cur()}:function(){return E.css(e,t,"")},l=a(),u=n&&n[3]||(E.cssNumber[t]?"":"px"),c=e.nodeType&&(E.cssNumber[t]||"px"!==u&&+l)&&ne.exec(E.css(e,t));if(c&&c[3]!==u){for(u=u||c[3],c=+(l/=2)||1;s--;)E.style(e,t,c+u),(1-o)*(1-(o=a()/l||.5))<=0&&(s=0),c/=o;E.style(e,t,(c*=2)+u),n=n||[]}return n&&(c=+c||+l||0,r=n[1]?c+(n[1]+1)*n[2]:+n[2],i&&(i.unit=u,i.start=c,i.end=r)),r}var ce={};function fe(e,t){for(var n,i,r,o,s,a,l,u=[],c=0,f=e.length;c<f;c++)(i=e[c]).style&&(n=i.style.display,t?("none"===n&&(u[c]=X.get(i,"display")||null,u[c]||(i.style.display="")),""===i.style.display&&ae(i)&&(u[c]=(l=s=o=void 0,s=(r=i).ownerDocument,(l=ce[a=r.nodeName])||(o=s.body.appendChild(s.createElement(a)),l=E.css(o,"display"),o.parentNode.removeChild(o),"none"===l&&(l="block"),ce[a]=l)))):"none"!==n&&(u[c]="none",X.set(i,"display",n)));for(c=0;c<f;c++)null!=u[c]&&(e[c].style.display=u[c]);return e}E.fn.extend({show:function(){return fe(this,!0)},hide:function(){return fe(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each((function(){ae(this)?E(this).show():E(this).hide()}))}});var de=/^(?:checkbox|radio)$/i,he=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,pe=/^$|^module$|\/(?:java|ecma)script/i,me={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ge(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?E.merge([e],n):n}function ve(e,t){for(var n=0,i=e.length;n<i;n++)X.set(e[n],"globalEval",!t||X.get(t[n],"globalEval"))}me.optgroup=me.option,me.tbody=me.tfoot=me.colgroup=me.caption=me.thead,me.th=me.td;var ye,_e,be=/<|&#?\w+;/;function Ee(e,t,n,i,r){for(var o,s,a,l,u,c,f=t.createDocumentFragment(),d=[],h=0,p=e.length;h<p;h++)if((o=e[h])||0===o)if("object"===_(o))E.merge(d,o.nodeType?[o]:o);else if(be.test(o)){for(s=s||f.appendChild(t.createElement("div")),a=(he.exec(o)||["",""])[1].toLowerCase(),s.innerHTML=(l=me[a]||me._default)[1]+E.htmlPrefilter(o)+l[2],c=l[0];c--;)s=s.lastChild;E.merge(d,s.childNodes),(s=f.firstChild).textContent=""}else d.push(t.createTextNode(o));for(f.textContent="",h=0;o=d[h++];)if(i&&-1<E.inArray(o,i))r&&r.push(o);else if(u=oe(o),s=ge(f.appendChild(o),"script"),u&&ve(s),n)for(c=0;o=s[c++];)pe.test(o.type||"")&&n.push(o);return f}ye=i.createDocumentFragment().appendChild(i.createElement("div")),(_e=i.createElement("input")).setAttribute("type","radio"),_e.setAttribute("checked","checked"),_e.setAttribute("name","t"),ye.appendChild(_e),p.checkClone=ye.cloneNode(!0).cloneNode(!0).lastChild.checked,ye.innerHTML="<textarea>x</textarea>",p.noCloneChecked=!!ye.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,we=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function xe(){return!0}function Se(){return!1}function De(e,t){return e===function(){try{return i.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,i,r,o){var s,a;if("object"==typeof t){for(a in"string"!=typeof n&&(i=i||n,n=void 0),t)Ae(e,a,n,i,t[a],o);return e}if(null==i&&null==r?(r=n,i=n=void 0):null==r&&("string"==typeof n?(r=i,i=void 0):(r=i,i=n,n=void 0)),!1===r)r=Se;else if(!r)return e;return 1===o&&(s=r,(r=function(e){return E().off(e),s.apply(this,arguments)}).guid=s.guid||(s.guid=E.guid++)),e.each((function(){E.event.add(this,t,r,i,n)}))}function Ne(e,t,n){n?(X.set(e,t,!1),E.event.add(e,t,{namespace:!1,handler:function(e){var i,r,s=X.get(this,t);if(1&e.isTrigger&&this[t]){if(s.length)(E.event.special[t]||{}).delegateType&&e.stopPropagation();else if(s=o.call(arguments),X.set(this,t,s),i=n(this,t),this[t](),s!==(r=X.get(this,t))||i?X.set(this,t,!1):r={},s!==r)return e.stopImmediatePropagation(),e.preventDefault(),r.value}else s.length&&(X.set(this,t,{value:E.event.trigger(E.extend(s[0],E.Event.prototype),s.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===X.get(e,t)&&E.event.add(e,t,xe)}E.event={global:{},add:function(e,t,n,i,r){var o,s,a,l,u,c,f,d,h,p,m,g=X.get(e);if(g)for(n.handler&&(n=(o=n).handler,r=o.selector),r&&E.find.matchesSelector(re,r),n.guid||(n.guid=E.guid++),(l=g.events)||(l=g.events={}),(s=g.handle)||(s=g.handle=function(t){return void 0!==E&&E.event.triggered!==t.type?E.event.dispatch.apply(e,arguments):void 0}),u=(t=(t||"").match(M)||[""]).length;u--;)h=m=(a=Ce.exec(t[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=E.event.special[h]||{},f=E.event.special[h=(r?f.delegateType:f.bindType)||h]||{},c=E.extend({type:h,origType:m,data:i,handler:n,guid:n.guid,selector:r,needsContext:r&&E.expr.match.needsContext.test(r),namespace:p.join(".")},o),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,i,p,s)||e.addEventListener&&e.addEventListener(h,s)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),r?d.splice(d.delegateCount++,0,c):d.push(c),E.event.global[h]=!0)},remove:function(e,t,n,i,r){var o,s,a,l,u,c,f,d,h,p,m,g=X.hasData(e)&&X.get(e);if(g&&(l=g.events)){for(u=(t=(t||"").match(M)||[""]).length;u--;)if(h=m=(a=Ce.exec(t[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=E.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=d.length;o--;)c=d[o],!r&&m!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(o,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(e,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(e,p,g.handle)||E.removeEvent(e,h,g.handle),delete l[h])}else for(h in l)E.event.remove(e,h+t[u],n,i,!0);E.isEmptyObject(l)&&X.remove(e,"handle events")}},dispatch:function(e){var t,n,i,r,o,s,a=E.event.fix(e),l=new Array(arguments.length),u=(X.get(this,"events")||{})[a.type]||[],c=E.event.special[a.type]||{};for(l[0]=a,t=1;t<arguments.length;t++)l[t]=arguments[t];if(a.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,a)){for(s=E.event.handlers.call(this,a,u),t=0;(r=s[t++])&&!a.isPropagationStopped();)for(a.currentTarget=r.elem,n=0;(o=r.handlers[n++])&&!a.isImmediatePropagationStopped();)a.rnamespace&&!1!==o.namespace&&!a.rnamespace.test(o.namespace)||(a.handleObj=o,a.data=o.data,void 0!==(i=((E.event.special[o.origType]||{}).handle||o.handler).apply(r.elem,l))&&!1===(a.result=i)&&(a.preventDefault(),a.stopPropagation()));return c.postDispatch&&c.postDispatch.call(this,a),a.result}},handlers:function(e,t){var n,i,r,o,s,a=[],l=t.delegateCount,u=e.target;if(l&&u.nodeType&&!("click"===e.type&&1<=e.button))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==e.type||!0!==u.disabled)){for(o=[],s={},n=0;n<l;n++)void 0===s[r=(i=t[n]).selector+" "]&&(s[r]=i.needsContext?-1<E(r,this).index(u):E.find(r,this,null,[u]).length),s[r]&&o.push(i);o.length&&a.push({elem:u,handlers:o})}return u=this,l<t.length&&a.push({elem:u,handlers:t.slice(l)}),a},addProp:function(e,t){Object.defineProperty(E.Event.prototype,e,{enumerable:!0,configurable:!0,get:m(t)?function(){if(this.originalEvent)return t(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[e]},set:function(t){Object.defineProperty(this,e,{enumerable:!0,configurable:!0,writable:!0,value:t})}})},fix:function(e){return e[E.expando]?e:new E.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return de.test(t.type)&&t.click&&A(t,"input")&&Ne(t,"click",xe),!1},trigger:function(e){var t=this||e;return de.test(t.type)&&t.click&&A(t,"input")&&Ne(t,"click"),!0},_default:function(e){var t=e.target;return de.test(t.type)&&t.click&&A(t,"input")&&X.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},E.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},E.Event=function(e,t){if(!(this instanceof E.Event))return new E.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?xe:Se,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&E.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[E.expando]=!0},E.Event.prototype={constructor:E.Event,isDefaultPrevented:Se,isPropagationStopped:Se,isImmediatePropagationStopped:Se,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=xe,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=xe,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=xe,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},E.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,char:!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&Te.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&we.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},E.event.addProp),E.each({focus:"focusin",blur:"focusout"},(function(e,t){E.event.special[e]={setup:function(){return Ne(this,e,De),!1},trigger:function(){return Ne(this,e),!0},delegateType:t}})),E.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},(function(e,t){E.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,i=e.relatedTarget,r=e.handleObj;return i&&(i===this||E.contains(this,i))||(e.type=r.origType,n=r.handler.apply(this,arguments),e.type=t),n}}})),E.fn.extend({on:function(e,t,n,i){return Ae(this,e,t,n,i)},one:function(e,t,n,i){return Ae(this,e,t,n,i,1)},off:function(e,t,n){var i,r;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,E(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(r in e)this.off(r,t,e[r]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Se),this.each((function(){E.event.remove(this,e,n,t)}))}});var Le=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,Oe=/<script|<style|<link/i,Ie=/checked\s*(?:[^=]|=\s*.checked.)/i,ke=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function He(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&E(e).children("tbody")[0]||e}function je(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Me(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,i,r,o,s,a,l,u;if(1===t.nodeType){if(X.hasData(e)&&(o=X.access(e),s=X.set(t,o),u=o.events))for(r in delete s.handle,s.events={},u)for(n=0,i=u[r].length;n<i;n++)E.event.add(t,r,u[r][n]);G.hasData(e)&&(a=G.access(e),l=E.extend({},a),G.set(t,l))}}function qe(e,t,n,i){t=s.apply([],t);var r,o,a,l,u,c,f=0,d=e.length,h=d-1,g=t[0],v=m(g);if(v||1<d&&"string"==typeof g&&!p.checkClone&&Ie.test(g))return e.each((function(r){var o=e.eq(r);v&&(t[0]=g.call(this,r,o.html())),qe(o,t,n,i)}));if(d&&(o=(r=Ee(t,e[0].ownerDocument,!1,e,i)).firstChild,1===r.childNodes.length&&(r=o),o||i)){for(l=(a=E.map(ge(r,"script"),je)).length;f<d;f++)u=r,f!==h&&(u=E.clone(u,!0,!0),l&&E.merge(a,ge(u,"script"))),n.call(e[f],u,f);if(l)for(c=a[a.length-1].ownerDocument,E.map(a,Me),f=0;f<l;f++)pe.test((u=a[f]).type||"")&&!X.access(u,"globalEval")&&E.contains(c,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?E._evalUrl&&!u.noModule&&E._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")}):y(u.textContent.replace(ke,""),u,c))}return e}function Re(e,t,n){for(var i,r=t?E.filter(t,e):e,o=0;null!=(i=r[o]);o++)n||1!==i.nodeType||E.cleanData(ge(i)),i.parentNode&&(n&&oe(i)&&ve(ge(i,"script")),i.parentNode.removeChild(i));return e}E.extend({htmlPrefilter:function(e){return e.replace(Le,"<$1></$2>")},clone:function(e,t,n){var i,r,o,s,a,l,u,c=e.cloneNode(!0),f=oe(e);if(!(p.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||E.isXMLDoc(e)))for(s=ge(c),i=0,r=(o=ge(e)).length;i<r;i++)a=o[i],"input"===(u=(l=s[i]).nodeName.toLowerCase())&&de.test(a.type)?l.checked=a.checked:"input"!==u&&"textarea"!==u||(l.defaultValue=a.defaultValue);if(t)if(n)for(o=o||ge(e),s=s||ge(c),i=0,r=o.length;i<r;i++)Pe(o[i],s[i]);else Pe(e,c);return 0<(s=ge(c,"script")).length&&ve(s,!f&&ge(e,"script")),c},cleanData:function(e){for(var t,n,i,r=E.event.special,o=0;void 0!==(n=e[o]);o++)if(z(n)){if(t=n[X.expando]){if(t.events)for(i in t.events)r[i]?E.event.remove(n,i):E.removeEvent(n,i,t.handle);n[X.expando]=void 0}n[G.expando]&&(n[G.expando]=void 0)}}}),E.fn.extend({detach:function(e){return Re(this,e,!0)},remove:function(e){return Re(this,e)},text:function(e){return U(this,(function(e){return void 0===e?E.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)}))}),null,e,arguments.length)},append:function(){return qe(this,arguments,(function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||He(this,e).appendChild(e)}))},prepend:function(){return qe(this,arguments,(function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=He(this,e);t.insertBefore(e,t.firstChild)}}))},before:function(){return qe(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this)}))},after:function(){return qe(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)}))},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(E.cleanData(ge(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map((function(){return E.clone(this,e,t)}))},html:function(e){return U(this,(function(e){var t=this[0]||{},n=0,i=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Oe.test(e)&&!me[(he.exec(e)||["",""])[1].toLowerCase()]){e=E.htmlPrefilter(e);try{for(;n<i;n++)1===(t=this[n]||{}).nodeType&&(E.cleanData(ge(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)}),null,e,arguments.length)},replaceWith:function(){var e=[];return qe(this,arguments,(function(t){var n=this.parentNode;E.inArray(this,e)<0&&(E.cleanData(ge(this)),n&&n.replaceChild(t,this))}),e)}}),E.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},(function(e,t){E.fn[e]=function(e){for(var n,i=[],r=E(e),o=r.length-1,s=0;s<=o;s++)n=s===o?this:this.clone(!0),E(r[s])[t](n),a.apply(i,n.get());return this.pushStack(i)}}));var Fe=new RegExp("^("+te+")(?!px)[a-z%]+$","i"),We=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},Be=new RegExp(ie.join("|"),"i");function Ue(e,t,n){var i,r,o,s,a=e.style;return(n=n||We(e))&&(""!==(s=n.getPropertyValue(t)||n[t])||oe(e)||(s=E.style(e,t)),!p.pixelBoxStyles()&&Fe.test(s)&&Be.test(t)&&(i=a.width,r=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=s,s=n.width,a.width=i,a.minWidth=r,a.maxWidth=o)),void 0!==s?s+"":s}function Ve(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function t(){if(c){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",c.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(c);var t=e.getComputedStyle(c);r="1%"!==t.top,l=12===n(t.marginLeft),c.style.right="60%",a=36===n(t.right),o=36===n(t.width),c.style.position="absolute",s=12===n(c.offsetWidth/3),re.removeChild(u),c=null}}function n(e){return Math.round(parseFloat(e))}var r,o,s,a,l,u=i.createElement("div"),c=i.createElement("div");c.style&&(c.style.backgroundClip="content-box",c.cloneNode(!0).style.backgroundClip="",p.clearCloneStyle="content-box"===c.style.backgroundClip,E.extend(p,{boxSizingReliable:function(){return t(),o},pixelBoxStyles:function(){return t(),a},pixelPosition:function(){return t(),r},reliableMarginLeft:function(){return t(),l},scrollboxSize:function(){return t(),s}}))}();var Ke=["Webkit","Moz","ms"],Qe=i.createElement("div").style,$e={};function ze(e){return E.cssProps[e]||$e[e]||(e in Qe?e:$e[e]=function(e){for(var t=e[0].toUpperCase()+e.slice(1),n=Ke.length;n--;)if((e=Ke[n]+t)in Qe)return e}(e)||e)}var Ye=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ge={position:"absolute",visibility:"hidden",display:"block"},Je={letterSpacing:"0",fontWeight:"400"};function Ze(e,t,n){var i=ne.exec(t);return i?Math.max(0,i[2]-(n||0))+(i[3]||"px"):t}function et(e,t,n,i,r,o){var s="width"===t?1:0,a=0,l=0;if(n===(i?"border":"content"))return 0;for(;s<4;s+=2)"margin"===n&&(l+=E.css(e,n+ie[s],!0,r)),i?("content"===n&&(l-=E.css(e,"padding"+ie[s],!0,r)),"margin"!==n&&(l-=E.css(e,"border"+ie[s]+"Width",!0,r))):(l+=E.css(e,"padding"+ie[s],!0,r),"padding"!==n?l+=E.css(e,"border"+ie[s]+"Width",!0,r):a+=E.css(e,"border"+ie[s]+"Width",!0,r));return!i&&0<=o&&(l+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-l-a-.5))||0),l}function tt(e,t,n){var i=We(e),r=(!p.boxSizingReliable()||n)&&"border-box"===E.css(e,"boxSizing",!1,i),o=r,s=Ue(e,t,i),a="offset"+t[0].toUpperCase()+t.slice(1);if(Fe.test(s)){if(!n)return s;s="auto"}return(!p.boxSizingReliable()&&r||"auto"===s||!parseFloat(s)&&"inline"===E.css(e,"display",!1,i))&&e.getClientRects().length&&(r="border-box"===E.css(e,"boxSizing",!1,i),(o=a in e)&&(s=e[a])),(s=parseFloat(s)||0)+et(e,t,n||(r?"border":"content"),o,i,s)+"px"}function nt(e,t,n,i,r){return new nt.prototype.init(e,t,n,i,r)}E.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Ue(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var r,o,s,a=$(t),l=Xe.test(t),u=e.style;if(l||(t=ze(a)),s=E.cssHooks[t]||E.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(r=s.get(e,!1,i))?r:u[t];"string"==(o=typeof n)&&(r=ne.exec(n))&&r[1]&&(n=ue(e,t,r),o="number"),null!=n&&n==n&&("number"!==o||l||(n+=r&&r[3]||(E.cssNumber[a]?"":"px")),p.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),s&&"set"in s&&void 0===(n=s.set(e,n,i))||(l?u.setProperty(t,n):u[t]=n))}},css:function(e,t,n,i){var r,o,s,a=$(t);return Xe.test(t)||(t=ze(a)),(s=E.cssHooks[t]||E.cssHooks[a])&&"get"in s&&(r=s.get(e,!0,n)),void 0===r&&(r=Ue(e,t,i)),"normal"===r&&t in Je&&(r=Je[t]),""===n||n?(o=parseFloat(r),!0===n||isFinite(o)?o||0:r):r}}),E.each(["height","width"],(function(e,t){E.cssHooks[t]={get:function(e,n,i){if(n)return!Ye.test(E.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?tt(e,t,i):le(e,Ge,(function(){return tt(e,t,i)}))},set:function(e,n,i){var r,o=We(e),s=!p.scrollboxSize()&&"absolute"===o.position,a=(s||i)&&"border-box"===E.css(e,"boxSizing",!1,o),l=i?et(e,t,i,a,o):0;return a&&s&&(l-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-et(e,t,"border",!1,o)-.5)),l&&(r=ne.exec(n))&&"px"!==(r[3]||"px")&&(e.style[t]=n,n=E.css(e,t)),Ze(0,n,l)}}})),E.cssHooks.marginLeft=Ve(p.reliableMarginLeft,(function(e,t){if(t)return(parseFloat(Ue(e,"marginLeft"))||e.getBoundingClientRect().left-le(e,{marginLeft:0},(function(){return e.getBoundingClientRect().left})))+"px"})),E.each({margin:"",padding:"",border:"Width"},(function(e,t){E.cssHooks[e+t]={expand:function(n){for(var i=0,r={},o="string"==typeof n?n.split(" "):[n];i<4;i++)r[e+ie[i]+t]=o[i]||o[i-2]||o[0];return r}},"margin"!==e&&(E.cssHooks[e+t].set=Ze)})),E.fn.extend({css:function(e,t){return U(this,(function(e,t,n){var i,r,o={},s=0;if(Array.isArray(t)){for(i=We(e),r=t.length;s<r;s++)o[t[s]]=E.css(e,t[s],!1,i);return o}return void 0!==n?E.style(e,t,n):E.css(e,t)}),e,t,1<arguments.length)}}),((E.Tween=nt).prototype={constructor:nt,init:function(e,t,n,i,r,o){this.elem=e,this.prop=n,this.easing=r||E.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=i,this.unit=o||(E.cssNumber[n]?"":"px")},cur:function(){var e=nt.propHooks[this.prop];return e&&e.get?e.get(this):nt.propHooks._default.get(this)},run:function(e){var t,n=nt.propHooks[this.prop];return this.pos=t=this.options.duration?E.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):nt.propHooks._default.set(this),this}}).init.prototype=nt.prototype,(nt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=E.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){E.fx.step[e.prop]?E.fx.step[e.prop](e):1!==e.elem.nodeType||!E.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:E.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=nt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},E.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},E.fx=nt.prototype.init,E.fx.step={};var it,rt,ot,st,at=/^(?:toggle|show|hide)$/,lt=/queueHooks$/;function ut(){rt&&(!1===i.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(ut):e.setTimeout(ut,E.fx.interval),E.fx.tick())}function ct(){return e.setTimeout((function(){it=void 0})),it=Date.now()}function ft(e,t){var n,i=0,r={height:e};for(t=t?1:0;i<4;i+=2-t)r["margin"+(n=ie[i])]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function dt(e,t,n){for(var i,r=(ht.tweeners[t]||[]).concat(ht.tweeners["*"]),o=0,s=r.length;o<s;o++)if(i=r[o].call(n,t,e))return i}function ht(e,t,n){var i,r,o=0,s=ht.prefilters.length,a=E.Deferred().always((function(){delete l.elem})),l=function(){if(r)return!1;for(var t=it||ct(),n=Math.max(0,u.startTime+u.duration-t),i=1-(n/u.duration||0),o=0,s=u.tweens.length;o<s;o++)u.tweens[o].run(i);return a.notifyWith(e,[u,i,n]),i<1&&s?n:(s||a.notifyWith(e,[u,1,0]),a.resolveWith(e,[u]),!1)},u=a.promise({elem:e,props:E.extend({},t),opts:E.extend(!0,{specialEasing:{},easing:E.easing._default},n),originalProperties:t,originalOptions:n,startTime:it||ct(),duration:n.duration,tweens:[],createTween:function(t,n){var i=E.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(i),i},stop:function(t){var n=0,i=t?u.tweens.length:0;if(r)return this;for(r=!0;n<i;n++)u.tweens[n].run(1);return t?(a.notifyWith(e,[u,1,0]),a.resolveWith(e,[u,t])):a.rejectWith(e,[u,t]),this}}),c=u.props;for(function(e,t){var n,i,r,o,s;for(n in e)if(r=t[i=$(n)],o=e[n],Array.isArray(o)&&(r=o[1],o=e[n]=o[0]),n!==i&&(e[i]=o,delete e[n]),(s=E.cssHooks[i])&&"expand"in s)for(n in o=s.expand(o),delete e[i],o)n in e||(e[n]=o[n],t[n]=r);else t[i]=r}(c,u.opts.specialEasing);o<s;o++)if(i=ht.prefilters[o].call(u,e,c,u.opts))return m(i.stop)&&(E._queueHooks(u.elem,u.opts.queue).stop=i.stop.bind(i)),i;return E.map(c,dt,u),m(u.opts.start)&&u.opts.start.call(e,u),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always),E.fx.timer(E.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u}E.Animation=E.extend(ht,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return ue(n.elem,e,ne.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(M);for(var n,i=0,r=e.length;i<r;i++)(ht.tweeners[n=e[i]]=ht.tweeners[n]||[]).unshift(t)},prefilters:[function(e,t,n){var i,r,o,s,a,l,u,c,f="width"in t||"height"in t,d=this,h={},p=e.style,m=e.nodeType&&ae(e),g=X.get(e,"fxshow");for(i in n.queue||(null==(s=E._queueHooks(e,"fx")).unqueued&&(s.unqueued=0,a=s.empty.fire,s.empty.fire=function(){s.unqueued||a()}),s.unqueued++,d.always((function(){d.always((function(){s.unqueued--,E.queue(e,"fx").length||s.empty.fire()}))}))),t)if(at.test(r=t[i])){if(delete t[i],o=o||"toggle"===r,r===(m?"hide":"show")){if("show"!==r||!g||void 0===g[i])continue;m=!0}h[i]=g&&g[i]||E.style(e,i)}if((l=!E.isEmptyObject(t))||!E.isEmptyObject(h))for(i in f&&1===e.nodeType&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],null==(u=g&&g.display)&&(u=X.get(e,"display")),"none"===(c=E.css(e,"display"))&&(u?c=u:(fe([e],!0),u=e.style.display||u,c=E.css(e,"display"),fe([e]))),("inline"===c||"inline-block"===c&&null!=u)&&"none"===E.css(e,"float")&&(l||(d.done((function(){p.display=u})),null==u&&(u="none"===(c=p.display)?"":c)),p.display="inline-block")),n.overflow&&(p.overflow="hidden",d.always((function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}))),l=!1,h)l||(g?"hidden"in g&&(m=g.hidden):g=X.access(e,"fxshow",{display:u}),o&&(g.hidden=!m),m&&fe([e],!0),d.done((function(){for(i in m||fe([e]),X.remove(e,"fxshow"),h)E.style(e,i,h[i])}))),l=dt(m?g[i]:0,i,d),i in g||(g[i]=l.start,m&&(l.end=l.start,l.start=0))}],prefilter:function(e,t){t?ht.prefilters.unshift(e):ht.prefilters.push(e)}}),E.speed=function(e,t,n){var i=e&&"object"==typeof e?E.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return E.fx.off?i.duration=0:"number"!=typeof i.duration&&(i.duration=i.duration in E.fx.speeds?E.fx.speeds[i.duration]:E.fx.speeds._default),null!=i.queue&&!0!==i.queue||(i.queue="fx"),i.old=i.complete,i.complete=function(){m(i.old)&&i.old.call(this),i.queue&&E.dequeue(this,i.queue)},i},E.fn.extend({fadeTo:function(e,t,n,i){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,i)},animate:function(e,t,n,i){var r=E.isEmptyObject(e),o=E.speed(t,n,i),s=function(){var t=ht(this,E.extend({},e),o);(r||X.get(this,"finish"))&&t.stop(!0)};return s.finish=s,r||!1===o.queue?this.each(s):this.queue(o.queue,s)},stop:function(e,t,n){var i=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=void 0),t&&!1!==e&&this.queue(e||"fx",[]),this.each((function(){var t=!0,r=null!=e&&e+"queueHooks",o=E.timers,s=X.get(this);if(r)s[r]&&s[r].stop&&i(s[r]);else for(r in s)s[r]&&s[r].stop&&lt.test(r)&&i(s[r]);for(r=o.length;r--;)o[r].elem!==this||null!=e&&o[r].queue!==e||(o[r].anim.stop(n),t=!1,o.splice(r,1));!t&&n||E.dequeue(this,e)}))},finish:function(e){return!1!==e&&(e=e||"fx"),this.each((function(){var t,n=X.get(this),i=n[e+"queue"],r=n[e+"queueHooks"],o=E.timers,s=i?i.length:0;for(n.finish=!0,E.queue(this,e,[]),r&&r.stop&&r.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;t<s;t++)i[t]&&i[t].finish&&i[t].finish.call(this);delete n.finish}))}}),E.each(["toggle","show","hide"],(function(e,t){var n=E.fn[t];E.fn[t]=function(e,i,r){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ft(t,!0),e,i,r)}})),E.each({slideDown:ft("show"),slideUp:ft("hide"),slideToggle:ft("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},(function(e,t){E.fn[e]=function(e,n,i){return this.animate(t,e,n,i)}})),E.timers=[],E.fx.tick=function(){var e,t=0,n=E.timers;for(it=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||E.fx.stop(),it=void 0},E.fx.timer=function(e){E.timers.push(e),E.fx.start()},E.fx.interval=13,E.fx.start=function(){rt||(rt=!0,ut())},E.fx.stop=function(){rt=null},E.fx.speeds={slow:600,fast:200,_default:400},E.fn.delay=function(t,n){return t=E.fx&&E.fx.speeds[t]||t,this.queue(n=n||"fx",(function(n,i){var r=e.setTimeout(n,t);i.stop=function(){e.clearTimeout(r)}}))},ot=i.createElement("input"),st=i.createElement("select").appendChild(i.createElement("option")),ot.type="checkbox",p.checkOn=""!==ot.value,p.optSelected=st.selected,(ot=i.createElement("input")).value="t",ot.type="radio",p.radioValue="t"===ot.value;var pt,mt=E.expr.attrHandle;E.fn.extend({attr:function(e,t){return U(this,E.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each((function(){E.removeAttr(this,e)}))}}),E.extend({attr:function(e,t,n){var i,r,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return void 0===e.getAttribute?E.prop(e,t,n):(1===o&&E.isXMLDoc(e)||(r=E.attrHooks[t.toLowerCase()]||(E.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void E.removeAttr(e,t):r&&"set"in r&&void 0!==(i=r.set(e,n,t))?i:(e.setAttribute(t,n+""),n):r&&"get"in r&&null!==(i=r.get(e,t))?i:null==(i=E.find.attr(e,t))?void 0:i)},attrHooks:{type:{set:function(e,t){if(!p.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,i=0,r=t&&t.match(M);if(r&&1===e.nodeType)for(;n=r[i++];)e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?E.removeAttr(e,n):e.setAttribute(n,n),n}},E.each(E.expr.match.bool.source.match(/\w+/g),(function(e,t){var n=mt[t]||E.find.attr;mt[t]=function(e,t,i){var r,o,s=t.toLowerCase();return i||(o=mt[s],mt[s]=r,r=null!=n(e,t,i)?s:null,mt[s]=o),r}}));var gt=/^(?:input|select|textarea|button)$/i,vt=/^(?:a|area)$/i;function yt(e){return(e.match(M)||[]).join(" ")}function _t(e){return e.getAttribute&&e.getAttribute("class")||""}function bt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(M)||[]}E.fn.extend({prop:function(e,t){return U(this,E.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each((function(){delete this[E.propFix[e]||e]}))}}),E.extend({prop:function(e,t,n){var i,r,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&E.isXMLDoc(e)||(r=E.propHooks[t=E.propFix[t]||t]),void 0!==n?r&&"set"in r&&void 0!==(i=r.set(e,n,t))?i:e[t]=n:r&&"get"in r&&null!==(i=r.get(e,t))?i:e[t]},propHooks:{tabIndex:{get:function(e){var t=E.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||vt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),p.optSelected||(E.propHooks.selected={get:function(e){return null},set:function(e){}}),E.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){E.propFix[this.toLowerCase()]=this})),E.fn.extend({addClass:function(e){var t,n,i,r,o,s,a,l=0;if(m(e))return this.each((function(t){E(this).addClass(e.call(this,t,_t(this)))}));if((t=bt(e)).length)for(;n=this[l++];)if(r=_t(n),i=1===n.nodeType&&" "+yt(r)+" "){for(s=0;o=t[s++];)i.indexOf(" "+o+" ")<0&&(i+=o+" ");r!==(a=yt(i))&&n.setAttribute("class",a)}return this},removeClass:function(e){var t,n,i,r,o,s,a,l=0;if(m(e))return this.each((function(t){E(this).removeClass(e.call(this,t,_t(this)))}));if(!arguments.length)return this.attr("class","");if((t=bt(e)).length)for(;n=this[l++];)if(r=_t(n),i=1===n.nodeType&&" "+yt(r)+" "){for(s=0;o=t[s++];)for(;-1<i.indexOf(" "+o+" ");)i=i.replace(" "+o+" "," ");r!==(a=yt(i))&&n.setAttribute("class",a)}return this},toggleClass:function(e,t){var n=typeof e,i="string"===n||Array.isArray(e);return"boolean"==typeof t&&i?t?this.addClass(e):this.removeClass(e):m(e)?this.each((function(n){E(this).toggleClass(e.call(this,n,_t(this),t),t)})):this.each((function(){var t,r,o,s;if(i)for(r=0,o=E(this),s=bt(e);t=s[r++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else void 0!==e&&"boolean"!==n||((t=_t(this))&&X.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":X.get(this,"__className__")||""))}))},hasClass:function(e){var t,n,i=0;for(t=" "+e+" ";n=this[i++];)if(1===n.nodeType&&-1<(" "+yt(_t(n))+" ").indexOf(t))return!0;return!1}});var Et=/\r/g;E.fn.extend({val:function(e){var t,n,i,r=this[0];return arguments.length?(i=m(e),this.each((function(n){var r;1===this.nodeType&&(null==(r=i?e.call(this,n,E(this).val()):e)?r="":"number"==typeof r?r+="":Array.isArray(r)&&(r=E.map(r,(function(e){return null==e?"":e+""}))),(t=E.valHooks[this.type]||E.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,r,"value")||(this.value=r))}))):r?(t=E.valHooks[r.type]||E.valHooks[r.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(r,"value"))?n:"string"==typeof(n=r.value)?n.replace(Et,""):null==n?"":n:void 0}}),E.extend({valHooks:{option:{get:function(e){var t=E.find.attr(e,"value");return null!=t?t:yt(E.text(e))}},select:{get:function(e){var t,n,i,r=e.options,o=e.selectedIndex,s="select-one"===e.type,a=s?null:[],l=s?o+1:r.length;for(i=o<0?l:s?o:0;i<l;i++)if(((n=r[i]).selected||i===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=E(n).val(),s)return t;a.push(t)}return a},set:function(e,t){for(var n,i,r=e.options,o=E.makeArray(t),s=r.length;s--;)((i=r[s]).selected=-1<E.inArray(E.valHooks.option.get(i),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),E.each(["radio","checkbox"],(function(){E.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<E.inArray(E(e).val(),t)}},p.checkOn||(E.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})})),p.focusin="onfocusin"in e;var Tt=/^(?:focusinfocus|focusoutblur)$/,wt=function(e){e.stopPropagation()};E.extend(E.event,{trigger:function(t,n,r,o){var s,a,l,u,c,d,h,p,v=[r||i],y=f.call(t,"type")?t.type:t,_=f.call(t,"namespace")?t.namespace.split("."):[];if(a=p=l=r=r||i,3!==r.nodeType&&8!==r.nodeType&&!Tt.test(y+E.event.triggered)&&(-1<y.indexOf(".")&&(y=(_=y.split(".")).shift(),_.sort()),c=y.indexOf(":")<0&&"on"+y,(t=t[E.expando]?t:new E.Event(y,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=_.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+_.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:E.makeArray(n,[t]),h=E.event.special[y]||{},o||!h.trigger||!1!==h.trigger.apply(r,n))){if(!o&&!h.noBubble&&!g(r)){for(Tt.test((u=h.delegateType||y)+y)||(a=a.parentNode);a;a=a.parentNode)v.push(a),l=a;l===(r.ownerDocument||i)&&v.push(l.defaultView||l.parentWindow||e)}for(s=0;(a=v[s++])&&!t.isPropagationStopped();)p=a,t.type=1<s?u:h.bindType||y,(d=(X.get(a,"events")||{})[t.type]&&X.get(a,"handle"))&&d.apply(a,n),(d=c&&a[c])&&d.apply&&z(a)&&(t.result=d.apply(a,n),!1===t.result&&t.preventDefault());return t.type=y,o||t.isDefaultPrevented()||h._default&&!1!==h._default.apply(v.pop(),n)||!z(r)||c&&m(r[y])&&!g(r)&&((l=r[c])&&(r[c]=null),E.event.triggered=y,t.isPropagationStopped()&&p.addEventListener(y,wt),r[y](),t.isPropagationStopped()&&p.removeEventListener(y,wt),E.event.triggered=void 0,l&&(r[c]=l)),t.result}},simulate:function(e,t,n){var i=E.extend(new E.Event,n,{type:e,isSimulated:!0});E.event.trigger(i,null,t)}}),E.fn.extend({trigger:function(e,t){return this.each((function(){E.event.trigger(e,t,this)}))},triggerHandler:function(e,t){var n=this[0];if(n)return E.event.trigger(e,t,n,!0)}}),p.focusin||E.each({focus:"focusin",blur:"focusout"},(function(e,t){var n=function(e){E.event.simulate(t,e.target,E.event.fix(e))};E.event.special[t]={setup:function(){var i=this.ownerDocument||this,r=X.access(i,t);r||i.addEventListener(e,n,!0),X.access(i,t,(r||0)+1)},teardown:function(){var i=this.ownerDocument||this,r=X.access(i,t)-1;r?X.access(i,t,r):(i.removeEventListener(e,n,!0),X.remove(i,t))}}}));var Ct=e.location,xt=Date.now(),St=/\?/;E.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(t){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||E.error("Invalid XML: "+t),n};var Dt=/\[\]$/,At=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,Lt=/^(?:input|select|textarea|keygen)/i;function Ot(e,t,n,i){var r;if(Array.isArray(t))E.each(t,(function(t,r){n||Dt.test(e)?i(e,r):Ot(e+"["+("object"==typeof r&&null!=r?t:"")+"]",r,n,i)}));else if(n||"object"!==_(t))i(e,t);else for(r in t)Ot(e+"["+r+"]",t[r],n,i)}E.param=function(e,t){var n,i=[],r=function(e,t){var n=m(t)?t():t;i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!E.isPlainObject(e))E.each(e,(function(){r(this.name,this.value)}));else for(n in e)Ot(n,e[n],t,r);return i.join("&")},E.fn.extend({serialize:function(){return E.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var e=E.prop(this,"elements");return e?E.makeArray(e):this})).filter((function(){var e=this.type;return this.name&&!E(this).is(":disabled")&&Lt.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!de.test(e))})).map((function(e,t){var n=E(this).val();return null==n?null:Array.isArray(n)?E.map(n,(function(e){return{name:t.name,value:e.replace(At,"\r\n")}})):{name:t.name,value:n.replace(At,"\r\n")}})).get()}});var It=/%20/g,kt=/#.*$/,Ht=/([?&])_=[^&]*/,jt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Mt=/^(?:GET|HEAD)$/,Pt=/^\/\//,qt={},Rt={},Ft="*/".concat("*"),Wt=i.createElement("a");function Bt(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var i,r=0,o=t.toLowerCase().match(M)||[];if(m(n))for(;i=o[r++];)"+"===i[0]?(i=i.slice(1)||"*",(e[i]=e[i]||[]).unshift(n)):(e[i]=e[i]||[]).push(n)}}function Ut(e,t,n,i){var r={},o=e===Rt;function s(a){var l;return r[a]=!0,E.each(e[a]||[],(function(e,a){var u=a(t,n,i);return"string"!=typeof u||o||r[u]?o?!(l=u):void 0:(t.dataTypes.unshift(u),s(u),!1)})),l}return s(t.dataTypes[0])||!r["*"]&&s("*")}function Vt(e,t){var n,i,r=E.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((r[n]?e:i||(i={}))[n]=t[n]);return i&&E.extend(!0,e,i),e}Wt.href=Ct.href,E.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ft,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":E.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Vt(Vt(e,E.ajaxSettings),t):Vt(E.ajaxSettings,e)},ajaxPrefilter:Bt(qt),ajaxTransport:Bt(Rt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0);var r,o,s,a,l,u,c,f,d,h,p=E.ajaxSetup({},n=n||{}),m=p.context||p,g=p.context&&(m.nodeType||m.jquery)?E(m):E.event,v=E.Deferred(),y=E.Callbacks("once memory"),_=p.statusCode||{},b={},T={},w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(c){if(!a)for(a={};t=jt.exec(s);)a[t[1].toLowerCase()+" "]=(a[t[1].toLowerCase()+" "]||[]).concat(t[2]);t=a[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return c?s:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)C.always(e[C.status]);else for(t in e)_[t]=[_[t],e[t]];return this},abort:function(e){var t=e||w;return r&&r.abort(t),x(0,t),this}};if(v.promise(C),p.url=((t||p.url||Ct.href)+"").replace(Pt,Ct.protocol+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=(p.dataType||"*").toLowerCase().match(M)||[""],null==p.crossDomain){u=i.createElement("a");try{u.href=p.url,u.href=u.href,p.crossDomain=Wt.protocol+"//"+Wt.host!=u.protocol+"//"+u.host}catch(t){p.crossDomain=!0}}if(p.data&&p.processData&&"string"!=typeof p.data&&(p.data=E.param(p.data,p.traditional)),Ut(qt,p,n,C),c)return C;for(d in(f=E.event&&p.global)&&0==E.active++&&E.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Mt.test(p.type),o=p.url.replace(kt,""),p.hasContent?p.data&&p.processData&&0===(p.contentType||"").indexOf("application/x-www-form-urlencoded")&&(p.data=p.data.replace(It,"+")):(h=p.url.slice(o.length),p.data&&(p.processData||"string"==typeof p.data)&&(o+=(St.test(o)?"&":"?")+p.data,delete p.data),!1===p.cache&&(o=o.replace(Ht,"$1"),h=(St.test(o)?"&":"?")+"_="+xt+++h),p.url=o+h),p.ifModified&&(E.lastModified[o]&&C.setRequestHeader("If-Modified-Since",E.lastModified[o]),E.etag[o]&&C.setRequestHeader("If-None-Match",E.etag[o])),(p.data&&p.hasContent&&!1!==p.contentType||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Ft+"; q=0.01":""):p.accepts["*"]),p.headers)C.setRequestHeader(d,p.headers[d]);if(p.beforeSend&&(!1===p.beforeSend.call(m,C,p)||c))return C.abort();if(w="abort",y.add(p.complete),C.done(p.success),C.fail(p.error),r=Ut(Rt,p,n,C)){if(C.readyState=1,f&&g.trigger("ajaxSend",[C,p]),c)return C;p.async&&0<p.timeout&&(l=e.setTimeout((function(){C.abort("timeout")}),p.timeout));try{c=!1,r.send(b,x)}catch(t){if(c)throw t;x(-1,t)}}else x(-1,"No Transport");function x(t,n,i,a){var u,d,h,b,T,w=n;c||(c=!0,l&&e.clearTimeout(l),r=void 0,s=a||"",C.readyState=0<t?4:0,u=200<=t&&t<300||304===t,i&&(b=function(e,t,n){for(var i,r,o,s,a=e.contents,l=e.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=e.mimeType||t.getResponseHeader("Content-Type"));if(i)for(r in a)if(a[r]&&a[r].test(i)){l.unshift(r);break}if(l[0]in n)o=l[0];else{for(r in n){if(!l[0]||e.converters[r+" "+l[0]]){o=r;break}s||(s=r)}o=o||s}if(o)return o!==l[0]&&l.unshift(o),n[o]}(p,C,i)),b=function(e,t,n,i){var r,o,s,a,l,u={},c=e.dataTypes.slice();if(c[1])for(s in e.converters)u[s.toLowerCase()]=e.converters[s];for(o=c.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&i&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(!(s=u[l+" "+o]||u["* "+o]))for(r in u)if((a=r.split(" "))[1]===o&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[r]:!0!==u[r]&&(o=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&e.throws)t=s(t);else try{t=s(t)}catch(e){return{state:"parsererror",error:s?e:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}(p,b,C,u),u?(p.ifModified&&((T=C.getResponseHeader("Last-Modified"))&&(E.lastModified[o]=T),(T=C.getResponseHeader("etag"))&&(E.etag[o]=T)),204===t||"HEAD"===p.type?w="nocontent":304===t?w="notmodified":(w=b.state,d=b.data,u=!(h=b.error))):(h=w,!t&&w||(w="error",t<0&&(t=0))),C.status=t,C.statusText=(n||w)+"",u?v.resolveWith(m,[d,w,C]):v.rejectWith(m,[C,w,h]),C.statusCode(_),_=void 0,f&&g.trigger(u?"ajaxSuccess":"ajaxError",[C,p,u?d:h]),y.fireWith(m,[C,w]),f&&(g.trigger("ajaxComplete",[C,p]),--E.active||E.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return E.get(e,t,n,"json")},getScript:function(e,t){return E.get(e,void 0,t,"script")}}),E.each(["get","post"],(function(e,t){E[t]=function(e,n,i,r){return m(n)&&(r=r||i,i=n,n=void 0),E.ajax(E.extend({url:e,type:t,dataType:r,data:n,success:i},E.isPlainObject(e)&&e))}})),E._evalUrl=function(e,t){return E.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){E.globalEval(e,t)}})},E.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=E(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map((function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e})).append(this)),this},wrapInner:function(e){return m(e)?this.each((function(t){E(this).wrapInner(e.call(this,t))})):this.each((function(){var t=E(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)}))},wrap:function(e){var t=m(e);return this.each((function(n){E(this).wrapAll(t?e.call(this,n):e)}))},unwrap:function(e){return this.parent(e).not("body").each((function(){E(this).replaceWith(this.childNodes)})),this}}),E.expr.pseudos.hidden=function(e){return!E.expr.pseudos.visible(e)},E.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},E.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(t){}};var Kt={0:200,1223:204},Qt=E.ajaxSettings.xhr();p.cors=!!Qt&&"withCredentials"in Qt,p.ajax=Qt=!!Qt,E.ajaxTransport((function(t){var n,i;if(p.cors||Qt&&!t.crossDomain)return{send:function(r,o){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||r["X-Requested-With"]||(r["X-Requested-With"]="XMLHttpRequest"),r)a.setRequestHeader(s,r[s]);n=function(e){return function(){n&&(n=i=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===e?a.abort():"error"===e?"number"!=typeof a.status?o(0,"error"):o(a.status,a.statusText):o(Kt[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=n(),i=a.onerror=a.ontimeout=n("error"),void 0!==a.onabort?a.onabort=i:a.onreadystatechange=function(){4===a.readyState&&e.setTimeout((function(){n&&i()}))},n=n("abort");try{a.send(t.hasContent&&t.data||null)}catch(r){if(n)throw r}},abort:function(){n&&n()}}})),E.ajaxPrefilter((function(e){e.crossDomain&&(e.contents.script=!1)})),E.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return E.globalEval(e),e}}}),E.ajaxPrefilter("script",(function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")})),E.ajaxTransport("script",(function(e){var t,n;if(e.crossDomain||e.scriptAttrs)return{send:function(r,o){t=E("<script>").attr(e.scriptAttrs||{}).prop({charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&o("error"===e.type?404:200,e.type)}),i.head.appendChild(t[0])},abort:function(){n&&n()}}}));var $t,zt=[],Yt=/(=)\?(?=&|$)|\?\?/;E.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||E.expando+"_"+xt++;return this[e]=!0,e}}),E.ajaxPrefilter("json jsonp",(function(t,n,i){var r,o,s,a=!1!==t.jsonp&&(Yt.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(t.data)&&"data");if(a||"jsonp"===t.dataTypes[0])return r=t.jsonpCallback=m(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(Yt,"$1"+r):!1!==t.jsonp&&(t.url+=(St.test(t.url)?"&":"?")+t.jsonp+"="+r),t.converters["script json"]=function(){return s||E.error(r+" was not called"),s[0]},t.dataTypes[0]="json",o=e[r],e[r]=function(){s=arguments},i.always((function(){void 0===o?E(e).removeProp(r):e[r]=o,t[r]&&(t.jsonpCallback=n.jsonpCallback,zt.push(r)),s&&m(o)&&o(s[0]),s=o=void 0})),"script"})),p.createHTMLDocument=(($t=i.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===$t.childNodes.length),E.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(p.createHTMLDocument?((r=(t=i.implementation.createHTMLDocument("")).createElement("base")).href=i.location.href,t.head.appendChild(r)):t=i),s=!n&&[],(o=N.exec(e))?[t.createElement(o[1])]:(o=Ee([e],t,s),s&&s.length&&E(s).remove(),E.merge([],o.childNodes)));var r,o,s},E.fn.load=function(e,t,n){var i,r,o,s=this,a=e.indexOf(" ");return-1<a&&(i=yt(e.slice(a)),e=e.slice(0,a)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(r="POST"),0<s.length&&E.ajax({url:e,type:r||"GET",dataType:"html",data:t}).done((function(e){o=arguments,s.html(i?E("<div>").append(E.parseHTML(e)).find(i):e)})).always(n&&function(e,t){s.each((function(){n.apply(this,o||[e.responseText,t,e])}))}),this},E.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],(function(e,t){E.fn[t]=function(e){return this.on(t,e)}})),E.expr.pseudos.animated=function(e){return E.grep(E.timers,(function(t){return e===t.elem})).length},E.offset={setOffset:function(e,t,n){var i,r,o,s,a,l,u=E.css(e,"position"),c=E(e),f={};"static"===u&&(e.style.position="relative"),a=c.offset(),o=E.css(e,"top"),l=E.css(e,"left"),("absolute"===u||"fixed"===u)&&-1<(o+l).indexOf("auto")?(s=(i=c.position()).top,r=i.left):(s=parseFloat(o)||0,r=parseFloat(l)||0),m(t)&&(t=t.call(e,n,E.extend({},a))),null!=t.top&&(f.top=t.top-a.top+s),null!=t.left&&(f.left=t.left-a.left+r),"using"in t?t.using.call(e,f):c.css(f)}},E.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each((function(t){E.offset.setOffset(this,e,t)}));var t,n,i=this[0];return i?i.getClientRects().length?{top:(t=i.getBoundingClientRect()).top+(n=i.ownerDocument.defaultView).pageYOffset,left:t.left+n.pageXOffset}:{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,i=this[0],r={top:0,left:0};if("fixed"===E.css(i,"position"))t=i.getBoundingClientRect();else{for(t=this.offset(),n=i.ownerDocument,e=i.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===E.css(e,"position");)e=e.parentNode;e&&e!==i&&1===e.nodeType&&((r=E(e).offset()).top+=E.css(e,"borderTopWidth",!0),r.left+=E.css(e,"borderLeftWidth",!0))}return{top:t.top-r.top-E.css(i,"marginTop",!0),left:t.left-r.left-E.css(i,"marginLeft",!0)}}},offsetParent:function(){return this.map((function(){for(var e=this.offsetParent;e&&"static"===E.css(e,"position");)e=e.offsetParent;return e||re}))}}),E.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},(function(e,t){var n="pageYOffset"===t;E.fn[e]=function(i){return U(this,(function(e,i,r){var o;if(g(e)?o=e:9===e.nodeType&&(o=e.defaultView),void 0===r)return o?o[t]:e[i];o?o.scrollTo(n?o.pageXOffset:r,n?r:o.pageYOffset):e[i]=r}),e,i,arguments.length)}})),E.each(["top","left"],(function(e,t){E.cssHooks[t]=Ve(p.pixelPosition,(function(e,n){if(n)return n=Ue(e,t),Fe.test(n)?E(e).position()[t]+"px":n}))})),E.each({Height:"height",Width:"width"},(function(e,t){E.each({padding:"inner"+e,content:t,"":"outer"+e},(function(n,i){E.fn[i]=function(r,o){var s=arguments.length&&(n||"boolean"!=typeof r),a=n||(!0===r||!0===o?"margin":"border");return U(this,(function(t,n,r){var o;return g(t)?0===i.indexOf("outer")?t["inner"+e]:t.document.documentElement["client"+e]:9===t.nodeType?(o=t.documentElement,Math.max(t.body["scroll"+e],o["scroll"+e],t.body["offset"+e],o["offset"+e],o["client"+e])):void 0===r?E.css(t,n,a):E.style(t,n,r,a)}),t,s?r:void 0,s)}}))})),E.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),(function(e,t){E.fn[t]=function(e,n){return 0<arguments.length?this.on(t,null,e,n):this.trigger(t)}})),E.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),E.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,i){return this.on(t,e,n,i)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),E.proxy=function(e,t){var n,i,r;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return i=o.call(arguments,2),(r=function(){return e.apply(t||this,i.concat(o.call(arguments)))}).guid=e.guid=e.guid||E.guid++,r},E.holdReady=function(e){e?E.readyWait++:E.ready(!0)},E.isArray=Array.isArray,E.parseJSON=JSON.parse,E.nodeName=A,E.isFunction=m,E.isWindow=g,E.camelCase=$,E.type=_,E.now=Date.now,E.isNumeric=function(e){var t=E.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},"function"==typeof define&&define.amd&&define("jquery",[],(function(){return E}));var Xt=e.jQuery,Gt=e.$;return E.noConflict=function(t){return e.$===E&&(e.$=Gt),t&&e.jQuery===E&&(e.jQuery=Xt),E},t||(e.jQuery=e.$=E),E})),function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Popper=t()}(this,(function(){"use strict";function e(e){return e&&"[object Function]"==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var n=e.ownerDocument.defaultView.getComputedStyle(e,null);return t?n[t]:n}function n(e){return"HTML"===e.nodeName?e:e.parentNode||e.host}function i(e){if(!e)return document.body;switch(e.nodeName){case"HTML":case"BODY":return e.ownerDocument.body;case"#document":return e.body}var r=t(e);return/(auto|scroll|overlay)/.test(r.overflow+r.overflowY+r.overflowX)?e:i(n(e))}function r(e){return e&&e.referenceNode?e.referenceNode:e}function o(e){return 11===e?$:10===e?z:$||z}function s(e){if(!e)return document.documentElement;for(var n=o(10)?document.body:null,i=e.offsetParent||null;i===n&&e.nextElementSibling;)i=(e=e.nextElementSibling).offsetParent;var r=i&&i.nodeName;return r&&"BODY"!==r&&"HTML"!==r?-1!==["TH","TD","TABLE"].indexOf(i.nodeName)&&"static"===t(i,"position")?s(i):i:e?e.ownerDocument.documentElement:document.documentElement}function a(e){return null===e.parentNode?e:a(e.parentNode)}function l(e,t){if(!(e&&e.nodeType&&t&&t.nodeType))return document.documentElement;var n=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,i=n?e:t,r=n?t:e,o=document.createRange();o.setStart(i,0),o.setEnd(r,0);var u=o.commonAncestorContainer;if(e!==u&&t!==u||i.contains(r))return function(e){var t=e.nodeName;return"BODY"!==t&&("HTML"===t||s(e.firstElementChild)===e)}(u)?u:s(u);var c=a(e);return c.host?l(c.host,t):l(e,a(t).host)}function u(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:"top",n="top"===t?"scrollTop":"scrollLeft",i=e.nodeName;if("BODY"===i||"HTML"===i){var r=e.ownerDocument.documentElement,o=e.ownerDocument.scrollingElement||r;return o[n]}return e[n]}function c(e,t){var n=2<arguments.length&&void 0!==arguments[2]&&arguments[2],i=u(t,"top"),r=u(t,"left"),o=n?-1:1;return e.top+=i*o,e.bottom+=i*o,e.left+=r*o,e.right+=r*o,e}function f(e,t){var n="x"===t?"Left":"Top",i="Left"==n?"Right":"Bottom";return parseFloat(e["border"+n+"Width"])+parseFloat(e["border"+i+"Width"])}function d(e,t,n,i){return U(t["offset"+e],t["scroll"+e],n["client"+e],n["offset"+e],n["scroll"+e],o(10)?parseInt(n["offset"+e])+parseInt(i["margin"+("Height"===e?"Top":"Left")])+parseInt(i["margin"+("Height"===e?"Bottom":"Right")]):0)}function h(e){var t=e.body,n=e.documentElement,i=o(10)&&getComputedStyle(n);return{height:d("Height",t,n,i),width:d("Width",t,n,i)}}function p(e){return J({},e,{right:e.left+e.width,bottom:e.top+e.height})}function m(e){var n={};try{if(o(10)){n=e.getBoundingClientRect();var i=u(e,"top"),r=u(e,"left");n.top+=i,n.left+=r,n.bottom+=i,n.right+=r}else n=e.getBoundingClientRect()}catch(t){}var s={left:n.left,top:n.top,width:n.right-n.left,height:n.bottom-n.top},a="HTML"===e.nodeName?h(e.ownerDocument):{},l=e.offsetWidth-(a.width||e.clientWidth||s.width),c=e.offsetHeight-(a.height||e.clientHeight||s.height);if(l||c){var d=t(e);l-=f(d,"x"),c-=f(d,"y"),s.width-=l,s.height-=c}return p(s)}function g(e,n){var r=2<arguments.length&&void 0!==arguments[2]&&arguments[2],s=o(10),a="HTML"===n.nodeName,l=m(e),u=m(n),f=i(e),d=t(n),h=parseFloat(d.borderTopWidth),g=parseFloat(d.borderLeftWidth);r&&a&&(u.top=U(u.top,0),u.left=U(u.left,0));var v=p({top:l.top-u.top-h,left:l.left-u.left-g,width:l.width,height:l.height});if(v.marginTop=0,v.marginLeft=0,!s&&a){var y=parseFloat(d.marginTop),_=parseFloat(d.marginLeft);v.top-=h-y,v.bottom-=h-y,v.left-=g-_,v.right-=g-_,v.marginTop=y,v.marginLeft=_}return(s&&!r?n.contains(f):n===f&&"BODY"!==f.nodeName)&&(v=c(v,n)),v}function v(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1],n=e.ownerDocument.documentElement,i=g(e,n),r=U(n.clientWidth,window.innerWidth||0),o=U(n.clientHeight,window.innerHeight||0),s=t?0:u(n),a=t?0:u(n,"left"),l={top:s-i.top+i.marginTop,left:a-i.left+i.marginLeft,width:r,height:o};return p(l)}function y(e){var i=e.nodeName;if("BODY"===i||"HTML"===i)return!1;if("fixed"===t(e,"position"))return!0;var r=n(e);return!!r&&y(r)}function _(e){if(!e||!e.parentElement||o())return document.documentElement;for(var n=e.parentElement;n&&"none"===t(n,"transform");)n=n.parentElement;return n||document.documentElement}function b(e,t,o,s){var a=4<arguments.length&&void 0!==arguments[4]&&arguments[4],u={top:0,left:0},c=a?_(e):l(e,r(t));if("viewport"===s)u=v(c,a);else{var f;"scrollParent"===s?"BODY"===(f=i(n(t))).nodeName&&(f=e.ownerDocument.documentElement):f="window"===s?e.ownerDocument.documentElement:s;var d=g(f,c,a);if("HTML"!==f.nodeName||y(c))u=d;else{var p=h(e.ownerDocument),m=p.height,b=p.width;u.top+=d.top-d.marginTop,u.bottom=m+d.top,u.left+=d.left-d.marginLeft,u.right=b+d.left}}var E="number"==typeof(o=o||0);return u.left+=E?o:o.left||0,u.top+=E?o:o.top||0,u.right-=E?o:o.right||0,u.bottom-=E?o:o.bottom||0,u}function E(e){return e.width*e.height}function T(e,t,n,i,r){var o=5<arguments.length&&void 0!==arguments[5]?arguments[5]:0;if(-1===e.indexOf("auto"))return e;var s=b(n,i,o,r),a={top:{width:s.width,height:t.top-s.top},right:{width:s.right-t.right,height:s.height},bottom:{width:s.width,height:s.bottom-t.bottom},left:{width:t.left-s.left,height:s.height}},l=Object.keys(a).map((function(e){return J({key:e},a[e],{area:E(a[e])})})).sort((function(e,t){return t.area-e.area})),u=l.filter((function(e){return e.width>=n.clientWidth&&e.height>=n.clientHeight})),c=0<u.length?u[0].key:l[0].key,f=e.split("-")[1];return c+(f?"-"+f:"")}function w(e,t,n){var i=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null,o=i?_(t):l(t,r(n));return g(n,o,i)}function C(e){var t=e.ownerDocument.defaultView.getComputedStyle(e),n=parseFloat(t.marginTop||0)+parseFloat(t.marginBottom||0),i=parseFloat(t.marginLeft||0)+parseFloat(t.marginRight||0);return{width:e.offsetWidth+i,height:e.offsetHeight+n}}function x(e){var t={left:"right",right:"left",bottom:"top",top:"bottom"};return e.replace(/left|right|bottom|top/g,(function(e){return t[e]}))}function S(e,t,n){n=n.split("-")[0];var i=C(e),r={width:i.width,height:i.height},o=-1!==["right","left"].indexOf(n),s=o?"top":"left",a=o?"left":"top",l=o?"height":"width",u=o?"width":"height";return r[s]=t[s]+t[l]/2-i[l]/2,r[a]=n===a?t[a]-i[u]:t[x(a)],r}function D(e,t){return Array.prototype.find?e.find(t):e.filter(t)[0]}function A(t,n,i){return(void 0===i?t:t.slice(0,function(e,t,n){if(Array.prototype.findIndex)return e.findIndex((function(e){return e[t]===n}));var i=D(e,(function(e){return e[t]===n}));return e.indexOf(i)}(t,"name",i))).forEach((function(t){t.function&&console.warn("`modifier.function` is deprecated, use `modifier.fn`!");var i=t.function||t.fn;t.enabled&&e(i)&&(n.offsets.popper=p(n.offsets.popper),n.offsets.reference=p(n.offsets.reference),n=i(n,t))})),n}function N(){if(!this.state.isDestroyed){var e={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};e.offsets.reference=w(this.state,this.popper,this.reference,this.options.positionFixed),e.placement=T(this.options.placement,e.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),e.originalPlacement=e.placement,e.positionFixed=this.options.positionFixed,e.offsets.popper=S(this.popper,e.offsets.reference,e.placement),e.offsets.popper.position=this.options.positionFixed?"fixed":"absolute",e=A(this.modifiers,e),this.state.isCreated?this.options.onUpdate(e):(this.state.isCreated=!0,this.options.onCreate(e))}}function L(e,t){return e.some((function(e){return e.enabled&&e.name===t}))}function O(e){for(var t=[!1,"ms","Webkit","Moz","O"],n=e.charAt(0).toUpperCase()+e.slice(1),i=0;i<t.length;i++){var r=t[i],o=r?""+r+n:e;if(void 0!==document.body.style[o])return o}return null}function I(){return this.state.isDestroyed=!0,L(this.modifiers,"applyStyle")&&(this.popper.removeAttribute("x-placement"),this.popper.style.position="",this.popper.style.top="",this.popper.style.left="",this.popper.style.right="",this.popper.style.bottom="",this.popper.style.willChange="",this.popper.style[O("transform")]=""),this.disableEventListeners(),this.options.removeOnDestroy&&this.popper.parentNode.removeChild(this.popper),this}function k(e){var t=e.ownerDocument;return t?t.defaultView:window}function H(){this.state.eventsEnabled||(this.state=function(e,t,n,r){n.updateBound=r,k(e).addEventListener("resize",n.updateBound,{passive:!0});var o=i(e);return function e(t,n,r,o){var s="BODY"===t.nodeName,a=s?t.ownerDocument.defaultView:t;a.addEventListener(n,r,{passive:!0}),s||e(i(a.parentNode),n,r,o),o.push(a)}(o,"scroll",n.updateBound,n.scrollParents),n.scrollElement=o,n.eventsEnabled=!0,n}(this.reference,0,this.state,this.scheduleUpdate))}function j(){this.state.eventsEnabled&&(cancelAnimationFrame(this.scheduleUpdate),this.state=function(e,t){return k(e).removeEventListener("resize",t.updateBound),t.scrollParents.forEach((function(e){e.removeEventListener("scroll",t.updateBound)})),t.updateBound=null,t.scrollParents=[],t.scrollElement=null,t.eventsEnabled=!1,t}(this.reference,this.state))}function M(e){return""!==e&&!isNaN(parseFloat(e))&&isFinite(e)}function P(e,t){Object.keys(t).forEach((function(n){var i="";-1!==["width","height","top","right","bottom","left"].indexOf(n)&&M(t[n])&&(i="px"),e.style[n]=t[n]+i}))}function q(e,t,n){var i=D(e,(function(e){return e.name===t})),r=!!i&&e.some((function(e){return e.name===n&&e.enabled&&e.order<i.order}));if(!r){var o="`"+t+"`";console.warn("`"+n+"` modifier is required by "+o+" modifier in order to work, be sure to include it before "+o+"!")}return r}function R(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1],n=te.indexOf(e),i=te.slice(n+1).concat(te.slice(0,n));return t?i.reverse():i}var F=Math.min,W=Math.floor,B=Math.round,U=Math.max,V="undefined"!=typeof window&&"undefined"!=typeof document&&"undefined"!=typeof navigator,K=function(){for(var e=["Edge","Trident","Firefox"],t=0;t<e.length;t+=1)if(V&&0<=navigator.userAgent.indexOf(e[t]))return 1;return 0}(),Q=V&&window.Promise?function(e){var t=!1;return function(){t||(t=!0,window.Promise.resolve().then((function(){t=!1,e()})))}}:function(e){var t=!1;return function(){t||(t=!0,setTimeout((function(){t=!1,e()}),K))}},$=V&&!(!window.MSInputMethodContext||!document.documentMode),z=V&&/MSIE 10/.test(navigator.userAgent),Y=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},X=function(){function e(e,t){for(var n,i=0;i<t.length;i++)(n=t[i]).enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}return function(t,n,i){return n&&e(t.prototype,n),i&&e(t,i),t}}(),G=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e},J=Object.assign||function(e){for(var t,n=1;n<arguments.length;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e},Z=V&&/Firefox/i.test(navigator.userAgent),ee=["auto-start","auto","auto-end","top-start","top","top-end","right-start","right","right-end","bottom-end","bottom","bottom-start","left-end","left","left-start"],te=ee.slice(3),ne=function(){function t(n,i){var r=this,o=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};Y(this,t),this.scheduleUpdate=function(){return requestAnimationFrame(r.update)},this.update=Q(this.update.bind(this)),this.options=J({},t.Defaults,o),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=n&&n.jquery?n[0]:n,this.popper=i&&i.jquery?i[0]:i,this.options.modifiers={},Object.keys(J({},t.Defaults.modifiers,o.modifiers)).forEach((function(e){r.options.modifiers[e]=J({},t.Defaults.modifiers[e]||{},o.modifiers?o.modifiers[e]:{})})),this.modifiers=Object.keys(this.options.modifiers).map((function(e){return J({name:e},r.options.modifiers[e])})).sort((function(e,t){return e.order-t.order})),this.modifiers.forEach((function(t){t.enabled&&e(t.onLoad)&&t.onLoad(r.reference,r.popper,r.options,t,r.state)})),this.update();var s=this.options.eventsEnabled;s&&this.enableEventListeners(),this.state.eventsEnabled=s}return X(t,[{key:"update",value:function(){return N.call(this)}},{key:"destroy",value:function(){return I.call(this)}},{key:"enableEventListeners",value:function(){return H.call(this)}},{key:"disableEventListeners",value:function(){return j.call(this)}}]),t}();return ne.Utils=("undefined"==typeof window?global:window).PopperUtils,ne.placements=ee,ne.Defaults={placement:"bottom",positionFixed:!1,eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(e){var t=e.placement,n=t.split("-")[0],i=t.split("-")[1];if(i){var r=e.offsets,o=r.reference,s=r.popper,a=-1!==["bottom","top"].indexOf(n),l=a?"left":"top",u=a?"width":"height",c={start:G({},l,o[l]),end:G({},l,o[l]+o[u]-s[u])};e.offsets.popper=J({},s,c[i])}return e}},offset:{order:200,enabled:!0,fn:function(e,t){var n,i=t.offset,r=e.offsets,o=r.popper,s=r.reference,a=e.placement.split("-")[0];return n=M(+i)?[+i,0]:function(e,t,n,i){var r=[0,0],o=-1!==["right","left"].indexOf(i),s=e.split(/(\+|\-)/).map((function(e){return e.trim()})),a=s.indexOf(D(s,(function(e){return-1!==e.search(/,|\s/)})));s[a]&&-1===s[a].indexOf(",")&&console.warn("Offsets separated by white space(s) are deprecated, use a comma (,) instead.");var l=/\s*,\s*|\s+/,u=-1===a?[s]:[s.slice(0,a).concat([s[a].split(l)[0]]),[s[a].split(l)[1]].concat(s.slice(a+1))];return(u=u.map((function(e,i){var r=(1===i?!o:o)?"height":"width",s=!1;return e.reduce((function(e,t){return""===e[e.length-1]&&-1!==["+","-"].indexOf(t)?(e[e.length-1]=t,s=!0,e):s?(e[e.length-1]+=t,s=!1,e):e.concat(t)}),[]).map((function(e){return function(e,t,n,i){var r=e.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),o=+r[1],s=r[2];if(!o)return e;if(0===s.indexOf("%")){var a;switch(s){case"%p":a=n;break;case"%":case"%r":default:a=i}return p(a)[t]/100*o}return"vh"===s||"vw"===s?("vh"===s?U(document.documentElement.clientHeight,window.innerHeight||0):U(document.documentElement.clientWidth,window.innerWidth||0))/100*o:o}(e,r,t,n)}))}))).forEach((function(e,t){e.forEach((function(n,i){M(n)&&(r[t]+=n*("-"===e[i-1]?-1:1))}))})),r}(i,o,s,a),"left"===a?(o.top+=n[0],o.left-=n[1]):"right"===a?(o.top+=n[0],o.left+=n[1]):"top"===a?(o.left+=n[0],o.top-=n[1]):"bottom"===a&&(o.left+=n[0],o.top+=n[1]),e.popper=o,e},offset:0},preventOverflow:{order:300,enabled:!0,fn:function(e,t){var n=t.boundariesElement||s(e.instance.popper);e.instance.reference===n&&(n=s(n));var i=O("transform"),r=e.instance.popper.style,o=r.top,a=r.left,l=r[i];r.top="",r.left="",r[i]="";var u=b(e.instance.popper,e.instance.reference,t.padding,n,e.positionFixed);r.top=o,r.left=a,r[i]=l,t.boundaries=u;var c=e.offsets.popper,f={primary:function(e){var n=c[e];return c[e]<u[e]&&!t.escapeWithReference&&(n=U(c[e],u[e])),G({},e,n)},secondary:function(e){var n="right"===e?"left":"top",i=c[n];return c[e]>u[e]&&!t.escapeWithReference&&(i=F(c[n],u[e]-("right"===e?c.width:c.height))),G({},n,i)}};return t.priority.forEach((function(e){var t=-1===["left","top"].indexOf(e)?"secondary":"primary";c=J({},c,f[t](e))})),e.offsets.popper=c,e},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,n=t.popper,i=t.reference,r=e.placement.split("-")[0],o=W,s=-1!==["top","bottom"].indexOf(r),a=s?"right":"bottom",l=s?"left":"top",u=s?"width":"height";return n[a]<o(i[l])&&(e.offsets.popper[l]=o(i[l])-n[u]),n[l]>o(i[a])&&(e.offsets.popper[l]=o(i[a])),e}},arrow:{order:500,enabled:!0,fn:function(e,n){var i;if(!q(e.instance.modifiers,"arrow","keepTogether"))return e;var r=n.element;if("string"==typeof r){if(!(r=e.instance.popper.querySelector(r)))return e}else if(!e.instance.popper.contains(r))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),e;var o=e.placement.split("-")[0],s=e.offsets,a=s.popper,l=s.reference,u=-1!==["left","right"].indexOf(o),c=u?"height":"width",f=u?"Top":"Left",d=f.toLowerCase(),h=u?"left":"top",m=u?"bottom":"right",g=C(r)[c];l[m]-g<a[d]&&(e.offsets.popper[d]-=a[d]-(l[m]-g)),l[d]+g>a[m]&&(e.offsets.popper[d]+=l[d]+g-a[m]),e.offsets.popper=p(e.offsets.popper);var v=l[d]+l[c]/2-g/2,y=t(e.instance.popper),_=parseFloat(y["margin"+f]),b=parseFloat(y["border"+f+"Width"]),E=v-e.offsets.popper[d]-_-b;return E=U(F(a[c]-g,E),0),e.arrowElement=r,e.offsets.arrow=(G(i={},d,B(E)),G(i,h,""),i),e},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(e,t){if(L(e.instance.modifiers,"inner"))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var n=b(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),i=e.placement.split("-")[0],r=x(i),o=e.placement.split("-")[1]||"",s=[];switch(t.behavior){case"flip":s=[i,r];break;case"clockwise":s=R(i);break;case"counterclockwise":s=R(i,!0);break;default:s=t.behavior}return s.forEach((function(a,l){if(i!==a||s.length===l+1)return e;i=e.placement.split("-")[0],r=x(i);var u=e.offsets.popper,c=e.offsets.reference,f=W,d="left"===i&&f(u.right)>f(c.left)||"right"===i&&f(u.left)<f(c.right)||"top"===i&&f(u.bottom)>f(c.top)||"bottom"===i&&f(u.top)<f(c.bottom),h=f(u.left)<f(n.left),p=f(u.right)>f(n.right),m=f(u.top)<f(n.top),g=f(u.bottom)>f(n.bottom),v="left"===i&&h||"right"===i&&p||"top"===i&&m||"bottom"===i&&g,y=-1!==["top","bottom"].indexOf(i),_=!!t.flipVariations&&(y&&"start"===o&&h||y&&"end"===o&&p||!y&&"start"===o&&m||!y&&"end"===o&&g)||!!t.flipVariationsByContent&&(y&&"start"===o&&p||y&&"end"===o&&h||!y&&"start"===o&&g||!y&&"end"===o&&m);(d||v||_)&&(e.flipped=!0,(d||v)&&(i=s[l+1]),_&&(o=function(e){return"end"===e?"start":"start"===e?"end":e}(o)),e.placement=i+(o?"-"+o:""),e.offsets.popper=J({},e.offsets.popper,S(e.instance.popper,e.offsets.reference,e.placement)),e=A(e.instance.modifiers,e,"flip"))})),e},behavior:"flip",padding:5,boundariesElement:"viewport",flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,n=t.split("-")[0],i=e.offsets,r=i.popper,o=i.reference,s=-1!==["left","right"].indexOf(n),a=-1===["top","left"].indexOf(n);return r[s?"left":"top"]=o[n]-(a?r[s?"width":"height"]:0),e.placement=x(t),e.offsets.popper=p(r),e}},hide:{order:800,enabled:!0,fn:function(e){if(!q(e.instance.modifiers,"hide","preventOverflow"))return e;var t=e.offsets.reference,n=D(e.instance.modifiers,(function(e){return"preventOverflow"===e.name})).boundaries;if(t.bottom<n.top||t.left>n.right||t.top>n.bottom||t.right<n.left){if(!0===e.hide)return e;e.hide=!0,e.attributes["x-out-of-boundaries"]=""}else{if(!1===e.hide)return e;e.hide=!1,e.attributes["x-out-of-boundaries"]=!1}return e}},computeStyle:{order:850,enabled:!0,fn:function(e,t){var n=t.x,i=t.y,r=e.offsets.popper,o=D(e.instance.modifiers,(function(e){return"applyStyle"===e.name})).gpuAcceleration;void 0!==o&&console.warn("WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!");var a,l,u=void 0===o?t.gpuAcceleration:o,c=s(e.instance.popper),f=m(c),d={position:r.position},h=function(e,t){var n=e.offsets,i=n.popper,r=B,o=function(e){return e},s=r(n.reference.width),a=r(i.width),l=-1!==["left","right"].indexOf(e.placement),u=-1!==e.placement.indexOf("-"),c=t?l||u||s%2==a%2?r:W:o,f=t?r:o;return{left:c(1==s%2&&1==a%2&&!u&&t?i.left-1:i.left),top:f(i.top),bottom:f(i.bottom),right:c(i.right)}}(e,2>window.devicePixelRatio||!Z),p="bottom"===n?"top":"bottom",g="right"===i?"left":"right",v=O("transform");if(l="bottom"==p?"HTML"===c.nodeName?-c.clientHeight+h.bottom:-f.height+h.bottom:h.top,a="right"==g?"HTML"===c.nodeName?-c.clientWidth+h.right:-f.width+h.right:h.left,u&&v)d[v]="translate3d("+a+"px, "+l+"px, 0)",d[p]=0,d[g]=0,d.willChange="transform";else{var y="right"==g?-1:1;d[p]=l*("bottom"==p?-1:1),d[g]=a*y,d.willChange=p+", "+g}return e.attributes=J({},{"x-placement":e.placement},e.attributes),e.styles=J({},d,e.styles),e.arrowStyles=J({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:"bottom",y:"right"},applyStyle:{order:900,enabled:!0,fn:function(e){return P(e.instance.popper,e.styles),function(e,t){Object.keys(t).forEach((function(n){!1===t[n]?e.removeAttribute(n):e.setAttribute(n,t[n])}))}(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&P(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,n,i,r){var o=w(r,t,e,n.positionFixed),s=T(n.placement,o,t,e,n.modifiers.flip.boundariesElement,n.modifiers.flip.padding);return t.setAttribute("x-placement",s),P(t,{position:n.positionFixed?"fixed":"absolute"}),n},gpuAcceleration:void 0}}},ne})),function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],t):t((e=e||self).bootstrap={},e.jQuery,e.Popper)}(this,(function(e,t,n){"use strict";function i(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function r(e,t,n){return t&&i(e.prototype,t),n&&i(e,n),e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){var i,r,o;o=n[r=t],r in(i=e)?Object.defineProperty(i,r,{value:o,enumerable:!0,configurable:!0,writable:!0}):i[r]=o})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}t=t&&t.hasOwnProperty("default")?t.default:t,n=n&&n.hasOwnProperty("default")?n.default:n;var a="transitionend",l={TRANSITION_END:"bsTransitionEnd",getUID:function(e){for(;e+=~~(1e6*Math.random()),document.getElementById(e););return e},getSelectorFromElement:function(e){var t=e.getAttribute("data-target");if(!t||"#"===t){var n=e.getAttribute("href");t=n&&"#"!==n?n.trim():""}try{return document.querySelector(t)?t:null}catch(e){return null}},getTransitionDurationFromElement:function(e){if(!e)return 0;var n=t(e).css("transition-duration"),i=t(e).css("transition-delay"),r=parseFloat(n),o=parseFloat(i);return r||o?(n=n.split(",")[0],i=i.split(",")[0],1e3*(parseFloat(n)+parseFloat(i))):0},reflow:function(e){return e.offsetHeight},triggerTransitionEnd:function(e){t(e).trigger(a)},supportsTransitionEnd:function(){return Boolean(a)},isElement:function(e){return(e[0]||e).nodeType},typeCheckConfig:function(e,t,n){for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)){var r=n[i],o=t[i],s=o&&l.isElement(o)?"element":{}.toString.call(o).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(r).test(s))throw new Error(e.toUpperCase()+': Option "'+i+'" provided type "'+s+'" but expected type "'+r+'".')}},findShadowRoot:function(e){if(!document.documentElement.attachShadow)return null;if("function"!=typeof e.getRootNode)return e instanceof ShadowRoot?e:e.parentNode?l.findShadowRoot(e.parentNode):null;var t=e.getRootNode();return t instanceof ShadowRoot?t:null},jQueryDetection:function(){if(void 0===t)throw new TypeError("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var e=t.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1===e[0]&&9===e[1]&&e[2]<1||4<=e[0])throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}};l.jQueryDetection(),t.fn.emulateTransitionEnd=function(e){var n=this,i=!1;return t(this).one(l.TRANSITION_END,(function(){i=!0})),setTimeout((function(){i||l.triggerTransitionEnd(n)}),e),this},t.event.special[l.TRANSITION_END]={bindType:a,delegateType:a,handle:function(e){if(t(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}};var u="alert",c="bs.alert",f="."+c,d=t.fn[u],h={CLOSE:"close"+f,CLOSED:"closed"+f,CLICK_DATA_API:"click"+f+".data-api"},p=function(){function e(e){this._element=e}var n=e.prototype;return n.close=function(e){var t=this._element;e&&(t=this._getRootElement(e)),this._triggerCloseEvent(t).isDefaultPrevented()||this._removeElement(t)},n.dispose=function(){t.removeData(this._element,c),this._element=null},n._getRootElement=function(e){var n=l.getSelectorFromElement(e),i=!1;return n&&(i=document.querySelector(n)),i||t(e).closest(".alert")[0]},n._triggerCloseEvent=function(e){var n=t.Event(h.CLOSE);return t(e).trigger(n),n},n._removeElement=function(e){var n=this;if(t(e).removeClass("show"),t(e).hasClass("fade")){var i=l.getTransitionDurationFromElement(e);t(e).one(l.TRANSITION_END,(function(t){return n._destroyElement(e,t)})).emulateTransitionEnd(i)}else this._destroyElement(e)},n._destroyElement=function(e){t(e).detach().trigger(h.CLOSED).remove()},e._jQueryInterface=function(n){return this.each((function(){var i=t(this),r=i.data(c);r||(r=new e(this),i.data(c,r)),"close"===n&&r[n](this)}))},e._handleDismiss=function(e){return function(t){t&&t.preventDefault(),e.close(this)}},r(e,null,[{key:"VERSION",get:function(){return"4.4.1"}}]),e}();t(document).on(h.CLICK_DATA_API,'[data-dismiss="alert"]',p._handleDismiss(new p)),t.fn[u]=p._jQueryInterface,t.fn[u].Constructor=p,t.fn[u].noConflict=function(){return t.fn[u]=d,p._jQueryInterface};var m="button",g="bs.button",v="."+g,y=".data-api",_=t.fn[m],b="active",E='[data-toggle^="button"]',T='input:not([type="hidden"])',w=".btn",C={CLICK_DATA_API:"click"+v+y,FOCUS_BLUR_DATA_API:"focus"+v+y+" blur"+v+y,LOAD_DATA_API:"load"+v+y},x=function(){function e(e){this._element=e}var n=e.prototype;return n.toggle=function(){var e=!0,n=!0,i=t(this._element).closest('[data-toggle="buttons"]')[0];if(i){var r=this._element.querySelector(T);if(r){if("radio"===r.type)if(r.checked&&this._element.classList.contains(b))e=!1;else{var o=i.querySelector(".active");o&&t(o).removeClass(b)}else"checkbox"===r.type?"LABEL"===this._element.tagName&&r.checked===this._element.classList.contains(b)&&(e=!1):e=!1;e&&(r.checked=!this._element.classList.contains(b),t(r).trigger("change")),r.focus(),n=!1}}this._element.hasAttribute("disabled")||this._element.classList.contains("disabled")||(n&&this._element.setAttribute("aria-pressed",!this._element.classList.contains(b)),e&&t(this._element).toggleClass(b))},n.dispose=function(){t.removeData(this._element,g),this._element=null},e._jQueryInterface=function(n){return this.each((function(){var i=t(this).data(g);i||(i=new e(this),t(this).data(g,i)),"toggle"===n&&i[n]()}))},r(e,null,[{key:"VERSION",get:function(){return"4.4.1"}}]),e}();t(document).on(C.CLICK_DATA_API,E,(function(e){var n=e.target;if(t(n).hasClass("btn")||(n=t(n).closest(w)[0]),!n||n.hasAttribute("disabled")||n.classList.contains("disabled"))e.preventDefault();else{var i=n.querySelector(T);if(i&&(i.hasAttribute("disabled")||i.classList.contains("disabled")))return void e.preventDefault();x._jQueryInterface.call(t(n),"toggle")}})).on(C.FOCUS_BLUR_DATA_API,E,(function(e){var n=t(e.target).closest(w)[0];t(n).toggleClass("focus",/^focus(in)?$/.test(e.type))})),t(window).on(C.LOAD_DATA_API,(function(){for(var e=[].slice.call(document.querySelectorAll('[data-toggle="buttons"] .btn')),t=0,n=e.length;t<n;t++){var i=e[t],r=i.querySelector(T);r.checked||r.hasAttribute("checked")?i.classList.add(b):i.classList.remove(b)}for(var o=0,s=(e=[].slice.call(document.querySelectorAll('[data-toggle="button"]'))).length;o<s;o++){var a=e[o];"true"===a.getAttribute("aria-pressed")?a.classList.add(b):a.classList.remove(b)}})),t.fn[m]=x._jQueryInterface,t.fn[m].Constructor=x,t.fn[m].noConflict=function(){return t.fn[m]=_,x._jQueryInterface};var S="carousel",D="bs.carousel",A="."+D,N=".data-api",L=t.fn[S],O={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},I={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},k="next",H="prev",j={SLIDE:"slide"+A,SLID:"slid"+A,KEYDOWN:"keydown"+A,MOUSEENTER:"mouseenter"+A,MOUSELEAVE:"mouseleave"+A,TOUCHSTART:"touchstart"+A,TOUCHMOVE:"touchmove"+A,TOUCHEND:"touchend"+A,POINTERDOWN:"pointerdown"+A,POINTERUP:"pointerup"+A,DRAG_START:"dragstart"+A,LOAD_DATA_API:"load"+A+N,CLICK_DATA_API:"click"+A+N},M="active",P=".active.carousel-item",q={TOUCH:"touch",PEN:"pen"},R=function(){function e(e,t){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(t),this._element=e,this._indicatorsElement=this._element.querySelector(".carousel-indicators"),this._touchSupported="ontouchstart"in document.documentElement||0<navigator.maxTouchPoints,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var n=e.prototype;return n.next=function(){this._isSliding||this._slide(k)},n.nextWhenVisible=function(){!document.hidden&&t(this._element).is(":visible")&&"hidden"!==t(this._element).css("visibility")&&this.next()},n.prev=function(){this._isSliding||this._slide(H)},n.pause=function(e){e||(this._isPaused=!0),this._element.querySelector(".carousel-item-next, .carousel-item-prev")&&(l.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},n.cycle=function(e){e||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},n.to=function(e){var n=this;this._activeElement=this._element.querySelector(P);var i=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0))if(this._isSliding)t(this._element).one(j.SLID,(function(){return n.to(e)}));else{if(i===e)return this.pause(),void this.cycle();this._slide(i<e?k:H,this._items[e])}},n.dispose=function(){t(this._element).off(A),t.removeData(this._element,D),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},n._getConfig=function(e){return e=s({},O,{},e),l.typeCheckConfig(S,e,I),e},n._handleSwipe=function(){var e=Math.abs(this.touchDeltaX);if(!(e<=40)){var t=e/this.touchDeltaX;(this.touchDeltaX=0)<t&&this.prev(),t<0&&this.next()}},n._addEventListeners=function(){var e=this;this._config.keyboard&&t(this._element).on(j.KEYDOWN,(function(t){return e._keydown(t)})),"hover"===this._config.pause&&t(this._element).on(j.MOUSEENTER,(function(t){return e.pause(t)})).on(j.MOUSELEAVE,(function(t){return e.cycle(t)})),this._config.touch&&this._addTouchEventListeners()},n._addTouchEventListeners=function(){var e=this;if(this._touchSupported){var n=function(t){e._pointerEvent&&q[t.originalEvent.pointerType.toUpperCase()]?e.touchStartX=t.originalEvent.clientX:e._pointerEvent||(e.touchStartX=t.originalEvent.touches[0].clientX)},i=function(t){e._pointerEvent&&q[t.originalEvent.pointerType.toUpperCase()]&&(e.touchDeltaX=t.originalEvent.clientX-e.touchStartX),e._handleSwipe(),"hover"===e._config.pause&&(e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout((function(t){return e.cycle(t)}),500+e._config.interval))};t(this._element.querySelectorAll(".carousel-item img")).on(j.DRAG_START,(function(e){return e.preventDefault()})),this._pointerEvent?(t(this._element).on(j.POINTERDOWN,(function(e){return n(e)})),t(this._element).on(j.POINTERUP,(function(e){return i(e)})),this._element.classList.add("pointer-event")):(t(this._element).on(j.TOUCHSTART,(function(e){return n(e)})),t(this._element).on(j.TOUCHMOVE,(function(t){return function(t){e.touchDeltaX=t.originalEvent.touches&&1<t.originalEvent.touches.length?0:t.originalEvent.touches[0].clientX-e.touchStartX}(t)})),t(this._element).on(j.TOUCHEND,(function(e){return i(e)})))}},n._keydown=function(e){if(!/input|textarea/i.test(e.target.tagName))switch(e.which){case 37:e.preventDefault(),this.prev();break;case 39:e.preventDefault(),this.next()}},n._getItemIndex=function(e){return this._items=e&&e.parentNode?[].slice.call(e.parentNode.querySelectorAll(".carousel-item")):[],this._items.indexOf(e)},n._getItemByDirection=function(e,t){var n=e===k,i=e===H,r=this._getItemIndex(t);if((i&&0===r||n&&r===this._items.length-1)&&!this._config.wrap)return t;var o=(r+(e===H?-1:1))%this._items.length;return-1==o?this._items[this._items.length-1]:this._items[o]},n._triggerSlideEvent=function(e,n){var i=this._getItemIndex(e),r=this._getItemIndex(this._element.querySelector(P)),o=t.Event(j.SLIDE,{relatedTarget:e,direction:n,from:r,to:i});return t(this._element).trigger(o),o},n._setActiveIndicatorElement=function(e){if(this._indicatorsElement){var n=[].slice.call(this._indicatorsElement.querySelectorAll(".active"));t(n).removeClass(M);var i=this._indicatorsElement.children[this._getItemIndex(e)];i&&t(i).addClass(M)}},n._slide=function(e,n){var i,r,o,s=this,a=this._element.querySelector(P),u=this._getItemIndex(a),c=n||a&&this._getItemByDirection(e,a),f=this._getItemIndex(c),d=Boolean(this._interval);if(o=e===k?(i="carousel-item-left",r="carousel-item-next","left"):(i="carousel-item-right",r="carousel-item-prev","right"),c&&t(c).hasClass(M))this._isSliding=!1;else if(!this._triggerSlideEvent(c,o).isDefaultPrevented()&&a&&c){this._isSliding=!0,d&&this.pause(),this._setActiveIndicatorElement(c);var h=t.Event(j.SLID,{relatedTarget:c,direction:o,from:u,to:f});if(t(this._element).hasClass("slide")){t(c).addClass(r),l.reflow(c),t(a).addClass(i),t(c).addClass(i);var p=parseInt(c.getAttribute("data-interval"),10);p?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=p):this._config.interval=this._config.defaultInterval||this._config.interval;var m=l.getTransitionDurationFromElement(a);t(a).one(l.TRANSITION_END,(function(){t(c).removeClass(i+" "+r).addClass(M),t(a).removeClass(M+" "+r+" "+i),s._isSliding=!1,setTimeout((function(){return t(s._element).trigger(h)}),0)})).emulateTransitionEnd(m)}else t(a).removeClass(M),t(c).addClass(M),this._isSliding=!1,t(this._element).trigger(h);d&&this.cycle()}},e._jQueryInterface=function(n){return this.each((function(){var i=t(this).data(D),r=s({},O,{},t(this).data());"object"==typeof n&&(r=s({},r,{},n));var o="string"==typeof n?n:r.slide;if(i||(i=new e(this,r),t(this).data(D,i)),"number"==typeof n)i.to(n);else if("string"==typeof o){if(void 0===i[o])throw new TypeError('No method named "'+o+'"');i[o]()}else r.interval&&r.ride&&(i.pause(),i.cycle())}))},e._dataApiClickHandler=function(n){var i=l.getSelectorFromElement(this);if(i){var r=t(i)[0];if(r&&t(r).hasClass("carousel")){var o=s({},t(r).data(),{},t(this).data()),a=this.getAttribute("data-slide-to");a&&(o.interval=!1),e._jQueryInterface.call(t(r),o),a&&t(r).data(D).to(a),n.preventDefault()}}},r(e,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return O}}]),e}();t(document).on(j.CLICK_DATA_API,"[data-slide], [data-slide-to]",R._dataApiClickHandler),t(window).on(j.LOAD_DATA_API,(function(){for(var e=[].slice.call(document.querySelectorAll('[data-ride="carousel"]')),n=0,i=e.length;n<i;n++){var r=t(e[n]);R._jQueryInterface.call(r,r.data())}})),t.fn[S]=R._jQueryInterface,t.fn[S].Constructor=R,t.fn[S].noConflict=function(){return t.fn[S]=L,R._jQueryInterface};var F="collapse",W="bs.collapse",B="."+W,U=t.fn[F],V={toggle:!0,parent:""},K={toggle:"boolean",parent:"(string|element)"},Q={SHOW:"show"+B,SHOWN:"shown"+B,HIDE:"hide"+B,HIDDEN:"hidden"+B,CLICK_DATA_API:"click"+B+".data-api"},$="show",z="collapse",Y="collapsing",X="collapsed",G='[data-toggle="collapse"]',J=function(){function e(e,t){this._isTransitioning=!1,this._element=e,this._config=this._getConfig(t),this._triggerArray=[].slice.call(document.querySelectorAll('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var n=[].slice.call(document.querySelectorAll(G)),i=0,r=n.length;i<r;i++){var o=n[i],s=l.getSelectorFromElement(o),a=[].slice.call(document.querySelectorAll(s)).filter((function(t){return t===e}));null!==s&&0<a.length&&(this._selector=s,this._triggerArray.push(o))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var n=e.prototype;return n.toggle=function(){t(this._element).hasClass($)?this.hide():this.show()},n.show=function(){var n,i,r=this;if(!(this._isTransitioning||t(this._element).hasClass($)||(this._parent&&0===(n=[].slice.call(this._parent.querySelectorAll(".show, .collapsing")).filter((function(e){return"string"==typeof r._config.parent?e.getAttribute("data-parent")===r._config.parent:e.classList.contains(z)}))).length&&(n=null),n&&(i=t(n).not(this._selector).data(W))&&i._isTransitioning))){var o=t.Event(Q.SHOW);if(t(this._element).trigger(o),!o.isDefaultPrevented()){n&&(e._jQueryInterface.call(t(n).not(this._selector),"hide"),i||t(n).data(W,null));var s=this._getDimension();t(this._element).removeClass(z).addClass(Y),this._element.style[s]=0,this._triggerArray.length&&t(this._triggerArray).removeClass(X).attr("aria-expanded",!0),this.setTransitioning(!0);var a="scroll"+(s[0].toUpperCase()+s.slice(1)),u=l.getTransitionDurationFromElement(this._element);t(this._element).one(l.TRANSITION_END,(function(){t(r._element).removeClass(Y).addClass(z).addClass($),r._element.style[s]="",r.setTransitioning(!1),t(r._element).trigger(Q.SHOWN)})).emulateTransitionEnd(u),this._element.style[s]=this._element[a]+"px"}}},n.hide=function(){var e=this;if(!this._isTransitioning&&t(this._element).hasClass($)){var n=t.Event(Q.HIDE);if(t(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",l.reflow(this._element),t(this._element).addClass(Y).removeClass(z).removeClass($);var r=this._triggerArray.length;if(0<r)for(var o=0;o<r;o++){var s=this._triggerArray[o],a=l.getSelectorFromElement(s);null!==a&&(t([].slice.call(document.querySelectorAll(a))).hasClass($)||t(s).addClass(X).attr("aria-expanded",!1))}this.setTransitioning(!0),this._element.style[i]="";var u=l.getTransitionDurationFromElement(this._element);t(this._element).one(l.TRANSITION_END,(function(){e.setTransitioning(!1),t(e._element).removeClass(Y).addClass(z).trigger(Q.HIDDEN)})).emulateTransitionEnd(u)}}},n.setTransitioning=function(e){this._isTransitioning=e},n.dispose=function(){t.removeData(this._element,W),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},n._getConfig=function(e){return(e=s({},V,{},e)).toggle=Boolean(e.toggle),l.typeCheckConfig(F,e,K),e},n._getDimension=function(){return t(this._element).hasClass("width")?"width":"height"},n._getParent=function(){var n,i=this;l.isElement(this._config.parent)?(n=this._config.parent,void 0!==this._config.parent.jquery&&(n=this._config.parent[0])):n=document.querySelector(this._config.parent);var r=[].slice.call(n.querySelectorAll('[data-toggle="collapse"][data-parent="'+this._config.parent+'"]'));return t(r).each((function(t,n){i._addAriaAndCollapsedClass(e._getTargetFromElement(n),[n])})),n},n._addAriaAndCollapsedClass=function(e,n){var i=t(e).hasClass($);n.length&&t(n).toggleClass(X,!i).attr("aria-expanded",i)},e._getTargetFromElement=function(e){var t=l.getSelectorFromElement(e);return t?document.querySelector(t):null},e._jQueryInterface=function(n){return this.each((function(){var i=t(this),r=i.data(W),o=s({},V,{},i.data(),{},"object"==typeof n&&n?n:{});if(!r&&o.toggle&&/show|hide/.test(n)&&(o.toggle=!1),r||(r=new e(this,o),i.data(W,r)),"string"==typeof n){if(void 0===r[n])throw new TypeError('No method named "'+n+'"');r[n]()}}))},r(e,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return V}}]),e}();t(document).on(Q.CLICK_DATA_API,G,(function(e){"A"===e.currentTarget.tagName&&e.preventDefault();var n=t(this),i=l.getSelectorFromElement(this),r=[].slice.call(document.querySelectorAll(i));t(r).each((function(){var e=t(this),i=e.data(W)?"toggle":n.data();J._jQueryInterface.call(e,i)}))})),t.fn[F]=J._jQueryInterface,t.fn[F].Constructor=J,t.fn[F].noConflict=function(){return t.fn[F]=U,J._jQueryInterface};var Z="dropdown",ee="bs.dropdown",te="."+ee,ne=".data-api",ie=t.fn[Z],re=new RegExp("38|40|27"),oe={HIDE:"hide"+te,HIDDEN:"hidden"+te,SHOW:"show"+te,SHOWN:"shown"+te,CLICK:"click"+te,CLICK_DATA_API:"click"+te+ne,KEYDOWN_DATA_API:"keydown"+te+ne,KEYUP_DATA_API:"keyup"+te+ne},se="disabled",ae="show",le="dropdown-menu-right",ue='[data-toggle="dropdown"]',ce=".dropdown-menu",fe={offset:0,flip:!0,boundary:"scrollParent",reference:"toggle",display:"dynamic",popperConfig:null},de={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)",reference:"(string|element)",display:"string",popperConfig:"(null|object)"},he=function(){function e(e,t){this._element=e,this._popper=null,this._config=this._getConfig(t),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var i=e.prototype;return i.toggle=function(){if(!this._element.disabled&&!t(this._element).hasClass(se)){var n=t(this._menu).hasClass(ae);e._clearMenus(),n||this.show(!0)}},i.show=function(i){if(void 0===i&&(i=!1),!(this._element.disabled||t(this._element).hasClass(se)||t(this._menu).hasClass(ae))){var r={relatedTarget:this._element},o=t.Event(oe.SHOW,r),s=e._getParentFromElement(this._element);if(t(s).trigger(o),!o.isDefaultPrevented()){if(!this._inNavbar&&i){if(void 0===n)throw new TypeError("Bootstrap's dropdowns require Popper.js (https://popper.js.org/)");var a=this._element;"parent"===this._config.reference?a=s:l.isElement(this._config.reference)&&(a=this._config.reference,void 0!==this._config.reference.jquery&&(a=this._config.reference[0])),"scrollParent"!==this._config.boundary&&t(s).addClass("position-static"),this._popper=new n(a,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===t(s).closest(".navbar-nav").length&&t(document.body).children().on("mouseover",null,t.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),t(this._menu).toggleClass(ae),t(s).toggleClass(ae).trigger(t.Event(oe.SHOWN,r))}}},i.hide=function(){if(!this._element.disabled&&!t(this._element).hasClass(se)&&t(this._menu).hasClass(ae)){var n={relatedTarget:this._element},i=t.Event(oe.HIDE,n),r=e._getParentFromElement(this._element);t(r).trigger(i),i.isDefaultPrevented()||(this._popper&&this._popper.destroy(),t(this._menu).toggleClass(ae),t(r).toggleClass(ae).trigger(t.Event(oe.HIDDEN,n)))}},i.dispose=function(){t.removeData(this._element,ee),t(this._element).off(te),this._element=null,(this._menu=null)!==this._popper&&(this._popper.destroy(),this._popper=null)},i.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},i._addEventListeners=function(){var e=this;t(this._element).on(oe.CLICK,(function(t){t.preventDefault(),t.stopPropagation(),e.toggle()}))},i._getConfig=function(e){return e=s({},this.constructor.Default,{},t(this._element).data(),{},e),l.typeCheckConfig(Z,e,this.constructor.DefaultType),e},i._getMenuElement=function(){if(!this._menu){var t=e._getParentFromElement(this._element);t&&(this._menu=t.querySelector(ce))}return this._menu},i._getPlacement=function(){var e=t(this._element.parentNode),n="bottom-start";return e.hasClass("dropup")?(n="top-start",t(this._menu).hasClass(le)&&(n="top-end")):e.hasClass("dropright")?n="right-start":e.hasClass("dropleft")?n="left-start":t(this._menu).hasClass(le)&&(n="bottom-end"),n},i._detectNavbar=function(){return 0<t(this._element).closest(".navbar").length},i._getOffset=function(){var e=this,t={};return"function"==typeof this._config.offset?t.fn=function(t){return t.offsets=s({},t.offsets,{},e._config.offset(t.offsets,e._element)||{}),t}:t.offset=this._config.offset,t},i._getPopperConfig=function(){var e={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(e.modifiers.applyStyle={enabled:!1}),s({},e,{},this._config.popperConfig)},e._jQueryInterface=function(n){return this.each((function(){var i=t(this).data(ee);if(i||(i=new e(this,"object"==typeof n?n:null),t(this).data(ee,i)),"string"==typeof n){if(void 0===i[n])throw new TypeError('No method named "'+n+'"');i[n]()}}))},e._clearMenus=function(n){if(!n||3!==n.which&&("keyup"!==n.type||9===n.which))for(var i=[].slice.call(document.querySelectorAll(ue)),r=0,o=i.length;r<o;r++){var s=e._getParentFromElement(i[r]),a=t(i[r]).data(ee),l={relatedTarget:i[r]};if(n&&"click"===n.type&&(l.clickEvent=n),a){var u=a._menu;if(t(s).hasClass(ae)&&!(n&&("click"===n.type&&/input|textarea/i.test(n.target.tagName)||"keyup"===n.type&&9===n.which)&&t.contains(s,n.target))){var c=t.Event(oe.HIDE,l);t(s).trigger(c),c.isDefaultPrevented()||("ontouchstart"in document.documentElement&&t(document.body).children().off("mouseover",null,t.noop),i[r].setAttribute("aria-expanded","false"),a._popper&&a._popper.destroy(),t(u).removeClass(ae),t(s).removeClass(ae).trigger(t.Event(oe.HIDDEN,l)))}}}},e._getParentFromElement=function(e){var t,n=l.getSelectorFromElement(e);return n&&(t=document.querySelector(n)),t||e.parentNode},e._dataApiKeydownHandler=function(n){if((/input|textarea/i.test(n.target.tagName)?!(32===n.which||27!==n.which&&(40!==n.which&&38!==n.which||t(n.target).closest(ce).length)):re.test(n.which))&&(n.preventDefault(),n.stopPropagation(),!this.disabled&&!t(this).hasClass(se))){var i=e._getParentFromElement(this),r=t(i).hasClass(ae);if(r||27!==n.which)if(r&&(!r||27!==n.which&&32!==n.which)){var o=[].slice.call(i.querySelectorAll(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)")).filter((function(e){return t(e).is(":visible")}));if(0!==o.length){var s=o.indexOf(n.target);38===n.which&&0<s&&s--,40===n.which&&s<o.length-1&&s++,s<0&&(s=0),o[s].focus()}}else{if(27===n.which){var a=i.querySelector(ue);t(a).trigger("focus")}t(this).trigger("click")}}},r(e,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return fe}},{key:"DefaultType",get:function(){return de}}]),e}();t(document).on(oe.KEYDOWN_DATA_API,ue,he._dataApiKeydownHandler).on(oe.KEYDOWN_DATA_API,ce,he._dataApiKeydownHandler).on(oe.CLICK_DATA_API+" "+oe.KEYUP_DATA_API,he._clearMenus).on(oe.CLICK_DATA_API,ue,(function(e){e.preventDefault(),e.stopPropagation(),he._jQueryInterface.call(t(this),"toggle")})).on(oe.CLICK_DATA_API,".dropdown form",(function(e){e.stopPropagation()})),t.fn[Z]=he._jQueryInterface,t.fn[Z].Constructor=he,t.fn[Z].noConflict=function(){return t.fn[Z]=ie,he._jQueryInterface};var pe="modal",me="bs.modal",ge="."+me,ve=t.fn[pe],ye={backdrop:!0,keyboard:!0,focus:!0,show:!0},_e={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},be={HIDE:"hide"+ge,HIDE_PREVENTED:"hidePrevented"+ge,HIDDEN:"hidden"+ge,SHOW:"show"+ge,SHOWN:"shown"+ge,FOCUSIN:"focusin"+ge,RESIZE:"resize"+ge,CLICK_DISMISS:"click.dismiss"+ge,KEYDOWN_DISMISS:"keydown.dismiss"+ge,MOUSEUP_DISMISS:"mouseup.dismiss"+ge,MOUSEDOWN_DISMISS:"mousedown.dismiss"+ge,CLICK_DATA_API:"click"+ge+".data-api"},Ee="modal-open",Te="fade",we="show",Ce="modal-static",xe=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",Se=".sticky-top",De=function(){function e(e,t){this._config=this._getConfig(t),this._element=e,this._dialog=e.querySelector(".modal-dialog"),this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollbarWidth=0}var n=e.prototype;return n.toggle=function(e){return this._isShown?this.hide():this.show(e)},n.show=function(e){var n=this;if(!this._isShown&&!this._isTransitioning){t(this._element).hasClass(Te)&&(this._isTransitioning=!0);var i=t.Event(be.SHOW,{relatedTarget:e});t(this._element).trigger(i),this._isShown||i.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),t(this._element).on(be.CLICK_DISMISS,'[data-dismiss="modal"]',(function(e){return n.hide(e)})),t(this._dialog).on(be.MOUSEDOWN_DISMISS,(function(){t(n._element).one(be.MOUSEUP_DISMISS,(function(e){t(e.target).is(n._element)&&(n._ignoreBackdropClick=!0)}))})),this._showBackdrop((function(){return n._showElement(e)})))}},n.hide=function(e){var n=this;if(e&&e.preventDefault(),this._isShown&&!this._isTransitioning){var i=t.Event(be.HIDE);if(t(this._element).trigger(i),this._isShown&&!i.isDefaultPrevented()){this._isShown=!1;var r=t(this._element).hasClass(Te);if(r&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),t(document).off(be.FOCUSIN),t(this._element).removeClass(we),t(this._element).off(be.CLICK_DISMISS),t(this._dialog).off(be.MOUSEDOWN_DISMISS),r){var o=l.getTransitionDurationFromElement(this._element);t(this._element).one(l.TRANSITION_END,(function(e){return n._hideModal(e)})).emulateTransitionEnd(o)}else this._hideModal()}}},n.dispose=function(){[window,this._element,this._dialog].forEach((function(e){return t(e).off(ge)})),t(document).off(be.FOCUSIN),t.removeData(this._element,me),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._isTransitioning=null,this._scrollbarWidth=null},n.handleUpdate=function(){this._adjustDialog()},n._getConfig=function(e){return e=s({},ye,{},e),l.typeCheckConfig(pe,e,_e),e},n._triggerBackdropTransition=function(){var e=this;if("static"===this._config.backdrop){var n=t.Event(be.HIDE_PREVENTED);if(t(this._element).trigger(n),n.defaultPrevented)return;this._element.classList.add(Ce);var i=l.getTransitionDurationFromElement(this._element);t(this._element).one(l.TRANSITION_END,(function(){e._element.classList.remove(Ce)})).emulateTransitionEnd(i),this._element.focus()}else this.hide()},n._showElement=function(e){var n=this,i=t(this._element).hasClass(Te),r=this._dialog?this._dialog.querySelector(".modal-body"):null;function o(){n._config.focus&&n._element.focus(),n._isTransitioning=!1,t(n._element).trigger(s)}this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),t(this._dialog).hasClass("modal-dialog-scrollable")&&r?r.scrollTop=0:this._element.scrollTop=0,i&&l.reflow(this._element),t(this._element).addClass(we),this._config.focus&&this._enforceFocus();var s=t.Event(be.SHOWN,{relatedTarget:e});if(i){var a=l.getTransitionDurationFromElement(this._dialog);t(this._dialog).one(l.TRANSITION_END,o).emulateTransitionEnd(a)}else o()},n._enforceFocus=function(){var e=this;t(document).off(be.FOCUSIN).on(be.FOCUSIN,(function(n){document!==n.target&&e._element!==n.target&&0===t(e._element).has(n.target).length&&e._element.focus()}))},n._setEscapeEvent=function(){var e=this;this._isShown&&this._config.keyboard?t(this._element).on(be.KEYDOWN_DISMISS,(function(t){27===t.which&&e._triggerBackdropTransition()})):this._isShown||t(this._element).off(be.KEYDOWN_DISMISS)},n._setResizeEvent=function(){var e=this;this._isShown?t(window).on(be.RESIZE,(function(t){return e.handleUpdate(t)})):t(window).off(be.RESIZE)},n._hideModal=function(){var e=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._isTransitioning=!1,this._showBackdrop((function(){t(document.body).removeClass(Ee),e._resetAdjustments(),e._resetScrollbar(),t(e._element).trigger(be.HIDDEN)}))},n._removeBackdrop=function(){this._backdrop&&(t(this._backdrop).remove(),this._backdrop=null)},n._showBackdrop=function(e){var n=this,i=t(this._element).hasClass(Te)?Te:"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className="modal-backdrop",i&&this._backdrop.classList.add(i),t(this._backdrop).appendTo(document.body),t(this._element).on(be.CLICK_DISMISS,(function(e){n._ignoreBackdropClick?n._ignoreBackdropClick=!1:e.target===e.currentTarget&&n._triggerBackdropTransition()})),i&&l.reflow(this._backdrop),t(this._backdrop).addClass(we),!e)return;if(!i)return void e();var r=l.getTransitionDurationFromElement(this._backdrop);t(this._backdrop).one(l.TRANSITION_END,e).emulateTransitionEnd(r)}else if(!this._isShown&&this._backdrop){t(this._backdrop).removeClass(we);var o=function(){n._removeBackdrop(),e&&e()};if(t(this._element).hasClass(Te)){var s=l.getTransitionDurationFromElement(this._backdrop);t(this._backdrop).one(l.TRANSITION_END,o).emulateTransitionEnd(s)}else o()}else e&&e()},n._adjustDialog=function(){var e=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&e&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!e&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},n._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},n._checkScrollbar=function(){var e=document.body.getBoundingClientRect();this._isBodyOverflowing=e.left+e.right<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},n._setScrollbar=function(){var e=this;if(this._isBodyOverflowing){var n=[].slice.call(document.querySelectorAll(xe)),i=[].slice.call(document.querySelectorAll(Se));t(n).each((function(n,i){var r=i.style.paddingRight,o=t(i).css("padding-right");t(i).data("padding-right",r).css("padding-right",parseFloat(o)+e._scrollbarWidth+"px")})),t(i).each((function(n,i){var r=i.style.marginRight,o=t(i).css("margin-right");t(i).data("margin-right",r).css("margin-right",parseFloat(o)-e._scrollbarWidth+"px")}));var r=document.body.style.paddingRight,o=t(document.body).css("padding-right");t(document.body).data("padding-right",r).css("padding-right",parseFloat(o)+this._scrollbarWidth+"px")}t(document.body).addClass(Ee)},n._resetScrollbar=function(){var e=[].slice.call(document.querySelectorAll(xe));t(e).each((function(e,n){var i=t(n).data("padding-right");t(n).removeData("padding-right"),n.style.paddingRight=i||""}));var n=[].slice.call(document.querySelectorAll(""+Se));t(n).each((function(e,n){var i=t(n).data("margin-right");void 0!==i&&t(n).css("margin-right",i).removeData("margin-right")}));var i=t(document.body).data("padding-right");t(document.body).removeData("padding-right"),document.body.style.paddingRight=i||""},n._getScrollbarWidth=function(){var e=document.createElement("div");e.className="modal-scrollbar-measure",document.body.appendChild(e);var t=e.getBoundingClientRect().width-e.clientWidth;return document.body.removeChild(e),t},e._jQueryInterface=function(n,i){return this.each((function(){var r=t(this).data(me),o=s({},ye,{},t(this).data(),{},"object"==typeof n&&n?n:{});if(r||(r=new e(this,o),t(this).data(me,r)),"string"==typeof n){if(void 0===r[n])throw new TypeError('No method named "'+n+'"');r[n](i)}else o.show&&r.show(i)}))},r(e,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return ye}}]),e}();t(document).on(be.CLICK_DATA_API,'[data-toggle="modal"]',(function(e){var n,i=this,r=l.getSelectorFromElement(this);r&&(n=document.querySelector(r));var o=t(n).data(me)?"toggle":s({},t(n).data(),{},t(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||e.preventDefault();var a=t(n).one(be.SHOW,(function(e){e.isDefaultPrevented()||a.one(be.HIDDEN,(function(){t(i).is(":visible")&&i.focus()}))}));De._jQueryInterface.call(t(n),o,this)})),t.fn[pe]=De._jQueryInterface,t.fn[pe].Constructor=De,t.fn[pe].noConflict=function(){return t.fn[pe]=ve,De._jQueryInterface};var Ae=["background","cite","href","itemtype","longdesc","poster","src","xlink:href"],Ne=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,Le=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;function Oe(e,t,n){if(0===e.length)return e;if(n&&"function"==typeof n)return n(e);for(var i=(new window.DOMParser).parseFromString(e,"text/html"),r=Object.keys(t),o=[].slice.call(i.body.querySelectorAll("*")),s=function(e){var n=o[e],i=n.nodeName.toLowerCase();if(-1===r.indexOf(n.nodeName.toLowerCase()))return n.parentNode.removeChild(n),"continue";var s=[].slice.call(n.attributes),a=[].concat(t["*"]||[],t[i]||[]);s.forEach((function(e){!function(e,t){var n=e.nodeName.toLowerCase();if(-1!==t.indexOf(n))return-1===Ae.indexOf(n)||Boolean(e.nodeValue.match(Ne)||e.nodeValue.match(Le));for(var i=t.filter((function(e){return e instanceof RegExp})),r=0,o=i.length;r<o;r++)if(n.match(i[r]))return!0;return!1}(e,a)&&n.removeAttribute(e.nodeName)}))},a=0,l=o.length;a<l;a++)s(a);return i.body.innerHTML}var Ie="tooltip",ke="bs.tooltip",He="."+ke,je=t.fn[Ie],Me="bs-tooltip",Pe=new RegExp("(^|\\s)"+Me+"\\S+","g"),qe=["sanitize","whiteList","sanitizeFn"],Re={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string|function)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)",sanitize:"boolean",sanitizeFn:"(null|function)",whiteList:"object",popperConfig:"(null|object)"},Fe={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"},We={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},popperConfig:null},Be="show",Ue={HIDE:"hide"+He,HIDDEN:"hidden"+He,SHOW:"show"+He,SHOWN:"shown"+He,INSERTED:"inserted"+He,CLICK:"click"+He,FOCUSIN:"focusin"+He,FOCUSOUT:"focusout"+He,MOUSEENTER:"mouseenter"+He,MOUSELEAVE:"mouseleave"+He},Ve="fade",Ke="show",Qe="hover",$e="focus",ze=function(){function e(e,t){if(void 0===n)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=e,this.config=this._getConfig(t),this.tip=null,this._setListeners()}var i=e.prototype;return i.enable=function(){this._isEnabled=!0},i.disable=function(){this._isEnabled=!1},i.toggleEnabled=function(){this._isEnabled=!this._isEnabled},i.toggle=function(e){if(this._isEnabled)if(e){var n=this.constructor.DATA_KEY,i=t(e.currentTarget).data(n);i||(i=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(t(this.getTipElement()).hasClass(Ke))return void this._leave(null,this);this._enter(null,this)}},i.dispose=function(){clearTimeout(this._timeout),t.removeData(this.element,this.constructor.DATA_KEY),t(this.element).off(this.constructor.EVENT_KEY),t(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&t(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},i.show=function(){var e=this;if("none"===t(this.element).css("display"))throw new Error("Please use show on visible elements");var i=t.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){t(this.element).trigger(i);var r=l.findShadowRoot(this.element),o=t.contains(null!==r?r:this.element.ownerDocument.documentElement,this.element);if(i.isDefaultPrevented()||!o)return;var s=this.getTipElement(),a=l.getUID(this.constructor.NAME);s.setAttribute("id",a),this.element.setAttribute("aria-describedby",a),this.setContent(),this.config.animation&&t(s).addClass(Ve);var u="function"==typeof this.config.placement?this.config.placement.call(this,s,this.element):this.config.placement,c=this._getAttachment(u);this.addAttachmentClass(c);var f=this._getContainer();t(s).data(this.constructor.DATA_KEY,this),t.contains(this.element.ownerDocument.documentElement,this.tip)||t(s).appendTo(f),t(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new n(this.element,s,this._getPopperConfig(c)),t(s).addClass(Ke),"ontouchstart"in document.documentElement&&t(document.body).children().on("mouseover",null,t.noop);var d=function(){e.config.animation&&e._fixTransition();var n=e._hoverState;e._hoverState=null,t(e.element).trigger(e.constructor.Event.SHOWN),"out"===n&&e._leave(null,e)};if(t(this.tip).hasClass(Ve)){var h=l.getTransitionDurationFromElement(this.tip);t(this.tip).one(l.TRANSITION_END,d).emulateTransitionEnd(h)}else d()}},i.hide=function(e){function n(){i._hoverState!==Be&&r.parentNode&&r.parentNode.removeChild(r),i._cleanTipClass(),i.element.removeAttribute("aria-describedby"),t(i.element).trigger(i.constructor.Event.HIDDEN),null!==i._popper&&i._popper.destroy(),e&&e()}var i=this,r=this.getTipElement(),o=t.Event(this.constructor.Event.HIDE);if(t(this.element).trigger(o),!o.isDefaultPrevented()){if(t(r).removeClass(Ke),"ontouchstart"in document.documentElement&&t(document.body).children().off("mouseover",null,t.noop),this._activeTrigger.click=!1,this._activeTrigger[$e]=!1,this._activeTrigger[Qe]=!1,t(this.tip).hasClass(Ve)){var s=l.getTransitionDurationFromElement(r);t(r).one(l.TRANSITION_END,n).emulateTransitionEnd(s)}else n();this._hoverState=""}},i.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},i.isWithContent=function(){return Boolean(this.getTitle())},i.addAttachmentClass=function(e){t(this.getTipElement()).addClass(Me+"-"+e)},i.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},i.setContent=function(){var e=this.getTipElement();this.setElementContent(t(e.querySelectorAll(".tooltip-inner")),this.getTitle()),t(e).removeClass(Ve+" "+Ke)},i.setElementContent=function(e,n){"object"!=typeof n||!n.nodeType&&!n.jquery?this.config.html?(this.config.sanitize&&(n=Oe(n,this.config.whiteList,this.config.sanitizeFn)),e.html(n)):e.text(n):this.config.html?t(n).parent().is(e)||e.empty().append(n):e.text(t(n).text())},i.getTitle=function(){return this.element.getAttribute("data-original-title")||("function"==typeof this.config.title?this.config.title.call(this.element):this.config.title)},i._getPopperConfig=function(e){var t=this;return s({},{placement:e,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:".arrow"},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(e){e.originalPlacement!==e.placement&&t._handlePopperPlacementChange(e)},onUpdate:function(e){return t._handlePopperPlacementChange(e)}},{},this.config.popperConfig)},i._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=s({},t.offsets,{},e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},i._getContainer=function(){return!1===this.config.container?document.body:l.isElement(this.config.container)?t(this.config.container):t(document).find(this.config.container)},i._getAttachment=function(e){return Fe[e.toUpperCase()]},i._setListeners=function(){var e=this;this.config.trigger.split(" ").forEach((function(n){if("click"===n)t(e.element).on(e.constructor.Event.CLICK,e.config.selector,(function(t){return e.toggle(t)}));else if("manual"!==n){var i=n===Qe?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,r=n===Qe?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;t(e.element).on(i,e.config.selector,(function(t){return e._enter(t)})).on(r,e.config.selector,(function(t){return e._leave(t)}))}})),this._hideModalHandler=function(){e.element&&e.hide()},t(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=s({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},i._fixTitle=function(){var e=typeof this.element.getAttribute("data-original-title");!this.element.getAttribute("title")&&"string"==e||(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},i._enter=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusin"===e.type?$e:Qe]=!0),t(n.getTipElement()).hasClass(Ke)||n._hoverState===Be?n._hoverState=Be:(clearTimeout(n._timeout),n._hoverState=Be,n.config.delay&&n.config.delay.show?n._timeout=setTimeout((function(){n._hoverState===Be&&n.show()}),n.config.delay.show):n.show())},i._leave=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusout"===e.type?$e:Qe]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState="out",n.config.delay&&n.config.delay.hide?n._timeout=setTimeout((function(){"out"===n._hoverState&&n.hide()}),n.config.delay.hide):n.hide())},i._isWithActiveTrigger=function(){for(var e in this._activeTrigger)if(this._activeTrigger[e])return!0;return!1},i._getConfig=function(e){var n=t(this.element).data();return Object.keys(n).forEach((function(e){-1!==qe.indexOf(e)&&delete n[e]})),"number"==typeof(e=s({},this.constructor.Default,{},n,{},"object"==typeof e&&e?e:{})).delay&&(e.delay={show:e.delay,hide:e.delay}),"number"==typeof e.title&&(e.title=e.title.toString()),"number"==typeof e.content&&(e.content=e.content.toString()),l.typeCheckConfig(Ie,e,this.constructor.DefaultType),e.sanitize&&(e.template=Oe(e.template,e.whiteList,e.sanitizeFn)),e},i._getDelegateConfig=function(){var e={};if(this.config)for(var t in this.config)this.constructor.Default[t]!==this.config[t]&&(e[t]=this.config[t]);return e},i._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(Pe);null!==n&&n.length&&e.removeClass(n.join(""))},i._handlePopperPlacementChange=function(e){this.tip=e.instance.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(e.placement))},i._fixTransition=function(){var e=this.getTipElement(),n=this.config.animation;null===e.getAttribute("x-placement")&&(t(e).removeClass(Ve),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},e._jQueryInterface=function(n){return this.each((function(){var i=t(this).data(ke),r="object"==typeof n&&n;if((i||!/dispose|hide/.test(n))&&(i||(i=new e(this,r),t(this).data(ke,i)),"string"==typeof n)){if(void 0===i[n])throw new TypeError('No method named "'+n+'"');i[n]()}}))},r(e,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return We}},{key:"NAME",get:function(){return Ie}},{key:"DATA_KEY",get:function(){return ke}},{key:"Event",get:function(){return Ue}},{key:"EVENT_KEY",get:function(){return He}},{key:"DefaultType",get:function(){return Re}}]),e}();t.fn[Ie]=ze._jQueryInterface,t.fn[Ie].Constructor=ze,t.fn[Ie].noConflict=function(){return t.fn[Ie]=je,ze._jQueryInterface};var Ye="popover",Xe="bs.popover",Ge="."+Xe,Je=t.fn[Ye],Ze="bs-popover",et=new RegExp("(^|\\s)"+Ze+"\\S+","g"),tt=s({},ze.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'}),nt=s({},ze.DefaultType,{content:"(string|element|function)"}),it={HIDE:"hide"+Ge,HIDDEN:"hidden"+Ge,SHOW:"show"+Ge,SHOWN:"shown"+Ge,INSERTED:"inserted"+Ge,CLICK:"click"+Ge,FOCUSIN:"focusin"+Ge,FOCUSOUT:"focusout"+Ge,MOUSEENTER:"mouseenter"+Ge,MOUSELEAVE:"mouseleave"+Ge},rt=function(e){function n(){return e.apply(this,arguments)||this}!function(e,t){e.prototype=Object.create(t.prototype),(e.prototype.constructor=e).__proto__=t}(n,e);var i=n.prototype;return i.isWithContent=function(){return this.getTitle()||this._getContent()},i.addAttachmentClass=function(e){t(this.getTipElement()).addClass(Ze+"-"+e)},i.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},i.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(".popover-header"),this.getTitle());var n=this._getContent();"function"==typeof n&&(n=n.call(this.element)),this.setElementContent(e.find(".popover-body"),n),e.removeClass("fade show")},i._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},i._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(et);null!==n&&0<n.length&&e.removeClass(n.join(""))},n._jQueryInterface=function(e){return this.each((function(){var i=t(this).data(Xe),r="object"==typeof e?e:null;if((i||!/dispose|hide/.test(e))&&(i||(i=new n(this,r),t(this).data(Xe,i)),"string"==typeof e)){if(void 0===i[e])throw new TypeError('No method named "'+e+'"');i[e]()}}))},r(n,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return tt}},{key:"NAME",get:function(){return Ye}},{key:"DATA_KEY",get:function(){return Xe}},{key:"Event",get:function(){return it}},{key:"EVENT_KEY",get:function(){return Ge}},{key:"DefaultType",get:function(){return nt}}]),n}(ze);t.fn[Ye]=rt._jQueryInterface,t.fn[Ye].Constructor=rt,t.fn[Ye].noConflict=function(){return t.fn[Ye]=Je,rt._jQueryInterface};var ot="scrollspy",st="bs.scrollspy",at="."+st,lt=t.fn[ot],ut={offset:10,method:"auto",target:""},ct={offset:"number",method:"string",target:"(string|element)"},ft={ACTIVATE:"activate"+at,SCROLL:"scroll"+at,LOAD_DATA_API:"load"+at+".data-api"},dt="active",ht=".nav, .list-group",pt=".nav-link",mt=".list-group-item",gt="position",vt=function(){function e(e,n){var i=this;this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(n),this._selector=this._config.target+" "+pt+","+this._config.target+" "+mt+","+this._config.target+" .dropdown-item",this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,t(this._scrollElement).on(ft.SCROLL,(function(e){return i._process(e)})),this.refresh(),this._process()}var n=e.prototype;return n.refresh=function(){var e=this,n="auto"===this._config.method?this._scrollElement===this._scrollElement.window?"offset":gt:this._config.method,i=n===gt?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map((function(e){var r,o=l.getSelectorFromElement(e);if(o&&(r=document.querySelector(o)),r){var s=r.getBoundingClientRect();if(s.width||s.height)return[t(r)[n]().top+i,o]}return null})).filter((function(e){return e})).sort((function(e,t){return e[0]-t[0]})).forEach((function(t){e._offsets.push(t[0]),e._targets.push(t[1])}))},n.dispose=function(){t.removeData(this._element,st),t(this._scrollElement).off(at),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},n._getConfig=function(e){if("string"!=typeof(e=s({},ut,{},"object"==typeof e&&e?e:{})).target){var n=t(e.target).attr("id");n||(n=l.getUID(ot),t(e.target).attr("id",n)),e.target="#"+n}return l.typeCheckConfig(ot,e,ct),e},n._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},n._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},n._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},n._process=function(){var e=this._getScrollTop()+this._config.offset,t=this._getScrollHeight(),n=this._config.offset+t-this._getOffsetHeight();if(this._scrollHeight!==t&&this.refresh(),n<=e){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&e<this._offsets[0]&&0<this._offsets[0])return this._activeTarget=null,void this._clear();for(var r=this._offsets.length;r--;)this._activeTarget!==this._targets[r]&&e>=this._offsets[r]&&(void 0===this._offsets[r+1]||e<this._offsets[r+1])&&this._activate(this._targets[r])}},n._activate=function(e){this._activeTarget=e,this._clear();var n=this._selector.split(",").map((function(t){return t+'[data-target="'+e+'"],'+t+'[href="'+e+'"]'})),i=t([].slice.call(document.querySelectorAll(n.join(","))));i.hasClass("dropdown-item")?(i.closest(".dropdown").find(".dropdown-toggle").addClass(dt),i.addClass(dt)):(i.addClass(dt),i.parents(ht).prev(pt+", "+mt).addClass(dt),i.parents(ht).prev(".nav-item").children(pt).addClass(dt)),t(this._scrollElement).trigger(ft.ACTIVATE,{relatedTarget:e})},n._clear=function(){[].slice.call(document.querySelectorAll(this._selector)).filter((function(e){return e.classList.contains(dt)})).forEach((function(e){return e.classList.remove(dt)}))},e._jQueryInterface=function(n){return this.each((function(){var i=t(this).data(st);if(i||(i=new e(this,"object"==typeof n&&n),t(this).data(st,i)),"string"==typeof n){if(void 0===i[n])throw new TypeError('No method named "'+n+'"');i[n]()}}))},r(e,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return ut}}]),e}();t(window).on(ft.LOAD_DATA_API,(function(){for(var e=[].slice.call(document.querySelectorAll('[data-spy="scroll"]')),n=e.length;n--;){var i=t(e[n]);vt._jQueryInterface.call(i,i.data())}})),t.fn[ot]=vt._jQueryInterface,t.fn[ot].Constructor=vt,t.fn[ot].noConflict=function(){return t.fn[ot]=lt,vt._jQueryInterface};var yt="bs.tab",_t="."+yt,bt=t.fn.tab,Et={HIDE:"hide"+_t,HIDDEN:"hidden"+_t,SHOW:"show"+_t,SHOWN:"shown"+_t,CLICK_DATA_API:"click"+_t+".data-api"},Tt="active",wt=".active",Ct="> li > .active",xt=function(){function e(e){this._element=e}var n=e.prototype;return n.show=function(){var e=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&t(this._element).hasClass(Tt)||t(this._element).hasClass("disabled"))){var n,i,r=t(this._element).closest(".nav, .list-group")[0],o=l.getSelectorFromElement(this._element);if(r){var s="UL"===r.nodeName||"OL"===r.nodeName?Ct:wt;i=(i=t.makeArray(t(r).find(s)))[i.length-1]}var a=t.Event(Et.HIDE,{relatedTarget:this._element}),u=t.Event(Et.SHOW,{relatedTarget:i});if(i&&t(i).trigger(a),t(this._element).trigger(u),!u.isDefaultPrevented()&&!a.isDefaultPrevented()){o&&(n=document.querySelector(o)),this._activate(this._element,r);var c=function(){var n=t.Event(Et.HIDDEN,{relatedTarget:e._element}),r=t.Event(Et.SHOWN,{relatedTarget:i});t(i).trigger(n),t(e._element).trigger(r)};n?this._activate(n,n.parentNode,c):c()}}},n.dispose=function(){t.removeData(this._element,yt),this._element=null},n._activate=function(e,n,i){function r(){return o._transitionComplete(e,s,i)}var o=this,s=(!n||"UL"!==n.nodeName&&"OL"!==n.nodeName?t(n).children(wt):t(n).find(Ct))[0],a=i&&s&&t(s).hasClass("fade");if(s&&a){var u=l.getTransitionDurationFromElement(s);t(s).removeClass("show").one(l.TRANSITION_END,r).emulateTransitionEnd(u)}else r()},n._transitionComplete=function(e,n,i){if(n){t(n).removeClass(Tt);var r=t(n.parentNode).find("> .dropdown-menu .active")[0];r&&t(r).removeClass(Tt),"tab"===n.getAttribute("role")&&n.setAttribute("aria-selected",!1)}if(t(e).addClass(Tt),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!0),l.reflow(e),e.classList.contains("fade")&&e.classList.add("show"),e.parentNode&&t(e.parentNode).hasClass("dropdown-menu")){var o=t(e).closest(".dropdown")[0];if(o){var s=[].slice.call(o.querySelectorAll(".dropdown-toggle"));t(s).addClass(Tt)}e.setAttribute("aria-expanded",!0)}i&&i()},e._jQueryInterface=function(n){return this.each((function(){var i=t(this),r=i.data(yt);if(r||(r=new e(this),i.data(yt,r)),"string"==typeof n){if(void 0===r[n])throw new TypeError('No method named "'+n+'"');r[n]()}}))},r(e,null,[{key:"VERSION",get:function(){return"4.4.1"}}]),e}();t(document).on(Et.CLICK_DATA_API,'[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',(function(e){e.preventDefault(),xt._jQueryInterface.call(t(this),"show")})),t.fn.tab=xt._jQueryInterface,t.fn.tab.Constructor=xt,t.fn.tab.noConflict=function(){return t.fn.tab=bt,xt._jQueryInterface};var St="toast",Dt="bs.toast",At="."+Dt,Nt=t.fn[St],Lt={CLICK_DISMISS:"click.dismiss"+At,HIDE:"hide"+At,HIDDEN:"hidden"+At,SHOW:"show"+At,SHOWN:"shown"+At},Ot="show",It="showing",kt={animation:"boolean",autohide:"boolean",delay:"number"},Ht={animation:!0,autohide:!0,delay:500},jt=function(){function e(e,t){this._element=e,this._config=this._getConfig(t),this._timeout=null,this._setListeners()}var n=e.prototype;return n.show=function(){var e=this,n=t.Event(Lt.SHOW);if(t(this._element).trigger(n),!n.isDefaultPrevented()){this._config.animation&&this._element.classList.add("fade");var i=function(){e._element.classList.remove(It),e._element.classList.add(Ot),t(e._element).trigger(Lt.SHOWN),e._config.autohide&&(e._timeout=setTimeout((function(){e.hide()}),e._config.delay))};if(this._element.classList.remove("hide"),l.reflow(this._element),this._element.classList.add(It),this._config.animation){var r=l.getTransitionDurationFromElement(this._element);t(this._element).one(l.TRANSITION_END,i).emulateTransitionEnd(r)}else i()}},n.hide=function(){if(this._element.classList.contains(Ot)){var e=t.Event(Lt.HIDE);t(this._element).trigger(e),e.isDefaultPrevented()||this._close()}},n.dispose=function(){clearTimeout(this._timeout),this._timeout=null,this._element.classList.contains(Ot)&&this._element.classList.remove(Ot),t(this._element).off(Lt.CLICK_DISMISS),t.removeData(this._element,Dt),this._element=null,this._config=null},n._getConfig=function(e){return e=s({},Ht,{},t(this._element).data(),{},"object"==typeof e&&e?e:{}),l.typeCheckConfig(St,e,this.constructor.DefaultType),e},n._setListeners=function(){var e=this;t(this._element).on(Lt.CLICK_DISMISS,'[data-dismiss="toast"]',(function(){return e.hide()}))},n._close=function(){function e(){n._element.classList.add("hide"),t(n._element).trigger(Lt.HIDDEN)}var n=this;if(this._element.classList.remove(Ot),this._config.animation){var i=l.getTransitionDurationFromElement(this._element);t(this._element).one(l.TRANSITION_END,e).emulateTransitionEnd(i)}else e()},e._jQueryInterface=function(n){return this.each((function(){var i=t(this),r=i.data(Dt);if(r||(r=new e(this,"object"==typeof n&&n),i.data(Dt,r)),"string"==typeof n){if(void 0===r[n])throw new TypeError('No method named "'+n+'"');r[n](this)}}))},r(e,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"DefaultType",get:function(){return kt}},{key:"Default",get:function(){return Ht}}]),e}();t.fn[St]=jt._jQueryInterface,t.fn[St].Constructor=jt,t.fn[St].noConflict=function(){return t.fn[St]=Nt,jt._jQueryInterface},e.Alert=p,e.Button=x,e.Carousel=R,e.Collapse=J,e.Dropdown=he,e.Modal=De,e.Popover=rt,e.Scrollspy=vt,e.Tab=xt,e.Toast=jt,e.Tooltip=ze,e.Util=l,Object.defineProperty(e,"__esModule",{value:!0})}));
(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{0:function(t,e,n){t.exports=n("zUnb")},L4gg:function(t,e,n){!function(t){"use strict";var e=Object.freeze;function n(t){var e,n,i,o;for(n=1,i=arguments.length;n<i;n++)for(e in o=arguments[n])t[e]=o[e];return t}Object.freeze=function(t){return t};var i=Object.create||function(){function t(){}return function(e){return t.prototype=e,new t}}();function o(t,e){var n=Array.prototype.slice;if(t.bind)return t.bind.apply(t,n.call(arguments,1));var i=n.call(arguments,2);return function(){return t.apply(e,i.length?i.concat(n.call(arguments)):arguments)}}var s=0;function r(t){return t._leaflet_id=t._leaflet_id||++s,t._leaflet_id}function a(t,e,n){var i,o,s,r;return r=function(){i=!1,o&&(s.apply(n,o),o=!1)},s=function(){i?o=arguments:(t.apply(n,arguments),setTimeout(r,e),i=!0)}}function l(t,e,n){var i=e[1],o=e[0],s=i-o;return t===i&&n?t:((t-o)%s+s)%s+o}function h(){return!1}function u(t,e){return e=void 0===e?6:e,+(Math.round(t+"e+"+e)+"e-"+e)}function c(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}function d(t){return c(t).split(/\s+/)}function p(t,e){for(var n in t.hasOwnProperty("options")||(t.options=t.options?i(t.options):{}),e)t.options[n]=e[n];return t.options}function f(t,e,n){var i=[];for(var o in t)i.push(encodeURIComponent(n?o.toUpperCase():o)+"="+encodeURIComponent(t[o]));return(e&&-1!==e.indexOf("?")?"&":"?")+i.join("&")}var _=/\{ *([\w_-]+) *\}/g;function m(t,e){return t.replace(_,(function(t,n){var i=e[n];if(void 0===i)throw new Error("No value provided for variable "+t);return"function"==typeof i&&(i=i(e)),i}))}var g=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)};function v(t,e){for(var n=0;n<t.length;n++)if(t[n]===e)return n;return-1}var y="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=";function w(t){return window["webkit"+t]||window["moz"+t]||window["ms"+t]}var b=0;function x(t){var e=+new Date,n=Math.max(0,16-(e-b));return b=e+n,window.setTimeout(t,n)}var T=window.requestAnimationFrame||w("RequestAnimationFrame")||x,E=window.cancelAnimationFrame||w("CancelAnimationFrame")||w("CancelRequestAnimationFrame")||function(t){window.clearTimeout(t)};function C(t,e,n){if(!n||T!==x)return T.call(window,o(t,e));t.call(e)}function P(t){t&&E.call(window,t)}var S=(Object.freeze||Object)({freeze:e,extend:n,create:i,bind:o,lastId:s,stamp:r,throttle:a,wrapNum:l,falseFn:h,formatNum:u,trim:c,splitWords:d,setOptions:p,getParamString:f,template:m,isArray:g,indexOf:v,emptyImageUrl:y,requestFn:T,cancelFn:E,requestAnimFrame:C,cancelAnimFrame:P});function k(){}k.extend=function(t){var e=function(){this.initialize&&this.initialize.apply(this,arguments),this.callInitHooks()},o=e.__super__=this.prototype,s=i(o);for(var r in s.constructor=e,e.prototype=s,this)this.hasOwnProperty(r)&&"prototype"!==r&&"__super__"!==r&&(e[r]=this[r]);return t.statics&&(n(e,t.statics),delete t.statics),t.includes&&(function(t){if("undefined"!=typeof L&&L&&L.Mixin){t=g(t)?t:[t];for(var e=0;e<t.length;e++)t[e]===L.Mixin.Events&&console.warn("Deprecated include of L.Mixin.Events: this property will be removed in future releases, please inherit from L.Evented instead.",(new Error).stack)}}(t.includes),n.apply(null,[s].concat(t.includes)),delete t.includes),s.options&&(t.options=n(i(s.options),t.options)),n(s,t),s._initHooks=[],s.callInitHooks=function(){if(!this._initHooksCalled){o.callInitHooks&&o.callInitHooks.call(this),this._initHooksCalled=!0;for(var t=0,e=s._initHooks.length;t<e;t++)s._initHooks[t].call(this)}},e},k.include=function(t){return n(this.prototype,t),this},k.mergeOptions=function(t){return n(this.prototype.options,t),this},k.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),n="function"==typeof t?t:function(){this[t].apply(this,e)};return this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(n),this};var I={on:function(t,e,n){if("object"==typeof t)for(var i in t)this._on(i,t[i],e);else for(var o=0,s=(t=d(t)).length;o<s;o++)this._on(t[o],e,n);return this},off:function(t,e,n){if(t)if("object"==typeof t)for(var i in t)this._off(i,t[i],e);else for(var o=0,s=(t=d(t)).length;o<s;o++)this._off(t[o],e,n);else delete this._events;return this},_on:function(t,e,n){this._events=this._events||{};var i=this._events[t];i||(this._events[t]=i=[]),n===this&&(n=void 0);for(var o={fn:e,ctx:n},s=i,r=0,a=s.length;r<a;r++)if(s[r].fn===e&&s[r].ctx===n)return;s.push(o)},_off:function(t,e,n){var i,o,s;if(this._events&&(i=this._events[t]))if(e){if(n===this&&(n=void 0),i)for(o=0,s=i.length;o<s;o++){var r=i[o];if(r.ctx===n&&r.fn===e)return r.fn=h,this._firingCount&&(this._events[t]=i=i.slice()),void i.splice(o,1)}}else{for(o=0,s=i.length;o<s;o++)i[o].fn=h;delete this._events[t]}},fire:function(t,e,i){if(!this.listens(t,i))return this;var o=n({},e,{type:t,target:this,sourceTarget:e&&e.sourceTarget||this});if(this._events){var s=this._events[t];if(s){this._firingCount=this._firingCount+1||1;for(var r=0,a=s.length;r<a;r++){var l=s[r];l.fn.call(l.ctx||this,o)}this._firingCount--}}return i&&this._propagateEvent(o),this},listens:function(t,e){var n=this._events&&this._events[t];if(n&&n.length)return!0;if(e)for(var i in this._eventParents)if(this._eventParents[i].listens(t,e))return!0;return!1},once:function(t,e,n){if("object"==typeof t){for(var i in t)this.once(i,t[i],e);return this}var s=o((function(){this.off(t,e,n).off(t,s,n)}),this);return this.on(t,e,n).on(t,s,n)},addEventParent:function(t){return this._eventParents=this._eventParents||{},this._eventParents[r(t)]=t,this},removeEventParent:function(t){return this._eventParents&&delete this._eventParents[r(t)],this},_propagateEvent:function(t){for(var e in this._eventParents)this._eventParents[e].fire(t.type,n({layer:t.target,propagatedFrom:t.target},t),!0)}};I.addEventListener=I.on,I.removeEventListener=I.clearAllEventListeners=I.off,I.addOneTimeEventListener=I.once,I.fireEvent=I.fire,I.hasEventListeners=I.listens;var M=k.extend(I);function A(t,e,n){this.x=n?Math.round(t):t,this.y=n?Math.round(e):e}var N=Math.trunc||function(t){return t>0?Math.floor(t):Math.ceil(t)};function O(t,e,n){return t instanceof A?t:g(t)?new A(t[0],t[1]):null==t?t:"object"==typeof t&&"x"in t&&"y"in t?new A(t.x,t.y):new A(t,e,n)}function z(t,e){if(t)for(var n=e?[t,e]:t,i=0,o=n.length;i<o;i++)this.extend(n[i])}function D(t,e){return!t||t instanceof z?t:new z(t,e)}function R(t,e){if(t)for(var n=e?[t,e]:t,i=0,o=n.length;i<o;i++)this.extend(n[i])}function Z(t,e){return t instanceof R?t:new R(t,e)}function B(t,e,n){if(isNaN(t)||isNaN(e))throw new Error("Invalid LatLng object: ("+t+", "+e+")");this.lat=+t,this.lng=+e,void 0!==n&&(this.alt=+n)}function j(t,e,n){return t instanceof B?t:g(t)&&"object"!=typeof t[0]?3===t.length?new B(t[0],t[1],t[2]):2===t.length?new B(t[0],t[1]):null:null==t?t:"object"==typeof t&&"lat"in t?new B(t.lat,"lng"in t?t.lng:t.lon,t.alt):void 0===e?null:new B(t,e,n)}A.prototype={clone:function(){return new A(this.x,this.y)},add:function(t){return this.clone()._add(O(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(O(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},scaleBy:function(t){return new A(this.x*t.x,this.y*t.y)},unscaleBy:function(t){return new A(this.x/t.x,this.y/t.y)},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},ceil:function(){return this.clone()._ceil()},_ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this},trunc:function(){return this.clone()._trunc()},_trunc:function(){return this.x=N(this.x),this.y=N(this.y),this},distanceTo:function(t){var e=(t=O(t)).x-this.x,n=t.y-this.y;return Math.sqrt(e*e+n*n)},equals:function(t){return(t=O(t)).x===this.x&&t.y===this.y},contains:function(t){return t=O(t),Math.abs(t.x)<=Math.abs(this.x)&&Math.abs(t.y)<=Math.abs(this.y)},toString:function(){return"Point("+u(this.x)+", "+u(this.y)+")"}},z.prototype={extend:function(t){return t=O(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new A((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new A(this.min.x,this.max.y)},getTopRight:function(){return new A(this.max.x,this.min.y)},getTopLeft:function(){return this.min},getBottomRight:function(){return this.max},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var e,n;return(t="number"==typeof t[0]||t instanceof A?O(t):D(t))instanceof z?(e=t.min,n=t.max):e=n=t,e.x>=this.min.x&&n.x<=this.max.x&&e.y>=this.min.y&&n.y<=this.max.y},intersects:function(t){t=D(t);var e=this.min,n=this.max,i=t.min,o=t.max;return o.x>=e.x&&i.x<=n.x&&o.y>=e.y&&i.y<=n.y},overlaps:function(t){t=D(t);var e=this.min,n=this.max,i=t.min,o=t.max;return o.x>e.x&&i.x<n.x&&o.y>e.y&&i.y<n.y},isValid:function(){return!(!this.min||!this.max)}},R.prototype={extend:function(t){var e,n,i=this._southWest,o=this._northEast;if(t instanceof B)e=t,n=t;else{if(!(t instanceof R))return t?this.extend(j(t)||Z(t)):this;if(n=t._northEast,!(e=t._southWest)||!n)return this}return i||o?(i.lat=Math.min(e.lat,i.lat),i.lng=Math.min(e.lng,i.lng),o.lat=Math.max(n.lat,o.lat),o.lng=Math.max(n.lng,o.lng)):(this._southWest=new B(e.lat,e.lng),this._northEast=new B(n.lat,n.lng)),this},pad:function(t){var e=this._southWest,n=this._northEast,i=Math.abs(e.lat-n.lat)*t,o=Math.abs(e.lng-n.lng)*t;return new R(new B(e.lat-i,e.lng-o),new B(n.lat+i,n.lng+o))},getCenter:function(){return new B((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new B(this.getNorth(),this.getWest())},getSouthEast:function(){return new B(this.getSouth(),this.getEast())},getWest:function(){return this._southWest.lng},getSouth:function(){return this._southWest.lat},getEast:function(){return this._northEast.lng},getNorth:function(){return this._northEast.lat},contains:function(t){t="number"==typeof t[0]||t instanceof B||"lat"in t?j(t):Z(t);var e,n,i=this._southWest,o=this._northEast;return t instanceof R?(e=t.getSouthWest(),n=t.getNorthEast()):e=n=t,e.lat>=i.lat&&n.lat<=o.lat&&e.lng>=i.lng&&n.lng<=o.lng},intersects:function(t){t=Z(t);var e=this._southWest,n=this._northEast,i=t.getSouthWest(),o=t.getNorthEast();return o.lat>=e.lat&&i.lat<=n.lat&&o.lng>=e.lng&&i.lng<=n.lng},overlaps:function(t){t=Z(t);var e=this._southWest,n=this._northEast,i=t.getSouthWest(),o=t.getNorthEast();return o.lat>e.lat&&i.lat<n.lat&&o.lng>e.lng&&i.lng<n.lng},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(",")},equals:function(t,e){return!!t&&(t=Z(t),this._southWest.equals(t.getSouthWest(),e)&&this._northEast.equals(t.getNorthEast(),e))},isValid:function(){return!(!this._southWest||!this._northEast)}},B.prototype={equals:function(t,e){return!!t&&(t=j(t),Math.max(Math.abs(this.lat-t.lat),Math.abs(this.lng-t.lng))<=(void 0===e?1e-9:e))},toString:function(t){return"LatLng("+u(this.lat,t)+", "+u(this.lng,t)+")"},distanceTo:function(t){return F.distance(this,j(t))},wrap:function(){return F.wrapLatLng(this)},toBounds:function(t){var e=180*t/40075017,n=e/Math.cos(Math.PI/180*this.lat);return Z([this.lat-e,this.lng-n],[this.lat+e,this.lng+n])},clone:function(){return new B(this.lat,this.lng,this.alt)}};var V,H={latLngToPoint:function(t,e){var n=this.projection.project(t),i=this.scale(e);return this.transformation._transform(n,i)},pointToLatLng:function(t,e){var n=this.scale(e),i=this.transformation.untransform(t,n);return this.projection.unproject(i)},project:function(t){return this.projection.project(t)},unproject:function(t){return this.projection.unproject(t)},scale:function(t){return 256*Math.pow(2,t)},zoom:function(t){return Math.log(t/256)/Math.LN2},getProjectedBounds:function(t){if(this.infinite)return null;var e=this.projection.bounds,n=this.scale(t);return new z(this.transformation.transform(e.min,n),this.transformation.transform(e.max,n))},infinite:!1,wrapLatLng:function(t){var e=this.wrapLng?l(t.lng,this.wrapLng,!0):t.lng;return new B(this.wrapLat?l(t.lat,this.wrapLat,!0):t.lat,e,t.alt)},wrapLatLngBounds:function(t){var e=t.getCenter(),n=this.wrapLatLng(e),i=e.lat-n.lat,o=e.lng-n.lng;if(0===i&&0===o)return t;var s=t.getSouthWest(),r=t.getNorthEast();return new R(new B(s.lat-i,s.lng-o),new B(r.lat-i,r.lng-o))}},F=n({},H,{wrapLng:[-180,180],R:6371e3,distance:function(t,e){var n=Math.PI/180,i=t.lat*n,o=e.lat*n,s=Math.sin((e.lat-t.lat)*n/2),r=Math.sin((e.lng-t.lng)*n/2),a=s*s+Math.cos(i)*Math.cos(o)*r*r,l=2*Math.atan2(Math.sqrt(a),Math.sqrt(1-a));return this.R*l}}),U={R:6378137,MAX_LATITUDE:85.0511287798,project:function(t){var e=Math.PI/180,n=this.MAX_LATITUDE,i=Math.max(Math.min(n,t.lat),-n),o=Math.sin(i*e);return new A(this.R*t.lng*e,this.R*Math.log((1+o)/(1-o))/2)},unproject:function(t){var e=180/Math.PI;return new B((2*Math.atan(Math.exp(t.y/this.R))-Math.PI/2)*e,t.x*e/this.R)},bounds:(V=6378137*Math.PI,new z([-V,-V],[V,V]))};function W(t,e,n,i){if(g(t))return this._a=t[0],this._b=t[1],this._c=t[2],void(this._d=t[3]);this._a=t,this._b=e,this._c=n,this._d=i}function q(t,e,n,i){return new W(t,e,n,i)}W.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return t.x=(e=e||1)*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return new A((t.x/(e=e||1)-this._b)/this._a,(t.y/e-this._d)/this._c)}};var $,G=n({},F,{code:"EPSG:3857",projection:U,transformation:($=.5/(Math.PI*U.R),q($,.5,-$,.5))}),K=n({},G,{code:"EPSG:900913"});function Y(t){return document.createElementNS("http://www.w3.org/2000/svg",t)}function J(t,e){var n,i,o,s,r,a,l="";for(n=0,o=t.length;n<o;n++){for(i=0,s=(r=t[n]).length;i<s;i++)l+=(i?"L":"M")+(a=r[i]).x+" "+a.y;l+=e?Lt?"z":"x":""}return l||"M0 0"}var Q=document.documentElement.style,X="ActiveXObject"in window,tt=X&&!document.addEventListener,et="msLaunchUri"in navigator&&!("documentMode"in document),nt=It("webkit"),it=It("android"),ot=It("android 2")||It("android 3"),st=parseInt(/WebKit\/([0-9]+)|$/.exec(navigator.userAgent)[1],10),rt=it&&It("Google")&&st<537&&!("AudioNode"in window),at=!!window.opera,lt=It("chrome"),ht=It("gecko")&&!nt&&!at&&!X,ut=!lt&&It("safari"),ct=It("phantom"),dt="OTransition"in Q,pt=0===navigator.platform.indexOf("Win"),ft=X&&"transition"in Q,_t="WebKitCSSMatrix"in window&&"m11"in new window.WebKitCSSMatrix&&!ot,mt="MozPerspective"in Q,gt=!window.L_DISABLE_3D&&(ft||_t||mt)&&!dt&&!ct,vt="undefined"!=typeof orientation||It("mobile"),yt=vt&&nt,wt=vt&&_t,bt=!window.PointerEvent&&window.MSPointerEvent,xt=!(!window.PointerEvent&&!bt),Tt=!window.L_NO_TOUCH&&(xt||"ontouchstart"in window||window.DocumentTouch&&document instanceof window.DocumentTouch),Et=vt&&at,Ct=vt&&ht,Pt=(window.devicePixelRatio||window.screen.deviceXDPI/window.screen.logicalXDPI)>1,St=!!document.createElement("canvas").getContext,Lt=!(!document.createElementNS||!Y("svg").createSVGRect),kt=!Lt&&function(){try{var t=document.createElement("div");t.innerHTML='<v:shape adj="1"/>';var e=t.firstChild;return e.style.behavior="url(#default#VML)",e&&"object"==typeof e.adj}catch(n){return!1}}();function It(t){return navigator.userAgent.toLowerCase().indexOf(t)>=0}var Mt=(Object.freeze||Object)({ie:X,ielt9:tt,edge:et,webkit:nt,android:it,android23:ot,androidStock:rt,opera:at,chrome:lt,gecko:ht,safari:ut,phantom:ct,opera12:dt,win:pt,ie3d:ft,webkit3d:_t,gecko3d:mt,any3d:gt,mobile:vt,mobileWebkit:yt,mobileWebkit3d:wt,msPointer:bt,pointer:xt,touch:Tt,mobileOpera:Et,mobileGecko:Ct,retina:Pt,canvas:St,svg:Lt,vml:kt}),At=bt?"MSPointerDown":"pointerdown",Nt=bt?"MSPointerMove":"pointermove",Ot=bt?"MSPointerUp":"pointerup",zt=bt?"MSPointerCancel":"pointercancel",Dt=["INPUT","SELECT","OPTION"],Rt={},Zt=!1,Bt=0;function jt(t){Rt[t.pointerId]=t,Bt++}function Vt(t){Rt[t.pointerId]&&(Rt[t.pointerId]=t)}function Ht(t){delete Rt[t.pointerId],Bt--}function Ft(t,e){for(var n in t.touches=[],Rt)t.touches.push(Rt[n]);t.changedTouches=[t],e(t)}var Ut=bt?"MSPointerDown":xt?"pointerdown":"touchstart",Wt=bt?"MSPointerUp":xt?"pointerup":"touchend",qt="_leaflet_";function $t(t,e,n){var i,o,s=!1;function r(t){var e;if(xt){if(!et||"mouse"===t.pointerType)return;e=Bt}else e=t.touches.length;if(!(e>1)){var n=Date.now(),r=n-(i||n);o=t.touches?t.touches[0]:t,s=r>0&&r<=250,i=n}}function a(t){if(s&&!o.cancelBubble){if(xt){if(!et||"mouse"===t.pointerType)return;var n,r,a={};for(r in o)a[r]=(n=o[r])&&n.bind?n.bind(o):n;o=a}o.type="dblclick",o.button=0,e(o),i=null}}return t[qt+Ut+n]=r,t[qt+Wt+n]=a,t[qt+"dblclick"+n]=e,t.addEventListener(Ut,r,!1),t.addEventListener(Wt,a,!1),t.addEventListener("dblclick",e,!1),this}function Gt(t,e){var n=t[qt+Wt+e],i=t[qt+"dblclick"+e];return t.removeEventListener(Ut,t[qt+Ut+e],!1),t.removeEventListener(Wt,n,!1),et||t.removeEventListener("dblclick",i,!1),this}var Kt,Yt,Jt,Qt,Xt,te=me(["transform","webkitTransform","OTransform","MozTransform","msTransform"]),ee=me(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),ne="webkitTransition"===ee||"OTransition"===ee?ee+"End":"transitionend";function ie(t){return"string"==typeof t?document.getElementById(t):t}function oe(t,e){var n=t.style[e]||t.currentStyle&&t.currentStyle[e];if((!n||"auto"===n)&&document.defaultView){var i=document.defaultView.getComputedStyle(t,null);n=i?i[e]:null}return"auto"===n?null:n}function se(t,e,n){var i=document.createElement(t);return i.className=e||"",n&&n.appendChild(i),i}function re(t){var e=t.parentNode;e&&e.removeChild(t)}function ae(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function le(t){var e=t.parentNode;e&&e.lastChild!==t&&e.appendChild(t)}function he(t){var e=t.parentNode;e&&e.firstChild!==t&&e.insertBefore(t,e.firstChild)}function ue(t,e){if(void 0!==t.classList)return t.classList.contains(e);var n=fe(t);return n.length>0&&new RegExp("(^|\\s)"+e+"(\\s|$)").test(n)}function ce(t,e){if(void 0!==t.classList)for(var n=d(e),i=0,o=n.length;i<o;i++)t.classList.add(n[i]);else if(!ue(t,e)){var s=fe(t);pe(t,(s?s+" ":"")+e)}}function de(t,e){void 0!==t.classList?t.classList.remove(e):pe(t,c((" "+fe(t)+" ").replace(" "+e+" "," ")))}function pe(t,e){void 0===t.className.baseVal?t.className=e:t.className.baseVal=e}function fe(t){return t.correspondingElement&&(t=t.correspondingElement),void 0===t.className.baseVal?t.className:t.className.baseVal}function _e(t,e){"opacity"in t.style?t.style.opacity=e:"filter"in t.style&&function(t,e){var n=!1,i="DXImageTransform.Microsoft.Alpha";try{n=t.filters.item(i)}catch(o){if(1===e)return}e=Math.round(100*e),n?(n.Enabled=100!==e,n.Opacity=e):t.style.filter+=" progid:"+i+"(opacity="+e+")"}(t,e)}function me(t){for(var e=document.documentElement.style,n=0;n<t.length;n++)if(t[n]in e)return t[n];return!1}function ge(t,e,n){var i=e||new A(0,0);t.style[te]=(ft?"translate("+i.x+"px,"+i.y+"px)":"translate3d("+i.x+"px,"+i.y+"px,0)")+(n?" scale("+n+")":"")}function ve(t,e){t._leaflet_pos=e,gt?ge(t,e):(t.style.left=e.x+"px",t.style.top=e.y+"px")}function ye(t){return t._leaflet_pos||new A(0,0)}if("onselectstart"in document)Kt=function(){Le(window,"selectstart",De)},Yt=function(){Ie(window,"selectstart",De)};else{var we=me(["userSelect","WebkitUserSelect","OUserSelect","MozUserSelect","msUserSelect"]);Kt=function(){if(we){var t=document.documentElement.style;Jt=t[we],t[we]="none"}},Yt=function(){we&&(document.documentElement.style[we]=Jt,Jt=void 0)}}function be(){Le(window,"dragstart",De)}function xe(){Ie(window,"dragstart",De)}function Te(t){for(;-1===t.tabIndex;)t=t.parentNode;t.style&&(Ee(),Qt=t,Xt=t.style.outline,t.style.outline="none",Le(window,"keydown",Ee))}function Ee(){Qt&&(Qt.style.outline=Xt,Qt=void 0,Xt=void 0,Ie(window,"keydown",Ee))}function Ce(t){do{t=t.parentNode}while(!(t.offsetWidth&&t.offsetHeight||t===document.body));return t}function Pe(t){var e=t.getBoundingClientRect();return{x:e.width/t.offsetWidth||1,y:e.height/t.offsetHeight||1,boundingClientRect:e}}var Se=(Object.freeze||Object)({TRANSFORM:te,TRANSITION:ee,TRANSITION_END:ne,get:ie,getStyle:oe,create:se,remove:re,empty:ae,toFront:le,toBack:he,hasClass:ue,addClass:ce,removeClass:de,setClass:pe,getClass:fe,setOpacity:_e,testProp:me,setTransform:ge,setPosition:ve,getPosition:ye,disableTextSelection:Kt,enableTextSelection:Yt,disableImageDrag:be,enableImageDrag:xe,preventOutline:Te,restoreOutline:Ee,getSizedParentNode:Ce,getScale:Pe});function Le(t,e,n,i){if("object"==typeof e)for(var o in e)Me(t,o,e[o],n);else for(var s=0,r=(e=d(e)).length;s<r;s++)Me(t,e[s],n,i);return this}var ke="_leaflet_events";function Ie(t,e,n,i){if("object"==typeof e)for(var o in e)Ae(t,o,e[o],n);else if(e)for(var s=0,r=(e=d(e)).length;s<r;s++)Ae(t,e[s],n,i);else{for(var a in t[ke])Ae(t,a,t[ke][a]);delete t[ke]}return this}function Me(t,e,n,i){var s=e+r(n)+(i?"_"+r(i):"");if(t[ke]&&t[ke][s])return this;var a=function(e){return n.call(i||t,e||window.event)},l=a;xt&&0===e.indexOf("touch")?function(t,e,n,i){"touchstart"===e?function(t,e,n){var i=o((function(t){if("mouse"!==t.pointerType&&t.MSPOINTER_TYPE_MOUSE&&t.pointerType!==t.MSPOINTER_TYPE_MOUSE){if(!(Dt.indexOf(t.target.tagName)<0))return;De(t)}Ft(t,e)}));t["_leaflet_touchstart"+n]=i,t.addEventListener(At,i,!1),Zt||(document.documentElement.addEventListener(At,jt,!0),document.documentElement.addEventListener(Nt,Vt,!0),document.documentElement.addEventListener(Ot,Ht,!0),document.documentElement.addEventListener(zt,Ht,!0),Zt=!0)}(t,n,i):"touchmove"===e?function(t,e,n){var i=function(t){(t.pointerType!==t.MSPOINTER_TYPE_MOUSE&&"mouse"!==t.pointerType||0!==t.buttons)&&Ft(t,e)};t["_leaflet_touchmove"+n]=i,t.addEventListener(Nt,i,!1)}(t,n,i):"touchend"===e&&function(t,e,n){var i=function(t){Ft(t,e)};t["_leaflet_touchend"+n]=i,t.addEventListener(Ot,i,!1),t.addEventListener(zt,i,!1)}(t,n,i)}(t,e,a,s):!Tt||"dblclick"!==e||!$t||xt&&lt?"addEventListener"in t?"mousewheel"===e?t.addEventListener("onwheel"in t?"wheel":"mousewheel",a,!1):"mouseenter"===e||"mouseleave"===e?t.addEventListener("mouseenter"===e?"mouseover":"mouseout",a=function(e){e=e||window.event,We(t,e)&&l(e)},!1):("click"===e&&it&&(a=function(t){!function(t,e){var n=t.timeStamp||t.originalEvent&&t.originalEvent.timeStamp,i=Ve&&n-Ve;i&&i>100&&i<500||t.target._simulatedClick&&!t._simulated?Re(t):(Ve=n,e(t))}(t,l)}),t.addEventListener(e,a,!1)):"attachEvent"in t&&t.attachEvent("on"+e,a):$t(t,a,s),t[ke]=t[ke]||{},t[ke][s]=a}function Ae(t,e,n,i){var o=e+r(n)+(i?"_"+r(i):""),s=t[ke]&&t[ke][o];if(!s)return this;xt&&0===e.indexOf("touch")?function(t,e,n){var i=t["_leaflet_"+e+n];"touchstart"===e?t.removeEventListener(At,i,!1):"touchmove"===e?t.removeEventListener(Nt,i,!1):"touchend"===e&&(t.removeEventListener(Ot,i,!1),t.removeEventListener(zt,i,!1))}(t,e,o):!Tt||"dblclick"!==e||!Gt||xt&&lt?"removeEventListener"in t?t.removeEventListener("mousewheel"===e?"onwheel"in t?"wheel":"mousewheel":"mouseenter"===e?"mouseover":"mouseleave"===e?"mouseout":e,s,!1):"detachEvent"in t&&t.detachEvent("on"+e,s):Gt(t,o),t[ke][o]=null}function Ne(t){return t.stopPropagation?t.stopPropagation():t.originalEvent?t.originalEvent._stopped=!0:t.cancelBubble=!0,Ue(t),this}function Oe(t){return Me(t,"mousewheel",Ne),this}function ze(t){return Le(t,"mousedown touchstart dblclick",Ne),Me(t,"click",Fe),this}function De(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this}function Re(t){return De(t),Ne(t),this}function Ze(t,e){if(!e)return new A(t.clientX,t.clientY);var n=Pe(e),i=n.boundingClientRect;return new A((t.clientX-i.left)/n.x-e.clientLeft,(t.clientY-i.top)/n.y-e.clientTop)}var Be=pt&&lt?2*window.devicePixelRatio:ht?window.devicePixelRatio:1;function je(t){return et?t.wheelDeltaY/2:t.deltaY&&0===t.deltaMode?-t.deltaY/Be:t.deltaY&&1===t.deltaMode?20*-t.deltaY:t.deltaY&&2===t.deltaMode?60*-t.deltaY:t.deltaX||t.deltaZ?0:t.wheelDelta?(t.wheelDeltaY||t.wheelDelta)/2:t.detail&&Math.abs(t.detail)<32765?20*-t.detail:t.detail?t.detail/-32765*60:0}var Ve,He={};function Fe(t){He[t.type]=!0}function Ue(t){var e=He[t.type];return He[t.type]=!1,e}function We(t,e){var n=e.relatedTarget;if(!n)return!0;try{for(;n&&n!==t;)n=n.parentNode}catch(i){return!1}return n!==t}var qe=(Object.freeze||Object)({on:Le,off:Ie,stopPropagation:Ne,disableScrollPropagation:Oe,disableClickPropagation:ze,preventDefault:De,stop:Re,getMousePosition:Ze,getWheelDelta:je,fakeStop:Fe,skipped:Ue,isExternalTarget:We,addListener:Le,removeListener:Ie}),$e=M.extend({run:function(t,e,n,i){this.stop(),this._el=t,this._inProgress=!0,this._duration=n||.25,this._easeOutPower=1/Math.max(i||.5,.2),this._startPos=ye(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(!0),this._complete())},_animate:function(){this._animId=C(this._animate,this),this._step()},_step:function(t){var e=+new Date-this._startTime,n=1e3*this._duration;e<n?this._runFrame(this._easeOut(e/n),t):(this._runFrame(1),this._complete())},_runFrame:function(t,e){var n=this._startPos.add(this._offset.multiplyBy(t));e&&n._round(),ve(this._el,n),this.fire("step")},_complete:function(){P(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),Ge=M.extend({options:{crs:G,center:void 0,zoom:void 0,minZoom:void 0,maxZoom:void 0,layers:[],maxBounds:void 0,renderer:void 0,zoomAnimation:!0,zoomAnimationThreshold:4,fadeAnimation:!0,markerZoomAnimation:!0,transform3DLimit:8388608,zoomSnap:1,zoomDelta:1,trackResize:!0},initialize:function(t,e){e=p(this,e),this._handlers=[],this._layers={},this._zoomBoundLayers={},this._sizeChanged=!0,this._initContainer(t),this._initLayout(),this._onResize=o(this._onResize,this),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),void 0!==e.zoom&&(this._zoom=this._limitZoom(e.zoom)),e.center&&void 0!==e.zoom&&this.setView(j(e.center),e.zoom,{reset:!0}),this.callInitHooks(),this._zoomAnimated=ee&&gt&&!Et&&this.options.zoomAnimation,this._zoomAnimated&&(this._createAnimProxy(),Le(this._proxy,ne,this._catchTransitionEnd,this)),this._addLayers(this.options.layers)},setView:function(t,e,i){return e=void 0===e?this._zoom:this._limitZoom(e),t=this._limitCenter(j(t),e,this.options.maxBounds),i=i||{},this._stop(),this._loaded&&!i.reset&&!0!==i&&(void 0!==i.animate&&(i.zoom=n({animate:i.animate},i.zoom),i.pan=n({animate:i.animate,duration:i.duration},i.pan)),this._zoom!==e?this._tryAnimatedZoom&&this._tryAnimatedZoom(t,e,i.zoom):this._tryAnimatedPan(t,i.pan))?(clearTimeout(this._sizeTimer),this):(this._resetView(t,e),this)},setZoom:function(t,e){return this._loaded?this.setView(this.getCenter(),t,{zoom:e}):(this._zoom=t,this)},zoomIn:function(t,e){return this.setZoom(this._zoom+(t=t||(gt?this.options.zoomDelta:1)),e)},zoomOut:function(t,e){return this.setZoom(this._zoom-(t=t||(gt?this.options.zoomDelta:1)),e)},setZoomAround:function(t,e,n){var i=this.getZoomScale(e),o=this.getSize().divideBy(2),s=(t instanceof A?t:this.latLngToContainerPoint(t)).subtract(o).multiplyBy(1-1/i),r=this.containerPointToLatLng(o.add(s));return this.setView(r,e,{zoom:n})},_getBoundsCenterZoom:function(t,e){e=e||{},t=t.getBounds?t.getBounds():Z(t);var n=O(e.paddingTopLeft||e.padding||[0,0]),i=O(e.paddingBottomRight||e.padding||[0,0]),o=this.getBoundsZoom(t,!1,n.add(i));if((o="number"==typeof e.maxZoom?Math.min(e.maxZoom,o):o)===1/0)return{center:t.getCenter(),zoom:o};var s=i.subtract(n).divideBy(2),r=this.project(t.getSouthWest(),o),a=this.project(t.getNorthEast(),o);return{center:this.unproject(r.add(a).divideBy(2).add(s),o),zoom:o}},fitBounds:function(t,e){if(!(t=Z(t)).isValid())throw new Error("Bounds are not valid.");var n=this._getBoundsCenterZoom(t,e);return this.setView(n.center,n.zoom,e)},fitWorld:function(t){return this.fitBounds([[-90,-180],[90,180]],t)},panTo:function(t,e){return this.setView(t,this._zoom,{pan:e})},panBy:function(t,e){if(e=e||{},!(t=O(t).round()).x&&!t.y)return this.fire("moveend");if(!0!==e.animate&&!this.getSize().contains(t))return this._resetView(this.unproject(this.project(this.getCenter()).add(t)),this.getZoom()),this;if(this._panAnim||(this._panAnim=new $e,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),e.noMoveStart||this.fire("movestart"),!1!==e.animate){ce(this._mapPane,"leaflet-pan-anim");var n=this._getMapPanePos().subtract(t).round();this._panAnim.run(this._mapPane,n,e.duration||.25,e.easeLinearity)}else this._rawPanBy(t),this.fire("move").fire("moveend");return this},flyTo:function(t,e,n){if(!1===(n=n||{}).animate||!gt)return this.setView(t,e,n);this._stop();var i=this.project(this.getCenter()),o=this.project(t),s=this.getSize(),r=this._zoom;t=j(t),e=void 0===e?r:e;var a=Math.max(s.x,s.y),l=a*this.getZoomScale(r,e),h=o.distanceTo(i)||1;function u(t){var e=(l*l-a*a+2.0164*(t?-1:1)*2.0164*h*h)/(2*(t?l:a)*2.0164*h),n=Math.sqrt(e*e+1)-e;return n<1e-9?-18:Math.log(n)}function c(t){return(Math.exp(t)-Math.exp(-t))/2}function d(t){return(Math.exp(t)+Math.exp(-t))/2}var p=u(0),f=Date.now(),_=(u(1)-p)/1.42,m=n.duration?1e3*n.duration:1e3*_*.8;return this._moveStart(!0,n.noMoveStart),(function n(){var s=(Date.now()-f)/m,l=function(t){return 1-Math.pow(1-t,1.5)}(s)*_;s<=1?(this._flyToFrame=C(n,this),this._move(this.unproject(i.add(o.subtract(i).multiplyBy(function(t){return a*(d(p)*(c(e=p+1.42*t)/d(e))-c(p))/2.0164;var e}(l)/h)),r),this.getScaleZoom(a/function(t){return a*(d(p)/d(p+1.42*t))}(l),r),{flyTo:!0})):this._move(t,e)._moveEnd(!0)}).call(this),this},flyToBounds:function(t,e){var n=this._getBoundsCenterZoom(t,e);return this.flyTo(n.center,n.zoom,e)},setMaxBounds:function(t){return(t=Z(t)).isValid()?(this.options.maxBounds&&this.off("moveend",this._panInsideMaxBounds),this.options.maxBounds=t,this._loaded&&this._panInsideMaxBounds(),this.on("moveend",this._panInsideMaxBounds)):(this.options.maxBounds=null,this.off("moveend",this._panInsideMaxBounds))},setMinZoom:function(t){var e=this.options.minZoom;return this.options.minZoom=t,this._loaded&&e!==t&&(this.fire("zoomlevelschange"),this.getZoom()<this.options.minZoom)?this.setZoom(t):this},setMaxZoom:function(t){var e=this.options.maxZoom;return this.options.maxZoom=t,this._loaded&&e!==t&&(this.fire("zoomlevelschange"),this.getZoom()>this.options.maxZoom)?this.setZoom(t):this},panInsideBounds:function(t,e){this._enforcingBounds=!0;var n=this.getCenter(),i=this._limitCenter(n,this._zoom,Z(t));return n.equals(i)||this.panTo(i,e),this._enforcingBounds=!1,this},panInside:function(t,e){var n=O((e=e||{}).paddingTopLeft||e.padding||[0,0]),i=O(e.paddingBottomRight||e.padding||[0,0]),o=this.getCenter(),s=this.project(o),r=this.project(t),a=this.getPixelBounds(),l=a.getSize().divideBy(2),h=D([a.min.add(n),a.max.subtract(i)]);if(!h.contains(r)){this._enforcingBounds=!0;var u=s.subtract(r),c=O(r.x+u.x,r.y+u.y);(r.x<h.min.x||r.x>h.max.x)&&(c.x=s.x-u.x,u.x>0?c.x+=l.x-n.x:c.x-=l.x-i.x),(r.y<h.min.y||r.y>h.max.y)&&(c.y=s.y-u.y,u.y>0?c.y+=l.y-n.y:c.y-=l.y-i.y),this.panTo(this.unproject(c),e),this._enforcingBounds=!1}return this},invalidateSize:function(t){if(!this._loaded)return this;t=n({animate:!1,pan:!0},!0===t?{animate:!0}:t);var e=this.getSize();this._sizeChanged=!0,this._lastCenter=null;var i=this.getSize(),s=e.divideBy(2).round(),r=i.divideBy(2).round(),a=s.subtract(r);return a.x||a.y?(t.animate&&t.pan?this.panBy(a):(t.pan&&this._rawPanBy(a),this.fire("move"),t.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(o(this.fire,this,"moveend"),200)):this.fire("moveend")),this.fire("resize",{oldSize:e,newSize:i})):this},stop:function(){return this.setZoom(this._limitZoom(this._zoom)),this.options.zoomSnap||this.fire("viewreset"),this._stop()},locate:function(t){if(t=this._locateOptions=n({timeout:1e4,watch:!1},t),!("geolocation"in navigator))return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var e=o(this._handleGeolocationResponse,this),i=o(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var e=t.code,n=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout");this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+n+"."})},_handleGeolocationResponse:function(t){var e=new B(t.coords.latitude,t.coords.longitude),n=e.toBounds(2*t.coords.accuracy),i=this._locateOptions;if(i.setView){var o=this.getBoundsZoom(n);this.setView(e,i.maxZoom?Math.min(o,i.maxZoom):o)}var s={latlng:e,bounds:n,timestamp:t.timestamp};for(var r in t.coords)"number"==typeof t.coords[r]&&(s[r]=t.coords[r]);this.fire("locationfound",s)},addHandler:function(t,e){if(!e)return this;var n=this[t]=new e(this);return this._handlers.push(n),this.options[t]&&n.enable(),this},remove:function(){if(this._initEvents(!0),this._containerId!==this._container._leaflet_id)throw new Error("Map container is being reused by another instance");try{delete this._container._leaflet_id,delete this._containerId}catch(e){this._container._leaflet_id=void 0,this._containerId=void 0}var t;for(t in void 0!==this._locationWatchId&&this.stopLocate(),this._stop(),re(this._mapPane),this._clearControlPos&&this._clearControlPos(),this._resizeRequest&&(P(this._resizeRequest),this._resizeRequest=null),this._clearHandlers(),this._loaded&&this.fire("unload"),this._layers)this._layers[t].remove();for(t in this._panes)re(this._panes[t]);return this._layers=[],this._panes=[],delete this._mapPane,delete this._renderer,this},createPane:function(t,e){var n=se("div","leaflet-pane"+(t?" leaflet-"+t.replace("Pane","")+"-pane":""),e||this._mapPane);return t&&(this._panes[t]=n),n},getCenter:function(){return this._checkIfLoaded(),this._lastCenter&&!this._moved()?this._lastCenter:this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds();return new R(this.unproject(t.getBottomLeft()),this.unproject(t.getTopRight()))},getMinZoom:function(){return void 0===this.options.minZoom?this._layersMinZoom||0:this.options.minZoom},getMaxZoom:function(){return void 0===this.options.maxZoom?void 0===this._layersMaxZoom?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,e,n){t=Z(t),n=O(n||[0,0]);var i=this.getZoom()||0,o=this.getMinZoom(),s=this.getMaxZoom(),r=t.getNorthWest(),a=t.getSouthEast(),l=this.getSize().subtract(n),h=D(this.project(a,i),this.project(r,i)).getSize(),u=gt?this.options.zoomSnap:1,c=l.x/h.x,d=l.y/h.y,p=e?Math.max(c,d):Math.min(c,d);return i=this.getScaleZoom(p,i),u&&(i=Math.round(i/(u/100))*(u/100),i=e?Math.ceil(i/u)*u:Math.floor(i/u)*u),Math.max(o,Math.min(s,i))},getSize:function(){return this._size&&!this._sizeChanged||(this._size=new A(this._container.clientWidth||0,this._container.clientHeight||0),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(t,e){var n=this._getTopLeftPoint(t,e);return new z(n,n.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._pixelOrigin},getPixelWorldBounds:function(t){return this.options.crs.getProjectedBounds(void 0===t?this.getZoom():t)},getPane:function(t){return"string"==typeof t?this._panes[t]:t},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t,e){var n=this.options.crs;return e=void 0===e?this._zoom:e,n.scale(t)/n.scale(e)},getScaleZoom:function(t,e){var n=this.options.crs,i=n.zoom(t*n.scale(e=void 0===e?this._zoom:e));return isNaN(i)?1/0:i},project:function(t,e){return e=void 0===e?this._zoom:e,this.options.crs.latLngToPoint(j(t),e)},unproject:function(t,e){return e=void 0===e?this._zoom:e,this.options.crs.pointToLatLng(O(t),e)},layerPointToLatLng:function(t){var e=O(t).add(this.getPixelOrigin());return this.unproject(e)},latLngToLayerPoint:function(t){return this.project(j(t))._round()._subtract(this.getPixelOrigin())},wrapLatLng:function(t){return this.options.crs.wrapLatLng(j(t))},wrapLatLngBounds:function(t){return this.options.crs.wrapLatLngBounds(Z(t))},distance:function(t,e){return this.options.crs.distance(j(t),j(e))},containerPointToLayerPoint:function(t){return O(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return O(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var e=this.containerPointToLayerPoint(O(t));return this.layerPointToLatLng(e)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(j(t)))},mouseEventToContainerPoint:function(t){return Ze(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var e=this._container=ie(t);if(!e)throw new Error("Map container not found.");if(e._leaflet_id)throw new Error("Map container is already initialized.");Le(e,"scroll",this._onScroll,this),this._containerId=r(e)},_initLayout:function(){var t=this._container;this._fadeAnimated=this.options.fadeAnimation&&gt,ce(t,"leaflet-container"+(Tt?" leaflet-touch":"")+(Pt?" leaflet-retina":"")+(tt?" leaflet-oldie":"")+(ut?" leaflet-safari":"")+(this._fadeAnimated?" leaflet-fade-anim":""));var e=oe(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._paneRenderers={},this._mapPane=this.createPane("mapPane",this._container),ve(this._mapPane,new A(0,0)),this.createPane("tilePane"),this.createPane("shadowPane"),this.createPane("overlayPane"),this.createPane("markerPane"),this.createPane("tooltipPane"),this.createPane("popupPane"),this.options.markerZoomAnimation||(ce(t.markerPane,"leaflet-zoom-hide"),ce(t.shadowPane,"leaflet-zoom-hide"))},_resetView:function(t,e){ve(this._mapPane,new A(0,0));var n=!this._loaded;this._loaded=!0,e=this._limitZoom(e),this.fire("viewprereset");var i=this._zoom!==e;this._moveStart(i,!1)._move(t,e)._moveEnd(i),this.fire("viewreset"),n&&this.fire("load")},_moveStart:function(t,e){return t&&this.fire("zoomstart"),e||this.fire("movestart"),this},_move:function(t,e,n){void 0===e&&(e=this._zoom);var i=this._zoom!==e;return this._zoom=e,this._lastCenter=t,this._pixelOrigin=this._getNewPixelOrigin(t),(i||n&&n.pinch)&&this.fire("zoom",n),this.fire("move",n)},_moveEnd:function(t){return t&&this.fire("zoomend"),this.fire("moveend")},_stop:function(){return P(this._flyToFrame),this._panAnim&&this._panAnim.stop(),this},_rawPanBy:function(t){ve(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_panInsideMaxBounds:function(){this._enforcingBounds||this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(t){this._targets={},this._targets[r(this._container)]=this;var e=t?Ie:Le;e(this._container,"click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress keydown keyup",this._handleDOMEvent,this),this.options.trackResize&&e(window,"resize",this._onResize,this),gt&&this.options.transform3DLimit&&(t?this.off:this.on).call(this,"moveend",this._onMoveEnd)},_onResize:function(){P(this._resizeRequest),this._resizeRequest=C((function(){this.invalidateSize({debounceMoveend:!0})}),this)},_onScroll:function(){this._container.scrollTop=0,this._container.scrollLeft=0},_onMoveEnd:function(){var t=this._getMapPanePos();Math.max(Math.abs(t.x),Math.abs(t.y))>=this.options.transform3DLimit&&this._resetView(this.getCenter(),this.getZoom())},_findEventTargets:function(t,e){for(var n,i=[],o="mouseout"===e||"mouseover"===e,s=t.target||t.srcElement,a=!1;s;){if((n=this._targets[r(s)])&&("click"===e||"preclick"===e)&&!t._simulated&&this._draggableMoved(n)){a=!0;break}if(n&&n.listens(e,!0)){if(o&&!We(s,t))break;if(i.push(n),o)break}if(s===this._container)break;s=s.parentNode}return i.length||a||o||!We(s,t)||(i=[this]),i},_handleDOMEvent:function(t){if(this._loaded&&!Ue(t)){var e=t.type;"mousedown"!==e&&"keypress"!==e&&"keyup"!==e&&"keydown"!==e||Te(t.target||t.srcElement),this._fireDOMEvent(t,e)}},_mouseEvents:["click","dblclick","mouseover","mouseout","contextmenu"],_fireDOMEvent:function(t,e,i){if("click"===t.type){var o=n({},t);o.type="preclick",this._fireDOMEvent(o,o.type,i)}if(!t._stopped&&(i=(i||[]).concat(this._findEventTargets(t,e))).length){var s=i[0];"contextmenu"===e&&s.listens(e,!0)&&De(t);var r={originalEvent:t};if("keypress"!==t.type&&"keydown"!==t.type&&"keyup"!==t.type){var a=s.getLatLng&&(!s._radius||s._radius<=10);r.containerPoint=a?this.latLngToContainerPoint(s.getLatLng()):this.mouseEventToContainerPoint(t),r.layerPoint=this.containerPointToLayerPoint(r.containerPoint),r.latlng=a?s.getLatLng():this.layerPointToLatLng(r.layerPoint)}for(var l=0;l<i.length;l++)if(i[l].fire(e,r,!0),r.originalEvent._stopped||!1===i[l].options.bubblingMouseEvents&&-1!==v(this._mouseEvents,e))return}},_draggableMoved:function(t){return(t=t.dragging&&t.dragging.enabled()?t:this).dragging&&t.dragging.moved()||this.boxZoom&&this.boxZoom.moved()},_clearHandlers:function(){for(var t=0,e=this._handlers.length;t<e;t++)this._handlers[t].disable()},whenReady:function(t,e){return this._loaded?t.call(e||this,{target:this}):this.on("load",t,e),this},_getMapPanePos:function(){return ye(this._mapPane)||new A(0,0)},_moved:function(){var t=this._getMapPanePos();return t&&!t.equals([0,0])},_getTopLeftPoint:function(t,e){return(t&&void 0!==e?this._getNewPixelOrigin(t,e):this.getPixelOrigin()).subtract(this._getMapPanePos())},_getNewPixelOrigin:function(t,e){var n=this.getSize()._divideBy(2);return this.project(t,e)._subtract(n)._add(this._getMapPanePos())._round()},_latLngToNewLayerPoint:function(t,e,n){var i=this._getNewPixelOrigin(n,e);return this.project(t,e)._subtract(i)},_latLngBoundsToNewLayerBounds:function(t,e,n){var i=this._getNewPixelOrigin(n,e);return D([this.project(t.getSouthWest(),e)._subtract(i),this.project(t.getNorthWest(),e)._subtract(i),this.project(t.getSouthEast(),e)._subtract(i),this.project(t.getNorthEast(),e)._subtract(i)])},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitCenter:function(t,e,n){if(!n)return t;var i=this.project(t,e),o=this.getSize().divideBy(2),s=new z(i.subtract(o),i.add(o)),r=this._getBoundsOffset(s,n,e);return r.round().equals([0,0])?t:this.unproject(i.add(r),e)},_limitOffset:function(t,e){if(!e)return t;var n=this.getPixelBounds(),i=new z(n.min.add(t),n.max.add(t));return t.add(this._getBoundsOffset(i,e))},_getBoundsOffset:function(t,e,n){var i=D(this.project(e.getNorthEast(),n),this.project(e.getSouthWest(),n)),o=i.min.subtract(t.min),s=i.max.subtract(t.max);return new A(this._rebound(o.x,-s.x),this._rebound(o.y,-s.y))},_rebound:function(t,e){return t+e>0?Math.round(t-e)/2:Math.max(0,Math.ceil(t))-Math.max(0,Math.floor(e))},_limitZoom:function(t){var e=this.getMinZoom(),n=this.getMaxZoom(),i=gt?this.options.zoomSnap:1;return i&&(t=Math.round(t/i)*i),Math.max(e,Math.min(n,t))},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){de(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_tryAnimatedPan:function(t,e){var n=this._getCenterOffset(t)._trunc();return!(!0!==(e&&e.animate)&&!this.getSize().contains(n)||(this.panBy(n,e),0))},_createAnimProxy:function(){var t=this._proxy=se("div","leaflet-proxy leaflet-zoom-animated");this._panes.mapPane.appendChild(t),this.on("zoomanim",(function(t){var e=te,n=this._proxy.style[e];ge(this._proxy,this.project(t.center,t.zoom),this.getZoomScale(t.zoom,1)),n===this._proxy.style[e]&&this._animatingZoom&&this._onZoomTransitionEnd()}),this),this.on("load moveend",(function(){var t=this.getCenter(),e=this.getZoom();ge(this._proxy,this.project(t,e),this.getZoomScale(e,1))}),this),this._on("unload",this._destroyAnimProxy,this)},_destroyAnimProxy:function(){re(this._proxy),delete this._proxy},_catchTransitionEnd:function(t){this._animatingZoom&&t.propertyName.indexOf("transform")>=0&&this._onZoomTransitionEnd()},_nothingToAnimate:function(){return!this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(t,e,n){if(this._animatingZoom)return!0;if(n=n||{},!this._zoomAnimated||!1===n.animate||this._nothingToAnimate()||Math.abs(e-this._zoom)>this.options.zoomAnimationThreshold)return!1;var i=this.getZoomScale(e),o=this._getCenterOffset(t)._divideBy(1-1/i);return!(!0!==n.animate&&!this.getSize().contains(o)||(C((function(){this._moveStart(!0,!1)._animateZoom(t,e,!0)}),this),0))},_animateZoom:function(t,e,n,i){this._mapPane&&(n&&(this._animatingZoom=!0,this._animateToCenter=t,this._animateToZoom=e,ce(this._mapPane,"leaflet-zoom-anim")),this.fire("zoomanim",{center:t,zoom:e,noUpdate:i}),setTimeout(o(this._onZoomTransitionEnd,this),250))},_onZoomTransitionEnd:function(){this._animatingZoom&&(this._mapPane&&de(this._mapPane,"leaflet-zoom-anim"),this._animatingZoom=!1,this._move(this._animateToCenter,this._animateToZoom),C((function(){this._moveEnd(!0)}),this))}}),Ke=k.extend({options:{position:"topright"},initialize:function(t){p(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this.remove(),this._map=t;var e=this._container=this.onAdd(t),n=this.getPosition(),i=t._controlCorners[n];return ce(e,"leaflet-control"),-1!==n.indexOf("bottom")?i.insertBefore(e,i.firstChild):i.appendChild(e),this._map.on("unload",this.remove,this),this},remove:function(){return this._map?(re(this._container),this.onRemove&&this.onRemove(this._map),this._map.off("unload",this.remove,this),this._map=null,this):this},_refocusOnMap:function(t){this._map&&t&&t.screenX>0&&t.screenY>0&&this._map.getContainer().focus()}}),Ye=function(t){return new Ke(t)};Ge.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.remove(),this},_initControlPos:function(){var t=this._controlCorners={},e="leaflet-",n=this._controlContainer=se("div",e+"control-container",this._container);function i(i,o){t[i+o]=se("div",e+i+" "+e+o,n)}i("top","left"),i("top","right"),i("bottom","left"),i("bottom","right")},_clearControlPos:function(){for(var t in this._controlCorners)re(this._controlCorners[t]);re(this._controlContainer),delete this._controlCorners,delete this._controlContainer}});var Je=Ke.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0,hideSingleBase:!1,sortLayers:!1,sortFunction:function(t,e,n,i){return n<i?-1:i<n?1:0}},initialize:function(t,e,n){for(var i in p(this,n),this._layerControlInputs=[],this._layers=[],this._lastZIndex=0,this._handlingClick=!1,t)this._addLayer(t[i],i);for(i in e)this._addLayer(e[i],i,!0)},onAdd:function(t){this._initLayout(),this._update(),this._map=t,t.on("zoomend",this._checkDisabledLayers,this);for(var e=0;e<this._layers.length;e++)this._layers[e].layer.on("add remove",this._onLayerChange,this);return this._container},addTo:function(t){return Ke.prototype.addTo.call(this,t),this._expandIfNotCollapsed()},onRemove:function(){this._map.off("zoomend",this._checkDisabledLayers,this);for(var t=0;t<this._layers.length;t++)this._layers[t].layer.off("add remove",this._onLayerChange,this)},addBaseLayer:function(t,e){return this._addLayer(t,e),this._map?this._update():this},addOverlay:function(t,e){return this._addLayer(t,e,!0),this._map?this._update():this},removeLayer:function(t){t.off("add remove",this._onLayerChange,this);var e=this._getLayer(r(t));return e&&this._layers.splice(this._layers.indexOf(e),1),this._map?this._update():this},expand:function(){ce(this._container,"leaflet-control-layers-expanded"),this._section.style.height=null;var t=this._map.getSize().y-(this._container.offsetTop+50);return t<this._section.clientHeight?(ce(this._section,"leaflet-control-layers-scrollbar"),this._section.style.height=t+"px"):de(this._section,"leaflet-control-layers-scrollbar"),this._checkDisabledLayers(),this},collapse:function(){return de(this._container,"leaflet-control-layers-expanded"),this},_initLayout:function(){var t="leaflet-control-layers",e=this._container=se("div",t),n=this.options.collapsed;e.setAttribute("aria-haspopup",!0),ze(e),Oe(e);var i=this._section=se("section",t+"-list");n&&(this._map.on("click",this.collapse,this),it||Le(e,{mouseenter:this.expand,mouseleave:this.collapse},this));var o=this._layersLink=se("a",t+"-toggle",e);o.href="#",o.title="Layers",Tt?(Le(o,"click",Re),Le(o,"click",this.expand,this)):Le(o,"focus",this.expand,this),n||this.expand(),this._baseLayersList=se("div",t+"-base",i),this._separator=se("div",t+"-separator",i),this._overlaysList=se("div",t+"-overlays",i),e.appendChild(i)},_getLayer:function(t){for(var e=0;e<this._layers.length;e++)if(this._layers[e]&&r(this._layers[e].layer)===t)return this._layers[e]},_addLayer:function(t,e,n){this._map&&t.on("add remove",this._onLayerChange,this),this._layers.push({layer:t,name:e,overlay:n}),this.options.sortLayers&&this._layers.sort(o((function(t,e){return this.options.sortFunction(t.layer,e.layer,t.name,e.name)}),this)),this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex)),this._expandIfNotCollapsed()},_update:function(){if(!this._container)return this;ae(this._baseLayersList),ae(this._overlaysList),this._layerControlInputs=[];var t,e,n,i,o=0;for(n=0;n<this._layers.length;n++)this._addItem(i=this._layers[n]),e=e||i.overlay,t=t||!i.overlay,o+=i.overlay?0:1;return this.options.hideSingleBase&&(this._baseLayersList.style.display=(t=t&&o>1)?"":"none"),this._separator.style.display=e&&t?"":"none",this},_onLayerChange:function(t){this._handlingClick||this._update();var e=this._getLayer(r(t.target)),n=e.overlay?"add"===t.type?"overlayadd":"overlayremove":"add"===t.type?"baselayerchange":null;n&&this._map.fire(n,e)},_createRadioElement:function(t,e){var n='<input type="radio" class="leaflet-control-layers-selector" name="'+t+'"'+(e?' checked="checked"':"")+"/>",i=document.createElement("div");return i.innerHTML=n,i.firstChild},_addItem:function(t){var e,n=document.createElement("label"),i=this._map.hasLayer(t.layer);t.overlay?((e=document.createElement("input")).type="checkbox",e.className="leaflet-control-layers-selector",e.defaultChecked=i):e=this._createRadioElement("leaflet-base-layers_"+r(this),i),this._layerControlInputs.push(e),e.layerId=r(t.layer),Le(e,"click",this._onInputClick,this);var o=document.createElement("span");o.innerHTML=" "+t.name;var s=document.createElement("div");return n.appendChild(s),s.appendChild(e),s.appendChild(o),(t.overlay?this._overlaysList:this._baseLayersList).appendChild(n),this._checkDisabledLayers(),n},_onInputClick:function(){var t,e,n=this._layerControlInputs,i=[],o=[];this._handlingClick=!0;for(var s=n.length-1;s>=0;s--)e=this._getLayer((t=n[s]).layerId).layer,t.checked?i.push(e):t.checked||o.push(e);for(s=0;s<o.length;s++)this._map.hasLayer(o[s])&&this._map.removeLayer(o[s]);for(s=0;s<i.length;s++)this._map.hasLayer(i[s])||this._map.addLayer(i[s]);this._handlingClick=!1,this._refocusOnMap()},_checkDisabledLayers:function(){for(var t,e,n=this._layerControlInputs,i=this._map.getZoom(),o=n.length-1;o>=0;o--)e=this._getLayer((t=n[o]).layerId).layer,t.disabled=void 0!==e.options.minZoom&&i<e.options.minZoom||void 0!==e.options.maxZoom&&i>e.options.maxZoom},_expandIfNotCollapsed:function(){return this._map&&!this.options.collapsed&&this.expand(),this},_expand:function(){return this.expand()},_collapse:function(){return this.collapse()}}),Qe=Ke.extend({options:{position:"topleft",zoomInText:"+",zoomInTitle:"Zoom in",zoomOutText:"&#x2212;",zoomOutTitle:"Zoom out"},onAdd:function(t){var e="leaflet-control-zoom",n=se("div",e+" leaflet-bar"),i=this.options;return this._zoomInButton=this._createButton(i.zoomInText,i.zoomInTitle,e+"-in",n,this._zoomIn),this._zoomOutButton=this._createButton(i.zoomOutText,i.zoomOutTitle,e+"-out",n,this._zoomOut),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),n},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},disable:function(){return this._disabled=!0,this._updateDisabled(),this},enable:function(){return this._disabled=!1,this._updateDisabled(),this},_zoomIn:function(t){!this._disabled&&this._map._zoom<this._map.getMaxZoom()&&this._map.zoomIn(this._map.options.zoomDelta*(t.shiftKey?3:1))},_zoomOut:function(t){!this._disabled&&this._map._zoom>this._map.getMinZoom()&&this._map.zoomOut(this._map.options.zoomDelta*(t.shiftKey?3:1))},_createButton:function(t,e,n,i,o){var s=se("a",n,i);return s.innerHTML=t,s.href="#",s.title=e,s.setAttribute("role","button"),s.setAttribute("aria-label",e),ze(s),Le(s,"click",Re),Le(s,"click",o,this),Le(s,"click",this._refocusOnMap,this),s},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";de(this._zoomInButton,e),de(this._zoomOutButton,e),(this._disabled||t._zoom===t.getMinZoom())&&ce(this._zoomOutButton,e),(this._disabled||t._zoom===t.getMaxZoom())&&ce(this._zoomInButton,e)}});Ge.mergeOptions({zoomControl:!0}),Ge.addInitHook((function(){this.options.zoomControl&&(this.zoomControl=new Qe,this.addControl(this.zoomControl))}));var Xe=Ke.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0},onAdd:function(t){var e=se("div","leaflet-control-scale"),n=this.options;return this._addScales(n,"leaflet-control-scale-line",e),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),e},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,n){t.metric&&(this._mScale=se("div",e,n)),t.imperial&&(this._iScale=se("div",e,n))},_update:function(){var t=this._map,e=t.getSize().y/2,n=t.distance(t.containerPointToLatLng([0,e]),t.containerPointToLatLng([this.options.maxWidth,e]));this._updateScales(n)},_updateScales:function(t){this.options.metric&&t&&this._updateMetric(t),this.options.imperial&&t&&this._updateImperial(t)},_updateMetric:function(t){var e=this._getRoundNum(t);this._updateScale(this._mScale,e<1e3?e+" m":e/1e3+" km",e/t)},_updateImperial:function(t){var e,n,i,o=3.2808399*t;o>5280?(n=this._getRoundNum(e=o/5280),this._updateScale(this._iScale,n+" mi",n/e)):(i=this._getRoundNum(o),this._updateScale(this._iScale,i+" ft",i/o))},_updateScale:function(t,e,n){t.style.width=Math.round(this.options.maxWidth*n)+"px",t.innerHTML=e},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),n=t/e;return e*(n>=10?10:n>=5?5:n>=3?3:n>=2?2:1)}}),tn=Ke.extend({options:{position:"bottomright",prefix:'<a href="https://leafletjs.com" title="A JS library for interactive maps">Leaflet</a>'},initialize:function(t){p(this,t),this._attributions={}},onAdd:function(t){for(var e in t.attributionControl=this,this._container=se("div","leaflet-control-attribution"),ze(this._container),t._layers)t._layers[e].getAttribution&&this.addAttribution(t._layers[e].getAttribution());return this._update(),this._container},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):this},removeAttribution:function(t){return t?(this._attributions[t]&&(this._attributions[t]--,this._update()),this):this},_update:function(){if(this._map){var t=[];for(var e in this._attributions)this._attributions[e]&&t.push(e);var n=[];this.options.prefix&&n.push(this.options.prefix),t.length&&n.push(t.join(", ")),this._container.innerHTML=n.join(" | ")}}});Ge.mergeOptions({attributionControl:!0}),Ge.addInitHook((function(){this.options.attributionControl&&(new tn).addTo(this)})),Ke.Layers=Je,Ke.Zoom=Qe,Ke.Scale=Xe,Ke.Attribution=tn,Ye.layers=function(t,e,n){return new Je(t,e,n)},Ye.zoom=function(t){return new Qe(t)},Ye.scale=function(t){return new Xe(t)},Ye.attribution=function(t){return new tn(t)};var en=k.extend({initialize:function(t){this._map=t},enable:function(){return this._enabled?this:(this._enabled=!0,this.addHooks(),this)},disable:function(){return this._enabled?(this._enabled=!1,this.removeHooks(),this):this},enabled:function(){return!!this._enabled}});en.addTo=function(t,e){return t.addHandler(e,this),this};var nn,on={Events:I},sn=Tt?"touchstart mousedown":"mousedown",rn={mousedown:"mouseup",touchstart:"touchend",pointerdown:"touchend",MSPointerDown:"touchend"},an={mousedown:"mousemove",touchstart:"touchmove",pointerdown:"touchmove",MSPointerDown:"touchmove"},ln=M.extend({options:{clickTolerance:3},initialize:function(t,e,n,i){p(this,i),this._element=t,this._dragStartTarget=e||t,this._preventOutline=n},enable:function(){this._enabled||(Le(this._dragStartTarget,sn,this._onDown,this),this._enabled=!0)},disable:function(){this._enabled&&(ln._dragging===this&&this.finishDrag(),Ie(this._dragStartTarget,sn,this._onDown,this),this._enabled=!1,this._moved=!1)},_onDown:function(t){if(!t._simulated&&this._enabled&&(this._moved=!1,!ue(this._element,"leaflet-zoom-anim")&&!(ln._dragging||t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||(ln._dragging=this,this._preventOutline&&Te(this._element),be(),Kt(),this._moving)))){this.fire("down");var e=t.touches?t.touches[0]:t,n=Ce(this._element);this._startPoint=new A(e.clientX,e.clientY),this._parentScale=Pe(n),Le(document,an[t.type],this._onMove,this),Le(document,rn[t.type],this._onUp,this)}},_onMove:function(t){if(!t._simulated&&this._enabled)if(t.touches&&t.touches.length>1)this._moved=!0;else{var e=t.touches&&1===t.touches.length?t.touches[0]:t,n=new A(e.clientX,e.clientY)._subtract(this._startPoint);(n.x||n.y)&&(Math.abs(n.x)+Math.abs(n.y)<this.options.clickTolerance||(n.x/=this._parentScale.x,n.y/=this._parentScale.y,De(t),this._moved||(this.fire("dragstart"),this._moved=!0,this._startPos=ye(this._element).subtract(n),ce(document.body,"leaflet-dragging"),this._lastTarget=t.target||t.srcElement,window.SVGElementInstance&&this._lastTarget instanceof SVGElementInstance&&(this._lastTarget=this._lastTarget.correspondingUseElement),ce(this._lastTarget,"leaflet-drag-target")),this._newPos=this._startPos.add(n),this._moving=!0,P(this._animRequest),this._lastEvent=t,this._animRequest=C(this._updatePosition,this,!0)))}},_updatePosition:function(){var t={originalEvent:this._lastEvent};this.fire("predrag",t),ve(this._element,this._newPos),this.fire("drag",t)},_onUp:function(t){!t._simulated&&this._enabled&&this.finishDrag()},finishDrag:function(){for(var t in de(document.body,"leaflet-dragging"),this._lastTarget&&(de(this._lastTarget,"leaflet-drag-target"),this._lastTarget=null),an)Ie(document,an[t],this._onMove,this),Ie(document,rn[t],this._onUp,this);xe(),Yt(),this._moved&&this._moving&&(P(this._animRequest),this.fire("dragend",{distance:this._newPos.distanceTo(this._startPos)})),this._moving=!1,ln._dragging=!1}});function hn(t,e){if(!e||!t.length)return t.slice();var n=e*e;return function(t,e){var n=t.length,i=new(typeof Uint8Array!=void 0+""?Uint8Array:Array)(n);i[0]=i[n-1]=1,function t(e,n,i,o,s){var r,a,l,h=0;for(a=o+1;a<=s-1;a++)(l=fn(e[a],e[o],e[s],!0))>h&&(r=a,h=l);h>i&&(n[r]=1,t(e,n,i,o,r),t(e,n,i,r,s))}(t,i,e,0,n-1);var o,s=[];for(o=0;o<n;o++)i[o]&&s.push(t[o]);return s}(t=function(t,e){for(var n=[t[0]],i=1,o=0,s=t.length;i<s;i++)(l=(a=t[o]).x-(r=t[i]).x)*l+(h=a.y-r.y)*h>e&&(n.push(t[i]),o=i);var r,a,l,h;return o<s-1&&n.push(t[s-1]),n}(t,n),n)}function un(t,e,n){return Math.sqrt(fn(t,e,n,!0))}function cn(t,e,n,i,o){var s,r,a,l=i?nn:pn(t,n),h=pn(e,n);for(nn=h;;){if(!(l|h))return[t,e];if(l&h)return!1;a=pn(r=dn(t,e,s=l||h,n,o),n),s===l?(t=r,l=a):(e=r,h=a)}}function dn(t,e,n,i,o){var s,r,a=e.x-t.x,l=e.y-t.y,h=i.min,u=i.max;return 8&n?(s=t.x+a*(u.y-t.y)/l,r=u.y):4&n?(s=t.x+a*(h.y-t.y)/l,r=h.y):2&n?(s=u.x,r=t.y+l*(u.x-t.x)/a):1&n&&(s=h.x,r=t.y+l*(h.x-t.x)/a),new A(s,r,o)}function pn(t,e){var n=0;return t.x<e.min.x?n|=1:t.x>e.max.x&&(n|=2),t.y<e.min.y?n|=4:t.y>e.max.y&&(n|=8),n}function fn(t,e,n,i){var o,s=e.x,r=e.y,a=n.x-s,l=n.y-r,h=a*a+l*l;return h>0&&((o=((t.x-s)*a+(t.y-r)*l)/h)>1?(s=n.x,r=n.y):o>0&&(s+=a*o,r+=l*o)),a=t.x-s,l=t.y-r,i?a*a+l*l:new A(s,r)}function _n(t){return!g(t[0])||"object"!=typeof t[0][0]&&void 0!==t[0][0]}function mn(t){return console.warn("Deprecated use of _flat, please use L.LineUtil.isFlat instead."),_n(t)}var gn=(Object.freeze||Object)({simplify:hn,pointToSegmentDistance:un,closestPointOnSegment:function(t,e,n){return fn(t,e,n)},clipSegment:cn,_getEdgeIntersection:dn,_getBitCode:pn,_sqClosestPointOnSegment:fn,isFlat:_n,_flat:mn});function vn(t,e,n){var i,o,s,r,a,l,h,u,c,d=[1,4,2,8];for(o=0,h=t.length;o<h;o++)t[o]._code=pn(t[o],e);for(r=0;r<4;r++){for(u=d[r],i=[],o=0,s=(h=t.length)-1;o<h;s=o++)l=t[s],(a=t[o])._code&u?l._code&u||((c=dn(l,a,u,e,n))._code=pn(c,e),i.push(c)):(l._code&u&&((c=dn(l,a,u,e,n))._code=pn(c,e),i.push(c)),i.push(a));t=i}return t}var yn=(Object.freeze||Object)({clipPolygon:vn}),wn={project:function(t){return new A(t.lng,t.lat)},unproject:function(t){return new B(t.y,t.x)},bounds:new z([-180,-90],[180,90])},bn={R:6378137,R_MINOR:6356752.314245179,bounds:new z([-20037508.34279,-15496570.73972],[20037508.34279,18764656.23138]),project:function(t){var e=Math.PI/180,n=this.R,i=t.lat*e,o=this.R_MINOR/n,s=Math.sqrt(1-o*o),r=s*Math.sin(i),a=Math.tan(Math.PI/4-i/2)/Math.pow((1-r)/(1+r),s/2);return i=-n*Math.log(Math.max(a,1e-10)),new A(t.lng*e*n,i)},unproject:function(t){for(var e,n=180/Math.PI,i=this.R,o=this.R_MINOR/i,s=Math.sqrt(1-o*o),r=Math.exp(-t.y/i),a=Math.PI/2-2*Math.atan(r),l=0,h=.1;l<15&&Math.abs(h)>1e-7;l++)e=s*Math.sin(a),e=Math.pow((1-e)/(1+e),s/2),a+=h=Math.PI/2-2*Math.atan(r*e)-a;return new B(a*n,t.x*n/i)}},xn=(Object.freeze||Object)({LonLat:wn,Mercator:bn,SphericalMercator:U}),Tn=n({},F,{code:"EPSG:3395",projection:bn,transformation:function(){var t=.5/(Math.PI*bn.R);return q(t,.5,-t,.5)}()}),En=n({},F,{code:"EPSG:4326",projection:wn,transformation:q(1/180,1,-1/180,.5)}),Cn=n({},H,{projection:wn,transformation:q(1,0,-1,0),scale:function(t){return Math.pow(2,t)},zoom:function(t){return Math.log(t)/Math.LN2},distance:function(t,e){var n=e.lng-t.lng,i=e.lat-t.lat;return Math.sqrt(n*n+i*i)},infinite:!0});H.Earth=F,H.EPSG3395=Tn,H.EPSG3857=G,H.EPSG900913=K,H.EPSG4326=En,H.Simple=Cn;var Pn=M.extend({options:{pane:"overlayPane",attribution:null,bubblingMouseEvents:!0},addTo:function(t){return t.addLayer(this),this},remove:function(){return this.removeFrom(this._map||this._mapToAdd)},removeFrom:function(t){return t&&t.removeLayer(this),this},getPane:function(t){return this._map.getPane(t?this.options[t]||t:this.options.pane)},addInteractiveTarget:function(t){return this._map._targets[r(t)]=this,this},removeInteractiveTarget:function(t){return delete this._map._targets[r(t)],this},getAttribution:function(){return this.options.attribution},_layerAdd:function(t){var e=t.target;if(e.hasLayer(this)){if(this._map=e,this._zoomAnimated=e._zoomAnimated,this.getEvents){var n=this.getEvents();e.on(n,this),this.once("remove",(function(){e.off(n,this)}),this)}this.onAdd(e),this.getAttribution&&e.attributionControl&&e.attributionControl.addAttribution(this.getAttribution()),this.fire("add"),e.fire("layeradd",{layer:this})}}});Ge.include({addLayer:function(t){if(!t._layerAdd)throw new Error("The provided object is not a Layer.");var e=r(t);return this._layers[e]?this:(this._layers[e]=t,t._mapToAdd=this,t.beforeAdd&&t.beforeAdd(this),this.whenReady(t._layerAdd,t),this)},removeLayer:function(t){var e=r(t);return this._layers[e]?(this._loaded&&t.onRemove(this),t.getAttribution&&this.attributionControl&&this.attributionControl.removeAttribution(t.getAttribution()),delete this._layers[e],this._loaded&&(this.fire("layerremove",{layer:t}),t.fire("remove")),t._map=t._mapToAdd=null,this):this},hasLayer:function(t){return!!t&&r(t)in this._layers},eachLayer:function(t,e){for(var n in this._layers)t.call(e,this._layers[n]);return this},_addLayers:function(t){for(var e=0,n=(t=t?g(t)?t:[t]:[]).length;e<n;e++)this.addLayer(t[e])},_addZoomLimit:function(t){!isNaN(t.options.maxZoom)&&isNaN(t.options.minZoom)||(this._zoomBoundLayers[r(t)]=t,this._updateZoomLevels())},_removeZoomLimit:function(t){var e=r(t);this._zoomBoundLayers[e]&&(delete this._zoomBoundLayers[e],this._updateZoomLevels())},_updateZoomLevels:function(){var t=1/0,e=-1/0,n=this._getZoomSpan();for(var i in this._zoomBoundLayers){var o=this._zoomBoundLayers[i].options;t=void 0===o.minZoom?t:Math.min(t,o.minZoom),e=void 0===o.maxZoom?e:Math.max(e,o.maxZoom)}this._layersMaxZoom=e===-1/0?void 0:e,this._layersMinZoom=t===1/0?void 0:t,n!==this._getZoomSpan()&&this.fire("zoomlevelschange"),void 0===this.options.maxZoom&&this._layersMaxZoom&&this.getZoom()>this._layersMaxZoom&&this.setZoom(this._layersMaxZoom),void 0===this.options.minZoom&&this._layersMinZoom&&this.getZoom()<this._layersMinZoom&&this.setZoom(this._layersMinZoom)}});var Sn=Pn.extend({initialize:function(t,e){var n,i;if(p(this,e),this._layers={},t)for(n=0,i=t.length;n<i;n++)this.addLayer(t[n])},addLayer:function(t){var e=this.getLayerId(t);return this._layers[e]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var e=t in this._layers?t:this.getLayerId(t);return this._map&&this._layers[e]&&this._map.removeLayer(this._layers[e]),delete this._layers[e],this},hasLayer:function(t){return!!t&&(t in this._layers||this.getLayerId(t)in this._layers)},clearLayers:function(){return this.eachLayer(this.removeLayer,this)},invoke:function(t){var e,n,i=Array.prototype.slice.call(arguments,1);for(e in this._layers)(n=this._layers[e])[t]&&n[t].apply(n,i);return this},onAdd:function(t){this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t)},eachLayer:function(t,e){for(var n in this._layers)t.call(e,this._layers[n]);return this},getLayer:function(t){return this._layers[t]},getLayers:function(){var t=[];return this.eachLayer(t.push,t),t},setZIndex:function(t){return this.invoke("setZIndex",t)},getLayerId:function(t){return r(t)}}),Ln=Sn.extend({addLayer:function(t){return this.hasLayer(t)?this:(t.addEventParent(this),Sn.prototype.addLayer.call(this,t),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return this.hasLayer(t)?(t in this._layers&&(t=this._layers[t]),t.removeEventParent(this),Sn.prototype.removeLayer.call(this,t),this.fire("layerremove",{layer:t})):this},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t=new R;for(var e in this._layers){var n=this._layers[e];t.extend(n.getBounds?n.getBounds():n.getLatLng())}return t}}),kn=k.extend({options:{popupAnchor:[0,0],tooltipAnchor:[0,0]},initialize:function(t){p(this,t)},createIcon:function(t){return this._createIcon("icon",t)},createShadow:function(t){return this._createIcon("shadow",t)},_createIcon:function(t,e){var n=this._getIconUrl(t);if(!n){if("icon"===t)throw new Error("iconUrl not set in Icon options (see the docs).");return null}var i=this._createImg(n,e&&"IMG"===e.tagName?e:null);return this._setIconStyles(i,t),i},_setIconStyles:function(t,e){var n=this.options,i=n[e+"Size"];"number"==typeof i&&(i=[i,i]);var o=O(i),s=O("shadow"===e&&n.shadowAnchor||n.iconAnchor||o&&o.divideBy(2,!0));t.className="leaflet-marker-"+e+" "+(n.className||""),s&&(t.style.marginLeft=-s.x+"px",t.style.marginTop=-s.y+"px"),o&&(t.style.width=o.x+"px",t.style.height=o.y+"px")},_createImg:function(t,e){return(e=e||document.createElement("img")).src=t,e},_getIconUrl:function(t){return Pt&&this.options[t+"RetinaUrl"]||this.options[t+"Url"]}}),In=kn.extend({options:{iconUrl:"marker-icon.png",iconRetinaUrl:"marker-icon-2x.png",shadowUrl:"marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],tooltipAnchor:[16,-28],shadowSize:[41,41]},_getIconUrl:function(t){return In.imagePath||(In.imagePath=this._detectIconPath()),(this.options.imagePath||In.imagePath)+kn.prototype._getIconUrl.call(this,t)},_detectIconPath:function(){var t=se("div","leaflet-default-icon-path",document.body),e=oe(t,"background-image")||oe(t,"backgroundImage");return document.body.removeChild(t),null===e||0!==e.indexOf("url")?"":e.replace(/^url\(["']?/,"").replace(/marker-icon\.png["']?\)$/,"")}}),Mn=en.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new ln(t,t,!0)),this._draggable.on({dragstart:this._onDragStart,predrag:this._onPreDrag,drag:this._onDrag,dragend:this._onDragEnd},this).enable(),ce(t,"leaflet-marker-draggable")},removeHooks:function(){this._draggable.off({dragstart:this._onDragStart,predrag:this._onPreDrag,drag:this._onDrag,dragend:this._onDragEnd},this).disable(),this._marker._icon&&de(this._marker._icon,"leaflet-marker-draggable")},moved:function(){return this._draggable&&this._draggable._moved},_adjustPan:function(t){var e=this._marker,n=e._map,i=this._marker.options.autoPanSpeed,o=this._marker.options.autoPanPadding,s=ye(e._icon),r=n.getPixelBounds(),a=n.getPixelOrigin(),l=D(r.min._subtract(a).add(o),r.max._subtract(a).subtract(o));if(!l.contains(s)){var h=O((Math.max(l.max.x,s.x)-l.max.x)/(r.max.x-l.max.x)-(Math.min(l.min.x,s.x)-l.min.x)/(r.min.x-l.min.x),(Math.max(l.max.y,s.y)-l.max.y)/(r.max.y-l.max.y)-(Math.min(l.min.y,s.y)-l.min.y)/(r.min.y-l.min.y)).multiplyBy(i);n.panBy(h,{animate:!1}),this._draggable._newPos._add(h),this._draggable._startPos._add(h),ve(e._icon,this._draggable._newPos),this._onDrag(t),this._panRequest=C(this._adjustPan.bind(this,t))}},_onDragStart:function(){this._oldLatLng=this._marker.getLatLng(),this._marker.closePopup().fire("movestart").fire("dragstart")},_onPreDrag:function(t){this._marker.options.autoPan&&(P(this._panRequest),this._panRequest=C(this._adjustPan.bind(this,t)))},_onDrag:function(t){var e=this._marker,n=e._shadow,i=ye(e._icon),o=e._map.layerPointToLatLng(i);n&&ve(n,i),e._latlng=o,t.latlng=o,t.oldLatLng=this._oldLatLng,e.fire("move",t).fire("drag",t)},_onDragEnd:function(t){P(this._panRequest),delete this._oldLatLng,this._marker.fire("moveend").fire("dragend",t)}}),An=Pn.extend({options:{icon:new In,interactive:!0,keyboard:!0,title:"",alt:"",zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250,pane:"markerPane",shadowPane:"shadowPane",bubblingMouseEvents:!1,draggable:!1,autoPan:!1,autoPanPadding:[50,50],autoPanSpeed:10},initialize:function(t,e){p(this,e),this._latlng=j(t)},onAdd:function(t){this._zoomAnimated=this._zoomAnimated&&t.options.markerZoomAnimation,this._zoomAnimated&&t.on("zoomanim",this._animateZoom,this),this._initIcon(),this.update()},onRemove:function(t){this.dragging&&this.dragging.enabled()&&(this.options.draggable=!0,this.dragging.removeHooks()),delete this.dragging,this._zoomAnimated&&t.off("zoomanim",this._animateZoom,this),this._removeIcon(),this._removeShadow()},getEvents:function(){return{zoom:this.update,viewreset:this.update}},getLatLng:function(){return this._latlng},setLatLng:function(t){var e=this._latlng;return this._latlng=j(t),this.update(),this.fire("move",{oldLatLng:e,latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update()},getIcon:function(){return this.options.icon},setIcon:function(t){return this.options.icon=t,this._map&&(this._initIcon(),this.update()),this._popup&&this.bindPopup(this._popup,this._popup.options),this},getElement:function(){return this._icon},update:function(){if(this._icon&&this._map){var t=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(t)}return this},_initIcon:function(){var t=this.options,e="leaflet-zoom-"+(this._zoomAnimated?"animated":"hide"),n=t.icon.createIcon(this._icon),i=!1;n!==this._icon&&(this._icon&&this._removeIcon(),i=!0,t.title&&(n.title=t.title),"IMG"===n.tagName&&(n.alt=t.alt||"")),ce(n,e),t.keyboard&&(n.tabIndex="0"),this._icon=n,t.riseOnHover&&this.on({mouseover:this._bringToFront,mouseout:this._resetZIndex});var o=t.icon.createShadow(this._shadow),s=!1;o!==this._shadow&&(this._removeShadow(),s=!0),o&&(ce(o,e),o.alt=""),this._shadow=o,t.opacity<1&&this._updateOpacity(),i&&this.getPane().appendChild(this._icon),this._initInteraction(),o&&s&&this.getPane(t.shadowPane).appendChild(this._shadow)},_removeIcon:function(){this.options.riseOnHover&&this.off({mouseover:this._bringToFront,mouseout:this._resetZIndex}),re(this._icon),this.removeInteractiveTarget(this._icon),this._icon=null},_removeShadow:function(){this._shadow&&re(this._shadow),this._shadow=null},_setPos:function(t){ve(this._icon,t),this._shadow&&ve(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center).round();this._setPos(e)},_initInteraction:function(){if(this.options.interactive&&(ce(this._icon,"leaflet-interactive"),this.addInteractiveTarget(this._icon),Mn)){var t=this.options.draggable;this.dragging&&(t=this.dragging.enabled(),this.dragging.disable()),this.dragging=new Mn(this),t&&this.dragging.enable()}},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},_updateOpacity:function(){var t=this.options.opacity;this._icon&&_e(this._icon,t),this._shadow&&_e(this._shadow,t)},_bringToFront:function(){this._updateZIndex(this.options.riseOffset)},_resetZIndex:function(){this._updateZIndex(0)},_getPopupAnchor:function(){return this.options.icon.options.popupAnchor},_getTooltipAnchor:function(){return this.options.icon.options.tooltipAnchor}}),Nn=Pn.extend({options:{stroke:!0,color:"#3388ff",weight:3,opacity:1,lineCap:"round",lineJoin:"round",dashArray:null,dashOffset:null,fill:!1,fillColor:null,fillOpacity:.2,fillRule:"evenodd",interactive:!0,bubblingMouseEvents:!0},beforeAdd:function(t){this._renderer=t.getRenderer(this)},onAdd:function(){this._renderer._initPath(this),this._reset(),this._renderer._addPath(this)},onRemove:function(){this._renderer._removePath(this)},redraw:function(){return this._map&&this._renderer._updatePath(this),this},setStyle:function(t){return p(this,t),this._renderer&&(this._renderer._updateStyle(this),this.options.stroke&&t.hasOwnProperty("weight")&&this._updateBounds()),this},bringToFront:function(){return this._renderer&&this._renderer._bringToFront(this),this},bringToBack:function(){return this._renderer&&this._renderer._bringToBack(this),this},getElement:function(){return this._path},_reset:function(){this._project(),this._update()},_clickTolerance:function(){return(this.options.stroke?this.options.weight/2:0)+this._renderer.options.tolerance}}),On=Nn.extend({options:{fill:!0,radius:10},initialize:function(t,e){p(this,e),this._latlng=j(t),this._radius=this.options.radius},setLatLng:function(t){return this._latlng=j(t),this.redraw(),this.fire("move",{latlng:this._latlng})},getLatLng:function(){return this._latlng},setRadius:function(t){return this.options.radius=this._radius=t,this.redraw()},getRadius:function(){return this._radius},setStyle:function(t){var e=t&&t.radius||this._radius;return Nn.prototype.setStyle.call(this,t),this.setRadius(e),this},_project:function(){this._point=this._map.latLngToLayerPoint(this._latlng),this._updateBounds()},_updateBounds:function(){var t=this._radius,e=this._radiusY||t,n=this._clickTolerance(),i=[t+n,e+n];this._pxBounds=new z(this._point.subtract(i),this._point.add(i))},_update:function(){this._map&&this._updatePath()},_updatePath:function(){this._renderer._updateCircle(this)},_empty:function(){return this._radius&&!this._renderer._bounds.intersects(this._pxBounds)},_containsPoint:function(t){return t.distanceTo(this._point)<=this._radius+this._clickTolerance()}}),zn=On.extend({initialize:function(t,e,i){if("number"==typeof e&&(e=n({},i,{radius:e})),p(this,e),this._latlng=j(t),isNaN(this.options.radius))throw new Error("Circle radius cannot be NaN");this._mRadius=this.options.radius},setRadius:function(t){return this._mRadius=t,this.redraw()},getRadius:function(){return this._mRadius},getBounds:function(){var t=[this._radius,this._radiusY||this._radius];return new R(this._map.layerPointToLatLng(this._point.subtract(t)),this._map.layerPointToLatLng(this._point.add(t)))},setStyle:Nn.prototype.setStyle,_project:function(){var t=this._latlng.lng,e=this._latlng.lat,n=this._map,i=n.options.crs;if(i.distance===F.distance){var o=Math.PI/180,s=this._mRadius/F.R/o,r=n.project([e+s,t]),a=n.project([e-s,t]),l=r.add(a).divideBy(2),h=n.unproject(l).lat,u=Math.acos((Math.cos(s*o)-Math.sin(e*o)*Math.sin(h*o))/(Math.cos(e*o)*Math.cos(h*o)))/o;(isNaN(u)||0===u)&&(u=s/Math.cos(Math.PI/180*e)),this._point=l.subtract(n.getPixelOrigin()),this._radius=isNaN(u)?0:l.x-n.project([h,t-u]).x,this._radiusY=l.y-r.y}else{var c=i.unproject(i.project(this._latlng).subtract([this._mRadius,0]));this._point=n.latLngToLayerPoint(this._latlng),this._radius=this._point.x-n.latLngToLayerPoint(c).x}this._updateBounds()}}),Dn=Nn.extend({options:{smoothFactor:1,noClip:!1},initialize:function(t,e){p(this,e),this._setLatLngs(t)},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._setLatLngs(t),this.redraw()},isEmpty:function(){return!this._latlngs.length},closestLayerPoint:function(t){for(var e,n,i=1/0,o=null,s=fn,r=0,a=this._parts.length;r<a;r++)for(var l=this._parts[r],h=1,u=l.length;h<u;h++){var c=s(t,e=l[h-1],n=l[h],!0);c<i&&(i=c,o=s(t,e,n))}return o&&(o.distance=Math.sqrt(i)),o},getCenter:function(){if(!this._map)throw new Error("Must add layer to map before using getCenter()");var t,e,n,i,o,s,r,a=this._rings[0],l=a.length;if(!l)return null;for(t=0,e=0;t<l-1;t++)e+=a[t].distanceTo(a[t+1])/2;if(0===e)return this._map.layerPointToLatLng(a[0]);for(t=0,i=0;t<l-1;t++)if((i+=n=(o=a[t]).distanceTo(s=a[t+1]))>e)return this._map.layerPointToLatLng([s.x-(r=(i-e)/n)*(s.x-o.x),s.y-r*(s.y-o.y)])},getBounds:function(){return this._bounds},addLatLng:function(t,e){return e=e||this._defaultShape(),t=j(t),e.push(t),this._bounds.extend(t),this.redraw()},_setLatLngs:function(t){this._bounds=new R,this._latlngs=this._convertLatLngs(t)},_defaultShape:function(){return _n(this._latlngs)?this._latlngs:this._latlngs[0]},_convertLatLngs:function(t){for(var e=[],n=_n(t),i=0,o=t.length;i<o;i++)n?(e[i]=j(t[i]),this._bounds.extend(e[i])):e[i]=this._convertLatLngs(t[i]);return e},_project:function(){var t=new z;this._rings=[],this._projectLatlngs(this._latlngs,this._rings,t),this._bounds.isValid()&&t.isValid()&&(this._rawPxBounds=t,this._updateBounds())},_updateBounds:function(){var t=this._clickTolerance(),e=new A(t,t);this._pxBounds=new z([this._rawPxBounds.min.subtract(e),this._rawPxBounds.max.add(e)])},_projectLatlngs:function(t,e,n){var i,o,s=t.length;if(t[0]instanceof B){for(o=[],i=0;i<s;i++)o[i]=this._map.latLngToLayerPoint(t[i]),n.extend(o[i]);e.push(o)}else for(i=0;i<s;i++)this._projectLatlngs(t[i],e,n)},_clipPoints:function(){var t=this._renderer._bounds;if(this._parts=[],this._pxBounds&&this._pxBounds.intersects(t))if(this.options.noClip)this._parts=this._rings;else{var e,n,i,o,s,r,a,l=this._parts;for(e=0,i=0,o=this._rings.length;e<o;e++)for(n=0,s=(a=this._rings[e]).length;n<s-1;n++)(r=cn(a[n],a[n+1],t,n,!0))&&(l[i]=l[i]||[],l[i].push(r[0]),r[1]===a[n+1]&&n!==s-2||(l[i].push(r[1]),i++))}},_simplifyPoints:function(){for(var t=this._parts,e=this.options.smoothFactor,n=0,i=t.length;n<i;n++)t[n]=hn(t[n],e)},_update:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),this._updatePath())},_updatePath:function(){this._renderer._updatePoly(this)},_containsPoint:function(t,e){var n,i,o,s,r,a,l=this._clickTolerance();if(!this._pxBounds||!this._pxBounds.contains(t))return!1;for(n=0,s=this._parts.length;n<s;n++)for(i=0,o=(r=(a=this._parts[n]).length)-1;i<r;o=i++)if((e||0!==i)&&un(t,a[o],a[i])<=l)return!0;return!1}});Dn._flat=mn;var Rn=Dn.extend({options:{fill:!0},isEmpty:function(){return!this._latlngs.length||!this._latlngs[0].length},getCenter:function(){if(!this._map)throw new Error("Must add layer to map before using getCenter()");var t,e,n,i,o,s,r,a,l=this._rings[0],h=l.length;if(!h)return null;for(s=r=a=0,t=0,e=h-1;t<h;e=t++)r+=((n=l[t]).x+(i=l[e]).x)*(o=n.y*i.x-i.y*n.x),a+=(n.y+i.y)*o,s+=3*o;return this._map.layerPointToLatLng(0===s?l[0]:[r/s,a/s])},_convertLatLngs:function(t){var e=Dn.prototype._convertLatLngs.call(this,t),n=e.length;return n>=2&&e[0]instanceof B&&e[0].equals(e[n-1])&&e.pop(),e},_setLatLngs:function(t){Dn.prototype._setLatLngs.call(this,t),_n(this._latlngs)&&(this._latlngs=[this._latlngs])},_defaultShape:function(){return _n(this._latlngs[0])?this._latlngs[0]:this._latlngs[0][0]},_clipPoints:function(){var t=this._renderer._bounds,e=this.options.weight,n=new A(e,e);if(t=new z(t.min.subtract(n),t.max.add(n)),this._parts=[],this._pxBounds&&this._pxBounds.intersects(t))if(this.options.noClip)this._parts=this._rings;else for(var i,o=0,s=this._rings.length;o<s;o++)(i=vn(this._rings[o],t,!0)).length&&this._parts.push(i)},_updatePath:function(){this._renderer._updatePoly(this,!0)},_containsPoint:function(t){var e,n,i,o,s,r,a,l,h=!1;if(!this._pxBounds||!this._pxBounds.contains(t))return!1;for(o=0,a=this._parts.length;o<a;o++)for(s=0,r=(l=(e=this._parts[o]).length)-1;s<l;r=s++)(n=e[s]).y>t.y!=(i=e[r]).y>t.y&&t.x<(i.x-n.x)*(t.y-n.y)/(i.y-n.y)+n.x&&(h=!h);return h||Dn.prototype._containsPoint.call(this,t,!0)}}),Zn=Ln.extend({initialize:function(t,e){p(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,n,i,o=g(t)?t:t.features;if(o){for(e=0,n=o.length;e<n;e++)((i=o[e]).geometries||i.geometry||i.features||i.coordinates)&&this.addData(i);return this}var s=this.options;if(s.filter&&!s.filter(t))return this;var r=Bn(t,s);return r?(r.feature=Wn(t),r.defaultOptions=r.options,this.resetStyle(r),s.onEachFeature&&s.onEachFeature(t,r),this.addLayer(r)):this},resetStyle:function(t){return t.options=n({},t.defaultOptions),this._setLayerStyle(t,this.options.style),this},setStyle:function(t){return this.eachLayer((function(e){this._setLayerStyle(e,t)}),this)},_setLayerStyle:function(t,e){t.setStyle&&("function"==typeof e&&(e=e(t.feature)),t.setStyle(e))}});function Bn(t,e){var n,i,o,s,r="Feature"===t.type?t.geometry:t,a=r?r.coordinates:null,l=[],h=e&&e.pointToLayer,u=e&&e.coordsToLatLng||jn;if(!a&&!r)return null;switch(r.type){case"Point":return n=u(a),h?h(t,n):new An(n);case"MultiPoint":for(o=0,s=a.length;o<s;o++)n=u(a[o]),l.push(h?h(t,n):new An(n));return new Ln(l);case"LineString":case"MultiLineString":return i=Vn(a,"LineString"===r.type?0:1,u),new Dn(i,e);case"Polygon":case"MultiPolygon":return i=Vn(a,"Polygon"===r.type?1:2,u),new Rn(i,e);case"GeometryCollection":for(o=0,s=r.geometries.length;o<s;o++){var c=Bn({geometry:r.geometries[o],type:"Feature",properties:t.properties},e);c&&l.push(c)}return new Ln(l);default:throw new Error("Invalid GeoJSON object.")}}function jn(t){return new B(t[1],t[0],t[2])}function Vn(t,e,n){for(var i,o=[],s=0,r=t.length;s<r;s++)i=e?Vn(t[s],e-1,n):(n||jn)(t[s]),o.push(i);return o}function Hn(t,e){return e="number"==typeof e?e:6,void 0!==t.alt?[u(t.lng,e),u(t.lat,e),u(t.alt,e)]:[u(t.lng,e),u(t.lat,e)]}function Fn(t,e,n,i){for(var o=[],s=0,r=t.length;s<r;s++)o.push(e?Fn(t[s],e-1,n,i):Hn(t[s],i));return!e&&n&&o.push(o[0]),o}function Un(t,e){return t.feature?n({},t.feature,{geometry:e}):Wn(e)}function Wn(t){return"Feature"===t.type||"FeatureCollection"===t.type?t:{type:"Feature",properties:{},geometry:t}}var qn={toGeoJSON:function(t){return Un(this,{type:"Point",coordinates:Hn(this.getLatLng(),t)})}};function $n(t,e){return new Zn(t,e)}An.include(qn),zn.include(qn),On.include(qn),Dn.include({toGeoJSON:function(t){var e=!_n(this._latlngs);return Un(this,{type:(e?"Multi":"")+"LineString",coordinates:Fn(this._latlngs,e?1:0,!1,t)})}}),Rn.include({toGeoJSON:function(t){var e=!_n(this._latlngs),n=e&&!_n(this._latlngs[0]),i=Fn(this._latlngs,n?2:e?1:0,!0,t);return e||(i=[i]),Un(this,{type:(n?"Multi":"")+"Polygon",coordinates:i})}}),Sn.include({toMultiPoint:function(t){var e=[];return this.eachLayer((function(n){e.push(n.toGeoJSON(t).geometry.coordinates)})),Un(this,{type:"MultiPoint",coordinates:e})},toGeoJSON:function(t){var e=this.feature&&this.feature.geometry&&this.feature.geometry.type;if("MultiPoint"===e)return this.toMultiPoint(t);var n="GeometryCollection"===e,i=[];return this.eachLayer((function(e){if(e.toGeoJSON){var o=e.toGeoJSON(t);if(n)i.push(o.geometry);else{var s=Wn(o);"FeatureCollection"===s.type?i.push.apply(i,s.features):i.push(s)}}})),n?Un(this,{geometries:i,type:"GeometryCollection"}):{type:"FeatureCollection",features:i}}});var Gn=$n,Kn=Pn.extend({options:{opacity:1,alt:"",interactive:!1,crossOrigin:!1,errorOverlayUrl:"",zIndex:1,className:""},initialize:function(t,e,n){this._url=t,this._bounds=Z(e),p(this,n)},onAdd:function(){this._image||(this._initImage(),this.options.opacity<1&&this._updateOpacity()),this.options.interactive&&(ce(this._image,"leaflet-interactive"),this.addInteractiveTarget(this._image)),this.getPane().appendChild(this._image),this._reset()},onRemove:function(){re(this._image),this.options.interactive&&this.removeInteractiveTarget(this._image)},setOpacity:function(t){return this.options.opacity=t,this._image&&this._updateOpacity(),this},setStyle:function(t){return t.opacity&&this.setOpacity(t.opacity),this},bringToFront:function(){return this._map&&le(this._image),this},bringToBack:function(){return this._map&&he(this._image),this},setUrl:function(t){return this._url=t,this._image&&(this._image.src=t),this},setBounds:function(t){return this._bounds=Z(t),this._map&&this._reset(),this},getEvents:function(){var t={zoom:this._reset,viewreset:this._reset};return this._zoomAnimated&&(t.zoomanim=this._animateZoom),t},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},getBounds:function(){return this._bounds},getElement:function(){return this._image},_initImage:function(){var t="IMG"===this._url.tagName,e=this._image=t?this._url:se("img");ce(e,"leaflet-image-layer"),this._zoomAnimated&&ce(e,"leaflet-zoom-animated"),this.options.className&&ce(e,this.options.className),e.onselectstart=h,e.onmousemove=h,e.onload=o(this.fire,this,"load"),e.onerror=o(this._overlayOnError,this,"error"),(this.options.crossOrigin||""===this.options.crossOrigin)&&(e.crossOrigin=!0===this.options.crossOrigin?"":this.options.crossOrigin),this.options.zIndex&&this._updateZIndex(),t?this._url=e.src:(e.src=this._url,e.alt=this.options.alt)},_animateZoom:function(t){var e=this._map.getZoomScale(t.zoom),n=this._map._latLngBoundsToNewLayerBounds(this._bounds,t.zoom,t.center).min;ge(this._image,n,e)},_reset:function(){var t=this._image,e=new z(this._map.latLngToLayerPoint(this._bounds.getNorthWest()),this._map.latLngToLayerPoint(this._bounds.getSouthEast())),n=e.getSize();ve(t,e.min),t.style.width=n.x+"px",t.style.height=n.y+"px"},_updateOpacity:function(){_e(this._image,this.options.opacity)},_updateZIndex:function(){this._image&&null!=this.options.zIndex&&(this._image.style.zIndex=this.options.zIndex)},_overlayOnError:function(){this.fire("error");var t=this.options.errorOverlayUrl;t&&this._url!==t&&(this._url=t,this._image.src=t)}}),Yn=Kn.extend({options:{autoplay:!0,loop:!0,keepAspectRatio:!0},_initImage:function(){var t="VIDEO"===this._url.tagName,e=this._image=t?this._url:se("video");if(ce(e,"leaflet-image-layer"),this._zoomAnimated&&ce(e,"leaflet-zoom-animated"),e.onselectstart=h,e.onmousemove=h,e.onloadeddata=o(this.fire,this,"load"),t){for(var n=e.getElementsByTagName("source"),i=[],s=0;s<n.length;s++)i.push(n[s].src);this._url=n.length>0?i:[e.src]}else{g(this._url)||(this._url=[this._url]),!this.options.keepAspectRatio&&e.style.hasOwnProperty("objectFit")&&(e.style.objectFit="fill"),e.autoplay=!!this.options.autoplay,e.loop=!!this.options.loop;for(var r=0;r<this._url.length;r++){var a=se("source");a.src=this._url[r],e.appendChild(a)}}}}),Jn=Kn.extend({_initImage:function(){var t=this._image=this._url;ce(t,"leaflet-image-layer"),this._zoomAnimated&&ce(t,"leaflet-zoom-animated"),t.onselectstart=h,t.onmousemove=h}}),Qn=Pn.extend({options:{offset:[0,7],className:"",pane:"popupPane"},initialize:function(t,e){p(this,t),this._source=e},onAdd:function(t){this._zoomAnimated=t._zoomAnimated,this._container||this._initLayout(),t._fadeAnimated&&_e(this._container,0),clearTimeout(this._removeTimeout),this.getPane().appendChild(this._container),this.update(),t._fadeAnimated&&_e(this._container,1),this.bringToFront()},onRemove:function(t){t._fadeAnimated?(_e(this._container,0),this._removeTimeout=setTimeout(o(re,void 0,this._container),200)):re(this._container)},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=j(t),this._map&&(this._updatePosition(),this._adjustPan()),this},getContent:function(){return this._content},setContent:function(t){return this._content=t,this.update(),this},getElement:function(){return this._container},update:function(){this._map&&(this._container.style.visibility="hidden",this._updateContent(),this._updateLayout(),this._updatePosition(),this._container.style.visibility="",this._adjustPan())},getEvents:function(){var t={zoom:this._updatePosition,viewreset:this._updatePosition};return this._zoomAnimated&&(t.zoomanim=this._animateZoom),t},isOpen:function(){return!!this._map&&this._map.hasLayer(this)},bringToFront:function(){return this._map&&le(this._container),this},bringToBack:function(){return this._map&&he(this._container),this},_prepareOpen:function(t,e,n){if(e instanceof Pn||(n=e,e=t),e instanceof Ln)for(var i in t._layers){e=t._layers[i];break}if(!n)if(e.getCenter)n=e.getCenter();else{if(!e.getLatLng)throw new Error("Unable to get source layer LatLng.");n=e.getLatLng()}return this._source=e,this.update(),n},_updateContent:function(){if(this._content){var t=this._contentNode,e="function"==typeof this._content?this._content(this._source||this):this._content;if("string"==typeof e)t.innerHTML=e;else{for(;t.hasChildNodes();)t.removeChild(t.firstChild);t.appendChild(e)}this.fire("contentupdate")}},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),e=O(this.options.offset),n=this._getAnchor();this._zoomAnimated?ve(this._container,t.add(n)):e=e.add(t).add(n);var i=this._containerBottom=-e.y,o=this._containerLeft=-Math.round(this._containerWidth/2)+e.x;this._container.style.bottom=i+"px",this._container.style.left=o+"px"}},_getAnchor:function(){return[0,0]}}),Xn=Qn.extend({options:{maxWidth:300,minWidth:50,maxHeight:null,autoPan:!0,autoPanPaddingTopLeft:null,autoPanPaddingBottomRight:null,autoPanPadding:[5,5],keepInView:!1,closeButton:!0,autoClose:!0,closeOnEscapeKey:!0,className:""},openOn:function(t){return t.openPopup(this),this},onAdd:function(t){Qn.prototype.onAdd.call(this,t),t.fire("popupopen",{popup:this}),this._source&&(this._source.fire("popupopen",{popup:this},!0),this._source instanceof Nn||this._source.on("preclick",Ne))},onRemove:function(t){Qn.prototype.onRemove.call(this,t),t.fire("popupclose",{popup:this}),this._source&&(this._source.fire("popupclose",{popup:this},!0),this._source instanceof Nn||this._source.off("preclick",Ne))},getEvents:function(){var t=Qn.prototype.getEvents.call(this);return(void 0!==this.options.closeOnClick?this.options.closeOnClick:this._map.options.closePopupOnClick)&&(t.preclick=this._close),this.options.keepInView&&(t.moveend=this._adjustPan),t},_close:function(){this._map&&this._map.closePopup(this)},_initLayout:function(){var t="leaflet-popup",e=this._container=se("div",t+" "+(this.options.className||"")+" leaflet-zoom-animated"),n=this._wrapper=se("div",t+"-content-wrapper",e);if(this._contentNode=se("div",t+"-content",n),ze(n),Oe(this._contentNode),Le(n,"contextmenu",Ne),this._tipContainer=se("div",t+"-tip-container",e),this._tip=se("div",t+"-tip",this._tipContainer),this.options.closeButton){var i=this._closeButton=se("a",t+"-close-button",e);i.href="#close",i.innerHTML="&#215;",Le(i,"click",this._onCloseButtonClick,this)}},_updateLayout:function(){var t=this._contentNode,e=t.style;e.width="",e.whiteSpace="nowrap";var n=t.offsetWidth;n=Math.min(n,this.options.maxWidth),n=Math.max(n,this.options.minWidth),e.width=n+1+"px",e.whiteSpace="",e.height="";var i=this.options.maxHeight;i&&t.offsetHeight>i?(e.height=i+"px",ce(t,"leaflet-popup-scrolled")):de(t,"leaflet-popup-scrolled"),this._containerWidth=this._container.offsetWidth},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center),n=this._getAnchor();ve(this._container,e.add(n))},_adjustPan:function(){if(this.options.autoPan){this._map._panAnim&&this._map._panAnim.stop();var t=this._map,e=parseInt(oe(this._container,"marginBottom"),10)||0,n=this._container.offsetHeight+e,i=this._containerWidth,o=new A(this._containerLeft,-n-this._containerBottom);o._add(ye(this._container));var s=t.layerPointToContainerPoint(o),r=O(this.options.autoPanPadding),a=O(this.options.autoPanPaddingTopLeft||r),l=O(this.options.autoPanPaddingBottomRight||r),h=t.getSize(),u=0,c=0;s.x+i+l.x>h.x&&(u=s.x+i-h.x+l.x),s.x-u-a.x<0&&(u=s.x-a.x),s.y+n+l.y>h.y&&(c=s.y+n-h.y+l.y),s.y-c-a.y<0&&(c=s.y-a.y),(u||c)&&t.fire("autopanstart").panBy([u,c])}},_onCloseButtonClick:function(t){this._close(),Re(t)},_getAnchor:function(){return O(this._source&&this._source._getPopupAnchor?this._source._getPopupAnchor():[0,0])}});Ge.mergeOptions({closePopupOnClick:!0}),Ge.include({openPopup:function(t,e,n){return t instanceof Xn||(t=new Xn(n).setContent(t)),e&&t.setLatLng(e),this.hasLayer(t)?this:(this._popup&&this._popup.options.autoClose&&this.closePopup(),this._popup=t,this.addLayer(t))},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&this.removeLayer(t),this}}),Pn.include({bindPopup:function(t,e){return t instanceof Xn?(p(t,e),this._popup=t,t._source=this):(this._popup&&!e||(this._popup=new Xn(e,this)),this._popup.setContent(t)),this._popupHandlersAdded||(this.on({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this.off({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!1,this._popup=null),this},openPopup:function(t,e){return this._popup&&this._map&&(e=this._popup._prepareOpen(this,t,e),this._map.openPopup(this._popup,e)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(t){return this._popup&&(this._popup._map?this.closePopup():this.openPopup(t)),this},isPopupOpen:function(){return!!this._popup&&this._popup.isOpen()},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},getPopup:function(){return this._popup},_openPopup:function(t){var e=t.layer||t.target;this._popup&&this._map&&(Re(t),e instanceof Nn?this.openPopup(t.layer||t.target,t.latlng):this._map.hasLayer(this._popup)&&this._popup._source===e?this.closePopup():this.openPopup(e,t.latlng))},_movePopup:function(t){this._popup.setLatLng(t.latlng)},_onKeyPress:function(t){13===t.originalEvent.keyCode&&this._openPopup(t)}});var ti=Qn.extend({options:{pane:"tooltipPane",offset:[0,0],direction:"auto",permanent:!1,sticky:!1,interactive:!1,opacity:.9},onAdd:function(t){Qn.prototype.onAdd.call(this,t),this.setOpacity(this.options.opacity),t.fire("tooltipopen",{tooltip:this}),this._source&&this._source.fire("tooltipopen",{tooltip:this},!0)},onRemove:function(t){Qn.prototype.onRemove.call(this,t),t.fire("tooltipclose",{tooltip:this}),this._source&&this._source.fire("tooltipclose",{tooltip:this},!0)},getEvents:function(){var t=Qn.prototype.getEvents.call(this);return Tt&&!this.options.permanent&&(t.preclick=this._close),t},_close:function(){this._map&&this._map.closeTooltip(this)},_initLayout:function(){this._contentNode=this._container=se("div","leaflet-tooltip "+(this.options.className||"")+" leaflet-zoom-"+(this._zoomAnimated?"animated":"hide"))},_updateLayout:function(){},_adjustPan:function(){},_setPosition:function(t){var e=this._map,n=this._container,i=e.latLngToContainerPoint(e.getCenter()),o=e.layerPointToContainerPoint(t),s=this.options.direction,r=n.offsetWidth,a=n.offsetHeight,l=O(this.options.offset),h=this._getAnchor();"top"===s?t=t.add(O(-r/2+l.x,-a+l.y+h.y,!0)):"bottom"===s?t=t.subtract(O(r/2-l.x,-l.y,!0)):"center"===s?t=t.subtract(O(r/2+l.x,a/2-h.y+l.y,!0)):"right"===s||"auto"===s&&o.x<i.x?(s="right",t=t.add(O(l.x+h.x,h.y-a/2+l.y,!0))):(s="left",t=t.subtract(O(r+h.x-l.x,a/2-h.y-l.y,!0))),de(n,"leaflet-tooltip-right"),de(n,"leaflet-tooltip-left"),de(n,"leaflet-tooltip-top"),de(n,"leaflet-tooltip-bottom"),ce(n,"leaflet-tooltip-"+s),ve(n,t)},_updatePosition:function(){var t=this._map.latLngToLayerPoint(this._latlng);this._setPosition(t)},setOpacity:function(t){this.options.opacity=t,this._container&&_e(this._container,t)},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);this._setPosition(e)},_getAnchor:function(){return O(this._source&&this._source._getTooltipAnchor&&!this.options.sticky?this._source._getTooltipAnchor():[0,0])}});Ge.include({openTooltip:function(t,e,n){return t instanceof ti||(t=new ti(n).setContent(t)),e&&t.setLatLng(e),this.hasLayer(t)?this:this.addLayer(t)},closeTooltip:function(t){return t&&this.removeLayer(t),this}}),Pn.include({bindTooltip:function(t,e){return t instanceof ti?(p(t,e),this._tooltip=t,t._source=this):(this._tooltip&&!e||(this._tooltip=new ti(e,this)),this._tooltip.setContent(t)),this._initTooltipInteractions(),this._tooltip.options.permanent&&this._map&&this._map.hasLayer(this)&&this.openTooltip(),this},unbindTooltip:function(){return this._tooltip&&(this._initTooltipInteractions(!0),this.closeTooltip(),this._tooltip=null),this},_initTooltipInteractions:function(t){if(t||!this._tooltipHandlersAdded){var e=t?"off":"on",n={remove:this.closeTooltip,move:this._moveTooltip};this._tooltip.options.permanent?n.add=this._openTooltip:(n.mouseover=this._openTooltip,n.mouseout=this.closeTooltip,this._tooltip.options.sticky&&(n.mousemove=this._moveTooltip),Tt&&(n.click=this._openTooltip)),this[e](n),this._tooltipHandlersAdded=!t}},openTooltip:function(t,e){return this._tooltip&&this._map&&(e=this._tooltip._prepareOpen(this,t,e),this._map.openTooltip(this._tooltip,e),this._tooltip.options.interactive&&this._tooltip._container&&(ce(this._tooltip._container,"leaflet-clickable"),this.addInteractiveTarget(this._tooltip._container))),this},closeTooltip:function(){return this._tooltip&&(this._tooltip._close(),this._tooltip.options.interactive&&this._tooltip._container&&(de(this._tooltip._container,"leaflet-clickable"),this.removeInteractiveTarget(this._tooltip._container))),this},toggleTooltip:function(t){return this._tooltip&&(this._tooltip._map?this.closeTooltip():this.openTooltip(t)),this},isTooltipOpen:function(){return this._tooltip.isOpen()},setTooltipContent:function(t){return this._tooltip&&this._tooltip.setContent(t),this},getTooltip:function(){return this._tooltip},_openTooltip:function(t){this._tooltip&&this._map&&this.openTooltip(t.layer||t.target,this._tooltip.options.sticky?t.latlng:void 0)},_moveTooltip:function(t){var e,n,i=t.latlng;this._tooltip.options.sticky&&t.originalEvent&&(e=this._map.mouseEventToContainerPoint(t.originalEvent),n=this._map.containerPointToLayerPoint(e),i=this._map.layerPointToLatLng(n)),this._tooltip.setLatLng(i)}});var ei=kn.extend({options:{iconSize:[12,12],html:!1,bgPos:null,className:"leaflet-div-icon"},createIcon:function(t){var e=t&&"DIV"===t.tagName?t:document.createElement("div"),n=this.options;if(n.html instanceof Element?(ae(e),e.appendChild(n.html)):e.innerHTML=!1!==n.html?n.html:"",n.bgPos){var i=O(n.bgPos);e.style.backgroundPosition=-i.x+"px "+-i.y+"px"}return this._setIconStyles(e,"icon"),e},createShadow:function(){return null}});kn.Default=In;var ni=Pn.extend({options:{tileSize:256,opacity:1,updateWhenIdle:vt,updateWhenZooming:!0,updateInterval:200,zIndex:1,bounds:null,minZoom:0,maxZoom:void 0,maxNativeZoom:void 0,minNativeZoom:void 0,noWrap:!1,pane:"tilePane",className:"",keepBuffer:2},initialize:function(t){p(this,t)},onAdd:function(){this._initContainer(),this._levels={},this._tiles={},this._resetView(),this._update()},beforeAdd:function(t){t._addZoomLimit(this)},onRemove:function(t){this._removeAllTiles(),re(this._container),t._removeZoomLimit(this),this._container=null,this._tileZoom=void 0},bringToFront:function(){return this._map&&(le(this._container),this._setAutoZIndex(Math.max)),this},bringToBack:function(){return this._map&&(he(this._container),this._setAutoZIndex(Math.min)),this},getContainer:function(){return this._container},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},isLoading:function(){return this._loading},redraw:function(){return this._map&&(this._removeAllTiles(),this._update()),this},getEvents:function(){var t={viewprereset:this._invalidateAll,viewreset:this._resetView,zoom:this._resetView,moveend:this._onMoveEnd};return this.options.updateWhenIdle||(this._onMove||(this._onMove=a(this._onMoveEnd,this.options.updateInterval,this)),t.move=this._onMove),this._zoomAnimated&&(t.zoomanim=this._animateZoom),t},createTile:function(){return document.createElement("div")},getTileSize:function(){var t=this.options.tileSize;return t instanceof A?t:new A(t,t)},_updateZIndex:function(){this._container&&null!=this.options.zIndex&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t){for(var e,n=this.getPane().children,i=-t(-1/0,1/0),o=0,s=n.length;o<s;o++)e=n[o].style.zIndex,n[o]!==this._container&&e&&(i=t(i,+e));isFinite(i)&&(this.options.zIndex=i+t(-1,1),this._updateZIndex())},_updateOpacity:function(){if(this._map&&!tt){_e(this._container,this.options.opacity);var t=+new Date,e=!1,n=!1;for(var i in this._tiles){var o=this._tiles[i];if(o.current&&o.loaded){var s=Math.min(1,(t-o.loaded)/200);_e(o.el,s),s<1?e=!0:(o.active?n=!0:this._onOpaqueTile(o),o.active=!0)}}n&&!this._noPrune&&this._pruneTiles(),e&&(P(this._fadeFrame),this._fadeFrame=C(this._updateOpacity,this))}},_onOpaqueTile:h,_initContainer:function(){this._container||(this._container=se("div","leaflet-layer "+(this.options.className||"")),this._updateZIndex(),this.options.opacity<1&&this._updateOpacity(),this.getPane().appendChild(this._container))},_updateLevels:function(){var t=this._tileZoom,e=this.options.maxZoom;if(void 0!==t){for(var n in this._levels)this._levels[n].el.children.length||n===t?(this._levels[n].el.style.zIndex=e-Math.abs(t-n),this._onUpdateLevel(n)):(re(this._levels[n].el),this._removeTilesAtZoom(n),this._onRemoveLevel(n),delete this._levels[n]);var i=this._levels[t],o=this._map;return i||((i=this._levels[t]={}).el=se("div","leaflet-tile-container leaflet-zoom-animated",this._container),i.el.style.zIndex=e,i.origin=o.project(o.unproject(o.getPixelOrigin()),t).round(),i.zoom=t,this._setZoomTransform(i,o.getCenter(),o.getZoom()),this._onCreateLevel(i)),this._level=i,i}},_onUpdateLevel:h,_onRemoveLevel:h,_onCreateLevel:h,_pruneTiles:function(){if(this._map){var t,e,n=this._map.getZoom();if(n>this.options.maxZoom||n<this.options.minZoom)this._removeAllTiles();else{for(t in this._tiles)(e=this._tiles[t]).retain=e.current;for(t in this._tiles)if((e=this._tiles[t]).current&&!e.active){var i=e.coords;this._retainParent(i.x,i.y,i.z,i.z-5)||this._retainChildren(i.x,i.y,i.z,i.z+2)}for(t in this._tiles)this._tiles[t].retain||this._removeTile(t)}}},_removeTilesAtZoom:function(t){for(var e in this._tiles)this._tiles[e].coords.z===t&&this._removeTile(e)},_removeAllTiles:function(){for(var t in this._tiles)this._removeTile(t)},_invalidateAll:function(){for(var t in this._levels)re(this._levels[t].el),this._onRemoveLevel(t),delete this._levels[t];this._removeAllTiles(),this._tileZoom=void 0},_retainParent:function(t,e,n,i){var o=Math.floor(t/2),s=Math.floor(e/2),r=n-1,a=new A(+o,+s);a.z=+r;var l=this._tileCoordsToKey(a),h=this._tiles[l];return h&&h.active?(h.retain=!0,!0):(h&&h.loaded&&(h.retain=!0),r>i&&this._retainParent(o,s,r,i))},_retainChildren:function(t,e,n,i){for(var o=2*t;o<2*t+2;o++)for(var s=2*e;s<2*e+2;s++){var r=new A(o,s);r.z=n+1;var a=this._tileCoordsToKey(r),l=this._tiles[a];l&&l.active?l.retain=!0:(l&&l.loaded&&(l.retain=!0),n+1<i&&this._retainChildren(o,s,n+1,i))}},_resetView:function(t){var e=t&&(t.pinch||t.flyTo);this._setView(this._map.getCenter(),this._map.getZoom(),e,e)},_animateZoom:function(t){this._setView(t.center,t.zoom,!0,t.noUpdate)},_clampZoom:function(t){var e=this.options;return void 0!==e.minNativeZoom&&t<e.minNativeZoom?e.minNativeZoom:void 0!==e.maxNativeZoom&&e.maxNativeZoom<t?e.maxNativeZoom:t},_setView:function(t,e,n,i){var o=this._clampZoom(Math.round(e));(void 0!==this.options.maxZoom&&o>this.options.maxZoom||void 0!==this.options.minZoom&&o<this.options.minZoom)&&(o=void 0),i&&!(this.options.updateWhenZooming&&o!==this._tileZoom)||(this._tileZoom=o,this._abortLoading&&this._abortLoading(),this._updateLevels(),this._resetGrid(),void 0!==o&&this._update(t),n||this._pruneTiles(),this._noPrune=!!n),this._setZoomTransforms(t,e)},_setZoomTransforms:function(t,e){for(var n in this._levels)this._setZoomTransform(this._levels[n],t,e)},_setZoomTransform:function(t,e,n){var i=this._map.getZoomScale(n,t.zoom),o=t.origin.multiplyBy(i).subtract(this._map._getNewPixelOrigin(e,n)).round();gt?ge(t.el,o,i):ve(t.el,o)},_resetGrid:function(){var t=this._map,e=t.options.crs,n=this._tileSize=this.getTileSize(),i=this._tileZoom,o=this._map.getPixelWorldBounds(this._tileZoom);o&&(this._globalTileRange=this._pxBoundsToTileRange(o)),this._wrapX=e.wrapLng&&!this.options.noWrap&&[Math.floor(t.project([0,e.wrapLng[0]],i).x/n.x),Math.ceil(t.project([0,e.wrapLng[1]],i).x/n.y)],this._wrapY=e.wrapLat&&!this.options.noWrap&&[Math.floor(t.project([e.wrapLat[0],0],i).y/n.x),Math.ceil(t.project([e.wrapLat[1],0],i).y/n.y)]},_onMoveEnd:function(){this._map&&!this._map._animatingZoom&&this._update()},_getTiledPixelBounds:function(t){var e=this._map,n=e._animatingZoom?Math.max(e._animateToZoom,e.getZoom()):e.getZoom(),i=e.getZoomScale(n,this._tileZoom),o=e.project(t,this._tileZoom).floor(),s=e.getSize().divideBy(2*i);return new z(o.subtract(s),o.add(s))},_update:function(t){var e=this._map;if(e){var n=this._clampZoom(e.getZoom());if(void 0===t&&(t=e.getCenter()),void 0!==this._tileZoom){var i=this._getTiledPixelBounds(t),o=this._pxBoundsToTileRange(i),s=o.getCenter(),r=[],a=this.options.keepBuffer,l=new z(o.getBottomLeft().subtract([a,-a]),o.getTopRight().add([a,-a]));if(!(isFinite(o.min.x)&&isFinite(o.min.y)&&isFinite(o.max.x)&&isFinite(o.max.y)))throw new Error("Attempted to load an infinite number of tiles");for(var h in this._tiles){var u=this._tiles[h].coords;u.z===this._tileZoom&&l.contains(new A(u.x,u.y))||(this._tiles[h].current=!1)}if(Math.abs(n-this._tileZoom)>1)this._setView(t,n);else{for(var c=o.min.y;c<=o.max.y;c++)for(var d=o.min.x;d<=o.max.x;d++){var p=new A(d,c);if(p.z=this._tileZoom,this._isValidTile(p)){var f=this._tiles[this._tileCoordsToKey(p)];f?f.current=!0:r.push(p)}}if(r.sort((function(t,e){return t.distanceTo(s)-e.distanceTo(s)})),0!==r.length){this._loading||(this._loading=!0,this.fire("loading"));var _=document.createDocumentFragment();for(d=0;d<r.length;d++)this._addTile(r[d],_);this._level.el.appendChild(_)}}}}},_isValidTile:function(t){var e=this._map.options.crs;if(!e.infinite){var n=this._globalTileRange;if(!e.wrapLng&&(t.x<n.min.x||t.x>n.max.x)||!e.wrapLat&&(t.y<n.min.y||t.y>n.max.y))return!1}if(!this.options.bounds)return!0;var i=this._tileCoordsToBounds(t);return Z(this.options.bounds).overlaps(i)},_keyToBounds:function(t){return this._tileCoordsToBounds(this._keyToTileCoords(t))},_tileCoordsToNwSe:function(t){var e=this._map,n=this.getTileSize(),i=t.scaleBy(n),o=i.add(n);return[e.unproject(i,t.z),e.unproject(o,t.z)]},_tileCoordsToBounds:function(t){var e=this._tileCoordsToNwSe(t),n=new R(e[0],e[1]);return this.options.noWrap||(n=this._map.wrapLatLngBounds(n)),n},_tileCoordsToKey:function(t){return t.x+":"+t.y+":"+t.z},_keyToTileCoords:function(t){var e=t.split(":"),n=new A(+e[0],+e[1]);return n.z=+e[2],n},_removeTile:function(t){var e=this._tiles[t];e&&(re(e.el),delete this._tiles[t],this.fire("tileunload",{tile:e.el,coords:this._keyToTileCoords(t)}))},_initTile:function(t){ce(t,"leaflet-tile");var e=this.getTileSize();t.style.width=e.x+"px",t.style.height=e.y+"px",t.onselectstart=h,t.onmousemove=h,tt&&this.options.opacity<1&&_e(t,this.options.opacity),it&&!ot&&(t.style.WebkitBackfaceVisibility="hidden")},_addTile:function(t,e){var n=this._getTilePos(t),i=this._tileCoordsToKey(t),s=this.createTile(this._wrapCoords(t),o(this._tileReady,this,t));this._initTile(s),this.createTile.length<2&&C(o(this._tileReady,this,t,null,s)),ve(s,n),this._tiles[i]={el:s,coords:t,current:!0},e.appendChild(s),this.fire("tileloadstart",{tile:s,coords:t})},_tileReady:function(t,e,n){e&&this.fire("tileerror",{error:e,tile:n,coords:t});var i=this._tileCoordsToKey(t);(n=this._tiles[i])&&(n.loaded=+new Date,this._map._fadeAnimated?(_e(n.el,0),P(this._fadeFrame),this._fadeFrame=C(this._updateOpacity,this)):(n.active=!0,this._pruneTiles()),e||(ce(n.el,"leaflet-tile-loaded"),this.fire("tileload",{tile:n.el,coords:t})),this._noTilesToLoad()&&(this._loading=!1,this.fire("load"),tt||!this._map._fadeAnimated?C(this._pruneTiles,this):setTimeout(o(this._pruneTiles,this),250)))},_getTilePos:function(t){return t.scaleBy(this.getTileSize()).subtract(this._level.origin)},_wrapCoords:function(t){var e=new A(this._wrapX?l(t.x,this._wrapX):t.x,this._wrapY?l(t.y,this._wrapY):t.y);return e.z=t.z,e},_pxBoundsToTileRange:function(t){var e=this.getTileSize();return new z(t.min.unscaleBy(e).floor(),t.max.unscaleBy(e).ceil().subtract([1,1]))},_noTilesToLoad:function(){for(var t in this._tiles)if(!this._tiles[t].loaded)return!1;return!0}}),ii=ni.extend({options:{minZoom:0,maxZoom:18,subdomains:"abc",errorTileUrl:"",zoomOffset:0,tms:!1,zoomReverse:!1,detectRetina:!1,crossOrigin:!1},initialize:function(t,e){this._url=t,(e=p(this,e)).detectRetina&&Pt&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomReverse?(e.zoomOffset--,e.minZoom++):(e.zoomOffset++,e.maxZoom--),e.minZoom=Math.max(0,e.minZoom)),"string"==typeof e.subdomains&&(e.subdomains=e.subdomains.split("")),it||this.on("tileunload",this._onTileRemove)},setUrl:function(t,e){return this._url===t&&void 0===e&&(e=!0),this._url=t,e||this.redraw(),this},createTile:function(t,e){var n=document.createElement("img");return Le(n,"load",o(this._tileOnLoad,this,e,n)),Le(n,"error",o(this._tileOnError,this,e,n)),(this.options.crossOrigin||""===this.options.crossOrigin)&&(n.crossOrigin=!0===this.options.crossOrigin?"":this.options.crossOrigin),n.alt="",n.setAttribute("role","presentation"),n.src=this.getTileUrl(t),n},getTileUrl:function(t){var e={r:Pt?"@2x":"",s:this._getSubdomain(t),x:t.x,y:t.y,z:this._getZoomForUrl()};if(this._map&&!this._map.options.crs.infinite){var i=this._globalTileRange.max.y-t.y;this.options.tms&&(e.y=i),e["-y"]=i}return m(this._url,n(e,this.options))},_tileOnLoad:function(t,e){tt?setTimeout(o(t,this,null,e),0):t(null,e)},_tileOnError:function(t,e,n){var i=this.options.errorTileUrl;i&&e.getAttribute("src")!==i&&(e.src=i),t(n,e)},_onTileRemove:function(t){t.tile.onload=null},_getZoomForUrl:function(){var t=this._tileZoom;return this.options.zoomReverse&&(t=this.options.maxZoom-t),t+this.options.zoomOffset},_getSubdomain:function(t){var e=Math.abs(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[e]},_abortLoading:function(){var t,e;for(t in this._tiles)this._tiles[t].coords.z!==this._tileZoom&&((e=this._tiles[t].el).onload=h,e.onerror=h,e.complete||(e.src=y,re(e),delete this._tiles[t]))},_removeTile:function(t){var e=this._tiles[t];if(e)return rt||e.el.setAttribute("src",y),ni.prototype._removeTile.call(this,t)},_tileReady:function(t,e,n){if(this._map&&(!n||n.getAttribute("src")!==y))return ni.prototype._tileReady.call(this,t,e,n)}});function oi(t,e){return new ii(t,e)}var si=ii.extend({defaultWmsParams:{service:"WMS",request:"GetMap",layers:"",styles:"",format:"image/jpeg",transparent:!1,version:"1.1.1"},options:{crs:null,uppercase:!1},initialize:function(t,e){this._url=t;var i=n({},this.defaultWmsParams);for(var o in e)o in this.options||(i[o]=e[o]);var s=(e=p(this,e)).detectRetina&&Pt?2:1,r=this.getTileSize();i.width=r.x*s,i.height=r.y*s,this.wmsParams=i},onAdd:function(t){this._crs=this.options.crs||t.options.crs,this._wmsVersion=parseFloat(this.wmsParams.version),this.wmsParams[this._wmsVersion>=1.3?"crs":"srs"]=this._crs.code,ii.prototype.onAdd.call(this,t)},getTileUrl:function(t){var e=this._tileCoordsToNwSe(t),n=this._crs,i=D(n.project(e[0]),n.project(e[1])),o=i.min,s=i.max,r=(this._wmsVersion>=1.3&&this._crs===En?[o.y,o.x,s.y,s.x]:[o.x,o.y,s.x,s.y]).join(","),a=ii.prototype.getTileUrl.call(this,t);return a+f(this.wmsParams,a,this.options.uppercase)+(this.options.uppercase?"&BBOX=":"&bbox=")+r},setParams:function(t,e){return n(this.wmsParams,t),e||this.redraw(),this}});ii.WMS=si,oi.wms=function(t,e){return new si(t,e)};var ri=Pn.extend({options:{padding:.1,tolerance:0},initialize:function(t){p(this,t),r(this),this._layers=this._layers||{}},onAdd:function(){this._container||(this._initContainer(),this._zoomAnimated&&ce(this._container,"leaflet-zoom-animated")),this.getPane().appendChild(this._container),this._update(),this.on("update",this._updatePaths,this)},onRemove:function(){this.off("update",this._updatePaths,this),this._destroyContainer()},getEvents:function(){var t={viewreset:this._reset,zoom:this._onZoom,moveend:this._update,zoomend:this._onZoomEnd};return this._zoomAnimated&&(t.zoomanim=this._onAnimZoom),t},_onAnimZoom:function(t){this._updateTransform(t.center,t.zoom)},_onZoom:function(){this._updateTransform(this._map.getCenter(),this._map.getZoom())},_updateTransform:function(t,e){var n=this._map.getZoomScale(e,this._zoom),i=ye(this._container),o=this._map.getSize().multiplyBy(.5+this.options.padding),s=this._map.project(this._center,e),r=this._map.project(t,e).subtract(s),a=o.multiplyBy(-n).add(i).add(o).subtract(r);gt?ge(this._container,a,n):ve(this._container,a)},_reset:function(){for(var t in this._update(),this._updateTransform(this._center,this._zoom),this._layers)this._layers[t]._reset()},_onZoomEnd:function(){for(var t in this._layers)this._layers[t]._project()},_updatePaths:function(){for(var t in this._layers)this._layers[t]._update()},_update:function(){var t=this.options.padding,e=this._map.getSize(),n=this._map.containerPointToLayerPoint(e.multiplyBy(-t)).round();this._bounds=new z(n,n.add(e.multiplyBy(1+2*t)).round()),this._center=this._map.getCenter(),this._zoom=this._map.getZoom()}}),ai=ri.extend({getEvents:function(){var t=ri.prototype.getEvents.call(this);return t.viewprereset=this._onViewPreReset,t},_onViewPreReset:function(){this._postponeUpdatePaths=!0},onAdd:function(){ri.prototype.onAdd.call(this),this._draw()},_initContainer:function(){var t=this._container=document.createElement("canvas");Le(t,"mousemove",a(this._onMouseMove,32,this),this),Le(t,"click dblclick mousedown mouseup contextmenu",this._onClick,this),Le(t,"mouseout",this._handleMouseOut,this),this._ctx=t.getContext("2d")},_destroyContainer:function(){P(this._redrawRequest),delete this._ctx,re(this._container),Ie(this._container),delete this._container},_updatePaths:function(){if(!this._postponeUpdatePaths){for(var t in this._redrawBounds=null,this._layers)this._layers[t]._update();this._redraw()}},_update:function(){if(!this._map._animatingZoom||!this._bounds){ri.prototype._update.call(this);var t=this._bounds,e=this._container,n=t.getSize(),i=Pt?2:1;ve(e,t.min),e.width=i*n.x,e.height=i*n.y,e.style.width=n.x+"px",e.style.height=n.y+"px",Pt&&this._ctx.scale(2,2),this._ctx.translate(-t.min.x,-t.min.y),this.fire("update")}},_reset:function(){ri.prototype._reset.call(this),this._postponeUpdatePaths&&(this._postponeUpdatePaths=!1,this._updatePaths())},_initPath:function(t){this._updateDashArray(t),this._layers[r(t)]=t;var e=t._order={layer:t,prev:this._drawLast,next:null};this._drawLast&&(this._drawLast.next=e),this._drawLast=e,this._drawFirst=this._drawFirst||this._drawLast},_addPath:function(t){this._requestRedraw(t)},_removePath:function(t){var e=t._order,n=e.next,i=e.prev;n?n.prev=i:this._drawLast=i,i?i.next=n:this._drawFirst=n,delete t._order,delete this._layers[r(t)],this._requestRedraw(t)},_updatePath:function(t){this._extendRedrawBounds(t),t._project(),t._update(),this._requestRedraw(t)},_updateStyle:function(t){this._updateDashArray(t),this._requestRedraw(t)},_updateDashArray:function(t){if("string"==typeof t.options.dashArray){var e,n,i=t.options.dashArray.split(/[, ]+/),o=[];for(n=0;n<i.length;n++){if(e=Number(i[n]),isNaN(e))return;o.push(e)}t.options._dashArray=o}else t.options._dashArray=t.options.dashArray},_requestRedraw:function(t){this._map&&(this._extendRedrawBounds(t),this._redrawRequest=this._redrawRequest||C(this._redraw,this))},_extendRedrawBounds:function(t){if(t._pxBounds){var e=(t.options.weight||0)+1;this._redrawBounds=this._redrawBounds||new z,this._redrawBounds.extend(t._pxBounds.min.subtract([e,e])),this._redrawBounds.extend(t._pxBounds.max.add([e,e]))}},_redraw:function(){this._redrawRequest=null,this._redrawBounds&&(this._redrawBounds.min._floor(),this._redrawBounds.max._ceil()),this._clear(),this._draw(),this._redrawBounds=null},_clear:function(){var t=this._redrawBounds;if(t){var e=t.getSize();this._ctx.clearRect(t.min.x,t.min.y,e.x,e.y)}else this._ctx.clearRect(0,0,this._container.width,this._container.height)},_draw:function(){var t,e=this._redrawBounds;if(this._ctx.save(),e){var n=e.getSize();this._ctx.beginPath(),this._ctx.rect(e.min.x,e.min.y,n.x,n.y),this._ctx.clip()}this._drawing=!0;for(var i=this._drawFirst;i;i=i.next)t=i.layer,(!e||t._pxBounds&&t._pxBounds.intersects(e))&&t._updatePath();this._drawing=!1,this._ctx.restore()},_updatePoly:function(t,e){if(this._drawing){var n,i,o,s,r=t._parts,a=r.length,l=this._ctx;if(a){for(l.beginPath(),n=0;n<a;n++){for(i=0,o=r[n].length;i<o;i++)l[i?"lineTo":"moveTo"]((s=r[n][i]).x,s.y);e&&l.closePath()}this._fillStroke(l,t)}}},_updateCircle:function(t){if(this._drawing&&!t._empty()){var e=t._point,n=this._ctx,i=Math.max(Math.round(t._radius),1),o=(Math.max(Math.round(t._radiusY),1)||i)/i;1!==o&&(n.save(),n.scale(1,o)),n.beginPath(),n.arc(e.x,e.y/o,i,0,2*Math.PI,!1),1!==o&&n.restore(),this._fillStroke(n,t)}},_fillStroke:function(t,e){var n=e.options;n.fill&&(t.globalAlpha=n.fillOpacity,t.fillStyle=n.fillColor||n.color,t.fill(n.fillRule||"evenodd")),n.stroke&&0!==n.weight&&(t.setLineDash&&t.setLineDash(e.options&&e.options._dashArray||[]),t.globalAlpha=n.opacity,t.lineWidth=n.weight,t.strokeStyle=n.color,t.lineCap=n.lineCap,t.lineJoin=n.lineJoin,t.stroke())},_onClick:function(t){for(var e,n,i=this._map.mouseEventToLayerPoint(t),o=this._drawFirst;o;o=o.next)(e=o.layer).options.interactive&&e._containsPoint(i)&&!this._map._draggableMoved(e)&&(n=e);n&&(Fe(t),this._fireEvent([n],t))},_onMouseMove:function(t){if(this._map&&!this._map.dragging.moving()&&!this._map._animatingZoom){var e=this._map.mouseEventToLayerPoint(t);this._handleMouseHover(t,e)}},_handleMouseOut:function(t){var e=this._hoveredLayer;e&&(de(this._container,"leaflet-interactive"),this._fireEvent([e],t,"mouseout"),this._hoveredLayer=null)},_handleMouseHover:function(t,e){for(var n,i,o=this._drawFirst;o;o=o.next)(n=o.layer).options.interactive&&n._containsPoint(e)&&(i=n);i!==this._hoveredLayer&&(this._handleMouseOut(t),i&&(ce(this._container,"leaflet-interactive"),this._fireEvent([i],t,"mouseover"),this._hoveredLayer=i)),this._hoveredLayer&&this._fireEvent([this._hoveredLayer],t)},_fireEvent:function(t,e,n){this._map._fireDOMEvent(e,n||e.type,t)},_bringToFront:function(t){var e=t._order;if(e){var n=e.next,i=e.prev;n&&(n.prev=i,i?i.next=n:n&&(this._drawFirst=n),e.prev=this._drawLast,this._drawLast.next=e,e.next=null,this._drawLast=e,this._requestRedraw(t))}},_bringToBack:function(t){var e=t._order;if(e){var n=e.next,i=e.prev;i&&(i.next=n,n?n.prev=i:i&&(this._drawLast=i),e.prev=null,e.next=this._drawFirst,this._drawFirst.prev=e,this._drawFirst=e,this._requestRedraw(t))}}});function li(t){return St?new ai(t):null}var hi=function(){try{return document.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return document.createElement("<lvml:"+t+' class="lvml">')}}catch(t){return function(t){return document.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),ui={_initContainer:function(){this._container=se("div","leaflet-vml-container")},_update:function(){this._map._animatingZoom||(ri.prototype._update.call(this),this.fire("update"))},_initPath:function(t){var e=t._container=hi("shape");ce(e,"leaflet-vml-shape "+(this.options.className||"")),e.coordsize="1 1",t._path=hi("path"),e.appendChild(t._path),this._updateStyle(t),this._layers[r(t)]=t},_addPath:function(t){var e=t._container;this._container.appendChild(e),t.options.interactive&&t.addInteractiveTarget(e)},_removePath:function(t){var e=t._container;re(e),t.removeInteractiveTarget(e),delete this._layers[r(t)]},_updateStyle:function(t){var e=t._stroke,n=t._fill,i=t.options,o=t._container;o.stroked=!!i.stroke,o.filled=!!i.fill,i.stroke?(e||(e=t._stroke=hi("stroke")),o.appendChild(e),e.weight=i.weight+"px",e.color=i.color,e.opacity=i.opacity,e.dashStyle=i.dashArray?g(i.dashArray)?i.dashArray.join(" "):i.dashArray.replace(/( *, *)/g," "):"",e.endcap=i.lineCap.replace("butt","flat"),e.joinstyle=i.lineJoin):e&&(o.removeChild(e),t._stroke=null),i.fill?(n||(n=t._fill=hi("fill")),o.appendChild(n),n.color=i.fillColor||i.color,n.opacity=i.fillOpacity):n&&(o.removeChild(n),t._fill=null)},_updateCircle:function(t){var e=t._point.round(),n=Math.round(t._radius),i=Math.round(t._radiusY||n);this._setPath(t,t._empty()?"M0 0":"AL "+e.x+","+e.y+" "+n+","+i+" 0,23592600")},_setPath:function(t,e){t._path.v=e},_bringToFront:function(t){le(t._container)},_bringToBack:function(t){he(t._container)}},ci=kt?hi:Y,di=ri.extend({getEvents:function(){var t=ri.prototype.getEvents.call(this);return t.zoomstart=this._onZoomStart,t},_initContainer:function(){this._container=ci("svg"),this._container.setAttribute("pointer-events","none"),this._rootGroup=ci("g"),this._container.appendChild(this._rootGroup)},_destroyContainer:function(){re(this._container),Ie(this._container),delete this._container,delete this._rootGroup,delete this._svgSize},_onZoomStart:function(){this._update()},_update:function(){if(!this._map._animatingZoom||!this._bounds){ri.prototype._update.call(this);var t=this._bounds,e=t.getSize(),n=this._container;this._svgSize&&this._svgSize.equals(e)||(this._svgSize=e,n.setAttribute("width",e.x),n.setAttribute("height",e.y)),ve(n,t.min),n.setAttribute("viewBox",[t.min.x,t.min.y,e.x,e.y].join(" ")),this.fire("update")}},_initPath:function(t){var e=t._path=ci("path");t.options.className&&ce(e,t.options.className),t.options.interactive&&ce(e,"leaflet-interactive"),this._updateStyle(t),this._layers[r(t)]=t},_addPath:function(t){this._rootGroup||this._initContainer(),this._rootGroup.appendChild(t._path),t.addInteractiveTarget(t._path)},_removePath:function(t){re(t._path),t.removeInteractiveTarget(t._path),delete this._layers[r(t)]},_updatePath:function(t){t._project(),t._update()},_updateStyle:function(t){var e=t._path,n=t.options;e&&(n.stroke?(e.setAttribute("stroke",n.color),e.setAttribute("stroke-opacity",n.opacity),e.setAttribute("stroke-width",n.weight),e.setAttribute("stroke-linecap",n.lineCap),e.setAttribute("stroke-linejoin",n.lineJoin),n.dashArray?e.setAttribute("stroke-dasharray",n.dashArray):e.removeAttribute("stroke-dasharray"),n.dashOffset?e.setAttribute("stroke-dashoffset",n.dashOffset):e.removeAttribute("stroke-dashoffset")):e.setAttribute("stroke","none"),n.fill?(e.setAttribute("fill",n.fillColor||n.color),e.setAttribute("fill-opacity",n.fillOpacity),e.setAttribute("fill-rule",n.fillRule||"evenodd")):e.setAttribute("fill","none"))},_updatePoly:function(t,e){this._setPath(t,J(t._parts,e))},_updateCircle:function(t){var e=t._point,n=Math.max(Math.round(t._radius),1),i="a"+n+","+(Math.max(Math.round(t._radiusY),1)||n)+" 0 1,0 ",o=t._empty()?"M0 0":"M"+(e.x-n)+","+e.y+i+2*n+",0 "+i+2*-n+",0 ";this._setPath(t,o)},_setPath:function(t,e){t._path.setAttribute("d",e)},_bringToFront:function(t){le(t._path)},_bringToBack:function(t){he(t._path)}});function pi(t){return Lt||kt?new di(t):null}kt&&di.include(ui),Ge.include({getRenderer:function(t){var e=t.options.renderer||this._getPaneRenderer(t.options.pane)||this.options.renderer||this._renderer;return e||(e=this._renderer=this._createRenderer()),this.hasLayer(e)||this.addLayer(e),e},_getPaneRenderer:function(t){if("overlayPane"===t||void 0===t)return!1;var e=this._paneRenderers[t];return void 0===e&&(e=this._createRenderer({pane:t}),this._paneRenderers[t]=e),e},_createRenderer:function(t){return this.options.preferCanvas&&li(t)||pi(t)}});var fi=Rn.extend({initialize:function(t,e){Rn.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){return this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return[(t=Z(t)).getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}});di.create=ci,di.pointsToPath=J,Zn.geometryToLayer=Bn,Zn.coordsToLatLng=jn,Zn.coordsToLatLngs=Vn,Zn.latLngToCoords=Hn,Zn.latLngsToCoords=Fn,Zn.getFeature=Un,Zn.asFeature=Wn,Ge.mergeOptions({boxZoom:!0});var _i=en.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){Le(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){Ie(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){re(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),Kt(),be(),this._startPoint=this._map.mouseEventToContainerPoint(t),Le(document,{contextmenu:Re,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=se("div","leaflet-zoom-box",this._container),ce(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t);var e=new z(this._point,this._startPoint),n=e.getSize();ve(this._box,e.min),this._box.style.width=n.x+"px",this._box.style.height=n.y+"px"},_finish:function(){this._moved&&(re(this._box),de(this._container,"leaflet-crosshair")),Yt(),xe(),Ie(document,{contextmenu:Re,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseUp:function(t){if((1===t.which||1===t.button)&&(this._finish(),this._moved)){this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(o(this._resetState,this),0);var e=new R(this._map.containerPointToLatLng(this._startPoint),this._map.containerPointToLatLng(this._point));this._map.fitBounds(e).fire("boxzoomend",{boxZoomBounds:e})}},_onKeyDown:function(t){27===t.keyCode&&this._finish()}});Ge.addInitHook("addHandler","boxZoom",_i),Ge.mergeOptions({doubleClickZoom:!0});var mi=en.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var e=this._map,n=e.getZoom(),i=e.options.zoomDelta,o=t.originalEvent.shiftKey?n-i:n+i;"center"===e.options.doubleClickZoom?e.setZoom(o):e.setZoomAround(t.containerPoint,o)}});Ge.addInitHook("addHandler","doubleClickZoom",mi),Ge.mergeOptions({dragging:!0,inertia:!ot,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,easeLinearity:.2,worldCopyJump:!1,maxBoundsViscosity:0});var gi=en.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new ln(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),this._draggable.on("predrag",this._onPreDragLimit,this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDragWrap,this),t.on("zoomend",this._onZoomEnd,this),t.whenReady(this._onZoomEnd,this))}ce(this._map._container,"leaflet-grab leaflet-touch-drag"),this._draggable.enable(),this._positions=[],this._times=[]},removeHooks:function(){de(this._map._container,"leaflet-grab"),de(this._map._container,"leaflet-touch-drag"),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},moving:function(){return this._draggable&&this._draggable._moving},_onDragStart:function(){var t=this._map;if(t._stop(),this._map.options.maxBounds&&this._map.options.maxBoundsViscosity){var e=Z(this._map.options.maxBounds);this._offsetLimit=D(this._map.latLngToContainerPoint(e.getNorthWest()).multiplyBy(-1),this._map.latLngToContainerPoint(e.getSouthEast()).multiplyBy(-1).add(this._map.getSize())),this._viscosity=Math.min(1,Math.max(0,this._map.options.maxBoundsViscosity))}else this._offsetLimit=null;t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(t){if(this._map.options.inertia){var e=this._lastTime=+new Date,n=this._lastPos=this._draggable._absPos||this._draggable._newPos;this._positions.push(n),this._times.push(e),this._prunePositions(e)}this._map.fire("move",t).fire("drag",t)},_prunePositions:function(t){for(;this._positions.length>1&&t-this._times[0]>50;)this._positions.shift(),this._times.shift()},_onZoomEnd:function(){var t=this._map.getSize().divideBy(2),e=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.getPixelWorldBounds().getSize().x},_viscousLimit:function(t,e){return t-(t-e)*this._viscosity},_onPreDragLimit:function(){if(this._viscosity&&this._offsetLimit){var t=this._draggable._newPos.subtract(this._draggable._startPos),e=this._offsetLimit;t.x<e.min.x&&(t.x=this._viscousLimit(t.x,e.min.x)),t.y<e.min.y&&(t.y=this._viscousLimit(t.y,e.min.y)),t.x>e.max.x&&(t.x=this._viscousLimit(t.x,e.max.x)),t.y>e.max.y&&(t.y=this._viscousLimit(t.y,e.max.y)),this._draggable._newPos=this._draggable._startPos.add(t)}},_onPreDragWrap:function(){var t=this._worldWidth,e=Math.round(t/2),n=this._initialWorldOffset,i=this._draggable._newPos.x,o=(i-e+n)%t+e-n,s=(i+e+n)%t-e-n,r=Math.abs(o+n)<Math.abs(s+n)?o:s;this._draggable._absPos=this._draggable._newPos.clone(),this._draggable._newPos.x=r},_onDragEnd:function(t){var e=this._map,n=e.options,i=!n.inertia||this._times.length<2;if(e.fire("dragend",t),i)e.fire("moveend");else{this._prunePositions(+new Date);var o=this._lastPos.subtract(this._positions[0]),s=n.easeLinearity,r=o.multiplyBy(s/((this._lastTime-this._times[0])/1e3)),a=r.distanceTo([0,0]),l=Math.min(n.inertiaMaxSpeed,a),h=r.multiplyBy(l/a),u=l/(n.inertiaDeceleration*s),c=h.multiplyBy(-u/2).round();c.x||c.y?(c=e._limitOffset(c,e.options.maxBounds),C((function(){e.panBy(c,{duration:u,easeLinearity:s,noMoveStart:!0,animate:!0})}))):e.fire("moveend")}}});Ge.addInitHook("addHandler","dragging",gi),Ge.mergeOptions({keyboard:!0,keyboardPanDelta:80});var vi=en.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61,171],zoomOut:[189,109,54,173]},initialize:function(t){this._map=t,this._setPanDelta(t.options.keyboardPanDelta),this._setZoomDelta(t.options.zoomDelta)},addHooks:function(){var t=this._map._container;t.tabIndex<=0&&(t.tabIndex="0"),Le(t,{focus:this._onFocus,blur:this._onBlur,mousedown:this._onMouseDown},this),this._map.on({focus:this._addHooks,blur:this._removeHooks},this)},removeHooks:function(){this._removeHooks(),Ie(this._map._container,{focus:this._onFocus,blur:this._onBlur,mousedown:this._onMouseDown},this),this._map.off({focus:this._addHooks,blur:this._removeHooks},this)},_onMouseDown:function(){if(!this._focused){var t=document.body,e=document.documentElement,n=t.scrollTop||e.scrollTop,i=t.scrollLeft||e.scrollLeft;this._map._container.focus(),window.scrollTo(i,n)}},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanDelta:function(t){var e,n,i=this._panKeys={},o=this.keyCodes;for(e=0,n=o.left.length;e<n;e++)i[o.left[e]]=[-1*t,0];for(e=0,n=o.right.length;e<n;e++)i[o.right[e]]=[t,0];for(e=0,n=o.down.length;e<n;e++)i[o.down[e]]=[0,t];for(e=0,n=o.up.length;e<n;e++)i[o.up[e]]=[0,-1*t]},_setZoomDelta:function(t){var e,n,i=this._zoomKeys={},o=this.keyCodes;for(e=0,n=o.zoomIn.length;e<n;e++)i[o.zoomIn[e]]=t;for(e=0,n=o.zoomOut.length;e<n;e++)i[o.zoomOut[e]]=-t},_addHooks:function(){Le(document,"keydown",this._onKeyDown,this)},_removeHooks:function(){Ie(document,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){if(!(t.altKey||t.ctrlKey||t.metaKey)){var e,n=t.keyCode,i=this._map;if(n in this._panKeys)i._panAnim&&i._panAnim._inProgress||(e=this._panKeys[n],t.shiftKey&&(e=O(e).multiplyBy(3)),i.panBy(e),i.options.maxBounds&&i.panInsideBounds(i.options.maxBounds));else if(n in this._zoomKeys)i.setZoom(i.getZoom()+(t.shiftKey?3:1)*this._zoomKeys[n]);else{if(27!==n||!i._popup||!i._popup.options.closeOnEscapeKey)return;i.closePopup()}Re(t)}}});Ge.addInitHook("addHandler","keyboard",vi),Ge.mergeOptions({scrollWheelZoom:!0,wheelDebounceTime:40,wheelPxPerZoomLevel:60});var yi=en.extend({addHooks:function(){Le(this._map._container,"mousewheel",this._onWheelScroll,this),this._delta=0},removeHooks:function(){Ie(this._map._container,"mousewheel",this._onWheelScroll,this)},_onWheelScroll:function(t){var e=je(t),n=this._map.options.wheelDebounceTime;this._delta+=e,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var i=Math.max(n-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(o(this._performZoom,this),i),Re(t)},_performZoom:function(){var t=this._map,e=t.getZoom(),n=this._map.options.zoomSnap||0;t._stop();var i=4*Math.log(2/(1+Math.exp(-Math.abs(this._delta/(4*this._map.options.wheelPxPerZoomLevel)))))/Math.LN2,o=n?Math.ceil(i/n)*n:i,s=t._limitZoom(e+(this._delta>0?o:-o))-e;this._delta=0,this._startTime=null,s&&("center"===t.options.scrollWheelZoom?t.setZoom(e+s):t.setZoomAround(this._lastMousePos,e+s))}});Ge.addInitHook("addHandler","scrollWheelZoom",yi),Ge.mergeOptions({tap:!0,tapTolerance:15});var wi=en.extend({addHooks:function(){Le(this._map._container,"touchstart",this._onDown,this)},removeHooks:function(){Ie(this._map._container,"touchstart",this._onDown,this)},_onDown:function(t){if(t.touches){if(De(t),this._fireClick=!0,t.touches.length>1)return this._fireClick=!1,void clearTimeout(this._holdTimeout);var e=t.touches[0],n=e.target;this._startPos=this._newPos=new A(e.clientX,e.clientY),n.tagName&&"a"===n.tagName.toLowerCase()&&ce(n,"leaflet-active"),this._holdTimeout=setTimeout(o((function(){this._isTapValid()&&(this._fireClick=!1,this._onUp(),this._simulateEvent("contextmenu",e))}),this),1e3),this._simulateEvent("mousedown",e),Le(document,{touchmove:this._onMove,touchend:this._onUp},this)}},_onUp:function(t){if(clearTimeout(this._holdTimeout),Ie(document,{touchmove:this._onMove,touchend:this._onUp},this),this._fireClick&&t&&t.changedTouches){var e=t.changedTouches[0],n=e.target;n&&n.tagName&&"a"===n.tagName.toLowerCase()&&de(n,"leaflet-active"),this._simulateEvent("mouseup",e),this._isTapValid()&&this._simulateEvent("click",e)}},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_onMove:function(t){var e=t.touches[0];this._newPos=new A(e.clientX,e.clientY),this._simulateEvent("mousemove",e)},_simulateEvent:function(t,e){var n=document.createEvent("MouseEvents");n._simulated=!0,e.target._simulatedClick=!0,n.initMouseEvent(t,!0,!0,window,1,e.screenX,e.screenY,e.clientX,e.clientY,!1,!1,!1,!1,0,null),e.target.dispatchEvent(n)}});Tt&&!xt&&Ge.addInitHook("addHandler","tap",wi),Ge.mergeOptions({touchZoom:Tt&&!ot,bounceAtZoomLimits:!0});var bi=en.extend({addHooks:function(){ce(this._map._container,"leaflet-touch-zoom"),Le(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){de(this._map._container,"leaflet-touch-zoom"),Ie(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(t){var e=this._map;if(t.touches&&2===t.touches.length&&!e._animatingZoom&&!this._zooming){var n=e.mouseEventToContainerPoint(t.touches[0]),i=e.mouseEventToContainerPoint(t.touches[1]);this._centerPoint=e.getSize()._divideBy(2),this._startLatLng=e.containerPointToLatLng(this._centerPoint),"center"!==e.options.touchZoom&&(this._pinchStartLatLng=e.containerPointToLatLng(n.add(i)._divideBy(2))),this._startDist=n.distanceTo(i),this._startZoom=e.getZoom(),this._moved=!1,this._zooming=!0,e._stop(),Le(document,"touchmove",this._onTouchMove,this),Le(document,"touchend",this._onTouchEnd,this),De(t)}},_onTouchMove:function(t){if(t.touches&&2===t.touches.length&&this._zooming){var e=this._map,n=e.mouseEventToContainerPoint(t.touches[0]),i=e.mouseEventToContainerPoint(t.touches[1]),s=n.distanceTo(i)/this._startDist;if(this._zoom=e.getScaleZoom(s,this._startZoom),!e.options.bounceAtZoomLimits&&(this._zoom<e.getMinZoom()&&s<1||this._zoom>e.getMaxZoom()&&s>1)&&(this._zoom=e._limitZoom(this._zoom)),"center"===e.options.touchZoom){if(this._center=this._startLatLng,1===s)return}else{var r=n._add(i)._divideBy(2)._subtract(this._centerPoint);if(1===s&&0===r.x&&0===r.y)return;this._center=e.unproject(e.project(this._pinchStartLatLng,this._zoom).subtract(r),this._zoom)}this._moved||(e._moveStart(!0,!1),this._moved=!0),P(this._animRequest);var a=o(e._move,e,this._center,this._zoom,{pinch:!0,round:!1});this._animRequest=C(a,this,!0),De(t)}},_onTouchEnd:function(){this._moved&&this._zooming?(this._zooming=!1,P(this._animRequest),Ie(document,"touchmove",this._onTouchMove),Ie(document,"touchend",this._onTouchEnd),this._map.options.zoomAnimation?this._map._animateZoom(this._center,this._map._limitZoom(this._zoom),!0,this._map.options.zoomSnap):this._map._resetView(this._center,this._map._limitZoom(this._zoom))):this._zooming=!1}});Ge.addInitHook("addHandler","touchZoom",bi),Ge.BoxZoom=_i,Ge.DoubleClickZoom=mi,Ge.Drag=gi,Ge.Keyboard=vi,Ge.ScrollWheelZoom=yi,Ge.Tap=wi,Ge.TouchZoom=bi,Object.freeze=e,t.version="1.5.1+build.2e3e0ffb",t.Control=Ke,t.control=Ye,t.Browser=Mt,t.Evented=M,t.Mixin=on,t.Util=S,t.Class=k,t.Handler=en,t.extend=n,t.bind=o,t.stamp=r,t.setOptions=p,t.DomEvent=qe,t.DomUtil=Se,t.PosAnimation=$e,t.Draggable=ln,t.LineUtil=gn,t.PolyUtil=yn,t.Point=A,t.point=O,t.Bounds=z,t.bounds=D,t.Transformation=W,t.transformation=q,t.Projection=xn,t.LatLng=B,t.latLng=j,t.LatLngBounds=R,t.latLngBounds=Z,t.CRS=H,t.GeoJSON=Zn,t.geoJSON=$n,t.geoJson=Gn,t.Layer=Pn,t.LayerGroup=Sn,t.layerGroup=function(t,e){return new Sn(t,e)},t.FeatureGroup=Ln,t.featureGroup=function(t){return new Ln(t)},t.ImageOverlay=Kn,t.imageOverlay=function(t,e,n){return new Kn(t,e,n)},t.VideoOverlay=Yn,t.videoOverlay=function(t,e,n){return new Yn(t,e,n)},t.SVGOverlay=Jn,t.svgOverlay=function(t,e,n){return new Jn(t,e,n)},t.DivOverlay=Qn,t.Popup=Xn,t.popup=function(t,e){return new Xn(t,e)},t.Tooltip=ti,t.tooltip=function(t,e){return new ti(t,e)},t.Icon=kn,t.icon=function(t){return new kn(t)},t.DivIcon=ei,t.divIcon=function(t){return new ei(t)},t.Marker=An,t.marker=function(t,e){return new An(t,e)},t.TileLayer=ii,t.tileLayer=oi,t.GridLayer=ni,t.gridLayer=function(t){return new ni(t)},t.SVG=di,t.svg=pi,t.Renderer=ri,t.Canvas=ai,t.canvas=li,t.Path=Nn,t.CircleMarker=On,t.circleMarker=function(t,e){return new On(t,e)},t.Circle=zn,t.circle=function(t,e,n){return new zn(t,e,n)},t.Polyline=Dn,t.polyline=function(t,e){return new Dn(t,e)},t.Polygon=Rn,t.polygon=function(t,e){return new Rn(t,e)},t.Rectangle=fi,t.rectangle=function(t,e){return new fi(t,e)},t.Map=Ge,t.map=function(t,e){return new Ge(t,e)};var xi=window.L;t.noConflict=function(){return window.L=xi,this},window.L=t}(e)},zUnb:function(t,e,n){"use strict";function i(t){return"function"==typeof t}n.r(e);let o=!1;const s={Promise:void 0,set useDeprecatedSynchronousErrorHandling(t){if(t){const t=new Error;console.warn("DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \n"+t.stack)}else o&&console.log("RxJS: Back to a better error behavior. Thank you. <3");o=t},get useDeprecatedSynchronousErrorHandling(){return o}};function r(t){setTimeout(()=>{throw t},0)}const a={closed:!0,next(t){},error(t){if(s.useDeprecatedSynchronousErrorHandling)throw t;r(t)},complete(){}},l=(()=>Array.isArray||(t=>t&&"number"==typeof t.length))();function h(t){return null!==t&&"object"==typeof t}const u=(()=>{function t(t){return Error.call(this),this.message=t?`${t.length} errors occurred during unsubscription:\n${t.map((t,e)=>`${e+1}) ${t.toString()}`).join("\n  ")}`:"",this.name="UnsubscriptionError",this.errors=t,this}return t.prototype=Object.create(Error.prototype),t})();let c=(()=>{class t{constructor(t){this.closed=!1,this._parentOrParents=null,this._subscriptions=null,t&&(this._unsubscribe=t)}unsubscribe(){let e;if(this.closed)return;let{_parentOrParents:n,_unsubscribe:o,_subscriptions:s}=this;if(this.closed=!0,this._parentOrParents=null,this._subscriptions=null,n instanceof t)n.remove(this);else if(null!==n)for(let t=0;t<n.length;++t)n[t].remove(this);if(i(o))try{o.call(this)}catch(r){e=r instanceof u?d(r.errors):[r]}if(l(s)){let t=-1,n=s.length;for(;++t<n;){const n=s[t];if(h(n))try{n.unsubscribe()}catch(r){e=e||[],r instanceof u?e=e.concat(d(r.errors)):e.push(r)}}}if(e)throw new u(e)}add(e){let n=e;if(!e)return t.EMPTY;switch(typeof e){case"function":n=new t(e);case"object":if(n===this||n.closed||"function"!=typeof n.unsubscribe)return n;if(this.closed)return n.unsubscribe(),n;if(!(n instanceof t)){const e=n;n=new t,n._subscriptions=[e]}break;default:throw new Error("unrecognized teardown "+e+" added to Subscription.")}let{_parentOrParents:i}=n;if(null===i)n._parentOrParents=this;else if(i instanceof t){if(i===this)return n;n._parentOrParents=[i,this]}else{if(-1!==i.indexOf(this))return n;i.push(this)}const o=this._subscriptions;return null===o?this._subscriptions=[n]:o.push(n),n}remove(t){const e=this._subscriptions;if(e){const n=e.indexOf(t);-1!==n&&e.splice(n,1)}}}return t.EMPTY=function(t){return t.closed=!0,t}(new t),t})();function d(t){return t.reduce((t,e)=>t.concat(e instanceof u?e.errors:e),[])}const p=(()=>"function"==typeof Symbol?Symbol("rxSubscriber"):"@@rxSubscriber_"+Math.random())();class f extends c{constructor(t,e,n){switch(super(),this.syncErrorValue=null,this.syncErrorThrown=!1,this.syncErrorThrowable=!1,this.isStopped=!1,arguments.length){case 0:this.destination=a;break;case 1:if(!t){this.destination=a;break}if("object"==typeof t){t instanceof f?(this.syncErrorThrowable=t.syncErrorThrowable,this.destination=t,t.add(this)):(this.syncErrorThrowable=!0,this.destination=new _(this,t));break}default:this.syncErrorThrowable=!0,this.destination=new _(this,t,e,n)}}[p](){return this}static create(t,e,n){const i=new f(t,e,n);return i.syncErrorThrowable=!1,i}next(t){this.isStopped||this._next(t)}error(t){this.isStopped||(this.isStopped=!0,this._error(t))}complete(){this.isStopped||(this.isStopped=!0,this._complete())}unsubscribe(){this.closed||(this.isStopped=!0,super.unsubscribe())}_next(t){this.destination.next(t)}_error(t){this.destination.error(t),this.unsubscribe()}_complete(){this.destination.complete(),this.unsubscribe()}_unsubscribeAndRecycle(){const{_parentOrParents:t}=this;return this._parentOrParents=null,this.unsubscribe(),this.closed=!1,this.isStopped=!1,this._parentOrParents=t,this}}class _ extends f{constructor(t,e,n,o){let s;super(),this._parentSubscriber=t;let r=this;i(e)?s=e:e&&(s=e.next,n=e.error,o=e.complete,e!==a&&(r=Object.create(e),i(r.unsubscribe)&&this.add(r.unsubscribe.bind(r)),r.unsubscribe=this.unsubscribe.bind(this))),this._context=r,this._next=s,this._error=n,this._complete=o}next(t){if(!this.isStopped&&this._next){const{_parentSubscriber:e}=this;s.useDeprecatedSynchronousErrorHandling&&e.syncErrorThrowable?this.__tryOrSetError(e,this._next,t)&&this.unsubscribe():this.__tryOrUnsub(this._next,t)}}error(t){if(!this.isStopped){const{_parentSubscriber:e}=this,{useDeprecatedSynchronousErrorHandling:n}=s;if(this._error)n&&e.syncErrorThrowable?(this.__tryOrSetError(e,this._error,t),this.unsubscribe()):(this.__tryOrUnsub(this._error,t),this.unsubscribe());else if(e.syncErrorThrowable)n?(e.syncErrorValue=t,e.syncErrorThrown=!0):r(t),this.unsubscribe();else{if(this.unsubscribe(),n)throw t;r(t)}}}complete(){if(!this.isStopped){const{_parentSubscriber:t}=this;if(this._complete){const e=()=>this._complete.call(this._context);s.useDeprecatedSynchronousErrorHandling&&t.syncErrorThrowable?(this.__tryOrSetError(t,e),this.unsubscribe()):(this.__tryOrUnsub(e),this.unsubscribe())}else this.unsubscribe()}}__tryOrUnsub(t,e){try{t.call(this._context,e)}catch(n){if(this.unsubscribe(),s.useDeprecatedSynchronousErrorHandling)throw n;r(n)}}__tryOrSetError(t,e,n){if(!s.useDeprecatedSynchronousErrorHandling)throw new Error("bad call");try{e.call(this._context,n)}catch(i){return s.useDeprecatedSynchronousErrorHandling?(t.syncErrorValue=i,t.syncErrorThrown=!0,!0):(r(i),!0)}return!1}_unsubscribe(){const{_parentSubscriber:t}=this;this._context=null,this._parentSubscriber=null,t.unsubscribe()}}const m=(()=>"function"==typeof Symbol&&Symbol.observable||"@@observable")();function g(){}let v=(()=>{class t{constructor(t){this._isScalar=!1,t&&(this._subscribe=t)}lift(e){const n=new t;return n.source=this,n.operator=e,n}subscribe(t,e,n){const{operator:i}=this,o=function(t,e,n){if(t){if(t instanceof f)return t;if(t[p])return t[p]()}return t||e||n?new f(t,e,n):new f(a)}(t,e,n);if(o.add(i?i.call(o,this.source):this.source||s.useDeprecatedSynchronousErrorHandling&&!o.syncErrorThrowable?this._subscribe(o):this._trySubscribe(o)),s.useDeprecatedSynchronousErrorHandling&&o.syncErrorThrowable&&(o.syncErrorThrowable=!1,o.syncErrorThrown))throw o.syncErrorValue;return o}_trySubscribe(t){try{return this._subscribe(t)}catch(e){s.useDeprecatedSynchronousErrorHandling&&(t.syncErrorThrown=!0,t.syncErrorValue=e),function(t){for(;t;){const{closed:e,destination:n,isStopped:i}=t;if(e||i)return!1;t=n&&n instanceof f?n:null}return!0}(t)?t.error(e):console.warn(e)}}forEach(t,e){return new(e=y(e))((e,n)=>{let i;i=this.subscribe(e=>{try{t(e)}catch(o){n(o),i&&i.unsubscribe()}},n,e)})}_subscribe(t){const{source:e}=this;return e&&e.subscribe(t)}[m](){return this}pipe(...t){return 0===t.length?this:((e=t)?1===e.length?e[0]:function(t){return e.reduce((t,e)=>e(t),t)}:g)(this);var e}toPromise(t){return new(t=y(t))((t,e)=>{let n;this.subscribe(t=>n=t,t=>e(t),()=>t(n))})}}return t.create=e=>new t(e),t})();function y(t){if(t||(t=s.Promise||Promise),!t)throw new Error("no Promise impl found");return t}const w=(()=>{function t(){return Error.call(this),this.message="object unsubscribed",this.name="ObjectUnsubscribedError",this}return t.prototype=Object.create(Error.prototype),t})();class b extends c{constructor(t,e){super(),this.subject=t,this.subscriber=e,this.closed=!1}unsubscribe(){if(this.closed)return;this.closed=!0;const t=this.subject,e=t.observers;if(this.subject=null,!e||0===e.length||t.isStopped||t.closed)return;const n=e.indexOf(this.subscriber);-1!==n&&e.splice(n,1)}}class x extends f{constructor(t){super(t),this.destination=t}}let T=(()=>{class t extends v{constructor(){super(),this.observers=[],this.closed=!1,this.isStopped=!1,this.hasError=!1,this.thrownError=null}[p](){return new x(this)}lift(t){const e=new E(this,this);return e.operator=t,e}next(t){if(this.closed)throw new w;if(!this.isStopped){const{observers:e}=this,n=e.length,i=e.slice();for(let o=0;o<n;o++)i[o].next(t)}}error(t){if(this.closed)throw new w;this.hasError=!0,this.thrownError=t,this.isStopped=!0;const{observers:e}=this,n=e.length,i=e.slice();for(let o=0;o<n;o++)i[o].error(t);this.observers.length=0}complete(){if(this.closed)throw new w;this.isStopped=!0;const{observers:t}=this,e=t.length,n=t.slice();for(let i=0;i<e;i++)n[i].complete();this.observers.length=0}unsubscribe(){this.isStopped=!0,this.closed=!0,this.observers=null}_trySubscribe(t){if(this.closed)throw new w;return super._trySubscribe(t)}_subscribe(t){if(this.closed)throw new w;return this.hasError?(t.error(this.thrownError),c.EMPTY):this.isStopped?(t.complete(),c.EMPTY):(this.observers.push(t),new b(this,t))}asObservable(){const t=new v;return t.source=this,t}}return t.create=(t,e)=>new E(t,e),t})();class E extends T{constructor(t,e){super(),this.destination=t,this.source=e}next(t){const{destination:e}=this;e&&e.next&&e.next(t)}error(t){const{destination:e}=this;e&&e.error&&this.destination.error(t)}complete(){const{destination:t}=this;t&&t.complete&&this.destination.complete()}_subscribe(t){const{source:e}=this;return e?this.source.subscribe(t):c.EMPTY}}class C extends f{constructor(t,e,n){super(),this.parent=t,this.outerValue=e,this.outerIndex=n,this.index=0}_next(t){this.parent.notifyNext(this.outerValue,t,this.outerIndex,this.index++,this)}_error(t){this.parent.notifyError(t,this),this.unsubscribe()}_complete(){this.parent.notifyComplete(this),this.unsubscribe()}}const P=t=>e=>{for(let n=0,i=t.length;n<i&&!e.closed;n++)e.next(t[n]);e.complete()};function S(){return"function"==typeof Symbol&&Symbol.iterator?Symbol.iterator:"@@iterator"}const L=S();const k=t=>{if(t&&"function"==typeof t[m])return s=t,t=>{const e=s[m]();if("function"!=typeof e.subscribe)throw new TypeError("Provided object does not correctly implement Symbol.observable");return e.subscribe(t)};if((e=t)&&"number"==typeof e.length&&"function"!=typeof e)return P(t);var e,n,i,o,s;if((n=t)&&"function"!=typeof n.subscribe&&"function"==typeof n.then)return o=t,t=>(o.then(e=>{t.closed||(t.next(e),t.complete())},e=>t.error(e)).then(null,r),t);if(t&&"function"==typeof t[L])return i=t,t=>{const e=i[L]();for(;;){const n=e.next();if(n.done){t.complete();break}if(t.next(n.value),t.closed)break}return"function"==typeof e.return&&t.add(()=>{e.return&&e.return()}),t};{const e=h(t)?"an invalid object":`'${t}'`;throw new TypeError(`You provided ${e} where a stream was expected.`+" You can provide an Observable, Promise, Array, or Iterable.")}};class I extends f{notifyNext(t,e,n,i,o){this.destination.next(e)}notifyError(t,e){this.destination.error(t)}notifyComplete(t){this.destination.complete()}}function M(t,e){return function(n){if("function"!=typeof t)throw new TypeError("argument is not a function. Are you looking for `mapTo()`?");return n.lift(new A(t,e))}}class A{constructor(t,e){this.project=t,this.thisArg=e}call(t,e){return e.subscribe(new N(t,this.project,this.thisArg))}}class N extends f{constructor(t,e,n){super(t),this.project=e,this.count=0,this.thisArg=n||this}_next(t){let e;try{e=this.project.call(this.thisArg,t,this.count++)}catch(n){return void this.destination.error(n)}this.destination.next(e)}}class O{constructor(t,e=Number.POSITIVE_INFINITY){this.project=t,this.concurrent=e}call(t,e){return e.subscribe(new z(t,this.project,this.concurrent))}}class z extends I{constructor(t,e,n=Number.POSITIVE_INFINITY){super(t),this.project=e,this.concurrent=n,this.hasCompleted=!1,this.buffer=[],this.active=0,this.index=0}_next(t){this.active<this.concurrent?this._tryNext(t):this.buffer.push(t)}_tryNext(t){let e;const n=this.index++;try{e=this.project(t,n)}catch(i){return void this.destination.error(i)}this.active++,this._innerSub(e,t,n)}_innerSub(t,e,n){const i=new C(this,e,n),o=this.destination;o.add(i);const s=function(t,e,n,i,o=new C(t,n,i)){if(!o.closed)return e instanceof v?e.subscribe(o):k(e)(o)}(this,t,void 0,void 0,i);s!==i&&o.add(s)}_complete(){this.hasCompleted=!0,0===this.active&&0===this.buffer.length&&this.destination.complete(),this.unsubscribe()}notifyNext(t,e,n,i,o){this.destination.next(e)}notifyComplete(t){const e=this.buffer;this.remove(t),this.active--,e.length>0?this._next(e.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()}}function D(t){return t}function R(...t){let e=Number.POSITIVE_INFINITY,n=null,i=t[t.length-1];var o;return(o=i)&&"function"==typeof o.schedule?(n=t.pop(),t.length>1&&"number"==typeof t[t.length-1]&&(e=t.pop())):"number"==typeof i&&(e=t.pop()),null===n&&1===t.length&&t[0]instanceof v?t[0]:function(t=Number.POSITIVE_INFINITY){return function t(e,n,i=Number.POSITIVE_INFINITY){return"function"==typeof n?o=>o.pipe(t((t,i)=>{return(o=e(t,i),o instanceof v?o:new v(k(o))).pipe(M((e,o)=>n(t,e,i,o)));var o},i)):("number"==typeof n&&(i=n),t=>t.lift(new O(e,i)))}(D,t)}(e)(function(t,e){return e?function(t,e){return new v(n=>{const i=new c;let o=0;return i.add(e.schedule((function(){o!==t.length?(n.next(t[o++]),n.closed||i.add(this.schedule())):n.complete()}))),i})}(t,e):new v(P(t))}(t,n))}function Z(){return function(t){return t.lift(new B(t))}}class B{constructor(t){this.connectable=t}call(t,e){const{connectable:n}=this;n._refCount++;const i=new j(t,n),o=e.subscribe(i);return i.closed||(i.connection=n.connect()),o}}class j extends f{constructor(t,e){super(t),this.connectable=e}_unsubscribe(){const{connectable:t}=this;if(!t)return void(this.connection=null);this.connectable=null;const e=t._refCount;if(e<=0)return void(this.connection=null);if(t._refCount=e-1,e>1)return void(this.connection=null);const{connection:n}=this,i=t._connection;this.connection=null,!i||n&&i!==n||i.unsubscribe()}}class V extends v{constructor(t,e){super(),this.source=t,this.subjectFactory=e,this._refCount=0,this._isComplete=!1}_subscribe(t){return this.getSubject().subscribe(t)}getSubject(){const t=this._subject;return t&&!t.isStopped||(this._subject=this.subjectFactory()),this._subject}connect(){let t=this._connection;return t||(this._isComplete=!1,t=this._connection=new c,t.add(this.source.subscribe(new F(this.getSubject(),this))),t.closed&&(this._connection=null,t=c.EMPTY)),t}refCount(){return Z()(this)}}const H=(()=>{const t=V.prototype;return{operator:{value:null},_refCount:{value:0,writable:!0},_subject:{value:null,writable:!0},_connection:{value:null,writable:!0},_subscribe:{value:t._subscribe},_isComplete:{value:t._isComplete,writable:!0},getSubject:{value:t.getSubject},connect:{value:t.connect},refCount:{value:t.refCount}}})();class F extends x{constructor(t,e){super(t),this.connectable=e}_error(t){this._unsubscribe(),super._error(t)}_complete(){this.connectable._isComplete=!0,this._unsubscribe(),super._complete()}_unsubscribe(){const t=this.connectable;if(t){this.connectable=null;const e=t._connection;t._refCount=0,t._subject=null,t._connection=null,e&&e.unsubscribe()}}}function U(){return new T}function W(t,e,n){const i=function(t){return function(...e){if(t){const n=t(...e);for(const t in n)this[t]=n[t]}}}(e);function o(...t){if(this instanceof o)return i.apply(this,t),this;const e=new o(...t);return n.annotation=e,n;function n(t,n,i){const o=t.hasOwnProperty("__parameters__")?t.__parameters__:Object.defineProperty(t,"__parameters__",{value:[]}).__parameters__;for(;o.length<=i;)o.push(null);return(o[i]=o[i]||[]).push(e),t}}return n&&(o.prototype=Object.create(n.prototype)),o.prototype.ngMetadataName=t,o.annotationCls=o,o}const q=W("Inject",t=>({token:t})),$=W("Optional"),G=W("Self"),K=W("SkipSelf");var Y=function(t){return t[t.Default=0]="Default",t[t.Host=1]="Host",t[t.Self=2]="Self",t[t.SkipSelf=4]="SkipSelf",t[t.Optional=8]="Optional",t}({});function J(t){for(let e in t)if(t[e]===J)return e;throw Error("Could not find renamed property on target object.")}function Q(t){return{token:t.token,providedIn:t.providedIn||null,factory:t.factory,value:void 0}}function X(t){const e=t[tt];return e&&e.token===t?e:null}const tt=J({ngInjectableDef:J});function et(t){if("string"==typeof t)return t;if(t instanceof Array)return"["+t.map(et).join(", ")+"]";if(null==t)return""+t;if(t.overriddenName)return`${t.overriddenName}`;if(t.name)return`${t.name}`;const e=t.toString();if(null==e)return""+e;const n=e.indexOf("\n");return-1===n?e:e.substring(0,n)}const nt=J({__forward_ref__:J});function it(t){return t.__forward_ref__=it,t.toString=function(){return et(this())},t}function ot(t){const e=t;return"function"==typeof e&&e.hasOwnProperty(nt)&&e.__forward_ref__===it?e():t}const st="undefined"!=typeof globalThis&&globalThis,rt="undefined"!=typeof window&&window,at="undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self,lt="undefined"!=typeof global&&global,ht=st||lt||rt||at;class ut{constructor(t,e){this._desc=t,this.ngMetadataName="InjectionToken",this.ngInjectableDef=void 0,"number"==typeof e?this.__NG_ELEMENT_ID__=e:void 0!==e&&(this.ngInjectableDef=Q({token:this,providedIn:e.providedIn||"root",factory:e.factory}))}toString(){return`InjectionToken ${this._desc}`}}const ct=new ut("INJECTOR",-1),dt=new Object,pt=/\n/gm,ft=J({provide:String,useValue:J});let _t=void 0;function mt(t){const e=_t;return _t=t,e}class gt{get(t,e=dt){if(e===dt){const e=new Error(`NullInjectorError: No provider for ${et(t)}!`);throw e.name="NullInjectorError",e}return e}}function vt(t,e,n,i=null){t=t&&"\n"===t.charAt(0)&&"\u0275"==t.charAt(1)?t.substr(2):t;let o=et(e);if(e instanceof Array)o=e.map(et).join(" -> ");else if("object"==typeof e){let t=[];for(let n in e)if(e.hasOwnProperty(n)){let i=e[n];t.push(n+":"+("string"==typeof i?JSON.stringify(i):et(i)))}o=`{${t.join(", ")}}`}return`${n}${i?"("+i+")":""}[${o}]: ${t.replace(pt,"\n  ")}`}class yt{}function wt(t,e,n){e>=t.length?t.push(n):t.splice(e,0,n)}function bt(t,e){return e>=t.length-1?t.pop():t.splice(e,1)[0]}const xt=function(){var t={Emulated:0,Native:1,None:2,ShadowDom:3};return t[t.Emulated]="Emulated",t[t.Native]="Native",t[t.None]="None",t[t.ShadowDom]="ShadowDom",t}(),Tt=(()=>("undefined"!=typeof requestAnimationFrame&&requestAnimationFrame||setTimeout).bind(ht))();function Et(t){return t.ngDebugContext}function Ct(t){return t.ngOriginalError}function Pt(t,...e){t.error(...e)}class St{constructor(){this._console=console}handleError(t){const e=this._findOriginalError(t),n=this._findContext(t),i=function(t){return t.ngErrorLogger||Pt}(t);i(this._console,"ERROR",t),e&&i(this._console,"ORIGINAL ERROR",e),n&&i(this._console,"ERROR CONTEXT",n)}_findContext(t){return t?Et(t)?Et(t):this._findContext(Ct(t)):null}_findOriginalError(t){let e=Ct(t);for(;e&&Ct(e);)e=Ct(e);return e}}let Lt=!0,kt=!1;function It(){return kt=!0,Lt}class Mt{constructor(t){if(this.defaultDoc=t,this.inertDocument=this.defaultDoc.implementation.createHTMLDocument("sanitization-inert"),this.inertBodyElement=this.inertDocument.body,null==this.inertBodyElement){const t=this.inertDocument.createElement("html");this.inertDocument.appendChild(t),this.inertBodyElement=this.inertDocument.createElement("body"),t.appendChild(this.inertBodyElement)}this.inertBodyElement.innerHTML='<svg><g onload="this.parentNode.remove()"></g></svg>',!this.inertBodyElement.querySelector||this.inertBodyElement.querySelector("svg")?(this.inertBodyElement.innerHTML='<svg><p><style><img src="</style><img src=x onerror=alert(1)//">',this.getInertBodyElement=this.inertBodyElement.querySelector&&this.inertBodyElement.querySelector("svg img")&&function(){try{return!!window.DOMParser}catch(t){return!1}}()?this.getInertBodyElement_DOMParser:this.getInertBodyElement_InertDocument):this.getInertBodyElement=this.getInertBodyElement_XHR}getInertBodyElement_XHR(t){t="<body><remove></remove>"+t+"</body>";try{t=encodeURI(t)}catch(i){return null}const e=new XMLHttpRequest;e.responseType="document",e.open("GET","data:text/html;charset=utf-8,"+t,!1),e.send(void 0);const n=e.response.body;return n.removeChild(n.firstChild),n}getInertBodyElement_DOMParser(t){t="<body><remove></remove>"+t+"</body>";try{const e=(new window.DOMParser).parseFromString(t,"text/html").body;return e.removeChild(e.firstChild),e}catch(e){return null}}getInertBodyElement_InertDocument(t){const e=this.inertDocument.createElement("template");return"content"in e?(e.innerHTML=t,e):(this.inertBodyElement.innerHTML=t,this.defaultDoc.documentMode&&this.stripCustomNsAttrs(this.inertBodyElement),this.inertBodyElement)}stripCustomNsAttrs(t){const e=t.attributes;for(let i=e.length-1;0<i;i--){const n=e.item(i).name;"xmlns:ns1"!==n&&0!==n.indexOf("ns1:")||t.removeAttribute(n)}let n=t.firstChild;for(;n;)n.nodeType===Node.ELEMENT_NODE&&this.stripCustomNsAttrs(n),n=n.nextSibling}}const At=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,Nt=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+\/]+=*$/i;function Ot(t){return(t=String(t)).match(At)||t.match(Nt)?t:(It()&&console.warn(`WARNING: sanitizing unsafe URL value ${t} (see http://g.co/ng/security#xss)`),"unsafe:"+t)}function zt(t){const e={};for(const n of t.split(","))e[n]=!0;return e}function Dt(...t){const e={};for(const n of t)for(const t in n)n.hasOwnProperty(t)&&(e[t]=!0);return e}const Rt=zt("area,br,col,hr,img,wbr"),Zt=zt("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),Bt=zt("rp,rt"),jt=Dt(Bt,Zt),Vt=Dt(Rt,Dt(Zt,zt("address,article,aside,blockquote,caption,center,del,details,dialog,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,main,map,menu,nav,ol,pre,section,summary,table,ul")),Dt(Bt,zt("a,abbr,acronym,audio,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,picture,q,ruby,rp,rt,s,samp,small,source,span,strike,strong,sub,sup,time,track,tt,u,var,video")),jt),Ht=zt("background,cite,href,itemtype,longdesc,poster,src,xlink:href"),Ft=zt("srcset"),Ut=Dt(Ht,Ft,zt("abbr,accesskey,align,alt,autoplay,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,controls,coords,datetime,default,dir,download,face,headers,height,hidden,hreflang,hspace,ismap,itemscope,itemprop,kind,label,lang,language,loop,media,muted,nohref,nowrap,open,preload,rel,rev,role,rows,rowspan,rules,scope,scrolling,shape,size,sizes,span,srclang,start,summary,tabindex,target,title,translate,type,usemap,valign,value,vspace,width"),zt("aria-activedescendant,aria-atomic,aria-autocomplete,aria-busy,aria-checked,aria-colcount,aria-colindex,aria-colspan,aria-controls,aria-current,aria-describedby,aria-details,aria-disabled,aria-dropeffect,aria-errormessage,aria-expanded,aria-flowto,aria-grabbed,aria-haspopup,aria-hidden,aria-invalid,aria-keyshortcuts,aria-label,aria-labelledby,aria-level,aria-live,aria-modal,aria-multiline,aria-multiselectable,aria-orientation,aria-owns,aria-placeholder,aria-posinset,aria-pressed,aria-readonly,aria-relevant,aria-required,aria-roledescription,aria-rowcount,aria-rowindex,aria-rowspan,aria-selected,aria-setsize,aria-sort,aria-valuemax,aria-valuemin,aria-valuenow,aria-valuetext")),Wt=zt("script,style,template");class qt{constructor(){this.sanitizedSomething=!1,this.buf=[]}sanitizeChildren(t){let e=t.firstChild,n=!0;for(;e;)if(e.nodeType===Node.ELEMENT_NODE?n=this.startElement(e):e.nodeType===Node.TEXT_NODE?this.chars(e.nodeValue):this.sanitizedSomething=!0,n&&e.firstChild)e=e.firstChild;else for(;e;){e.nodeType===Node.ELEMENT_NODE&&this.endElement(e);let t=this.checkClobberedElement(e,e.nextSibling);if(t){e=t;break}e=this.checkClobberedElement(e,e.parentNode)}return this.buf.join("")}startElement(t){const e=t.nodeName.toLowerCase();if(!Vt.hasOwnProperty(e))return this.sanitizedSomething=!0,!Wt.hasOwnProperty(e);this.buf.push("<"),this.buf.push(e);const n=t.attributes;for(let o=0;o<n.length;o++){const t=n.item(o),e=t.name,s=e.toLowerCase();if(!Ut.hasOwnProperty(s)){this.sanitizedSomething=!0;continue}let r=t.value;Ht[s]&&(r=Ot(r)),Ft[s]&&(i=r,r=(i=String(i)).split(",").map(t=>Ot(t.trim())).join(", ")),this.buf.push(" ",e,'="',Kt(r),'"')}var i;return this.buf.push(">"),!0}endElement(t){const e=t.nodeName.toLowerCase();Vt.hasOwnProperty(e)&&!Rt.hasOwnProperty(e)&&(this.buf.push("</"),this.buf.push(e),this.buf.push(">"))}chars(t){this.buf.push(Kt(t))}checkClobberedElement(t,e){if(e&&(t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_CONTAINED_BY)===Node.DOCUMENT_POSITION_CONTAINED_BY)throw new Error(`Failed to sanitize html because the element is clobbered: ${t.outerHTML}`);return e}}const $t=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,Gt=/([^\#-~ |!])/g;function Kt(t){return t.replace(/&/g,"&amp;").replace($t,(function(t){return"&#"+(1024*(t.charCodeAt(0)-55296)+(t.charCodeAt(1)-56320)+65536)+";"})).replace(Gt,(function(t){return"&#"+t.charCodeAt(0)+";"})).replace(/</g,"&lt;").replace(/>/g,"&gt;")}let Yt;function Jt(t){return"content"in t&&function(t){return t.nodeType===Node.ELEMENT_NODE&&"TEMPLATE"===t.nodeName}(t)?t.content:null}const Qt=function(){var t={NONE:0,HTML:1,STYLE:2,SCRIPT:3,URL:4,RESOURCE_URL:5};return t[t.NONE]="NONE",t[t.HTML]="HTML",t[t.STYLE]="STYLE",t[t.SCRIPT]="SCRIPT",t[t.URL]="URL",t[t.RESOURCE_URL]="RESOURCE_URL",t}();class Xt{}const te=new RegExp("^([-,.\"'%_!# a-zA-Z0-9]+|(?:(?:matrix|translate|scale|rotate|skew|perspective)(?:X|Y|Z|3d)?|(?:rgb|hsl)a?|(?:repeating-)?(?:linear|radial)-gradient|(?:calc|attr))\\([-0-9.%, #a-zA-Z]+\\))$","g"),ee=/^url\(([^)]+)\)$/,ne=/([A-Z])/g;function ie(t){try{return null!=t?t.toString().slice(0,30):t}catch(e){return"[ERROR] Exception while trying to serialize the value"}}let oe=(()=>{class t{}return t.__NG_ELEMENT_ID__=()=>se(),t})();const se=(...t)=>{},re=new ut("The presence of this token marks an injector as being the root injector."),ae=function(t,e,n){return new pe(t,e,n)};let le=(()=>{class t{static create(t,e){return Array.isArray(t)?ae(t,e,""):ae(t.providers,t.parent,t.name||"")}}return t.THROW_IF_NOT_FOUND=dt,t.NULL=new gt,t.ngInjectableDef=Q({token:t,providedIn:"any",factory:()=>function(t,e=Y.Default){return function(t,e=Y.Default){if(void 0===_t)throw new Error("inject() must be called from an injection context");return null===_t?function(t,e,n){const i=X(t);if(i&&"root"==i.providedIn)return void 0===i.value?i.value=i.factory():i.value;if(n&Y.Optional)return null;throw new Error(`Injector: NOT_FOUND [${et(t)}]`)}(t,0,e):_t.get(t,e&Y.Optional?null:void 0,e)}(t,e)}(ct)}),t.__NG_ELEMENT_ID__=-1,t})();const he=function(t){return t},ue=[],ce=he,de=function(){return Array.prototype.slice.call(arguments)};class pe{constructor(t,e=le.NULL,n=null){this.parent=e,this.source=n;const i=this._records=new Map;i.set(le,{token:le,fn:he,deps:ue,value:this,useNew:!1}),i.set(ct,{token:ct,fn:he,deps:ue,value:this,useNew:!1}),function t(e,n){if(n)if((n=ot(n))instanceof Array)for(let i=0;i<n.length;i++)t(e,n[i]);else{if("function"==typeof n)throw _e("Function/Class not supported",n);if(!n||"object"!=typeof n||!n.provide)throw _e("Unexpected provider",n);{let t=ot(n.provide);const i=function(t){const e=function(t){let e=ue;const n=t.deps;if(n&&n.length){e=[];for(let t=0;t<n.length;t++){let i=6,o=ot(n[t]);if(o instanceof Array)for(let t=0,e=o;t<e.length;t++){const n=e[t];n instanceof $||n==$?i|=1:n instanceof K||n==K?i&=-3:n instanceof G||n==G?i&=-5:o=n instanceof q?n.token:ot(n)}e.push({token:o,options:i})}}else if(t.useExisting)e=[{token:ot(t.useExisting),options:6}];else if(!(n||ft in t))throw _e("'deps' required",t);return e}(t);let n=he,i=ue,o=!1,s=ot(t.provide);if(ft in t)i=t.useValue;else if(t.useFactory)n=t.useFactory;else if(t.useExisting);else if(t.useClass)o=!0,n=ot(t.useClass);else{if("function"!=typeof s)throw _e("StaticProvider does not have [useValue|useFactory|useExisting|useClass] or [provide] is not newable",t);o=!0,n=s}return{deps:e,fn:n,useNew:o,value:i}}(n);if(!0===n.multi){let i=e.get(t);if(i){if(i.fn!==de)throw fe(t)}else e.set(t,i={token:n.provide,deps:[],useNew:!1,fn:de,value:ue});t=n,i.deps.push({token:t,options:6})}const o=e.get(t);if(o&&o.fn==de)throw fe(t);e.set(t,i)}}}(i,t)}get(t,e,n=Y.Default){const i=this._records.get(t);try{return function t(e,n,i,o,s,r){try{return function(e,n,i,o,s,r){let a;if(!n||r&Y.SkipSelf)r&Y.Self||(a=o.get(e,s,Y.Default));else{if(a=n.value,a==ce)throw Error("\u0275Circular dependency");if(a===ue){n.value=ce;let e=void 0,s=n.useNew,r=n.fn,l=n.deps,h=ue;if(l.length){h=[];for(let e=0;e<l.length;e++){const n=l[e],s=n.options,r=2&s?i.get(n.token):void 0;h.push(t(n.token,r,i,r||4&s?o:le.NULL,1&s?null:le.THROW_IF_NOT_FOUND,Y.Default))}}n.value=a=s?new r(...h):r.apply(e,h)}}return a}(e,n,i,o,s,r)}catch(a){throw a instanceof Error||(a=new Error(a)),(a.ngTempTokenPath=a.ngTempTokenPath||[]).unshift(e),n&&n.value==ce&&(n.value=ue),a}}(t,i,this._records,this.parent,e,n)}catch(o){return function(t,e,n,i){const o=t.ngTempTokenPath;throw e.__source&&o.unshift(e.__source),t.message=vt("\n"+t.message,o,"StaticInjectorError",i),t.ngTokenPath=o,t.ngTempTokenPath=null,t}(o,t,0,this.source)}}toString(){const t=[];return this._records.forEach((e,n)=>t.push(et(n))),`StaticInjector[${t.join(", ")}]`}}function fe(t){return _e("Cannot mix multi providers and regular providers",t)}function _e(t,e){return new Error(vt(t,e,"StaticInjectorError"))}let me=null;function ge(){if(!me){const t=ht.Symbol;if(t&&t.iterator)me=t.iterator;else{const t=Object.getOwnPropertyNames(Map.prototype);for(let e=0;e<t.length;++e){const n=t[e];"entries"!==n&&"size"!==n&&Map.prototype[n]===Map.prototype.entries&&(me=n)}}}return me}function ve(t,e){return t===e||"number"==typeof t&&"number"==typeof e&&isNaN(t)&&isNaN(e)}function ye(t,e){const n=be(t),i=be(e);if(n&&i)return function(t,e,n){const i=t[ge()](),o=e[ge()]();for(;;){const t=i.next(),e=o.next();if(t.done&&e.done)return!0;if(t.done||e.done)return!1;if(!n(t.value,e.value))return!1}}(t,e,ye);{const o=t&&("object"==typeof t||"function"==typeof t),s=e&&("object"==typeof e||"function"==typeof e);return!(n||!o||i||!s)||ve(t,e)}}class we{constructor(t){this.wrapped=t}static wrap(t){return new we(t)}static unwrap(t){return we.isWrapped(t)?t.wrapped:t}static isWrapped(t){return t instanceof we}}function be(t){return!!xe(t)&&(Array.isArray(t)||!(t instanceof Map)&&ge()in t)}function xe(t){return null!==t&&("function"==typeof t||"object"==typeof t)}function Te(t){return!!t&&"function"==typeof t.then}class Ee{constructor(t,e,n){this.previousValue=t,this.currentValue=e,this.firstChange=n}isFirstChange(){return this.firstChange}}class Ce{}function Pe(t){const e=Error(`No component factory found for ${et(t)}. Did you add it to @NgModule.entryComponents?`);return e[Se]=t,e}const Se="ngComponent";class Le{resolveComponentFactory(t){throw Pe(t)}}let ke=(()=>{class t{}return t.NULL=new Le,t})();class Ie{constructor(t,e,n){this._parent=e,this._ngModule=n,this._factories=new Map;for(let i=0;i<t.length;i++){const e=t[i];this._factories.set(e.componentType,e)}}resolveComponentFactory(t){let e=this._factories.get(t);if(!e&&this._parent&&(e=this._parent.resolveComponentFactory(t)),!e)throw Pe(t);return new Me(e,this._ngModule)}}class Me extends Ce{constructor(t,e){super(),this.factory=t,this.ngModule=e,this.selector=t.selector,this.componentType=t.componentType,this.ngContentSelectors=t.ngContentSelectors,this.inputs=t.inputs,this.outputs=t.outputs}create(t,e,n,i){return this.factory.create(t,e,n,i||this.ngModule)}}function Ae(...t){}let Ne=(()=>{class t{constructor(t){this.nativeElement=t}}return t.__NG_ELEMENT_ID__=()=>Oe(t),t})();const Oe=Ae;class ze{}class De{}const Re=function(){var t={Important:1,DashCase:2};return t[t.Important]="Important",t[t.DashCase]="DashCase",t}();let Ze=(()=>{class t{}return t.__NG_ELEMENT_ID__=()=>Be(),t})();const Be=Ae;class je{constructor(t){this.full=t,this.major=t.split(".")[0],this.minor=t.split(".")[1],this.patch=t.split(".").slice(2).join(".")}}const Ve=new je("8.2.14");class He{constructor(){}supports(t){return be(t)}create(t){return new Ue(t)}}const Fe=(t,e)=>e;class Ue{constructor(t){this.length=0,this._linkedRecords=null,this._unlinkedRecords=null,this._previousItHead=null,this._itHead=null,this._itTail=null,this._additionsHead=null,this._additionsTail=null,this._movesHead=null,this._movesTail=null,this._removalsHead=null,this._removalsTail=null,this._identityChangesHead=null,this._identityChangesTail=null,this._trackByFn=t||Fe}forEachItem(t){let e;for(e=this._itHead;null!==e;e=e._next)t(e)}forEachOperation(t){let e=this._itHead,n=this._removalsHead,i=0,o=null;for(;e||n;){const s=!n||e&&e.currentIndex<Ge(n,i,o)?e:n,r=Ge(s,i,o),a=s.currentIndex;if(s===n)i--,n=n._nextRemoved;else if(e=e._next,null==s.previousIndex)i++;else{o||(o=[]);const t=r-i,e=a-i;if(t!=e){for(let n=0;n<t;n++){const i=n<o.length?o[n]:o[n]=0,s=i+n;e<=s&&s<t&&(o[n]=i+1)}o[s.previousIndex]=e-t}}r!==a&&t(s,r,a)}}forEachPreviousItem(t){let e;for(e=this._previousItHead;null!==e;e=e._nextPrevious)t(e)}forEachAddedItem(t){let e;for(e=this._additionsHead;null!==e;e=e._nextAdded)t(e)}forEachMovedItem(t){let e;for(e=this._movesHead;null!==e;e=e._nextMoved)t(e)}forEachRemovedItem(t){let e;for(e=this._removalsHead;null!==e;e=e._nextRemoved)t(e)}forEachIdentityChange(t){let e;for(e=this._identityChangesHead;null!==e;e=e._nextIdentityChange)t(e)}diff(t){if(null==t&&(t=[]),!be(t))throw new Error(`Error trying to diff '${et(t)}'. Only arrays and iterables are allowed`);return this.check(t)?this:null}onDestroy(){}check(t){this._reset();let e,n,i,o=this._itHead,s=!1;if(Array.isArray(t)){this.length=t.length;for(let e=0;e<this.length;e++)n=t[e],i=this._trackByFn(e,n),null!==o&&ve(o.trackById,i)?(s&&(o=this._verifyReinsertion(o,n,i,e)),ve(o.item,n)||this._addIdentityChange(o,n)):(o=this._mismatch(o,n,i,e),s=!0),o=o._next}else e=0,function(t,e){if(Array.isArray(t))for(let n=0;n<t.length;n++)e(t[n]);else{const n=t[ge()]();let i;for(;!(i=n.next()).done;)e(i.value)}}(t,t=>{i=this._trackByFn(e,t),null!==o&&ve(o.trackById,i)?(s&&(o=this._verifyReinsertion(o,t,i,e)),ve(o.item,t)||this._addIdentityChange(o,t)):(o=this._mismatch(o,t,i,e),s=!0),o=o._next,e++}),this.length=e;return this._truncate(o),this.collection=t,this.isDirty}get isDirty(){return null!==this._additionsHead||null!==this._movesHead||null!==this._removalsHead||null!==this._identityChangesHead}_reset(){if(this.isDirty){let t,e;for(t=this._previousItHead=this._itHead;null!==t;t=t._next)t._nextPrevious=t._next;for(t=this._additionsHead;null!==t;t=t._nextAdded)t.previousIndex=t.currentIndex;for(this._additionsHead=this._additionsTail=null,t=this._movesHead;null!==t;t=e)t.previousIndex=t.currentIndex,e=t._nextMoved;this._movesHead=this._movesTail=null,this._removalsHead=this._removalsTail=null,this._identityChangesHead=this._identityChangesTail=null}}_mismatch(t,e,n,i){let o;return null===t?o=this._itTail:(o=t._prev,this._remove(t)),null!==(t=null===this._linkedRecords?null:this._linkedRecords.get(n,i))?(ve(t.item,e)||this._addIdentityChange(t,e),this._moveAfter(t,o,i)):null!==(t=null===this._unlinkedRecords?null:this._unlinkedRecords.get(n,null))?(ve(t.item,e)||this._addIdentityChange(t,e),this._reinsertAfter(t,o,i)):t=this._addAfter(new We(e,n),o,i),t}_verifyReinsertion(t,e,n,i){let o=null===this._unlinkedRecords?null:this._unlinkedRecords.get(n,null);return null!==o?t=this._reinsertAfter(o,t._prev,i):t.currentIndex!=i&&(t.currentIndex=i,this._addToMoves(t,i)),t}_truncate(t){for(;null!==t;){const e=t._next;this._addToRemovals(this._unlink(t)),t=e}null!==this._unlinkedRecords&&this._unlinkedRecords.clear(),null!==this._additionsTail&&(this._additionsTail._nextAdded=null),null!==this._movesTail&&(this._movesTail._nextMoved=null),null!==this._itTail&&(this._itTail._next=null),null!==this._removalsTail&&(this._removalsTail._nextRemoved=null),null!==this._identityChangesTail&&(this._identityChangesTail._nextIdentityChange=null)}_reinsertAfter(t,e,n){null!==this._unlinkedRecords&&this._unlinkedRecords.remove(t);const i=t._prevRemoved,o=t._nextRemoved;return null===i?this._removalsHead=o:i._nextRemoved=o,null===o?this._removalsTail=i:o._prevRemoved=i,this._insertAfter(t,e,n),this._addToMoves(t,n),t}_moveAfter(t,e,n){return this._unlink(t),this._insertAfter(t,e,n),this._addToMoves(t,n),t}_addAfter(t,e,n){return this._insertAfter(t,e,n),this._additionsTail=null===this._additionsTail?this._additionsHead=t:this._additionsTail._nextAdded=t,t}_insertAfter(t,e,n){const i=null===e?this._itHead:e._next;return t._next=i,t._prev=e,null===i?this._itTail=t:i._prev=t,null===e?this._itHead=t:e._next=t,null===this._linkedRecords&&(this._linkedRecords=new $e),this._linkedRecords.put(t),t.currentIndex=n,t}_remove(t){return this._addToRemovals(this._unlink(t))}_unlink(t){null!==this._linkedRecords&&this._linkedRecords.remove(t);const e=t._prev,n=t._next;return null===e?this._itHead=n:e._next=n,null===n?this._itTail=e:n._prev=e,t}_addToMoves(t,e){return t.previousIndex===e?t:(this._movesTail=null===this._movesTail?this._movesHead=t:this._movesTail._nextMoved=t,t)}_addToRemovals(t){return null===this._unlinkedRecords&&(this._unlinkedRecords=new $e),this._unlinkedRecords.put(t),t.currentIndex=null,t._nextRemoved=null,null===this._removalsTail?(this._removalsTail=this._removalsHead=t,t._prevRemoved=null):(t._prevRemoved=this._removalsTail,this._removalsTail=this._removalsTail._nextRemoved=t),t}_addIdentityChange(t,e){return t.item=e,this._identityChangesTail=null===this._identityChangesTail?this._identityChangesHead=t:this._identityChangesTail._nextIdentityChange=t,t}}class We{constructor(t,e){this.item=t,this.trackById=e,this.currentIndex=null,this.previousIndex=null,this._nextPrevious=null,this._prev=null,this._next=null,this._prevDup=null,this._nextDup=null,this._prevRemoved=null,this._nextRemoved=null,this._nextAdded=null,this._nextMoved=null,this._nextIdentityChange=null}}class qe{constructor(){this._head=null,this._tail=null}add(t){null===this._head?(this._head=this._tail=t,t._nextDup=null,t._prevDup=null):(this._tail._nextDup=t,t._prevDup=this._tail,t._nextDup=null,this._tail=t)}get(t,e){let n;for(n=this._head;null!==n;n=n._nextDup)if((null===e||e<=n.currentIndex)&&ve(n.trackById,t))return n;return null}remove(t){const e=t._prevDup,n=t._nextDup;return null===e?this._head=n:e._nextDup=n,null===n?this._tail=e:n._prevDup=e,null===this._head}}class $e{constructor(){this.map=new Map}put(t){const e=t.trackById;let n=this.map.get(e);n||(n=new qe,this.map.set(e,n)),n.add(t)}get(t,e){const n=this.map.get(t);return n?n.get(t,e):null}remove(t){const e=t.trackById;return this.map.get(e).remove(t)&&this.map.delete(e),t}get isEmpty(){return 0===this.map.size}clear(){this.map.clear()}}function Ge(t,e,n){const i=t.previousIndex;if(null===i)return i;let o=0;return n&&i<n.length&&(o=n[i]),i+e+o}class Ke{constructor(){}supports(t){return t instanceof Map||xe(t)}create(){return new Ye}}class Ye{constructor(){this._records=new Map,this._mapHead=null,this._appendAfter=null,this._previousMapHead=null,this._changesHead=null,this._changesTail=null,this._additionsHead=null,this._additionsTail=null,this._removalsHead=null,this._removalsTail=null}get isDirty(){return null!==this._additionsHead||null!==this._changesHead||null!==this._removalsHead}forEachItem(t){let e;for(e=this._mapHead;null!==e;e=e._next)t(e)}forEachPreviousItem(t){let e;for(e=this._previousMapHead;null!==e;e=e._nextPrevious)t(e)}forEachChangedItem(t){let e;for(e=this._changesHead;null!==e;e=e._nextChanged)t(e)}forEachAddedItem(t){let e;for(e=this._additionsHead;null!==e;e=e._nextAdded)t(e)}forEachRemovedItem(t){let e;for(e=this._removalsHead;null!==e;e=e._nextRemoved)t(e)}diff(t){if(t){if(!(t instanceof Map||xe(t)))throw new Error(`Error trying to diff '${et(t)}'. Only maps and objects are allowed`)}else t=new Map;return this.check(t)?this:null}onDestroy(){}check(t){this._reset();let e=this._mapHead;if(this._appendAfter=null,this._forEach(t,(t,n)=>{if(e&&e.key===n)this._maybeAddToChanges(e,t),this._appendAfter=e,e=e._next;else{const i=this._getOrCreateRecordForKey(n,t);e=this._insertBeforeOrAppend(e,i)}}),e){e._prev&&(e._prev._next=null),this._removalsHead=e;for(let t=e;null!==t;t=t._nextRemoved)t===this._mapHead&&(this._mapHead=null),this._records.delete(t.key),t._nextRemoved=t._next,t.previousValue=t.currentValue,t.currentValue=null,t._prev=null,t._next=null}return this._changesTail&&(this._changesTail._nextChanged=null),this._additionsTail&&(this._additionsTail._nextAdded=null),this.isDirty}_insertBeforeOrAppend(t,e){if(t){const n=t._prev;return e._next=t,e._prev=n,t._prev=e,n&&(n._next=e),t===this._mapHead&&(this._mapHead=e),this._appendAfter=t,t}return this._appendAfter?(this._appendAfter._next=e,e._prev=this._appendAfter):this._mapHead=e,this._appendAfter=e,null}_getOrCreateRecordForKey(t,e){if(this._records.has(t)){const n=this._records.get(t);this._maybeAddToChanges(n,e);const i=n._prev,o=n._next;return i&&(i._next=o),o&&(o._prev=i),n._next=null,n._prev=null,n}const n=new Je(t);return this._records.set(t,n),n.currentValue=e,this._addToAdditions(n),n}_reset(){if(this.isDirty){let t;for(this._previousMapHead=this._mapHead,t=this._previousMapHead;null!==t;t=t._next)t._nextPrevious=t._next;for(t=this._changesHead;null!==t;t=t._nextChanged)t.previousValue=t.currentValue;for(t=this._additionsHead;null!=t;t=t._nextAdded)t.previousValue=t.currentValue;this._changesHead=this._changesTail=null,this._additionsHead=this._additionsTail=null,this._removalsHead=null}}_maybeAddToChanges(t,e){ve(e,t.currentValue)||(t.previousValue=t.currentValue,t.currentValue=e,this._addToChanges(t))}_addToAdditions(t){null===this._additionsHead?this._additionsHead=this._additionsTail=t:(this._additionsTail._nextAdded=t,this._additionsTail=t)}_addToChanges(t){null===this._changesHead?this._changesHead=this._changesTail=t:(this._changesTail._nextChanged=t,this._changesTail=t)}_forEach(t,e){t instanceof Map?t.forEach(e):Object.keys(t).forEach(n=>e(t[n],n))}}class Je{constructor(t){this.key=t,this.previousValue=null,this.currentValue=null,this._nextPrevious=null,this._next=null,this._prev=null,this._nextAdded=null,this._nextRemoved=null,this._nextChanged=null}}let Qe=(()=>{class t{constructor(t){this.factories=t}static create(e,n){if(null!=n){const t=n.factories.slice();e=e.concat(t)}return new t(e)}static extend(e){return{provide:t,useFactory:n=>{if(!n)throw new Error("Cannot extend IterableDiffers without a parent injector");return t.create(e,n)},deps:[[t,new K,new $]]}}find(t){const e=this.factories.find(e=>e.supports(t));if(null!=e)return e;throw new Error(`Cannot find a differ supporting object '${t}' of type '${n=t,n.name||typeof n}'`);var n}}return t.ngInjectableDef=Q({token:t,providedIn:"root",factory:()=>new t([new He])}),t})(),Xe=(()=>{class t{constructor(t){this.factories=t}static create(e,n){if(n){const t=n.factories.slice();e=e.concat(t)}return new t(e)}static extend(e){return{provide:t,useFactory:n=>{if(!n)throw new Error("Cannot extend KeyValueDiffers without a parent injector");return t.create(e,n)},deps:[[t,new K,new $]]}}find(t){const e=this.factories.find(e=>e.supports(t));if(e)return e;throw new Error(`Cannot find a differ supporting object '${t}'`)}}return t.ngInjectableDef=Q({token:t,providedIn:"root",factory:()=>new t([new Ke])}),t})();const tn=[new Ke],en=new Qe([new He]),nn=new Xe(tn);let on=(()=>{class t{}return t.__NG_ELEMENT_ID__=()=>sn(t,Ne),t})();const sn=Ae;let rn=(()=>{class t{}return t.__NG_ELEMENT_ID__=()=>an(t,Ne),t})();const an=Ae;function ln(t,e,n,i){let o=`ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: '${e}'. Current value: '${n}'.`;return i&&(o+=" It seems like the view has been created after its parent and its children have been dirty checked. Has it been created in a change detection hook ?"),function(t,e){const n=new Error(t);return hn(n,e),n}(o,t)}function hn(t,e){t.ngDebugContext=e,t.ngErrorLogger=e.logError.bind(e)}function un(t){return new Error(`ViewDestroyedError: Attempt to use a destroyed view: ${t}`)}function cn(t,e,n){const i=t.state,o=1792&i;return o===e?(t.state=-1793&i|n,t.initIndex=-1,!0):o===n}function dn(t,e,n){return(1792&t.state)===e&&t.initIndex<=n&&(t.initIndex=n+1,!0)}function pn(t,e){return t.nodes[e]}function fn(t,e){return t.nodes[e]}function _n(t,e){return t.nodes[e]}function mn(t,e){return t.nodes[e]}function gn(t,e){return t.nodes[e]}const vn={setCurrentNode:void 0,createRootView:void 0,createEmbeddedView:void 0,createComponentView:void 0,createNgModuleRef:void 0,overrideProvider:void 0,overrideComponentView:void 0,clearOverrides:void 0,checkAndUpdateView:void 0,checkNoChangesView:void 0,destroyView:void 0,resolveDep:void 0,createDebugContext:void 0,handleEvent:void 0,updateDirectives:void 0,updateRenderer:void 0,dirtyParentQueries:void 0},yn=()=>{},wn=new Map;function bn(t){let e=wn.get(t);return e||(e=et(t)+"_"+wn.size,wn.set(t,e)),e}function xn(t){return{id:"$$undefined",styles:t.styles,encapsulation:t.encapsulation,data:t.data}}let Tn=0;function En(t,e,n,i){return!(!(2&t.state)&&ve(t.oldValues[e.bindingIndex+n],i))}function Cn(t,e,n,i){return!!En(t,e,n,i)&&(t.oldValues[e.bindingIndex+n]=i,!0)}function Pn(t,e,n,i){const o=t.oldValues[e.bindingIndex+n];if(1&t.state||!ye(o,i)){const s=e.bindings[n].name;throw ln(vn.createDebugContext(t,e.nodeIndex),`${s}: ${o}`,`${s}: ${i}`,0!=(1&t.state))}}function Sn(t){let e=t;for(;e;)2&e.def.flags&&(e.state|=8),e=e.viewContainerParent||e.parent}function Ln(t,e){let n=t;for(;n&&n!==e;)n.state|=64,n=n.viewContainerParent||n.parent}function kn(t,e,n,i){try{return Sn(33554432&t.def.nodes[e].flags?fn(t,e).componentView:t),vn.handleEvent(t,e,n,i)}catch(o){t.root.errorHandler.handleError(o)}}function In(t){return t.parent?fn(t.parent,t.parentNodeDef.nodeIndex):null}function Mn(t){return t.parent?t.parentNodeDef.parent:null}function An(t,e){switch(201347067&e.flags){case 1:return fn(t,e.nodeIndex).renderElement;case 2:return pn(t,e.nodeIndex).renderText}}function Nn(t){return!!t.parent&&!!(32768&t.parentNodeDef.flags)}function On(t){return!(!t.parent||32768&t.parentNodeDef.flags)}function zn(t){const e={};let n=0;const i={};return t&&t.forEach(([t,o])=>{"number"==typeof t?(e[t]=o,n|=function(t){return 1<<t%32}(t)):i[t]=o}),{matchedQueries:e,references:i,matchedQueryIds:n}}function Dn(t,e){return t.map(t=>{let n,i;return Array.isArray(t)?[i,n]=t:(i=0,n=t),n&&("function"==typeof n||"object"==typeof n)&&e&&Object.defineProperty(n,"__source",{value:e,configurable:!0}),{flags:i,token:n,tokenKey:bn(n)}})}function Rn(t,e,n){let i=n.renderParent;return i?0==(1&i.flags)||0==(33554432&i.flags)||i.element.componentRendererType&&i.element.componentRendererType.encapsulation===xt.Native?fn(t,n.renderParent.nodeIndex).renderElement:void 0:e}const Zn=new WeakMap;function Bn(t){let e=Zn.get(t);return e||(e=t(()=>yn),e.factory=t,Zn.set(t,e)),e}function jn(t,e,n,i,o){3===e&&(n=t.renderer.parentNode(An(t,t.def.lastRenderRootNode))),Vn(t,e,0,t.def.nodes.length-1,n,i,o)}function Vn(t,e,n,i,o,s,r){for(let a=n;a<=i;a++){const n=t.def.nodes[a];11&n.flags&&Fn(t,n,e,o,s,r),a+=n.childCount}}function Hn(t,e,n,i,o,s){let r=t;for(;r&&!Nn(r);)r=r.parent;const a=r.parent,l=Mn(r),h=l.nodeIndex+l.childCount;for(let u=l.nodeIndex+1;u<=h;u++){const t=a.def.nodes[u];t.ngContentIndex===e&&Fn(a,t,n,i,o,s),u+=t.childCount}if(!a.parent){const r=t.root.projectableNodes[e];if(r)for(let e=0;e<r.length;e++)Un(t,r[e],n,i,o,s)}}function Fn(t,e,n,i,o,s){if(8&e.flags)Hn(t,e.ngContent.index,n,i,o,s);else{const r=An(t,e);if(3===n&&33554432&e.flags&&48&e.bindingFlags?(16&e.bindingFlags&&Un(t,r,n,i,o,s),32&e.bindingFlags&&Un(fn(t,e.nodeIndex).componentView,r,n,i,o,s)):Un(t,r,n,i,o,s),16777216&e.flags){const r=fn(t,e.nodeIndex).viewContainer._embeddedViews;for(let t=0;t<r.length;t++)jn(r[t],n,i,o,s)}1&e.flags&&!e.element.name&&Vn(t,n,e.nodeIndex+1,e.nodeIndex+e.childCount,i,o,s)}}function Un(t,e,n,i,o,s){const r=t.renderer;switch(n){case 1:r.appendChild(i,e);break;case 2:r.insertBefore(i,e,o);break;case 3:r.removeChild(i,e);break;case 0:s.push(e)}}const Wn=/^:([^:]+):(.+)$/;function qn(t){if(":"===t[0]){const e=t.match(Wn);return[e[1],e[2]]}return["",t]}function $n(t){let e=0;for(let n=0;n<t.length;n++)e|=t[n].flags;return e}const Gn=new Object,Kn=bn(le),Yn=bn(ct),Jn=bn(yt);function Qn(t,e,n,i){return n=ot(n),{index:-1,deps:Dn(i,et(e)),flags:t,token:e,value:n}}function Xn(t,e,n=le.THROW_IF_NOT_FOUND){const i=mt(t);try{if(8&e.flags)return e.token;if(2&e.flags&&(n=null),1&e.flags)return t._parent.get(e.token,n);const r=e.tokenKey;switch(r){case Kn:case Yn:case Jn:return t}const a=t._def.providersByKey[r];let l;if(a){let e=t._providers[a.index];return void 0===e&&(e=t._providers[a.index]=ti(t,a)),e===Gn?void 0:e}if((l=X(e.token))&&(o=t,null!=(s=l).providedIn&&(function(t,e){return t._def.modules.indexOf(e)>-1}(o,s.providedIn)||"root"===s.providedIn&&o._def.isRoot))){const n=t._providers.length;return t._def.providers[n]=t._def.providersByKey[e.tokenKey]={flags:5120,value:l.factory,deps:[],index:n,token:e.token},t._providers[n]=Gn,t._providers[n]=ti(t,t._def.providersByKey[e.tokenKey])}return 4&e.flags?n:t._parent.get(e.token,n)}finally{mt(i)}var o,s}function ti(t,e){let n;switch(201347067&e.flags){case 512:n=function(t,e,n){const i=n.length;switch(i){case 0:return new e;case 1:return new e(Xn(t,n[0]));case 2:return new e(Xn(t,n[0]),Xn(t,n[1]));case 3:return new e(Xn(t,n[0]),Xn(t,n[1]),Xn(t,n[2]));default:const o=new Array(i);for(let e=0;e<i;e++)o[e]=Xn(t,n[e]);return new e(...o)}}(t,e.value,e.deps);break;case 1024:n=function(t,e,n){const i=n.length;switch(i){case 0:return e();case 1:return e(Xn(t,n[0]));case 2:return e(Xn(t,n[0]),Xn(t,n[1]));case 3:return e(Xn(t,n[0]),Xn(t,n[1]),Xn(t,n[2]));default:const o=Array(i);for(let e=0;e<i;e++)o[e]=Xn(t,n[e]);return e(...o)}}(t,e.value,e.deps);break;case 2048:n=Xn(t,e.deps[0]);break;case 256:n=e.value}return n===Gn||null===n||"object"!=typeof n||131072&e.flags||"function"!=typeof n.ngOnDestroy||(e.flags|=131072),void 0===n?Gn:n}function ei(t,e){const n=t.viewContainer._embeddedViews;if((null==e||e>=n.length)&&(e=n.length-1),e<0)return null;const i=n[e];return i.viewContainerParent=null,bt(n,e),vn.dirtyParentQueries(i),ii(i),i}function ni(t,e,n){const i=e?An(e,e.def.lastRenderRootNode):t.renderElement,o=n.renderer.parentNode(i),s=n.renderer.nextSibling(i);jn(n,2,o,s,void 0)}function ii(t){jn(t,3,null,null,void 0)}const oi=new Object;function si(t,e,n,i,o,s){return new ri(t,e,n,i,o,s)}class ri extends Ce{constructor(t,e,n,i,o,s){super(),this.selector=t,this.componentType=e,this._inputs=i,this._outputs=o,this.ngContentSelectors=s,this.viewDefFactory=n}get inputs(){const t=[],e=this._inputs;for(let n in e)t.push({propName:n,templateName:e[n]});return t}get outputs(){const t=[];for(let e in this._outputs)t.push({propName:e,templateName:this._outputs[e]});return t}create(t,e,n,i){if(!i)throw new Error("ngModule should be provided");const o=Bn(this.viewDefFactory),s=o.nodes[0].element.componentProvider.nodeIndex,r=vn.createRootView(t,e||[],n,o,i,oi),a=_n(r,s).instance;return n&&r.renderer.setAttribute(fn(r,0).renderElement,"ng-version",Ve.full),new ai(r,new ci(r),a)}}class ai extends class{}{constructor(t,e,n){super(),this._view=t,this._viewRef=e,this._component=n,this._elDef=this._view.def.nodes[0],this.hostView=e,this.changeDetectorRef=e,this.instance=n}get location(){return new Ne(fn(this._view,this._elDef.nodeIndex).renderElement)}get injector(){return new _i(this._view,this._elDef)}get componentType(){return this._component.constructor}destroy(){this._viewRef.destroy()}onDestroy(t){this._viewRef.onDestroy(t)}}function li(t,e,n){return new hi(t,e,n)}class hi{constructor(t,e,n){this._view=t,this._elDef=e,this._data=n,this._embeddedViews=[]}get element(){return new Ne(this._data.renderElement)}get injector(){return new _i(this._view,this._elDef)}get parentInjector(){let t=this._view,e=this._elDef.parent;for(;!e&&t;)e=Mn(t),t=t.parent;return t?new _i(t,e):new _i(this._view,null)}clear(){for(let t=this._embeddedViews.length-1;t>=0;t--){const e=ei(this._data,t);vn.destroyView(e)}}get(t){const e=this._embeddedViews[t];if(e){const t=new ci(e);return t.attachToViewContainerRef(this),t}return null}get length(){return this._embeddedViews.length}createEmbeddedView(t,e,n){const i=t.createEmbeddedView(e||{});return this.insert(i,n),i}createComponent(t,e,n,i,o){const s=n||this.parentInjector;o||t instanceof Me||(o=s.get(yt));const r=t.create(s,i,void 0,o);return this.insert(r.hostView,e),r}insert(t,e){if(t.destroyed)throw new Error("Cannot insert a destroyed View in a ViewContainer!");const n=t;return function(t,e,n,i){let o=e.viewContainer._embeddedViews;null==n&&(n=o.length),i.viewContainerParent=t,wt(o,n,i),function(t,e){const n=In(e);if(!n||n===t||16&e.state)return;e.state|=16;let i=n.template._projectedViews;i||(i=n.template._projectedViews=[]),i.push(e),function(t,e){if(4&e.flags)return;t.nodeFlags|=4,e.flags|=4;let n=e.parent;for(;n;)n.childFlags|=4,n=n.parent}(e.parent.def,e.parentNodeDef)}(e,i),vn.dirtyParentQueries(i),ni(e,n>0?o[n-1]:null,i)}(this._view,this._data,e,n._view),n.attachToViewContainerRef(this),t}move(t,e){if(t.destroyed)throw new Error("Cannot move a destroyed View in a ViewContainer!");const n=this._embeddedViews.indexOf(t._view);return function(t,e,n){const i=t.viewContainer._embeddedViews,o=i[e];bt(i,e),null==n&&(n=i.length),wt(i,n,o),vn.dirtyParentQueries(o),ii(o),ni(t,n>0?i[n-1]:null,o)}(this._data,n,e),t}indexOf(t){return this._embeddedViews.indexOf(t._view)}remove(t){const e=ei(this._data,t);e&&vn.destroyView(e)}detach(t){const e=ei(this._data,t);return e?new ci(e):null}}function ui(t){return new ci(t)}class ci{constructor(t){this._view=t,this._viewContainerRef=null,this._appRef=null}get rootNodes(){return function(t){const e=[];return jn(t,0,void 0,void 0,e),e}(this._view)}get context(){return this._view.context}get destroyed(){return 0!=(128&this._view.state)}markForCheck(){Sn(this._view)}detach(){this._view.state&=-5}detectChanges(){const t=this._view.root.rendererFactory;t.begin&&t.begin();try{vn.checkAndUpdateView(this._view)}finally{t.end&&t.end()}}checkNoChanges(){vn.checkNoChangesView(this._view)}reattach(){this._view.state|=4}onDestroy(t){this._view.disposables||(this._view.disposables=[]),this._view.disposables.push(t)}destroy(){this._appRef?this._appRef.detachView(this):this._viewContainerRef&&this._viewContainerRef.detach(this._viewContainerRef.indexOf(this)),vn.destroyView(this._view)}detachFromAppRef(){this._appRef=null,ii(this._view),vn.dirtyParentQueries(this._view)}attachToAppRef(t){if(this._viewContainerRef)throw new Error("This view is already attached to a ViewContainer!");this._appRef=t}attachToViewContainerRef(t){if(this._appRef)throw new Error("This view is already attached directly to the ApplicationRef!");this._viewContainerRef=t}}function di(t,e){return new pi(t,e)}class pi extends on{constructor(t,e){super(),this._parentView=t,this._def=e}createEmbeddedView(t){return new ci(vn.createEmbeddedView(this._parentView,this._def,this._def.element.template,t))}get elementRef(){return new Ne(fn(this._parentView,this._def.nodeIndex).renderElement)}}function fi(t,e){return new _i(t,e)}class _i{constructor(t,e){this.view=t,this.elDef=e}get(t,e=le.THROW_IF_NOT_FOUND){return vn.resolveDep(this.view,this.elDef,!!this.elDef&&0!=(33554432&this.elDef.flags),{flags:0,token:t,tokenKey:bn(t)},e)}}function mi(t){return new gi(t.renderer)}class gi{constructor(t){this.delegate=t}selectRootElement(t){return this.delegate.selectRootElement(t)}createElement(t,e){const[n,i]=qn(e),o=this.delegate.createElement(i,n);return t&&this.delegate.appendChild(t,o),o}createViewRoot(t){return t}createTemplateAnchor(t){const e=this.delegate.createComment("");return t&&this.delegate.appendChild(t,e),e}createText(t,e){const n=this.delegate.createText(e);return t&&this.delegate.appendChild(t,n),n}projectNodes(t,e){for(let n=0;n<e.length;n++)this.delegate.appendChild(t,e[n])}attachViewAfter(t,e){const n=this.delegate.parentNode(t),i=this.delegate.nextSibling(t);for(let o=0;o<e.length;o++)this.delegate.insertBefore(n,e[o],i)}detachView(t){for(let e=0;e<t.length;e++){const n=t[e],i=this.delegate.parentNode(n);this.delegate.removeChild(i,n)}}destroyView(t,e){for(let n=0;n<e.length;n++)this.delegate.destroyNode(e[n])}listen(t,e,n){return this.delegate.listen(t,e,n)}listenGlobal(t,e,n){return this.delegate.listen(t,e,n)}setElementProperty(t,e,n){this.delegate.setProperty(t,e,n)}setElementAttribute(t,e,n){const[i,o]=qn(e);null!=n?this.delegate.setAttribute(t,o,n,i):this.delegate.removeAttribute(t,o,i)}setBindingDebugInfo(t,e,n){}setElementClass(t,e,n){n?this.delegate.addClass(t,e):this.delegate.removeClass(t,e)}setElementStyle(t,e,n){null!=n?this.delegate.setStyle(t,e,n):this.delegate.removeStyle(t,e)}invokeElementMethod(t,e,n){t[e].apply(t,n)}setText(t,e){this.delegate.setValue(t,e)}animate(){throw new Error("Renderer.animate is no longer supported!")}}function vi(t,e,n,i){return new yi(t,e,n,i)}class yi{constructor(t,e,n,i){this._moduleType=t,this._parent=e,this._bootstrapComponents=n,this._def=i,this._destroyListeners=[],this._destroyed=!1,this.injector=this,function(t){const e=t._def,n=t._providers=new Array(e.providers.length);for(let i=0;i<e.providers.length;i++){const o=e.providers[i];4096&o.flags||void 0===n[i]&&(n[i]=ti(t,o))}}(this)}get(t,e=le.THROW_IF_NOT_FOUND,n=Y.Default){let i=0;return n&Y.SkipSelf?i|=1:n&Y.Self&&(i|=4),Xn(this,{token:t,tokenKey:bn(t),flags:i},e)}get instance(){return this.get(this._moduleType)}get componentFactoryResolver(){return this.get(ke)}destroy(){if(this._destroyed)throw new Error(`The ng module ${et(this.instance.constructor)} has already been destroyed.`);this._destroyed=!0,function(t,e){const n=t._def,i=new Set;for(let o=0;o<n.providers.length;o++)if(131072&n.providers[o].flags){const e=t._providers[o];if(e&&e!==Gn){const t=e.ngOnDestroy;"function"!=typeof t||i.has(e)||(t.apply(e),i.add(e))}}}(this),this._destroyListeners.forEach(t=>t())}onDestroy(t){this._destroyListeners.push(t)}}const wi=bn(ze),bi=bn(Ze),xi=bn(Ne),Ti=bn(rn),Ei=bn(on),Ci=bn(oe),Pi=bn(le),Si=bn(ct);function Li(t,e,n,i,o,s,r,a){const l=[];if(r)for(let u in r){const[t,e]=r[u];l[t]={flags:8,name:u,nonMinifiedName:e,ns:null,securityContext:null,suffix:null}}const h=[];if(a)for(let u in a)h.push({type:1,propName:u,target:null,eventName:a[u]});return function(t,e,n,i,o,s,r,a,l){const{matchedQueries:h,references:u,matchedQueryIds:c}=zn(n);l||(l=[]),a||(a=[]),s=ot(s);const d=Dn(r,et(o));return{nodeIndex:-1,parent:null,renderParent:null,bindingIndex:-1,outputIndex:-1,checkIndex:t,flags:e,childFlags:0,directChildFlags:0,childMatchedQueries:0,matchedQueries:h,matchedQueryIds:c,references:u,ngContentIndex:-1,childCount:i,bindings:a,bindingFlags:$n(a),outputs:l,element:null,provider:{token:o,value:s,deps:d},text:null,query:null,ngContent:null}}(t,e|=16384,n,i,o,o,s,l,h)}function ki(t,e){return Ni(t,e)}function Ii(t,e){let n=t;for(;n.parent&&!Nn(n);)n=n.parent;return Oi(n.parent,Mn(n),!0,e.provider.value,e.provider.deps)}function Mi(t,e){const n=Oi(t,e.parent,(32768&e.flags)>0,e.provider.value,e.provider.deps);if(e.outputs.length)for(let o=0;o<e.outputs.length;o++){const s=e.outputs[o],r=n[s.propName];if(!(i=r)||"function"!=typeof i.subscribe)throw new Error(`@Output ${s.propName} not initialized in '${n.constructor.name}'.`);{const n=r.subscribe(Ai(t,e.parent.nodeIndex,s.eventName));t.disposables[e.outputIndex+o]=n.unsubscribe.bind(n)}}var i;return n}function Ai(t,e,n){return i=>kn(t,e,n,i)}function Ni(t,e){const n=(8192&e.flags)>0,i=e.provider;switch(201347067&e.flags){case 512:return Oi(t,e.parent,n,i.value,i.deps);case 1024:return function(t,e,n,i,o){const s=o.length;switch(s){case 0:return i();case 1:return i(Di(t,e,n,o[0]));case 2:return i(Di(t,e,n,o[0]),Di(t,e,n,o[1]));case 3:return i(Di(t,e,n,o[0]),Di(t,e,n,o[1]),Di(t,e,n,o[2]));default:const r=Array(s);for(let i=0;i<s;i++)r[i]=Di(t,e,n,o[i]);return i(...r)}}(t,e.parent,n,i.value,i.deps);case 2048:return Di(t,e.parent,n,i.deps[0]);case 256:return i.value}}function Oi(t,e,n,i,o){const s=o.length;switch(s){case 0:return new i;case 1:return new i(Di(t,e,n,o[0]));case 2:return new i(Di(t,e,n,o[0]),Di(t,e,n,o[1]));case 3:return new i(Di(t,e,n,o[0]),Di(t,e,n,o[1]),Di(t,e,n,o[2]));default:const r=new Array(s);for(let i=0;i<s;i++)r[i]=Di(t,e,n,o[i]);return new i(...r)}}const zi={};function Di(t,e,n,i,o=le.THROW_IF_NOT_FOUND){if(8&i.flags)return i.token;const s=t;2&i.flags&&(o=null);const r=i.tokenKey;r===Ci&&(n=!(!e||!e.element.componentView)),e&&1&i.flags&&(n=!1,e=e.parent);let a=t;for(;a;){if(e)switch(r){case wi:return mi(Ri(a,e,n));case bi:return Ri(a,e,n).renderer;case xi:return new Ne(fn(a,e.nodeIndex).renderElement);case Ti:return fn(a,e.nodeIndex).viewContainer;case Ei:if(e.element.template)return fn(a,e.nodeIndex).template;break;case Ci:return ui(Ri(a,e,n));case Pi:case Si:return fi(a,e);default:const t=(n?e.element.allProviders:e.element.publicProviders)[r];if(t){let e=_n(a,t.nodeIndex);return e||(e={instance:Ni(a,t)},a.nodes[t.nodeIndex]=e),e.instance}}n=Nn(a),e=Mn(a),a=a.parent,4&i.flags&&(a=null)}const l=s.root.injector.get(i.token,zi);return l!==zi||o===zi?l:s.root.ngModule.injector.get(i.token,o)}function Ri(t,e,n){let i;if(n)i=fn(t,e.nodeIndex).componentView;else for(i=t;i.parent&&!Nn(i);)i=i.parent;return i}function Zi(t,e,n,i,o,s){if(32768&n.flags){const e=fn(t,n.parent.nodeIndex).componentView;2&e.def.flags&&(e.state|=8)}if(e.instance[n.bindings[i].name]=o,524288&n.flags){s=s||{};const e=we.unwrap(t.oldValues[n.bindingIndex+i]);s[n.bindings[i].nonMinifiedName]=new Ee(e,o,0!=(2&t.state))}return t.oldValues[n.bindingIndex+i]=o,s}function Bi(t,e){if(!(t.def.nodeFlags&e))return;const n=t.def.nodes;let i=0;for(let o=0;o<n.length;o++){const s=n[o];let r=s.parent;for(!r&&s.flags&e&&Vi(t,o,s.flags&e,i++),0==(s.childFlags&e)&&(o+=s.childCount);r&&1&r.flags&&o===r.nodeIndex+r.childCount;)r.directChildFlags&e&&(i=ji(t,r,e,i)),r=r.parent}}function ji(t,e,n,i){for(let o=e.nodeIndex+1;o<=e.nodeIndex+e.childCount;o++){const e=t.def.nodes[o];e.flags&n&&Vi(t,o,e.flags&n,i++),o+=e.childCount}return i}function Vi(t,e,n,i){const o=_n(t,e);if(!o)return;const s=o.instance;s&&(vn.setCurrentNode(t,e),1048576&n&&dn(t,512,i)&&s.ngAfterContentInit(),2097152&n&&s.ngAfterContentChecked(),4194304&n&&dn(t,768,i)&&s.ngAfterViewInit(),8388608&n&&s.ngAfterViewChecked(),131072&n&&s.ngOnDestroy())}const Hi=new ut("SCHEDULER_TOKEN",{providedIn:"root",factory:()=>Tt}),Fi={},Ui=function(){var t={LocaleId:0,DayPeriodsFormat:1,DayPeriodsStandalone:2,DaysFormat:3,DaysStandalone:4,MonthsFormat:5,MonthsStandalone:6,Eras:7,FirstDayOfWeek:8,WeekendRange:9,DateFormat:10,TimeFormat:11,DateTimeFormat:12,NumberSymbols:13,NumberFormats:14,CurrencySymbol:15,CurrencyName:16,Currencies:17,PluralCase:18,ExtraData:19};return t[t.LocaleId]="LocaleId",t[t.DayPeriodsFormat]="DayPeriodsFormat",t[t.DayPeriodsStandalone]="DayPeriodsStandalone",t[t.DaysFormat]="DaysFormat",t[t.DaysStandalone]="DaysStandalone",t[t.MonthsFormat]="MonthsFormat",t[t.MonthsStandalone]="MonthsStandalone",t[t.Eras]="Eras",t[t.FirstDayOfWeek]="FirstDayOfWeek",t[t.WeekendRange]="WeekendRange",t[t.DateFormat]="DateFormat",t[t.TimeFormat]="TimeFormat",t[t.DateTimeFormat]="DateTimeFormat",t[t.NumberSymbols]="NumberSymbols",t[t.NumberFormats]="NumberFormats",t[t.CurrencySymbol]="CurrencySymbol",t[t.CurrencyName]="CurrencyName",t[t.Currencies]="Currencies",t[t.PluralCase]="PluralCase",t[t.ExtraData]="ExtraData",t}(),Wi=void 0;var qi=["en",[["a","p"],["AM","PM"],Wi],[["AM","PM"],Wi,Wi],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],Wi,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],Wi,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",Wi,"{1} 'at' {0}",Wi],[".",",",";","%","+","-","E","\xd7","\u2030","\u221e","NaN",":"],["#,##0.###","#,##0%","\xa4#,##0.00","#E0"],"$","US Dollar",{},function(t){let e=Math.floor(Math.abs(t)),n=t.toString().replace(/^[^.]*\.?/,"").length;return 1===e&&0===n?1:5}];class $i extends T{constructor(t=!1){super(),this.__isAsync=t}emit(t){super.next(t)}subscribe(t,e,n){let i,o=t=>null,s=()=>null;t&&"object"==typeof t?(i=this.__isAsync?e=>{setTimeout(()=>t.next(e))}:e=>{t.next(e)},t.error&&(o=this.__isAsync?e=>{setTimeout(()=>t.error(e))}:e=>{t.error(e)}),t.complete&&(s=this.__isAsync?()=>{setTimeout(()=>t.complete())}:()=>{t.complete()})):(i=this.__isAsync?e=>{setTimeout(()=>t(e))}:e=>{t(e)},e&&(o=this.__isAsync?t=>{setTimeout(()=>e(t))}:t=>{e(t)}),n&&(s=this.__isAsync?()=>{setTimeout(()=>n())}:()=>{n()}));const r=super.subscribe(i,o,s);return t instanceof c&&t.add(r),r}}function Gi(){return this._results[ge()]()}class Ki{constructor(){this.dirty=!0,this._results=[],this.changes=new $i,this.length=0;const t=ge(),e=Ki.prototype;e[t]||(e[t]=Gi)}map(t){return this._results.map(t)}filter(t){return this._results.filter(t)}find(t){return this._results.find(t)}reduce(t,e){return this._results.reduce(t,e)}forEach(t){this._results.forEach(t)}some(t){return this._results.some(t)}toArray(){return this._results.slice()}toString(){return this._results.toString()}reset(t){this._results=function t(e,n){void 0===n&&(n=e);for(let i=0;i<e.length;i++){let o=e[i];Array.isArray(o)?(n===e&&(n=e.slice(0,i)),t(o,n)):n!==e&&n.push(o)}return n}(t),this.dirty=!1,this.length=this._results.length,this.last=this._results[this.length-1],this.first=this._results[0]}notifyOnChanges(){this.changes.emit(this)}setDirty(){this.dirty=!0}destroy(){this.changes.complete(),this.changes.unsubscribe()}}const Yi=new ut("Application Initializer");class Ji{constructor(t){this.appInits=t,this.initialized=!1,this.done=!1,this.donePromise=new Promise((t,e)=>{this.resolve=t,this.reject=e})}runInitializers(){if(this.initialized)return;const t=[],e=()=>{this.done=!0,this.resolve()};if(this.appInits)for(let n=0;n<this.appInits.length;n++){const e=this.appInits[n]();Te(e)&&t.push(e)}Promise.all(t).then(()=>{e()}).catch(t=>{this.reject(t)}),0===t.length&&e(),this.initialized=!0}}const Qi=new ut("AppId");function Xi(){return`${to()}${to()}${to()}`}function to(){return String.fromCharCode(97+Math.floor(25*Math.random()))}const eo=new ut("Platform Initializer"),no=new ut("Platform ID"),io=new ut("appBootstrapListener");class oo{log(t){console.log(t)}warn(t){console.warn(t)}}const so=new ut("LocaleId");function ro(){throw new Error("Runtime compiler is not loaded")}const ao=ro,lo=ro,ho=ro,uo=ro;class co{constructor(){this.compileModuleSync=ao,this.compileModuleAsync=lo,this.compileModuleAndAllComponentsSync=ho,this.compileModuleAndAllComponentsAsync=uo}clearCache(){}clearCacheFor(t){}getModuleId(t){}}class po{}let fo,_o;function mo(){const t=ht.wtf;return!(!t||(fo=t.trace,!fo)||(_o=fo.events,0))}const go=mo();function vo(t,e){return null}const yo=go?function(t,e=null){return _o.createScope(t,e)}:(t,e)=>vo,wo=go?function(t,e){return fo.leaveScope(t,e),e}:(t,e)=>e,bo=(()=>Promise.resolve(0))();function xo(t){"undefined"==typeof Zone?bo.then(()=>{t&&t.apply(null,null)}):Zone.current.scheduleMicroTask("scheduleMicrotask",t)}class To{constructor({enableLongStackTrace:t=!1}){if(this.hasPendingMicrotasks=!1,this.hasPendingMacrotasks=!1,this.isStable=!0,this.onUnstable=new $i(!1),this.onMicrotaskEmpty=new $i(!1),this.onStable=new $i(!1),this.onError=new $i(!1),"undefined"==typeof Zone)throw new Error("In this configuration Angular requires Zone.js");var e;Zone.assertZonePatched(),this._nesting=0,this._outer=this._inner=Zone.current,Zone.wtfZoneSpec&&(this._inner=this._inner.fork(Zone.wtfZoneSpec)),Zone.TaskTrackingZoneSpec&&(this._inner=this._inner.fork(new Zone.TaskTrackingZoneSpec)),t&&Zone.longStackTraceZoneSpec&&(this._inner=this._inner.fork(Zone.longStackTraceZoneSpec)),(e=this)._inner=e._inner.fork({name:"angular",properties:{isAngularZone:!0},onInvokeTask:(t,n,i,o,s,r)=>{try{return So(e),t.invokeTask(i,o,s,r)}finally{Lo(e)}},onInvoke:(t,n,i,o,s,r,a)=>{try{return So(e),t.invoke(i,o,s,r,a)}finally{Lo(e)}},onHasTask:(t,n,i,o)=>{t.hasTask(i,o),n===i&&("microTask"==o.change?(e.hasPendingMicrotasks=o.microTask,Po(e)):"macroTask"==o.change&&(e.hasPendingMacrotasks=o.macroTask))},onHandleError:(t,n,i,o)=>(t.handleError(i,o),e.runOutsideAngular(()=>e.onError.emit(o)),!1)})}static isInAngularZone(){return!0===Zone.current.get("isAngularZone")}static assertInAngularZone(){if(!To.isInAngularZone())throw new Error("Expected to be in Angular Zone, but it is not!")}static assertNotInAngularZone(){if(To.isInAngularZone())throw new Error("Expected to not be in Angular Zone, but it is!")}run(t,e,n){return this._inner.run(t,e,n)}runTask(t,e,n,i){const o=this._inner,s=o.scheduleEventTask("NgZoneEvent: "+i,t,Co,Eo,Eo);try{return o.runTask(s,e,n)}finally{o.cancelTask(s)}}runGuarded(t,e,n){return this._inner.runGuarded(t,e,n)}runOutsideAngular(t){return this._outer.run(t)}}function Eo(){}const Co={};function Po(t){if(0==t._nesting&&!t.hasPendingMicrotasks&&!t.isStable)try{t._nesting++,t.onMicrotaskEmpty.emit(null)}finally{if(t._nesting--,!t.hasPendingMicrotasks)try{t.runOutsideAngular(()=>t.onStable.emit(null))}finally{t.isStable=!0}}}function So(t){t._nesting++,t.isStable&&(t.isStable=!1,t.onUnstable.emit(null))}function Lo(t){t._nesting--,Po(t)}class ko{constructor(){this.hasPendingMicrotasks=!1,this.hasPendingMacrotasks=!1,this.isStable=!0,this.onUnstable=new $i,this.onMicrotaskEmpty=new $i,this.onStable=new $i,this.onError=new $i}run(t){return t()}runGuarded(t){return t()}runOutsideAngular(t){return t()}runTask(t){return t()}}class Io{constructor(t){this._ngZone=t,this._pendingCount=0,this._isZoneStable=!0,this._didWork=!1,this._callbacks=[],this.taskTrackingZone=null,this._watchAngularEvents(),t.run(()=>{this.taskTrackingZone="undefined"==typeof Zone?null:Zone.current.get("TaskTrackingZone")})}_watchAngularEvents(){this._ngZone.onUnstable.subscribe({next:()=>{this._didWork=!0,this._isZoneStable=!1}}),this._ngZone.runOutsideAngular(()=>{this._ngZone.onStable.subscribe({next:()=>{To.assertNotInAngularZone(),xo(()=>{this._isZoneStable=!0,this._runCallbacksIfReady()})}})})}increasePendingRequestCount(){return this._pendingCount+=1,this._didWork=!0,this._pendingCount}decreasePendingRequestCount(){if(this._pendingCount-=1,this._pendingCount<0)throw new Error("pending async requests below zero");return this._runCallbacksIfReady(),this._pendingCount}isStable(){return this._isZoneStable&&0===this._pendingCount&&!this._ngZone.hasPendingMacrotasks}_runCallbacksIfReady(){if(this.isStable())xo(()=>{for(;0!==this._callbacks.length;){let t=this._callbacks.pop();clearTimeout(t.timeoutId),t.doneCb(this._didWork)}this._didWork=!1});else{let t=this.getPendingTasks();this._callbacks=this._callbacks.filter(e=>!e.updateCb||!e.updateCb(t)||(clearTimeout(e.timeoutId),!1)),this._didWork=!0}}getPendingTasks(){return this.taskTrackingZone?this.taskTrackingZone.macroTasks.map(t=>({source:t.source,creationLocation:t.creationLocation,data:t.data})):[]}addCallback(t,e,n){let i=-1;e&&e>0&&(i=setTimeout(()=>{this._callbacks=this._callbacks.filter(t=>t.timeoutId!==i),t(this._didWork,this.getPendingTasks())},e)),this._callbacks.push({doneCb:t,timeoutId:i,updateCb:n})}whenStable(t,e,n){if(n&&!this.taskTrackingZone)throw new Error('Task tracking zone is required when passing an update callback to whenStable(). Is "zone.js/dist/task-tracking.js" loaded?');this.addCallback(t,e,n),this._runCallbacksIfReady()}getPendingRequestCount(){return this._pendingCount}findProviders(t,e,n){return[]}}class Mo{constructor(){this._applications=new Map,Oo.addToWindow(this)}registerApplication(t,e){this._applications.set(t,e)}unregisterApplication(t){this._applications.delete(t)}unregisterAllApplications(){this._applications.clear()}getTestability(t){return this._applications.get(t)||null}getAllTestabilities(){return Array.from(this._applications.values())}getAllRootElements(){return Array.from(this._applications.keys())}findTestabilityInTree(t,e=!0){return Oo.findTestabilityInTree(this,t,e)}}class Ao{addToWindow(t){}findTestabilityInTree(t,e,n){return null}}let No,Oo=new Ao;const zo=new ut("AllowMultipleToken");class Do{constructor(t,e){this.name=t,this.token=e}}function Ro(t,e,n=[]){const i=`Platform: ${e}`,o=new ut(i);return(e=[])=>{let s=Zo();if(!s||s.injector.get(zo,!1))if(t)t(n.concat(e).concat({provide:o,useValue:!0}));else{const t=n.concat(e).concat({provide:o,useValue:!0});!function(t){if(No&&!No.destroyed&&!No.injector.get(zo,!1))throw new Error("There can be only one platform. Destroy the previous one to create a new one.");No=t.get(Bo);const e=t.get(eo,null);e&&e.forEach(t=>t())}(le.create({providers:t,name:i}))}return function(t){const e=Zo();if(!e)throw new Error("No platform exists!");if(!e.injector.get(t,null))throw new Error("A platform with a different configuration has been created. Please destroy it first.");return e}(o)}}function Zo(){return No&&!No.destroyed?No:null}class Bo{constructor(t){this._injector=t,this._modules=[],this._destroyListeners=[],this._destroyed=!1}bootstrapModuleFactory(t,e){const n=function(t){let e;return e="noop"===t?new ko:("zone.js"===t?void 0:t)||new To({enableLongStackTrace:It()}),e}(e?e.ngZone:void 0),i=[{provide:To,useValue:n}];return n.run(()=>{const e=le.create({providers:i,parent:this.injector,name:t.moduleType.name}),o=t.create(e),s=o.injector.get(St,null);if(!s)throw new Error("No ErrorHandler. Is platform module (BrowserModule) included?");return o.onDestroy(()=>Ho(this._modules,o)),n.runOutsideAngular(()=>n.onError.subscribe({next:t=>{s.handleError(t)}})),function(t,e,n){try{const i=n();return Te(i)?i.catch(n=>{throw e.runOutsideAngular(()=>t.handleError(n)),n}):i}catch(i){throw e.runOutsideAngular(()=>t.handleError(i)),i}}(s,n,()=>{const t=o.injector.get(Ji);return t.runInitializers(),t.donePromise.then(()=>(this._moduleDoBootstrap(o),o))})})}bootstrapModule(t,e=[]){const n=jo({},e);return function(t,e,n){return t.get(po).createCompiler([e]).compileModuleAsync(n)}(this.injector,n,t).then(t=>this.bootstrapModuleFactory(t,n))}_moduleDoBootstrap(t){const e=t.injector.get(Vo);if(t._bootstrapComponents.length>0)t._bootstrapComponents.forEach(t=>e.bootstrap(t));else{if(!t.instance.ngDoBootstrap)throw new Error(`The module ${et(t.instance.constructor)} was bootstrapped, but it does not declare "@NgModule.bootstrap" components nor a "ngDoBootstrap" method. `+"Please define one of these.");t.instance.ngDoBootstrap(e)}this._modules.push(t)}onDestroy(t){this._destroyListeners.push(t)}get injector(){return this._injector}destroy(){if(this._destroyed)throw new Error("The platform has already been destroyed!");this._modules.slice().forEach(t=>t.destroy()),this._destroyListeners.forEach(t=>t()),this._destroyed=!0}get destroyed(){return this._destroyed}}function jo(t,e){return Array.isArray(e)?e.reduce(jo,t):Object.assign({},t,e)}let Vo=(()=>{class t{constructor(t,e,n,i,o,s){this._zone=t,this._console=e,this._injector=n,this._exceptionHandler=i,this._componentFactoryResolver=o,this._initStatus=s,this._bootstrapListeners=[],this._views=[],this._runningTick=!1,this._enforceNoNewChanges=!1,this._stable=!0,this.componentTypes=[],this.components=[],this._enforceNoNewChanges=It(),this._zone.onMicrotaskEmpty.subscribe({next:()=>{this._zone.run(()=>{this.tick()})}});const r=new v(t=>{this._stable=this._zone.isStable&&!this._zone.hasPendingMacrotasks&&!this._zone.hasPendingMicrotasks,this._zone.runOutsideAngular(()=>{t.next(this._stable),t.complete()})}),a=new v(t=>{let e;this._zone.runOutsideAngular(()=>{e=this._zone.onStable.subscribe(()=>{To.assertNotInAngularZone(),xo(()=>{this._stable||this._zone.hasPendingMacrotasks||this._zone.hasPendingMicrotasks||(this._stable=!0,t.next(!0))})})});const n=this._zone.onUnstable.subscribe(()=>{To.assertInAngularZone(),this._stable&&(this._stable=!1,this._zone.runOutsideAngular(()=>{t.next(!1)}))});return()=>{e.unsubscribe(),n.unsubscribe()}});this.isStable=R(r,a.pipe(t=>{return Z()((e=U,function(t){let n;n="function"==typeof e?e:function(){return e};const i=Object.create(t,H);return i.source=t,i.subjectFactory=n,i})(t));var e}))}bootstrap(t,e){if(!this._initStatus.done)throw new Error("Cannot bootstrap as there are still asynchronous initializers running. Bootstrap components in the `ngDoBootstrap` method of the root module.");let n;n=t instanceof Ce?t:this._componentFactoryResolver.resolveComponentFactory(t),this.componentTypes.push(n.componentType);const i=n instanceof Me?null:this._injector.get(yt),o=n.create(le.NULL,[],e||n.selector,i);o.onDestroy(()=>{this._unloadComponent(o)});const s=o.injector.get(Io,null);return s&&o.injector.get(Mo).registerApplication(o.location.nativeElement,s),this._loadComponent(o),It()&&this._console.log("Angular is running in the development mode. Call enableProdMode() to enable the production mode."),o}tick(){if(this._runningTick)throw new Error("ApplicationRef.tick is called recursively");const e=t._tickScope();try{this._runningTick=!0;for(let t of this._views)t.detectChanges();if(this._enforceNoNewChanges)for(let t of this._views)t.checkNoChanges()}catch(n){this._zone.runOutsideAngular(()=>this._exceptionHandler.handleError(n))}finally{this._runningTick=!1,wo(e)}}attachView(t){const e=t;this._views.push(e),e.attachToAppRef(this)}detachView(t){const e=t;Ho(this._views,e),e.detachFromAppRef()}_loadComponent(t){this.attachView(t.hostView),this.tick(),this.components.push(t),this._injector.get(io,[]).concat(this._bootstrapListeners).forEach(e=>e(t))}_unloadComponent(t){this.detachView(t.hostView),Ho(this.components,t)}ngOnDestroy(){this._views.slice().forEach(t=>t.destroy())}get viewCount(){return this._views.length}}return t._tickScope=yo("ApplicationRef#tick()"),t})();function Ho(t,e){const n=t.indexOf(e);n>-1&&t.splice(n,1)}class Fo{constructor(t,e){this.name=t,this.callback=e}}class Uo{constructor(t,e,n){this.listeners=[],this.parent=null,this._debugContext=n,this.nativeNode=t,e&&e instanceof Wo&&e.addChild(this)}get injector(){return this._debugContext.injector}get componentInstance(){return this._debugContext.component}get context(){return this._debugContext.context}get references(){return this._debugContext.references}get providerTokens(){return this._debugContext.providerTokens}}class Wo extends Uo{constructor(t,e,n){super(t,e,n),this.properties={},this.attributes={},this.classes={},this.styles={},this.childNodes=[],this.nativeElement=t}addChild(t){t&&(this.childNodes.push(t),t.parent=this)}removeChild(t){const e=this.childNodes.indexOf(t);-1!==e&&(t.parent=null,this.childNodes.splice(e,1))}insertChildrenAfter(t,e){const n=this.childNodes.indexOf(t);-1!==n&&(this.childNodes.splice(n+1,0,...e),e.forEach(e=>{e.parent&&e.parent.removeChild(e),t.parent=this}))}insertBefore(t,e){const n=this.childNodes.indexOf(t);-1===n?this.addChild(e):(e.parent&&e.parent.removeChild(e),e.parent=this,this.childNodes.splice(n,0,e))}query(t){return this.queryAll(t)[0]||null}queryAll(t){const e=[];return function t(e,n,i){e.childNodes.forEach(e=>{e instanceof Wo&&(n(e)&&i.push(e),t(e,n,i))})}(this,t,e),e}queryAllNodes(t){const e=[];return function t(e,n,i){e instanceof Wo&&e.childNodes.forEach(e=>{n(e)&&i.push(e),e instanceof Wo&&t(e,n,i)})}(this,t,e),e}get children(){return this.childNodes.filter(t=>t instanceof Wo)}triggerEventHandler(t,e){this.listeners.forEach(n=>{n.name==t&&n.callback(e)})}}const qo=new Map,$o=function(t){return qo.get(t)||null};function Go(t){qo.set(t.nativeNode,t)}const Ko=Ro(null,"core",[{provide:no,useValue:"unknown"},{provide:Bo,deps:[le]},{provide:Mo,deps:[]},{provide:oo,deps:[]}]);function Yo(){return en}function Jo(){return nn}function Qo(t){return t||"en-US"}function Xo(t){let e=[];return t.onStable.subscribe(()=>{for(;e.length;)e.pop()()}),function(t){e.push(t)}}class ts{constructor(t){}}function es(t,e,n,i,o,s,r=[],a,l,h,u,c){h||(h=yn);const{matchedQueries:d,references:p,matchedQueryIds:f}=zn(n);let _=null,m=null;s&&([_,m]=qn(s)),a=a||[];const g=new Array(a.length);for(let w=0;w<a.length;w++){const[t,e,n]=a[w],[i,o]=qn(e);let s=void 0,r=void 0;switch(15&t){case 4:r=n;break;case 1:case 8:s=n}g[w]={flags:t,ns:i,name:o,nonMinifiedName:o,securityContext:s,suffix:r}}l=l||[];const v=new Array(l.length);for(let w=0;w<l.length;w++){const[t,e]=l[w];v[w]={type:0,target:t,eventName:e,propName:null}}const y=(r=r||[]).map(([t,e])=>{const[n,i]=qn(t);return[n,i,e]});return c=function(t){if(t&&"$$undefined"===t.id){const e=null!=t.encapsulation&&t.encapsulation!==xt.None||t.styles.length||Object.keys(t.data).length;t.id=e?`c${Tn++}`:"$$empty"}return t&&"$$empty"===t.id&&(t=null),t||null}(c),u&&(e|=33554432),{nodeIndex:-1,parent:null,renderParent:null,bindingIndex:-1,outputIndex:-1,checkIndex:t,flags:e|=1,childFlags:0,directChildFlags:0,childMatchedQueries:0,matchedQueries:d,matchedQueryIds:f,references:p,ngContentIndex:i,childCount:o,bindings:g,bindingFlags:$n(g),outputs:v,element:{ns:_,name:m,attrs:y,template:null,componentProvider:null,componentView:u||null,componentRendererType:c,publicProviders:null,allProviders:null,handleEvent:h||yn},provider:null,text:null,query:null,ngContent:null}}function ns(t,e,n){const i=n.element,o=t.root.selectorOrNode,s=t.renderer;let r;if(t.parent||!o){r=i.name?s.createElement(i.name,i.ns):s.createComment("");const o=Rn(t,e,n);o&&s.appendChild(o,r)}else r=s.selectRootElement(o,!!i.componentRendererType&&i.componentRendererType.encapsulation===xt.ShadowDom);if(i.attrs)for(let a=0;a<i.attrs.length;a++){const[t,e,n]=i.attrs[a];s.setAttribute(r,e,n,t)}return r}function is(t,e,n,i){for(let r=0;r<n.outputs.length;r++){const a=n.outputs[r],l=os(t,n.nodeIndex,(s=a.eventName,(o=a.target)?`${o}:${s}`:s));let h=a.target,u=t;"component"===a.target&&(h=null,u=e);const c=u.renderer.listen(h||i,a.eventName,l);t.disposables[n.outputIndex+r]=c}var o,s}function os(t,e,n){return i=>kn(t,e,n,i)}function ss(t,e,n,i){if(!Cn(t,e,n,i))return!1;const o=e.bindings[n],s=fn(t,e.nodeIndex),r=s.renderElement,a=o.name;switch(15&o.flags){case 1:!function(t,e,n,i,o,s){const r=e.securityContext;let a=r?t.root.sanitizer.sanitize(r,s):s;a=null!=a?a.toString():null;const l=t.renderer;null!=s?l.setAttribute(n,o,a,i):l.removeAttribute(n,o,i)}(t,o,r,o.ns,a,i);break;case 2:!function(t,e,n,i){const o=t.renderer;i?o.addClass(e,n):o.removeClass(e,n)}(t,r,a,i);break;case 4:!function(t,e,n,i,o){let s=t.root.sanitizer.sanitize(Qt.STYLE,o);if(null!=s){s=s.toString();const t=e.suffix;null!=t&&(s+=t)}else s=null;const r=t.renderer;null!=s?r.setStyle(n,i,s):r.removeStyle(n,i)}(t,o,r,a,i);break;case 8:!function(t,e,n,i,o){const s=e.securityContext;let r=s?t.root.sanitizer.sanitize(s,o):o;t.renderer.setProperty(n,i,r)}(33554432&e.flags&&32&o.flags?s.componentView:t,o,r,a,i)}return!0}function rs(t){const e=t.def.nodeMatchedQueries;for(;t.parent&&On(t);){let n=t.parentNodeDef;t=t.parent;const i=n.nodeIndex+n.childCount;for(let o=0;o<=i;o++){const i=t.def.nodes[o];67108864&i.flags&&536870912&i.flags&&(i.query.filterId&e)===i.query.filterId&&gn(t,o).setDirty(),!(1&i.flags&&o+i.childCount<n.nodeIndex)&&67108864&i.childFlags&&536870912&i.childFlags||(o+=i.childCount)}}if(134217728&t.def.nodeFlags)for(let n=0;n<t.def.nodes.length;n++){const e=t.def.nodes[n];134217728&e.flags&&536870912&e.flags&&gn(t,n).setDirty(),n+=e.childCount}}function as(t,e){const n=gn(t,e.nodeIndex);if(!n.dirty)return;let i,o=void 0;if(67108864&e.flags){const n=e.parent.parent;o=ls(t,n.nodeIndex,n.nodeIndex+n.childCount,e.query,[]),i=_n(t,e.parent.nodeIndex).instance}else 134217728&e.flags&&(o=ls(t,0,t.def.nodes.length-1,e.query,[]),i=t.component);n.reset(o);const s=e.query.bindings;let r=!1;for(let a=0;a<s.length;a++){const t=s[a];let e;switch(t.bindingType){case 0:e=n.first;break;case 1:e=n,r=!0}i[t.propName]=e}r&&n.notifyOnChanges()}function ls(t,e,n,i,o){for(let s=e;s<=n;s++){const e=t.def.nodes[s],n=e.matchedQueries[i.id];if(null!=n&&o.push(hs(t,e,n)),1&e.flags&&e.element.template&&(e.element.template.nodeMatchedQueries&i.filterId)===i.filterId){const n=fn(t,s);if((e.childMatchedQueries&i.filterId)===i.filterId&&(ls(t,s+1,s+e.childCount,i,o),s+=e.childCount),16777216&e.flags){const t=n.viewContainer._embeddedViews;for(let e=0;e<t.length;e++){const s=t[e],r=In(s);r&&r===n&&ls(s,0,s.def.nodes.length-1,i,o)}}const r=n.template._projectedViews;if(r)for(let t=0;t<r.length;t++){const e=r[t];ls(e,0,e.def.nodes.length-1,i,o)}}(e.childMatchedQueries&i.filterId)!==i.filterId&&(s+=e.childCount)}return o}function hs(t,e,n){if(null!=n)switch(n){case 1:return fn(t,e.nodeIndex).renderElement;case 0:return new Ne(fn(t,e.nodeIndex).renderElement);case 2:return fn(t,e.nodeIndex).template;case 3:return fn(t,e.nodeIndex).viewContainer;case 4:return _n(t,e.nodeIndex).instance}}function us(t,e,n){const i=Rn(t,e,n);i&&Hn(t,n.ngContent.index,1,i,null,void 0)}function cs(t,e,n){let i;const o=t.renderer;i=o.createText(n.text.prefix);const s=Rn(t,e,n);return s&&o.appendChild(s,i),{renderText:i}}function ds(t,e){return(null!=t?t.toString():"")+e.suffix}function ps(t,e,n,i){let o=0,s=0,r=0,a=0,l=0,h=null,u=null,c=!1,d=!1,p=null;for(let f=0;f<e.length;f++){const t=e[f];if(t.nodeIndex=f,t.parent=h,t.bindingIndex=o,t.outputIndex=s,t.renderParent=u,r|=t.flags,l|=t.matchedQueryIds,t.element){const e=t.element;e.publicProviders=h?h.element.publicProviders:Object.create(null),e.allProviders=e.publicProviders,c=!1,d=!1,t.element.template&&(l|=t.element.template.nodeMatchedQueries)}if(_s(h,t,e.length),o+=t.bindings.length,s+=t.outputs.length,!u&&3&t.flags&&(p=t),20224&t.flags){c||(c=!0,h.element.publicProviders=Object.create(h.element.publicProviders),h.element.allProviders=h.element.publicProviders);const e=0!=(32768&t.flags);0==(8192&t.flags)||e?h.element.publicProviders[bn(t.provider.token)]=t:(d||(d=!0,h.element.allProviders=Object.create(h.element.publicProviders)),h.element.allProviders[bn(t.provider.token)]=t),e&&(h.element.componentProvider=t)}if(h?(h.childFlags|=t.flags,h.directChildFlags|=t.flags,h.childMatchedQueries|=t.matchedQueryIds,t.element&&t.element.template&&(h.childMatchedQueries|=t.element.template.nodeMatchedQueries)):a|=t.flags,t.childCount>0)h=t,fs(t)||(u=t);else for(;h&&f===h.nodeIndex+h.childCount;){const t=h.parent;t&&(t.childFlags|=h.childFlags,t.childMatchedQueries|=h.childMatchedQueries),h=t,u=h&&fs(h)?h.renderParent:h}}return{factory:null,nodeFlags:r,rootNodeFlags:a,nodeMatchedQueries:l,flags:t,nodes:e,updateDirectives:n||yn,updateRenderer:i||yn,handleEvent:(t,n,i,o)=>e[n].element.handleEvent(t,i,o),bindingCount:o,outputCount:s,lastRenderRootNode:p}}function fs(t){return 0!=(1&t.flags)&&null===t.element.name}function _s(t,e,n){const i=e.element&&e.element.template;if(i){if(!i.lastRenderRootNode)throw new Error("Illegal State: Embedded templates without nodes are not allowed!");if(i.lastRenderRootNode&&16777216&i.lastRenderRootNode.flags)throw new Error(`Illegal State: Last root node of a template can't have embedded views, at index ${e.nodeIndex}!`)}if(20224&e.flags&&0==(1&(t?t.flags:0)))throw new Error(`Illegal State: StaticProvider/Directive nodes need to be children of elements or anchors, at index ${e.nodeIndex}!`);if(e.query){if(67108864&e.flags&&(!t||0==(16384&t.flags)))throw new Error(`Illegal State: Content Query nodes need to be children of directives, at index ${e.nodeIndex}!`);if(134217728&e.flags&&t)throw new Error(`Illegal State: View Query nodes have to be top level nodes, at index ${e.nodeIndex}!`)}if(e.childCount){const i=t?t.nodeIndex+t.childCount:n-1;if(e.nodeIndex<=i&&e.nodeIndex+e.childCount>i)throw new Error(`Illegal State: childCount of node leads outside of parent, at index ${e.nodeIndex}!`)}}function ms(t,e,n,i){const o=ys(t.root,t.renderer,t,e,n);return ws(o,t.component,i),bs(o),o}function gs(t,e,n){const i=ys(t,t.renderer,null,null,e);return ws(i,n,n),bs(i),i}function vs(t,e,n,i){const o=e.element.componentRendererType;let s;return s=o?t.root.rendererFactory.createRenderer(i,o):t.root.renderer,ys(t.root,s,t,e.element.componentProvider,n)}function ys(t,e,n,i,o){const s=new Array(o.nodes.length),r=o.outputCount?new Array(o.outputCount):null;return{def:o,parent:n,viewContainerParent:null,parentNodeDef:i,context:null,component:null,nodes:s,state:13,root:t,renderer:e,oldValues:new Array(o.bindingCount),disposables:r,initIndex:-1}}function ws(t,e,n){t.component=e,t.context=n}function bs(t){let e;Nn(t)&&(e=fn(t.parent,t.parentNodeDef.parent.nodeIndex).renderElement);const n=t.def,i=t.nodes;for(let o=0;o<n.nodes.length;o++){const s=n.nodes[o];let r;switch(vn.setCurrentNode(t,o),201347067&s.flags){case 1:const n=ns(t,e,s);let a=void 0;if(33554432&s.flags){const e=Bn(s.element.componentView);a=vn.createComponentView(t,s,e,n)}is(t,a,s,n),r={renderElement:n,componentView:a,viewContainer:null,template:s.element.template?di(t,s):void 0},16777216&s.flags&&(r.viewContainer=li(t,s,r));break;case 2:r=cs(t,e,s);break;case 512:case 1024:case 2048:case 256:r=i[o],r||4096&s.flags||(r={instance:ki(t,s)});break;case 16:r={instance:Ii(t,s)};break;case 16384:r=i[o],r||(r={instance:Mi(t,s)}),32768&s.flags&&ws(fn(t,s.parent.nodeIndex).componentView,r.instance,r.instance);break;case 32:case 64:case 128:r={value:void 0};break;case 67108864:case 134217728:r=new Ki;break;case 8:us(t,e,s),r=void 0}i[o]=r}Is(t,ks.CreateViewNodes),Os(t,201326592,268435456,0)}function xs(t){Cs(t),vn.updateDirectives(t,1),Ms(t,ks.CheckNoChanges),vn.updateRenderer(t,1),Is(t,ks.CheckNoChanges),t.state&=-97}function Ts(t){1&t.state?(t.state&=-2,t.state|=2):t.state&=-3,cn(t,0,256),Cs(t),vn.updateDirectives(t,0),Ms(t,ks.CheckAndUpdate),Os(t,67108864,536870912,0);let e=cn(t,256,512);Bi(t,2097152|(e?1048576:0)),vn.updateRenderer(t,0),Is(t,ks.CheckAndUpdate),Os(t,134217728,536870912,0),e=cn(t,512,768),Bi(t,8388608|(e?4194304:0)),2&t.def.flags&&(t.state&=-9),t.state&=-97,cn(t,768,1024)}function Es(t,e,n,i,o,s,r,a,l,h,u,c,d){return 0===n?function(t,e,n,i,o,s,r,a,l,h,u,c){switch(201347067&e.flags){case 1:return function(t,e,n,i,o,s,r,a,l,h,u,c){const d=e.bindings.length;let p=!1;return d>0&&ss(t,e,0,n)&&(p=!0),d>1&&ss(t,e,1,i)&&(p=!0),d>2&&ss(t,e,2,o)&&(p=!0),d>3&&ss(t,e,3,s)&&(p=!0),d>4&&ss(t,e,4,r)&&(p=!0),d>5&&ss(t,e,5,a)&&(p=!0),d>6&&ss(t,e,6,l)&&(p=!0),d>7&&ss(t,e,7,h)&&(p=!0),d>8&&ss(t,e,8,u)&&(p=!0),d>9&&ss(t,e,9,c)&&(p=!0),p}(t,e,n,i,o,s,r,a,l,h,u,c);case 2:return function(t,e,n,i,o,s,r,a,l,h,u,c){let d=!1;const p=e.bindings,f=p.length;if(f>0&&Cn(t,e,0,n)&&(d=!0),f>1&&Cn(t,e,1,i)&&(d=!0),f>2&&Cn(t,e,2,o)&&(d=!0),f>3&&Cn(t,e,3,s)&&(d=!0),f>4&&Cn(t,e,4,r)&&(d=!0),f>5&&Cn(t,e,5,a)&&(d=!0),f>6&&Cn(t,e,6,l)&&(d=!0),f>7&&Cn(t,e,7,h)&&(d=!0),f>8&&Cn(t,e,8,u)&&(d=!0),f>9&&Cn(t,e,9,c)&&(d=!0),d){let d=e.text.prefix;f>0&&(d+=ds(n,p[0])),f>1&&(d+=ds(i,p[1])),f>2&&(d+=ds(o,p[2])),f>3&&(d+=ds(s,p[3])),f>4&&(d+=ds(r,p[4])),f>5&&(d+=ds(a,p[5])),f>6&&(d+=ds(l,p[6])),f>7&&(d+=ds(h,p[7])),f>8&&(d+=ds(u,p[8])),f>9&&(d+=ds(c,p[9]));const _=pn(t,e.nodeIndex).renderText;t.renderer.setValue(_,d)}return d}(t,e,n,i,o,s,r,a,l,h,u,c);case 16384:return function(t,e,n,i,o,s,r,a,l,h,u,c){const d=_n(t,e.nodeIndex),p=d.instance;let f=!1,_=void 0;const m=e.bindings.length;return m>0&&En(t,e,0,n)&&(f=!0,_=Zi(t,d,e,0,n,_)),m>1&&En(t,e,1,i)&&(f=!0,_=Zi(t,d,e,1,i,_)),m>2&&En(t,e,2,o)&&(f=!0,_=Zi(t,d,e,2,o,_)),m>3&&En(t,e,3,s)&&(f=!0,_=Zi(t,d,e,3,s,_)),m>4&&En(t,e,4,r)&&(f=!0,_=Zi(t,d,e,4,r,_)),m>5&&En(t,e,5,a)&&(f=!0,_=Zi(t,d,e,5,a,_)),m>6&&En(t,e,6,l)&&(f=!0,_=Zi(t,d,e,6,l,_)),m>7&&En(t,e,7,h)&&(f=!0,_=Zi(t,d,e,7,h,_)),m>8&&En(t,e,8,u)&&(f=!0,_=Zi(t,d,e,8,u,_)),m>9&&En(t,e,9,c)&&(f=!0,_=Zi(t,d,e,9,c,_)),_&&p.ngOnChanges(_),65536&e.flags&&dn(t,256,e.nodeIndex)&&p.ngOnInit(),262144&e.flags&&p.ngDoCheck(),f}(t,e,n,i,o,s,r,a,l,h,u,c);case 32:case 64:case 128:return function(t,e,n,i,o,s,r,a,l,h,u,c){const d=e.bindings;let p=!1;const f=d.length;if(f>0&&Cn(t,e,0,n)&&(p=!0),f>1&&Cn(t,e,1,i)&&(p=!0),f>2&&Cn(t,e,2,o)&&(p=!0),f>3&&Cn(t,e,3,s)&&(p=!0),f>4&&Cn(t,e,4,r)&&(p=!0),f>5&&Cn(t,e,5,a)&&(p=!0),f>6&&Cn(t,e,6,l)&&(p=!0),f>7&&Cn(t,e,7,h)&&(p=!0),f>8&&Cn(t,e,8,u)&&(p=!0),f>9&&Cn(t,e,9,c)&&(p=!0),p){const p=mn(t,e.nodeIndex);let _;switch(201347067&e.flags){case 32:_=new Array(d.length),f>0&&(_[0]=n),f>1&&(_[1]=i),f>2&&(_[2]=o),f>3&&(_[3]=s),f>4&&(_[4]=r),f>5&&(_[5]=a),f>6&&(_[6]=l),f>7&&(_[7]=h),f>8&&(_[8]=u),f>9&&(_[9]=c);break;case 64:_={},f>0&&(_[d[0].name]=n),f>1&&(_[d[1].name]=i),f>2&&(_[d[2].name]=o),f>3&&(_[d[3].name]=s),f>4&&(_[d[4].name]=r),f>5&&(_[d[5].name]=a),f>6&&(_[d[6].name]=l),f>7&&(_[d[7].name]=h),f>8&&(_[d[8].name]=u),f>9&&(_[d[9].name]=c);break;case 128:const t=n;switch(f){case 1:_=t.transform(n);break;case 2:_=t.transform(i);break;case 3:_=t.transform(i,o);break;case 4:_=t.transform(i,o,s);break;case 5:_=t.transform(i,o,s,r);break;case 6:_=t.transform(i,o,s,r,a);break;case 7:_=t.transform(i,o,s,r,a,l);break;case 8:_=t.transform(i,o,s,r,a,l,h);break;case 9:_=t.transform(i,o,s,r,a,l,h,u);break;case 10:_=t.transform(i,o,s,r,a,l,h,u,c)}}p.value=_}return p}(t,e,n,i,o,s,r,a,l,h,u,c);default:throw"unreachable"}}(t,e,i,o,s,r,a,l,h,u,c,d):function(t,e,n){switch(201347067&e.flags){case 1:return function(t,e,n){let i=!1;for(let o=0;o<n.length;o++)ss(t,e,o,n[o])&&(i=!0);return i}(t,e,n);case 2:return function(t,e,n){const i=e.bindings;let o=!1;for(let s=0;s<n.length;s++)Cn(t,e,s,n[s])&&(o=!0);if(o){let o="";for(let t=0;t<n.length;t++)o+=ds(n[t],i[t]);o=e.text.prefix+o;const s=pn(t,e.nodeIndex).renderText;t.renderer.setValue(s,o)}return o}(t,e,n);case 16384:return function(t,e,n){const i=_n(t,e.nodeIndex),o=i.instance;let s=!1,r=void 0;for(let a=0;a<n.length;a++)En(t,e,a,n[a])&&(s=!0,r=Zi(t,i,e,a,n[a],r));return r&&o.ngOnChanges(r),65536&e.flags&&dn(t,256,e.nodeIndex)&&o.ngOnInit(),262144&e.flags&&o.ngDoCheck(),s}(t,e,n);case 32:case 64:case 128:return function(t,e,n){const i=e.bindings;let o=!1;for(let s=0;s<n.length;s++)Cn(t,e,s,n[s])&&(o=!0);if(o){const o=mn(t,e.nodeIndex);let s;switch(201347067&e.flags){case 32:s=n;break;case 64:s={};for(let o=0;o<n.length;o++)s[i[o].name]=n[o];break;case 128:const t=n[0],e=n.slice(1);s=t.transform(...e)}o.value=s}return o}(t,e,n);default:throw"unreachable"}}(t,e,i)}function Cs(t){const e=t.def;if(4&e.nodeFlags)for(let n=0;n<e.nodes.length;n++){const i=e.nodes[n];if(4&i.flags){const e=fn(t,n).template._projectedViews;if(e)for(let n=0;n<e.length;n++){const i=e[n];i.state|=32,Ln(i,t)}}else 0==(4&i.childFlags)&&(n+=i.childCount)}}function Ps(t,e,n,i,o,s,r,a,l,h,u,c,d){return 0===n?function(t,e,n,i,o,s,r,a,l,h,u,c){const d=e.bindings.length;d>0&&Pn(t,e,0,n),d>1&&Pn(t,e,1,i),d>2&&Pn(t,e,2,o),d>3&&Pn(t,e,3,s),d>4&&Pn(t,e,4,r),d>5&&Pn(t,e,5,a),d>6&&Pn(t,e,6,l),d>7&&Pn(t,e,7,h),d>8&&Pn(t,e,8,u),d>9&&Pn(t,e,9,c)}(t,e,i,o,s,r,a,l,h,u,c,d):function(t,e,n){for(let i=0;i<n.length;i++)Pn(t,e,i,n[i])}(t,e,i),!1}function Ss(t,e){if(gn(t,e.nodeIndex).dirty)throw ln(vn.createDebugContext(t,e.nodeIndex),`Query ${e.query.id} not dirty`,`Query ${e.query.id} dirty`,0!=(1&t.state))}function Ls(t){if(!(128&t.state)){if(Ms(t,ks.Destroy),Is(t,ks.Destroy),Bi(t,131072),t.disposables)for(let e=0;e<t.disposables.length;e++)t.disposables[e]();!function(t){if(!(16&t.state))return;const e=In(t);if(e){const n=e.template._projectedViews;n&&(bt(n,n.indexOf(t)),vn.dirtyParentQueries(t))}}(t),t.renderer.destroyNode&&function(t){const e=t.def.nodes.length;for(let n=0;n<e;n++){const e=t.def.nodes[n];1&e.flags?t.renderer.destroyNode(fn(t,n).renderElement):2&e.flags?t.renderer.destroyNode(pn(t,n).renderText):(67108864&e.flags||134217728&e.flags)&&gn(t,n).destroy()}}(t),Nn(t)&&t.renderer.destroy(),t.state|=128}}const ks=function(){var t={CreateViewNodes:0,CheckNoChanges:1,CheckNoChangesProjectedViews:2,CheckAndUpdate:3,CheckAndUpdateProjectedViews:4,Destroy:5};return t[t.CreateViewNodes]="CreateViewNodes",t[t.CheckNoChanges]="CheckNoChanges",t[t.CheckNoChangesProjectedViews]="CheckNoChangesProjectedViews",t[t.CheckAndUpdate]="CheckAndUpdate",t[t.CheckAndUpdateProjectedViews]="CheckAndUpdateProjectedViews",t[t.Destroy]="Destroy",t}();function Is(t,e){const n=t.def;if(33554432&n.nodeFlags)for(let i=0;i<n.nodes.length;i++){const o=n.nodes[i];33554432&o.flags?As(fn(t,i).componentView,e):0==(33554432&o.childFlags)&&(i+=o.childCount)}}function Ms(t,e){const n=t.def;if(16777216&n.nodeFlags)for(let i=0;i<n.nodes.length;i++){const o=n.nodes[i];if(16777216&o.flags){const n=fn(t,i).viewContainer._embeddedViews;for(let t=0;t<n.length;t++)As(n[t],e)}else 0==(16777216&o.childFlags)&&(i+=o.childCount)}}function As(t,e){const n=t.state;switch(e){case ks.CheckNoChanges:0==(128&n)&&(12==(12&n)?xs(t):64&n&&Ns(t,ks.CheckNoChangesProjectedViews));break;case ks.CheckNoChangesProjectedViews:0==(128&n)&&(32&n?xs(t):64&n&&Ns(t,e));break;case ks.CheckAndUpdate:0==(128&n)&&(12==(12&n)?Ts(t):64&n&&Ns(t,ks.CheckAndUpdateProjectedViews));break;case ks.CheckAndUpdateProjectedViews:0==(128&n)&&(32&n?Ts(t):64&n&&Ns(t,e));break;case ks.Destroy:Ls(t);break;case ks.CreateViewNodes:bs(t)}}function Ns(t,e){Ms(t,e),Is(t,e)}function Os(t,e,n,i){if(!(t.def.nodeFlags&e&&t.def.nodeFlags&n))return;const o=t.def.nodes.length;for(let s=0;s<o;s++){const o=t.def.nodes[s];if(o.flags&e&&o.flags&n)switch(vn.setCurrentNode(t,o.nodeIndex),i){case 0:as(t,o);break;case 1:Ss(t,o)}o.childFlags&e&&o.childFlags&n||(s+=o.childCount)}}let zs=!1;function Ds(t,e,n,i,o,s){const r=o.injector.get(De);return gs(Zs(t,o,r,e,n),i,s)}function Rs(t,e,n,i,o,s){const r=o.injector.get(De),a=Zs(t,o,new mr(r),e,n),l=Gs(i);return fr(tr.create,gs,null,[a,l,s])}function Zs(t,e,n,i,o){const s=e.injector.get(Xt),r=e.injector.get(St),a=n.createRenderer(null,null);return{ngModule:e,injector:t,projectableNodes:i,selectorOrNode:o,sanitizer:s,rendererFactory:n,renderer:a,errorHandler:r}}function Bs(t,e,n,i){const o=Gs(n);return fr(tr.create,ms,null,[t,e,o,i])}function js(t,e,n,i){return n=Us.get(e.element.componentProvider.provider.token)||Gs(n),fr(tr.create,vs,null,[t,e,n,i])}function Vs(t,e,n,i){return vi(t,e,n,function(t){const{hasOverrides:e,hasDeprecatedOverrides:n}=function(t){let e=!1,n=!1;return 0===Hs.size?{hasOverrides:e,hasDeprecatedOverrides:n}:(t.providers.forEach(t=>{const i=Hs.get(t.token);3840&t.flags&&i&&(e=!0,n=n||i.deprecatedBehavior)}),t.modules.forEach(t=>{Fs.forEach((i,o)=>{X(o).providedIn===t&&(e=!0,n=n||i.deprecatedBehavior)})}),{hasOverrides:e,hasDeprecatedOverrides:n})}(t);return e?(function(t){for(let e=0;e<t.providers.length;e++){const i=t.providers[e];n&&(i.flags|=4096);const o=Hs.get(i.token);o&&(i.flags=-3841&i.flags|o.flags,i.deps=Dn(o.deps),i.value=o.value)}if(Fs.size>0){let e=new Set(t.modules);Fs.forEach((i,o)=>{if(e.has(X(o).providedIn)){let e={token:o,flags:i.flags|(n?4096:0),deps:Dn(i.deps),value:i.value,index:t.providers.length};t.providers.push(e),t.providersByKey[bn(o)]=e}})}}(t=t.factory(()=>yn)),t):t}(i))}const Hs=new Map,Fs=new Map,Us=new Map;function Ws(t){let e;Hs.set(t.token,t),"function"==typeof t.token&&(e=X(t.token))&&"function"==typeof e.providedIn&&Fs.set(t.token,t)}function qs(t,e){const n=Bn(e.viewDefFactory),i=Bn(n.nodes[0].element.componentView);Us.set(t,i)}function $s(){Hs.clear(),Fs.clear(),Us.clear()}function Gs(t){if(0===Hs.size)return t;const e=function(t){const e=[];let n=null;for(let i=0;i<t.nodes.length;i++){const o=t.nodes[i];1&o.flags&&(n=o),n&&3840&o.flags&&Hs.has(o.provider.token)&&(e.push(n.nodeIndex),n=null)}return e}(t);if(0===e.length)return t;t=t.factory(()=>yn);for(let i=0;i<e.length;i++)n(t,e[i]);return t;function n(t,e){for(let n=e+1;n<t.nodes.length;n++){const e=t.nodes[n];if(1&e.flags)return;if(3840&e.flags){const t=e.provider,n=Hs.get(t.token);n&&(e.flags=-3841&e.flags|n.flags,t.deps=Dn(n.deps),t.value=n.value)}}}}function Ks(t,e,n,i,o,s,r,a,l,h,u,c,d){const p=t.def.nodes[e];return Es(t,p,n,i,o,s,r,a,l,h,u,c,d),224&p.flags?mn(t,e).value:void 0}function Ys(t,e,n,i,o,s,r,a,l,h,u,c,d){const p=t.def.nodes[e];return Ps(t,p,n,i,o,s,r,a,l,h,u,c,d),224&p.flags?mn(t,e).value:void 0}function Js(t){return fr(tr.detectChanges,Ts,null,[t])}function Qs(t){return fr(tr.checkNoChanges,xs,null,[t])}function Xs(t){return fr(tr.destroy,Ls,null,[t])}const tr=function(){var t={create:0,detectChanges:1,checkNoChanges:2,destroy:3,handleEvent:4};return t[t.create]="create",t[t.detectChanges]="detectChanges",t[t.checkNoChanges]="checkNoChanges",t[t.destroy]="destroy",t[t.handleEvent]="handleEvent",t}();let er,nr,ir;function or(t,e){nr=t,ir=e}function sr(t,e,n,i){return or(t,e),fr(tr.handleEvent,t.def.handleEvent,null,[t,e,n,i])}function rr(t,e){if(128&t.state)throw un(tr[er]);return or(t,ur(t,0)),t.def.updateDirectives((function(t,n,i,...o){const s=t.def.nodes[n];return 0===e?lr(t,s,i,o):hr(t,s,i,o),16384&s.flags&&or(t,ur(t,n)),224&s.flags?mn(t,s.nodeIndex).value:void 0}),t)}function ar(t,e){if(128&t.state)throw un(tr[er]);return or(t,cr(t,0)),t.def.updateRenderer((function(t,n,i,...o){const s=t.def.nodes[n];return 0===e?lr(t,s,i,o):hr(t,s,i,o),3&s.flags&&or(t,cr(t,n)),224&s.flags?mn(t,s.nodeIndex).value:void 0}),t)}function lr(t,e,n,i){if(Es(t,e,n,...i)){const r=1===n?i[0]:i;if(16384&e.flags){const n={};for(let t=0;t<e.bindings.length;t++){const i=e.bindings[t],a=r[t];8&i.flags&&(n[(o=i.nonMinifiedName,s=void 0,s=o.replace(/[$@]/g,"_"),`ng-reflect-${o=s.replace(ne,(...t)=>"-"+t[1].toLowerCase())}`)]=ie(a))}const i=e.parent,a=fn(t,i.nodeIndex).renderElement;if(i.element.name)for(let e in n){const i=n[e];null!=i?t.renderer.setAttribute(a,e,i):t.renderer.removeAttribute(a,e)}else t.renderer.setValue(a,`bindings=${JSON.stringify(n,null,2)}`)}}var o,s}function hr(t,e,n,i){Ps(t,e,n,...i)}function ur(t,e){for(let n=e;n<t.def.nodes.length;n++){const e=t.def.nodes[n];if(16384&e.flags&&e.bindings&&e.bindings.length)return n}return null}function cr(t,e){for(let n=e;n<t.def.nodes.length;n++){const e=t.def.nodes[n];if(3&e.flags&&e.bindings&&e.bindings.length)return n}return null}class dr{constructor(t,e){this.view=t,this.nodeIndex=e,null==e&&(this.nodeIndex=e=0),this.nodeDef=t.def.nodes[e];let n=this.nodeDef,i=t;for(;n&&0==(1&n.flags);)n=n.parent;if(!n)for(;!n&&i;)n=Mn(i),i=i.parent;this.elDef=n,this.elView=i}get elOrCompView(){return fn(this.elView,this.elDef.nodeIndex).componentView||this.view}get injector(){return fi(this.elView,this.elDef)}get component(){return this.elOrCompView.component}get context(){return this.elOrCompView.context}get providerTokens(){const t=[];if(this.elDef)for(let e=this.elDef.nodeIndex+1;e<=this.elDef.nodeIndex+this.elDef.childCount;e++){const n=this.elView.def.nodes[e];20224&n.flags&&t.push(n.provider.token),e+=n.childCount}return t}get references(){const t={};if(this.elDef){pr(this.elView,this.elDef,t);for(let e=this.elDef.nodeIndex+1;e<=this.elDef.nodeIndex+this.elDef.childCount;e++){const n=this.elView.def.nodes[e];20224&n.flags&&pr(this.elView,n,t),e+=n.childCount}}return t}get componentRenderElement(){const t=function(t){for(;t&&!Nn(t);)t=t.parent;return t.parent?fn(t.parent,Mn(t).nodeIndex):null}(this.elOrCompView);return t?t.renderElement:void 0}get renderNode(){return 2&this.nodeDef.flags?An(this.view,this.nodeDef):An(this.elView,this.elDef)}logError(t,...e){let n,i;2&this.nodeDef.flags?(n=this.view.def,i=this.nodeDef.nodeIndex):(n=this.elView.def,i=this.elDef.nodeIndex);const o=function(t,e){let n=-1;for(let i=0;i<=e;i++)3&t.nodes[i].flags&&n++;return n}(n,i);let s=-1;n.factory(()=>(s++,s===o?t.error.bind(t,...e):yn)),s<o&&(t.error("Illegal state: the ViewDefinitionFactory did not call the logger!"),t.error(...e))}}function pr(t,e,n){for(let i in e.references)n[i]=hs(t,e,e.references[i])}function fr(t,e,n,i){const o=er,s=nr,r=ir;try{er=t;const a=e.apply(n,i);return nr=s,ir=r,er=o,a}catch(a){if(Et(a)||!nr)throw a;throw function(t,e){return t instanceof Error||(t=new Error(t.toString())),hn(t,e),t}(a,_r())}}function _r(){return nr?new dr(nr,ir):null}class mr{constructor(t){this.delegate=t}createRenderer(t,e){return new gr(this.delegate.createRenderer(t,e))}begin(){this.delegate.begin&&this.delegate.begin()}end(){this.delegate.end&&this.delegate.end()}whenRenderingDone(){return this.delegate.whenRenderingDone?this.delegate.whenRenderingDone():Promise.resolve(null)}}class gr{constructor(t){this.delegate=t,this.debugContextFactory=_r,this.data=this.delegate.data}createDebugContext(t){return this.debugContextFactory(t)}destroyNode(t){const e=$o(t);!function(t){qo.delete(t.nativeNode)}(e),e instanceof Uo&&(e.listeners.length=0),this.delegate.destroyNode&&this.delegate.destroyNode(t)}destroy(){this.delegate.destroy()}createElement(t,e){const n=this.delegate.createElement(t,e),i=this.createDebugContext(n);if(i){const e=new Wo(n,null,i);e.name=t,Go(e)}return n}createComment(t){const e=this.delegate.createComment(t),n=this.createDebugContext(e);return n&&Go(new Uo(e,null,n)),e}createText(t){const e=this.delegate.createText(t),n=this.createDebugContext(e);return n&&Go(new Uo(e,null,n)),e}appendChild(t,e){const n=$o(t),i=$o(e);n&&i&&n instanceof Wo&&n.addChild(i),this.delegate.appendChild(t,e)}insertBefore(t,e,n){const i=$o(t),o=$o(e),s=$o(n);i&&o&&i instanceof Wo&&i.insertBefore(s,o),this.delegate.insertBefore(t,e,n)}removeChild(t,e){const n=$o(t),i=$o(e);n&&i&&n instanceof Wo&&n.removeChild(i),this.delegate.removeChild(t,e)}selectRootElement(t,e){const n=this.delegate.selectRootElement(t,e),i=_r();return i&&Go(new Wo(n,null,i)),n}setAttribute(t,e,n,i){const o=$o(t);o&&o instanceof Wo&&(o.attributes[i?i+":"+e:e]=n),this.delegate.setAttribute(t,e,n,i)}removeAttribute(t,e,n){const i=$o(t);i&&i instanceof Wo&&(i.attributes[n?n+":"+e:e]=null),this.delegate.removeAttribute(t,e,n)}addClass(t,e){const n=$o(t);n&&n instanceof Wo&&(n.classes[e]=!0),this.delegate.addClass(t,e)}removeClass(t,e){const n=$o(t);n&&n instanceof Wo&&(n.classes[e]=!1),this.delegate.removeClass(t,e)}setStyle(t,e,n,i){const o=$o(t);o&&o instanceof Wo&&(o.styles[e]=n),this.delegate.setStyle(t,e,n,i)}removeStyle(t,e,n){const i=$o(t);i&&i instanceof Wo&&(i.styles[e]=null),this.delegate.removeStyle(t,e,n)}setProperty(t,e,n){const i=$o(t);i&&i instanceof Wo&&(i.properties[e]=n),this.delegate.setProperty(t,e,n)}listen(t,e,n){if("string"!=typeof t){const i=$o(t);i&&i.listeners.push(new Fo(e,n))}return this.delegate.listen(t,e,n)}parentNode(t){return this.delegate.parentNode(t)}nextSibling(t){return this.delegate.nextSibling(t)}setValue(t,e){return this.delegate.setValue(t,e)}}function vr(t,e,n){return new yr(t,e,n)}class yr extends class{}{constructor(t,e,n){super(),this.moduleType=t,this._bootstrapComponents=e,this._ngModuleDefFactory=n}create(t){!function(){if(zs)return;zs=!0;const t=It()?{setCurrentNode:or,createRootView:Rs,createEmbeddedView:Bs,createComponentView:js,createNgModuleRef:Vs,overrideProvider:Ws,overrideComponentView:qs,clearOverrides:$s,checkAndUpdateView:Js,checkNoChangesView:Qs,destroyView:Xs,createDebugContext:(t,e)=>new dr(t,e),handleEvent:sr,updateDirectives:rr,updateRenderer:ar}:{setCurrentNode:()=>{},createRootView:Ds,createEmbeddedView:ms,createComponentView:vs,createNgModuleRef:vi,overrideProvider:yn,overrideComponentView:yn,clearOverrides:yn,checkAndUpdateView:Ts,checkNoChangesView:xs,destroyView:Ls,createDebugContext:(t,e)=>new dr(t,e),handleEvent:(t,e,n,i)=>t.def.handleEvent(t,e,n,i),updateDirectives:(t,e)=>t.def.updateDirectives(0===e?Ks:Ys,t),updateRenderer:(t,e)=>t.def.updateRenderer(0===e?Ks:Ys,t)};vn.setCurrentNode=t.setCurrentNode,vn.createRootView=t.createRootView,vn.createEmbeddedView=t.createEmbeddedView,vn.createComponentView=t.createComponentView,vn.createNgModuleRef=t.createNgModuleRef,vn.overrideProvider=t.overrideProvider,vn.overrideComponentView=t.overrideComponentView,vn.clearOverrides=t.clearOverrides,vn.checkAndUpdateView=t.checkAndUpdateView,vn.checkNoChangesView=t.checkNoChangesView,vn.destroyView=t.destroyView,vn.resolveDep=Di,vn.createDebugContext=t.createDebugContext,vn.handleEvent=t.handleEvent,vn.updateDirectives=t.updateDirectives,vn.updateRenderer=t.updateRenderer,vn.dirtyParentQueries=rs}();const e=function(t){const e=Array.from(t.providers),n=Array.from(t.modules),i={};for(const o in t.providersByKey)i[o]=t.providersByKey[o];return{factory:t.factory,isRoot:t.isRoot,providers:e,modules:n,providersByKey:i}}(Bn(this._ngModuleDefFactory));return vn.createNgModuleRef(this.moduleType,t||le.NULL,this._bootstrapComponents,e)}}class wr{constructor(){this.title="grid-failure-information-map-app"}}const br=(()=>{const t=Element.prototype;return t.matches||t.matchesSelector||t.mozMatchesSelector||t.msMatchesSelector||t.oMatchesSelector||t.webkitMatchesSelector})(),xr={schedule(t,e){const n=setTimeout(t,e);return()=>clearTimeout(n)},scheduleBeforeRender(t){if("undefined"==typeof window)return xr.schedule(t,0);if(void 0===window.requestAnimationFrame)return xr.schedule(t,16);const e=window.requestAnimationFrame(t);return()=>window.cancelAnimationFrame(e)}};function Tr(t,e,n){let i=n;return function(t){return!!t&&t.nodeType===Node.ELEMENT_NODE}(t)&&e.some((e,n)=>!("*"===e||!function(t,e){return br.call(t,e)}(t,e)||(i=n,0))),i}class Er{constructor(t,e){this.component=t,this.injector=e,this.componentFactory=e.get(ke).resolveComponentFactory(t)}create(t){return new Cr(this.componentFactory,t)}}class Cr{constructor(t,e){this.componentFactory=t,this.injector=e,this.inputChanges=null,this.implementsOnChanges=!1,this.scheduledChangeDetectionFn=null,this.scheduledDestroyFn=null,this.initialInputValues=new Map,this.uninitializedInputs=new Set}connect(t){if(null!==this.scheduledDestroyFn)return this.scheduledDestroyFn(),void(this.scheduledDestroyFn=null);this.componentRef||this.initializeComponent(t)}disconnect(){this.componentRef&&null===this.scheduledDestroyFn&&(this.scheduledDestroyFn=xr.schedule(()=>{this.componentRef&&(this.componentRef.destroy(),this.componentRef=null)},10))}getInputValue(t){return this.componentRef?this.componentRef.instance[t]:this.initialInputValues.get(t)}setInputValue(t,e){var n,i;this.componentRef?(n=e)===(i=this.getInputValue(t))||n!=n&&i!=i||(this.recordInputChange(t,e),this.componentRef.instance[t]=e,this.scheduleDetectChanges()):this.initialInputValues.set(t,e)}initializeComponent(t){const e=le.create({providers:[],parent:this.injector}),n=function(t,e){const n=t.childNodes,i=e.map(()=>[]);let o=-1;e.some((t,e)=>"*"===t&&(o=e,!0));for(let s=0,r=n.length;s<r;++s){const t=n[s],r=Tr(t,e,o);-1!==r&&i[r].push(t)}return i}(t,this.componentFactory.ngContentSelectors);this.componentRef=this.componentFactory.create(e,n,t),this.implementsOnChanges="function"==typeof this.componentRef.instance.ngOnChanges,this.initializeInputs(),this.initializeOutputs(),this.detectChanges(),this.injector.get(Vo).attachView(this.componentRef.hostView)}initializeInputs(){this.componentFactory.inputs.forEach(({propName:t})=>{this.initialInputValues.has(t)?this.setInputValue(t,this.initialInputValues.get(t)):this.uninitializedInputs.add(t)}),this.initialInputValues.clear()}initializeOutputs(){const t=this.componentFactory.outputs.map(({propName:t,templateName:e})=>this.componentRef.instance[t].pipe(M(t=>({name:e,value:t}))));this.events=R(...t)}callNgOnChanges(){if(!this.implementsOnChanges||null===this.inputChanges)return;const t=this.inputChanges;this.inputChanges=null,this.componentRef.instance.ngOnChanges(t)}scheduleDetectChanges(){this.scheduledChangeDetectionFn||(this.scheduledChangeDetectionFn=xr.scheduleBeforeRender(()=>{this.scheduledChangeDetectionFn=null,this.detectChanges()}))}recordInputChange(t,e){if(this.componentRef&&!this.implementsOnChanges)return;null===this.inputChanges&&(this.inputChanges={});const n=this.inputChanges[t];if(n)return void(n.currentValue=e);const i=this.uninitializedInputs.has(t);this.uninitializedInputs.delete(t);const o=i?void 0:this.getInputValue(t);this.inputChanges[t]=new Ee(o,e,i)}detectChanges(){this.componentRef&&(this.callNgOnChanges(),this.componentRef.changeDetectorRef.detectChanges())}}class Pr extends HTMLElement{constructor(){super(...arguments),this.ngElementEventsSubscription=null}}class Sr{constructor(t){this.injector=t}ngDoBootstrap(){const t=function(t,e){const n=function(t,e){return e.get(ke).resolveComponentFactory(t).inputs}(t,e.injector),i=e.strategyFactory||new Er(t,e.injector),o=function(t){const e={};return t.forEach(({propName:t,templateName:n})=>{var i;e[(i=n,i.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`))]=t}),e}(n);class s extends Pr{constructor(t){super(),this.ngElementStrategy=i.create(t||e.injector)}attributeChangedCallback(t,n,s,r){this.ngElementStrategy||(this.ngElementStrategy=i.create(e.injector)),this.ngElementStrategy.setInputValue(o[t],s)}connectedCallback(){this.ngElementStrategy||(this.ngElementStrategy=i.create(e.injector)),this.ngElementStrategy.connect(this),this.ngElementEventsSubscription=this.ngElementStrategy.events.subscribe(t=>{const e=function(t,e,n){if("function"!=typeof CustomEvent){const i=t.createEvent("CustomEvent");return i.initCustomEvent(e,!1,!1,n),i}return new CustomEvent(e,{bubbles:!1,cancelable:!1,detail:n})}(this.ownerDocument,t.name,t.value);this.dispatchEvent(e)})}disconnectedCallback(){this.ngElementStrategy&&this.ngElementStrategy.disconnect(),this.ngElementEventsSubscription&&(this.ngElementEventsSubscription.unsubscribe(),this.ngElementEventsSubscription=null)}}return s.observedAttributes=Object.keys(o),n.map(({propName:t})=>t).forEach(t=>{Object.defineProperty(s.prototype,t,{get:function(){return this.ngElementStrategy.getInputValue(t)},set:function(e){this.ngElementStrategy.setInputValue(t,e)},configurable:!0,enumerable:!0})}),s}(wr,{injector:this.injector});customElements.define("openk-gird-failure-information-map-init",t)}}var Lr=n("L4gg");class kr{constructor(){}ngAfterViewInit(){this._initMap()}_initMap(){this._map=Lr.map("map",{center:[52.64025580486587,11.49578788276404],zoom:6}),Lr.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",{maxZoom:19,attribution:'&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>',crossOrigin:null}).addTo(this._map)}}var Ir=xn({encapsulation:0,styles:[[".map-container[_ngcontent-%COMP%]{position:absolute;top:0;left:0;right:0;bottom:0;margin:30px}.map-frame[_ngcontent-%COMP%]{border:2px solid #000;height:100%}#map[_ngcontent-%COMP%]{height:100%}"]],data:{}});function Mr(t){return ps(0,[(t()(),es(0,0,null,null,2,"div",[["class","map-container"]],null,null,null,null,null)),(t()(),es(1,0,null,null,1,"div",[["class","map-frame"]],null,null,null,null,null)),(t()(),es(2,0,null,null,0,"div",[["id","map"]],null,null,null,null,null))],null,null)}var Ar=xn({encapsulation:0,styles:[[""]],data:{}});function Nr(t){return ps(0,[(t()(),es(0,0,null,null,1,"openk-gird-failure-information-map",[],null,null,null,Mr,Ir)),Li(1,4243456,null,0,kr,[],null,null)],null,null)}function Or(t){return ps(0,[(t()(),es(0,0,null,null,1,"app-root",[],null,null,null,Nr,Ar)),Li(1,49152,null,0,wr,[],null,null)],null,null)}var zr=si("app-root",wr,Or,{},{},[]);class Dr{}const Rr=function(){var t={Zero:0,One:1,Two:2,Few:3,Many:4,Other:5};return t[t.Zero]="Zero",t[t.One]="One",t[t.Two]="Two",t[t.Few]="Few",t[t.Many]="Many",t[t.Other]="Other",t}(),Zr=new ut("UseV4Plurals");class Br{}class jr extends Br{constructor(t,e){super(),this.locale=t,this.deprecatedPluralFn=e}getPluralCategory(t,e){switch(this.deprecatedPluralFn?this.deprecatedPluralFn(e||this.locale,t):function(t){return function(t){const e=t.toLowerCase().replace(/_/g,"-");let n=Fi[e];if(n)return n;const i=e.split("-")[0];if(n=Fi[i],n)return n;if("en"===i)return qi;throw new Error(`Missing locale data for the locale "${t}".`)}(t)[Ui.PluralCase]}(e||this.locale)(t)){case Rr.Zero:return"zero";case Rr.One:return"one";case Rr.Two:return"two";case Rr.Few:return"few";case Rr.Many:return"many";default:return"other"}}}class Vr{}const Hr=new ut("DocumentToken");let Fr=null;function Ur(){return Fr}const Wr={class:"className",innerHtml:"innerHTML",readonly:"readOnly",tabindex:"tabIndex"},qr={"\b":"Backspace","\t":"Tab","\x7f":"Delete","\x1b":"Escape",Del:"Delete",Esc:"Escape",Left:"ArrowLeft",Right:"ArrowRight",Up:"ArrowUp",Down:"ArrowDown",Menu:"ContextMenu",Scroll:"ScrollLock",Win:"OS"},$r={A:"1",B:"2",C:"3",D:"4",E:"5",F:"6",G:"7",H:"8",I:"9",J:"*",K:"+",M:"-",N:".",O:"/","`":"0","\x90":"NumLock"},Gr=(()=>{if(ht.Node)return ht.Node.prototype.contains||function(t){return!!(16&this.compareDocumentPosition(t))}})();class Kr extends class extends class{constructor(){this.resourceLoaderType=null}get attrToPropMap(){return this._attrToPropMap}set attrToPropMap(t){this._attrToPropMap=t}}{constructor(){super(),this._animationPrefix=null,this._transitionEnd=null;try{const t=this.createElement("div",document);if(null!=this.getStyle(t,"animationName"))this._animationPrefix="";else{const e=["Webkit","Moz","O","ms"];for(let n=0;n<e.length;n++)if(null!=this.getStyle(t,e[n]+"AnimationName")){this._animationPrefix="-"+e[n].toLowerCase()+"-";break}}const e={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};Object.keys(e).forEach(n=>{null!=this.getStyle(t,n)&&(this._transitionEnd=e[n])})}catch(t){this._animationPrefix=null,this._transitionEnd=null}}getDistributedNodes(t){return t.getDistributedNodes()}resolveAndSetHref(t,e,n){t.href=null==n?e:e+"/../"+n}supportsDOMEvents(){return!0}supportsNativeShadowDOM(){return"function"==typeof document.body.createShadowRoot}getAnimationPrefix(){return this._animationPrefix?this._animationPrefix:""}getTransitionEnd(){return this._transitionEnd?this._transitionEnd:""}supportsAnimation(){return null!=this._animationPrefix&&null!=this._transitionEnd}}{parse(t){throw new Error("parse not implemented")}static makeCurrent(){var t;t=new Kr,Fr||(Fr=t)}hasProperty(t,e){return e in t}setProperty(t,e,n){t[e]=n}getProperty(t,e){return t[e]}invoke(t,e,n){t[e](...n)}logError(t){window.console&&(console.error?console.error(t):console.log(t))}log(t){window.console&&window.console.log&&window.console.log(t)}logGroup(t){window.console&&window.console.group&&window.console.group(t)}logGroupEnd(){window.console&&window.console.groupEnd&&window.console.groupEnd()}get attrToPropMap(){return Wr}contains(t,e){return Gr.call(t,e)}querySelector(t,e){return t.querySelector(e)}querySelectorAll(t,e){return t.querySelectorAll(e)}on(t,e,n){t.addEventListener(e,n,!1)}onAndCancel(t,e,n){return t.addEventListener(e,n,!1),()=>{t.removeEventListener(e,n,!1)}}dispatchEvent(t,e){t.dispatchEvent(e)}createMouseEvent(t){const e=this.getDefaultDocument().createEvent("MouseEvent");return e.initEvent(t,!0,!0),e}createEvent(t){const e=this.getDefaultDocument().createEvent("Event");return e.initEvent(t,!0,!0),e}preventDefault(t){t.preventDefault(),t.returnValue=!1}isPrevented(t){return t.defaultPrevented||null!=t.returnValue&&!t.returnValue}getInnerHTML(t){return t.innerHTML}getTemplateContent(t){return"content"in t&&this.isTemplateElement(t)?t.content:null}getOuterHTML(t){return t.outerHTML}nodeName(t){return t.nodeName}nodeValue(t){return t.nodeValue}type(t){return t.type}content(t){return this.hasProperty(t,"content")?t.content:t}firstChild(t){return t.firstChild}nextSibling(t){return t.nextSibling}parentElement(t){return t.parentNode}childNodes(t){return t.childNodes}childNodesAsList(t){const e=t.childNodes,n=new Array(e.length);for(let i=0;i<e.length;i++)n[i]=e[i];return n}clearNodes(t){for(;t.firstChild;)t.removeChild(t.firstChild)}appendChild(t,e){t.appendChild(e)}removeChild(t,e){t.removeChild(e)}replaceChild(t,e,n){t.replaceChild(e,n)}remove(t){return t.parentNode&&t.parentNode.removeChild(t),t}insertBefore(t,e,n){t.insertBefore(n,e)}insertAllBefore(t,e,n){n.forEach(n=>t.insertBefore(n,e))}insertAfter(t,e,n){t.insertBefore(n,e.nextSibling)}setInnerHTML(t,e){t.innerHTML=e}getText(t){return t.textContent}setText(t,e){t.textContent=e}getValue(t){return t.value}setValue(t,e){t.value=e}getChecked(t){return t.checked}setChecked(t,e){t.checked=e}createComment(t){return this.getDefaultDocument().createComment(t)}createTemplate(t){const e=this.getDefaultDocument().createElement("template");return e.innerHTML=t,e}createElement(t,e){return(e=e||this.getDefaultDocument()).createElement(t)}createElementNS(t,e,n){return(n=n||this.getDefaultDocument()).createElementNS(t,e)}createTextNode(t,e){return(e=e||this.getDefaultDocument()).createTextNode(t)}createScriptTag(t,e,n){const i=(n=n||this.getDefaultDocument()).createElement("SCRIPT");return i.setAttribute(t,e),i}createStyleElement(t,e){const n=(e=e||this.getDefaultDocument()).createElement("style");return this.appendChild(n,this.createTextNode(t,e)),n}createShadowRoot(t){return t.createShadowRoot()}getShadowRoot(t){return t.shadowRoot}getHost(t){return t.host}clone(t){return t.cloneNode(!0)}getElementsByClassName(t,e){return t.getElementsByClassName(e)}getElementsByTagName(t,e){return t.getElementsByTagName(e)}classList(t){return Array.prototype.slice.call(t.classList,0)}addClass(t,e){t.classList.add(e)}removeClass(t,e){t.classList.remove(e)}hasClass(t,e){return t.classList.contains(e)}setStyle(t,e,n){t.style[e]=n}removeStyle(t,e){t.style[e]=""}getStyle(t,e){return t.style[e]}hasStyle(t,e,n){const i=this.getStyle(t,e)||"";return n?i==n:i.length>0}tagName(t){return t.tagName}attributeMap(t){const e=new Map,n=t.attributes;for(let i=0;i<n.length;i++){const t=n.item(i);e.set(t.name,t.value)}return e}hasAttribute(t,e){return t.hasAttribute(e)}hasAttributeNS(t,e,n){return t.hasAttributeNS(e,n)}getAttribute(t,e){return t.getAttribute(e)}getAttributeNS(t,e,n){return t.getAttributeNS(e,n)}setAttribute(t,e,n){t.setAttribute(e,n)}setAttributeNS(t,e,n,i){t.setAttributeNS(e,n,i)}removeAttribute(t,e){t.removeAttribute(e)}removeAttributeNS(t,e,n){t.removeAttributeNS(e,n)}templateAwareRoot(t){return this.isTemplateElement(t)?this.content(t):t}createHtmlDocument(){return document.implementation.createHTMLDocument("fakeTitle")}getDefaultDocument(){return document}getBoundingClientRect(t){try{return t.getBoundingClientRect()}catch(e){return{top:0,bottom:0,left:0,right:0,width:0,height:0}}}getTitle(t){return t.title}setTitle(t,e){t.title=e||""}elementMatches(t,e){return!!this.isElementNode(t)&&(t.matches&&t.matches(e)||t.msMatchesSelector&&t.msMatchesSelector(e)||t.webkitMatchesSelector&&t.webkitMatchesSelector(e))}isTemplateElement(t){return this.isElementNode(t)&&"TEMPLATE"===t.nodeName}isTextNode(t){return t.nodeType===Node.TEXT_NODE}isCommentNode(t){return t.nodeType===Node.COMMENT_NODE}isElementNode(t){return t.nodeType===Node.ELEMENT_NODE}hasShadowRoot(t){return null!=t.shadowRoot&&t instanceof HTMLElement}isShadowRoot(t){return t instanceof DocumentFragment}importIntoDoc(t){return document.importNode(this.templateAwareRoot(t),!0)}adoptNode(t){return document.adoptNode(t)}getHref(t){return t.getAttribute("href")}getEventKey(t){let e=t.key;if(null==e){if(e=t.keyIdentifier,null==e)return"Unidentified";e.startsWith("U+")&&(e=String.fromCharCode(parseInt(e.substring(2),16)),3===t.location&&$r.hasOwnProperty(e)&&(e=$r[e]))}return qr[e]||e}getGlobalEventTarget(t,e){return"window"===e?window:"document"===e?t:"body"===e?t.body:null}getHistory(){return window.history}getLocation(){return window.location}getBaseHref(t){const e=Jr||(Jr=document.querySelector("base"),Jr)?Jr.getAttribute("href"):null;return null==e?null:(n=e,Yr||(Yr=document.createElement("a")),Yr.setAttribute("href",n),"/"===Yr.pathname.charAt(0)?Yr.pathname:"/"+Yr.pathname);var n}resetBaseElement(){Jr=null}getUserAgent(){return window.navigator.userAgent}setData(t,e,n){this.setAttribute(t,"data-"+e,n)}getData(t,e){return this.getAttribute(t,"data-"+e)}getComputedStyle(t){return getComputedStyle(t)}supportsWebAnimation(){return"function"==typeof Element.prototype.animate}performanceNow(){return window.performance&&window.performance.now?window.performance.now():(new Date).getTime()}supportsCookies(){return!0}getCookie(t){return function(t,e){e=encodeURIComponent(e);for(const n of t.split(";")){const t=n.indexOf("="),[i,o]=-1==t?[n,""]:[n.slice(0,t),n.slice(t+1)];if(i.trim()===e)return decodeURIComponent(o)}return null}(document.cookie,t)}setCookie(t,e){document.cookie=encodeURIComponent(t)+"="+encodeURIComponent(e)}}let Yr,Jr=null;function Qr(){return!!window.history.pushState}const Xr=new ut("TRANSITION_ID"),ta=[{provide:Yi,useFactory:function(t,e,n){return()=>{n.get(Ji).donePromise.then(()=>{const n=Ur();Array.prototype.slice.apply(n.querySelectorAll(e,"style[ng-transition]")).filter(e=>n.getAttribute(e,"ng-transition")===t).forEach(t=>n.remove(t))})}},deps:[Xr,Hr,le],multi:!0}];class ea{static init(){var t;t=new ea,Oo=t}addToWindow(t){ht.getAngularTestability=(e,n=!0)=>{const i=t.findTestabilityInTree(e,n);if(null==i)throw new Error("Could not find testability for element.");return i},ht.getAllAngularTestabilities=()=>t.getAllTestabilities(),ht.getAllAngularRootElements=()=>t.getAllRootElements(),ht.frameworkStabilizers||(ht.frameworkStabilizers=[]),ht.frameworkStabilizers.push(t=>{const e=ht.getAllAngularTestabilities();let n=e.length,i=!1;const o=function(e){i=i||e,n--,0==n&&t(i)};e.forEach((function(t){t.whenStable(o)}))})}findTestabilityInTree(t,e,n){if(null==e)return null;const i=t.getTestability(e);return null!=i?i:n?Ur().isShadowRoot(e)?this.findTestabilityInTree(t,Ur().getHost(e),!0):this.findTestabilityInTree(t,Ur().parentElement(e),!0):null}}function na(t,e){"undefined"!=typeof COMPILED&&COMPILED||((ht.ng=ht.ng||{})[t]=e)}const ia=(()=>({ApplicationRef:Vo,NgZone:To}))();function oa(t){return $o(t)}const sa=new ut("EventManagerPlugins");class ra{constructor(t,e){this._zone=e,this._eventNameToPlugin=new Map,t.forEach(t=>t.manager=this),this._plugins=t.slice().reverse()}addEventListener(t,e,n){return this._findPluginFor(e).addEventListener(t,e,n)}addGlobalEventListener(t,e,n){return this._findPluginFor(e).addGlobalEventListener(t,e,n)}getZone(){return this._zone}_findPluginFor(t){const e=this._eventNameToPlugin.get(t);if(e)return e;const n=this._plugins;for(let i=0;i<n.length;i++){const e=n[i];if(e.supports(t))return this._eventNameToPlugin.set(t,e),e}throw new Error(`No event manager plugin found for event ${t}`)}}class aa{constructor(t){this._doc=t}addGlobalEventListener(t,e,n){const i=Ur().getGlobalEventTarget(this._doc,t);if(!i)throw new Error(`Unsupported event target ${i} for event ${e}`);return this.addEventListener(i,e,n)}}class la{constructor(){this._stylesSet=new Set}addStyles(t){const e=new Set;t.forEach(t=>{this._stylesSet.has(t)||(this._stylesSet.add(t),e.add(t))}),this.onStylesAdded(e)}onStylesAdded(t){}getAllStyles(){return Array.from(this._stylesSet)}}class ha extends la{constructor(t){super(),this._doc=t,this._hostNodes=new Set,this._styleNodes=new Set,this._hostNodes.add(t.head)}_addStylesToHost(t,e){t.forEach(t=>{const n=this._doc.createElement("style");n.textContent=t,this._styleNodes.add(e.appendChild(n))})}addHost(t){this._addStylesToHost(this._stylesSet,t),this._hostNodes.add(t)}removeHost(t){this._hostNodes.delete(t)}onStylesAdded(t){this._hostNodes.forEach(e=>this._addStylesToHost(t,e))}ngOnDestroy(){this._styleNodes.forEach(t=>Ur().remove(t))}}const ua={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"},ca=/%COMP%/g;function da(t,e,n){for(let i=0;i<e.length;i++){let o=e[i];Array.isArray(o)?da(t,o,n):(o=o.replace(ca,t),n.push(o))}return n}function pa(t){return e=>{!1===t(e)&&(e.preventDefault(),e.returnValue=!1)}}class fa{constructor(t,e,n){this.eventManager=t,this.sharedStylesHost=e,this.appId=n,this.rendererByCompId=new Map,this.defaultRenderer=new _a(t)}createRenderer(t,e){if(!t||!e)return this.defaultRenderer;switch(e.encapsulation){case xt.Emulated:{let n=this.rendererByCompId.get(e.id);return n||(n=new va(this.eventManager,this.sharedStylesHost,e,this.appId),this.rendererByCompId.set(e.id,n)),n.applyToHost(t),n}case xt.Native:case xt.ShadowDom:return new ya(this.eventManager,this.sharedStylesHost,t,e);default:if(!this.rendererByCompId.has(e.id)){const t=da(e.id,e.styles,[]);this.sharedStylesHost.addStyles(t),this.rendererByCompId.set(e.id,this.defaultRenderer)}return this.defaultRenderer}}begin(){}end(){}}class _a{constructor(t){this.eventManager=t,this.data=Object.create(null)}destroy(){}createElement(t,e){return e?document.createElementNS(ua[e]||e,t):document.createElement(t)}createComment(t){return document.createComment(t)}createText(t){return document.createTextNode(t)}appendChild(t,e){t.appendChild(e)}insertBefore(t,e,n){t&&t.insertBefore(e,n)}removeChild(t,e){t&&t.removeChild(e)}selectRootElement(t,e){let n="string"==typeof t?document.querySelector(t):t;if(!n)throw new Error(`The selector "${t}" did not match any elements`);return e||(n.textContent=""),n}parentNode(t){return t.parentNode}nextSibling(t){return t.nextSibling}setAttribute(t,e,n,i){if(i){e=i+":"+e;const o=ua[i];o?t.setAttributeNS(o,e,n):t.setAttribute(e,n)}else t.setAttribute(e,n)}removeAttribute(t,e,n){if(n){const i=ua[n];i?t.removeAttributeNS(i,e):t.removeAttribute(`${n}:${e}`)}else t.removeAttribute(e)}addClass(t,e){t.classList.add(e)}removeClass(t,e){t.classList.remove(e)}setStyle(t,e,n,i){i&Re.DashCase?t.style.setProperty(e,n,i&Re.Important?"important":""):t.style[e]=n}removeStyle(t,e,n){n&Re.DashCase?t.style.removeProperty(e):t.style[e]=""}setProperty(t,e,n){ga(e,"property"),t[e]=n}setValue(t,e){t.nodeValue=e}listen(t,e,n){return ga(e,"listener"),"string"==typeof t?this.eventManager.addGlobalEventListener(t,e,pa(n)):this.eventManager.addEventListener(t,e,pa(n))}}const ma=(()=>"@".charCodeAt(0))();function ga(t,e){if(t.charCodeAt(0)===ma)throw new Error(`Found the synthetic ${e} ${t}. Please include either "BrowserAnimationsModule" or "NoopAnimationsModule" in your application.`)}class va extends _a{constructor(t,e,n,i){super(t),this.component=n;const o=da(i+"-"+n.id,n.styles,[]);e.addStyles(o),this.contentAttr="_ngcontent-%COMP%".replace(ca,i+"-"+n.id),this.hostAttr=function(t){return"_nghost-%COMP%".replace(ca,t)}(i+"-"+n.id)}applyToHost(t){super.setAttribute(t,this.hostAttr,"")}createElement(t,e){const n=super.createElement(t,e);return super.setAttribute(n,this.contentAttr,""),n}}class ya extends _a{constructor(t,e,n,i){super(t),this.sharedStylesHost=e,this.hostEl=n,this.component=i,this.shadowRoot=i.encapsulation===xt.ShadowDom?n.attachShadow({mode:"open"}):n.createShadowRoot(),this.sharedStylesHost.addHost(this.shadowRoot);const o=da(i.id,i.styles,[]);for(let s=0;s<o.length;s++){const t=document.createElement("style");t.textContent=o[s],this.shadowRoot.appendChild(t)}}nodeOrShadowRoot(t){return t===this.hostEl?this.shadowRoot:t}destroy(){this.sharedStylesHost.removeHost(this.shadowRoot)}appendChild(t,e){return super.appendChild(this.nodeOrShadowRoot(t),e)}insertBefore(t,e,n){return super.insertBefore(this.nodeOrShadowRoot(t),e,n)}removeChild(t,e){return super.removeChild(this.nodeOrShadowRoot(t),e)}parentNode(t){return this.nodeOrShadowRoot(super.parentNode(this.nodeOrShadowRoot(t)))}}const wa=(()=>"undefined"!=typeof Zone&&Zone.__symbol__||function(t){return"__zone_symbol__"+t})(),ba=wa("addEventListener"),xa=wa("removeEventListener"),Ta={},Ea="__zone_symbol__propagationStopped",Ca=(()=>{const t="undefined"!=typeof Zone&&Zone[wa("BLACK_LISTED_EVENTS")];if(t){const e={};return t.forEach(t=>{e[t]=t}),e}})(),Pa=function(t){return!!Ca&&Ca.hasOwnProperty(t)},Sa=function(t){const e=Ta[t.type];if(!e)return;const n=this[e];if(!n)return;const i=[t];if(1===n.length){const t=n[0];return t.zone!==Zone.current?t.zone.run(t.handler,this,i):t.handler.apply(this,i)}{const e=n.slice();for(let n=0;n<e.length&&!0!==t[Ea];n++){const t=e[n];t.zone!==Zone.current?t.zone.run(t.handler,this,i):t.handler.apply(this,i)}}};class La extends aa{constructor(t,e,n){super(t),this.ngZone=e,n&&function(t){return"server"===t}(n)||this.patchEvent()}patchEvent(){if("undefined"==typeof Event||!Event||!Event.prototype)return;if(Event.prototype.__zone_symbol__stopImmediatePropagation)return;const t=Event.prototype.__zone_symbol__stopImmediatePropagation=Event.prototype.stopImmediatePropagation;Event.prototype.stopImmediatePropagation=function(){this&&(this[Ea]=!0),t&&t.apply(this,arguments)}}supports(t){return!0}addEventListener(t,e,n){let i=n;if(!t[ba]||To.isInAngularZone()&&!Pa(e))t.addEventListener(e,i,!1);else{let n=Ta[e];n||(n=Ta[e]=wa("ANGULAR"+e+"FALSE"));let o=t[n];const s=o&&o.length>0;o||(o=t[n]=[]);const r=Pa(e)?Zone.root:Zone.current;if(0===o.length)o.push({zone:r,handler:i});else{let t=!1;for(let e=0;e<o.length;e++)if(o[e].handler===i){t=!0;break}t||o.push({zone:r,handler:i})}s||t[ba](e,Sa,!1)}return()=>this.removeEventListener(t,e,i)}removeEventListener(t,e,n){let i=t[xa];if(!i)return t.removeEventListener.apply(t,[e,n,!1]);let o=Ta[e],s=o&&t[o];if(!s)return t.removeEventListener.apply(t,[e,n,!1]);let r=!1;for(let a=0;a<s.length;a++)if(s[a].handler===n){r=!0,s.splice(a,1);break}r?0===s.length&&i.apply(t,[e,Sa,!1]):t.removeEventListener.apply(t,[e,n,!1])}}const ka={pan:!0,panstart:!0,panmove:!0,panend:!0,pancancel:!0,panleft:!0,panright:!0,panup:!0,pandown:!0,pinch:!0,pinchstart:!0,pinchmove:!0,pinchend:!0,pinchcancel:!0,pinchin:!0,pinchout:!0,press:!0,pressup:!0,rotate:!0,rotatestart:!0,rotatemove:!0,rotateend:!0,rotatecancel:!0,swipe:!0,swipeleft:!0,swiperight:!0,swipeup:!0,swipedown:!0,tap:!0},Ia=new ut("HammerGestureConfig"),Ma=new ut("HammerLoader");class Aa{constructor(){this.events=[],this.overrides={}}buildHammer(t){const e=new Hammer(t,this.options);e.get("pinch").set({enable:!0}),e.get("rotate").set({enable:!0});for(const n in this.overrides)e.get(n).set(this.overrides[n]);return e}}class Na extends aa{constructor(t,e,n,i){super(t),this._config=e,this.console=n,this.loader=i}supports(t){return!(!ka.hasOwnProperty(t.toLowerCase())&&!this.isCustomEvent(t)||!window.Hammer&&!this.loader&&(this.console.warn(`The "${t}" event cannot be bound because Hammer.JS is not `+"loaded and no custom loader has been specified."),1))}addEventListener(t,e,n){const i=this.manager.getZone();if(e=e.toLowerCase(),!window.Hammer&&this.loader){let i=!1,o=()=>{i=!0};return this.loader().then(()=>{if(!window.Hammer)return this.console.warn("The custom HAMMER_LOADER completed, but Hammer.JS is not present."),void(o=()=>{});i||(o=this.addEventListener(t,e,n))}).catch(()=>{this.console.warn(`The "${e}" event cannot be bound because the custom `+"Hammer.JS loader failed."),o=()=>{}}),()=>{o()}}return i.runOutsideAngular(()=>{const o=this._config.buildHammer(t),s=function(t){i.runGuarded((function(){n(t)}))};return o.on(e,s),()=>{o.off(e,s),"function"==typeof o.destroy&&o.destroy()}})}isCustomEvent(t){return this._config.events.indexOf(t)>-1}}const Oa=["alt","control","meta","shift"],za={alt:t=>t.altKey,control:t=>t.ctrlKey,meta:t=>t.metaKey,shift:t=>t.shiftKey};class Da extends aa{constructor(t){super(t)}supports(t){return null!=Da.parseEventName(t)}addEventListener(t,e,n){const i=Da.parseEventName(e),o=Da.eventCallback(i.fullKey,n,this.manager.getZone());return this.manager.getZone().runOutsideAngular(()=>Ur().onAndCancel(t,i.domEventName,o))}static parseEventName(t){const e=t.toLowerCase().split("."),n=e.shift();if(0===e.length||"keydown"!==n&&"keyup"!==n)return null;const i=Da._normalizeKey(e.pop());let o="";if(Oa.forEach(t=>{const n=e.indexOf(t);n>-1&&(e.splice(n,1),o+=t+".")}),o+=i,0!=e.length||0===i.length)return null;const s={};return s.domEventName=n,s.fullKey=o,s}static getEventFullKey(t){let e="",n=Ur().getEventKey(t);return n=n.toLowerCase()," "===n?n="space":"."===n&&(n="dot"),Oa.forEach(i=>{i!=n&&(0,za[i])(t)&&(e+=i+".")}),e+=n,e}static eventCallback(t,e,n){return i=>{Da.getEventFullKey(i)===t&&n.runGuarded(()=>e(i))}}static _normalizeKey(t){switch(t){case"esc":return"escape";default:return t}}}class Ra{}class Za extends Ra{constructor(t){super(),this._doc=t}sanitize(t,e){if(null==e)return null;switch(t){case Qt.NONE:return e;case Qt.HTML:return e instanceof ja?e.changingThisBreaksApplicationSecurity:(this.checkNotSafeValue(e,"HTML"),function(t,e){let n=null;try{Yt=Yt||new Mt(t);let i=e?String(e):"";n=Yt.getInertBodyElement(i);let o=5,s=i;do{if(0===o)throw new Error("Failed to sanitize html because the input is unstable");o--,i=s,s=n.innerHTML,n=Yt.getInertBodyElement(i)}while(i!==s);const r=new qt,a=r.sanitizeChildren(Jt(n)||n);return It()&&r.sanitizedSomething&&console.warn("WARNING: sanitizing HTML stripped some content, see http://g.co/ng/security#xss"),a}finally{if(n){const t=Jt(n)||n;for(;t.firstChild;)t.removeChild(t.firstChild)}}}(this._doc,String(e)));case Qt.STYLE:return e instanceof Va?e.changingThisBreaksApplicationSecurity:(this.checkNotSafeValue(e,"Style"),function(t){if(!(t=String(t).trim()))return"";const e=t.match(ee);return e&&Ot(e[1])===e[1]||t.match(te)&&function(t){let e=!0,n=!0;for(let i=0;i<t.length;i++){const o=t.charAt(i);"'"===o&&n?e=!e:'"'===o&&e&&(n=!n)}return e&&n}(t)?t:(It()&&console.warn(`WARNING: sanitizing unsafe style value ${t} (see http://g.co/ng/security#xss).`),"unsafe")}(e));case Qt.SCRIPT:if(e instanceof Ha)return e.changingThisBreaksApplicationSecurity;throw this.checkNotSafeValue(e,"Script"),new Error("unsafe value used in a script context");case Qt.URL:return e instanceof Ua||e instanceof Fa?e.changingThisBreaksApplicationSecurity:(this.checkNotSafeValue(e,"URL"),Ot(String(e)));case Qt.RESOURCE_URL:if(e instanceof Ua)return e.changingThisBreaksApplicationSecurity;throw this.checkNotSafeValue(e,"ResourceURL"),new Error("unsafe value used in a resource URL context (see http://g.co/ng/security#xss)");default:throw new Error(`Unexpected SecurityContext ${t} (see http://g.co/ng/security#xss)`)}}checkNotSafeValue(t,e){if(t instanceof Ba)throw new Error(`Required a safe ${e}, got a ${t.getTypeName()} `+"(see http://g.co/ng/security#xss)")}bypassSecurityTrustHtml(t){return new ja(t)}bypassSecurityTrustStyle(t){return new Va(t)}bypassSecurityTrustScript(t){return new Ha(t)}bypassSecurityTrustUrl(t){return new Fa(t)}bypassSecurityTrustResourceUrl(t){return new Ua(t)}}class Ba{constructor(t){this.changingThisBreaksApplicationSecurity=t}toString(){return`SafeValue must use [property]=binding: ${this.changingThisBreaksApplicationSecurity}`+" (see http://g.co/ng/security#xss)"}}class ja extends Ba{getTypeName(){return"HTML"}}class Va extends Ba{getTypeName(){return"Style"}}class Ha extends Ba{getTypeName(){return"Script"}}class Fa extends Ba{getTypeName(){return"URL"}}class Ua extends Ba{getTypeName(){return"ResourceURL"}}const Wa=Ro(Ko,"browser",[{provide:no,useValue:"browser"},{provide:eo,useValue:function(){Kr.makeCurrent(),ea.init()},multi:!0},{provide:Dr,useClass:class extends Dr{constructor(t){super(),this._doc=t,this._init()}_init(){this.location=Ur().getLocation(),this._history=Ur().getHistory()}getBaseHrefFromDOM(){return Ur().getBaseHref(this._doc)}onPopState(t){Ur().getGlobalEventTarget(this._doc,"window").addEventListener("popstate",t,!1)}onHashChange(t){Ur().getGlobalEventTarget(this._doc,"window").addEventListener("hashchange",t,!1)}get href(){return this.location.href}get protocol(){return this.location.protocol}get hostname(){return this.location.hostname}get port(){return this.location.port}get pathname(){return this.location.pathname}get search(){return this.location.search}get hash(){return this.location.hash}set pathname(t){this.location.pathname=t}pushState(t,e,n){Qr()?this._history.pushState(t,e,n):this.location.hash=n}replaceState(t,e,n){Qr()?this._history.replaceState(t,e,n):this.location.hash=n}forward(){this._history.forward()}back(){this._history.back()}getState(){return this._history.state}},deps:[Hr]},{provide:Hr,useFactory:function(){return document},deps:[]}]);function qa(){return new St}class $a{constructor(t){if(t)throw new Error("BrowserModule has already been loaded. If you need access to common directives such as NgIf and NgFor from a lazy loaded module, import CommonModule instead.")}static withServerTransition(t){return{ngModule:$a,providers:[{provide:Qi,useValue:t.appId},{provide:Xr,useExisting:Qi},ta]}}}"undefined"!=typeof window&&window;class Ga{}var Ka=vr(Sr,[],(function(t){return function(t){const e={},n=[];let i=!1;for(let o=0;o<t.length;o++){const s=t[o];s.token===re&&!0===s.value&&(i=!0),1073741824&s.flags&&n.push(s.token),s.index=o,e[bn(s.token)]=s}return{factory:null,providersByKey:e,providers:t,modules:n,isRoot:i}}([Qn(512,ke,Ie,[[8,[zr]],[3,ke],yt]),Qn(5120,so,Qo,[[3,so]]),Qn(4608,Br,jr,[so,[2,Zr]]),Qn(5120,Hi,Xo,[To]),Qn(4608,co,co,[]),Qn(5120,Qi,Xi,[]),Qn(5120,Qe,Yo,[]),Qn(5120,Xe,Jo,[]),Qn(4608,Ra,Za,[Hr]),Qn(6144,Xt,null,[Ra]),Qn(4608,Ia,Aa,[]),Qn(5120,sa,(function(t,e,n,i,o,s,r,a){return[new La(t,e,n),new Da(i),new Na(o,s,r,a)]}),[Hr,To,no,Hr,Hr,Ia,oo,[2,Ma]]),Qn(4608,ra,ra,[sa,To]),Qn(135680,ha,ha,[Hr]),Qn(4608,fa,fa,[ra,ha,Qi]),Qn(6144,De,null,[fa]),Qn(6144,la,null,[ha]),Qn(4608,Io,Io,[To]),Qn(1073742336,Ga,Ga,[]),Qn(1073742336,Vr,Vr,[]),Qn(1024,St,qa,[]),Qn(1024,Yi,(function(t){return[(e=t,na("probe",oa),na("coreTokens",Object.assign({},ia,(e||[]).reduce((t,e)=>(t[e.name]=e.token,t),{}))),()=>oa)];var e}),[[2,Do]]),Qn(512,Ji,Ji,[[2,Yi]]),Qn(131584,Vo,Vo,[To,oo,le,St,ke,Ji]),Qn(1073742336,ts,ts,[Vo]),Qn(1073742336,$a,$a,[[3,$a]]),Qn(1073742336,Sr,Sr,[le]),Qn(256,re,!0,[])])}));(function(){if(kt)throw new Error("Cannot enable prod mode after platform setup.");Lt=!1})(),Wa().bootstrapModuleFactory(Ka).catch(t=>console.error(t))},zn8P:function(t,e){function n(t){return Promise.resolve().then((function(){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}))}n.keys=function(){return[]},n.resolve=n,t.exports=n,n.id="zn8P"}},[[0,0]]]);