Index: /mods/mod_ticket/assets/css/wpsg_calendar.css
===================================================================
--- /mods/mod_ticket/assets/css/wpsg_calendar.css	(revision 8427)
+++ /mods/mod_ticket/assets/css/wpsg_calendar.css	(revision 8427)
@@ -0,0 +1,12 @@
+.fc-v-event .fc-event-main { position:initial; }
+.fc-event { padding:0; background:initial; color:white; cursor:pointer; display:flex; justify-content:stretch; align-items:stretch; box-shadow:none; border-radius:0; border:0;
+    & > .fc-event-main { width:100%; }
+    .wpsg_event { padding:2px 2px 16px 2px; font-size:13px; background-color:green; display:flex; flex-grow:1; border-radius:2px; height:100%;
+        .wpsg_event_free_slots { position:absolute; right:3px; bottom:1px; font-size:12px; }
+        &.selected { background-color:blue; color:white;}
+    }
+    &:hover { color:#000000; }
+    .fc-timegrid-event .fc-event-main { padding:0; }
+}
+.fc-header-toolbar { font-size:14px; }
+.fc-dayGridMonth-view .fc-event { position:relative; }
Index: /mods/mod_ticket/assets/css/wpsg_ticket.css
===================================================================
--- /mods/mod_ticket/assets/css/wpsg_ticket.css	(revision 8427)
+++ /mods/mod_ticket/assets/css/wpsg_ticket.css	(revision 8427)
@@ -0,0 +1,137 @@
+.wpsg_ticket_product {
+  position: relative; }
+  .wpsg_ticket_product .product_top {
+    display: grid;
+    grid-template-columns: 307px 1fr;
+    gap: 1rem;
+    justify-content: space-between;
+    margin-bottom: 2rem; }
+    .wpsg_ticket_product .product_top .wpsg_productimages {
+      flex-shrink: 0;
+      width: 307px;
+      height: 300px; }
+      .wpsg_ticket_product .product_top .wpsg_productimages img {
+        max-width: 100%;
+        height: auto;
+        max-height: 300px;
+        border-radius: 12px; }
+    .wpsg_ticket_product .product_top .wpsg_produkt_produktbilder {
+      max-width: 100%; }
+  .wpsg_ticket_product .mt-8 {
+    margin-top: 2rem; }
+  .wpsg_ticket_product .flex {
+    display: flex; }
+  .wpsg_ticket_product .justify-between {
+    justify-content: space-between; }
+  .wpsg_ticket_product .items-center {
+    align-items: center; }
+  .wpsg_ticket_product .price {
+    font-weight: bold;
+    font-size: 1.25em; }
+  .wpsg_ticket_product .no_event {
+    margin-top: 2rem; }
+  .wpsg_ticket_product .ticket_selection {
+    display: flex;
+    flex-direction: row;
+    gap: 0.5rem;
+    margin-top: 2rem;
+    align-items: center;
+    justify-content: space-between; }
+    .wpsg_ticket_product .ticket_selection input[type="number"] {
+      padding: 0.5rem 0.25rem; }
+  .wpsg_ticket_product .wpsg_product_information_long {
+    margin-bottom: 2rem; }
+  .wpsg_ticket_product .loading_layer {
+    z-index: 20;
+    background-color: rgba(255, 255, 255, 0.75);
+    position: absolute;
+    left: 0;
+    top: 0;
+    height: 100%;
+    width: 100%;
+    display: flex;
+    justify-content: center;
+    align-items: center; }
+  .wpsg_ticket_product .layer_msg {
+    background-color: rgba(255, 255, 255, 0.75);
+    position: absolute;
+    left: 0;
+    top: 0;
+    height: 100%;
+    width: 100%;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    z-index: 2; }
+    .wpsg_ticket_product .layer_msg .inner {
+      padding: 2rem 4rem;
+      border: 1px solid black;
+      background-color: #FFFFFF;
+      min-width: min(100%, 500px); }
+      .wpsg_ticket_product .layer_msg .inner .msg {
+        font-size: 1.25rem;
+        text-align: center; }
+      .wpsg_ticket_product .layer_msg .inner .button_wrap {
+        margin-top: 2rem;
+        display: flex;
+        justify-content: space-between;
+        gap: 1rem; }
+        .wpsg_ticket_product .layer_msg .inner .button_wrap > a {
+          flex: 1;
+          white-space: nowrap;
+          display: flex;
+          text-align: center;
+          padding-right: 0;
+          padding-left: 0;
+          justify-content: center; }
+  .wpsg_ticket_product .variant_wrap {
+    display: flex;
+    flex-direction: column;
+    gap: 0.25rem; }
+    .wpsg_ticket_product .variant_wrap .variant_row {
+      display: grid;
+      grid-template-columns: 1fr 2fr;
+      justify-content: space-between;
+      margin-bottom: 0.5rem;
+      gap: 1rem;
+      align-items: center; }
+      .wpsg_ticket_product .variant_wrap .variant_row select {
+        width: 100%;
+        height: 24px;
+        line-height: 24px; }
+      .wpsg_ticket_product .variant_wrap .variant_row input[type="text"], .wpsg_ticket_product .variant_wrap .variant_row textarea {
+        width: 100%;
+        line-height: 24px;
+        box-sizing: border-box;
+        padding-left: 4px; }
+      .wpsg_ticket_product .variant_wrap .variant_row .radio_wrap {
+        display: flex;
+        flex-wrap: wrap;
+        justify-content: flex-start;
+        row-gap: 1rem;
+        column-gap: 1rem; }
+        .wpsg_ticket_product .variant_wrap .variant_row .radio_wrap .radio {
+          display: flex;
+          gap: 0.5rem;
+          justify-content: flex-start;
+          align-items: center;
+          margin: 0; }
+          .wpsg_ticket_product .variant_wrap .variant_row .radio_wrap .radio input {
+            margin: 0; }
+      .wpsg_ticket_product .variant_wrap .variant_row .image_wrap {
+        display: flex;
+        flex-wrap: wrap;
+        justify-content: flex-start;
+        row-gap: 1rem;
+        column-gap: 5px; }
+        .wpsg_ticket_product .variant_wrap .variant_row .image_wrap .image {
+          margin: 0;
+          line-height: 0;
+          cursor: pointer; }
+          .wpsg_ticket_product .variant_wrap .variant_row .image_wrap .image img {
+            width: 99px;
+            height: auto; }
+  .wpsg_ticket_product .calendar_wrap {
+    margin-bottom: 2rem; }
+
+/*# sourceMappingURL=wpsg_ticket.css.map */
Index: /mods/mod_ticket/assets/css/wpsg_ticket.css.map
===================================================================
--- /mods/mod_ticket/assets/css/wpsg_ticket.css.map	(revision 8427)
+++ /mods/mod_ticket/assets/css/wpsg_ticket.css.map	(revision 8427)
@@ -0,0 +1,7 @@
+{
+"version": 3,
+"mappings": "AAAA,oBAAqB;EAAE,QAAQ,EAAC,QAAQ;EACvC,iCAAa;IAAE,OAAO,EAAC,IAAI;IAAE,qBAAqB,EAAC,SAAS;IAAE,GAAG,EAAC,IAAI;IAAE,eAAe,EAAC,aAAa;IAAE,aAAa,EAAC,IAAI;IACxH,qDAAoB;MAAE,WAAW,EAAC,CAAC;MAAE,KAAK,EAAC,KAAK;MAAE,MAAM,EAAC,KAAK;MAC7D,yDAAI;QAAE,SAAS,EAAC,IAAI;QAAE,MAAM,EAAC,IAAI;QAAE,UAAU,EAAC,KAAK;QAAE,aAAa,EAAC,IAAI;IAExE,6DAA4B;MAAE,SAAS,EAAC,IAAI;EAE7C,0BAAM;IAAE,UAAU,EAAC,IAAI;EACvB,0BAAM;IAAE,OAAO,EAAC,IAAI;EACpB,qCAAiB;IAAE,eAAe,EAAC,aAAa;EAChD,kCAAc;IAAE,WAAW,EAAC,MAAM;EAClC,2BAAO;IAAE,WAAW,EAAC,IAAI;IAAE,SAAS,EAAC,MAAM;EAC3C,8BAAU;IAAE,UAAU,EAAC,IAAI;EAC3B,sCAAkB;IAAE,OAAO,EAAC,IAAI;IAAE,cAAc,EAAC,GAAG;IAAE,GAAG,EAAC,MAAM;IAAE,UAAU,EAAC,IAAI;IAAE,WAAW,EAAC,MAAM;IAAE,eAAe,EAAC,aAAa;IACnI,2DAAqB;MAAE,OAAO,EAAC,cAAc;EAE9C,mDAA+B;IAAE,aAAa,EAAC,IAAI;EACnD,mCAAe;IAAE,OAAO,EAAC,EAAE;IAAE,gBAAgB,EAAC,yBAAyB;IAAE,QAAQ,EAAC,QAAQ;IAAE,IAAI,EAAC,CAAC;IAAE,GAAG,EAAC,CAAC;IAAE,MAAM,EAAC,IAAI;IAAE,KAAK,EAAC,IAAI;IAAE,OAAO,EAAC,IAAI;IAAE,eAAe,EAAC,MAAM;IAAE,WAAW,EAAC,MAAM;EAC5L,+BAAW;IAAE,gBAAgB,EAAC,yBAAyB;IAAE,QAAQ,EAAC,QAAQ;IAAE,IAAI,EAAC,CAAC;IAAE,GAAG,EAAC,CAAC;IAAE,MAAM,EAAC,IAAI;IAAE,KAAK,EAAC,IAAI;IAAE,OAAO,EAAC,IAAI;IAAE,eAAe,EAAC,MAAM;IAAE,WAAW,EAAC,MAAM;IAAE,OAAO,EAAC,CAAC;IACtL,sCAAO;MAAE,OAAO,EAAC,SAAS;MAAE,MAAM,EAAC,eAAe;MAAE,gBAAgB,EAAC,OAAO;MAAE,SAAS,EAAC,gBAAgB;MACvG,2CAAK;QAAE,SAAS,EAAC,OAAO;QAAE,UAAU,EAAC,MAAM;MAC3C,mDAAa;QAAE,UAAU,EAAC,IAAI;QAAE,OAAO,EAAC,IAAI;QAAE,eAAe,EAAC,aAAa;QAAE,GAAG,EAAC,IAAI;QACpF,uDAAM;UAAE,IAAI,EAAC,CAAC;UAAE,WAAW,EAAC,MAAM;UAAE,OAAO,EAAC,IAAI;UAAE,UAAU,EAAC,MAAM;UAAE,aAAa,EAAC,CAAC;UAAE,YAAY,EAAC,CAAC;UAAE,eAAe,EAAC,MAAM;EAI/H,kCAAc;IAAE,OAAO,EAAC,IAAI;IAAE,cAAc,EAAC,MAAM;IAAE,GAAG,EAAC,OAAO;IAC/D,+CAAa;MAAE,OAAO,EAAC,IAAI;MAAC,qBAAqB,EAAC,OAAO;MAAE,eAAe,EAAC,aAAa;MAAE,aAAa,EAAC,MAAM;MAAE,GAAG,EAAC,IAAI;MAAE,WAAW,EAAC,MAAM;MAC3I,sDAAO;QAAE,KAAK,EAAC,IAAI;QAAE,MAAM,EAAC,IAAI;QAAE,WAAW,EAAC,IAAI;MAClD,4HAA6B;QAAE,KAAK,EAAC,IAAI;QAAE,WAAW,EAAC,IAAI;QAAE,UAAU,EAAC,UAAU;QAAE,YAAY,EAAC,GAAG;MACpG,2DAAY;QAAE,OAAO,EAAC,IAAI;QAAE,SAAS,EAAC,IAAI;QAAE,eAAe,EAAC,UAAU;QAAE,OAAO,EAAC,IAAI;QAAE,UAAU,EAAC,IAAI;QACpG,kEAAO;UAAE,OAAO,EAAC,IAAI;UAAE,GAAG,EAAC,MAAM;UAAE,eAAe,EAAC,UAAU;UAAE,WAAW,EAAC,MAAM;UAAE,MAAM,EAAC,CAAC;UAC1F,wEAAM;YAAE,MAAM,EAAC,CAAC;MAGlB,2DAAY;QAAE,OAAO,EAAC,IAAI;QAAE,SAAS,EAAC,IAAI;QAAE,eAAe,EAAC,UAAU;QAAE,OAAO,EAAC,IAAI;QAAE,UAAU,EAAC,GAAG;QACnG,kEAAO;UAAE,MAAM,EAAC,CAAC;UAAE,WAAW,EAAC,CAAC;UAAE,MAAM,EAAC,OAAO;UAC/C,sEAAI;YAAE,KAAK,EAAC,IAAI;YAAE,MAAM,EAAC,IAAI;EAKjC,mCAAe;IAAE,aAAa,EAAC,IAAI",
+"sources": ["wpsg_ticket.scss"],
+"names": [],
+"file": "wpsg_ticket.css"
+}
Index: /mods/mod_ticket/assets/css/wpsg_ticket.scss
===================================================================
--- /mods/mod_ticket/assets/css/wpsg_ticket.scss	(revision 8427)
+++ /mods/mod_ticket/assets/css/wpsg_ticket.scss	(revision 8427)
@@ -0,0 +1,44 @@
+.wpsg_ticket_product { position:relative;
+	.product_top { display:grid; grid-template-columns:307px 1fr; gap:1rem; justify-content:space-between; margin-bottom:2rem;
+		.wpsg_productimages { flex-shrink:0; width:307px; height:300px;
+			img { max-width:100%; height:auto; max-height:300px; border-radius:12px; }
+		}
+		.wpsg_produkt_produktbilder { max-width:100%; }
+	}
+	.mt-8 { margin-top:2rem; }
+	.flex { display:flex; }
+	.justify-between { justify-content:space-between; }
+	.items-center { align-items:center; }
+	.price { font-weight:bold; font-size:1.25em; }
+	.no_event { margin-top:2rem;}
+	.ticket_selection { display:flex; flex-direction:row; gap:0.5rem; margin-top:2rem; align-items:center; justify-content:space-between;
+		input[type="number"] { padding:0.5rem 0.25rem; }
+	}
+	.wpsg_product_information_long { margin-bottom:2rem; }
+	.loading_layer { z-index:20; background-color:rgba(255, 255, 255, 0.75); position:absolute; left:0; top:0; height:100%; width:100%; display:flex; justify-content:center; align-items:center; }
+	.layer_msg { background-color:rgba(255, 255, 255, 0.75); position:absolute; left:0; top:0; height:100%; width:100%; display:flex; justify-content:center; align-items:center; z-index:2;
+		.inner { padding:2rem 4rem; border:1px solid black; background-color:#FFFFFF; min-width:min(100%, 500px);
+			.msg { font-size:1.25rem; text-align:center; }
+			.button_wrap { margin-top:2rem; display:flex; justify-content:space-between; gap:1rem;
+				& > a { flex:1; white-space:nowrap; display:flex; text-align:center; padding-right:0; padding-left:0; justify-content:center; }
+			}
+		}
+	}
+	.variant_wrap { display:flex; flex-direction:column; gap:0.25rem;
+		.variant_row { display:grid;grid-template-columns:1fr 2fr; justify-content:space-between; margin-bottom:0.5rem; gap:1rem; align-items:center;
+			select { width:100%; height:24px; line-height:24px; }
+			input[type="text"], textarea { width:100%; line-height:24px; box-sizing:border-box; padding-left:4px; }
+			.radio_wrap { display:flex; flex-wrap:wrap; justify-content:flex-start; row-gap:1rem; column-gap:1rem;
+				.radio { display:flex; gap:0.5rem; justify-content:flex-start; align-items:center; margin:0;
+					input { margin:0; }
+				}
+			}
+			.image_wrap { display:flex; flex-wrap:wrap; justify-content:flex-start; row-gap:1rem; column-gap:5px;
+				.image { margin:0; line-height:0; cursor:pointer;
+					img { width:99px; height:auto; }
+				}
+			}
+		}
+	}
+	.calendar_wrap { margin-bottom:2rem; }
+}
Index: /mods/mod_ticket/assets/js/HTML5QrScannerv2.3.8.js
===================================================================
--- /mods/mod_ticket/assets/js/HTML5QrScannerv2.3.8.js	(revision 8427)
+++ /mods/mod_ticket/assets/js/HTML5QrScannerv2.3.8.js	(revision 8427)
@@ -0,0 +1,10 @@
+var __Html5QrcodeLibrary__;(()=>{var t={449:function(t,e,r){!function(t){"use strict";function e(t){return null==t}var n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])};var i,o=function(t){function e(e){var r,n,i,o=this.constructor,s=t.call(this,e)||this;return Object.defineProperty(s,"name",{value:o.name,enumerable:!1}),r=s,n=o.prototype,(i=Object.setPrototypeOf)?i(r,n):r.__proto__=n,function(t,e){void 0===e&&(e=t.constructor);var r=Error.captureStackTrace;r&&r(t,e)}(s),s}return function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}(e,t),e}(Error);class s extends o{constructor(t=undefined){super(t),this.message=t}getKind(){return this.constructor.kind}}s.kind="Exception";class a extends s{}a.kind="ArgumentException";class c extends s{}c.kind="IllegalArgumentException";class l{constructor(t){if(this.binarizer=t,null===t)throw new c("Binarizer must be non-null.")}getWidth(){return this.binarizer.getWidth()}getHeight(){return this.binarizer.getHeight()}getBlackRow(t,e){return this.binarizer.getBlackRow(t,e)}getBlackMatrix(){return null!==this.matrix&&void 0!==this.matrix||(this.matrix=this.binarizer.getBlackMatrix()),this.matrix}isCropSupported(){return this.binarizer.getLuminanceSource().isCropSupported()}crop(t,e,r,n){const i=this.binarizer.getLuminanceSource().crop(t,e,r,n);return new l(this.binarizer.createBinarizer(i))}isRotateSupported(){return this.binarizer.getLuminanceSource().isRotateSupported()}rotateCounterClockwise(){const t=this.binarizer.getLuminanceSource().rotateCounterClockwise();return new l(this.binarizer.createBinarizer(t))}rotateCounterClockwise45(){const t=this.binarizer.getLuminanceSource().rotateCounterClockwise45();return new l(this.binarizer.createBinarizer(t))}toString(){try{return this.getBlackMatrix().toString()}catch(t){return""}}}class h extends s{static getChecksumInstance(){return new h}}h.kind="ChecksumException";class u{constructor(t){this.source=t}getLuminanceSource(){return this.source}getWidth(){return this.source.getWidth()}getHeight(){return this.source.getHeight()}}class d{static arraycopy(t,e,r,n,i){for(;i--;)r[n++]=t[e++]}static currentTimeMillis(){return Date.now()}}class f extends s{}f.kind="IndexOutOfBoundsException";class g extends f{constructor(t=undefined,e=undefined){super(e),this.index=t,this.message=e}}g.kind="ArrayIndexOutOfBoundsException";class w{static fill(t,e){for(let r=0,n=t.length;r<n;r++)t[r]=e}static fillWithin(t,e,r,n){w.rangeCheck(t.length,e,r);for(let i=e;i<r;i++)t[i]=n}static rangeCheck(t,e,r){if(e>r)throw new c("fromIndex("+e+") > toIndex("+r+")");if(e<0)throw new g(e);if(r>t)throw new g(r)}static asList(...t){return t}static create(t,e,r){return Array.from({length:t}).map((t=>Array.from({length:e}).fill(r)))}static createInt32Array(t,e,r){return Array.from({length:t}).map((t=>Int32Array.from({length:e}).fill(r)))}static equals(t,e){if(!t)return!1;if(!e)return!1;if(!t.length)return!1;if(!e.length)return!1;if(t.length!==e.length)return!1;for(let r=0,n=t.length;r<n;r++)if(t[r]!==e[r])return!1;return!0}static hashCode(t){if(null===t)return 0;let e=1;for(const r of t)e=31*e+r;return e}static fillUint8Array(t,e){for(let r=0;r!==t.length;r++)t[r]=e}static copyOf(t,e){return t.slice(0,e)}static copyOfUint8Array(t,e){if(t.length<=e){const r=new Uint8Array(e);return r.set(t),r}return t.slice(0,e)}static copyOfRange(t,e,r){const n=r-e,i=new Int32Array(n);return d.arraycopy(t,e,i,0,n),i}static binarySearch(t,e,r){void 0===r&&(r=w.numberComparator);let n=0,i=t.length-1;for(;n<=i;){const o=i+n>>1,s=r(e,t[o]);if(s>0)n=o+1;else{if(!(s<0))return o;i=o-1}}return-n-1}static numberComparator(t,e){return t-e}}class m{static numberOfTrailingZeros(t){let e;if(0===t)return 32;let r=31;return e=t<<16,0!==e&&(r-=16,t=e),e=t<<8,0!==e&&(r-=8,t=e),e=t<<4,0!==e&&(r-=4,t=e),e=t<<2,0!==e&&(r-=2,t=e),r-(t<<1>>>31)}static numberOfLeadingZeros(t){if(0===t)return 32;let e=1;return t>>>16==0&&(e+=16,t<<=16),t>>>24==0&&(e+=8,t<<=8),t>>>28==0&&(e+=4,t<<=4),t>>>30==0&&(e+=2,t<<=2),e-=t>>>31,e}static toHexString(t){return t.toString(16)}static toBinaryString(t){return String(parseInt(String(t),2))}static bitCount(t){return t=(t=(858993459&(t-=t>>>1&1431655765))+(t>>>2&858993459))+(t>>>4)&252645135,63&(t+=t>>>8)+(t>>>16)}static truncDivision(t,e){return Math.trunc(t/e)}static parseInt(t,e=undefined){return parseInt(t,e)}}m.MIN_VALUE_32_BITS=-2147483648,m.MAX_VALUE=Number.MAX_SAFE_INTEGER;class p{constructor(t,e){void 0===t?(this.size=0,this.bits=new Int32Array(1)):(this.size=t,this.bits=null==e?p.makeArray(t):e)}getSize(){return this.size}getSizeInBytes(){return Math.floor((this.size+7)/8)}ensureCapacity(t){if(t>32*this.bits.length){const e=p.makeArray(t);d.arraycopy(this.bits,0,e,0,this.bits.length),this.bits=e}}get(t){return 0!=(this.bits[Math.floor(t/32)]&1<<(31&t))}set(t){this.bits[Math.floor(t/32)]|=1<<(31&t)}flip(t){this.bits[Math.floor(t/32)]^=1<<(31&t)}getNextSet(t){const e=this.size;if(t>=e)return e;const r=this.bits;let n=Math.floor(t/32),i=r[n];i&=~((1<<(31&t))-1);const o=r.length;for(;0===i;){if(++n===o)return e;i=r[n]}const s=32*n+m.numberOfTrailingZeros(i);return s>e?e:s}getNextUnset(t){const e=this.size;if(t>=e)return e;const r=this.bits;let n=Math.floor(t/32),i=~r[n];i&=~((1<<(31&t))-1);const o=r.length;for(;0===i;){if(++n===o)return e;i=~r[n]}const s=32*n+m.numberOfTrailingZeros(i);return s>e?e:s}setBulk(t,e){this.bits[Math.floor(t/32)]=e}setRange(t,e){if(e<t||t<0||e>this.size)throw new c;if(e===t)return;e--;const r=Math.floor(t/32),n=Math.floor(e/32),i=this.bits;for(let o=r;o<=n;o++){const s=(2<<(o<n?31:31&e))-(1<<(o>r?0:31&t));i[o]|=s}}clear(){const t=this.bits.length,e=this.bits;for(let r=0;r<t;r++)e[r]=0}isRange(t,e,r){if(e<t||t<0||e>this.size)throw new c;if(e===t)return!0;e--;const n=Math.floor(t/32),i=Math.floor(e/32),o=this.bits;for(let s=n;s<=i;s++){const a=(2<<(s<i?31:31&e))-(1<<(s>n?0:31&t))&4294967295;if((o[s]&a)!==(r?a:0))return!1}return!0}appendBit(t){this.ensureCapacity(this.size+1),t&&(this.bits[Math.floor(this.size/32)]|=1<<(31&this.size)),this.size++}appendBits(t,e){if(e<0||e>32)throw new c("Num bits must be between 0 and 32");this.ensureCapacity(this.size+e);for(let r=e;r>0;r--)this.appendBit(1==(t>>r-1&1))}appendBitArray(t){const e=t.size;this.ensureCapacity(this.size+e);for(let r=0;r<e;r++)this.appendBit(t.get(r))}xor(t){if(this.size!==t.size)throw new c("Sizes don't match");const e=this.bits;for(let r=0,n=e.length;r<n;r++)e[r]^=t.bits[r]}toBytes(t,e,r,n){for(let i=0;i<n;i++){let n=0;for(let e=0;e<8;e++)this.get(t)&&(n|=1<<7-e),t++;e[r+i]=n}}getBitArray(){return this.bits}reverse(){const t=new Int32Array(this.bits.length),e=Math.floor((this.size-1)/32),r=e+1,n=this.bits;for(let i=0;i<r;i++){let r=n[i];r=r>>1&1431655765|(1431655765&r)<<1,r=r>>2&858993459|(858993459&r)<<2,r=r>>4&252645135|(252645135&r)<<4,r=r>>8&16711935|(16711935&r)<<8,r=r>>16&65535|(65535&r)<<16,t[e-i]=r}if(this.size!==32*r){const e=32*r-this.size;let n=t[0]>>>e;for(let i=1;i<r;i++){const r=t[i];n|=r<<32-e,t[i-1]=n,n=r>>>e}t[r-1]=n}this.bits=t}static makeArray(t){return new Int32Array(Math.floor((t+31)/32))}equals(t){if(!(t instanceof p))return!1;const e=t;return this.size===e.size&&w.equals(this.bits,e.bits)}hashCode(){return 31*this.size+w.hashCode(this.bits)}toString(){let t="";for(let e=0,r=this.size;e<r;e++)0==(7&e)&&(t+=" "),t+=this.get(e)?"X":".";return t}clone(){return new p(this.size,this.bits.slice())}}!function(t){t[t.OTHER=0]="OTHER",t[t.PURE_BARCODE=1]="PURE_BARCODE",t[t.POSSIBLE_FORMATS=2]="POSSIBLE_FORMATS",t[t.TRY_HARDER=3]="TRY_HARDER",t[t.CHARACTER_SET=4]="CHARACTER_SET",t[t.ALLOWED_LENGTHS=5]="ALLOWED_LENGTHS",t[t.ASSUME_CODE_39_CHECK_DIGIT=6]="ASSUME_CODE_39_CHECK_DIGIT",t[t.ASSUME_GS1=7]="ASSUME_GS1",t[t.RETURN_CODABAR_START_END=8]="RETURN_CODABAR_START_END",t[t.NEED_RESULT_POINT_CALLBACK=9]="NEED_RESULT_POINT_CALLBACK",t[t.ALLOWED_EAN_EXTENSIONS=10]="ALLOWED_EAN_EXTENSIONS"}(i||(i={}));var A,C=i;class E extends s{static getFormatInstance(){return new E}}E.kind="FormatException",function(t){t[t.Cp437=0]="Cp437",t[t.ISO8859_1=1]="ISO8859_1",t[t.ISO8859_2=2]="ISO8859_2",t[t.ISO8859_3=3]="ISO8859_3",t[t.ISO8859_4=4]="ISO8859_4",t[t.ISO8859_5=5]="ISO8859_5",t[t.ISO8859_6=6]="ISO8859_6",t[t.ISO8859_7=7]="ISO8859_7",t[t.ISO8859_8=8]="ISO8859_8",t[t.ISO8859_9=9]="ISO8859_9",t[t.ISO8859_10=10]="ISO8859_10",t[t.ISO8859_11=11]="ISO8859_11",t[t.ISO8859_13=12]="ISO8859_13",t[t.ISO8859_14=13]="ISO8859_14",t[t.ISO8859_15=14]="ISO8859_15",t[t.ISO8859_16=15]="ISO8859_16",t[t.SJIS=16]="SJIS",t[t.Cp1250=17]="Cp1250",t[t.Cp1251=18]="Cp1251",t[t.Cp1252=19]="Cp1252",t[t.Cp1256=20]="Cp1256",t[t.UnicodeBigUnmarked=21]="UnicodeBigUnmarked",t[t.UTF8=22]="UTF8",t[t.ASCII=23]="ASCII",t[t.Big5=24]="Big5",t[t.GB18030=25]="GB18030",t[t.EUC_KR=26]="EUC_KR"}(A||(A={}));class I{constructor(t,e,r,...n){this.valueIdentifier=t,this.name=r,this.values="number"==typeof e?Int32Array.from([e]):e,this.otherEncodingNames=n,I.VALUE_IDENTIFIER_TO_ECI.set(t,this),I.NAME_TO_ECI.set(r,this);const i=this.values;for(let t=0,e=i.length;t!==e;t++){const e=i[t];I.VALUES_TO_ECI.set(e,this)}for(const t of n)I.NAME_TO_ECI.set(t,this)}getValueIdentifier(){return this.valueIdentifier}getName(){return this.name}getValue(){return this.values[0]}static getCharacterSetECIByValue(t){if(t<0||t>=900)throw new E("incorect value");const e=I.VALUES_TO_ECI.get(t);if(void 0===e)throw new E("incorect value");return e}static getCharacterSetECIByName(t){const e=I.NAME_TO_ECI.get(t);if(void 0===e)throw new E("incorect value");return e}equals(t){if(!(t instanceof I))return!1;const e=t;return this.getName()===e.getName()}}I.VALUE_IDENTIFIER_TO_ECI=new Map,I.VALUES_TO_ECI=new Map,I.NAME_TO_ECI=new Map,I.Cp437=new I(A.Cp437,Int32Array.from([0,2]),"Cp437"),I.ISO8859_1=new I(A.ISO8859_1,Int32Array.from([1,3]),"ISO-8859-1","ISO88591","ISO8859_1"),I.ISO8859_2=new I(A.ISO8859_2,4,"ISO-8859-2","ISO88592","ISO8859_2"),I.ISO8859_3=new I(A.ISO8859_3,5,"ISO-8859-3","ISO88593","ISO8859_3"),I.ISO8859_4=new I(A.ISO8859_4,6,"ISO-8859-4","ISO88594","ISO8859_4"),I.ISO8859_5=new I(A.ISO8859_5,7,"ISO-8859-5","ISO88595","ISO8859_5"),I.ISO8859_6=new I(A.ISO8859_6,8,"ISO-8859-6","ISO88596","ISO8859_6"),I.ISO8859_7=new I(A.ISO8859_7,9,"ISO-8859-7","ISO88597","ISO8859_7"),I.ISO8859_8=new I(A.ISO8859_8,10,"ISO-8859-8","ISO88598","ISO8859_8"),I.ISO8859_9=new I(A.ISO8859_9,11,"ISO-8859-9","ISO88599","ISO8859_9"),I.ISO8859_10=new I(A.ISO8859_10,12,"ISO-8859-10","ISO885910","ISO8859_10"),I.ISO8859_11=new I(A.ISO8859_11,13,"ISO-8859-11","ISO885911","ISO8859_11"),I.ISO8859_13=new I(A.ISO8859_13,15,"ISO-8859-13","ISO885913","ISO8859_13"),I.ISO8859_14=new I(A.ISO8859_14,16,"ISO-8859-14","ISO885914","ISO8859_14"),I.ISO8859_15=new I(A.ISO8859_15,17,"ISO-8859-15","ISO885915","ISO8859_15"),I.ISO8859_16=new I(A.ISO8859_16,18,"ISO-8859-16","ISO885916","ISO8859_16"),I.SJIS=new I(A.SJIS,20,"SJIS","Shift_JIS"),I.Cp1250=new I(A.Cp1250,21,"Cp1250","windows-1250"),I.Cp1251=new I(A.Cp1251,22,"Cp1251","windows-1251"),I.Cp1252=new I(A.Cp1252,23,"Cp1252","windows-1252"),I.Cp1256=new I(A.Cp1256,24,"Cp1256","windows-1256"),I.UnicodeBigUnmarked=new I(A.UnicodeBigUnmarked,25,"UnicodeBigUnmarked","UTF-16BE","UnicodeBig"),I.UTF8=new I(A.UTF8,26,"UTF8","UTF-8"),I.ASCII=new I(A.ASCII,Int32Array.from([27,170]),"ASCII","US-ASCII"),I.Big5=new I(A.Big5,28,"Big5"),I.GB18030=new I(A.GB18030,29,"GB18030","GB2312","EUC_CN","GBK"),I.EUC_KR=new I(A.EUC_KR,30,"EUC_KR","EUC-KR");class S extends s{}S.kind="UnsupportedOperationException";class _{static decode(t,e){const r=this.encodingName(e);return this.customDecoder?this.customDecoder(t,r):"undefined"==typeof TextDecoder||this.shouldDecodeOnFallback(r)?this.decodeFallback(t,r):new TextDecoder(r).decode(t)}static shouldDecodeOnFallback(t){return!_.isBrowser()&&"ISO-8859-1"===t}static encode(t,e){const r=this.encodingName(e);return this.customEncoder?this.customEncoder(t,r):"undefined"==typeof TextEncoder?this.encodeFallback(t):(new TextEncoder).encode(t)}static isBrowser(){return"undefined"!=typeof window&&"[object Window]"==={}.toString.call(window)}static encodingName(t){return"string"==typeof t?t:t.getName()}static encodingCharacterSet(t){return t instanceof I?t:I.getCharacterSetECIByName(t)}static decodeFallback(t,e){const r=this.encodingCharacterSet(e);if(_.isDecodeFallbackSupported(r)){let e="";for(let r=0,n=t.length;r<n;r++){let n=t[r].toString(16);n.length<2&&(n="0"+n),e+="%"+n}return decodeURIComponent(e)}if(r.equals(I.UnicodeBigUnmarked))return String.fromCharCode.apply(null,new Uint16Array(t.buffer));throw new S(`Encoding ${this.encodingName(e)} not supported by fallback.`)}static isDecodeFallbackSupported(t){return t.equals(I.UTF8)||t.equals(I.ISO8859_1)||t.equals(I.ASCII)}static encodeFallback(t){const e=btoa(unescape(encodeURIComponent(t))).split(""),r=[];for(let t=0;t<e.length;t++)r.push(e[t].charCodeAt(0));return new Uint8Array(r)}}class T{static castAsNonUtf8Char(t,e=null){const r=e?e.getName():this.ISO88591;return _.decode(new Uint8Array([t]),r)}static guessEncoding(t,e){if(null!=e&&void 0!==e.get(C.CHARACTER_SET))return e.get(C.CHARACTER_SET).toString();const r=t.length;let n=!0,i=!0,o=!0,s=0,a=0,c=0,l=0,h=0,u=0,d=0,f=0,g=0,w=0,m=0;const p=t.length>3&&239===t[0]&&187===t[1]&&191===t[2];for(let e=0;e<r&&(n||i||o);e++){const r=255&t[e];o&&(s>0?0==(128&r)?o=!1:s--:0!=(128&r)&&(0==(64&r)?o=!1:(s++,0==(32&r)?a++:(s++,0==(16&r)?c++:(s++,0==(8&r)?l++:o=!1))))),n&&(r>127&&r<160?n=!1:r>159&&(r<192||215===r||247===r)&&m++),i&&(h>0?r<64||127===r||r>252?i=!1:h--:128===r||160===r||r>239?i=!1:r>160&&r<224?(u++,f=0,d++,d>g&&(g=d)):r>127?(h++,d=0,f++,f>w&&(w=f)):(d=0,f=0))}return o&&s>0&&(o=!1),i&&h>0&&(i=!1),o&&(p||a+c+l>0)?T.UTF8:i&&(T.ASSUME_SHIFT_JIS||g>=3||w>=3)?T.SHIFT_JIS:n&&i?2===g&&2===u||10*m>=r?T.SHIFT_JIS:T.ISO88591:n?T.ISO88591:i?T.SHIFT_JIS:o?T.UTF8:T.PLATFORM_DEFAULT_ENCODING}static format(t,...e){let r=-1;return t.replace(/%(-)?(0?[0-9]+)?([.][0-9]+)?([#][0-9]+)?([scfpexd%])/g,(function(t,n,i,o,s,a){if("%%"===t)return"%";if(void 0===e[++r])return;t=o?parseInt(o.substr(1)):void 0;let c,l=s?parseInt(s.substr(1)):void 0;switch(a){case"s":c=e[r];break;case"c":c=e[r][0];break;case"f":c=parseFloat(e[r]).toFixed(t);break;case"p":c=parseFloat(e[r]).toPrecision(t);break;case"e":c=parseFloat(e[r]).toExponential(t);break;case"x":c=parseInt(e[r]).toString(l||16);break;case"d":c=parseFloat(parseInt(e[r],l||10).toPrecision(t)).toFixed(0)}c="object"==typeof c?JSON.stringify(c):(+c).toString(l);let h=parseInt(i),u=i&&i[0]+""=="0"?"0":" ";for(;c.length<h;)c=void 0!==n?c+u:u+c;return c}))}static getBytes(t,e){return _.encode(t,e)}static getCharCode(t,e=0){return t.charCodeAt(e)}static getCharAt(t){return String.fromCharCode(t)}}T.SHIFT_JIS=I.SJIS.getName(),T.GB2312="GB2312",T.ISO88591=I.ISO8859_1.getName(),T.EUC_JP="EUC_JP",T.UTF8=I.UTF8.getName(),T.PLATFORM_DEFAULT_ENCODING=T.UTF8,T.ASSUME_SHIFT_JIS=!1;class y{constructor(t=""){this.value=t}enableDecoding(t){return this.encoding=t,this}append(t){return"string"==typeof t?this.value+=t.toString():this.encoding?this.value+=T.castAsNonUtf8Char(t,this.encoding):this.value+=String.fromCharCode(t),this}appendChars(t,e,r){for(let n=e;e<e+r;n++)this.append(t[n]);return this}length(){return this.value.length}charAt(t){return this.value.charAt(t)}deleteCharAt(t){this.value=this.value.substr(0,t)+this.value.substring(t+1)}setCharAt(t,e){this.value=this.value.substr(0,t)+e+this.value.substr(t+1)}substring(t,e){return this.value.substring(t,e)}setLengthToZero(){this.value=""}toString(){return this.value}insert(t,e){this.value=this.value.substr(0,t)+e+this.value.substr(t+e.length)}}class N{constructor(t,e,r,n){if(this.width=t,this.height=e,this.rowSize=r,this.bits=n,null==e&&(e=t),this.height=e,t<1||e<1)throw new c("Both dimensions must be greater than 0");null==r&&(r=Math.floor((t+31)/32)),this.rowSize=r,null==n&&(this.bits=new Int32Array(this.rowSize*this.height))}static parseFromBooleanArray(t){const e=t.length,r=t[0].length,n=new N(r,e);for(let i=0;i<e;i++){const e=t[i];for(let t=0;t<r;t++)e[t]&&n.set(t,i)}return n}static parseFromString(t,e,r){if(null===t)throw new c("stringRepresentation cannot be null");const n=new Array(t.length);let i=0,o=0,s=-1,a=0,l=0;for(;l<t.length;)if("\n"===t.charAt(l)||"\r"===t.charAt(l)){if(i>o){if(-1===s)s=i-o;else if(i-o!==s)throw new c("row lengths do not match");o=i,a++}l++}else if(t.substring(l,l+e.length)===e)l+=e.length,n[i]=!0,i++;else{if(t.substring(l,l+r.length)!==r)throw new c("illegal character encountered: "+t.substring(l));l+=r.length,n[i]=!1,i++}if(i>o){if(-1===s)s=i-o;else if(i-o!==s)throw new c("row lengths do not match");a++}const h=new N(s,a);for(let t=0;t<i;t++)n[t]&&h.set(Math.floor(t%s),Math.floor(t/s));return h}get(t,e){const r=e*this.rowSize+Math.floor(t/32);return 0!=(this.bits[r]>>>(31&t)&1)}set(t,e){const r=e*this.rowSize+Math.floor(t/32);this.bits[r]|=1<<(31&t)&4294967295}unset(t,e){const r=e*this.rowSize+Math.floor(t/32);this.bits[r]&=~(1<<(31&t)&4294967295)}flip(t,e){const r=e*this.rowSize+Math.floor(t/32);this.bits[r]^=1<<(31&t)&4294967295}xor(t){if(this.width!==t.getWidth()||this.height!==t.getHeight()||this.rowSize!==t.getRowSize())throw new c("input matrix dimensions do not match");const e=new p(Math.floor(this.width/32)+1),r=this.rowSize,n=this.bits;for(let i=0,o=this.height;i<o;i++){const o=i*r,s=t.getRow(i,e).getBitArray();for(let t=0;t<r;t++)n[o+t]^=s[t]}}clear(){const t=this.bits,e=t.length;for(let r=0;r<e;r++)t[r]=0}setRegion(t,e,r,n){if(e<0||t<0)throw new c("Left and top must be nonnegative");if(n<1||r<1)throw new c("Height and width must be at least 1");const i=t+r,o=e+n;if(o>this.height||i>this.width)throw new c("The region must fit inside the matrix");const s=this.rowSize,a=this.bits;for(let r=e;r<o;r++){const e=r*s;for(let r=t;r<i;r++)a[e+Math.floor(r/32)]|=1<<(31&r)&4294967295}}getRow(t,e){null==e||e.getSize()<this.width?e=new p(this.width):e.clear();const r=this.rowSize,n=this.bits,i=t*r;for(let t=0;t<r;t++)e.setBulk(32*t,n[i+t]);return e}setRow(t,e){d.arraycopy(e.getBitArray(),0,this.bits,t*this.rowSize,this.rowSize)}rotate180(){const t=this.getWidth(),e=this.getHeight();let r=new p(t),n=new p(t);for(let t=0,i=Math.floor((e+1)/2);t<i;t++)r=this.getRow(t,r),n=this.getRow(e-1-t,n),r.reverse(),n.reverse(),this.setRow(t,n),this.setRow(e-1-t,r)}getEnclosingRectangle(){const t=this.width,e=this.height,r=this.rowSize,n=this.bits;let i=t,o=e,s=-1,a=-1;for(let t=0;t<e;t++)for(let e=0;e<r;e++){const c=n[t*r+e];if(0!==c){if(t<o&&(o=t),t>a&&(a=t),32*e<i){let t=0;for(;0==(c<<31-t&4294967295);)t++;32*e+t<i&&(i=32*e+t)}if(32*e+31>s){let t=31;for(;c>>>t==0;)t--;32*e+t>s&&(s=32*e+t)}}}return s<i||a<o?null:Int32Array.from([i,o,s-i+1,a-o+1])}getTopLeftOnBit(){const t=this.rowSize,e=this.bits;let r=0;for(;r<e.length&&0===e[r];)r++;if(r===e.length)return null;const n=r/t;let i=r%t*32;const o=e[r];let s=0;for(;0==(o<<31-s&4294967295);)s++;return i+=s,Int32Array.from([i,n])}getBottomRightOnBit(){const t=this.rowSize,e=this.bits;let r=e.length-1;for(;r>=0&&0===e[r];)r--;if(r<0)return null;const n=Math.floor(r/t);let i=32*Math.floor(r%t);const o=e[r];let s=31;for(;o>>>s==0;)s--;return i+=s,Int32Array.from([i,n])}getWidth(){return this.width}getHeight(){return this.height}getRowSize(){return this.rowSize}equals(t){if(!(t instanceof N))return!1;const e=t;return this.width===e.width&&this.height===e.height&&this.rowSize===e.rowSize&&w.equals(this.bits,e.bits)}hashCode(){let t=this.width;return t=31*t+this.width,t=31*t+this.height,t=31*t+this.rowSize,t=31*t+w.hashCode(this.bits),t}toString(t="X ",e="  ",r="\n"){return this.buildToString(t,e,r)}buildToString(t,e,r){let n=new y;for(let i=0,o=this.height;i<o;i++){for(let r=0,o=this.width;r<o;r++)n.append(this.get(r,i)?t:e);n.append(r)}return n.toString()}clone(){return new N(this.width,this.height,this.rowSize,this.bits.slice())}}class D extends s{static getNotFoundInstance(){return new D}}D.kind="NotFoundException";class M extends u{constructor(t){super(t),this.luminances=M.EMPTY,this.buckets=new Int32Array(M.LUMINANCE_BUCKETS)}getBlackRow(t,e){const r=this.getLuminanceSource(),n=r.getWidth();null==e||e.getSize()<n?e=new p(n):e.clear(),this.initArrays(n);const i=r.getRow(t,this.luminances),o=this.buckets;for(let t=0;t<n;t++)o[(255&i[t])>>M.LUMINANCE_SHIFT]++;const s=M.estimateBlackPoint(o);if(n<3)for(let t=0;t<n;t++)(255&i[t])<s&&e.set(t);else{let t=255&i[0],r=255&i[1];for(let o=1;o<n-1;o++){const n=255&i[o+1];(4*r-t-n)/2<s&&e.set(o),t=r,r=n}}return e}getBlackMatrix(){const t=this.getLuminanceSource(),e=t.getWidth(),r=t.getHeight(),n=new N(e,r);this.initArrays(e);const i=this.buckets;for(let n=1;n<5;n++){const o=Math.floor(r*n/5),s=t.getRow(o,this.luminances),a=Math.floor(4*e/5);for(let t=Math.floor(e/5);t<a;t++)i[(255&s[t])>>M.LUMINANCE_SHIFT]++}const o=M.estimateBlackPoint(i),s=t.getMatrix();for(let t=0;t<r;t++){const r=t*e;for(let i=0;i<e;i++)(255&s[r+i])<o&&n.set(i,t)}return n}createBinarizer(t){return new M(t)}initArrays(t){this.luminances.length<t&&(this.luminances=new Uint8ClampedArray(t));const e=this.buckets;for(let t=0;t<M.LUMINANCE_BUCKETS;t++)e[t]=0}static estimateBlackPoint(t){const e=t.length;let r=0,n=0,i=0;for(let o=0;o<e;o++)t[o]>i&&(n=o,i=t[o]),t[o]>r&&(r=t[o]);let o=0,s=0;for(let r=0;r<e;r++){const e=r-n,i=t[r]*e*e;i>s&&(o=r,s=i)}if(n>o){const t=n;n=o,o=t}if(o-n<=e/16)throw new D;let a=o-1,c=-1;for(let e=o-1;e>n;e--){const i=e-n,s=i*i*(o-e)*(r-t[e]);s>c&&(a=e,c=s)}return a<<M.LUMINANCE_SHIFT}}M.LUMINANCE_BITS=5,M.LUMINANCE_SHIFT=8-M.LUMINANCE_BITS,M.LUMINANCE_BUCKETS=1<<M.LUMINANCE_BITS,M.EMPTY=Uint8ClampedArray.from([0]);class R extends M{constructor(t){super(t),this.matrix=null}getBlackMatrix(){if(null!==this.matrix)return this.matrix;const t=this.getLuminanceSource(),e=t.getWidth(),r=t.getHeight();if(e>=R.MINIMUM_DIMENSION&&r>=R.MINIMUM_DIMENSION){const n=t.getMatrix();let i=e>>R.BLOCK_SIZE_POWER;0!=(e&R.BLOCK_SIZE_MASK)&&i++;let o=r>>R.BLOCK_SIZE_POWER;0!=(r&R.BLOCK_SIZE_MASK)&&o++;const s=R.calculateBlackPoints(n,i,o,e,r),a=new N(e,r);R.calculateThresholdForBlock(n,i,o,e,r,s,a),this.matrix=a}else this.matrix=super.getBlackMatrix();return this.matrix}createBinarizer(t){return new R(t)}static calculateThresholdForBlock(t,e,r,n,i,o,s){const a=i-R.BLOCK_SIZE,c=n-R.BLOCK_SIZE;for(let i=0;i<r;i++){let l=i<<R.BLOCK_SIZE_POWER;l>a&&(l=a);const h=R.cap(i,2,r-3);for(let r=0;r<e;r++){let i=r<<R.BLOCK_SIZE_POWER;i>c&&(i=c);const a=R.cap(r,2,e-3);let u=0;for(let t=-2;t<=2;t++){const e=o[h+t];u+=e[a-2]+e[a-1]+e[a]+e[a+1]+e[a+2]}const d=u/25;R.thresholdBlock(t,i,l,d,n,s)}}}static cap(t,e,r){return t<e?e:t>r?r:t}static thresholdBlock(t,e,r,n,i,o){for(let s=0,a=r*i+e;s<R.BLOCK_SIZE;s++,a+=i)for(let i=0;i<R.BLOCK_SIZE;i++)(255&t[a+i])<=n&&o.set(e+i,r+s)}static calculateBlackPoints(t,e,r,n,i){const o=i-R.BLOCK_SIZE,s=n-R.BLOCK_SIZE,a=new Array(r);for(let i=0;i<r;i++){a[i]=new Int32Array(e);let r=i<<R.BLOCK_SIZE_POWER;r>o&&(r=o);for(let o=0;o<e;o++){let e=o<<R.BLOCK_SIZE_POWER;e>s&&(e=s);let c=0,l=255,h=0;for(let i=0,o=r*n+e;i<R.BLOCK_SIZE;i++,o+=n){for(let e=0;e<R.BLOCK_SIZE;e++){const r=255&t[o+e];c+=r,r<l&&(l=r),r>h&&(h=r)}if(h-l>R.MIN_DYNAMIC_RANGE)for(i++,o+=n;i<R.BLOCK_SIZE;i++,o+=n)for(let e=0;e<R.BLOCK_SIZE;e++)c+=255&t[o+e]}let u=c>>2*R.BLOCK_SIZE_POWER;if(h-l<=R.MIN_DYNAMIC_RANGE&&(u=l/2,i>0&&o>0)){const t=(a[i-1][o]+2*a[i][o-1]+a[i-1][o-1])/4;l<t&&(u=t)}a[i][o]=u}}return a}}R.BLOCK_SIZE_POWER=3,R.BLOCK_SIZE=1<<R.BLOCK_SIZE_POWER,R.BLOCK_SIZE_MASK=R.BLOCK_SIZE-1,R.MINIMUM_DIMENSION=5*R.BLOCK_SIZE,R.MIN_DYNAMIC_RANGE=24;class O{constructor(t,e){this.width=t,this.height=e}getWidth(){return this.width}getHeight(){return this.height}isCropSupported(){return!1}crop(t,e,r,n){throw new S("This luminance source does not support cropping.")}isRotateSupported(){return!1}rotateCounterClockwise(){throw new S("This luminance source does not support rotation by 90 degrees.")}rotateCounterClockwise45(){throw new S("This luminance source does not support rotation by 45 degrees.")}toString(){const t=new Uint8ClampedArray(this.width);let e=new y;for(let r=0;r<this.height;r++){const n=this.getRow(r,t);for(let t=0;t<this.width;t++){const r=255&n[t];let i;i=r<64?"#":r<128?"+":r<192?".":" ",e.append(i)}e.append("\n")}return e.toString()}}class b extends O{constructor(t){super(t.getWidth(),t.getHeight()),this.delegate=t}getRow(t,e){const r=this.delegate.getRow(t,e),n=this.getWidth();for(let t=0;t<n;t++)r[t]=255-(255&r[t]);return r}getMatrix(){const t=this.delegate.getMatrix(),e=this.getWidth()*this.getHeight(),r=new Uint8ClampedArray(e);for(let n=0;n<e;n++)r[n]=255-(255&t[n]);return r}isCropSupported(){return this.delegate.isCropSupported()}crop(t,e,r,n){return new b(this.delegate.crop(t,e,r,n))}isRotateSupported(){return this.delegate.isRotateSupported()}invert(){return this.delegate}rotateCounterClockwise(){return new b(this.delegate.rotateCounterClockwise())}rotateCounterClockwise45(){return new b(this.delegate.rotateCounterClockwise45())}}class B extends O{constructor(t){super(t.width,t.height),this.canvas=t,this.tempCanvasElement=null,this.buffer=B.makeBufferFromCanvasImageData(t)}static makeBufferFromCanvasImageData(t){const e=t.getContext("2d").getImageData(0,0,t.width,t.height);return B.toGrayscaleBuffer(e.data,t.width,t.height)}static toGrayscaleBuffer(t,e,r){const n=new Uint8ClampedArray(e*r);for(let e=0,r=0,i=t.length;e<i;e+=4,r++){let i;i=0===t[e+3]?255:306*t[e]+601*t[e+1]+117*t[e+2]+512>>10,n[r]=i}return n}getRow(t,e){if(t<0||t>=this.getHeight())throw new c("Requested row is outside the image: "+t);const r=this.getWidth(),n=t*r;return null===e?e=this.buffer.slice(n,n+r):(e.length<r&&(e=new Uint8ClampedArray(r)),e.set(this.buffer.slice(n,n+r))),e}getMatrix(){return this.buffer}isCropSupported(){return!0}crop(t,e,r,n){return super.crop(t,e,r,n),this}isRotateSupported(){return!0}rotateCounterClockwise(){return this.rotate(-90),this}rotateCounterClockwise45(){return this.rotate(-45),this}getTempCanvasElement(){if(null===this.tempCanvasElement){const t=this.canvas.ownerDocument.createElement("canvas");t.width=this.canvas.width,t.height=this.canvas.height,this.tempCanvasElement=t}return this.tempCanvasElement}rotate(t){const e=this.getTempCanvasElement(),r=e.getContext("2d"),n=t*B.DEGREE_TO_RADIANS,i=this.canvas.width,o=this.canvas.height,s=Math.ceil(Math.abs(Math.cos(n))*i+Math.abs(Math.sin(n))*o),a=Math.ceil(Math.abs(Math.sin(n))*i+Math.abs(Math.cos(n))*o);return e.width=s,e.height=a,r.translate(s/2,a/2),r.rotate(n),r.drawImage(this.canvas,i/-2,o/-2),this.buffer=B.makeBufferFromCanvasImageData(e),this}invert(){return new b(this)}}B.DEGREE_TO_RADIANS=Math.PI/180;class L{constructor(t,e,r){this.deviceId=t,this.label=e,this.kind="videoinput",this.groupId=r||void 0}toJSON(){return{kind:this.kind,groupId:this.groupId,deviceId:this.deviceId,label:this.label}}}var P,v=(globalThis||r.g||self||window?(globalThis||r.g||self||window||void 0).__awaiter:void 0)||function(t,e,r,n){return new(r||(r=Promise))((function(i,o){function s(t){try{c(n.next(t))}catch(t){o(t)}}function a(t){try{c(n.throw(t))}catch(t){o(t)}}function c(t){var e;t.done?i(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(s,a)}c((n=n.apply(t,e||[])).next())}))};class F{constructor(t,e=500,r){this.reader=t,this.timeBetweenScansMillis=e,this._hints=r,this._stopContinuousDecode=!1,this._stopAsyncDecode=!1,this._timeBetweenDecodingAttempts=0}get hasNavigator(){return"undefined"!=typeof navigator}get isMediaDevicesSuported(){return this.hasNavigator&&!!navigator.mediaDevices}get canEnumerateDevices(){return!(!this.isMediaDevicesSuported||!navigator.mediaDevices.enumerateDevices)}get timeBetweenDecodingAttempts(){return this._timeBetweenDecodingAttempts}set timeBetweenDecodingAttempts(t){this._timeBetweenDecodingAttempts=t<0?0:t}set hints(t){this._hints=t||null}get hints(){return this._hints}listVideoInputDevices(){return v(this,void 0,void 0,(function*(){if(!this.hasNavigator)throw new Error("Can't enumerate devices, navigator is not present.");if(!this.canEnumerateDevices)throw new Error("Can't enumerate devices, method not supported.");const t=yield navigator.mediaDevices.enumerateDevices(),e=[];for(const r of t){const t="video"===r.kind?"videoinput":r.kind;if("videoinput"!==t)continue;const n={deviceId:r.deviceId||r.id,label:r.label||`Video device ${e.length+1}`,kind:t,groupId:r.groupId};e.push(n)}return e}))}getVideoInputDevices(){return v(this,void 0,void 0,(function*(){return(yield this.listVideoInputDevices()).map((t=>new L(t.deviceId,t.label)))}))}findDeviceById(t){return v(this,void 0,void 0,(function*(){const e=yield this.listVideoInputDevices();return e?e.find((e=>e.deviceId===t)):null}))}decodeFromInputVideoDevice(t,e){return v(this,void 0,void 0,(function*(){return yield this.decodeOnceFromVideoDevice(t,e)}))}decodeOnceFromVideoDevice(t,e){return v(this,void 0,void 0,(function*(){let r;this.reset(),r=t?{deviceId:{exact:t}}:{facingMode:"environment"};const n={video:r};return yield this.decodeOnceFromConstraints(n,e)}))}decodeOnceFromConstraints(t,e){return v(this,void 0,void 0,(function*(){const r=yield navigator.mediaDevices.getUserMedia(t);return yield this.decodeOnceFromStream(r,e)}))}decodeOnceFromStream(t,e){return v(this,void 0,void 0,(function*(){this.reset();const r=yield this.attachStreamToVideo(t,e);return yield this.decodeOnce(r)}))}decodeFromInputVideoDeviceContinuously(t,e,r){return v(this,void 0,void 0,(function*(){return yield this.decodeFromVideoDevice(t,e,r)}))}decodeFromVideoDevice(t,e,r){return v(this,void 0,void 0,(function*(){let n;n=t?{deviceId:{exact:t}}:{facingMode:"environment"};const i={video:n};return yield this.decodeFromConstraints(i,e,r)}))}decodeFromConstraints(t,e,r){return v(this,void 0,void 0,(function*(){const n=yield navigator.mediaDevices.getUserMedia(t);return yield this.decodeFromStream(n,e,r)}))}decodeFromStream(t,e,r){return v(this,void 0,void 0,(function*(){this.reset();const n=yield this.attachStreamToVideo(t,e);return yield this.decodeContinuously(n,r)}))}stopAsyncDecode(){this._stopAsyncDecode=!0}stopContinuousDecode(){this._stopContinuousDecode=!0}attachStreamToVideo(t,e){return v(this,void 0,void 0,(function*(){const r=this.prepareVideoElement(e);return this.addVideoSource(r,t),this.videoElement=r,this.stream=t,yield this.playVideoOnLoadAsync(r),r}))}playVideoOnLoadAsync(t){return new Promise(((e,r)=>this.playVideoOnLoad(t,(()=>e()))))}playVideoOnLoad(t,e){this.videoEndedListener=()=>this.stopStreams(),this.videoCanPlayListener=()=>this.tryPlayVideo(t),t.addEventListener("ended",this.videoEndedListener),t.addEventListener("canplay",this.videoCanPlayListener),t.addEventListener("playing",e),this.tryPlayVideo(t)}isVideoPlaying(t){return t.currentTime>0&&!t.paused&&!t.ended&&t.readyState>2}tryPlayVideo(t){return v(this,void 0,void 0,(function*(){if(this.isVideoPlaying(t))console.warn("Trying to play video that is already playing.");else try{yield t.play()}catch(t){console.warn("It was not possible to play the video.")}}))}getMediaElement(t,e){const r=document.getElementById(t);if(!r)throw new a(`element with id '${t}' not found`);if(r.nodeName.toLowerCase()!==e.toLowerCase())throw new a(`element with id '${t}' must be an ${e} element`);return r}decodeFromImage(t,e){if(!t&&!e)throw new a("either imageElement with a src set or an url must be provided");return e&&!t?this.decodeFromImageUrl(e):this.decodeFromImageElement(t)}decodeFromVideo(t,e){if(!t&&!e)throw new a("Either an element with a src set or an URL must be provided");return e&&!t?this.decodeFromVideoUrl(e):this.decodeFromVideoElement(t)}decodeFromVideoContinuously(t,e,r){if(void 0===t&&void 0===e)throw new a("Either an element with a src set or an URL must be provided");return e&&!t?this.decodeFromVideoUrlContinuously(e,r):this.decodeFromVideoElementContinuously(t,r)}decodeFromImageElement(t){if(!t)throw new a("An image element must be provided.");this.reset();const e=this.prepareImageElement(t);let r;return this.imageElement=e,r=this.isImageLoaded(e)?this.decodeOnce(e,!1,!0):this._decodeOnLoadImage(e),r}decodeFromVideoElement(t){const e=this._decodeFromVideoElementSetup(t);return this._decodeOnLoadVideo(e)}decodeFromVideoElementContinuously(t,e){const r=this._decodeFromVideoElementSetup(t);return this._decodeOnLoadVideoContinuously(r,e)}_decodeFromVideoElementSetup(t){if(!t)throw new a("A video element must be provided.");this.reset();const e=this.prepareVideoElement(t);return this.videoElement=e,e}decodeFromImageUrl(t){if(!t)throw new a("An URL must be provided.");this.reset();const e=this.prepareImageElement();this.imageElement=e;const r=this._decodeOnLoadImage(e);return e.src=t,r}decodeFromVideoUrl(t){if(!t)throw new a("An URL must be provided.");this.reset();const e=this.prepareVideoElement(),r=this.decodeFromVideoElement(e);return e.src=t,r}decodeFromVideoUrlContinuously(t,e){if(!t)throw new a("An URL must be provided.");this.reset();const r=this.prepareVideoElement(),n=this.decodeFromVideoElementContinuously(r,e);return r.src=t,n}_decodeOnLoadImage(t){return new Promise(((e,r)=>{this.imageLoadedListener=()=>this.decodeOnce(t,!1,!0).then(e,r),t.addEventListener("load",this.imageLoadedListener)}))}_decodeOnLoadVideo(t){return v(this,void 0,void 0,(function*(){return yield this.playVideoOnLoadAsync(t),yield this.decodeOnce(t)}))}_decodeOnLoadVideoContinuously(t,e){return v(this,void 0,void 0,(function*(){yield this.playVideoOnLoadAsync(t),this.decodeContinuously(t,e)}))}isImageLoaded(t){return!!t.complete&&0!==t.naturalWidth}prepareImageElement(t){let e;return void 0===t&&(e=document.createElement("img"),e.width=200,e.height=200),"string"==typeof t&&(e=this.getMediaElement(t,"img")),t instanceof HTMLImageElement&&(e=t),e}prepareVideoElement(t){let e;return t||"undefined"==typeof document||(e=document.createElement("video"),e.width=200,e.height=200),"string"==typeof t&&(e=this.getMediaElement(t,"video")),t instanceof HTMLVideoElement&&(e=t),e.setAttribute("autoplay","true"),e.setAttribute("muted","true"),e.setAttribute("playsinline","true"),e}decodeOnce(t,e=!0,r=!0){this._stopAsyncDecode=!1;const n=(i,o)=>{if(this._stopAsyncDecode)return o(new D("Video stream has ended before any code could be detected.")),void(this._stopAsyncDecode=void 0);try{i(this.decode(t))}catch(t){if(e&&t instanceof D||(t instanceof h||t instanceof E)&&r)return setTimeout(n,this._timeBetweenDecodingAttempts,i,o);o(t)}};return new Promise(((t,e)=>n(t,e)))}decodeContinuously(t,e){this._stopContinuousDecode=!1;const r=()=>{if(this._stopContinuousDecode)this._stopContinuousDecode=void 0;else try{const n=this.decode(t);e(n,null),setTimeout(r,this.timeBetweenScansMillis)}catch(t){e(null,t),(t instanceof h||t instanceof E||t instanceof D)&&setTimeout(r,this._timeBetweenDecodingAttempts)}};r()}decode(t){const e=this.createBinaryBitmap(t);return this.decodeBitmap(e)}_isHTMLVideoElement(t){return 0!==t.videoWidth}drawFrameOnCanvas(t,e,r){e||(e={sx:0,sy:0,sWidth:t.videoWidth,sHeight:t.videoHeight,dx:0,dy:0,dWidth:t.videoWidth,dHeight:t.videoHeight}),r||(r=this.captureCanvasContext),r.drawImage(t,e.sx,e.sy,e.sWidth,e.sHeight,e.dx,e.dy,e.dWidth,e.dHeight)}drawImageOnCanvas(t,e,r=this.captureCanvasContext){e||(e={sx:0,sy:0,sWidth:t.naturalWidth,sHeight:t.naturalHeight,dx:0,dy:0,dWidth:t.naturalWidth,dHeight:t.naturalHeight}),r||(r=this.captureCanvasContext),r.drawImage(t,e.sx,e.sy,e.sWidth,e.sHeight,e.dx,e.dy,e.dWidth,e.dHeight)}createBinaryBitmap(t){this.getCaptureCanvasContext(t),this._isHTMLVideoElement(t)?this.drawFrameOnCanvas(t):this.drawImageOnCanvas(t);const e=this.getCaptureCanvas(t),r=new B(e),n=new R(r);return new l(n)}getCaptureCanvasContext(t){if(!this.captureCanvasContext){const e=this.getCaptureCanvas(t).getContext("2d");this.captureCanvasContext=e}return this.captureCanvasContext}getCaptureCanvas(t){if(!this.captureCanvas){const e=this.createCaptureCanvas(t);this.captureCanvas=e}return this.captureCanvas}decodeBitmap(t){return this.reader.decode(t,this._hints)}createCaptureCanvas(t){if("undefined"==typeof document)return this._destroyCaptureCanvas(),null;const e=document.createElement("canvas");let r,n;return void 0!==t&&(t instanceof HTMLVideoElement?(r=t.videoWidth,n=t.videoHeight):t instanceof HTMLImageElement&&(r=t.naturalWidth||t.width,n=t.naturalHeight||t.height)),e.style.width=r+"px",e.style.height=n+"px",e.width=r,e.height=n,e}stopStreams(){this.stream&&(this.stream.getVideoTracks().forEach((t=>t.stop())),this.stream=void 0),!1===this._stopAsyncDecode&&this.stopAsyncDecode(),!1===this._stopContinuousDecode&&this.stopContinuousDecode()}reset(){this.stopStreams(),this._destroyVideoElement(),this._destroyImageElement(),this._destroyCaptureCanvas()}_destroyVideoElement(){this.videoElement&&(void 0!==this.videoEndedListener&&this.videoElement.removeEventListener("ended",this.videoEndedListener),void 0!==this.videoPlayingEventListener&&this.videoElement.removeEventListener("playing",this.videoPlayingEventListener),void 0!==this.videoCanPlayListener&&this.videoElement.removeEventListener("loadedmetadata",this.videoCanPlayListener),this.cleanVideoSource(this.videoElement),this.videoElement=void 0)}_destroyImageElement(){this.imageElement&&(void 0!==this.imageLoadedListener&&this.imageElement.removeEventListener("load",this.imageLoadedListener),this.imageElement.src=void 0,this.imageElement.removeAttribute("src"),this.imageElement=void 0)}_destroyCaptureCanvas(){this.captureCanvasContext=void 0,this.captureCanvas=void 0}addVideoSource(t,e){try{t.srcObject=e}catch(r){t.src=URL.createObjectURL(e)}}cleanVideoSource(t){try{t.srcObject=null}catch(e){t.src=""}this.videoElement.removeAttribute("src")}}class x{constructor(t,e,r=(null==e?0:8*e.length),n,i,o=d.currentTimeMillis()){this.text=t,this.rawBytes=e,this.numBits=r,this.resultPoints=n,this.format=i,this.timestamp=o,this.text=t,this.rawBytes=e,this.numBits=null==r?null==e?0:8*e.length:r,this.resultPoints=n,this.format=i,this.resultMetadata=null,this.timestamp=null==o?d.currentTimeMillis():o}getText(){return this.text}getRawBytes(){return this.rawBytes}getNumBits(){return this.numBits}getResultPoints(){return this.resultPoints}getBarcodeFormat(){return this.format}getResultMetadata(){return this.resultMetadata}putMetadata(t,e){null===this.resultMetadata&&(this.resultMetadata=new Map),this.resultMetadata.set(t,e)}putAllMetadata(t){null!==t&&(null===this.resultMetadata?this.resultMetadata=t:this.resultMetadata=new Map(t))}addResultPoints(t){const e=this.resultPoints;if(null===e)this.resultPoints=t;else if(null!==t&&t.length>0){const r=new Array(e.length+t.length);d.arraycopy(e,0,r,0,e.length),d.arraycopy(t,0,r,e.length,t.length),this.resultPoints=r}}getTimestamp(){return this.timestamp}toString(){return this.text}}!function(t){t[t.AZTEC=0]="AZTEC",t[t.CODABAR=1]="CODABAR",t[t.CODE_39=2]="CODE_39",t[t.CODE_93=3]="CODE_93",t[t.CODE_128=4]="CODE_128",t[t.DATA_MATRIX=5]="DATA_MATRIX",t[t.EAN_8=6]="EAN_8",t[t.EAN_13=7]="EAN_13",t[t.ITF=8]="ITF",t[t.MAXICODE=9]="MAXICODE",t[t.PDF_417=10]="PDF_417",t[t.QR_CODE=11]="QR_CODE",t[t.RSS_14=12]="RSS_14",t[t.RSS_EXPANDED=13]="RSS_EXPANDED",t[t.UPC_A=14]="UPC_A",t[t.UPC_E=15]="UPC_E",t[t.UPC_EAN_EXTENSION=16]="UPC_EAN_EXTENSION"}(P||(P={}));var k,U=P;!function(t){t[t.OTHER=0]="OTHER",t[t.ORIENTATION=1]="ORIENTATION",t[t.BYTE_SEGMENTS=2]="BYTE_SEGMENTS",t[t.ERROR_CORRECTION_LEVEL=3]="ERROR_CORRECTION_LEVEL",t[t.ISSUE_NUMBER=4]="ISSUE_NUMBER",t[t.SUGGESTED_PRICE=5]="SUGGESTED_PRICE",t[t.POSSIBLE_COUNTRY=6]="POSSIBLE_COUNTRY",t[t.UPC_EAN_EXTENSION=7]="UPC_EAN_EXTENSION",t[t.PDF417_EXTRA_METADATA=8]="PDF417_EXTRA_METADATA",t[t.STRUCTURED_APPEND_SEQUENCE=9]="STRUCTURED_APPEND_SEQUENCE",t[t.STRUCTURED_APPEND_PARITY=10]="STRUCTURED_APPEND_PARITY"}(k||(k={}));var H,V,z,G,Y,X,W=k;class j{constructor(t,e,r,n,i=-1,o=-1){this.rawBytes=t,this.text=e,this.byteSegments=r,this.ecLevel=n,this.structuredAppendSequenceNumber=i,this.structuredAppendParity=o,this.numBits=null==t?0:8*t.length}getRawBytes(){return this.rawBytes}getNumBits(){return this.numBits}setNumBits(t){this.numBits=t}getText(){return this.text}getByteSegments(){return this.byteSegments}getECLevel(){return this.ecLevel}getErrorsCorrected(){return this.errorsCorrected}setErrorsCorrected(t){this.errorsCorrected=t}getErasures(){return this.erasures}setErasures(t){this.erasures=t}getOther(){return this.other}setOther(t){this.other=t}hasStructuredAppend(){return this.structuredAppendParity>=0&&this.structuredAppendSequenceNumber>=0}getStructuredAppendParity(){return this.structuredAppendParity}getStructuredAppendSequenceNumber(){return this.structuredAppendSequenceNumber}}class Z{exp(t){return this.expTable[t]}log(t){if(0===t)throw new c;return this.logTable[t]}static addOrSubtract(t,e){return t^e}}class Q{constructor(t,e){if(0===e.length)throw new c;this.field=t;const r=e.length;if(r>1&&0===e[0]){let t=1;for(;t<r&&0===e[t];)t++;t===r?this.coefficients=Int32Array.from([0]):(this.coefficients=new Int32Array(r-t),d.arraycopy(e,t,this.coefficients,0,this.coefficients.length))}else this.coefficients=e}getCoefficients(){return this.coefficients}getDegree(){return this.coefficients.length-1}isZero(){return 0===this.coefficients[0]}getCoefficient(t){return this.coefficients[this.coefficients.length-1-t]}evaluateAt(t){if(0===t)return this.getCoefficient(0);const e=this.coefficients;let r;if(1===t){r=0;for(let t=0,n=e.length;t!==n;t++){const n=e[t];r=Z.addOrSubtract(r,n)}return r}r=e[0];const n=e.length,i=this.field;for(let o=1;o<n;o++)r=Z.addOrSubtract(i.multiply(t,r),e[o]);return r}addOrSubtract(t){if(!this.field.equals(t.field))throw new c("GenericGFPolys do not have same GenericGF field");if(this.isZero())return t;if(t.isZero())return this;let e=this.coefficients,r=t.coefficients;if(e.length>r.length){const t=e;e=r,r=t}let n=new Int32Array(r.length);const i=r.length-e.length;d.arraycopy(r,0,n,0,i);for(let t=i;t<r.length;t++)n[t]=Z.addOrSubtract(e[t-i],r[t]);return new Q(this.field,n)}multiply(t){if(!this.field.equals(t.field))throw new c("GenericGFPolys do not have same GenericGF field");if(this.isZero()||t.isZero())return this.field.getZero();const e=this.coefficients,r=e.length,n=t.coefficients,i=n.length,o=new Int32Array(r+i-1),s=this.field;for(let t=0;t<r;t++){const r=e[t];for(let e=0;e<i;e++)o[t+e]=Z.addOrSubtract(o[t+e],s.multiply(r,n[e]))}return new Q(s,o)}multiplyScalar(t){if(0===t)return this.field.getZero();if(1===t)return this;const e=this.coefficients.length,r=this.field,n=new Int32Array(e),i=this.coefficients;for(let o=0;o<e;o++)n[o]=r.multiply(i[o],t);return new Q(r,n)}multiplyByMonomial(t,e){if(t<0)throw new c;if(0===e)return this.field.getZero();const r=this.coefficients,n=r.length,i=new Int32Array(n+t),o=this.field;for(let t=0;t<n;t++)i[t]=o.multiply(r[t],e);return new Q(o,i)}divide(t){if(!this.field.equals(t.field))throw new c("GenericGFPolys do not have same GenericGF field");if(t.isZero())throw new c("Divide by 0");const e=this.field;let r=e.getZero(),n=this;const i=t.getCoefficient(t.getDegree()),o=e.inverse(i);for(;n.getDegree()>=t.getDegree()&&!n.isZero();){const i=n.getDegree()-t.getDegree(),s=e.multiply(n.getCoefficient(n.getDegree()),o),a=t.multiplyByMonomial(i,s),c=e.buildMonomial(i,s);r=r.addOrSubtract(c),n=n.addOrSubtract(a)}return[r,n]}toString(){let t="";for(let e=this.getDegree();e>=0;e--){let r=this.getCoefficient(e);if(0!==r){if(r<0?(t+=" - ",r=-r):t.length>0&&(t+=" + "),0===e||1!==r){const e=this.field.log(r);0===e?t+="1":1===e?t+="a":(t+="a^",t+=e)}0!==e&&(1===e?t+="x":(t+="x^",t+=e))}}return t}}class K extends s{}K.kind="ArithmeticException";class q extends Z{constructor(t,e,r){super(),this.primitive=t,this.size=e,this.generatorBase=r;const n=new Int32Array(e);let i=1;for(let r=0;r<e;r++)n[r]=i,i*=2,i>=e&&(i^=t,i&=e-1);this.expTable=n;const o=new Int32Array(e);for(let t=0;t<e-1;t++)o[n[t]]=t;this.logTable=o,this.zero=new Q(this,Int32Array.from([0])),this.one=new Q(this,Int32Array.from([1]))}getZero(){return this.zero}getOne(){return this.one}buildMonomial(t,e){if(t<0)throw new c;if(0===e)return this.zero;const r=new Int32Array(t+1);return r[0]=e,new Q(this,r)}inverse(t){if(0===t)throw new K;return this.expTable[this.size-this.logTable[t]-1]}multiply(t,e){return 0===t||0===e?0:this.expTable[(this.logTable[t]+this.logTable[e])%(this.size-1)]}getSize(){return this.size}getGeneratorBase(){return this.generatorBase}toString(){return"GF(0x"+m.toHexString(this.primitive)+","+this.size+")"}equals(t){return t===this}}q.AZTEC_DATA_12=new q(4201,4096,1),q.AZTEC_DATA_10=new q(1033,1024,1),q.AZTEC_DATA_6=new q(67,64,1),q.AZTEC_PARAM=new q(19,16,1),q.QR_CODE_FIELD_256=new q(285,256,0),q.DATA_MATRIX_FIELD_256=new q(301,256,1),q.AZTEC_DATA_8=q.DATA_MATRIX_FIELD_256,q.MAXICODE_FIELD_64=q.AZTEC_DATA_6;class J extends s{}J.kind="ReedSolomonException";class $ extends s{}$.kind="IllegalStateException";class tt{constructor(t){this.field=t}decode(t,e){const r=this.field,n=new Q(r,t),i=new Int32Array(e);let o=!0;for(let t=0;t<e;t++){const e=n.evaluateAt(r.exp(t+r.getGeneratorBase()));i[i.length-1-t]=e,0!==e&&(o=!1)}if(o)return;const s=new Q(r,i),a=this.runEuclideanAlgorithm(r.buildMonomial(e,1),s,e),c=a[0],l=a[1],h=this.findErrorLocations(c),u=this.findErrorMagnitudes(l,h);for(let e=0;e<h.length;e++){const n=t.length-1-r.log(h[e]);if(n<0)throw new J("Bad error location");t[n]=q.addOrSubtract(t[n],u[e])}}runEuclideanAlgorithm(t,e,r){if(t.getDegree()<e.getDegree()){const r=t;t=e,e=r}const n=this.field;let i=t,o=e,s=n.getZero(),a=n.getOne();for(;o.getDegree()>=(r/2|0);){let t=i,e=s;if(i=o,s=a,i.isZero())throw new J("r_{i-1} was zero");o=t;let r=n.getZero();const c=i.getCoefficient(i.getDegree()),l=n.inverse(c);for(;o.getDegree()>=i.getDegree()&&!o.isZero();){const t=o.getDegree()-i.getDegree(),e=n.multiply(o.getCoefficient(o.getDegree()),l);r=r.addOrSubtract(n.buildMonomial(t,e)),o=o.addOrSubtract(i.multiplyByMonomial(t,e))}if(a=r.multiply(s).addOrSubtract(e),o.getDegree()>=i.getDegree())throw new $("Division algorithm failed to reduce polynomial?")}const c=a.getCoefficient(0);if(0===c)throw new J("sigmaTilde(0) was zero");const l=n.inverse(c);return[a.multiplyScalar(l),o.multiplyScalar(l)]}findErrorLocations(t){const e=t.getDegree();if(1===e)return Int32Array.from([t.getCoefficient(1)]);const r=new Int32Array(e);let n=0;const i=this.field;for(let o=1;o<i.getSize()&&n<e;o++)0===t.evaluateAt(o)&&(r[n]=i.inverse(o),n++);if(n!==e)throw new J("Error locator degree does not match number of roots");return r}findErrorMagnitudes(t,e){const r=e.length,n=new Int32Array(r),i=this.field;for(let o=0;o<r;o++){const s=i.inverse(e[o]);let a=1;for(let t=0;t<r;t++)if(o!==t){const r=i.multiply(e[t],s),n=0==(1&r)?1|r:-2&r;a=i.multiply(a,n)}n[o]=i.multiply(t.evaluateAt(s),i.inverse(a)),0!==i.getGeneratorBase()&&(n[o]=i.multiply(n[o],s))}return n}}!function(t){t[t.UPPER=0]="UPPER",t[t.LOWER=1]="LOWER",t[t.MIXED=2]="MIXED",t[t.DIGIT=3]="DIGIT",t[t.PUNCT=4]="PUNCT",t[t.BINARY=5]="BINARY"}(H||(H={}));class et{decode(t){this.ddata=t;let e=t.getBits(),r=this.extractBits(e),n=this.correctBits(r),i=et.convertBoolArrayToByteArray(n),o=et.getEncodedData(n),s=new j(i,o,null,null);return s.setNumBits(n.length),s}static highLevelDecode(t){return this.getEncodedData(t)}static getEncodedData(t){let e=t.length,r=H.UPPER,n=H.UPPER,i="",o=0;for(;o<e;)if(n===H.BINARY){if(e-o<5)break;let s=et.readCode(t,o,5);if(o+=5,0===s){if(e-o<11)break;s=et.readCode(t,o,11)+31,o+=11}for(let r=0;r<s;r++){if(e-o<8){o=e;break}const r=et.readCode(t,o,8);i+=T.castAsNonUtf8Char(r),o+=8}n=r}else{let s=n===H.DIGIT?4:5;if(e-o<s)break;let a=et.readCode(t,o,s);o+=s;let c=et.getCharacter(n,a);c.startsWith("CTRL_")?(r=n,n=et.getTable(c.charAt(5)),"L"===c.charAt(6)&&(r=n)):(i+=c,n=r)}return i}static getTable(t){switch(t){case"L":return H.LOWER;case"P":return H.PUNCT;case"M":return H.MIXED;case"D":return H.DIGIT;case"B":return H.BINARY;default:return H.UPPER}}static getCharacter(t,e){switch(t){case H.UPPER:return et.UPPER_TABLE[e];case H.LOWER:return et.LOWER_TABLE[e];case H.MIXED:return et.MIXED_TABLE[e];case H.PUNCT:return et.PUNCT_TABLE[e];case H.DIGIT:return et.DIGIT_TABLE[e];default:throw new $("Bad table")}}correctBits(t){let e,r;this.ddata.getNbLayers()<=2?(r=6,e=q.AZTEC_DATA_6):this.ddata.getNbLayers()<=8?(r=8,e=q.AZTEC_DATA_8):this.ddata.getNbLayers()<=22?(r=10,e=q.AZTEC_DATA_10):(r=12,e=q.AZTEC_DATA_12);let n=this.ddata.getNbDatablocks(),i=t.length/r;if(i<n)throw new E;let o=t.length%r,s=new Int32Array(i);for(let e=0;e<i;e++,o+=r)s[e]=et.readCode(t,o,r);try{new tt(e).decode(s,i-n)}catch(t){throw new E(t)}let a=(1<<r)-1,c=0;for(let t=0;t<n;t++){let e=s[t];if(0===e||e===a)throw new E;1!==e&&e!==a-1||c++}let l=new Array(n*r-c),h=0;for(let t=0;t<n;t++){let e=s[t];if(1===e||e===a-1)l.fill(e>1,h,h+r-1),h+=r-1;else for(let t=r-1;t>=0;--t)l[h++]=0!=(e&1<<t)}return l}extractBits(t){let e=this.ddata.isCompact(),r=this.ddata.getNbLayers(),n=(e?11:14)+4*r,i=new Int32Array(n),o=new Array(this.totalBitsInLayer(r,e));if(e)for(let t=0;t<i.length;t++)i[t]=t;else{let t=n+1+2*m.truncDivision(m.truncDivision(n,2)-1,15),e=n/2,r=m.truncDivision(t,2);for(let t=0;t<e;t++){let n=t+m.truncDivision(t,15);i[e-t-1]=r-n-1,i[e+t]=r+n+1}}for(let s=0,a=0;s<r;s++){let c=4*(r-s)+(e?9:12),l=2*s,h=n-1-l;for(let e=0;e<c;e++){let r=2*e;for(let n=0;n<2;n++)o[a+r+n]=t.get(i[l+n],i[l+e]),o[a+2*c+r+n]=t.get(i[l+e],i[h-n]),o[a+4*c+r+n]=t.get(i[h-n],i[h-e]),o[a+6*c+r+n]=t.get(i[h-e],i[l+n])}a+=8*c}return o}static readCode(t,e,r){let n=0;for(let i=e;i<e+r;i++)n<<=1,t[i]&&(n|=1);return n}static readByte(t,e){let r=t.length-e;return r>=8?et.readCode(t,e,8):et.readCode(t,e,r)<<8-r}static convertBoolArrayToByteArray(t){let e=new Uint8Array((t.length+7)/8);for(let r=0;r<e.length;r++)e[r]=et.readByte(t,8*r);return e}totalBitsInLayer(t,e){return((e?88:112)+16*t)*t}}et.UPPER_TABLE=["CTRL_PS"," ","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","CTRL_LL","CTRL_ML","CTRL_DL","CTRL_BS"],et.LOWER_TABLE=["CTRL_PS"," ","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","CTRL_US","CTRL_ML","CTRL_DL","CTRL_BS"],et.MIXED_TABLE=["CTRL_PS"," ","\\1","\\2","\\3","\\4","\\5","\\6","\\7","\b","\t","\n","\\13","\f","\r","\\33","\\34","\\35","\\36","\\37","@","\\","^","_","`","|","~","\\177","CTRL_LL","CTRL_UL","CTRL_PL","CTRL_BS"],et.PUNCT_TABLE=["","\r","\r\n",". ",", ",": ","!",'"',"#","$","%","&","'","(",")","*","+",",","-",".","/",":",";","<","=",">","?","[","]","{","}","CTRL_UL"],et.DIGIT_TABLE=["CTRL_PS"," ","0","1","2","3","4","5","6","7","8","9",",",".","CTRL_UL","CTRL_US"];class rt{constructor(){}static round(t){return NaN===t?0:t<=Number.MIN_SAFE_INTEGER?Number.MIN_SAFE_INTEGER:t>=Number.MAX_SAFE_INTEGER?Number.MAX_SAFE_INTEGER:t+(t<0?-.5:.5)|0}static distance(t,e,r,n){const i=t-r,o=e-n;return Math.sqrt(i*i+o*o)}static sum(t){let e=0;for(let r=0,n=t.length;r!==n;r++)e+=t[r];return e}}class nt{static floatToIntBits(t){return t}}nt.MAX_VALUE=Number.MAX_SAFE_INTEGER;class it{constructor(t,e){this.x=t,this.y=e}getX(){return this.x}getY(){return this.y}equals(t){if(t instanceof it){const e=t;return this.x===e.x&&this.y===e.y}return!1}hashCode(){return 31*nt.floatToIntBits(this.x)+nt.floatToIntBits(this.y)}toString(){return"("+this.x+","+this.y+")"}static orderBestPatterns(t){const e=this.distance(t[0],t[1]),r=this.distance(t[1],t[2]),n=this.distance(t[0],t[2]);let i,o,s;if(r>=e&&r>=n?(o=t[0],i=t[1],s=t[2]):n>=r&&n>=e?(o=t[1],i=t[0],s=t[2]):(o=t[2],i=t[0],s=t[1]),this.crossProductZ(i,o,s)<0){const t=i;i=s,s=t}t[0]=i,t[1]=o,t[2]=s}static distance(t,e){return rt.distance(t.x,t.y,e.x,e.y)}static crossProductZ(t,e,r){const n=e.x,i=e.y;return(r.x-n)*(t.y-i)-(r.y-i)*(t.x-n)}}class ot{constructor(t,e){this.bits=t,this.points=e}getBits(){return this.bits}getPoints(){return this.points}}class st extends ot{constructor(t,e,r,n,i){super(t,e),this.compact=r,this.nbDatablocks=n,this.nbLayers=i}getNbLayers(){return this.nbLayers}getNbDatablocks(){return this.nbDatablocks}isCompact(){return this.compact}}class at{constructor(t,e,r,n){this.image=t,this.height=t.getHeight(),this.width=t.getWidth(),null==e&&(e=at.INIT_SIZE),null==r&&(r=t.getWidth()/2|0),null==n&&(n=t.getHeight()/2|0);const i=e/2|0;if(this.leftInit=r-i,this.rightInit=r+i,this.upInit=n-i,this.downInit=n+i,this.upInit<0||this.leftInit<0||this.downInit>=this.height||this.rightInit>=this.width)throw new D}detect(){let t=this.leftInit,e=this.rightInit,r=this.upInit,n=this.downInit,i=!1,o=!0,s=!1,a=!1,c=!1,l=!1,h=!1;const u=this.width,d=this.height;for(;o;){o=!1;let f=!0;for(;(f||!a)&&e<u;)f=this.containsBlackPoint(r,n,e,!1),f?(e++,o=!0,a=!0):a||e++;if(e>=u){i=!0;break}let g=!0;for(;(g||!c)&&n<d;)g=this.containsBlackPoint(t,e,n,!0),g?(n++,o=!0,c=!0):c||n++;if(n>=d){i=!0;break}let w=!0;for(;(w||!l)&&t>=0;)w=this.containsBlackPoint(r,n,t,!1),w?(t--,o=!0,l=!0):l||t--;if(t<0){i=!0;break}let m=!0;for(;(m||!h)&&r>=0;)m=this.containsBlackPoint(t,e,r,!0),m?(r--,o=!0,h=!0):h||r--;if(r<0){i=!0;break}o&&(s=!0)}if(!i&&s){const i=e-t;let o=null;for(let e=1;null===o&&e<i;e++)o=this.getBlackPointOnSegment(t,n-e,t+e,n);if(null==o)throw new D;let s=null;for(let e=1;null===s&&e<i;e++)s=this.getBlackPointOnSegment(t,r+e,t+e,r);if(null==s)throw new D;let a=null;for(let t=1;null===a&&t<i;t++)a=this.getBlackPointOnSegment(e,r+t,e-t,r);if(null==a)throw new D;let c=null;for(let t=1;null===c&&t<i;t++)c=this.getBlackPointOnSegment(e,n-t,e-t,n);if(null==c)throw new D;return this.centerEdges(c,o,a,s)}throw new D}getBlackPointOnSegment(t,e,r,n){const i=rt.round(rt.distance(t,e,r,n)),o=(r-t)/i,s=(n-e)/i,a=this.image;for(let r=0;r<i;r++){const n=rt.round(t+r*o),i=rt.round(e+r*s);if(a.get(n,i))return new it(n,i)}return null}centerEdges(t,e,r,n){const i=t.getX(),o=t.getY(),s=e.getX(),a=e.getY(),c=r.getX(),l=r.getY(),h=n.getX(),u=n.getY(),d=at.CORR;return i<this.width/2?[new it(h-d,u+d),new it(s+d,a+d),new it(c-d,l-d),new it(i+d,o-d)]:[new it(h+d,u+d),new it(s+d,a-d),new it(c-d,l+d),new it(i-d,o-d)]}containsBlackPoint(t,e,r,n){const i=this.image;if(n){for(let n=t;n<=e;n++)if(i.get(n,r))return!0}else for(let n=t;n<=e;n++)if(i.get(r,n))return!0;return!1}}at.INIT_SIZE=10,at.CORR=1;class ct{static checkAndNudgePoints(t,e){const r=t.getWidth(),n=t.getHeight();let i=!0;for(let t=0;t<e.length&&i;t+=2){const o=Math.floor(e[t]),s=Math.floor(e[t+1]);if(o<-1||o>r||s<-1||s>n)throw new D;i=!1,-1===o?(e[t]=0,i=!0):o===r&&(e[t]=r-1,i=!0),-1===s?(e[t+1]=0,i=!0):s===n&&(e[t+1]=n-1,i=!0)}i=!0;for(let t=e.length-2;t>=0&&i;t-=2){const o=Math.floor(e[t]),s=Math.floor(e[t+1]);if(o<-1||o>r||s<-1||s>n)throw new D;i=!1,-1===o?(e[t]=0,i=!0):o===r&&(e[t]=r-1,i=!0),-1===s?(e[t+1]=0,i=!0):s===n&&(e[t+1]=n-1,i=!0)}}}class lt{constructor(t,e,r,n,i,o,s,a,c){this.a11=t,this.a21=e,this.a31=r,this.a12=n,this.a22=i,this.a32=o,this.a13=s,this.a23=a,this.a33=c}static quadrilateralToQuadrilateral(t,e,r,n,i,o,s,a,c,l,h,u,d,f,g,w){const m=lt.quadrilateralToSquare(t,e,r,n,i,o,s,a);return lt.squareToQuadrilateral(c,l,h,u,d,f,g,w).times(m)}transformPoints(t){const e=t.length,r=this.a11,n=this.a12,i=this.a13,o=this.a21,s=this.a22,a=this.a23,c=this.a31,l=this.a32,h=this.a33;for(let u=0;u<e;u+=2){const e=t[u],d=t[u+1],f=i*e+a*d+h;t[u]=(r*e+o*d+c)/f,t[u+1]=(n*e+s*d+l)/f}}transformPointsWithValues(t,e){const r=this.a11,n=this.a12,i=this.a13,o=this.a21,s=this.a22,a=this.a23,c=this.a31,l=this.a32,h=this.a33,u=t.length;for(let d=0;d<u;d++){const u=t[d],f=e[d],g=i*u+a*f+h;t[d]=(r*u+o*f+c)/g,e[d]=(n*u+s*f+l)/g}}static squareToQuadrilateral(t,e,r,n,i,o,s,a){const c=t-r+i-s,l=e-n+o-a;if(0===c&&0===l)return new lt(r-t,i-r,t,n-e,o-n,e,0,0,1);{const h=r-i,u=s-i,d=n-o,f=a-o,g=h*f-u*d,w=(c*f-u*l)/g,m=(h*l-c*d)/g;return new lt(r-t+w*r,s-t+m*s,t,n-e+w*n,a-e+m*a,e,w,m,1)}}static quadrilateralToSquare(t,e,r,n,i,o,s,a){return lt.squareToQuadrilateral(t,e,r,n,i,o,s,a).buildAdjoint()}buildAdjoint(){return new lt(this.a22*this.a33-this.a23*this.a32,this.a23*this.a31-this.a21*this.a33,this.a21*this.a32-this.a22*this.a31,this.a13*this.a32-this.a12*this.a33,this.a11*this.a33-this.a13*this.a31,this.a12*this.a31-this.a11*this.a32,this.a12*this.a23-this.a13*this.a22,this.a13*this.a21-this.a11*this.a23,this.a11*this.a22-this.a12*this.a21)}times(t){return new lt(this.a11*t.a11+this.a21*t.a12+this.a31*t.a13,this.a11*t.a21+this.a21*t.a22+this.a31*t.a23,this.a11*t.a31+this.a21*t.a32+this.a31*t.a33,this.a12*t.a11+this.a22*t.a12+this.a32*t.a13,this.a12*t.a21+this.a22*t.a22+this.a32*t.a23,this.a12*t.a31+this.a22*t.a32+this.a32*t.a33,this.a13*t.a11+this.a23*t.a12+this.a33*t.a13,this.a13*t.a21+this.a23*t.a22+this.a33*t.a23,this.a13*t.a31+this.a23*t.a32+this.a33*t.a33)}}class ht extends ct{sampleGrid(t,e,r,n,i,o,s,a,c,l,h,u,d,f,g,w,m,p,A){const C=lt.quadrilateralToQuadrilateral(n,i,o,s,a,c,l,h,u,d,f,g,w,m,p,A);return this.sampleGridWithTransform(t,e,r,C)}sampleGridWithTransform(t,e,r,n){if(e<=0||r<=0)throw new D;const i=new N(e,r),o=new Float32Array(2*e);for(let e=0;e<r;e++){const r=o.length,s=e+.5;for(let t=0;t<r;t+=2)o[t]=t/2+.5,o[t+1]=s;n.transformPoints(o),ct.checkAndNudgePoints(t,o);try{for(let n=0;n<r;n+=2)t.get(Math.floor(o[n]),Math.floor(o[n+1]))&&i.set(n/2,e)}catch(t){throw new D}}return i}}class ut{static setGridSampler(t){ut.gridSampler=t}static getInstance(){return ut.gridSampler}}ut.gridSampler=new ht;class dt{constructor(t,e){this.x=t,this.y=e}toResultPoint(){return new it(this.getX(),this.getY())}getX(){return this.x}getY(){return this.y}}class ft{constructor(t){this.EXPECTED_CORNER_BITS=new Int32Array([3808,476,2107,1799]),this.image=t}detect(){return this.detectMirror(!1)}detectMirror(t){let e=this.getMatrixCenter(),r=this.getBullsEyeCorners(e);if(t){let t=r[0];r[0]=r[2],r[2]=t}this.extractParameters(r);let n=this.sampleGrid(this.image,r[this.shift%4],r[(this.shift+1)%4],r[(this.shift+2)%4],r[(this.shift+3)%4]),i=this.getMatrixCornerPoints(r);return new st(n,i,this.compact,this.nbDataBlocks,this.nbLayers)}extractParameters(t){if(!(this.isValidPoint(t[0])&&this.isValidPoint(t[1])&&this.isValidPoint(t[2])&&this.isValidPoint(t[3])))throw new D;let e=2*this.nbCenterLayers,r=new Int32Array([this.sampleLine(t[0],t[1],e),this.sampleLine(t[1],t[2],e),this.sampleLine(t[2],t[3],e),this.sampleLine(t[3],t[0],e)]);this.shift=this.getRotation(r,e);let n=0;for(let t=0;t<4;t++){let e=r[(this.shift+t)%4];this.compact?(n<<=7,n+=e>>1&127):(n<<=10,n+=(e>>2&992)+(e>>1&31))}let i=this.getCorrectedParameterData(n,this.compact);this.compact?(this.nbLayers=1+(i>>6),this.nbDataBlocks=1+(63&i)):(this.nbLayers=1+(i>>11),this.nbDataBlocks=1+(2047&i))}getRotation(t,e){let r=0;t.forEach(((t,n,i)=>{r=(t>>e-2<<1)+(1&t)+(r<<3)})),r=((1&r)<<11)+(r>>1);for(let t=0;t<4;t++)if(m.bitCount(r^this.EXPECTED_CORNER_BITS[t])<=2)return t;throw new D}getCorrectedParameterData(t,e){let r,n;e?(r=7,n=2):(r=10,n=4);let i=r-n,o=new Int32Array(r);for(let e=r-1;e>=0;--e)o[e]=15&t,t>>=4;try{new tt(q.AZTEC_PARAM).decode(o,i)}catch(t){throw new D}let s=0;for(let t=0;t<n;t++)s=(s<<4)+o[t];return s}getBullsEyeCorners(t){let e=t,r=t,n=t,i=t,o=!0;for(this.nbCenterLayers=1;this.nbCenterLayers<9;this.nbCenterLayers++){let t=this.getFirstDifferent(e,o,1,-1),s=this.getFirstDifferent(r,o,1,1),a=this.getFirstDifferent(n,o,-1,1),c=this.getFirstDifferent(i,o,-1,-1);if(this.nbCenterLayers>2){let r=this.distancePoint(c,t)*this.nbCenterLayers/(this.distancePoint(i,e)*(this.nbCenterLayers+2));if(r<.75||r>1.25||!this.isWhiteOrBlackRectangle(t,s,a,c))break}e=t,r=s,n=a,i=c,o=!o}if(5!==this.nbCenterLayers&&7!==this.nbCenterLayers)throw new D;this.compact=5===this.nbCenterLayers;let s=new it(e.getX()+.5,e.getY()-.5),a=new it(r.getX()+.5,r.getY()+.5),c=new it(n.getX()-.5,n.getY()+.5),l=new it(i.getX()-.5,i.getY()-.5);return this.expandSquare([s,a,c,l],2*this.nbCenterLayers-3,2*this.nbCenterLayers)}getMatrixCenter(){let t,e,r,n;try{let i=new at(this.image).detect();t=i[0],e=i[1],r=i[2],n=i[3]}catch(i){let o=this.image.getWidth()/2,s=this.image.getHeight()/2;t=this.getFirstDifferent(new dt(o+7,s-7),!1,1,-1).toResultPoint(),e=this.getFirstDifferent(new dt(o+7,s+7),!1,1,1).toResultPoint(),r=this.getFirstDifferent(new dt(o-7,s+7),!1,-1,1).toResultPoint(),n=this.getFirstDifferent(new dt(o-7,s-7),!1,-1,-1).toResultPoint()}let i=rt.round((t.getX()+n.getX()+e.getX()+r.getX())/4),o=rt.round((t.getY()+n.getY()+e.getY()+r.getY())/4);try{let s=new at(this.image,15,i,o).detect();t=s[0],e=s[1],r=s[2],n=s[3]}catch(s){t=this.getFirstDifferent(new dt(i+7,o-7),!1,1,-1).toResultPoint(),e=this.getFirstDifferent(new dt(i+7,o+7),!1,1,1).toResultPoint(),r=this.getFirstDifferent(new dt(i-7,o+7),!1,-1,1).toResultPoint(),n=this.getFirstDifferent(new dt(i-7,o-7),!1,-1,-1).toResultPoint()}return i=rt.round((t.getX()+n.getX()+e.getX()+r.getX())/4),o=rt.round((t.getY()+n.getY()+e.getY()+r.getY())/4),new dt(i,o)}getMatrixCornerPoints(t){return this.expandSquare(t,2*this.nbCenterLayers,this.getDimension())}sampleGrid(t,e,r,n,i){let o=ut.getInstance(),s=this.getDimension(),a=s/2-this.nbCenterLayers,c=s/2+this.nbCenterLayers;return o.sampleGrid(t,s,s,a,a,c,a,c,c,a,c,e.getX(),e.getY(),r.getX(),r.getY(),n.getX(),n.getY(),i.getX(),i.getY())}sampleLine(t,e,r){let n=0,i=this.distanceResultPoint(t,e),o=i/r,s=t.getX(),a=t.getY(),c=o*(e.getX()-t.getX())/i,l=o*(e.getY()-t.getY())/i;for(let t=0;t<r;t++)this.image.get(rt.round(s+t*c),rt.round(a+t*l))&&(n|=1<<r-t-1);return n}isWhiteOrBlackRectangle(t,e,r,n){t=new dt(t.getX()-3,t.getY()+3),e=new dt(e.getX()-3,e.getY()-3),r=new dt(r.getX()+3,r.getY()-3),n=new dt(n.getX()+3,n.getY()+3);let i=this.getColor(n,t);if(0===i)return!1;let o=this.getColor(t,e);return o===i&&(o=this.getColor(e,r),o===i&&(o=this.getColor(r,n),o===i))}getColor(t,e){let r=this.distancePoint(t,e),n=(e.getX()-t.getX())/r,i=(e.getY()-t.getY())/r,o=0,s=t.getX(),a=t.getY(),c=this.image.get(t.getX(),t.getY()),l=Math.ceil(r);for(let t=0;t<l;t++)s+=n,a+=i,this.image.get(rt.round(s),rt.round(a))!==c&&o++;let h=o/r;return h>.1&&h<.9?0:h<=.1===c?1:-1}getFirstDifferent(t,e,r,n){let i=t.getX()+r,o=t.getY()+n;for(;this.isValid(i,o)&&this.image.get(i,o)===e;)i+=r,o+=n;for(i-=r,o-=n;this.isValid(i,o)&&this.image.get(i,o)===e;)i+=r;for(i-=r;this.isValid(i,o)&&this.image.get(i,o)===e;)o+=n;return o-=n,new dt(i,o)}expandSquare(t,e,r){let n=r/(2*e),i=t[0].getX()-t[2].getX(),o=t[0].getY()-t[2].getY(),s=(t[0].getX()+t[2].getX())/2,a=(t[0].getY()+t[2].getY())/2,c=new it(s+n*i,a+n*o),l=new it(s-n*i,a-n*o);return i=t[1].getX()-t[3].getX(),o=t[1].getY()-t[3].getY(),s=(t[1].getX()+t[3].getX())/2,a=(t[1].getY()+t[3].getY())/2,[c,new it(s+n*i,a+n*o),l,new it(s-n*i,a-n*o)]}isValid(t,e){return t>=0&&t<this.image.getWidth()&&e>0&&e<this.image.getHeight()}isValidPoint(t){let e=rt.round(t.getX()),r=rt.round(t.getY());return this.isValid(e,r)}distancePoint(t,e){return rt.distance(t.getX(),t.getY(),e.getX(),e.getY())}distanceResultPoint(t,e){return rt.distance(t.getX(),t.getY(),e.getX(),e.getY())}getDimension(){return this.compact?4*this.nbLayers+11:this.nbLayers<=4?4*this.nbLayers+15:4*this.nbLayers+2*(m.truncDivision(this.nbLayers-4,8)+1)+15}}class gt{decode(t,e=null){let r=null,n=new ft(t.getBlackMatrix()),i=null,o=null;try{let t=n.detectMirror(!1);i=t.getPoints(),this.reportFoundResultPoints(e,i),o=(new et).decode(t)}catch(t){r=t}if(null==o)try{let t=n.detectMirror(!0);i=t.getPoints(),this.reportFoundResultPoints(e,i),o=(new et).decode(t)}catch(t){if(null!=r)throw r;throw t}let s=new x(o.getText(),o.getRawBytes(),o.getNumBits(),i,U.AZTEC,d.currentTimeMillis()),a=o.getByteSegments();null!=a&&s.putMetadata(W.BYTE_SEGMENTS,a);let c=o.getECLevel();return null!=c&&s.putMetadata(W.ERROR_CORRECTION_LEVEL,c),s}reportFoundResultPoints(t,e){if(null!=t){let r=t.get(C.NEED_RESULT_POINT_CALLBACK);null!=r&&e.forEach(((t,e,n)=>{r.foundPossibleResultPoint(t)}))}}reset(){}}class wt{decode(t,e){try{return this.doDecode(t,e)}catch(r){if(e&&!0===e.get(C.TRY_HARDER)&&t.isRotateSupported()){const r=t.rotateCounterClockwise(),n=this.doDecode(r,e),i=n.getResultMetadata();let o=270;null!==i&&!0===i.get(W.ORIENTATION)&&(o+=i.get(W.ORIENTATION)%360),n.putMetadata(W.ORIENTATION,o);const s=n.getResultPoints();if(null!==s){const t=r.getHeight();for(let e=0;e<s.length;e++)s[e]=new it(t-s[e].getY()-1,s[e].getX())}return n}throw new D}}reset(){}doDecode(t,e){const r=t.getWidth(),n=t.getHeight();let i=new p(r);const o=e&&!0===e.get(C.TRY_HARDER),s=Math.max(1,n>>(o?8:5));let a;a=o?n:15;const c=Math.trunc(n/2);for(let o=0;o<a;o++){const a=Math.trunc((o+1)/2),l=c+s*(0==(1&o)?a:-a);if(l<0||l>=n)break;try{i=t.getBlackRow(l,i)}catch(t){continue}for(let t=0;t<2;t++){if(1===t&&(i.reverse(),e&&!0===e.get(C.NEED_RESULT_POINT_CALLBACK))){const t=new Map;e.forEach(((e,r)=>t.set(r,e))),t.delete(C.NEED_RESULT_POINT_CALLBACK),e=t}try{const n=this.decodeRow(l,i,e);if(1===t){n.putMetadata(W.ORIENTATION,180);const t=n.getResultPoints();null!==t&&(t[0]=new it(r-t[0].getX()-1,t[0].getY()),t[1]=new it(r-t[1].getX()-1,t[1].getY()))}return n}catch(t){}}}throw new D}static recordPattern(t,e,r){const n=r.length;for(let t=0;t<n;t++)r[t]=0;const i=t.getSize();if(e>=i)throw new D;let o=!t.get(e),s=0,a=e;for(;a<i;){if(t.get(a)!==o)r[s]++;else{if(++s===n)break;r[s]=1,o=!o}a++}if(s!==n&&(s!==n-1||a!==i))throw new D}static recordPatternInReverse(t,e,r){let n=r.length,i=t.get(e);for(;e>0&&n>=0;)t.get(--e)!==i&&(n--,i=!i);if(n>=0)throw new D;wt.recordPattern(t,e+1,r)}static patternMatchVariance(t,e,r){const n=t.length;let i=0,o=0;for(let r=0;r<n;r++)i+=t[r],o+=e[r];if(i<o)return Number.POSITIVE_INFINITY;const s=i/o;r*=s;let a=0;for(let i=0;i<n;i++){const n=t[i],o=e[i]*s,c=n>o?n-o:o-n;if(c>r)return Number.POSITIVE_INFINITY;a+=c}return a/i}}class mt extends wt{static findStartPattern(t){const e=t.getSize(),r=t.getNextSet(0);let n=0,i=Int32Array.from([0,0,0,0,0,0]),o=r,s=!1;for(let a=r;a<e;a++)if(t.get(a)!==s)i[n]++;else{if(5===n){let e=mt.MAX_AVG_VARIANCE,r=-1;for(let t=mt.CODE_START_A;t<=mt.CODE_START_C;t++){const n=wt.patternMatchVariance(i,mt.CODE_PATTERNS[t],mt.MAX_INDIVIDUAL_VARIANCE);n<e&&(e=n,r=t)}if(r>=0&&t.isRange(Math.max(0,o-(a-o)/2),o,!1))return Int32Array.from([o,a,r]);o+=i[0]+i[1],i=i.slice(2,i.length-1),i[n-1]=0,i[n]=0,n--}else n++;i[n]=1,s=!s}throw new D}static decodeCode(t,e,r){wt.recordPattern(t,r,e);let n=mt.MAX_AVG_VARIANCE,i=-1;for(let t=0;t<mt.CODE_PATTERNS.length;t++){const r=mt.CODE_PATTERNS[t],o=this.patternMatchVariance(e,r,mt.MAX_INDIVIDUAL_VARIANCE);o<n&&(n=o,i=t)}if(i>=0)return i;throw new D}decodeRow(t,e,r){const n=r&&!0===r.get(C.ASSUME_GS1),i=mt.findStartPattern(e),o=i[2];let s=0;const a=new Uint8Array(20);let c;switch(a[s++]=o,o){case mt.CODE_START_A:c=mt.CODE_CODE_A;break;case mt.CODE_START_B:c=mt.CODE_CODE_B;break;case mt.CODE_START_C:c=mt.CODE_CODE_C;break;default:throw new E}let l=!1,u=!1,d="",f=i[0],g=i[1];const w=Int32Array.from([0,0,0,0,0,0]);let m=0,p=0,A=o,I=0,S=!0,_=!1,T=!1;for(;!l;){const t=u;switch(u=!1,m=p,p=mt.decodeCode(e,w,g),a[s++]=p,p!==mt.CODE_STOP&&(S=!0),p!==mt.CODE_STOP&&(I++,A+=I*p),f=g,g+=w.reduce(((t,e)=>t+e),0),p){case mt.CODE_START_A:case mt.CODE_START_B:case mt.CODE_START_C:throw new E}switch(c){case mt.CODE_CODE_A:if(p<64)d+=T===_?String.fromCharCode(" ".charCodeAt(0)+p):String.fromCharCode(" ".charCodeAt(0)+p+128),T=!1;else if(p<96)d+=T===_?String.fromCharCode(p-64):String.fromCharCode(p+64),T=!1;else switch(p!==mt.CODE_STOP&&(S=!1),p){case mt.CODE_FNC_1:n&&(0===d.length?d+="]C1":d+=String.fromCharCode(29));break;case mt.CODE_FNC_2:case mt.CODE_FNC_3:break;case mt.CODE_FNC_4_A:!_&&T?(_=!0,T=!1):_&&T?(_=!1,T=!1):T=!0;break;case mt.CODE_SHIFT:u=!0,c=mt.CODE_CODE_B;break;case mt.CODE_CODE_B:c=mt.CODE_CODE_B;break;case mt.CODE_CODE_C:c=mt.CODE_CODE_C;break;case mt.CODE_STOP:l=!0}break;case mt.CODE_CODE_B:if(p<96)d+=T===_?String.fromCharCode(" ".charCodeAt(0)+p):String.fromCharCode(" ".charCodeAt(0)+p+128),T=!1;else switch(p!==mt.CODE_STOP&&(S=!1),p){case mt.CODE_FNC_1:n&&(0===d.length?d+="]C1":d+=String.fromCharCode(29));break;case mt.CODE_FNC_2:case mt.CODE_FNC_3:break;case mt.CODE_FNC_4_B:!_&&T?(_=!0,T=!1):_&&T?(_=!1,T=!1):T=!0;break;case mt.CODE_SHIFT:u=!0,c=mt.CODE_CODE_A;break;case mt.CODE_CODE_A:c=mt.CODE_CODE_A;break;case mt.CODE_CODE_C:c=mt.CODE_CODE_C;break;case mt.CODE_STOP:l=!0}break;case mt.CODE_CODE_C:if(p<100)p<10&&(d+="0"),d+=p;else switch(p!==mt.CODE_STOP&&(S=!1),p){case mt.CODE_FNC_1:n&&(0===d.length?d+="]C1":d+=String.fromCharCode(29));break;case mt.CODE_CODE_A:c=mt.CODE_CODE_A;break;case mt.CODE_CODE_B:c=mt.CODE_CODE_B;break;case mt.CODE_STOP:l=!0}}t&&(c=c===mt.CODE_CODE_A?mt.CODE_CODE_B:mt.CODE_CODE_A)}const y=g-f;if(g=e.getNextUnset(g),!e.isRange(g,Math.min(e.getSize(),g+(g-f)/2),!1))throw new D;if(A-=I*m,A%103!==m)throw new h;const N=d.length;if(0===N)throw new D;N>0&&S&&(d=c===mt.CODE_CODE_C?d.substring(0,N-2):d.substring(0,N-1));const M=(i[1]+i[0])/2,R=f+y/2,O=a.length,b=new Uint8Array(O);for(let t=0;t<O;t++)b[t]=a[t];const B=[new it(M,t),new it(R,t)];return new x(d,b,0,B,U.CODE_128,(new Date).getTime())}}mt.CODE_PATTERNS=[Int32Array.from([2,1,2,2,2,2]),Int32Array.from([2,2,2,1,2,2]),Int32Array.from([2,2,2,2,2,1]),Int32Array.from([1,2,1,2,2,3]),Int32Array.from([1,2,1,3,2,2]),Int32Array.from([1,3,1,2,2,2]),Int32Array.from([1,2,2,2,1,3]),Int32Array.from([1,2,2,3,1,2]),Int32Array.from([1,3,2,2,1,2]),Int32Array.from([2,2,1,2,1,3]),Int32Array.from([2,2,1,3,1,2]),Int32Array.from([2,3,1,2,1,2]),Int32Array.from([1,1,2,2,3,2]),Int32Array.from([1,2,2,1,3,2]),Int32Array.from([1,2,2,2,3,1]),Int32Array.from([1,1,3,2,2,2]),Int32Array.from([1,2,3,1,2,2]),Int32Array.from([1,2,3,2,2,1]),Int32Array.from([2,2,3,2,1,1]),Int32Array.from([2,2,1,1,3,2]),Int32Array.from([2,2,1,2,3,1]),Int32Array.from([2,1,3,2,1,2]),Int32Array.from([2,2,3,1,1,2]),Int32Array.from([3,1,2,1,3,1]),Int32Array.from([3,1,1,2,2,2]),Int32Array.from([3,2,1,1,2,2]),Int32Array.from([3,2,1,2,2,1]),Int32Array.from([3,1,2,2,1,2]),Int32Array.from([3,2,2,1,1,2]),Int32Array.from([3,2,2,2,1,1]),Int32Array.from([2,1,2,1,2,3]),Int32Array.from([2,1,2,3,2,1]),Int32Array.from([2,3,2,1,2,1]),Int32Array.from([1,1,1,3,2,3]),Int32Array.from([1,3,1,1,2,3]),Int32Array.from([1,3,1,3,2,1]),Int32Array.from([1,1,2,3,1,3]),Int32Array.from([1,3,2,1,1,3]),Int32Array.from([1,3,2,3,1,1]),Int32Array.from([2,1,1,3,1,3]),Int32Array.from([2,3,1,1,1,3]),Int32Array.from([2,3,1,3,1,1]),Int32Array.from([1,1,2,1,3,3]),Int32Array.from([1,1,2,3,3,1]),Int32Array.from([1,3,2,1,3,1]),Int32Array.from([1,1,3,1,2,3]),Int32Array.from([1,1,3,3,2,1]),Int32Array.from([1,3,3,1,2,1]),Int32Array.from([3,1,3,1,2,1]),Int32Array.from([2,1,1,3,3,1]),Int32Array.from([2,3,1,1,3,1]),Int32Array.from([2,1,3,1,1,3]),Int32Array.from([2,1,3,3,1,1]),Int32Array.from([2,1,3,1,3,1]),Int32Array.from([3,1,1,1,2,3]),Int32Array.from([3,1,1,3,2,1]),Int32Array.from([3,3,1,1,2,1]),Int32Array.from([3,1,2,1,1,3]),Int32Array.from([3,1,2,3,1,1]),Int32Array.from([3,3,2,1,1,1]),Int32Array.from([3,1,4,1,1,1]),Int32Array.from([2,2,1,4,1,1]),Int32Array.from([4,3,1,1,1,1]),Int32Array.from([1,1,1,2,2,4]),Int32Array.from([1,1,1,4,2,2]),Int32Array.from([1,2,1,1,2,4]),Int32Array.from([1,2,1,4,2,1]),Int32Array.from([1,4,1,1,2,2]),Int32Array.from([1,4,1,2,2,1]),Int32Array.from([1,1,2,2,1,4]),Int32Array.from([1,1,2,4,1,2]),Int32Array.from([1,2,2,1,1,4]),Int32Array.from([1,2,2,4,1,1]),Int32Array.from([1,4,2,1,1,2]),Int32Array.from([1,4,2,2,1,1]),Int32Array.from([2,4,1,2,1,1]),Int32Array.from([2,2,1,1,1,4]),Int32Array.from([4,1,3,1,1,1]),Int32Array.from([2,4,1,1,1,2]),Int32Array.from([1,3,4,1,1,1]),Int32Array.from([1,1,1,2,4,2]),Int32Array.from([1,2,1,1,4,2]),Int32Array.from([1,2,1,2,4,1]),Int32Array.from([1,1,4,2,1,2]),Int32Array.from([1,2,4,1,1,2]),Int32Array.from([1,2,4,2,1,1]),Int32Array.from([4,1,1,2,1,2]),Int32Array.from([4,2,1,1,1,2]),Int32Array.from([4,2,1,2,1,1]),Int32Array.from([2,1,2,1,4,1]),Int32Array.from([2,1,4,1,2,1]),Int32Array.from([4,1,2,1,2,1]),Int32Array.from([1,1,1,1,4,3]),Int32Array.from([1,1,1,3,4,1]),Int32Array.from([1,3,1,1,4,1]),Int32Array.from([1,1,4,1,1,3]),Int32Array.from([1,1,4,3,1,1]),Int32Array.from([4,1,1,1,1,3]),Int32Array.from([4,1,1,3,1,1]),Int32Array.from([1,1,3,1,4,1]),Int32Array.from([1,1,4,1,3,1]),Int32Array.from([3,1,1,1,4,1]),Int32Array.from([4,1,1,1,3,1]),Int32Array.from([2,1,1,4,1,2]),Int32Array.from([2,1,1,2,1,4]),Int32Array.from([2,1,1,2,3,2]),Int32Array.from([2,3,3,1,1,1,2])],mt.MAX_AVG_VARIANCE=.25,mt.MAX_INDIVIDUAL_VARIANCE=.7,mt.CODE_SHIFT=98,mt.CODE_CODE_C=99,mt.CODE_CODE_B=100,mt.CODE_CODE_A=101,mt.CODE_FNC_1=102,mt.CODE_FNC_2=97,mt.CODE_FNC_3=96,mt.CODE_FNC_4_A=101,mt.CODE_FNC_4_B=100,mt.CODE_START_A=103,mt.CODE_START_B=104,mt.CODE_START_C=105,mt.CODE_STOP=106;class pt extends wt{constructor(t=!1,e=!1){super(),this.usingCheckDigit=t,this.extendedMode=e,this.decodeRowResult="",this.counters=new Int32Array(9)}decodeRow(t,e,r){let n=this.counters;n.fill(0),this.decodeRowResult="";let i,o,s=pt.findAsteriskPattern(e,n),a=e.getNextSet(s[1]),c=e.getSize();do{pt.recordPattern(e,a,n);let t=pt.toNarrowWidePattern(n);if(t<0)throw new D;i=pt.patternToChar(t),this.decodeRowResult+=i,o=a;for(let t of n)a+=t;a=e.getNextSet(a)}while("*"!==i);this.decodeRowResult=this.decodeRowResult.substring(0,this.decodeRowResult.length-1);let l,u=0;for(let t of n)u+=t;if(a!==c&&2*(a-o-u)<u)throw new D;if(this.usingCheckDigit){let t=this.decodeRowResult.length-1,e=0;for(let r=0;r<t;r++)e+=pt.ALPHABET_STRING.indexOf(this.decodeRowResult.charAt(r));if(this.decodeRowResult.charAt(t)!==pt.ALPHABET_STRING.charAt(e%43))throw new h;this.decodeRowResult=this.decodeRowResult.substring(0,t)}if(0===this.decodeRowResult.length)throw new D;l=this.extendedMode?pt.decodeExtended(this.decodeRowResult):this.decodeRowResult;let d=(s[1]+s[0])/2,f=o+u/2;return new x(l,null,0,[new it(d,t),new it(f,t)],U.CODE_39,(new Date).getTime())}static findAsteriskPattern(t,e){let r=t.getSize(),n=t.getNextSet(0),i=0,o=n,s=!1,a=e.length;for(let c=n;c<r;c++)if(t.get(c)!==s)e[i]++;else{if(i===a-1){if(this.toNarrowWidePattern(e)===pt.ASTERISK_ENCODING&&t.isRange(Math.max(0,o-Math.floor((c-o)/2)),o,!1))return[o,c];o+=e[0]+e[1],e.copyWithin(0,2,2+i-1),e[i-1]=0,e[i]=0,i--}else i++;e[i]=1,s=!s}throw new D}static toNarrowWidePattern(t){let e,r=t.length,n=0;do{let i=2147483647;for(let e of t)e<i&&e>n&&(i=e);n=i,e=0;let o=0,s=0;for(let i=0;i<r;i++){let a=t[i];a>n&&(s|=1<<r-1-i,e++,o+=a)}if(3===e){for(let i=0;i<r&&e>0;i++){let r=t[i];if(r>n&&(e--,2*r>=o))return-1}return s}}while(e>3);return-1}static patternToChar(t){for(let e=0;e<pt.CHARACTER_ENCODINGS.length;e++)if(pt.CHARACTER_ENCODINGS[e]===t)return pt.ALPHABET_STRING.charAt(e);if(t===pt.ASTERISK_ENCODING)return"*";throw new D}static decodeExtended(t){let e=t.length,r="";for(let n=0;n<e;n++){let e=t.charAt(n);if("+"===e||"$"===e||"%"===e||"/"===e){let i=t.charAt(n+1),o="\0";switch(e){case"+":if(!(i>="A"&&i<="Z"))throw new E;o=String.fromCharCode(i.charCodeAt(0)+32);break;case"$":if(!(i>="A"&&i<="Z"))throw new E;o=String.fromCharCode(i.charCodeAt(0)-64);break;case"%":if(i>="A"&&i<="E")o=String.fromCharCode(i.charCodeAt(0)-38);else if(i>="F"&&i<="J")o=String.fromCharCode(i.charCodeAt(0)-11);else if(i>="K"&&i<="O")o=String.fromCharCode(i.charCodeAt(0)+16);else if(i>="P"&&i<="T")o=String.fromCharCode(i.charCodeAt(0)+43);else if("U"===i)o="\0";else if("V"===i)o="@";else if("W"===i)o="`";else{if("X"!==i&&"Y"!==i&&"Z"!==i)throw new E;o=""}break;case"/":if(i>="A"&&i<="O")o=String.fromCharCode(i.charCodeAt(0)-32);else{if("Z"!==i)throw new E;o=":"}}r+=o,n++}else r+=e}return r}}pt.ALPHABET_STRING="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%",pt.CHARACTER_ENCODINGS=[52,289,97,352,49,304,112,37,292,100,265,73,328,25,280,88,13,268,76,28,259,67,322,19,274,82,7,262,70,22,385,193,448,145,400,208,133,388,196,168,162,138,42],pt.ASTERISK_ENCODING=148;class At extends wt{constructor(){super(...arguments),this.narrowLineWidth=-1}decodeRow(t,e,r){let n=this.decodeStart(e),i=this.decodeEnd(e),o=new y;At.decodeMiddle(e,n[1],i[0],o);let s=o.toString(),a=null;null!=r&&(a=r.get(C.ALLOWED_LENGTHS)),null==a&&(a=At.DEFAULT_ALLOWED_LENGTHS);let c=s.length,l=!1,h=0;for(let t of a){if(c===t){l=!0;break}t>h&&(h=t)}if(!l&&c>h&&(l=!0),!l)throw new E;const u=[new it(n[1],t),new it(i[0],t)];return new x(s,null,0,u,U.ITF,(new Date).getTime())}static decodeMiddle(t,e,r,n){let i=new Int32Array(10),o=new Int32Array(5),s=new Int32Array(5);for(i.fill(0),o.fill(0),s.fill(0);e<r;){wt.recordPattern(t,e,i);for(let t=0;t<5;t++){let e=2*t;o[t]=i[e],s[t]=i[e+1]}let r=At.decodeDigit(o);n.append(r.toString()),r=this.decodeDigit(s),n.append(r.toString()),i.forEach((function(t){e+=t}))}}decodeStart(t){let e=At.skipWhiteSpace(t),r=At.findGuardPattern(t,e,At.START_PATTERN);return this.narrowLineWidth=(r[1]-r[0])/4,this.validateQuietZone(t,r[0]),r}validateQuietZone(t,e){let r=10*this.narrowLineWidth;r=r<e?r:e;for(let n=e-1;r>0&&n>=0&&!t.get(n);n--)r--;if(0!==r)throw new D}static skipWhiteSpace(t){const e=t.getSize(),r=t.getNextSet(0);if(r===e)throw new D;return r}decodeEnd(t){t.reverse();try{let e,r=At.skipWhiteSpace(t);try{e=At.findGuardPattern(t,r,At.END_PATTERN_REVERSED[0])}catch(n){n instanceof D&&(e=At.findGuardPattern(t,r,At.END_PATTERN_REVERSED[1]))}this.validateQuietZone(t,e[0]);let n=e[0];return e[0]=t.getSize()-e[1],e[1]=t.getSize()-n,e}finally{t.reverse()}}static findGuardPattern(t,e,r){let n=r.length,i=new Int32Array(n),o=t.getSize(),s=!1,a=0,c=e;i.fill(0);for(let l=e;l<o;l++)if(t.get(l)!==s)i[a]++;else{if(a===n-1){if(wt.patternMatchVariance(i,r,At.MAX_INDIVIDUAL_VARIANCE)<At.MAX_AVG_VARIANCE)return[c,l];c+=i[0]+i[1],d.arraycopy(i,2,i,0,a-1),i[a-1]=0,i[a]=0,a--}else a++;i[a]=1,s=!s}throw new D}static decodeDigit(t){let e=At.MAX_AVG_VARIANCE,r=-1,n=At.PATTERNS.length;for(let i=0;i<n;i++){let n=At.PATTERNS[i],o=wt.patternMatchVariance(t,n,At.MAX_INDIVIDUAL_VARIANCE);o<e?(e=o,r=i):o===e&&(r=-1)}if(r>=0)return r%10;throw new D}}At.PATTERNS=[Int32Array.from([1,1,2,2,1]),Int32Array.from([2,1,1,1,2]),Int32Array.from([1,2,1,1,2]),Int32Array.from([2,2,1,1,1]),Int32Array.from([1,1,2,1,2]),Int32Array.from([2,1,2,1,1]),Int32Array.from([1,2,2,1,1]),Int32Array.from([1,1,1,2,2]),Int32Array.from([2,1,1,2,1]),Int32Array.from([1,2,1,2,1]),Int32Array.from([1,1,3,3,1]),Int32Array.from([3,1,1,1,3]),Int32Array.from([1,3,1,1,3]),Int32Array.from([3,3,1,1,1]),Int32Array.from([1,1,3,1,3]),Int32Array.from([3,1,3,1,1]),Int32Array.from([1,3,3,1,1]),Int32Array.from([1,1,1,3,3]),Int32Array.from([3,1,1,3,1]),Int32Array.from([1,3,1,3,1])],At.MAX_AVG_VARIANCE=.38,At.MAX_INDIVIDUAL_VARIANCE=.5,At.DEFAULT_ALLOWED_LENGTHS=[6,8,10,12,14],At.START_PATTERN=Int32Array.from([1,1,1,1]),At.END_PATTERN_REVERSED=[Int32Array.from([1,1,2]),Int32Array.from([1,1,3])];class Ct extends wt{constructor(){super(...arguments),this.decodeRowStringBuffer=""}static findStartGuardPattern(t){let e,r=!1,n=0,i=Int32Array.from([0,0,0]);for(;!r;){i=Int32Array.from([0,0,0]),e=Ct.findGuardPattern(t,n,!1,this.START_END_PATTERN,i);let o=e[0];n=e[1];let s=o-(n-o);s>=0&&(r=t.isRange(s,o,!1))}return e}static checkChecksum(t){return Ct.checkStandardUPCEANChecksum(t)}static checkStandardUPCEANChecksum(t){let e=t.length;if(0===e)return!1;let r=parseInt(t.charAt(e-1),10);return Ct.getStandardUPCEANChecksum(t.substring(0,e-1))===r}static getStandardUPCEANChecksum(t){let e=t.length,r=0;for(let n=e-1;n>=0;n-=2){let e=t.charAt(n).charCodeAt(0)-"0".charCodeAt(0);if(e<0||e>9)throw new E;r+=e}r*=3;for(let n=e-2;n>=0;n-=2){let e=t.charAt(n).charCodeAt(0)-"0".charCodeAt(0);if(e<0||e>9)throw new E;r+=e}return(1e3-r)%10}static decodeEnd(t,e){return Ct.findGuardPattern(t,e,!1,Ct.START_END_PATTERN,new Int32Array(Ct.START_END_PATTERN.length).fill(0))}static findGuardPatternWithoutCounters(t,e,r,n){return this.findGuardPattern(t,e,r,n,new Int32Array(n.length))}static findGuardPattern(t,e,r,n,i){let o=t.getSize(),s=0,a=e=r?t.getNextUnset(e):t.getNextSet(e),c=n.length,l=r;for(let r=e;r<o;r++)if(t.get(r)!==l)i[s]++;else{if(s===c-1){if(wt.patternMatchVariance(i,n,Ct.MAX_INDIVIDUAL_VARIANCE)<Ct.MAX_AVG_VARIANCE)return Int32Array.from([a,r]);a+=i[0]+i[1];let t=i.slice(2,i.length-1);for(let e=0;e<s-1;e++)i[e]=t[e];i[s-1]=0,i[s]=0,s--}else s++;i[s]=1,l=!l}throw new D}static decodeDigit(t,e,r,n){this.recordPattern(t,r,e);let i=this.MAX_AVG_VARIANCE,o=-1,s=n.length;for(let t=0;t<s;t++){let r=n[t],s=wt.patternMatchVariance(e,r,Ct.MAX_INDIVIDUAL_VARIANCE);s<i&&(i=s,o=t)}if(o>=0)return o;throw new D}}Ct.MAX_AVG_VARIANCE=.48,Ct.MAX_INDIVIDUAL_VARIANCE=.7,Ct.START_END_PATTERN=Int32Array.from([1,1,1]),Ct.MIDDLE_PATTERN=Int32Array.from([1,1,1,1,1]),Ct.END_PATTERN=Int32Array.from([1,1,1,1,1,1]),Ct.L_PATTERNS=[Int32Array.from([3,2,1,1]),Int32Array.from([2,2,2,1]),Int32Array.from([2,1,2,2]),Int32Array.from([1,4,1,1]),Int32Array.from([1,1,3,2]),Int32Array.from([1,2,3,1]),Int32Array.from([1,1,1,4]),Int32Array.from([1,3,1,2]),Int32Array.from([1,2,1,3]),Int32Array.from([3,1,1,2])];class Et{constructor(){this.CHECK_DIGIT_ENCODINGS=[24,20,18,17,12,6,3,10,9,5],this.decodeMiddleCounters=Int32Array.from([0,0,0,0]),this.decodeRowStringBuffer=""}decodeRow(t,e,r){let n=this.decodeRowStringBuffer,i=this.decodeMiddle(e,r,n),o=n.toString(),s=Et.parseExtensionString(o),a=[new it((r[0]+r[1])/2,t),new it(i,t)],c=new x(o,null,0,a,U.UPC_EAN_EXTENSION,(new Date).getTime());return null!=s&&c.putAllMetadata(s),c}decodeMiddle(t,e,r){let n=this.decodeMiddleCounters;n[0]=0,n[1]=0,n[2]=0,n[3]=0;let i=t.getSize(),o=e[1],s=0;for(let e=0;e<5&&o<i;e++){let i=Ct.decodeDigit(t,n,o,Ct.L_AND_G_PATTERNS);r+=String.fromCharCode("0".charCodeAt(0)+i%10);for(let t of n)o+=t;i>=10&&(s|=1<<4-e),4!==e&&(o=t.getNextSet(o),o=t.getNextUnset(o))}if(5!==r.length)throw new D;let a=this.determineCheckDigit(s);if(Et.extensionChecksum(r.toString())!==a)throw new D;return o}static extensionChecksum(t){let e=t.length,r=0;for(let n=e-2;n>=0;n-=2)r+=t.charAt(n).charCodeAt(0)-"0".charCodeAt(0);r*=3;for(let n=e-1;n>=0;n-=2)r+=t.charAt(n).charCodeAt(0)-"0".charCodeAt(0);return r*=3,r%10}determineCheckDigit(t){for(let e=0;e<10;e++)if(t===this.CHECK_DIGIT_ENCODINGS[e])return e;throw new D}static parseExtensionString(t){if(5!==t.length)return null;let e=Et.parseExtension5String(t);return null==e?null:new Map([[W.SUGGESTED_PRICE,e]])}static parseExtension5String(t){let e;switch(t.charAt(0)){case"0":e="Â£";break;case"5":e="$";break;case"9":switch(t){case"90000":return null;case"99991":return"0.00";case"99990":return"Used"}e="";break;default:e=""}let r=parseInt(t.substring(1)),n=r%100;return e+(r/100).toString()+"."+(n<10?"0"+n:n.toString())}}class It{constructor(){this.decodeMiddleCounters=Int32Array.from([0,0,0,0]),this.decodeRowStringBuffer=""}decodeRow(t,e,r){let n=this.decodeRowStringBuffer,i=this.decodeMiddle(e,r,n),o=n.toString(),s=It.parseExtensionString(o),a=[new it((r[0]+r[1])/2,t),new it(i,t)],c=new x(o,null,0,a,U.UPC_EAN_EXTENSION,(new Date).getTime());return null!=s&&c.putAllMetadata(s),c}decodeMiddle(t,e,r){let n=this.decodeMiddleCounters;n[0]=0,n[1]=0,n[2]=0,n[3]=0;let i=t.getSize(),o=e[1],s=0;for(let e=0;e<2&&o<i;e++){let i=Ct.decodeDigit(t,n,o,Ct.L_AND_G_PATTERNS);r+=String.fromCharCode("0".charCodeAt(0)+i%10);for(let t of n)o+=t;i>=10&&(s|=1<<1-e),1!==e&&(o=t.getNextSet(o),o=t.getNextUnset(o))}if(2!==r.length)throw new D;if(parseInt(r.toString())%4!==s)throw new D;return o}static parseExtensionString(t){return 2!==t.length?null:new Map([[W.ISSUE_NUMBER,parseInt(t)]])}}class St{static decodeRow(t,e,r){let n=Ct.findGuardPattern(e,r,!1,this.EXTENSION_START_PATTERN,new Int32Array(this.EXTENSION_START_PATTERN.length).fill(0));try{return(new Et).decodeRow(t,e,n)}catch(r){return(new It).decodeRow(t,e,n)}}}St.EXTENSION_START_PATTERN=Int32Array.from([1,1,2]);class _t extends Ct{constructor(){super(),this.decodeRowStringBuffer="",_t.L_AND_G_PATTERNS=_t.L_PATTERNS.map((t=>Int32Array.from(t)));for(let t=10;t<20;t++){let e=_t.L_PATTERNS[t-10],r=new Int32Array(e.length);for(let t=0;t<e.length;t++)r[t]=e[e.length-t-1];_t.L_AND_G_PATTERNS[t]=r}}decodeRow(t,e,r){let n=_t.findStartGuardPattern(e),i=null==r?null:r.get(C.NEED_RESULT_POINT_CALLBACK);if(null!=i){const e=new it((n[0]+n[1])/2,t);i.foundPossibleResultPoint(e)}let o=this.decodeMiddle(e,n,this.decodeRowStringBuffer),s=o.rowOffset,a=o.resultString;if(null!=i){const e=new it(s,t);i.foundPossibleResultPoint(e)}let c=this.decodeEnd(e,s);if(null!=i){const e=new it((c[0]+c[1])/2,t);i.foundPossibleResultPoint(e)}let l=c[1],u=l+(l-c[0]);if(u>=e.getSize()||!e.isRange(l,u,!1))throw new D;let d=a.toString();if(d.length<8)throw new E;if(!_t.checkChecksum(d))throw new h;let f=(n[1]+n[0])/2,g=(c[1]+c[0])/2,w=this.getBarcodeFormat(),m=[new it(f,t),new it(g,t)],p=new x(d,null,0,m,w,(new Date).getTime()),A=0;try{let r=St.decodeRow(t,e,c[1]);p.putMetadata(W.UPC_EAN_EXTENSION,r.getText()),p.putAllMetadata(r.getResultMetadata()),p.addResultPoints(r.getResultPoints()),A=r.getText().length}catch(t){}let I=null==r?null:r.get(C.ALLOWED_EAN_EXTENSIONS);if(null!=I){let t=!1;for(let e in I)if(A.toString()===e){t=!0;break}if(!t)throw new D}return p}decodeEnd(t,e){return _t.findGuardPattern(t,e,!1,_t.START_END_PATTERN,new Int32Array(_t.START_END_PATTERN.length).fill(0))}static checkChecksum(t){return _t.checkStandardUPCEANChecksum(t)}static checkStandardUPCEANChecksum(t){let e=t.length;if(0===e)return!1;let r=parseInt(t.charAt(e-1),10);return _t.getStandardUPCEANChecksum(t.substring(0,e-1))===r}static getStandardUPCEANChecksum(t){let e=t.length,r=0;for(let n=e-1;n>=0;n-=2){let e=t.charAt(n).charCodeAt(0)-"0".charCodeAt(0);if(e<0||e>9)throw new E;r+=e}r*=3;for(let n=e-2;n>=0;n-=2){let e=t.charAt(n).charCodeAt(0)-"0".charCodeAt(0);if(e<0||e>9)throw new E;r+=e}return(1e3-r)%10}}class Tt extends _t{constructor(){super(),this.decodeMiddleCounters=Int32Array.from([0,0,0,0])}decodeMiddle(t,e,r){let n=this.decodeMiddleCounters;n[0]=0,n[1]=0,n[2]=0,n[3]=0;let i=t.getSize(),o=e[1],s=0;for(let e=0;e<6&&o<i;e++){let i=_t.decodeDigit(t,n,o,_t.L_AND_G_PATTERNS);r+=String.fromCharCode("0".charCodeAt(0)+i%10);for(let t of n)o+=t;i>=10&&(s|=1<<5-e)}r=Tt.determineFirstDigit(r,s),o=_t.findGuardPattern(t,o,!0,_t.MIDDLE_PATTERN,new Int32Array(_t.MIDDLE_PATTERN.length).fill(0))[1];for(let e=0;e<6&&o<i;e++){let e=_t.decodeDigit(t,n,o,_t.L_PATTERNS);r+=String.fromCharCode("0".charCodeAt(0)+e);for(let t of n)o+=t}return{rowOffset:o,resultString:r}}getBarcodeFormat(){return U.EAN_13}static determineFirstDigit(t,e){for(let r=0;r<10;r++)if(e===this.FIRST_DIGIT_ENCODINGS[r])return String.fromCharCode("0".charCodeAt(0)+r)+t;throw new D}}Tt.FIRST_DIGIT_ENCODINGS=[0,11,13,14,19,25,28,21,22,26];class yt extends _t{constructor(){super(),this.decodeMiddleCounters=Int32Array.from([0,0,0,0])}decodeMiddle(t,e,r){const n=this.decodeMiddleCounters;n[0]=0,n[1]=0,n[2]=0,n[3]=0;let i=t.getSize(),o=e[1];for(let e=0;e<4&&o<i;e++){let e=_t.decodeDigit(t,n,o,_t.L_PATTERNS);r+=String.fromCharCode("0".charCodeAt(0)+e);for(let t of n)o+=t}o=_t.findGuardPattern(t,o,!0,_t.MIDDLE_PATTERN,new Int32Array(_t.MIDDLE_PATTERN.length).fill(0))[1];for(let e=0;e<4&&o<i;e++){let e=_t.decodeDigit(t,n,o,_t.L_PATTERNS);r+=String.fromCharCode("0".charCodeAt(0)+e);for(let t of n)o+=t}return{rowOffset:o,resultString:r}}getBarcodeFormat(){return U.EAN_8}}class Nt extends _t{constructor(){super(...arguments),this.ean13Reader=new Tt}getBarcodeFormat(){return U.UPC_A}decode(t,e){return this.maybeReturnResult(this.ean13Reader.decode(t))}decodeRow(t,e,r){return this.maybeReturnResult(this.ean13Reader.decodeRow(t,e,r))}decodeMiddle(t,e,r){return this.ean13Reader.decodeMiddle(t,e,r)}maybeReturnResult(t){let e=t.getText();if("0"===e.charAt(0)){let r=new x(e.substring(1),null,null,t.getResultPoints(),U.UPC_A);return null!=t.getResultMetadata()&&r.putAllMetadata(t.getResultMetadata()),r}throw new D}reset(){this.ean13Reader.reset()}}class Dt extends _t{constructor(){super(),this.decodeMiddleCounters=new Int32Array(4)}decodeMiddle(t,e,r){const n=this.decodeMiddleCounters.map((t=>t));n[0]=0,n[1]=0,n[2]=0,n[3]=0;const i=t.getSize();let o=e[1],s=0;for(let e=0;e<6&&o<i;e++){const i=Dt.decodeDigit(t,n,o,Dt.L_AND_G_PATTERNS);r+=String.fromCharCode("0".charCodeAt(0)+i%10);for(let t of n)o+=t;i>=10&&(s|=1<<5-e)}return{rowOffset:o,resultString:Dt.determineNumSysAndCheckDigit(r,s)}}decodeEnd(t,e){return Dt.findGuardPatternWithoutCounters(t,e,!0,Dt.MIDDLE_END_PATTERN)}checkChecksum(t){return _t.checkChecksum(Dt.convertUPCEtoUPCA(t))}static determineNumSysAndCheckDigit(t,e){for(let r=0;r<=1;r++)for(let n=0;n<10;n++)if(e===this.NUMSYS_AND_CHECK_DIGIT_PATTERNS[r][n])return String.fromCharCode("0".charCodeAt(0)+r)+t+String.fromCharCode("0".charCodeAt(0)+n);throw D.getNotFoundInstance()}getBarcodeFormat(){return U.UPC_E}static convertUPCEtoUPCA(t){const e=t.slice(1,7).split("").map((t=>t.charCodeAt(0))),r=new y;r.append(t.charAt(0));let n=e[5];switch(n){case 0:case 1:case 2:r.appendChars(e,0,2),r.append(n),r.append("0000"),r.appendChars(e,2,3);break;case 3:r.appendChars(e,0,3),r.append("00000"),r.appendChars(e,3,2);break;case 4:r.appendChars(e,0,4),r.append("00000"),r.append(e[4]);break;default:r.appendChars(e,0,5),r.append("0000"),r.append(n)}return t.length>=8&&r.append(t.charAt(7)),r.toString()}}Dt.MIDDLE_END_PATTERN=Int32Array.from([1,1,1,1,1,1]),Dt.NUMSYS_AND_CHECK_DIGIT_PATTERNS=[Int32Array.from([56,52,50,49,44,38,35,42,41,37]),Int32Array.from([7,11,13,14,19,25,28,21,22,26])];class Mt extends wt{constructor(t){super();let r=null==t?null:t.get(C.POSSIBLE_FORMATS),n=[];e(r)?(n.push(new Tt),n.push(new Nt),n.push(new yt),n.push(new Dt)):(r.indexOf(U.EAN_13)>-1&&n.push(new Tt),r.indexOf(U.UPC_A)>-1&&n.push(new Nt),r.indexOf(U.EAN_8)>-1&&n.push(new yt),r.indexOf(U.UPC_E)>-1&&n.push(new Dt)),this.readers=n}decodeRow(t,e,r){for(let n of this.readers)try{const i=n.decodeRow(t,e,r),o=i.getBarcodeFormat()===U.EAN_13&&"0"===i.getText().charAt(0),s=null==r?null:r.get(C.POSSIBLE_FORMATS),a=null==s||s.includes(U.UPC_A);if(o&&a){const t=i.getRawBytes(),e=new x(i.getText().substring(1),t,t?t.length:null,i.getResultPoints(),U.UPC_A);return e.putAllMetadata(i.getResultMetadata()),e}return i}catch(t){}throw new D}reset(){for(let t of this.readers)t.reset()}}class Rt extends wt{constructor(){super(),this.decodeFinderCounters=new Int32Array(4),this.dataCharacterCounters=new Int32Array(8),this.oddRoundingErrors=new Array(4),this.evenRoundingErrors=new Array(4),this.oddCounts=new Array(this.dataCharacterCounters.length/2),this.evenCounts=new Array(this.dataCharacterCounters.length/2)}getDecodeFinderCounters(){return this.decodeFinderCounters}getDataCharacterCounters(){return this.dataCharacterCounters}getOddRoundingErrors(){return this.oddRoundingErrors}getEvenRoundingErrors(){return this.evenRoundingErrors}getOddCounts(){return this.oddCounts}getEvenCounts(){return this.evenCounts}parseFinderValue(t,e){for(let r=0;r<e.length;r++)if(wt.patternMatchVariance(t,e[r],Rt.MAX_INDIVIDUAL_VARIANCE)<Rt.MAX_AVG_VARIANCE)return r;throw new D}static count(t){return rt.sum(new Int32Array(t))}static increment(t,e){let r=0,n=e[0];for(let i=1;i<t.length;i++)e[i]>n&&(n=e[i],r=i);t[r]++}static decrement(t,e){let r=0,n=e[0];for(let i=1;i<t.length;i++)e[i]<n&&(n=e[i],r=i);t[r]--}static isFinderPattern(t){let e=t[0]+t[1],r=e/(e+t[2]+t[3]);if(r>=Rt.MIN_FINDER_PATTERN_RATIO&&r<=Rt.MAX_FINDER_PATTERN_RATIO){let e=Number.MAX_SAFE_INTEGER,r=Number.MIN_SAFE_INTEGER;for(let n of t)n>r&&(r=n),n<e&&(e=n);return r<10*e}return!1}}Rt.MAX_AVG_VARIANCE=.2,Rt.MAX_INDIVIDUAL_VARIANCE=.45,Rt.MIN_FINDER_PATTERN_RATIO=9.5/12,Rt.MAX_FINDER_PATTERN_RATIO=12.5/14;class Ot{constructor(t,e){this.value=t,this.checksumPortion=e}getValue(){return this.value}getChecksumPortion(){return this.checksumPortion}toString(){return this.value+"("+this.checksumPortion+")"}equals(t){if(!(t instanceof Ot))return!1;const e=t;return this.value===e.value&&this.checksumPortion===e.checksumPortion}hashCode(){return this.value^this.checksumPortion}}class bt{constructor(t,e,r,n,i){this.value=t,this.startEnd=e,this.value=t,this.startEnd=e,this.resultPoints=new Array,this.resultPoints.push(new it(r,i)),this.resultPoints.push(new it(n,i))}getValue(){return this.value}getStartEnd(){return this.startEnd}getResultPoints(){return this.resultPoints}equals(t){if(!(t instanceof bt))return!1;const e=t;return this.value===e.value}hashCode(){return this.value}}class Bt{constructor(){}static getRSSvalue(t,e,r){let n=0;for(let e of t)n+=e;let i=0,o=0,s=t.length;for(let a=0;a<s-1;a++){let c;for(c=1,o|=1<<a;c<t[a];c++,o&=~(1<<a)){let t=Bt.combins(n-c-1,s-a-2);if(r&&0===o&&n-c-(s-a-1)>=s-a-1&&(t-=Bt.combins(n-c-(s-a),s-a-2)),s-a-1>1){let r=0;for(let t=n-c-(s-a-2);t>e;t--)r+=Bt.combins(n-c-t-1,s-a-3);t-=r*(s-1-a)}else n-c>e&&t--;i+=t}n-=c}return i}static combins(t,e){let r,n;t-e>e?(n=e,r=t-e):(n=t-e,r=e);let i=1,o=1;for(let e=t;e>r;e--)i*=e,o<=n&&(i/=o,o++);for(;o<=n;)i/=o,o++;return i}}class Lt{static buildBitArray(t){let e=2*t.length-1;null==t[t.length-1].getRightChar()&&(e-=1);let r=new p(12*e),n=0,i=t[0].getRightChar().getValue();for(let t=11;t>=0;--t)0!=(i&1<<t)&&r.set(n),n++;for(let e=1;e<t.length;++e){let i=t[e],o=i.getLeftChar().getValue();for(let t=11;t>=0;--t)0!=(o&1<<t)&&r.set(n),n++;if(null!=i.getRightChar()){let t=i.getRightChar().getValue();for(let e=11;e>=0;--e)0!=(t&1<<e)&&r.set(n),n++}}return r}}class Pt{constructor(t,e){e?this.decodedInformation=null:(this.finished=t,this.decodedInformation=e)}getDecodedInformation(){return this.decodedInformation}isFinished(){return this.finished}}class vt{constructor(t){this.newPosition=t}getNewPosition(){return this.newPosition}}class Ft extends vt{constructor(t,e){super(t),this.value=e}getValue(){return this.value}isFNC1(){return this.value===Ft.FNC1}}Ft.FNC1="$";class xt extends vt{constructor(t,e,r){super(t),r?(this.remaining=!0,this.remainingValue=this.remainingValue):(this.remaining=!1,this.remainingValue=0),this.newString=e}getNewString(){return this.newString}isRemaining(){return this.remaining}getRemainingValue(){return this.remainingValue}}class kt extends vt{constructor(t,e,r){if(super(t),e<0||e>10||r<0||r>10)throw new E;this.firstDigit=e,this.secondDigit=r}getFirstDigit(){return this.firstDigit}getSecondDigit(){return this.secondDigit}getValue(){return 10*this.firstDigit+this.secondDigit}isFirstDigitFNC1(){return this.firstDigit===kt.FNC1}isSecondDigitFNC1(){return this.secondDigit===kt.FNC1}isAnyFNC1(){return this.firstDigit===kt.FNC1||this.secondDigit===kt.FNC1}}kt.FNC1=10;class Ut{constructor(){}static parseFieldsInGeneralPurpose(t){if(!t)return null;if(t.length<2)throw new D;let e=t.substring(0,2);for(let r of Ut.TWO_DIGIT_DATA_LENGTH)if(r[0]===e)return r[1]===Ut.VARIABLE_LENGTH?Ut.processVariableAI(2,r[2],t):Ut.processFixedAI(2,r[1],t);if(t.length<3)throw new D;let r=t.substring(0,3);for(let e of Ut.THREE_DIGIT_DATA_LENGTH)if(e[0]===r)return e[1]===Ut.VARIABLE_LENGTH?Ut.processVariableAI(3,e[2],t):Ut.processFixedAI(3,e[1],t);for(let e of Ut.THREE_DIGIT_PLUS_DIGIT_DATA_LENGTH)if(e[0]===r)return e[1]===Ut.VARIABLE_LENGTH?Ut.processVariableAI(4,e[2],t):Ut.processFixedAI(4,e[1],t);if(t.length<4)throw new D;let n=t.substring(0,4);for(let e of Ut.FOUR_DIGIT_DATA_LENGTH)if(e[0]===n)return e[1]===Ut.VARIABLE_LENGTH?Ut.processVariableAI(4,e[2],t):Ut.processFixedAI(4,e[1],t);throw new D}static processFixedAI(t,e,r){if(r.length<t)throw new D;let n=r.substring(0,t);if(r.length<t+e)throw new D;let i=r.substring(t,t+e),o=r.substring(t+e),s="("+n+")"+i,a=Ut.parseFieldsInGeneralPurpose(o);return null==a?s:s+a}static processVariableAI(t,e,r){let n,i=r.substring(0,t);n=r.length<t+e?r.length:t+e;let o=r.substring(t,n),s=r.substring(n),a="("+i+")"+o,c=Ut.parseFieldsInGeneralPurpose(s);return null==c?a:a+c}}Ut.VARIABLE_LENGTH=[],Ut.TWO_DIGIT_DATA_LENGTH=[["00",18],["01",14],["02",14],["10",Ut.VARIABLE_LENGTH,20],["11",6],["12",6],["13",6],["15",6],["17",6],["20",2],["21",Ut.VARIABLE_LENGTH,20],["22",Ut.VARIABLE_LENGTH,29],["30",Ut.VARIABLE_LENGTH,8],["37",Ut.VARIABLE_LENGTH,8],["90",Ut.VARIABLE_LENGTH,30],["91",Ut.VARIABLE_LENGTH,30],["92",Ut.VARIABLE_LENGTH,30],["93",Ut.VARIABLE_LENGTH,30],["94",Ut.VARIABLE_LENGTH,30],["95",Ut.VARIABLE_LENGTH,30],["96",Ut.VARIABLE_LENGTH,30],["97",Ut.VARIABLE_LENGTH,3],["98",Ut.VARIABLE_LENGTH,30],["99",Ut.VARIABLE_LENGTH,30]],Ut.THREE_DIGIT_DATA_LENGTH=[["240",Ut.VARIABLE_LENGTH,30],["241",Ut.VARIABLE_LENGTH,30],["242",Ut.VARIABLE_LENGTH,6],["250",Ut.VARIABLE_LENGTH,30],["251",Ut.VARIABLE_LENGTH,30],["253",Ut.VARIABLE_LENGTH,17],["254",Ut.VARIABLE_LENGTH,20],["400",Ut.VARIABLE_LENGTH,30],["401",Ut.VARIABLE_LENGTH,30],["402",17],["403",Ut.VARIABLE_LENGTH,30],["410",13],["411",13],["412",13],["413",13],["414",13],["420",Ut.VARIABLE_LENGTH,20],["421",Ut.VARIABLE_LENGTH,15],["422",3],["423",Ut.VARIABLE_LENGTH,15],["424",3],["425",3],["426",3]],Ut.THREE_DIGIT_PLUS_DIGIT_DATA_LENGTH=[["310",6],["311",6],["312",6],["313",6],["314",6],["315",6],["316",6],["320",6],["321",6],["322",6],["323",6],["324",6],["325",6],["326",6],["327",6],["328",6],["329",6],["330",6],["331",6],["332",6],["333",6],["334",6],["335",6],["336",6],["340",6],["341",6],["342",6],["343",6],["344",6],["345",6],["346",6],["347",6],["348",6],["349",6],["350",6],["351",6],["352",6],["353",6],["354",6],["355",6],["356",6],["357",6],["360",6],["361",6],["362",6],["363",6],["364",6],["365",6],["366",6],["367",6],["368",6],["369",6],["390",Ut.VARIABLE_LENGTH,15],["391",Ut.VARIABLE_LENGTH,18],["392",Ut.VARIABLE_LENGTH,15],["393",Ut.VARIABLE_LENGTH,18],["703",Ut.VARIABLE_LENGTH,30]],Ut.FOUR_DIGIT_DATA_LENGTH=[["7001",13],["7002",Ut.VARIABLE_LENGTH,30],["7003",10],["8001",14],["8002",Ut.VARIABLE_LENGTH,20],["8003",Ut.VARIABLE_LENGTH,30],["8004",Ut.VARIABLE_LENGTH,30],["8005",6],["8006",18],["8007",Ut.VARIABLE_LENGTH,30],["8008",Ut.VARIABLE_LENGTH,12],["8018",18],["8020",Ut.VARIABLE_LENGTH,25],["8100",6],["8101",10],["8102",2],["8110",Ut.VARIABLE_LENGTH,70],["8200",Ut.VARIABLE_LENGTH,70]];class Ht{constructor(t){this.buffer=new y,this.information=t}decodeAllCodes(t,e){let r=e,n=null;for(;;){let e=this.decodeGeneralPurposeField(r,n),i=Ut.parseFieldsInGeneralPurpose(e.getNewString());if(null!=i&&t.append(i),n=e.isRemaining()?""+e.getRemainingValue():null,r===e.getNewPosition())break;r=e.getNewPosition()}return t.toString()}isStillNumeric(t){if(t+7>this.information.getSize())return t+4<=this.information.getSize();for(let e=t;e<t+3;++e)if(this.information.get(e))return!0;return this.information.get(t+3)}decodeNumeric(t){if(t+7>this.information.getSize()){let e=this.extractNumericValueFromBitArray(t,4);return new kt(this.information.getSize(),0===e?kt.FNC1:e-1,kt.FNC1)}let e=this.extractNumericValueFromBitArray(t,7);return new kt(t+7,(e-8)/11,(e-8)%11)}extractNumericValueFromBitArray(t,e){return Ht.extractNumericValueFromBitArray(this.information,t,e)}static extractNumericValueFromBitArray(t,e,r){let n=0;for(let i=0;i<r;++i)t.get(e+i)&&(n|=1<<r-i-1);return n}decodeGeneralPurposeField(t,e){this.buffer.setLengthToZero(),null!=e&&this.buffer.append(e),this.current.setPosition(t);let r=this.parseBlocks();return null!=r&&r.isRemaining()?new xt(this.current.getPosition(),this.buffer.toString(),r.getRemainingValue()):new xt(this.current.getPosition(),this.buffer.toString())}parseBlocks(){let t,e;do{let r=this.current.getPosition();if(this.current.isAlpha()?(e=this.parseAlphaBlock(),t=e.isFinished()):this.current.isIsoIec646()?(e=this.parseIsoIec646Block(),t=e.isFinished()):(e=this.parseNumericBlock(),t=e.isFinished()),r===this.current.getPosition()&&!t)break}while(!t);return e.getDecodedInformation()}parseNumericBlock(){for(;this.isStillNumeric(this.current.getPosition());){let t=this.decodeNumeric(this.current.getPosition());if(this.current.setPosition(t.getNewPosition()),t.isFirstDigitFNC1()){let e;return e=t.isSecondDigitFNC1()?new xt(this.current.getPosition(),this.buffer.toString()):new xt(this.current.getPosition(),this.buffer.toString(),t.getSecondDigit()),new Pt(!0,e)}if(this.buffer.append(t.getFirstDigit()),t.isSecondDigitFNC1()){let t=new xt(this.current.getPosition(),this.buffer.toString());return new Pt(!0,t)}this.buffer.append(t.getSecondDigit())}return this.isNumericToAlphaNumericLatch(this.current.getPosition())&&(this.current.setAlpha(),this.current.incrementPosition(4)),new Pt(!1)}parseIsoIec646Block(){for(;this.isStillIsoIec646(this.current.getPosition());){let t=this.decodeIsoIec646(this.current.getPosition());if(this.current.setPosition(t.getNewPosition()),t.isFNC1()){let t=new xt(this.current.getPosition(),this.buffer.toString());return new Pt(!0,t)}this.buffer.append(t.getValue())}return this.isAlphaOr646ToNumericLatch(this.current.getPosition())?(this.current.incrementPosition(3),this.current.setNumeric()):this.isAlphaTo646ToAlphaLatch(this.current.getPosition())&&(this.current.getPosition()+5<this.information.getSize()?this.current.incrementPosition(5):this.current.setPosition(this.information.getSize()),this.current.setAlpha()),new Pt(!1)}parseAlphaBlock(){for(;this.isStillAlpha(this.current.getPosition());){let t=this.decodeAlphanumeric(this.current.getPosition());if(this.current.setPosition(t.getNewPosition()),t.isFNC1()){let t=new xt(this.current.getPosition(),this.buffer.toString());return new Pt(!0,t)}this.buffer.append(t.getValue())}return this.isAlphaOr646ToNumericLatch(this.current.getPosition())?(this.current.incrementPosition(3),this.current.setNumeric()):this.isAlphaTo646ToAlphaLatch(this.current.getPosition())&&(this.current.getPosition()+5<this.information.getSize()?this.current.incrementPosition(5):this.current.setPosition(this.information.getSize()),this.current.setIsoIec646()),new Pt(!1)}isStillIsoIec646(t){if(t+5>this.information.getSize())return!1;let e=this.extractNumericValueFromBitArray(t,5);if(e>=5&&e<16)return!0;if(t+7>this.information.getSize())return!1;let r=this.extractNumericValueFromBitArray(t,7);if(r>=64&&r<116)return!0;if(t+8>this.information.getSize())return!1;let n=this.extractNumericValueFromBitArray(t,8);return n>=232&&n<253}decodeIsoIec646(t){let e=this.extractNumericValueFromBitArray(t,5);if(15===e)return new Ft(t+5,Ft.FNC1);if(e>=5&&e<15)return new Ft(t+5,"0"+(e-5));let r,n=this.extractNumericValueFromBitArray(t,7);if(n>=64&&n<90)return new Ft(t+7,""+(n+1));if(n>=90&&n<116)return new Ft(t+7,""+(n+7));switch(this.extractNumericValueFromBitArray(t,8)){case 232:r="!";break;case 233:r='"';break;case 234:r="%";break;case 235:r="&";break;case 236:r="'";break;case 237:r="(";break;case 238:r=")";break;case 239:r="*";break;case 240:r="+";break;case 241:r=",";break;case 242:r="-";break;case 243:r=".";break;case 244:r="/";break;case 245:r=":";break;case 246:r=";";break;case 247:r="<";break;case 248:r="=";break;case 249:r=">";break;case 250:r="?";break;case 251:r="_";break;case 252:r=" ";break;default:throw new E}return new Ft(t+8,r)}isStillAlpha(t){if(t+5>this.information.getSize())return!1;let e=this.extractNumericValueFromBitArray(t,5);if(e>=5&&e<16)return!0;if(t+6>this.information.getSize())return!1;let r=this.extractNumericValueFromBitArray(t,6);return r>=16&&r<63}decodeAlphanumeric(t){let e=this.extractNumericValueFromBitArray(t,5);if(15===e)return new Ft(t+5,Ft.FNC1);if(e>=5&&e<15)return new Ft(t+5,"0"+(e-5));let r,n=this.extractNumericValueFromBitArray(t,6);if(n>=32&&n<58)return new Ft(t+6,""+(n+33));switch(n){case 58:r="*";break;case 59:r=",";break;case 60:r="-";break;case 61:r=".";break;case 62:r="/";break;default:throw new $("Decoding invalid alphanumeric value: "+n)}return new Ft(t+6,r)}isAlphaTo646ToAlphaLatch(t){if(t+1>this.information.getSize())return!1;for(let e=0;e<5&&e+t<this.information.getSize();++e)if(2===e){if(!this.information.get(t+2))return!1}else if(this.information.get(t+e))return!1;return!0}isAlphaOr646ToNumericLatch(t){if(t+3>this.information.getSize())return!1;for(let e=t;e<t+3;++e)if(this.information.get(e))return!1;return!0}isNumericToAlphaNumericLatch(t){if(t+1>this.information.getSize())return!1;for(let e=0;e<4&&e+t<this.information.getSize();++e)if(this.information.get(t+e))return!1;return!0}}class Vt{constructor(t){this.information=t,this.generalDecoder=new Ht(t)}getInformation(){return this.information}getGeneralDecoder(){return this.generalDecoder}}class zt extends Vt{constructor(t){super(t)}encodeCompressedGtin(t,e){t.append("(01)");let r=t.length();t.append("9"),this.encodeCompressedGtinWithoutAI(t,e,r)}encodeCompressedGtinWithoutAI(t,e,r){for(let r=0;r<4;++r){let n=this.getGeneralDecoder().extractNumericValueFromBitArray(e+10*r,10);n/100==0&&t.append("0"),n/10==0&&t.append("0"),t.append(n)}zt.appendCheckDigit(t,r)}static appendCheckDigit(t,e){let r=0;for(let n=0;n<13;n++){let i=t.charAt(n+e).charCodeAt(0)-"0".charCodeAt(0);r+=0==(1&n)?3*i:i}r=10-r%10,10===r&&(r=0),t.append(r)}}zt.GTIN_SIZE=40;class Gt extends zt{constructor(t){super(t)}parseInformation(){let t=new y;t.append("(01)");let e=t.length(),r=this.getGeneralDecoder().extractNumericValueFromBitArray(Gt.HEADER_SIZE,4);return t.append(r),this.encodeCompressedGtinWithoutAI(t,Gt.HEADER_SIZE+4,e),this.getGeneralDecoder().decodeAllCodes(t,Gt.HEADER_SIZE+44)}}Gt.HEADER_SIZE=4;class Yt extends Vt{constructor(t){super(t)}parseInformation(){let t=new y;return this.getGeneralDecoder().decodeAllCodes(t,Yt.HEADER_SIZE)}}Yt.HEADER_SIZE=5;class Xt extends zt{constructor(t){super(t)}encodeCompressedWeight(t,e,r){let n=this.getGeneralDecoder().extractNumericValueFromBitArray(e,r);this.addWeightCode(t,n);let i=this.checkWeight(n),o=1e5;for(let e=0;e<5;++e)i/o==0&&t.append("0"),o/=10;t.append(i)}}class Wt extends Xt{constructor(t){super(t)}parseInformation(){if(this.getInformation().getSize()!=Wt.HEADER_SIZE+Xt.GTIN_SIZE+Wt.WEIGHT_SIZE)throw new D;let t=new y;return this.encodeCompressedGtin(t,Wt.HEADER_SIZE),this.encodeCompressedWeight(t,Wt.HEADER_SIZE+Xt.GTIN_SIZE,Wt.WEIGHT_SIZE),t.toString()}}Wt.HEADER_SIZE=5,Wt.WEIGHT_SIZE=15;class jt extends Wt{constructor(t){super(t)}addWeightCode(t,e){t.append("(3103)")}checkWeight(t){return t}}class Zt extends Wt{constructor(t){super(t)}addWeightCode(t,e){e<1e4?t.append("(3202)"):t.append("(3203)")}checkWeight(t){return t<1e4?t:t-1e4}}class Qt extends zt{constructor(t){super(t)}parseInformation(){if(this.getInformation().getSize()<Qt.HEADER_SIZE+zt.GTIN_SIZE)throw new D;let t=new y;this.encodeCompressedGtin(t,Qt.HEADER_SIZE);let e=this.getGeneralDecoder().extractNumericValueFromBitArray(Qt.HEADER_SIZE+zt.GTIN_SIZE,Qt.LAST_DIGIT_SIZE);t.append("(392"),t.append(e),t.append(")");let r=this.getGeneralDecoder().decodeGeneralPurposeField(Qt.HEADER_SIZE+zt.GTIN_SIZE+Qt.LAST_DIGIT_SIZE,null);return t.append(r.getNewString()),t.toString()}}Qt.HEADER_SIZE=8,Qt.LAST_DIGIT_SIZE=2;class Kt extends zt{constructor(t){super(t)}parseInformation(){if(this.getInformation().getSize()<Kt.HEADER_SIZE+zt.GTIN_SIZE)throw new D;let t=new y;this.encodeCompressedGtin(t,Kt.HEADER_SIZE);let e=this.getGeneralDecoder().extractNumericValueFromBitArray(Kt.HEADER_SIZE+zt.GTIN_SIZE,Kt.LAST_DIGIT_SIZE);t.append("(393"),t.append(e),t.append(")");let r=this.getGeneralDecoder().extractNumericValueFromBitArray(Kt.HEADER_SIZE+zt.GTIN_SIZE+Kt.LAST_DIGIT_SIZE,Kt.FIRST_THREE_DIGITS_SIZE);r/100==0&&t.append("0"),r/10==0&&t.append("0"),t.append(r);let n=this.getGeneralDecoder().decodeGeneralPurposeField(Kt.HEADER_SIZE+zt.GTIN_SIZE+Kt.LAST_DIGIT_SIZE+Kt.FIRST_THREE_DIGITS_SIZE,null);return t.append(n.getNewString()),t.toString()}}Kt.HEADER_SIZE=8,Kt.LAST_DIGIT_SIZE=2,Kt.FIRST_THREE_DIGITS_SIZE=10;class qt extends Xt{constructor(t,e,r){super(t),this.dateCode=r,this.firstAIdigits=e}parseInformation(){if(this.getInformation().getSize()!=qt.HEADER_SIZE+qt.GTIN_SIZE+qt.WEIGHT_SIZE+qt.DATE_SIZE)throw new D;let t=new y;return this.encodeCompressedGtin(t,qt.HEADER_SIZE),this.encodeCompressedWeight(t,qt.HEADER_SIZE+qt.GTIN_SIZE,qt.WEIGHT_SIZE),this.encodeCompressedDate(t,qt.HEADER_SIZE+qt.GTIN_SIZE+qt.WEIGHT_SIZE),t.toString()}encodeCompressedDate(t,e){let r=this.getGeneralDecoder().extractNumericValueFromBitArray(e,qt.DATE_SIZE);if(38400==r)return;t.append("("),t.append(this.dateCode),t.append(")");let n=r%32;r/=32;let i=r%12+1;r/=12;let o=r;o/10==0&&t.append("0"),t.append(o),i/10==0&&t.append("0"),t.append(i),n/10==0&&t.append("0"),t.append(n)}addWeightCode(t,e){t.append("("),t.append(this.firstAIdigits),t.append(e/1e5),t.append(")")}checkWeight(t){return t%1e5}}function Jt(t){try{if(t.get(1))return new Gt(t);if(!t.get(2))return new Yt(t);switch(Ht.extractNumericValueFromBitArray(t,1,4)){case 4:return new jt(t);case 5:return new Zt(t)}switch(Ht.extractNumericValueFromBitArray(t,1,5)){case 12:return new Qt(t);case 13:return new Kt(t)}switch(Ht.extractNumericValueFromBitArray(t,1,7)){case 56:return new qt(t,"310","11");case 57:return new qt(t,"320","11");case 58:return new qt(t,"310","13");case 59:return new qt(t,"320","13");case 60:return new qt(t,"310","15");case 61:return new qt(t,"320","15");case 62:return new qt(t,"310","17");case 63:return new qt(t,"320","17")}}catch(e){throw console.log(e),new $("unknown decoder: "+t)}}qt.HEADER_SIZE=8,qt.WEIGHT_SIZE=20,qt.DATE_SIZE=16;class $t{constructor(t,e,r,n){this.leftchar=t,this.rightchar=e,this.finderpattern=r,this.maybeLast=n}mayBeLast(){return this.maybeLast}getLeftChar(){return this.leftchar}getRightChar(){return this.rightchar}getFinderPattern(){return this.finderpattern}mustBeLast(){return null==this.rightchar}toString(){return"[ "+this.leftchar+", "+this.rightchar+" : "+(null==this.finderpattern?"null":this.finderpattern.getValue())+" ]"}static equals(t,e){return t instanceof $t&&$t.equalsOrNull(t.leftchar,e.leftchar)&&$t.equalsOrNull(t.rightchar,e.rightchar)&&$t.equalsOrNull(t.finderpattern,e.finderpattern)}static equalsOrNull(t,e){return null===t?null===e:$t.equals(t,e)}hashCode(){return this.leftchar.getValue()^this.rightchar.getValue()^this.finderpattern.getValue()}}class te{constructor(t,e,r){this.pairs=t,this.rowNumber=e,this.wasReversed=r}getPairs(){return this.pairs}getRowNumber(){return this.rowNumber}isReversed(){return this.wasReversed}isEquivalent(t){return this.checkEqualitity(this,t)}toString(){return"{ "+this.pairs+" }"}equals(t,e){return t instanceof te&&this.checkEqualitity(t,e)&&t.wasReversed===e.wasReversed}checkEqualitity(t,e){if(!t||!e)return;let r;return t.forEach(((t,n)=>{e.forEach((e=>{t.getLeftChar().getValue()===e.getLeftChar().getValue()&&t.getRightChar().getValue()===e.getRightChar().getValue()&&t.getFinderPatter().getValue()===e.getFinderPatter().getValue()&&(r=!0)}))})),r}}class ee extends Rt{constructor(t){super(...arguments),this.pairs=new Array(ee.MAX_PAIRS),this.rows=new Array,this.startEnd=[2],this.verbose=!0===t}decodeRow(t,e,r){this.pairs.length=0,this.startFromEven=!1;try{return ee.constructResult(this.decodeRow2pairs(t,e))}catch(t){this.verbose&&console.log(t)}return this.pairs.length=0,this.startFromEven=!0,ee.constructResult(this.decodeRow2pairs(t,e))}reset(){this.pairs.length=0,this.rows.length=0}decodeRow2pairs(t,e){let r,n=!1;for(;!n;)try{this.pairs.push(this.retrieveNextPair(e,this.pairs,t))}catch(t){if(t instanceof D){if(!this.pairs.length)throw new D;n=!0}}if(this.checkChecksum())return this.pairs;if(r=!!this.rows.length,this.storeRow(t,!1),r){let t=this.checkRowsBoolean(!1);if(null!=t)return t;if(t=this.checkRowsBoolean(!0),null!=t)return t}throw new D}checkRowsBoolean(t){if(this.rows.length>25)return this.rows.length=0,null;this.pairs.length=0,t&&(this.rows=this.rows.reverse());let e=null;try{e=this.checkRows(new Array,0)}catch(t){this.verbose&&console.log(t)}return t&&(this.rows=this.rows.reverse()),e}checkRows(t,e){for(let r=e;r<this.rows.length;r++){let e=this.rows[r];this.pairs.length=0;for(let e of t)this.pairs.push(e.getPairs());if(this.pairs.push(e.getPairs()),!ee.isValidSequence(this.pairs))continue;if(this.checkChecksum())return this.pairs;let n=new Array(t);n.push(e);try{return this.checkRows(n,r+1)}catch(t){this.verbose&&console.log(t)}}throw new D}static isValidSequence(t){for(let e of ee.FINDER_PATTERN_SEQUENCES){if(t.length>e.length)continue;let r=!0;for(let n=0;n<t.length;n++)if(t[n].getFinderPattern().getValue()!=e[n]){r=!1;break}if(r)return!0}return!1}storeRow(t,e){let r=0,n=!1,i=!1;for(;r<this.rows.length;){let e=this.rows[r];if(e.getRowNumber()>t){i=e.isEquivalent(this.pairs);break}n=e.isEquivalent(this.pairs),r++}i||n||ee.isPartialRow(this.pairs,this.rows)||(this.rows.push(r,new te(this.pairs,t,e)),this.removePartialRows(this.pairs,this.rows))}removePartialRows(t,e){for(let r of e)if(r.getPairs().length!==t.length)for(let e of r.getPairs())for(let r of t)if($t.equals(e,r))break}static isPartialRow(t,e){for(let r of e){let e=!0;for(let n of t){let t=!1;for(let e of r.getPairs())if(n.equals(e)){t=!0;break}if(!t){e=!1;break}}if(e)return!0}return!1}getRows(){return this.rows}static constructResult(t){let e=Jt(Lt.buildBitArray(t)).parseInformation(),r=t[0].getFinderPattern().getResultPoints(),n=t[t.length-1].getFinderPattern().getResultPoints(),i=[r[0],r[1],n[0],n[1]];return new x(e,null,null,i,U.RSS_EXPANDED,null)}checkChecksum(){let t=this.pairs.get(0),e=t.getLeftChar(),r=t.getRightChar();if(null==r)return!1;let n=r.getChecksumPortion(),i=2;for(let t=1;t<this.pairs.size();++t){let e=this.pairs.get(t);n+=e.getLeftChar().getChecksumPortion(),i++;let r=e.getRightChar();null!=r&&(n+=r.getChecksumPortion(),i++)}return n%=211,211*(i-4)+n==e.getValue()}static getNextSecondBar(t,e){let r;return t.get(e)?(r=t.getNextUnset(e),r=t.getNextSet(r)):(r=t.getNextSet(e),r=t.getNextUnset(r)),r}retrieveNextPair(t,e,r){let n,i=e.length%2==0;this.startFromEven&&(i=!i);let o=!0,s=-1;do{this.findNextPair(t,e,s),n=this.parseFoundFinderPattern(t,r,i),null==n?s=ee.getNextSecondBar(t,this.startEnd[0]):o=!1}while(o);let a,c=this.decodeDataCharacter(t,n,i,!0);if(!this.isEmptyPair(e)&&e[e.length-1].mustBeLast())throw new D;try{a=this.decodeDataCharacter(t,n,i,!1)}catch(t){a=null,this.verbose&&console.log(t)}return new $t(c,a,n,!0)}isEmptyPair(t){return 0===t.length}findNextPair(t,e,r){let n=this.getDecodeFinderCounters();n[0]=0,n[1]=0,n[2]=0,n[3]=0;let i,o=t.getSize();i=r>=0?r:this.isEmptyPair(e)?0:e[e.length-1].getFinderPattern().getStartEnd()[1];let s=e.length%2!=0;this.startFromEven&&(s=!s);let a=!1;for(;i<o&&(a=!t.get(i),a);)i++;let c=0,l=i;for(let e=i;e<o;e++)if(t.get(e)!=a)n[c]++;else{if(3==c){if(s&&ee.reverseCounters(n),ee.isFinderPattern(n))return this.startEnd[0]=l,void(this.startEnd[1]=e);s&&ee.reverseCounters(n),l+=n[0]+n[1],n[0]=n[2],n[1]=n[3],n[2]=0,n[3]=0,c--}else c++;n[c]=1,a=!a}throw new D}static reverseCounters(t){let e=t.length;for(let r=0;r<e/2;++r){let n=t[r];t[r]=t[e-r-1],t[e-r-1]=n}}parseFoundFinderPattern(t,e,r){let n,i,o;if(r){let e=this.startEnd[0]-1;for(;e>=0&&!t.get(e);)e--;e++,n=this.startEnd[0]-e,i=e,o=this.startEnd[1]}else i=this.startEnd[0],o=t.getNextUnset(this.startEnd[1]+1),n=o-this.startEnd[1];let s,a=this.getDecodeFinderCounters();d.arraycopy(a,0,a,1,a.length-1),a[0]=n;try{s=this.parseFinderValue(a,ee.FINDER_PATTERNS)}catch(t){return null}return new bt(s,[i,o],i,o,e)}decodeDataCharacter(t,e,r,n){let i=this.getDataCharacterCounters();for(let t=0;t<i.length;t++)i[t]=0;if(n)ee.recordPatternInReverse(t,e.getStartEnd()[0],i);else{ee.recordPattern(t,e.getStartEnd()[1],i);for(let t=0,e=i.length-1;t<e;t++,e--){let r=i[t];i[t]=i[e],i[e]=r}}let o=rt.sum(new Int32Array(i))/17,s=(e.getStartEnd()[1]-e.getStartEnd()[0])/15;if(Math.abs(o-s)/s>.3)throw new D;let a=this.getOddCounts(),c=this.getEvenCounts(),l=this.getOddRoundingErrors(),h=this.getEvenRoundingErrors();for(let t=0;t<i.length;t++){let e=1*i[t]/o,r=e+.5;if(r<1){if(e<.3)throw new D;r=1}else if(r>8){if(e>8.7)throw new D;r=8}let n=t/2;0==(1&t)?(a[n]=r,l[n]=e-r):(c[n]=r,h[n]=e-r)}this.adjustOddEvenCounts(17);let u=4*e.getValue()+(r?0:2)+(n?0:1)-1,d=0,f=0;for(let t=a.length-1;t>=0;t--){if(ee.isNotA1left(e,r,n)){let e=ee.WEIGHTS[u][2*t];f+=a[t]*e}d+=a[t]}let g=0;for(let t=c.length-1;t>=0;t--)if(ee.isNotA1left(e,r,n)){let e=ee.WEIGHTS[u][2*t+1];g+=c[t]*e}let w=f+g;if(0!=(1&d)||d>13||d<4)throw new D;let m=(13-d)/2,p=ee.SYMBOL_WIDEST[m],A=9-p,C=Bt.getRSSvalue(a,p,!0),E=Bt.getRSSvalue(c,A,!1),I=ee.EVEN_TOTAL_SUBSET[m],S=ee.GSUM[m];return new Ot(C*I+E+S,w)}static isNotA1left(t,e,r){return!(0==t.getValue()&&e&&r)}adjustOddEvenCounts(t){let e=rt.sum(new Int32Array(this.getOddCounts())),r=rt.sum(new Int32Array(this.getEvenCounts())),n=!1,i=!1;e>13?i=!0:e<4&&(n=!0);let o=!1,s=!1;r>13?s=!0:r<4&&(o=!0);let a=e+r-t,c=1==(1&e),l=0==(1&r);if(1==a)if(c){if(l)throw new D;i=!0}else{if(!l)throw new D;s=!0}else if(-1==a)if(c){if(l)throw new D;n=!0}else{if(!l)throw new D;o=!0}else{if(0!=a)throw new D;if(c){if(!l)throw new D;e<r?(n=!0,s=!0):(i=!0,o=!0)}else if(l)throw new D}if(n){if(i)throw new D;ee.increment(this.getOddCounts(),this.getOddRoundingErrors())}if(i&&ee.decrement(this.getOddCounts(),this.getOddRoundingErrors()),o){if(s)throw new D;ee.increment(this.getEvenCounts(),this.getOddRoundingErrors())}s&&ee.decrement(this.getEvenCounts(),this.getEvenRoundingErrors())}}ee.SYMBOL_WIDEST=[7,5,4,3,1],ee.EVEN_TOTAL_SUBSET=[4,20,52,104,204],ee.GSUM=[0,348,1388,2948,3988],ee.FINDER_PATTERNS=[Int32Array.from([1,8,4,1]),Int32Array.from([3,6,4,1]),Int32Array.from([3,4,6,1]),Int32Array.from([3,2,8,1]),Int32Array.from([2,6,5,1]),Int32Array.from([2,2,9,1])],ee.WEIGHTS=[[1,3,9,27,81,32,96,77],[20,60,180,118,143,7,21,63],[189,145,13,39,117,140,209,205],[193,157,49,147,19,57,171,91],[62,186,136,197,169,85,44,132],[185,133,188,142,4,12,36,108],[113,128,173,97,80,29,87,50],[150,28,84,41,123,158,52,156],[46,138,203,187,139,206,196,166],[76,17,51,153,37,111,122,155],[43,129,176,106,107,110,119,146],[16,48,144,10,30,90,59,177],[109,116,137,200,178,112,125,164],[70,210,208,202,184,130,179,115],[134,191,151,31,93,68,204,190],[148,22,66,198,172,94,71,2],[6,18,54,162,64,192,154,40],[120,149,25,75,14,42,126,167],[79,26,78,23,69,207,199,175],[103,98,83,38,114,131,182,124],[161,61,183,127,170,88,53,159],[55,165,73,8,24,72,5,15],[45,135,194,160,58,174,100,89]],ee.FINDER_PAT_A=0,ee.FINDER_PAT_B=1,ee.FINDER_PAT_C=2,ee.FINDER_PAT_D=3,ee.FINDER_PAT_E=4,ee.FINDER_PAT_F=5,ee.FINDER_PATTERN_SEQUENCES=[[ee.FINDER_PAT_A,ee.FINDER_PAT_A],[ee.FINDER_PAT_A,ee.FINDER_PAT_B,ee.FINDER_PAT_B],[ee.FINDER_PAT_A,ee.FINDER_PAT_C,ee.FINDER_PAT_B,ee.FINDER_PAT_D],[ee.FINDER_PAT_A,ee.FINDER_PAT_E,ee.FINDER_PAT_B,ee.FINDER_PAT_D,ee.FINDER_PAT_C],[ee.FINDER_PAT_A,ee.FINDER_PAT_E,ee.FINDER_PAT_B,ee.FINDER_PAT_D,ee.FINDER_PAT_D,ee.FINDER_PAT_F],[ee.FINDER_PAT_A,ee.FINDER_PAT_E,ee.FINDER_PAT_B,ee.FINDER_PAT_D,ee.FINDER_PAT_E,ee.FINDER_PAT_F,ee.FINDER_PAT_F],[ee.FINDER_PAT_A,ee.FINDER_PAT_A,ee.FINDER_PAT_B,ee.FINDER_PAT_B,ee.FINDER_PAT_C,ee.FINDER_PAT_C,ee.FINDER_PAT_D,ee.FINDER_PAT_D],[ee.FINDER_PAT_A,ee.FINDER_PAT_A,ee.FINDER_PAT_B,ee.FINDER_PAT_B,ee.FINDER_PAT_C,ee.FINDER_PAT_C,ee.FINDER_PAT_D,ee.FINDER_PAT_E,ee.FINDER_PAT_E],[ee.FINDER_PAT_A,ee.FINDER_PAT_A,ee.FINDER_PAT_B,ee.FINDER_PAT_B,ee.FINDER_PAT_C,ee.FINDER_PAT_C,ee.FINDER_PAT_D,ee.FINDER_PAT_E,ee.FINDER_PAT_F,ee.FINDER_PAT_F],[ee.FINDER_PAT_A,ee.FINDER_PAT_A,ee.FINDER_PAT_B,ee.FINDER_PAT_B,ee.FINDER_PAT_C,ee.FINDER_PAT_D,ee.FINDER_PAT_D,ee.FINDER_PAT_E,ee.FINDER_PAT_E,ee.FINDER_PAT_F,ee.FINDER_PAT_F]],ee.MAX_PAIRS=11;class re extends Ot{constructor(t,e,r){super(t,e),this.count=0,this.finderPattern=r}getFinderPattern(){return this.finderPattern}getCount(){return this.count}incrementCount(){this.count++}}class ne extends Rt{constructor(){super(...arguments),this.possibleLeftPairs=[],this.possibleRightPairs=[]}decodeRow(t,e,r){const n=this.decodePair(e,!1,t,r);ne.addOrTally(this.possibleLeftPairs,n),e.reverse();let i=this.decodePair(e,!0,t,r);ne.addOrTally(this.possibleRightPairs,i),e.reverse();for(let t of this.possibleLeftPairs)if(t.getCount()>1)for(let e of this.possibleRightPairs)if(e.getCount()>1&&ne.checkChecksum(t,e))return ne.constructResult(t,e);throw new D}static addOrTally(t,e){if(null==e)return;let r=!1;for(let n of t)if(n.getValue()===e.getValue()){n.incrementCount(),r=!0;break}r||t.push(e)}reset(){this.possibleLeftPairs.length=0,this.possibleRightPairs.length=0}static constructResult(t,e){let r=4537077*t.getValue()+e.getValue(),n=new String(r).toString(),i=new y;for(let t=13-n.length;t>0;t--)i.append("0");i.append(n);let o=0;for(let t=0;t<13;t++){let e=i.charAt(t).charCodeAt(0)-"0".charCodeAt(0);o+=0==(1&t)?3*e:e}o=10-o%10,10===o&&(o=0),i.append(o.toString());let s=t.getFinderPattern().getResultPoints(),a=e.getFinderPattern().getResultPoints();return new x(i.toString(),null,0,[s[0],s[1],a[0],a[1]],U.RSS_14,(new Date).getTime())}static checkChecksum(t,e){let r=(t.getChecksumPortion()+16*e.getChecksumPortion())%79,n=9*t.getFinderPattern().getValue()+e.getFinderPattern().getValue();return n>72&&n--,n>8&&n--,r===n}decodePair(t,e,r,n){try{let i=this.findFinderPattern(t,e),o=this.parseFoundFinderPattern(t,r,e,i),s=null==n?null:n.get(C.NEED_RESULT_POINT_CALLBACK);if(null!=s){let n=(i[0]+i[1])/2;e&&(n=t.getSize()-1-n),s.foundPossibleResultPoint(new it(n,r))}let a=this.decodeDataCharacter(t,o,!0),c=this.decodeDataCharacter(t,o,!1);return new re(1597*a.getValue()+c.getValue(),a.getChecksumPortion()+4*c.getChecksumPortion(),o)}catch(t){return null}}decodeDataCharacter(t,e,r){let n=this.getDataCharacterCounters();for(let t=0;t<n.length;t++)n[t]=0;if(r)wt.recordPatternInReverse(t,e.getStartEnd()[0],n);else{wt.recordPattern(t,e.getStartEnd()[1]+1,n);for(let t=0,e=n.length-1;t<e;t++,e--){let r=n[t];n[t]=n[e],n[e]=r}}let i=r?16:15,o=rt.sum(new Int32Array(n))/i,s=this.getOddCounts(),a=this.getEvenCounts(),c=this.getOddRoundingErrors(),l=this.getEvenRoundingErrors();for(let t=0;t<n.length;t++){let e=n[t]/o,r=Math.floor(e+.5);r<1?r=1:r>8&&(r=8);let i=Math.floor(t/2);0==(1&t)?(s[i]=r,c[i]=e-r):(a[i]=r,l[i]=e-r)}this.adjustOddEvenCounts(r,i);let h=0,u=0;for(let t=s.length-1;t>=0;t--)u*=9,u+=s[t],h+=s[t];let d=0,f=0;for(let t=a.length-1;t>=0;t--)d*=9,d+=a[t],f+=a[t];let g=u+3*d;if(r){if(0!=(1&h)||h>12||h<4)throw new D;let t=(12-h)/2,e=ne.OUTSIDE_ODD_WIDEST[t],r=9-e,n=Bt.getRSSvalue(s,e,!1),i=Bt.getRSSvalue(a,r,!0),o=ne.OUTSIDE_EVEN_TOTAL_SUBSET[t],c=ne.OUTSIDE_GSUM[t];return new Ot(n*o+i+c,g)}{if(0!=(1&f)||f>10||f<4)throw new D;let t=(10-f)/2,e=ne.INSIDE_ODD_WIDEST[t],r=9-e,n=Bt.getRSSvalue(s,e,!0),i=Bt.getRSSvalue(a,r,!1),o=ne.INSIDE_ODD_TOTAL_SUBSET[t],c=ne.INSIDE_GSUM[t];return new Ot(i*o+n+c,g)}}findFinderPattern(t,e){let r=this.getDecodeFinderCounters();r[0]=0,r[1]=0,r[2]=0,r[3]=0;let n=t.getSize(),i=!1,o=0;for(;o<n&&(i=!t.get(o),e!==i);)o++;let s=0,a=o;for(let e=o;e<n;e++)if(t.get(e)!==i)r[s]++;else{if(3===s){if(Rt.isFinderPattern(r))return[a,e];a+=r[0]+r[1],r[0]=r[2],r[1]=r[3],r[2]=0,r[3]=0,s--}else s++;r[s]=1,i=!i}throw new D}parseFoundFinderPattern(t,e,r,n){let i=t.get(n[0]),o=n[0]-1;for(;o>=0&&i!==t.get(o);)o--;o++;const s=n[0]-o,a=this.getDecodeFinderCounters(),c=new Int32Array(a.length);d.arraycopy(a,0,c,1,a.length-1),c[0]=s;const l=this.parseFinderValue(c,ne.FINDER_PATTERNS);let h=o,u=n[1];return r&&(h=t.getSize()-1-h,u=t.getSize()-1-u),new bt(l,[o,n[1]],h,u,e)}adjustOddEvenCounts(t,e){let r=rt.sum(new Int32Array(this.getOddCounts())),n=rt.sum(new Int32Array(this.getEvenCounts())),i=!1,o=!1,s=!1,a=!1;t?(r>12?o=!0:r<4&&(i=!0),n>12?a=!0:n<4&&(s=!0)):(r>11?o=!0:r<5&&(i=!0),n>10?a=!0:n<4&&(s=!0));let c=r+n-e,l=(1&r)==(t?1:0),h=1==(1&n);if(1===c)if(l){if(h)throw new D;o=!0}else{if(!h)throw new D;a=!0}else if(-1===c)if(l){if(h)throw new D;i=!0}else{if(!h)throw new D;s=!0}else{if(0!==c)throw new D;if(l){if(!h)throw new D;r<n?(i=!0,a=!0):(o=!0,s=!0)}else if(h)throw new D}if(i){if(o)throw new D;Rt.increment(this.getOddCounts(),this.getOddRoundingErrors())}if(o&&Rt.decrement(this.getOddCounts(),this.getOddRoundingErrors()),s){if(a)throw new D;Rt.increment(this.getEvenCounts(),this.getOddRoundingErrors())}a&&Rt.decrement(this.getEvenCounts(),this.getEvenRoundingErrors())}}ne.OUTSIDE_EVEN_TOTAL_SUBSET=[1,10,34,70,126],ne.INSIDE_ODD_TOTAL_SUBSET=[4,20,48,81],ne.OUTSIDE_GSUM=[0,161,961,2015,2715],ne.INSIDE_GSUM=[0,336,1036,1516],ne.OUTSIDE_ODD_WIDEST=[8,6,4,3,1],ne.INSIDE_ODD_WIDEST=[2,4,6,8],ne.FINDER_PATTERNS=[Int32Array.from([3,8,2,1]),Int32Array.from([3,5,5,1]),Int32Array.from([3,3,7,1]),Int32Array.from([3,1,9,1]),Int32Array.from([2,7,4,1]),Int32Array.from([2,5,6,1]),Int32Array.from([2,3,8,1]),Int32Array.from([1,5,7,1]),Int32Array.from([1,3,9,1])];class ie extends wt{constructor(t,e){super(),this.readers=[],this.verbose=!0===e;const r=t?t.get(C.POSSIBLE_FORMATS):null,n=t&&void 0!==t.get(C.ASSUME_CODE_39_CHECK_DIGIT);r?((r.includes(U.EAN_13)||r.includes(U.UPC_A)||r.includes(U.EAN_8)||r.includes(U.UPC_E))&&this.readers.push(new Mt(t)),r.includes(U.CODE_39)&&this.readers.push(new pt(n)),r.includes(U.CODE_128)&&this.readers.push(new mt),r.includes(U.ITF)&&this.readers.push(new At),r.includes(U.RSS_14)&&this.readers.push(new ne),r.includes(U.RSS_EXPANDED)&&this.readers.push(new ee(this.verbose))):(this.readers.push(new Mt(t)),this.readers.push(new pt),this.readers.push(new Mt(t)),this.readers.push(new mt),this.readers.push(new At),this.readers.push(new ne),this.readers.push(new ee(this.verbose)))}decodeRow(t,e,r){for(let n=0;n<this.readers.length;n++)try{return this.readers[n].decodeRow(t,e,r)}catch(t){}throw new D}reset(){this.readers.forEach((t=>t.reset()))}}class oe{constructor(t,e,r){this.ecCodewords=t,this.ecBlocks=[e],r&&this.ecBlocks.push(r)}getECCodewords(){return this.ecCodewords}getECBlocks(){return this.ecBlocks}}class se{constructor(t,e){this.count=t,this.dataCodewords=e}getCount(){return this.count}getDataCodewords(){return this.dataCodewords}}class ae{constructor(t,e,r,n,i,o){this.versionNumber=t,this.symbolSizeRows=e,this.symbolSizeColumns=r,this.dataRegionSizeRows=n,this.dataRegionSizeColumns=i,this.ecBlocks=o;let s=0;const a=o.getECCodewords(),c=o.getECBlocks();for(let t of c)s+=t.getCount()*(t.getDataCodewords()+a);this.totalCodewords=s}getVersionNumber(){return this.versionNumber}getSymbolSizeRows(){return this.symbolSizeRows}getSymbolSizeColumns(){return this.symbolSizeColumns}getDataRegionSizeRows(){return this.dataRegionSizeRows}getDataRegionSizeColumns(){return this.dataRegionSizeColumns}getTotalCodewords(){return this.totalCodewords}getECBlocks(){return this.ecBlocks}static getVersionForDimensions(t,e){if(0!=(1&t)||0!=(1&e))throw new E;for(let r of ae.VERSIONS)if(r.symbolSizeRows===t&&r.symbolSizeColumns===e)return r;throw new E}toString(){return""+this.versionNumber}static buildVersions(){return[new ae(1,10,10,8,8,new oe(5,new se(1,3))),new ae(2,12,12,10,10,new oe(7,new se(1,5))),new ae(3,14,14,12,12,new oe(10,new se(1,8))),new ae(4,16,16,14,14,new oe(12,new se(1,12))),new ae(5,18,18,16,16,new oe(14,new se(1,18))),new ae(6,20,20,18,18,new oe(18,new se(1,22))),new ae(7,22,22,20,20,new oe(20,new se(1,30))),new ae(8,24,24,22,22,new oe(24,new se(1,36))),new ae(9,26,26,24,24,new oe(28,new se(1,44))),new ae(10,32,32,14,14,new oe(36,new se(1,62))),new ae(11,36,36,16,16,new oe(42,new se(1,86))),new ae(12,40,40,18,18,new oe(48,new se(1,114))),new ae(13,44,44,20,20,new oe(56,new se(1,144))),new ae(14,48,48,22,22,new oe(68,new se(1,174))),new ae(15,52,52,24,24,new oe(42,new se(2,102))),new ae(16,64,64,14,14,new oe(56,new se(2,140))),new ae(17,72,72,16,16,new oe(36,new se(4,92))),new ae(18,80,80,18,18,new oe(48,new se(4,114))),new ae(19,88,88,20,20,new oe(56,new se(4,144))),new ae(20,96,96,22,22,new oe(68,new se(4,174))),new ae(21,104,104,24,24,new oe(56,new se(6,136))),new ae(22,120,120,18,18,new oe(68,new se(6,175))),new ae(23,132,132,20,20,new oe(62,new se(8,163))),new ae(24,144,144,22,22,new oe(62,new se(8,156),new se(2,155))),new ae(25,8,18,6,16,new oe(7,new se(1,5))),new ae(26,8,32,6,14,new oe(11,new se(1,10))),new ae(27,12,26,10,24,new oe(14,new se(1,16))),new ae(28,12,36,10,16,new oe(18,new se(1,22))),new ae(29,16,36,14,16,new oe(24,new se(1,32))),new ae(30,16,48,14,22,new oe(28,new se(1,49)))]}}ae.VERSIONS=ae.buildVersions();class ce{constructor(t){const e=t.getHeight();if(e<8||e>144||0!=(1&e))throw new E;this.version=ce.readVersion(t),this.mappingBitMatrix=this.extractDataRegion(t),this.readMappingMatrix=new N(this.mappingBitMatrix.getWidth(),this.mappingBitMatrix.getHeight())}getVersion(){return this.version}static readVersion(t){const e=t.getHeight(),r=t.getWidth();return ae.getVersionForDimensions(e,r)}readCodewords(){const t=new Int8Array(this.version.getTotalCodewords());let e=0,r=4,n=0;const i=this.mappingBitMatrix.getHeight(),o=this.mappingBitMatrix.getWidth();let s=!1,a=!1,c=!1,l=!1;do{if(r!==i||0!==n||s)if(r!==i-2||0!==n||0==(3&o)||a)if(r!==i+4||2!==n||0!=(7&o)||c)if(r!==i-2||0!==n||4!=(7&o)||l){do{r<i&&n>=0&&!this.readMappingMatrix.get(n,r)&&(t[e++]=255&this.readUtah(r,n,i,o)),r-=2,n+=2}while(r>=0&&n<o);r+=1,n+=3;do{r>=0&&n<o&&!this.readMappingMatrix.get(n,r)&&(t[e++]=255&this.readUtah(r,n,i,o)),r+=2,n-=2}while(r<i&&n>=0);r+=3,n+=1}else t[e++]=255&this.readCorner4(i,o),r-=2,n+=2,l=!0;else t[e++]=255&this.readCorner3(i,o),r-=2,n+=2,c=!0;else t[e++]=255&this.readCorner2(i,o),r-=2,n+=2,a=!0;else t[e++]=255&this.readCorner1(i,o),r-=2,n+=2,s=!0}while(r<i||n<o);if(e!==this.version.getTotalCodewords())throw new E;return t}readModule(t,e,r,n){return t<0&&(t+=r,e+=4-(r+4&7)),e<0&&(e+=n,t+=4-(n+4&7)),this.readMappingMatrix.set(e,t),this.mappingBitMatrix.get(e,t)}readUtah(t,e,r,n){let i=0;return this.readModule(t-2,e-2,r,n)&&(i|=1),i<<=1,this.readModule(t-2,e-1,r,n)&&(i|=1),i<<=1,this.readModule(t-1,e-2,r,n)&&(i|=1),i<<=1,this.readModule(t-1,e-1,r,n)&&(i|=1),i<<=1,this.readModule(t-1,e,r,n)&&(i|=1),i<<=1,this.readModule(t,e-2,r,n)&&(i|=1),i<<=1,this.readModule(t,e-1,r,n)&&(i|=1),i<<=1,this.readModule(t,e,r,n)&&(i|=1),i}readCorner1(t,e){let r=0;return this.readModule(t-1,0,t,e)&&(r|=1),r<<=1,this.readModule(t-1,1,t,e)&&(r|=1),r<<=1,this.readModule(t-1,2,t,e)&&(r|=1),r<<=1,this.readModule(0,e-2,t,e)&&(r|=1),r<<=1,this.readModule(0,e-1,t,e)&&(r|=1),r<<=1,this.readModule(1,e-1,t,e)&&(r|=1),r<<=1,this.readModule(2,e-1,t,e)&&(r|=1),r<<=1,this.readModule(3,e-1,t,e)&&(r|=1),r}readCorner2(t,e){let r=0;return this.readModule(t-3,0,t,e)&&(r|=1),r<<=1,this.readModule(t-2,0,t,e)&&(r|=1),r<<=1,this.readModule(t-1,0,t,e)&&(r|=1),r<<=1,this.readModule(0,e-4,t,e)&&(r|=1),r<<=1,this.readModule(0,e-3,t,e)&&(r|=1),r<<=1,this.readModule(0,e-2,t,e)&&(r|=1),r<<=1,this.readModule(0,e-1,t,e)&&(r|=1),r<<=1,this.readModule(1,e-1,t,e)&&(r|=1),r}readCorner3(t,e){let r=0;return this.readModule(t-1,0,t,e)&&(r|=1),r<<=1,this.readModule(t-1,e-1,t,e)&&(r|=1),r<<=1,this.readModule(0,e-3,t,e)&&(r|=1),r<<=1,this.readModule(0,e-2,t,e)&&(r|=1),r<<=1,this.readModule(0,e-1,t,e)&&(r|=1),r<<=1,this.readModule(1,e-3,t,e)&&(r|=1),r<<=1,this.readModule(1,e-2,t,e)&&(r|=1),r<<=1,this.readModule(1,e-1,t,e)&&(r|=1),r}readCorner4(t,e){let r=0;return this.readModule(t-3,0,t,e)&&(r|=1),r<<=1,this.readModule(t-2,0,t,e)&&(r|=1),r<<=1,this.readModule(t-1,0,t,e)&&(r|=1),r<<=1,this.readModule(0,e-2,t,e)&&(r|=1),r<<=1,this.readModule(0,e-1,t,e)&&(r|=1),r<<=1,this.readModule(1,e-1,t,e)&&(r|=1),r<<=1,this.readModule(2,e-1,t,e)&&(r|=1),r<<=1,this.readModule(3,e-1,t,e)&&(r|=1),r}extractDataRegion(t){const e=this.version.getSymbolSizeRows(),r=this.version.getSymbolSizeColumns();if(t.getHeight()!==e)throw new c("Dimension of bitMatrix must match the version size");const n=this.version.getDataRegionSizeRows(),i=this.version.getDataRegionSizeColumns(),o=e/n|0,s=r/i|0,a=new N(s*i,o*n);for(let e=0;e<o;++e){const r=e*n;for(let o=0;o<s;++o){const s=o*i;for(let c=0;c<n;++c){const l=e*(n+2)+1+c,h=r+c;for(let e=0;e<i;++e){const r=o*(i+2)+1+e;if(t.get(r,l)){const t=s+e;a.set(t,h)}}}}}return a}}class le{constructor(t,e){this.numDataCodewords=t,this.codewords=e}static getDataBlocks(t,e){const r=e.getECBlocks();let n=0;const i=r.getECBlocks();for(let t of i)n+=t.getCount();const o=new Array(n);let s=0;for(let t of i)for(let e=0;e<t.getCount();e++){const e=t.getDataCodewords(),n=r.getECCodewords()+e;o[s++]=new le(e,new Uint8Array(n))}const a=o[0].codewords.length-r.getECCodewords(),l=a-1;let h=0;for(let e=0;e<l;e++)for(let r=0;r<s;r++)o[r].codewords[e]=t[h++];const u=24===e.getVersionNumber(),d=u?8:s;for(let e=0;e<d;e++)o[e].codewords[a-1]=t[h++];const f=o[0].codewords.length;for(let e=a;e<f;e++)for(let r=0;r<s;r++){const n=u?(r+8)%s:r,i=u&&n>7?e-1:e;o[n].codewords[i]=t[h++]}if(h!==t.length)throw new c;return o}getNumDataCodewords(){return this.numDataCodewords}getCodewords(){return this.codewords}}class he{constructor(t){this.bytes=t,this.byteOffset=0,this.bitOffset=0}getBitOffset(){return this.bitOffset}getByteOffset(){return this.byteOffset}readBits(t){if(t<1||t>32||t>this.available())throw new c(""+t);let e=0,r=this.bitOffset,n=this.byteOffset;const i=this.bytes;if(r>0){const o=8-r,s=t<o?t:o,a=o-s,c=255>>8-s<<a;e=(i[n]&c)>>a,t-=s,r+=s,8===r&&(r=0,n++)}if(t>0){for(;t>=8;)e=e<<8|255&i[n],n++,t-=8;if(t>0){const o=8-t,s=255>>o<<o;e=e<<t|(i[n]&s)>>o,r+=t}}return this.bitOffset=r,this.byteOffset=n,e}available(){return 8*(this.bytes.length-this.byteOffset)-this.bitOffset}}!function(t){t[t.PAD_ENCODE=0]="PAD_ENCODE",t[t.ASCII_ENCODE=1]="ASCII_ENCODE",t[t.C40_ENCODE=2]="C40_ENCODE",t[t.TEXT_ENCODE=3]="TEXT_ENCODE",t[t.ANSIX12_ENCODE=4]="ANSIX12_ENCODE",t[t.EDIFACT_ENCODE=5]="EDIFACT_ENCODE",t[t.BASE256_ENCODE=6]="BASE256_ENCODE"}(V||(V={}));class ue{static decode(t){const e=new he(t),r=new y,n=new y,i=new Array;let o=V.ASCII_ENCODE;do{if(o===V.ASCII_ENCODE)o=this.decodeAsciiSegment(e,r,n);else{switch(o){case V.C40_ENCODE:this.decodeC40Segment(e,r);break;case V.TEXT_ENCODE:this.decodeTextSegment(e,r);break;case V.ANSIX12_ENCODE:this.decodeAnsiX12Segment(e,r);break;case V.EDIFACT_ENCODE:this.decodeEdifactSegment(e,r);break;case V.BASE256_ENCODE:this.decodeBase256Segment(e,r,i);break;default:throw new E}o=V.ASCII_ENCODE}}while(o!==V.PAD_ENCODE&&e.available()>0);return n.length()>0&&r.append(n.toString()),new j(t,r.toString(),0===i.length?null:i,null)}static decodeAsciiSegment(t,e,r){let n=!1;do{let i=t.readBits(8);if(0===i)throw new E;if(i<=128)return n&&(i+=128),e.append(String.fromCharCode(i-1)),V.ASCII_ENCODE;if(129===i)return V.PAD_ENCODE;if(i<=229){const t=i-130;t<10&&e.append("0"),e.append(""+t)}else switch(i){case 230:return V.C40_ENCODE;case 231:return V.BASE256_ENCODE;case 232:e.append(String.fromCharCode(29));break;case 233:case 234:case 241:break;case 235:n=!0;break;case 236:e.append("[)>
+05
+"),r.insert(0,"
+");break;case 237:e.append("[)>
+06
+"),r.insert(0,"
+");break;case 238:return V.ANSIX12_ENCODE;case 239:return V.TEXT_ENCODE;case 240:return V.EDIFACT_ENCODE;default:if(254!==i||0!==t.available())throw new E}}while(t.available()>0);return V.ASCII_ENCODE}static decodeC40Segment(t,e){let r=!1;const n=[];let i=0;do{if(8===t.available())return;const o=t.readBits(8);if(254===o)return;this.parseTwoBytes(o,t.readBits(8),n);for(let t=0;t<3;t++){const o=n[t];switch(i){case 0:if(o<3)i=o+1;else{if(!(o<this.C40_BASIC_SET_CHARS.length))throw new E;{const t=this.C40_BASIC_SET_CHARS[o];r?(e.append(String.fromCharCode(t.charCodeAt(0)+128)),r=!1):e.append(t)}}break;case 1:r?(e.append(String.fromCharCode(o+128)),r=!1):e.append(String.fromCharCode(o)),i=0;break;case 2:if(o<this.C40_SHIFT2_SET_CHARS.length){const t=this.C40_SHIFT2_SET_CHARS[o];r?(e.append(String.fromCharCode(t.charCodeAt(0)+128)),r=!1):e.append(t)}else switch(o){case 27:e.append(String.fromCharCode(29));break;case 30:r=!0;break;default:throw new E}i=0;break;case 3:r?(e.append(String.fromCharCode(o+224)),r=!1):e.append(String.fromCharCode(o+96)),i=0;break;default:throw new E}}}while(t.available()>0)}static decodeTextSegment(t,e){let r=!1,n=[],i=0;do{if(8===t.available())return;const o=t.readBits(8);if(254===o)return;this.parseTwoBytes(o,t.readBits(8),n);for(let t=0;t<3;t++){const o=n[t];switch(i){case 0:if(o<3)i=o+1;else{if(!(o<this.TEXT_BASIC_SET_CHARS.length))throw new E;{const t=this.TEXT_BASIC_SET_CHARS[o];r?(e.append(String.fromCharCode(t.charCodeAt(0)+128)),r=!1):e.append(t)}}break;case 1:r?(e.append(String.fromCharCode(o+128)),r=!1):e.append(String.fromCharCode(o)),i=0;break;case 2:if(o<this.TEXT_SHIFT2_SET_CHARS.length){const t=this.TEXT_SHIFT2_SET_CHARS[o];r?(e.append(String.fromCharCode(t.charCodeAt(0)+128)),r=!1):e.append(t)}else switch(o){case 27:e.append(String.fromCharCode(29));break;case 30:r=!0;break;default:throw new E}i=0;break;case 3:if(!(o<this.TEXT_SHIFT3_SET_CHARS.length))throw new E;{const t=this.TEXT_SHIFT3_SET_CHARS[o];r?(e.append(String.fromCharCode(t.charCodeAt(0)+128)),r=!1):e.append(t),i=0}break;default:throw new E}}}while(t.available()>0)}static decodeAnsiX12Segment(t,e){const r=[];do{if(8===t.available())return;const n=t.readBits(8);if(254===n)return;this.parseTwoBytes(n,t.readBits(8),r);for(let t=0;t<3;t++){const n=r[t];switch(n){case 0:e.append("\r");break;case 1:e.append("*");break;case 2:e.append(">");break;case 3:e.append(" ");break;default:if(n<14)e.append(String.fromCharCode(n+44));else{if(!(n<40))throw new E;e.append(String.fromCharCode(n+51))}}}}while(t.available()>0)}static parseTwoBytes(t,e,r){let n=(t<<8)+e-1,i=Math.floor(n/1600);r[0]=i,n-=1600*i,i=Math.floor(n/40),r[1]=i,r[2]=n-40*i}static decodeEdifactSegment(t,e){do{if(t.available()<=16)return;for(let r=0;r<4;r++){let r=t.readBits(6);if(31===r){const e=8-t.getBitOffset();return void(8!==e&&t.readBits(e))}0==(32&r)&&(r|=64),e.append(String.fromCharCode(r))}}while(t.available()>0)}static decodeBase256Segment(t,e,r){let n=1+t.getByteOffset();const i=this.unrandomize255State(t.readBits(8),n++);let o;if(o=0===i?t.available()/8|0:i<250?i:250*(i-249)+this.unrandomize255State(t.readBits(8),n++),o<0)throw new E;const s=new Uint8Array(o);for(let e=0;e<o;e++){if(t.available()<8)throw new E;s[e]=this.unrandomize255State(t.readBits(8),n++)}r.push(s);try{e.append(_.decode(s,T.ISO88591))}catch(t){throw new $("Platform does not support required encoding: "+t.message)}}static unrandomize255State(t,e){const r=t-(149*e%255+1);return r>=0?r:r+256}}ue.C40_BASIC_SET_CHARS=["*","*","*"," ","0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"],ue.C40_SHIFT2_SET_CHARS=["!",'"',"#","$","%","&","'","(",")","*","+",",","-",".","/",":",";","<","=",">","?","@","[","\\","]","^","_"],ue.TEXT_BASIC_SET_CHARS=["*","*","*"," ","0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"],ue.TEXT_SHIFT2_SET_CHARS=ue.C40_SHIFT2_SET_CHARS,ue.TEXT_SHIFT3_SET_CHARS=["`","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","{","|","}","~",String.fromCharCode(127)];class de{constructor(){this.rsDecoder=new tt(q.DATA_MATRIX_FIELD_256)}decode(t){const e=new ce(t),r=e.getVersion(),n=e.readCodewords(),i=le.getDataBlocks(n,r);let o=0;for(let t of i)o+=t.getNumDataCodewords();const s=new Uint8Array(o),a=i.length;for(let t=0;t<a;t++){const e=i[t],r=e.getCodewords(),n=e.getNumDataCodewords();this.correctErrors(r,n);for(let e=0;e<n;e++)s[e*a+t]=r[e]}return ue.decode(s)}correctErrors(t,e){const r=new Int32Array(t);try{this.rsDecoder.decode(r,t.length-e)}catch(t){throw new h}for(let n=0;n<e;n++)t[n]=r[n]}}class fe{constructor(t){this.image=t,this.rectangleDetector=new at(this.image)}detect(){const t=this.rectangleDetector.detect();let e=this.detectSolid1(t);if(e=this.detectSolid2(e),e[3]=this.correctTopRight(e),!e[3])throw new D;e=this.shiftToModuleCenter(e);const r=e[0],n=e[1],i=e[2],o=e[3];let s=this.transitionsBetween(r,o)+1,a=this.transitionsBetween(i,o)+1;1==(1&s)&&(s+=1),1==(1&a)&&(a+=1),4*s<7*a&&4*a<7*s&&(s=a=Math.max(s,a));let c=fe.sampleGrid(this.image,r,n,i,o,s,a);return new ot(c,[r,n,i,o])}static shiftPoint(t,e,r){let n=(e.getX()-t.getX())/(r+1),i=(e.getY()-t.getY())/(r+1);return new it(t.getX()+n,t.getY()+i)}static moveAway(t,e,r){let n=t.getX(),i=t.getY();return n<e?n-=1:n+=1,i<r?i-=1:i+=1,new it(n,i)}detectSolid1(t){let e=t[0],r=t[1],n=t[3],i=t[2],o=this.transitionsBetween(e,r),s=this.transitionsBetween(r,n),a=this.transitionsBetween(n,i),c=this.transitionsBetween(i,e),l=o,h=[i,e,r,n];return l>s&&(l=s,h[0]=e,h[1]=r,h[2]=n,h[3]=i),l>a&&(l=a,h[0]=r,h[1]=n,h[2]=i,h[3]=e),l>c&&(h[0]=n,h[1]=i,h[2]=e,h[3]=r),h}detectSolid2(t){let e=t[0],r=t[1],n=t[2],i=t[3],o=this.transitionsBetween(e,i),s=fe.shiftPoint(r,n,4*(o+1)),a=fe.shiftPoint(n,r,4*(o+1));return this.transitionsBetween(s,e)<this.transitionsBetween(a,i)?(t[0]=e,t[1]=r,t[2]=n,t[3]=i):(t[0]=r,t[1]=n,t[2]=i,t[3]=e),t}correctTopRight(t){let e=t[0],r=t[1],n=t[2],i=t[3],o=this.transitionsBetween(e,i),s=this.transitionsBetween(r,i),a=fe.shiftPoint(e,r,4*(s+1)),c=fe.shiftPoint(n,r,4*(o+1));o=this.transitionsBetween(a,i),s=this.transitionsBetween(c,i);let l=new it(i.getX()+(n.getX()-r.getX())/(o+1),i.getY()+(n.getY()-r.getY())/(o+1)),h=new it(i.getX()+(e.getX()-r.getX())/(s+1),i.getY()+(e.getY()-r.getY())/(s+1));return this.isValid(l)?this.isValid(h)?this.transitionsBetween(a,l)+this.transitionsBetween(c,l)>this.transitionsBetween(a,h)+this.transitionsBetween(c,h)?l:h:l:this.isValid(h)?h:null}shiftToModuleCenter(t){let e=t[0],r=t[1],n=t[2],i=t[3],o=this.transitionsBetween(e,i)+1,s=this.transitionsBetween(n,i)+1,a=fe.shiftPoint(e,r,4*s),c=fe.shiftPoint(n,r,4*o);o=this.transitionsBetween(a,i)+1,s=this.transitionsBetween(c,i)+1,1==(1&o)&&(o+=1),1==(1&s)&&(s+=1);let l,h,u=(e.getX()+r.getX()+n.getX()+i.getX())/4,d=(e.getY()+r.getY()+n.getY()+i.getY())/4;return e=fe.moveAway(e,u,d),r=fe.moveAway(r,u,d),n=fe.moveAway(n,u,d),i=fe.moveAway(i,u,d),a=fe.shiftPoint(e,r,4*s),a=fe.shiftPoint(a,i,4*o),l=fe.shiftPoint(r,e,4*s),l=fe.shiftPoint(l,n,4*o),c=fe.shiftPoint(n,i,4*s),c=fe.shiftPoint(c,r,4*o),h=fe.shiftPoint(i,n,4*s),h=fe.shiftPoint(h,e,4*o),[a,l,c,h]}isValid(t){return t.getX()>=0&&t.getX()<this.image.getWidth()&&t.getY()>0&&t.getY()<this.image.getHeight()}static sampleGrid(t,e,r,n,i,o,s){return ut.getInstance().sampleGrid(t,o,s,.5,.5,o-.5,.5,o-.5,s-.5,.5,s-.5,e.getX(),e.getY(),i.getX(),i.getY(),n.getX(),n.getY(),r.getX(),r.getY())}transitionsBetween(t,e){let r=Math.trunc(t.getX()),n=Math.trunc(t.getY()),i=Math.trunc(e.getX()),o=Math.trunc(e.getY()),s=Math.abs(o-n)>Math.abs(i-r);if(s){let t=r;r=n,n=t,t=i,i=o,o=t}let a=Math.abs(i-r),c=Math.abs(o-n),l=-a/2,h=n<o?1:-1,u=r<i?1:-1,d=0,f=this.image.get(s?n:r,s?r:n);for(let t=r,e=n;t!==i;t+=u){let r=this.image.get(s?e:t,s?t:e);if(r!==f&&(d++,f=r),l+=c,l>0){if(e===o)break;e+=h,l-=a}}return d}}class ge{constructor(){this.decoder=new de}decode(t,e=null){let r,n;if(null!=e&&e.has(C.PURE_BARCODE)){const e=ge.extractPureBits(t.getBlackMatrix());r=this.decoder.decode(e),n=ge.NO_POINTS}else{const e=new fe(t.getBlackMatrix()).detect();r=this.decoder.decode(e.getBits()),n=e.getPoints()}const i=r.getRawBytes(),o=new x(r.getText(),i,8*i.length,n,U.DATA_MATRIX,d.currentTimeMillis()),s=r.getByteSegments();null!=s&&o.putMetadata(W.BYTE_SEGMENTS,s);const a=r.getECLevel();return null!=a&&o.putMetadata(W.ERROR_CORRECTION_LEVEL,a),o}reset(){}static extractPureBits(t){const e=t.getTopLeftOnBit(),r=t.getBottomRightOnBit();if(null==e||null==r)throw new D;const n=this.moduleSize(e,t);let i=e[1];const o=r[1];let s=e[0];const a=(r[0]-s+1)/n,c=(o-i+1)/n;if(a<=0||c<=0)throw new D;const l=n/2;i+=l,s+=l;const h=new N(a,c);for(let e=0;e<c;e++){const r=i+e*n;for(let i=0;i<a;i++)t.get(s+i*n,r)&&h.set(i,e)}return h}static moduleSize(t,e){const r=e.getWidth();let n=t[0];const i=t[1];for(;n<r&&e.get(n,i);)n++;if(n===r)throw new D;const o=n-t[0];if(0===o)throw new D;return o}}ge.NO_POINTS=[];!function(t){t[t.L=0]="L",t[t.M=1]="M",t[t.Q=2]="Q",t[t.H=3]="H"}(z||(z={}));class we{constructor(t,e,r){this.value=t,this.stringValue=e,this.bits=r,we.FOR_BITS.set(r,this),we.FOR_VALUE.set(t,this)}getValue(){return this.value}getBits(){return this.bits}static fromString(t){switch(t){case"L":return we.L;case"M":return we.M;case"Q":return we.Q;case"H":return we.H;default:throw new a(t+"not available")}}toString(){return this.stringValue}equals(t){if(!(t instanceof we))return!1;const e=t;return this.value===e.value}static forBits(t){if(t<0||t>=we.FOR_BITS.size)throw new c;return we.FOR_BITS.get(t)}}we.FOR_BITS=new Map,we.FOR_VALUE=new Map,we.L=new we(z.L,"L",1),we.M=new we(z.M,"M",0),we.Q=new we(z.Q,"Q",3),we.H=new we(z.H,"H",2);class me{constructor(t){this.errorCorrectionLevel=we.forBits(t>>3&3),this.dataMask=7&t}static numBitsDiffering(t,e){return m.bitCount(t^e)}static decodeFormatInformation(t,e){const r=me.doDecodeFormatInformation(t,e);return null!==r?r:me.doDecodeFormatInformation(t^me.FORMAT_INFO_MASK_QR,e^me.FORMAT_INFO_MASK_QR)}static doDecodeFormatInformation(t,e){let r=Number.MAX_SAFE_INTEGER,n=0;for(const i of me.FORMAT_INFO_DECODE_LOOKUP){const o=i[0];if(o===t||o===e)return new me(i[1]);let s=me.numBitsDiffering(t,o);s<r&&(n=i[1],r=s),t!==e&&(s=me.numBitsDiffering(e,o),s<r&&(n=i[1],r=s))}return r<=3?new me(n):null}getErrorCorrectionLevel(){return this.errorCorrectionLevel}getDataMask(){return this.dataMask}hashCode(){return this.errorCorrectionLevel.getBits()<<3|this.dataMask}equals(t){if(!(t instanceof me))return!1;const e=t;return this.errorCorrectionLevel===e.errorCorrectionLevel&&this.dataMask===e.dataMask}}me.FORMAT_INFO_MASK_QR=21522,me.FORMAT_INFO_DECODE_LOOKUP=[Int32Array.from([21522,0]),Int32Array.from([20773,1]),Int32Array.from([24188,2]),Int32Array.from([23371,3]),Int32Array.from([17913,4]),Int32Array.from([16590,5]),Int32Array.from([20375,6]),Int32Array.from([19104,7]),Int32Array.from([30660,8]),Int32Array.from([29427,9]),Int32Array.from([32170,10]),Int32Array.from([30877,11]),Int32Array.from([26159,12]),Int32Array.from([25368,13]),Int32Array.from([27713,14]),Int32Array.from([26998,15]),Int32Array.from([5769,16]),Int32Array.from([5054,17]),Int32Array.from([7399,18]),Int32Array.from([6608,19]),Int32Array.from([1890,20]),Int32Array.from([597,21]),Int32Array.from([3340,22]),Int32Array.from([2107,23]),Int32Array.from([13663,24]),Int32Array.from([12392,25]),Int32Array.from([16177,26]),Int32Array.from([14854,27]),Int32Array.from([9396,28]),Int32Array.from([8579,29]),Int32Array.from([11994,30]),Int32Array.from([11245,31])];class pe{constructor(t,...e){this.ecCodewordsPerBlock=t,this.ecBlocks=e}getECCodewordsPerBlock(){return this.ecCodewordsPerBlock}getNumBlocks(){let t=0;const e=this.ecBlocks;for(const r of e)t+=r.getCount();return t}getTotalECCodewords(){return this.ecCodewordsPerBlock*this.getNumBlocks()}getECBlocks(){return this.ecBlocks}}class Ae{constructor(t,e){this.count=t,this.dataCodewords=e}getCount(){return this.count}getDataCodewords(){return this.dataCodewords}}class Ce{constructor(t,e,...r){this.versionNumber=t,this.alignmentPatternCenters=e,this.ecBlocks=r;let n=0;const i=r[0].getECCodewordsPerBlock(),o=r[0].getECBlocks();for(const t of o)n+=t.getCount()*(t.getDataCodewords()+i);this.totalCodewords=n}getVersionNumber(){return this.versionNumber}getAlignmentPatternCenters(){return this.alignmentPatternCenters}getTotalCodewords(){return this.totalCodewords}getDimensionForVersion(){return 17+4*this.versionNumber}getECBlocksForLevel(t){return this.ecBlocks[t.getValue()]}static getProvisionalVersionForDimension(t){if(t%4!=1)throw new E;try{return this.getVersionForNumber((t-17)/4)}catch(t){throw new E}}static getVersionForNumber(t){if(t<1||t>40)throw new c;return Ce.VERSIONS[t-1]}static decodeVersionInformation(t){let e=Number.MAX_SAFE_INTEGER,r=0;for(let n=0;n<Ce.VERSION_DECODE_INFO.length;n++){const i=Ce.VERSION_DECODE_INFO[n];if(i===t)return Ce.getVersionForNumber(n+7);const o=me.numBitsDiffering(t,i);o<e&&(r=n+7,e=o)}return e<=3?Ce.getVersionForNumber(r):null}buildFunctionPattern(){const t=this.getDimensionForVersion(),e=new N(t);e.setRegion(0,0,9,9),e.setRegion(t-8,0,8,9),e.setRegion(0,t-8,9,8);const r=this.alignmentPatternCenters.length;for(let t=0;t<r;t++){const n=this.alignmentPatternCenters[t]-2;for(let i=0;i<r;i++)0===t&&(0===i||i===r-1)||t===r-1&&0===i||e.setRegion(this.alignmentPatternCenters[i]-2,n,5,5)}return e.setRegion(6,9,1,t-17),e.setRegion(9,6,t-17,1),this.versionNumber>6&&(e.setRegion(t-11,0,3,6),e.setRegion(0,t-11,6,3)),e}toString(){return""+this.versionNumber}}Ce.VERSION_DECODE_INFO=Int32Array.from([31892,34236,39577,42195,48118,51042,55367,58893,63784,68472,70749,76311,79154,84390,87683,92361,96236,102084,102881,110507,110734,117786,119615,126325,127568,133589,136944,141498,145311,150283,152622,158308,161089,167017]),Ce.VERSIONS=[new Ce(1,new Int32Array(0),new pe(7,new Ae(1,19)),new pe(10,new Ae(1,16)),new pe(13,new Ae(1,13)),new pe(17,new Ae(1,9))),new Ce(2,Int32Array.from([6,18]),new pe(10,new Ae(1,34)),new pe(16,new Ae(1,28)),new pe(22,new Ae(1,22)),new pe(28,new Ae(1,16))),new Ce(3,Int32Array.from([6,22]),new pe(15,new Ae(1,55)),new pe(26,new Ae(1,44)),new pe(18,new Ae(2,17)),new pe(22,new Ae(2,13))),new Ce(4,Int32Array.from([6,26]),new pe(20,new Ae(1,80)),new pe(18,new Ae(2,32)),new pe(26,new Ae(2,24)),new pe(16,new Ae(4,9))),new Ce(5,Int32Array.from([6,30]),new pe(26,new Ae(1,108)),new pe(24,new Ae(2,43)),new pe(18,new Ae(2,15),new Ae(2,16)),new pe(22,new Ae(2,11),new Ae(2,12))),new Ce(6,Int32Array.from([6,34]),new pe(18,new Ae(2,68)),new pe(16,new Ae(4,27)),new pe(24,new Ae(4,19)),new pe(28,new Ae(4,15))),new Ce(7,Int32Array.from([6,22,38]),new pe(20,new Ae(2,78)),new pe(18,new Ae(4,31)),new pe(18,new Ae(2,14),new Ae(4,15)),new pe(26,new Ae(4,13),new Ae(1,14))),new Ce(8,Int32Array.from([6,24,42]),new pe(24,new Ae(2,97)),new pe(22,new Ae(2,38),new Ae(2,39)),new pe(22,new Ae(4,18),new Ae(2,19)),new pe(26,new Ae(4,14),new Ae(2,15))),new Ce(9,Int32Array.from([6,26,46]),new pe(30,new Ae(2,116)),new pe(22,new Ae(3,36),new Ae(2,37)),new pe(20,new Ae(4,16),new Ae(4,17)),new pe(24,new Ae(4,12),new Ae(4,13))),new Ce(10,Int32Array.from([6,28,50]),new pe(18,new Ae(2,68),new Ae(2,69)),new pe(26,new Ae(4,43),new Ae(1,44)),new pe(24,new Ae(6,19),new Ae(2,20)),new pe(28,new Ae(6,15),new Ae(2,16))),new Ce(11,Int32Array.from([6,30,54]),new pe(20,new Ae(4,81)),new pe(30,new Ae(1,50),new Ae(4,51)),new pe(28,new Ae(4,22),new Ae(4,23)),new pe(24,new Ae(3,12),new Ae(8,13))),new Ce(12,Int32Array.from([6,32,58]),new pe(24,new Ae(2,92),new Ae(2,93)),new pe(22,new Ae(6,36),new Ae(2,37)),new pe(26,new Ae(4,20),new Ae(6,21)),new pe(28,new Ae(7,14),new Ae(4,15))),new Ce(13,Int32Array.from([6,34,62]),new pe(26,new Ae(4,107)),new pe(22,new Ae(8,37),new Ae(1,38)),new pe(24,new Ae(8,20),new Ae(4,21)),new pe(22,new Ae(12,11),new Ae(4,12))),new Ce(14,Int32Array.from([6,26,46,66]),new pe(30,new Ae(3,115),new Ae(1,116)),new pe(24,new Ae(4,40),new Ae(5,41)),new pe(20,new Ae(11,16),new Ae(5,17)),new pe(24,new Ae(11,12),new Ae(5,13))),new Ce(15,Int32Array.from([6,26,48,70]),new pe(22,new Ae(5,87),new Ae(1,88)),new pe(24,new Ae(5,41),new Ae(5,42)),new pe(30,new Ae(5,24),new Ae(7,25)),new pe(24,new Ae(11,12),new Ae(7,13))),new Ce(16,Int32Array.from([6,26,50,74]),new pe(24,new Ae(5,98),new Ae(1,99)),new pe(28,new Ae(7,45),new Ae(3,46)),new pe(24,new Ae(15,19),new Ae(2,20)),new pe(30,new Ae(3,15),new Ae(13,16))),new Ce(17,Int32Array.from([6,30,54,78]),new pe(28,new Ae(1,107),new Ae(5,108)),new pe(28,new Ae(10,46),new Ae(1,47)),new pe(28,new Ae(1,22),new Ae(15,23)),new pe(28,new Ae(2,14),new Ae(17,15))),new Ce(18,Int32Array.from([6,30,56,82]),new pe(30,new Ae(5,120),new Ae(1,121)),new pe(26,new Ae(9,43),new Ae(4,44)),new pe(28,new Ae(17,22),new Ae(1,23)),new pe(28,new Ae(2,14),new Ae(19,15))),new Ce(19,Int32Array.from([6,30,58,86]),new pe(28,new Ae(3,113),new Ae(4,114)),new pe(26,new Ae(3,44),new Ae(11,45)),new pe(26,new Ae(17,21),new Ae(4,22)),new pe(26,new Ae(9,13),new Ae(16,14))),new Ce(20,Int32Array.from([6,34,62,90]),new pe(28,new Ae(3,107),new Ae(5,108)),new pe(26,new Ae(3,41),new Ae(13,42)),new pe(30,new Ae(15,24),new Ae(5,25)),new pe(28,new Ae(15,15),new Ae(10,16))),new Ce(21,Int32Array.from([6,28,50,72,94]),new pe(28,new Ae(4,116),new Ae(4,117)),new pe(26,new Ae(17,42)),new pe(28,new Ae(17,22),new Ae(6,23)),new pe(30,new Ae(19,16),new Ae(6,17))),new Ce(22,Int32Array.from([6,26,50,74,98]),new pe(28,new Ae(2,111),new Ae(7,112)),new pe(28,new Ae(17,46)),new pe(30,new Ae(7,24),new Ae(16,25)),new pe(24,new Ae(34,13))),new Ce(23,Int32Array.from([6,30,54,78,102]),new pe(30,new Ae(4,121),new Ae(5,122)),new pe(28,new Ae(4,47),new Ae(14,48)),new pe(30,new Ae(11,24),new Ae(14,25)),new pe(30,new Ae(16,15),new Ae(14,16))),new Ce(24,Int32Array.from([6,28,54,80,106]),new pe(30,new Ae(6,117),new Ae(4,118)),new pe(28,new Ae(6,45),new Ae(14,46)),new pe(30,new Ae(11,24),new Ae(16,25)),new pe(30,new Ae(30,16),new Ae(2,17))),new Ce(25,Int32Array.from([6,32,58,84,110]),new pe(26,new Ae(8,106),new Ae(4,107)),new pe(28,new Ae(8,47),new Ae(13,48)),new pe(30,new Ae(7,24),new Ae(22,25)),new pe(30,new Ae(22,15),new Ae(13,16))),new Ce(26,Int32Array.from([6,30,58,86,114]),new pe(28,new Ae(10,114),new Ae(2,115)),new pe(28,new Ae(19,46),new Ae(4,47)),new pe(28,new Ae(28,22),new Ae(6,23)),new pe(30,new Ae(33,16),new Ae(4,17))),new Ce(27,Int32Array.from([6,34,62,90,118]),new pe(30,new Ae(8,122),new Ae(4,123)),new pe(28,new Ae(22,45),new Ae(3,46)),new pe(30,new Ae(8,23),new Ae(26,24)),new pe(30,new Ae(12,15),new Ae(28,16))),new Ce(28,Int32Array.from([6,26,50,74,98,122]),new pe(30,new Ae(3,117),new Ae(10,118)),new pe(28,new Ae(3,45),new Ae(23,46)),new pe(30,new Ae(4,24),new Ae(31,25)),new pe(30,new Ae(11,15),new Ae(31,16))),new Ce(29,Int32Array.from([6,30,54,78,102,126]),new pe(30,new Ae(7,116),new Ae(7,117)),new pe(28,new Ae(21,45),new Ae(7,46)),new pe(30,new Ae(1,23),new Ae(37,24)),new pe(30,new Ae(19,15),new Ae(26,16))),new Ce(30,Int32Array.from([6,26,52,78,104,130]),new pe(30,new Ae(5,115),new Ae(10,116)),new pe(28,new Ae(19,47),new Ae(10,48)),new pe(30,new Ae(15,24),new Ae(25,25)),new pe(30,new Ae(23,15),new Ae(25,16))),new Ce(31,Int32Array.from([6,30,56,82,108,134]),new pe(30,new Ae(13,115),new Ae(3,116)),new pe(28,new Ae(2,46),new Ae(29,47)),new pe(30,new Ae(42,24),new Ae(1,25)),new pe(30,new Ae(23,15),new Ae(28,16))),new Ce(32,Int32Array.from([6,34,60,86,112,138]),new pe(30,new Ae(17,115)),new pe(28,new Ae(10,46),new Ae(23,47)),new pe(30,new Ae(10,24),new Ae(35,25)),new pe(30,new Ae(19,15),new Ae(35,16))),new Ce(33,Int32Array.from([6,30,58,86,114,142]),new pe(30,new Ae(17,115),new Ae(1,116)),new pe(28,new Ae(14,46),new Ae(21,47)),new pe(30,new Ae(29,24),new Ae(19,25)),new pe(30,new Ae(11,15),new Ae(46,16))),new Ce(34,Int32Array.from([6,34,62,90,118,146]),new pe(30,new Ae(13,115),new Ae(6,116)),new pe(28,new Ae(14,46),new Ae(23,47)),new pe(30,new Ae(44,24),new Ae(7,25)),new pe(30,new Ae(59,16),new Ae(1,17))),new Ce(35,Int32Array.from([6,30,54,78,102,126,150]),new pe(30,new Ae(12,121),new Ae(7,122)),new pe(28,new Ae(12,47),new Ae(26,48)),new pe(30,new Ae(39,24),new Ae(14,25)),new pe(30,new Ae(22,15),new Ae(41,16))),new Ce(36,Int32Array.from([6,24,50,76,102,128,154]),new pe(30,new Ae(6,121),new Ae(14,122)),new pe(28,new Ae(6,47),new Ae(34,48)),new pe(30,new Ae(46,24),new Ae(10,25)),new pe(30,new Ae(2,15),new Ae(64,16))),new Ce(37,Int32Array.from([6,28,54,80,106,132,158]),new pe(30,new Ae(17,122),new Ae(4,123)),new pe(28,new Ae(29,46),new Ae(14,47)),new pe(30,new Ae(49,24),new Ae(10,25)),new pe(30,new Ae(24,15),new Ae(46,16))),new Ce(38,Int32Array.from([6,32,58,84,110,136,162]),new pe(30,new Ae(4,122),new Ae(18,123)),new pe(28,new Ae(13,46),new Ae(32,47)),new pe(30,new Ae(48,24),new Ae(14,25)),new pe(30,new Ae(42,15),new Ae(32,16))),new Ce(39,Int32Array.from([6,26,54,82,110,138,166]),new pe(30,new Ae(20,117),new Ae(4,118)),new pe(28,new Ae(40,47),new Ae(7,48)),new pe(30,new Ae(43,24),new Ae(22,25)),new pe(30,new Ae(10,15),new Ae(67,16))),new Ce(40,Int32Array.from([6,30,58,86,114,142,170]),new pe(30,new Ae(19,118),new Ae(6,119)),new pe(28,new Ae(18,47),new Ae(31,48)),new pe(30,new Ae(34,24),new Ae(34,25)),new pe(30,new Ae(20,15),new Ae(61,16)))],function(t){t[t.DATA_MASK_000=0]="DATA_MASK_000",t[t.DATA_MASK_001=1]="DATA_MASK_001",t[t.DATA_MASK_010=2]="DATA_MASK_010",t[t.DATA_MASK_011=3]="DATA_MASK_011",t[t.DATA_MASK_100=4]="DATA_MASK_100",t[t.DATA_MASK_101=5]="DATA_MASK_101",t[t.DATA_MASK_110=6]="DATA_MASK_110",t[t.DATA_MASK_111=7]="DATA_MASK_111"}(G||(G={}));class Ee{constructor(t,e){this.value=t,this.isMasked=e}unmaskBitMatrix(t,e){for(let r=0;r<e;r++)for(let n=0;n<e;n++)this.isMasked(r,n)&&t.flip(n,r)}}Ee.values=new Map([[G.DATA_MASK_000,new Ee(G.DATA_MASK_000,((t,e)=>0==(t+e&1)))],[G.DATA_MASK_001,new Ee(G.DATA_MASK_001,((t,e)=>0==(1&t)))],[G.DATA_MASK_010,new Ee(G.DATA_MASK_010,((t,e)=>e%3==0))],[G.DATA_MASK_011,new Ee(G.DATA_MASK_011,((t,e)=>(t+e)%3==0))],[G.DATA_MASK_100,new Ee(G.DATA_MASK_100,((t,e)=>0==(Math.floor(t/2)+Math.floor(e/3)&1)))],[G.DATA_MASK_101,new Ee(G.DATA_MASK_101,((t,e)=>t*e%6==0))],[G.DATA_MASK_110,new Ee(G.DATA_MASK_110,((t,e)=>t*e%6<3))],[G.DATA_MASK_111,new Ee(G.DATA_MASK_111,((t,e)=>0==(t+e+t*e%3&1)))]]);class Ie{constructor(t){const e=t.getHeight();if(e<21||1!=(3&e))throw new E;this.bitMatrix=t}readFormatInformation(){if(null!==this.parsedFormatInfo&&void 0!==this.parsedFormatInfo)return this.parsedFormatInfo;let t=0;for(let e=0;e<6;e++)t=this.copyBit(e,8,t);t=this.copyBit(7,8,t),t=this.copyBit(8,8,t),t=this.copyBit(8,7,t);for(let e=5;e>=0;e--)t=this.copyBit(8,e,t);const e=this.bitMatrix.getHeight();let r=0;const n=e-7;for(let t=e-1;t>=n;t--)r=this.copyBit(8,t,r);for(let t=e-8;t<e;t++)r=this.copyBit(t,8,r);if(this.parsedFormatInfo=me.decodeFormatInformation(t,r),null!==this.parsedFormatInfo)return this.parsedFormatInfo;throw new E}readVersion(){if(null!==this.parsedVersion&&void 0!==this.parsedVersion)return this.parsedVersion;const t=this.bitMatrix.getHeight(),e=Math.floor((t-17)/4);if(e<=6)return Ce.getVersionForNumber(e);let r=0;const n=t-11;for(let e=5;e>=0;e--)for(let i=t-9;i>=n;i--)r=this.copyBit(i,e,r);let i=Ce.decodeVersionInformation(r);if(null!==i&&i.getDimensionForVersion()===t)return this.parsedVersion=i,i;r=0;for(let e=5;e>=0;e--)for(let i=t-9;i>=n;i--)r=this.copyBit(e,i,r);if(i=Ce.decodeVersionInformation(r),null!==i&&i.getDimensionForVersion()===t)return this.parsedVersion=i,i;throw new E}copyBit(t,e,r){return(this.isMirror?this.bitMatrix.get(e,t):this.bitMatrix.get(t,e))?r<<1|1:r<<1}readCodewords(){const t=this.readFormatInformation(),e=this.readVersion(),r=Ee.values.get(t.getDataMask()),n=this.bitMatrix.getHeight();r.unmaskBitMatrix(this.bitMatrix,n);const i=e.buildFunctionPattern();let o=!0;const s=new Uint8Array(e.getTotalCodewords());let a=0,c=0,l=0;for(let t=n-1;t>0;t-=2){6===t&&t--;for(let e=0;e<n;e++){const r=o?n-1-e:e;for(let e=0;e<2;e++)i.get(t-e,r)||(l++,c<<=1,this.bitMatrix.get(t-e,r)&&(c|=1),8===l&&(s[a++]=c,l=0,c=0))}o=!o}if(a!==e.getTotalCodewords())throw new E;return s}remask(){if(null===this.parsedFormatInfo)return;const t=Ee.values[this.parsedFormatInfo.getDataMask()],e=this.bitMatrix.getHeight();t.unmaskBitMatrix(this.bitMatrix,e)}setMirror(t){this.parsedVersion=null,this.parsedFormatInfo=null,this.isMirror=t}mirror(){const t=this.bitMatrix;for(let e=0,r=t.getWidth();e<r;e++)for(let r=e+1,n=t.getHeight();r<n;r++)t.get(e,r)!==t.get(r,e)&&(t.flip(r,e),t.flip(e,r))}}class Se{constructor(t,e){this.numDataCodewords=t,this.codewords=e}static getDataBlocks(t,e,r){if(t.length!==e.getTotalCodewords())throw new c;const n=e.getECBlocksForLevel(r);let i=0;const o=n.getECBlocks();for(const t of o)i+=t.getCount();const s=new Array(i);let a=0;for(const t of o)for(let e=0;e<t.getCount();e++){const e=t.getDataCodewords(),r=n.getECCodewordsPerBlock()+e;s[a++]=new Se(e,new Uint8Array(r))}const l=s[0].codewords.length;let h=s.length-1;for(;h>=0&&s[h].codewords.length!==l;)h--;h++;const u=l-n.getECCodewordsPerBlock();let d=0;for(let e=0;e<u;e++)for(let r=0;r<a;r++)s[r].codewords[e]=t[d++];for(let e=h;e<a;e++)s[e].codewords[u]=t[d++];const f=s[0].codewords.length;for(let e=u;e<f;e++)for(let r=0;r<a;r++){const n=r<h?e:e+1;s[r].codewords[n]=t[d++]}return s}getNumDataCodewords(){return this.numDataCodewords}getCodewords(){return this.codewords}}!function(t){t[t.TERMINATOR=0]="TERMINATOR",t[t.NUMERIC=1]="NUMERIC",t[t.ALPHANUMERIC=2]="ALPHANUMERIC",t[t.STRUCTURED_APPEND=3]="STRUCTURED_APPEND",t[t.BYTE=4]="BYTE",t[t.ECI=5]="ECI",t[t.KANJI=6]="KANJI",t[t.FNC1_FIRST_POSITION=7]="FNC1_FIRST_POSITION",t[t.FNC1_SECOND_POSITION=8]="FNC1_SECOND_POSITION",t[t.HANZI=9]="HANZI"}(Y||(Y={}));class _e{constructor(t,e,r,n){this.value=t,this.stringValue=e,this.characterCountBitsForVersions=r,this.bits=n,_e.FOR_BITS.set(n,this),_e.FOR_VALUE.set(t,this)}static forBits(t){const e=_e.FOR_BITS.get(t);if(void 0===e)throw new c;return e}getCharacterCountBits(t){const e=t.getVersionNumber();let r;return r=e<=9?0:e<=26?1:2,this.characterCountBitsForVersions[r]}getValue(){return this.value}getBits(){return this.bits}equals(t){if(!(t instanceof _e))return!1;const e=t;return this.value===e.value}toString(){return this.stringValue}}_e.FOR_BITS=new Map,_e.FOR_VALUE=new Map,_e.TERMINATOR=new _e(Y.TERMINATOR,"TERMINATOR",Int32Array.from([0,0,0]),0),_e.NUMERIC=new _e(Y.NUMERIC,"NUMERIC",Int32Array.from([10,12,14]),1),_e.ALPHANUMERIC=new _e(Y.ALPHANUMERIC,"ALPHANUMERIC",Int32Array.from([9,11,13]),2),_e.STRUCTURED_APPEND=new _e(Y.STRUCTURED_APPEND,"STRUCTURED_APPEND",Int32Array.from([0,0,0]),3),_e.BYTE=new _e(Y.BYTE,"BYTE",Int32Array.from([8,16,16]),4),_e.ECI=new _e(Y.ECI,"ECI",Int32Array.from([0,0,0]),7),_e.KANJI=new _e(Y.KANJI,"KANJI",Int32Array.from([8,10,12]),8),_e.FNC1_FIRST_POSITION=new _e(Y.FNC1_FIRST_POSITION,"FNC1_FIRST_POSITION",Int32Array.from([0,0,0]),5),_e.FNC1_SECOND_POSITION=new _e(Y.FNC1_SECOND_POSITION,"FNC1_SECOND_POSITION",Int32Array.from([0,0,0]),9),_e.HANZI=new _e(Y.HANZI,"HANZI",Int32Array.from([8,10,12]),13);class Te{static decode(t,e,r,n){const i=new he(t);let o=new y;const s=new Array;let a=-1,c=-1;try{let t,r=null,l=!1;do{if(i.available()<4)t=_e.TERMINATOR;else{const e=i.readBits(4);t=_e.forBits(e)}switch(t){case _e.TERMINATOR:break;case _e.FNC1_FIRST_POSITION:case _e.FNC1_SECOND_POSITION:l=!0;break;case _e.STRUCTURED_APPEND:if(i.available()<16)throw new E;a=i.readBits(8),c=i.readBits(8);break;case _e.ECI:const h=Te.parseECIValue(i);if(r=I.getCharacterSetECIByValue(h),null===r)throw new E;break;case _e.HANZI:const u=i.readBits(4),d=i.readBits(t.getCharacterCountBits(e));u===Te.GB2312_SUBSET&&Te.decodeHanziSegment(i,o,d);break;default:const f=i.readBits(t.getCharacterCountBits(e));switch(t){case _e.NUMERIC:Te.decodeNumericSegment(i,o,f);break;case _e.ALPHANUMERIC:Te.decodeAlphanumericSegment(i,o,f,l);break;case _e.BYTE:Te.decodeByteSegment(i,o,f,r,s,n);break;case _e.KANJI:Te.decodeKanjiSegment(i,o,f);break;default:throw new E}}}while(t!==_e.TERMINATOR)}catch(t){throw new E}return new j(t,o.toString(),0===s.length?null:s,null===r?null:r.toString(),a,c)}static decodeHanziSegment(t,e,r){if(13*r>t.available())throw new E;const n=new Uint8Array(2*r);let i=0;for(;r>0;){const e=t.readBits(13);let o=e/96<<8&4294967295|e%96;o+=o<959?41377:42657,n[i]=o>>8&255,n[i+1]=255&o,i+=2,r--}try{e.append(_.decode(n,T.GB2312))}catch(t){throw new E(t)}}static decodeKanjiSegment(t,e,r){if(13*r>t.available())throw new E;const n=new Uint8Array(2*r);let i=0;for(;r>0;){const e=t.readBits(13);let o=e/192<<8&4294967295|e%192;o+=o<7936?33088:49472,n[i]=o>>8,n[i+1]=o,i+=2,r--}try{e.append(_.decode(n,T.SHIFT_JIS))}catch(t){throw new E(t)}}static decodeByteSegment(t,e,r,n,i,o){if(8*r>t.available())throw new E;const s=new Uint8Array(r);for(let e=0;e<r;e++)s[e]=t.readBits(8);let a;a=null===n?T.guessEncoding(s,o):n.getName();try{e.append(_.decode(s,a))}catch(t){throw new E(t)}i.push(s)}static toAlphaNumericChar(t){if(t>=Te.ALPHANUMERIC_CHARS.length)throw new E;return Te.ALPHANUMERIC_CHARS[t]}static decodeAlphanumericSegment(t,e,r,n){const i=e.length();for(;r>1;){if(t.available()<11)throw new E;const n=t.readBits(11);e.append(Te.toAlphaNumericChar(Math.floor(n/45))),e.append(Te.toAlphaNumericChar(n%45)),r-=2}if(1===r){if(t.available()<6)throw new E;e.append(Te.toAlphaNumericChar(t.readBits(6)))}if(n)for(let t=i;t<e.length();t++)"%"===e.charAt(t)&&(t<e.length()-1&&"%"===e.charAt(t+1)?e.deleteCharAt(t+1):e.setCharAt(t,String.fromCharCode(29)))}static decodeNumericSegment(t,e,r){for(;r>=3;){if(t.available()<10)throw new E;const n=t.readBits(10);if(n>=1e3)throw new E;e.append(Te.toAlphaNumericChar(Math.floor(n/100))),e.append(Te.toAlphaNumericChar(Math.floor(n/10)%10)),e.append(Te.toAlphaNumericChar(n%10)),r-=3}if(2===r){if(t.available()<7)throw new E;const r=t.readBits(7);if(r>=100)throw new E;e.append(Te.toAlphaNumericChar(Math.floor(r/10))),e.append(Te.toAlphaNumericChar(r%10))}else if(1===r){if(t.available()<4)throw new E;const r=t.readBits(4);if(r>=10)throw new E;e.append(Te.toAlphaNumericChar(r))}}static parseECIValue(t){const e=t.readBits(8);if(0==(128&e))return 127&e;if(128==(192&e))return(63&e)<<8&4294967295|t.readBits(8);if(192==(224&e))return(31&e)<<16&4294967295|t.readBits(16);throw new E}}Te.ALPHANUMERIC_CHARS="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:",Te.GB2312_SUBSET=1;class ye{constructor(t){this.mirrored=t}isMirrored(){return this.mirrored}applyMirroredCorrection(t){if(!this.mirrored||null===t||t.length<3)return;const e=t[0];t[0]=t[2],t[2]=e}}class Ne{constructor(){this.rsDecoder=new tt(q.QR_CODE_FIELD_256)}decodeBooleanArray(t,e){return this.decodeBitMatrix(N.parseFromBooleanArray(t),e)}decodeBitMatrix(t,e){const r=new Ie(t);let n=null;try{return this.decodeBitMatrixParser(r,e)}catch(t){n=t}try{r.remask(),r.setMirror(!0),r.readVersion(),r.readFormatInformation(),r.mirror();const t=this.decodeBitMatrixParser(r,e);return t.setOther(new ye(!0)),t}catch(t){if(null!==n)throw n;throw t}}decodeBitMatrixParser(t,e){const r=t.readVersion(),n=t.readFormatInformation().getErrorCorrectionLevel(),i=t.readCodewords(),o=Se.getDataBlocks(i,r,n);let s=0;for(const t of o)s+=t.getNumDataCodewords();const a=new Uint8Array(s);let c=0;for(const t of o){const e=t.getCodewords(),r=t.getNumDataCodewords();this.correctErrors(e,r);for(let t=0;t<r;t++)a[c++]=e[t]}return Te.decode(a,r,n,e)}correctErrors(t,e){const r=new Int32Array(t);try{this.rsDecoder.decode(r,t.length-e)}catch(t){throw new h}for(let n=0;n<e;n++)t[n]=r[n]}}class De extends it{constructor(t,e,r){super(t,e),this.estimatedModuleSize=r}aboutEquals(t,e,r){if(Math.abs(e-this.getY())<=t&&Math.abs(r-this.getX())<=t){const e=Math.abs(t-this.estimatedModuleSize);return e<=1||e<=this.estimatedModuleSize}return!1}combineEstimate(t,e,r){const n=(this.getX()+e)/2,i=(this.getY()+t)/2,o=(this.estimatedModuleSize+r)/2;return new De(n,i,o)}}class Me{constructor(t,e,r,n,i,o,s){this.image=t,this.startX=e,this.startY=r,this.width=n,this.height=i,this.moduleSize=o,this.resultPointCallback=s,this.possibleCenters=[],this.crossCheckStateCount=new Int32Array(3)}find(){const t=this.startX,e=this.height,r=t+this.width,n=this.startY+e/2,i=new Int32Array(3),o=this.image;for(let s=0;s<e;s++){const e=n+(0==(1&s)?Math.floor((s+1)/2):-Math.floor((s+1)/2));i[0]=0,i[1]=0,i[2]=0;let a=t;for(;a<r&&!o.get(a,e);)a++;let c=0;for(;a<r;){if(o.get(a,e))if(1===c)i[1]++;else if(2===c){if(this.foundPatternCross(i)){const t=this.handlePossibleCenter(i,e,a);if(null!==t)return t}i[0]=i[2],i[1]=1,i[2]=0,c=1}else i[++c]++;else 1===c&&c++,i[c]++;a++}if(this.foundPatternCross(i)){const t=this.handlePossibleCenter(i,e,r);if(null!==t)return t}}if(0!==this.possibleCenters.length)return this.possibleCenters[0];throw new D}static centerFromEnd(t,e){return e-t[2]-t[1]/2}foundPatternCross(t){const e=this.moduleSize,r=e/2;for(let n=0;n<3;n++)if(Math.abs(e-t[n])>=r)return!1;return!0}crossCheckVertical(t,e,r,n){const i=this.image,o=i.getHeight(),s=this.crossCheckStateCount;s[0]=0,s[1]=0,s[2]=0;let a=t;for(;a>=0&&i.get(e,a)&&s[1]<=r;)s[1]++,a--;if(a<0||s[1]>r)return NaN;for(;a>=0&&!i.get(e,a)&&s[0]<=r;)s[0]++,a--;if(s[0]>r)return NaN;for(a=t+1;a<o&&i.get(e,a)&&s[1]<=r;)s[1]++,a++;if(a===o||s[1]>r)return NaN;for(;a<o&&!i.get(e,a)&&s[2]<=r;)s[2]++,a++;if(s[2]>r)return NaN;const c=s[0]+s[1]+s[2];return 5*Math.abs(c-n)>=2*n?NaN:this.foundPatternCross(s)?Me.centerFromEnd(s,a):NaN}handlePossibleCenter(t,e,r){const n=t[0]+t[1]+t[2],i=Me.centerFromEnd(t,r),o=this.crossCheckVertical(e,i,2*t[1],n);if(!isNaN(o)){const e=(t[0]+t[1]+t[2])/3;for(const t of this.possibleCenters)if(t.aboutEquals(e,o,i))return t.combineEstimate(o,i,e);const r=new De(i,o,e);this.possibleCenters.push(r),null!==this.resultPointCallback&&void 0!==this.resultPointCallback&&this.resultPointCallback.foundPossibleResultPoint(r)}return null}}class Re extends it{constructor(t,e,r,n){super(t,e),this.estimatedModuleSize=r,this.count=n,void 0===n&&(this.count=1)}getEstimatedModuleSize(){return this.estimatedModuleSize}getCount(){return this.count}aboutEquals(t,e,r){if(Math.abs(e-this.getY())<=t&&Math.abs(r-this.getX())<=t){const e=Math.abs(t-this.estimatedModuleSize);return e<=1||e<=this.estimatedModuleSize}return!1}combineEstimate(t,e,r){const n=this.count+1,i=(this.count*this.getX()+e)/n,o=(this.count*this.getY()+t)/n,s=(this.count*this.estimatedModuleSize+r)/n;return new Re(i,o,s,n)}}class Oe{constructor(t){this.bottomLeft=t[0],this.topLeft=t[1],this.topRight=t[2]}getBottomLeft(){return this.bottomLeft}getTopLeft(){return this.topLeft}getTopRight(){return this.topRight}}class be{constructor(t,e){this.image=t,this.resultPointCallback=e,this.possibleCenters=[],this.crossCheckStateCount=new Int32Array(5),this.resultPointCallback=e}getImage(){return this.image}getPossibleCenters(){return this.possibleCenters}find(t){const e=null!=t&&void 0!==t.get(C.TRY_HARDER),r=null!=t&&void 0!==t.get(C.PURE_BARCODE),n=this.image,i=n.getHeight(),o=n.getWidth();let s=Math.floor(3*i/(4*be.MAX_MODULES));(s<be.MIN_SKIP||e)&&(s=be.MIN_SKIP);let a=!1;const c=new Int32Array(5);for(let t=s-1;t<i&&!a;t+=s){c[0]=0,c[1]=0,c[2]=0,c[3]=0,c[4]=0;let e=0;for(let i=0;i<o;i++)if(n.get(i,t))1==(1&e)&&e++,c[e]++;else if(0==(1&e))if(4===e)if(be.foundPatternCross(c)){if(!0!==this.handlePossibleCenter(c,t,i,r)){c[0]=c[2],c[1]=c[3],c[2]=c[4],c[3]=1,c[4]=0,e=3;continue}if(s=2,!0===this.hasSkipped)a=this.haveMultiplyConfirmedCenters();else{const e=this.findRowSkip();e>c[2]&&(t+=e-c[2]-s,i=o-1)}e=0,c[0]=0,c[1]=0,c[2]=0,c[3]=0,c[4]=0}else c[0]=c[2],c[1]=c[3],c[2]=c[4],c[3]=1,c[4]=0,e=3;else c[++e]++;else c[e]++;be.foundPatternCross(c)&&!0===this.handlePossibleCenter(c,t,o,r)&&(s=c[0],this.hasSkipped&&(a=this.haveMultiplyConfirmedCenters()))}const l=this.selectBestPatterns();return it.orderBestPatterns(l),new Oe(l)}static centerFromEnd(t,e){return e-t[4]-t[3]-t[2]/2}static foundPatternCross(t){let e=0;for(let r=0;r<5;r++){const n=t[r];if(0===n)return!1;e+=n}if(e<7)return!1;const r=e/7,n=r/2;return Math.abs(r-t[0])<n&&Math.abs(r-t[1])<n&&Math.abs(3*r-t[2])<3*n&&Math.abs(r-t[3])<n&&Math.abs(r-t[4])<n}getCrossCheckStateCount(){const t=this.crossCheckStateCount;return t[0]=0,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t}crossCheckDiagonal(t,e,r,n){const i=this.getCrossCheckStateCount();let o=0;const s=this.image;for(;t>=o&&e>=o&&s.get(e-o,t-o);)i[2]++,o++;if(t<o||e<o)return!1;for(;t>=o&&e>=o&&!s.get(e-o,t-o)&&i[1]<=r;)i[1]++,o++;if(t<o||e<o||i[1]>r)return!1;for(;t>=o&&e>=o&&s.get(e-o,t-o)&&i[0]<=r;)i[0]++,o++;if(i[0]>r)return!1;const a=s.getHeight(),c=s.getWidth();for(o=1;t+o<a&&e+o<c&&s.get(e+o,t+o);)i[2]++,o++;if(t+o>=a||e+o>=c)return!1;for(;t+o<a&&e+o<c&&!s.get(e+o,t+o)&&i[3]<r;)i[3]++,o++;if(t+o>=a||e+o>=c||i[3]>=r)return!1;for(;t+o<a&&e+o<c&&s.get(e+o,t+o)&&i[4]<r;)i[4]++,o++;if(i[4]>=r)return!1;const l=i[0]+i[1]+i[2]+i[3]+i[4];return Math.abs(l-n)<2*n&&be.foundPatternCross(i)}crossCheckVertical(t,e,r,n){const i=this.image,o=i.getHeight(),s=this.getCrossCheckStateCount();let a=t;for(;a>=0&&i.get(e,a);)s[2]++,a--;if(a<0)return NaN;for(;a>=0&&!i.get(e,a)&&s[1]<=r;)s[1]++,a--;if(a<0||s[1]>r)return NaN;for(;a>=0&&i.get(e,a)&&s[0]<=r;)s[0]++,a--;if(s[0]>r)return NaN;for(a=t+1;a<o&&i.get(e,a);)s[2]++,a++;if(a===o)return NaN;for(;a<o&&!i.get(e,a)&&s[3]<r;)s[3]++,a++;if(a===o||s[3]>=r)return NaN;for(;a<o&&i.get(e,a)&&s[4]<r;)s[4]++,a++;if(s[4]>=r)return NaN;const c=s[0]+s[1]+s[2]+s[3]+s[4];return 5*Math.abs(c-n)>=2*n?NaN:be.foundPatternCross(s)?be.centerFromEnd(s,a):NaN}crossCheckHorizontal(t,e,r,n){const i=this.image,o=i.getWidth(),s=this.getCrossCheckStateCount();let a=t;for(;a>=0&&i.get(a,e);)s[2]++,a--;if(a<0)return NaN;for(;a>=0&&!i.get(a,e)&&s[1]<=r;)s[1]++,a--;if(a<0||s[1]>r)return NaN;for(;a>=0&&i.get(a,e)&&s[0]<=r;)s[0]++,a--;if(s[0]>r)return NaN;for(a=t+1;a<o&&i.get(a,e);)s[2]++,a++;if(a===o)return NaN;for(;a<o&&!i.get(a,e)&&s[3]<r;)s[3]++,a++;if(a===o||s[3]>=r)return NaN;for(;a<o&&i.get(a,e)&&s[4]<r;)s[4]++,a++;if(s[4]>=r)return NaN;const c=s[0]+s[1]+s[2]+s[3]+s[4];return 5*Math.abs(c-n)>=n?NaN:be.foundPatternCross(s)?be.centerFromEnd(s,a):NaN}handlePossibleCenter(t,e,r,n){const i=t[0]+t[1]+t[2]+t[3]+t[4];let o=be.centerFromEnd(t,r),s=this.crossCheckVertical(e,Math.floor(o),t[2],i);if(!isNaN(s)&&(o=this.crossCheckHorizontal(Math.floor(o),Math.floor(s),t[2],i),!isNaN(o)&&(!n||this.crossCheckDiagonal(Math.floor(s),Math.floor(o),t[2],i)))){const t=i/7;let e=!1;const r=this.possibleCenters;for(let n=0,i=r.length;n<i;n++){const i=r[n];if(i.aboutEquals(t,s,o)){r[n]=i.combineEstimate(s,o,t),e=!0;break}}if(!e){const e=new Re(o,s,t);r.push(e),null!==this.resultPointCallback&&void 0!==this.resultPointCallback&&this.resultPointCallback.foundPossibleResultPoint(e)}return!0}return!1}findRowSkip(){if(this.possibleCenters.length<=1)return 0;let t=null;for(const e of this.possibleCenters)if(e.getCount()>=be.CENTER_QUORUM){if(null!=t)return this.hasSkipped=!0,Math.floor((Math.abs(t.getX()-e.getX())-Math.abs(t.getY()-e.getY()))/2);t=e}return 0}haveMultiplyConfirmedCenters(){let t=0,e=0;const r=this.possibleCenters.length;for(const r of this.possibleCenters)r.getCount()>=be.CENTER_QUORUM&&(t++,e+=r.getEstimatedModuleSize());if(t<3)return!1;const n=e/r;let i=0;for(const t of this.possibleCenters)i+=Math.abs(t.getEstimatedModuleSize()-n);return i<=.05*e}selectBestPatterns(){const t=this.possibleCenters.length;if(t<3)throw new D;const e=this.possibleCenters;let r;if(t>3){let n=0,i=0;for(const t of this.possibleCenters){const e=t.getEstimatedModuleSize();n+=e,i+=e*e}r=n/t;let o=Math.sqrt(i/t-r*r);e.sort(((t,e)=>{const n=Math.abs(e.getEstimatedModuleSize()-r),i=Math.abs(t.getEstimatedModuleSize()-r);return n<i?-1:n>i?1:0}));const s=Math.max(.2*r,o);for(let t=0;t<e.length&&e.length>3;t++){const n=e[t];Math.abs(n.getEstimatedModuleSize()-r)>s&&(e.splice(t,1),t--)}}if(e.length>3){let t=0;for(const r of e)t+=r.getEstimatedModuleSize();r=t/e.length,e.sort(((t,e)=>{if(e.getCount()===t.getCount()){const n=Math.abs(e.getEstimatedModuleSize()-r),i=Math.abs(t.getEstimatedModuleSize()-r);return n<i?1:n>i?-1:0}return e.getCount()-t.getCount()})),e.splice(3)}return[e[0],e[1],e[2]]}}be.CENTER_QUORUM=2,be.MIN_SKIP=3,be.MAX_MODULES=57;class Be{constructor(t){this.image=t}getImage(){return this.image}getResultPointCallback(){return this.resultPointCallback}detect(t){this.resultPointCallback=null==t?null:t.get(C.NEED_RESULT_POINT_CALLBACK);const e=new be(this.image,this.resultPointCallback).find(t);return this.processFinderPatternInfo(e)}processFinderPatternInfo(t){const e=t.getTopLeft(),r=t.getTopRight(),n=t.getBottomLeft(),i=this.calculateModuleSize(e,r,n);if(i<1)throw new D("No pattern found in proccess finder.");const o=Be.computeDimension(e,r,n,i),s=Ce.getProvisionalVersionForDimension(o),a=s.getDimensionForVersion()-7;let c=null;if(s.getAlignmentPatternCenters().length>0){const t=r.getX()-e.getX()+n.getX(),o=r.getY()-e.getY()+n.getY(),s=1-3/a,l=Math.floor(e.getX()+s*(t-e.getX())),h=Math.floor(e.getY()+s*(o-e.getY()));for(let t=4;t<=16;t<<=1)try{c=this.findAlignmentInRegion(i,l,h,t);break}catch(t){if(!(t instanceof D))throw t}}const l=Be.createTransform(e,r,n,c,o),h=Be.sampleGrid(this.image,l,o);let u;return u=null===c?[n,e,r]:[n,e,r,c],new ot(h,u)}static createTransform(t,e,r,n,i){const o=i-3.5;let s,a,c,l;return null!==n?(s=n.getX(),a=n.getY(),c=o-3,l=c):(s=e.getX()-t.getX()+r.getX(),a=e.getY()-t.getY()+r.getY(),c=o,l=o),lt.quadrilateralToQuadrilateral(3.5,3.5,o,3.5,c,l,3.5,o,t.getX(),t.getY(),e.getX(),e.getY(),s,a,r.getX(),r.getY())}static sampleGrid(t,e,r){return ut.getInstance().sampleGridWithTransform(t,r,r,e)}static computeDimension(t,e,r,n){const i=rt.round(it.distance(t,e)/n),o=rt.round(it.distance(t,r)/n);let s=Math.floor((i+o)/2)+7;switch(3&s){case 0:s++;break;case 2:s--;break;case 3:throw new D("Dimensions could be not found.")}return s}calculateModuleSize(t,e,r){return(this.calculateModuleSizeOneWay(t,e)+this.calculateModuleSizeOneWay(t,r))/2}calculateModuleSizeOneWay(t,e){const r=this.sizeOfBlackWhiteBlackRunBothWays(Math.floor(t.getX()),Math.floor(t.getY()),Math.floor(e.getX()),Math.floor(e.getY())),n=this.sizeOfBlackWhiteBlackRunBothWays(Math.floor(e.getX()),Math.floor(e.getY()),Math.floor(t.getX()),Math.floor(t.getY()));return isNaN(r)?n/7:isNaN(n)?r/7:(r+n)/14}sizeOfBlackWhiteBlackRunBothWays(t,e,r,n){let i=this.sizeOfBlackWhiteBlackRun(t,e,r,n),o=1,s=t-(r-t);s<0?(o=t/(t-s),s=0):s>=this.image.getWidth()&&(o=(this.image.getWidth()-1-t)/(s-t),s=this.image.getWidth()-1);let a=Math.floor(e-(n-e)*o);return o=1,a<0?(o=e/(e-a),a=0):a>=this.image.getHeight()&&(o=(this.image.getHeight()-1-e)/(a-e),a=this.image.getHeight()-1),s=Math.floor(t+(s-t)*o),i+=this.sizeOfBlackWhiteBlackRun(t,e,s,a),i-1}sizeOfBlackWhiteBlackRun(t,e,r,n){const i=Math.abs(n-e)>Math.abs(r-t);if(i){let i=t;t=e,e=i,i=r,r=n,n=i}const o=Math.abs(r-t),s=Math.abs(n-e);let a=-o/2;const c=t<r?1:-1,l=e<n?1:-1;let h=0;const u=r+c;for(let r=t,d=e;r!==u;r+=c){const c=i?d:r,u=i?r:d;if(1===h===this.image.get(c,u)){if(2===h)return rt.distance(r,d,t,e);h++}if(a+=s,a>0){if(d===n)break;d+=l,a-=o}}return 2===h?rt.distance(r+c,n,t,e):NaN}findAlignmentInRegion(t,e,r,n){const i=Math.floor(n*t),o=Math.max(0,e-i),s=Math.min(this.image.getWidth()-1,e+i);if(s-o<3*t)throw new D("Alignment top exceeds estimated module size.");const a=Math.max(0,r-i),c=Math.min(this.image.getHeight()-1,r+i);if(c-a<3*t)throw new D("Alignment bottom exceeds estimated module size.");return new Me(this.image,o,a,s-o,c-a,t,this.resultPointCallback).find()}}class Le{constructor(){this.decoder=new Ne}getDecoder(){return this.decoder}decode(t,e){let r,n;if(null!=e&&void 0!==e.get(C.PURE_BARCODE)){const i=Le.extractPureBits(t.getBlackMatrix());r=this.decoder.decodeBitMatrix(i,e),n=Le.NO_POINTS}else{const i=new Be(t.getBlackMatrix()).detect(e);r=this.decoder.decodeBitMatrix(i.getBits(),e),n=i.getPoints()}r.getOther()instanceof ye&&r.getOther().applyMirroredCorrection(n);const i=new x(r.getText(),r.getRawBytes(),void 0,n,U.QR_CODE,void 0),o=r.getByteSegments();null!==o&&i.putMetadata(W.BYTE_SEGMENTS,o);const s=r.getECLevel();return null!==s&&i.putMetadata(W.ERROR_CORRECTION_LEVEL,s),r.hasStructuredAppend()&&(i.putMetadata(W.STRUCTURED_APPEND_SEQUENCE,r.getStructuredAppendSequenceNumber()),i.putMetadata(W.STRUCTURED_APPEND_PARITY,r.getStructuredAppendParity())),i}reset(){}static extractPureBits(t){const e=t.getTopLeftOnBit(),r=t.getBottomRightOnBit();if(null===e||null===r)throw new D;const n=this.moduleSize(e,t);let i=e[1],o=r[1],s=e[0],a=r[0];if(s>=a||i>=o)throw new D;if(o-i!=a-s&&(a=s+(o-i),a>=t.getWidth()))throw new D;const c=Math.round((a-s+1)/n),l=Math.round((o-i+1)/n);if(c<=0||l<=0)throw new D;if(l!==c)throw new D;const h=Math.floor(n/2);i+=h,s+=h;const u=s+Math.floor((c-1)*n)-a;if(u>0){if(u>h)throw new D;s-=u}const d=i+Math.floor((l-1)*n)-o;if(d>0){if(d>h)throw new D;i-=d}const f=new N(c,l);for(let e=0;e<l;e++){const r=i+Math.floor(e*n);for(let i=0;i<c;i++)t.get(s+Math.floor(i*n),r)&&f.set(i,e)}return f}static moduleSize(t,e){const r=e.getHeight(),n=e.getWidth();let i=t[0],o=t[1],s=!0,a=0;for(;i<n&&o<r;){if(s!==e.get(i,o)){if(5==++a)break;s=!s}i++,o++}if(i===n||o===r)throw new D;return(i-t[0])/7}}Le.NO_POINTS=new Array;class Pe{PDF417Common(){}static getBitCountSum(t){return rt.sum(t)}static toIntArray(t){if(null==t||!t.length)return Pe.EMPTY_INT_ARRAY;const e=new Int32Array(t.length);let r=0;for(const n of t)e[r++]=n;return e}static getCodeword(t){const e=w.binarySearch(Pe.SYMBOL_TABLE,262143&t);return e<0?-1:(Pe.CODEWORD_TABLE[e]-1)%Pe.NUMBER_OF_CODEWORDS}}Pe.NUMBER_OF_CODEWORDS=929,Pe.MAX_CODEWORDS_IN_BARCODE=Pe.NUMBER_OF_CODEWORDS-1,Pe.MIN_ROWS_IN_BARCODE=3,Pe.MAX_ROWS_IN_BARCODE=90,Pe.MODULES_IN_CODEWORD=17,Pe.MODULES_IN_STOP_PATTERN=18,Pe.BARS_IN_MODULE=8,Pe.EMPTY_INT_ARRAY=new Int32Array([]),Pe.SYMBOL_TABLE=Int32Array.from([66142,66170,66206,66236,66290,66292,66350,66382,66396,66454,66470,66476,66594,66600,66614,66626,66628,66632,66640,66654,66662,66668,66682,66690,66718,66720,66748,66758,66776,66798,66802,66804,66820,66824,66832,66846,66848,66876,66880,66936,66950,66956,66968,66992,67006,67022,67036,67042,67044,67048,67062,67118,67150,67164,67214,67228,67256,67294,67322,67350,67366,67372,67398,67404,67416,67438,67474,67476,67490,67492,67496,67510,67618,67624,67650,67656,67664,67678,67686,67692,67706,67714,67716,67728,67742,67744,67772,67782,67788,67800,67822,67826,67828,67842,67848,67870,67872,67900,67904,67960,67974,67992,68016,68030,68046,68060,68066,68068,68072,68086,68104,68112,68126,68128,68156,68160,68216,68336,68358,68364,68376,68400,68414,68448,68476,68494,68508,68536,68546,68548,68552,68560,68574,68582,68588,68654,68686,68700,68706,68708,68712,68726,68750,68764,68792,68802,68804,68808,68816,68830,68838,68844,68858,68878,68892,68920,68976,68990,68994,68996,69e3,69008,69022,69024,69052,69062,69068,69080,69102,69106,69108,69142,69158,69164,69190,69208,69230,69254,69260,69272,69296,69310,69326,69340,69386,69394,69396,69410,69416,69430,69442,69444,69448,69456,69470,69478,69484,69554,69556,69666,69672,69698,69704,69712,69726,69754,69762,69764,69776,69790,69792,69820,69830,69836,69848,69870,69874,69876,69890,69918,69920,69948,69952,70008,70022,70040,70064,70078,70094,70108,70114,70116,70120,70134,70152,70174,70176,70264,70384,70412,70448,70462,70496,70524,70542,70556,70584,70594,70600,70608,70622,70630,70636,70664,70672,70686,70688,70716,70720,70776,70896,71136,71180,71192,71216,71230,71264,71292,71360,71416,71452,71480,71536,71550,71554,71556,71560,71568,71582,71584,71612,71622,71628,71640,71662,71726,71732,71758,71772,71778,71780,71784,71798,71822,71836,71864,71874,71880,71888,71902,71910,71916,71930,71950,71964,71992,72048,72062,72066,72068,72080,72094,72096,72124,72134,72140,72152,72174,72178,72180,72206,72220,72248,72304,72318,72416,72444,72456,72464,72478,72480,72508,72512,72568,72588,72600,72624,72638,72654,72668,72674,72676,72680,72694,72726,72742,72748,72774,72780,72792,72814,72838,72856,72880,72894,72910,72924,72930,72932,72936,72950,72966,72972,72984,73008,73022,73056,73084,73102,73116,73144,73156,73160,73168,73182,73190,73196,73210,73226,73234,73236,73250,73252,73256,73270,73282,73284,73296,73310,73318,73324,73346,73348,73352,73360,73374,73376,73404,73414,73420,73432,73454,73498,73518,73522,73524,73550,73564,73570,73572,73576,73590,73800,73822,73858,73860,73872,73886,73888,73916,73944,73970,73972,73992,74014,74016,74044,74048,74104,74118,74136,74160,74174,74210,74212,74216,74230,74244,74256,74270,74272,74360,74480,74502,74508,74544,74558,74592,74620,74638,74652,74680,74690,74696,74704,74726,74732,74782,74784,74812,74992,75232,75288,75326,75360,75388,75456,75512,75576,75632,75646,75650,75652,75664,75678,75680,75708,75718,75724,75736,75758,75808,75836,75840,75896,76016,76256,76736,76824,76848,76862,76896,76924,76992,77048,77296,77340,77368,77424,77438,77536,77564,77572,77576,77584,77600,77628,77632,77688,77702,77708,77720,77744,77758,77774,77788,77870,77902,77916,77922,77928,77966,77980,78008,78018,78024,78032,78046,78060,78074,78094,78136,78192,78206,78210,78212,78224,78238,78240,78268,78278,78284,78296,78322,78324,78350,78364,78448,78462,78560,78588,78600,78622,78624,78652,78656,78712,78726,78744,78768,78782,78798,78812,78818,78820,78824,78838,78862,78876,78904,78960,78974,79072,79100,79296,79352,79368,79376,79390,79392,79420,79424,79480,79600,79628,79640,79664,79678,79712,79740,79772,79800,79810,79812,79816,79824,79838,79846,79852,79894,79910,79916,79942,79948,79960,79982,79988,80006,80024,80048,80062,80078,80092,80098,80100,80104,80134,80140,80176,80190,80224,80252,80270,80284,80312,80328,80336,80350,80358,80364,80378,80390,80396,80408,80432,80446,80480,80508,80576,80632,80654,80668,80696,80752,80766,80776,80784,80798,80800,80828,80844,80856,80878,80882,80884,80914,80916,80930,80932,80936,80950,80962,80968,80976,80990,80998,81004,81026,81028,81040,81054,81056,81084,81094,81100,81112,81134,81154,81156,81160,81168,81182,81184,81212,81216,81272,81286,81292,81304,81328,81342,81358,81372,81380,81384,81398,81434,81454,81458,81460,81486,81500,81506,81508,81512,81526,81550,81564,81592,81602,81604,81608,81616,81630,81638,81644,81702,81708,81722,81734,81740,81752,81774,81778,81780,82050,82078,82080,82108,82180,82184,82192,82206,82208,82236,82240,82296,82316,82328,82352,82366,82402,82404,82408,82440,82448,82462,82464,82492,82496,82552,82672,82694,82700,82712,82736,82750,82784,82812,82830,82882,82884,82888,82896,82918,82924,82952,82960,82974,82976,83004,83008,83064,83184,83424,83468,83480,83504,83518,83552,83580,83648,83704,83740,83768,83824,83838,83842,83844,83848,83856,83872,83900,83910,83916,83928,83950,83984,84e3,84028,84032,84088,84208,84448,84928,85040,85054,85088,85116,85184,85240,85488,85560,85616,85630,85728,85756,85764,85768,85776,85790,85792,85820,85824,85880,85894,85900,85912,85936,85966,85980,86048,86080,86136,86256,86496,86976,88160,88188,88256,88312,88560,89056,89200,89214,89312,89340,89536,89592,89608,89616,89632,89664,89720,89840,89868,89880,89904,89952,89980,89998,90012,90040,90190,90204,90254,90268,90296,90306,90308,90312,90334,90382,90396,90424,90480,90494,90500,90504,90512,90526,90528,90556,90566,90572,90584,90610,90612,90638,90652,90680,90736,90750,90848,90876,90884,90888,90896,90910,90912,90940,90944,91e3,91014,91020,91032,91056,91070,91086,91100,91106,91108,91112,91126,91150,91164,91192,91248,91262,91360,91388,91584,91640,91664,91678,91680,91708,91712,91768,91888,91928,91952,91966,92e3,92028,92046,92060,92088,92098,92100,92104,92112,92126,92134,92140,92188,92216,92272,92384,92412,92608,92664,93168,93200,93214,93216,93244,93248,93304,93424,93664,93720,93744,93758,93792,93820,93888,93944,93980,94008,94064,94078,94084,94088,94096,94110,94112,94140,94150,94156,94168,94246,94252,94278,94284,94296,94318,94342,94348,94360,94384,94398,94414,94428,94440,94470,94476,94488,94512,94526,94560,94588,94606,94620,94648,94658,94660,94664,94672,94686,94694,94700,94714,94726,94732,94744,94768,94782,94816,94844,94912,94968,94990,95004,95032,95088,95102,95112,95120,95134,95136,95164,95180,95192,95214,95218,95220,95244,95256,95280,95294,95328,95356,95424,95480,95728,95758,95772,95800,95856,95870,95968,95996,96008,96016,96030,96032,96060,96064,96120,96152,96176,96190,96220,96226,96228,96232,96290,96292,96296,96310,96322,96324,96328,96336,96350,96358,96364,96386,96388,96392,96400,96414,96416,96444,96454,96460,96472,96494,96498,96500,96514,96516,96520,96528,96542,96544,96572,96576,96632,96646,96652,96664,96688,96702,96718,96732,96738,96740,96744,96758,96772,96776,96784,96798,96800,96828,96832,96888,97008,97030,97036,97048,97072,97086,97120,97148,97166,97180,97208,97220,97224,97232,97246,97254,97260,97326,97330,97332,97358,97372,97378,97380,97384,97398,97422,97436,97464,97474,97476,97480,97488,97502,97510,97516,97550,97564,97592,97648,97666,97668,97672,97680,97694,97696,97724,97734,97740,97752,97774,97830,97836,97850,97862,97868,97880,97902,97906,97908,97926,97932,97944,97968,97998,98012,98018,98020,98024,98038,98618,98674,98676,98838,98854,98874,98892,98904,98926,98930,98932,98968,99006,99042,99044,99048,99062,99166,99194,99246,99286,99350,99366,99372,99386,99398,99416,99438,99442,99444,99462,99504,99518,99534,99548,99554,99556,99560,99574,99590,99596,99608,99632,99646,99680,99708,99726,99740,99768,99778,99780,99784,99792,99806,99814,99820,99834,99858,99860,99874,99880,99894,99906,99920,99934,99962,99970,99972,99976,99984,99998,1e5,100028,100038,100044,100056,100078,100082,100084,100142,100174,100188,100246,100262,100268,100306,100308,100390,100396,100410,100422,100428,100440,100462,100466,100468,100486,100504,100528,100542,100558,100572,100578,100580,100584,100598,100620,100656,100670,100704,100732,100750,100792,100802,100808,100816,100830,100838,100844,100858,100888,100912,100926,100960,100988,101056,101112,101148,101176,101232,101246,101250,101252,101256,101264,101278,101280,101308,101318,101324,101336,101358,101362,101364,101410,101412,101416,101430,101442,101448,101456,101470,101478,101498,101506,101508,101520,101534,101536,101564,101580,101618,101620,101636,101640,101648,101662,101664,101692,101696,101752,101766,101784,101838,101858,101860,101864,101934,101938,101940,101966,101980,101986,101988,101992,102030,102044,102072,102082,102084,102088,102096,102138,102166,102182,102188,102214,102220,102232,102254,102282,102290,102292,102306,102308,102312,102326,102444,102458,102470,102476,102488,102514,102516,102534,102552,102576,102590,102606,102620,102626,102632,102646,102662,102668,102704,102718,102752,102780,102798,102812,102840,102850,102856,102864,102878,102886,102892,102906,102936,102974,103008,103036,103104,103160,103224,103280,103294,103298,103300,103312,103326,103328,103356,103366,103372,103384,103406,103410,103412,103472,103486,103520,103548,103616,103672,103920,103992,104048,104062,104160,104188,104194,104196,104200,104208,104224,104252,104256,104312,104326,104332,104344,104368,104382,104398,104412,104418,104420,104424,104482,104484,104514,104520,104528,104542,104550,104570,104578,104580,104592,104606,104608,104636,104652,104690,104692,104706,104712,104734,104736,104764,104768,104824,104838,104856,104910,104930,104932,104936,104968,104976,104990,104992,105020,105024,105080,105200,105240,105278,105312,105372,105410,105412,105416,105424,105446,105518,105524,105550,105564,105570,105572,105576,105614,105628,105656,105666,105672,105680,105702,105722,105742,105756,105784,105840,105854,105858,105860,105864,105872,105888,105932,105970,105972,106006,106022,106028,106054,106060,106072,106100,106118,106124,106136,106160,106174,106190,106210,106212,106216,106250,106258,106260,106274,106276,106280,106306,106308,106312,106320,106334,106348,106394,106414,106418,106420,106566,106572,106610,106612,106630,106636,106648,106672,106686,106722,106724,106728,106742,106758,106764,106776,106800,106814,106848,106876,106894,106908,106936,106946,106948,106952,106960,106974,106982,106988,107032,107056,107070,107104,107132,107200,107256,107292,107320,107376,107390,107394,107396,107400,107408,107422,107424,107452,107462,107468,107480,107502,107506,107508,107544,107568,107582,107616,107644,107712,107768,108016,108060,108088,108144,108158,108256,108284,108290,108292,108296,108304,108318,108320,108348,108352,108408,108422,108428,108440,108464,108478,108494,108508,108514,108516,108520,108592,108640,108668,108736,108792,109040,109536,109680,109694,109792,109820,110016,110072,110084,110088,110096,110112,110140,110144,110200,110320,110342,110348,110360,110384,110398,110432,110460,110478,110492,110520,110532,110536,110544,110558,110658,110686,110714,110722,110724,110728,110736,110750,110752,110780,110796,110834,110836,110850,110852,110856,110864,110878,110880,110908,110912,110968,110982,111e3,111054,111074,111076,111080,111108,111112,111120,111134,111136,111164,111168,111224,111344,111372,111422,111456,111516,111554,111556,111560,111568,111590,111632,111646,111648,111676,111680,111736,111856,112096,112152,112224,112252,112320,112440,112514,112516,112520,112528,112542,112544,112588,112686,112718,112732,112782,112796,112824,112834,112836,112840,112848,112870,112890,112910,112924,112952,113008,113022,113026,113028,113032,113040,113054,113056,113100,113138,113140,113166,113180,113208,113264,113278,113376,113404,113416,113424,113440,113468,113472,113560,113614,113634,113636,113640,113686,113702,113708,113734,113740,113752,113778,113780,113798,113804,113816,113840,113854,113870,113890,113892,113896,113926,113932,113944,113968,113982,114016,114044,114076,114114,114116,114120,114128,114150,114170,114194,114196,114210,114212,114216,114242,114244,114248,114256,114270,114278,114306,114308,114312,114320,114334,114336,114364,114380,114420,114458,114478,114482,114484,114510,114524,114530,114532,114536,114842,114866,114868,114970,114994,114996,115042,115044,115048,115062,115130,115226,115250,115252,115278,115292,115298,115300,115304,115318,115342,115394,115396,115400,115408,115422,115430,115436,115450,115478,115494,115514,115526,115532,115570,115572,115738,115758,115762,115764,115790,115804,115810,115812,115816,115830,115854,115868,115896,115906,115912,115920,115934,115942,115948,115962,115996,116024,116080,116094,116098,116100,116104,116112,116126,116128,116156,116166,116172,116184,116206,116210,116212,116246,116262,116268,116282,116294,116300,116312,116334,116338,116340,116358,116364,116376,116400,116414,116430,116444,116450,116452,116456,116498,116500,116514,116520,116534,116546,116548,116552,116560,116574,116582,116588,116602,116654,116694,116714,116762,116782,116786,116788,116814,116828,116834,116836,116840,116854,116878,116892,116920,116930,116936,116944,116958,116966,116972,116986,117006,117048,117104,117118,117122,117124,117136,117150,117152,117180,117190,117196,117208,117230,117234,117236,117304,117360,117374,117472,117500,117506,117508,117512,117520,117536,117564,117568,117624,117638,117644,117656,117680,117694,117710,117724,117730,117732,117736,117750,117782,117798,117804,117818,117830,117848,117874,117876,117894,117936,117950,117966,117986,117988,117992,118022,118028,118040,118064,118078,118112,118140,118172,118210,118212,118216,118224,118238,118246,118266,118306,118312,118338,118352,118366,118374,118394,118402,118404,118408,118416,118430,118432,118460,118476,118514,118516,118574,118578,118580,118606,118620,118626,118628,118632,118678,118694,118700,118730,118738,118740,118830,118834,118836,118862,118876,118882,118884,118888,118902,118926,118940,118968,118978,118980,118984,118992,119006,119014,119020,119034,119068,119096,119152,119166,119170,119172,119176,119184,119198,119200,119228,119238,119244,119256,119278,119282,119284,119324,119352,119408,119422,119520,119548,119554,119556,119560,119568,119582,119584,119612,119616,119672,119686,119692,119704,119728,119742,119758,119772,119778,119780,119784,119798,119920,119934,120032,120060,120256,120312,120324,120328,120336,120352,120384,120440,120560,120582,120588,120600,120624,120638,120672,120700,120718,120732,120760,120770,120772,120776,120784,120798,120806,120812,120870,120876,120890,120902,120908,120920,120946,120948,120966,120972,120984,121008,121022,121038,121058,121060,121064,121078,121100,121112,121136,121150,121184,121212,121244,121282,121284,121288,121296,121318,121338,121356,121368,121392,121406,121440,121468,121536,121592,121656,121730,121732,121736,121744,121758,121760,121804,121842,121844,121890,121922,121924,121928,121936,121950,121958,121978,121986,121988,121992,122e3,122014,122016,122044,122060,122098,122100,122116,122120,122128,122142,122144,122172,122176,122232,122246,122264,122318,122338,122340,122344,122414,122418,122420,122446,122460,122466,122468,122472,122510,122524,122552,122562,122564,122568,122576,122598,122618,122646,122662,122668,122694,122700,122712,122738,122740,122762,122770,122772,122786,122788,122792,123018,123026,123028,123042,123044,123048,123062,123098,123146,123154,123156,123170,123172,123176,123190,123202,123204,123208,123216,123238,123244,123258,123290,123314,123316,123402,123410,123412,123426,123428,123432,123446,123458,123464,123472,123486,123494,123500,123514,123522,123524,123528,123536,123552,123580,123590,123596,123608,123630,123634,123636,123674,123698,123700,123740,123746,123748,123752,123834,123914,123922,123924,123938,123944,123958,123970,123976,123984,123998,124006,124012,124026,124034,124036,124048,124062,124064,124092,124102,124108,124120,124142,124146,124148,124162,124164,124168,124176,124190,124192,124220,124224,124280,124294,124300,124312,124336,124350,124366,124380,124386,124388,124392,124406,124442,124462,124466,124468,124494,124508,124514,124520,124558,124572,124600,124610,124612,124616,124624,124646,124666,124694,124710,124716,124730,124742,124748,124760,124786,124788,124818,124820,124834,124836,124840,124854,124946,124948,124962,124964,124968,124982,124994,124996,125e3,125008,125022,125030,125036,125050,125058,125060,125064,125072,125086,125088,125116,125126,125132,125144,125166,125170,125172,125186,125188,125192,125200,125216,125244,125248,125304,125318,125324,125336,125360,125374,125390,125404,125410,125412,125416,125430,125444,125448,125456,125472,125504,125560,125680,125702,125708,125720,125744,125758,125792,125820,125838,125852,125880,125890,125892,125896,125904,125918,125926,125932,125978,125998,126002,126004,126030,126044,126050,126052,126056,126094,126108,126136,126146,126148,126152,126160,126182,126202,126222,126236,126264,126320,126334,126338,126340,126344,126352,126366,126368,126412,126450,126452,126486,126502,126508,126522,126534,126540,126552,126574,126578,126580,126598,126604,126616,126640,126654,126670,126684,126690,126692,126696,126738,126754,126756,126760,126774,126786,126788,126792,126800,126814,126822,126828,126842,126894,126898,126900,126934,127126,127142,127148,127162,127178,127186,127188,127254,127270,127276,127290,127302,127308,127320,127342,127346,127348,127370,127378,127380,127394,127396,127400,127450,127510,127526,127532,127546,127558,127576,127598,127602,127604,127622,127628,127640,127664,127678,127694,127708,127714,127716,127720,127734,127754,127762,127764,127778,127784,127810,127812,127816,127824,127838,127846,127866,127898,127918,127922,127924,128022,128038,128044,128058,128070,128076,128088,128110,128114,128116,128134,128140,128152,128176,128190,128206,128220,128226,128228,128232,128246,128262,128268,128280,128304,128318,128352,128380,128398,128412,128440,128450,128452,128456,128464,128478,128486,128492,128506,128522,128530,128532,128546,128548,128552,128566,128578,128580,128584,128592,128606,128614,128634,128642,128644,128648,128656,128670,128672,128700,128716,128754,128756,128794,128814,128818,128820,128846,128860,128866,128868,128872,128886,128918,128934,128940,128954,128978,128980,129178,129198,129202,129204,129238,129258,129306,129326,129330,129332,129358,129372,129378,129380,129384,129398,129430,129446,129452,129466,129482,129490,129492,129562,129582,129586,129588,129614,129628,129634,129636,129640,129654,129678,129692,129720,129730,129732,129736,129744,129758,129766,129772,129814,129830,129836,129850,129862,129868,129880,129902,129906,129908,129930,129938,129940,129954,129956,129960,129974,130010]),Pe.CODEWORD_TABLE=Int32Array.from([2627,1819,2622,2621,1813,1812,2729,2724,2723,2779,2774,2773,902,896,908,868,865,861,859,2511,873,871,1780,835,2493,825,2491,842,837,844,1764,1762,811,810,809,2483,807,2482,806,2480,815,814,813,812,2484,817,816,1745,1744,1742,1746,2655,2637,2635,2626,2625,2623,2628,1820,2752,2739,2737,2728,2727,2725,2730,2785,2783,2778,2777,2775,2780,787,781,747,739,736,2413,754,752,1719,692,689,681,2371,678,2369,700,697,694,703,1688,1686,642,638,2343,631,2341,627,2338,651,646,643,2345,654,652,1652,1650,1647,1654,601,599,2322,596,2321,594,2319,2317,611,610,608,606,2324,603,2323,615,614,612,1617,1616,1614,1612,616,1619,1618,2575,2538,2536,905,901,898,909,2509,2507,2504,870,867,864,860,2512,875,872,1781,2490,2489,2487,2485,1748,836,834,832,830,2494,827,2492,843,841,839,845,1765,1763,2701,2676,2674,2653,2648,2656,2634,2633,2631,2629,1821,2638,2636,2770,2763,2761,2750,2745,2753,2736,2735,2733,2731,1848,2740,2738,2786,2784,591,588,576,569,566,2296,1590,537,534,526,2276,522,2274,545,542,539,548,1572,1570,481,2245,466,2242,462,2239,492,485,482,2249,496,494,1534,1531,1528,1538,413,2196,406,2191,2188,425,419,2202,415,2199,432,430,427,1472,1467,1464,433,1476,1474,368,367,2160,365,2159,362,2157,2155,2152,378,377,375,2166,372,2165,369,2162,383,381,379,2168,1419,1418,1416,1414,385,1411,384,1423,1422,1420,1424,2461,802,2441,2439,790,786,783,794,2409,2406,2403,750,742,738,2414,756,753,1720,2367,2365,2362,2359,1663,693,691,684,2373,680,2370,702,699,696,704,1690,1687,2337,2336,2334,2332,1624,2329,1622,640,637,2344,634,2342,630,2340,650,648,645,2346,655,653,1653,1651,1649,1655,2612,2597,2595,2571,2568,2565,2576,2534,2529,2526,1787,2540,2537,907,904,900,910,2503,2502,2500,2498,1768,2495,1767,2510,2508,2506,869,866,863,2513,876,874,1782,2720,2713,2711,2697,2694,2691,2702,2672,2670,2664,1828,2678,2675,2647,2646,2644,2642,1823,2639,1822,2654,2652,2650,2657,2771,1855,2765,2762,1850,1849,2751,2749,2747,2754,353,2148,344,342,336,2142,332,2140,345,1375,1373,306,2130,299,2128,295,2125,319,314,311,2132,1354,1352,1349,1356,262,257,2101,253,2096,2093,274,273,267,2107,263,2104,280,278,275,1316,1311,1308,1320,1318,2052,202,2050,2044,2040,219,2063,212,2060,208,2055,224,221,2066,1260,1258,1252,231,1248,229,1266,1264,1261,1268,155,1998,153,1996,1994,1991,1988,165,164,2007,162,2006,159,2003,2e3,172,171,169,2012,166,2010,1186,1184,1182,1179,175,1176,173,1192,1191,1189,1187,176,1194,1193,2313,2307,2305,592,589,2294,2292,2289,578,572,568,2297,580,1591,2272,2267,2264,1547,538,536,529,2278,525,2275,547,544,541,1574,1571,2237,2235,2229,1493,2225,1489,478,2247,470,2244,465,2241,493,488,484,2250,498,495,1536,1533,1530,1539,2187,2186,2184,2182,1432,2179,1430,2176,1427,414,412,2197,409,2195,405,2193,2190,426,424,421,2203,418,2201,431,429,1473,1471,1469,1466,434,1477,1475,2478,2472,2470,2459,2457,2454,2462,803,2437,2432,2429,1726,2443,2440,792,789,785,2401,2399,2393,1702,2389,1699,2411,2408,2405,745,741,2415,758,755,1721,2358,2357,2355,2353,1661,2350,1660,2347,1657,2368,2366,2364,2361,1666,690,687,2374,683,2372,701,698,705,1691,1689,2619,2617,2610,2608,2605,2613,2593,2588,2585,1803,2599,2596,2563,2561,2555,1797,2551,1795,2573,2570,2567,2577,2525,2524,2522,2520,1786,2517,1785,2514,1783,2535,2533,2531,2528,1788,2541,2539,906,903,911,2721,1844,2715,2712,1838,1836,2699,2696,2693,2703,1827,1826,1824,2673,2671,2669,2666,1829,2679,2677,1858,1857,2772,1854,1853,1851,1856,2766,2764,143,1987,139,1986,135,133,131,1984,128,1983,125,1981,138,137,136,1985,1133,1132,1130,112,110,1974,107,1973,104,1971,1969,122,121,119,117,1977,114,1976,124,1115,1114,1112,1110,1117,1116,84,83,1953,81,1952,78,1950,1948,1945,94,93,91,1959,88,1958,85,1955,99,97,95,1961,1086,1085,1083,1081,1078,100,1090,1089,1087,1091,49,47,1917,44,1915,1913,1910,1907,59,1926,56,1925,53,1922,1919,66,64,1931,61,1929,1042,1040,1038,71,1035,70,1032,68,1048,1047,1045,1043,1050,1049,12,10,1869,1867,1864,1861,21,1880,19,1877,1874,1871,28,1888,25,1886,22,1883,982,980,977,974,32,30,991,989,987,984,34,995,994,992,2151,2150,2147,2146,2144,356,355,354,2149,2139,2138,2136,2134,1359,343,341,338,2143,335,2141,348,347,346,1376,1374,2124,2123,2121,2119,1326,2116,1324,310,308,305,2131,302,2129,298,2127,320,318,316,313,2133,322,321,1355,1353,1351,1357,2092,2091,2089,2087,1276,2084,1274,2081,1271,259,2102,256,2100,252,2098,2095,272,269,2108,266,2106,281,279,277,1317,1315,1313,1310,282,1321,1319,2039,2037,2035,2032,1203,2029,1200,1197,207,2053,205,2051,201,2049,2046,2043,220,218,2064,215,2062,211,2059,228,226,223,2069,1259,1257,1254,232,1251,230,1267,1265,1263,2316,2315,2312,2311,2309,2314,2304,2303,2301,2299,1593,2308,2306,590,2288,2287,2285,2283,1578,2280,1577,2295,2293,2291,579,577,574,571,2298,582,581,1592,2263,2262,2260,2258,1545,2255,1544,2252,1541,2273,2271,2269,2266,1550,535,532,2279,528,2277,546,543,549,1575,1573,2224,2222,2220,1486,2217,1485,2214,1482,1479,2238,2236,2234,2231,1496,2228,1492,480,477,2248,473,2246,469,2243,490,487,2251,497,1537,1535,1532,2477,2476,2474,2479,2469,2468,2466,2464,1730,2473,2471,2453,2452,2450,2448,1729,2445,1728,2460,2458,2456,2463,805,804,2428,2427,2425,2423,1725,2420,1724,2417,1722,2438,2436,2434,2431,1727,2444,2442,793,791,788,795,2388,2386,2384,1697,2381,1696,2378,1694,1692,2402,2400,2398,2395,1703,2392,1701,2412,2410,2407,751,748,744,2416,759,757,1807,2620,2618,1806,1805,2611,2609,2607,2614,1802,1801,1799,2594,2592,2590,2587,1804,2600,2598,1794,1793,1791,1789,2564,2562,2560,2557,1798,2554,1796,2574,2572,2569,2578,1847,1846,2722,1843,1842,1840,1845,2716,2714,1835,1834,1832,1830,1839,1837,2700,2698,2695,2704,1817,1811,1810,897,862,1777,829,826,838,1760,1758,808,2481,1741,1740,1738,1743,2624,1818,2726,2776,782,740,737,1715,686,679,695,1682,1680,639,628,2339,647,644,1645,1643,1640,1648,602,600,597,595,2320,593,2318,609,607,604,1611,1610,1608,1606,613,1615,1613,2328,926,924,892,886,899,857,850,2505,1778,824,823,821,819,2488,818,2486,833,831,828,840,1761,1759,2649,2632,2630,2746,2734,2732,2782,2781,570,567,1587,531,527,523,540,1566,1564,476,467,463,2240,486,483,1524,1521,1518,1529,411,403,2192,399,2189,423,416,1462,1457,1454,428,1468,1465,2210,366,363,2158,360,2156,357,2153,376,373,370,2163,1410,1409,1407,1405,382,1402,380,1417,1415,1412,1421,2175,2174,777,774,771,784,732,725,722,2404,743,1716,676,674,668,2363,665,2360,685,1684,1681,626,624,622,2335,620,2333,617,2330,641,635,649,1646,1644,1642,2566,928,925,2530,2527,894,891,888,2501,2499,2496,858,856,854,851,1779,2692,2668,2665,2645,2643,2640,2651,2768,2759,2757,2744,2743,2741,2748,352,1382,340,337,333,1371,1369,307,300,296,2126,315,312,1347,1342,1350,261,258,250,2097,246,2094,271,268,264,1306,1301,1298,276,1312,1309,2115,203,2048,195,2045,191,2041,213,209,2056,1246,1244,1238,225,1234,222,1256,1253,1249,1262,2080,2079,154,1997,150,1995,147,1992,1989,163,160,2004,156,2001,1175,1174,1172,1170,1167,170,1164,167,1185,1183,1180,1177,174,1190,1188,2025,2024,2022,587,586,564,559,556,2290,573,1588,520,518,512,2268,508,2265,530,1568,1565,461,457,2233,450,2230,446,2226,479,471,489,1526,1523,1520,397,395,2185,392,2183,389,2180,2177,410,2194,402,422,1463,1461,1459,1456,1470,2455,799,2433,2430,779,776,773,2397,2394,2390,734,728,724,746,1717,2356,2354,2351,2348,1658,677,675,673,670,667,688,1685,1683,2606,2589,2586,2559,2556,2552,927,2523,2521,2518,2515,1784,2532,895,893,890,2718,2709,2707,2689,2687,2684,2663,2662,2660,2658,1825,2667,2769,1852,2760,2758,142,141,1139,1138,134,132,129,126,1982,1129,1128,1126,1131,113,111,108,105,1972,101,1970,120,118,115,1109,1108,1106,1104,123,1113,1111,82,79,1951,75,1949,72,1946,92,89,86,1956,1077,1076,1074,1072,98,1069,96,1084,1082,1079,1088,1968,1967,48,45,1916,42,1914,39,1911,1908,60,57,54,1923,50,1920,1031,1030,1028,1026,67,1023,65,1020,62,1041,1039,1036,1033,69,1046,1044,1944,1943,1941,11,9,1868,7,1865,1862,1859,20,1878,16,1875,13,1872,970,968,966,963,29,960,26,23,983,981,978,975,33,971,31,990,988,985,1906,1904,1902,993,351,2145,1383,331,330,328,326,2137,323,2135,339,1372,1370,294,293,291,289,2122,286,2120,283,2117,309,303,317,1348,1346,1344,245,244,242,2090,239,2088,236,2085,2082,260,2099,249,270,1307,1305,1303,1300,1314,189,2038,186,2036,183,2033,2030,2026,206,198,2047,194,216,1247,1245,1243,1240,227,1237,1255,2310,2302,2300,2286,2284,2281,565,563,561,558,575,1589,2261,2259,2256,2253,1542,521,519,517,514,2270,511,533,1569,1567,2223,2221,2218,2215,1483,2211,1480,459,456,453,2232,449,474,491,1527,1525,1522,2475,2467,2465,2451,2449,2446,801,800,2426,2424,2421,2418,1723,2435,780,778,775,2387,2385,2382,2379,1695,2375,1693,2396,735,733,730,727,749,1718,2616,2615,2604,2603,2601,2584,2583,2581,2579,1800,2591,2550,2549,2547,2545,1792,2542,1790,2558,929,2719,1841,2710,2708,1833,1831,2690,2688,2686,1815,1809,1808,1774,1756,1754,1737,1736,1734,1739,1816,1711,1676,1674,633,629,1638,1636,1633,1641,598,1605,1604,1602,1600,605,1609,1607,2327,887,853,1775,822,820,1757,1755,1584,524,1560,1558,468,464,1514,1511,1508,1519,408,404,400,1452,1447,1444,417,1458,1455,2208,364,361,358,2154,1401,1400,1398,1396,374,1393,371,1408,1406,1403,1413,2173,2172,772,726,723,1712,672,669,666,682,1678,1675,625,623,621,618,2331,636,632,1639,1637,1635,920,918,884,880,889,849,848,847,846,2497,855,852,1776,2641,2742,2787,1380,334,1367,1365,301,297,1340,1338,1335,1343,255,251,247,1296,1291,1288,265,1302,1299,2113,204,196,192,2042,1232,1230,1224,214,1220,210,1242,1239,1235,1250,2077,2075,151,148,1993,144,1990,1163,1162,1160,1158,1155,161,1152,157,1173,1171,1168,1165,168,1181,1178,2021,2020,2018,2023,585,560,557,1585,516,509,1562,1559,458,447,2227,472,1516,1513,1510,398,396,393,390,2181,386,2178,407,1453,1451,1449,1446,420,1460,2209,769,764,720,712,2391,729,1713,664,663,661,659,2352,656,2349,671,1679,1677,2553,922,919,2519,2516,885,883,881,2685,2661,2659,2767,2756,2755,140,1137,1136,130,127,1125,1124,1122,1127,109,106,102,1103,1102,1100,1098,116,1107,1105,1980,80,76,73,1947,1068,1067,1065,1063,90,1060,87,1075,1073,1070,1080,1966,1965,46,43,40,1912,36,1909,1019,1018,1016,1014,58,1011,55,1008,51,1029,1027,1024,1021,63,1037,1034,1940,1939,1937,1942,8,1866,4,1863,1,1860,956,954,952,949,946,17,14,969,967,964,961,27,957,24,979,976,972,1901,1900,1898,1896,986,1905,1903,350,349,1381,329,327,324,1368,1366,292,290,287,284,2118,304,1341,1339,1337,1345,243,240,237,2086,233,2083,254,1297,1295,1293,1290,1304,2114,190,187,184,2034,180,2031,177,2027,199,1233,1231,1229,1226,217,1223,1241,2078,2076,584,555,554,552,550,2282,562,1586,507,506,504,502,2257,499,2254,515,1563,1561,445,443,441,2219,438,2216,435,2212,460,454,475,1517,1515,1512,2447,798,797,2422,2419,770,768,766,2383,2380,2376,721,719,717,714,731,1714,2602,2582,2580,2548,2546,2543,923,921,2717,2706,2705,2683,2682,2680,1771,1752,1750,1733,1732,1731,1735,1814,1707,1670,1668,1631,1629,1626,1634,1599,1598,1596,1594,1603,1601,2326,1772,1753,1751,1581,1554,1552,1504,1501,1498,1509,1442,1437,1434,401,1448,1445,2206,1392,1391,1389,1387,1384,359,1399,1397,1394,1404,2171,2170,1708,1672,1669,619,1632,1630,1628,1773,1378,1363,1361,1333,1328,1336,1286,1281,1278,248,1292,1289,2111,1218,1216,1210,197,1206,193,1228,1225,1221,1236,2073,2071,1151,1150,1148,1146,152,1143,149,1140,145,1161,1159,1156,1153,158,1169,1166,2017,2016,2014,2019,1582,510,1556,1553,452,448,1506,1500,394,391,387,1443,1441,1439,1436,1450,2207,765,716,713,1709,662,660,657,1673,1671,916,914,879,878,877,882,1135,1134,1121,1120,1118,1123,1097,1096,1094,1092,103,1101,1099,1979,1059,1058,1056,1054,77,1051,74,1066,1064,1061,1071,1964,1963,1007,1006,1004,1002,999,41,996,37,1017,1015,1012,1009,52,1025,1022,1936,1935,1933,1938,942,940,938,935,932,5,2,955,953,950,947,18,943,15,965,962,958,1895,1894,1892,1890,973,1899,1897,1379,325,1364,1362,288,285,1334,1332,1330,241,238,234,1287,1285,1283,1280,1294,2112,188,185,181,178,2028,1219,1217,1215,1212,200,1209,1227,2074,2072,583,553,551,1583,505,503,500,513,1557,1555,444,442,439,436,2213,455,451,1507,1505,1502,796,763,762,760,767,711,710,708,706,2377,718,715,1710,2544,917,915,2681,1627,1597,1595,2325,1769,1749,1747,1499,1438,1435,2204,1390,1388,1385,1395,2169,2167,1704,1665,1662,1625,1623,1620,1770,1329,1282,1279,2109,1214,1207,1222,2068,2065,1149,1147,1144,1141,146,1157,1154,2013,2011,2008,2015,1579,1549,1546,1495,1487,1433,1431,1428,1425,388,1440,2205,1705,658,1667,1664,1119,1095,1093,1978,1057,1055,1052,1062,1962,1960,1005,1003,1e3,997,38,1013,1010,1932,1930,1927,1934,941,939,936,933,6,930,3,951,948,944,1889,1887,1884,1881,959,1893,1891,35,1377,1360,1358,1327,1325,1322,1331,1277,1275,1272,1269,235,1284,2110,1205,1204,1201,1198,182,1195,179,1213,2070,2067,1580,501,1551,1548,440,437,1497,1494,1490,1503,761,709,707,1706,913,912,2198,1386,2164,2161,1621,1766,2103,1208,2058,2054,1145,1142,2005,2002,1999,2009,1488,1429,1426,2200,1698,1659,1656,1975,1053,1957,1954,1001,998,1924,1921,1918,1928,937,934,931,1879,1876,1873,1870,945,1885,1882,1323,1273,1270,2105,1202,1199,1196,1211,2061,2057,1576,1543,1540,1484,1481,1478,1491,1700]);class ve{constructor(t,e){this.bits=t,this.points=e}getBits(){return this.bits}getPoints(){return this.points}}class Fe{static detectMultiple(t,e,r){let n=t.getBlackMatrix(),i=Fe.detect(r,n);return i.length||(n=n.clone(),n.rotate180(),i=Fe.detect(r,n)),new ve(n,i)}static detect(t,e){const r=new Array;let n=0,i=0,o=!1;for(;n<e.getHeight();){const s=Fe.findVertices(e,n,i);if(null!=s[0]||null!=s[3]){if(o=!0,r.push(s),!t)break;null!=s[2]?(i=Math.trunc(s[2].getX()),n=Math.trunc(s[2].getY())):(i=Math.trunc(s[4].getX()),n=Math.trunc(s[4].getY()))}else{if(!o)break;o=!1,i=0;for(const t of r)null!=t[1]&&(n=Math.trunc(Math.max(n,t[1].getY()))),null!=t[3]&&(n=Math.max(n,Math.trunc(t[3].getY())));n+=Fe.ROW_STEP}}return r}static findVertices(t,e,r){const n=t.getHeight(),i=t.getWidth(),o=new Array(8);return Fe.copyToResult(o,Fe.findRowsWithPattern(t,n,i,e,r,Fe.START_PATTERN),Fe.INDEXES_START_PATTERN),null!=o[4]&&(r=Math.trunc(o[4].getX()),e=Math.trunc(o[4].getY())),Fe.copyToResult(o,Fe.findRowsWithPattern(t,n,i,e,r,Fe.STOP_PATTERN),Fe.INDEXES_STOP_PATTERN),o}static copyToResult(t,e,r){for(let n=0;n<r.length;n++)t[r[n]]=e[n]}static findRowsWithPattern(t,e,r,n,i,o){const s=new Array(4);let a=!1;const c=new Int32Array(o.length);for(;n<e;n+=Fe.ROW_STEP){let e=Fe.findGuardPattern(t,i,n,r,!1,o,c);if(null!=e){for(;n>0;){const s=Fe.findGuardPattern(t,i,--n,r,!1,o,c);if(null==s){n++;break}e=s}s[0]=new it(e[0],n),s[1]=new it(e[1],n),a=!0;break}}let l=n+1;if(a){let n=0,i=Int32Array.from([Math.trunc(s[0].getX()),Math.trunc(s[1].getX())]);for(;l<e;l++){const e=Fe.findGuardPattern(t,i[0],l,r,!1,o,c);if(null!=e&&Math.abs(i[0]-e[0])<Fe.MAX_PATTERN_DRIFT&&Math.abs(i[1]-e[1])<Fe.MAX_PATTERN_DRIFT)i=e,n=0;else{if(n>Fe.SKIPPED_ROW_COUNT_MAX)break;n++}}l-=n+1,s[2]=new it(i[0],l),s[3]=new it(i[1],l)}return l-n<Fe.BARCODE_MIN_HEIGHT&&w.fill(s,null),s}static findGuardPattern(t,e,r,n,i,o,s){w.fillWithin(s,0,s.length,0);let a=e,c=0;for(;t.get(a,r)&&a>0&&c++<Fe.MAX_PIXEL_DRIFT;)a--;let l=a,h=0,u=o.length;for(let e=i;l<n;l++)if(t.get(l,r)!==e)s[h]++;else{if(h===u-1){if(Fe.patternMatchVariance(s,o,Fe.MAX_INDIVIDUAL_VARIANCE)<Fe.MAX_AVG_VARIANCE)return new Int32Array([a,l]);a+=s[0]+s[1],d.arraycopy(s,2,s,0,h-1),s[h-1]=0,s[h]=0,h--}else h++;s[h]=1,e=!e}return h===u-1&&Fe.patternMatchVariance(s,o,Fe.MAX_INDIVIDUAL_VARIANCE)<Fe.MAX_AVG_VARIANCE?new Int32Array([a,l-1]):null}static patternMatchVariance(t,e,r){let n=t.length,i=0,o=0;for(let r=0;r<n;r++)i+=t[r],o+=e[r];if(i<o)return 1/0;let s=i/o;r*=s;let a=0;for(let i=0;i<n;i++){let n=t[i],o=e[i]*s,c=n>o?n-o:o-n;if(c>r)return 1/0;a+=c}return a/i}}Fe.INDEXES_START_PATTERN=Int32Array.from([0,4,1,5]),Fe.INDEXES_STOP_PATTERN=Int32Array.from([6,2,7,3]),Fe.MAX_AVG_VARIANCE=.42,Fe.MAX_INDIVIDUAL_VARIANCE=.8,Fe.START_PATTERN=Int32Array.from([8,1,1,1,1,1,1,3]),Fe.STOP_PATTERN=Int32Array.from([7,1,1,3,1,1,1,2,1]),Fe.MAX_PIXEL_DRIFT=3,Fe.MAX_PATTERN_DRIFT=5,Fe.SKIPPED_ROW_COUNT_MAX=25,Fe.ROW_STEP=5,Fe.BARCODE_MIN_HEIGHT=10;class xe{constructor(t,e){if(0===e.length)throw new c;this.field=t;let r=e.length;if(r>1&&0===e[0]){let t=1;for(;t<r&&0===e[t];)t++;t===r?this.coefficients=new Int32Array([0]):(this.coefficients=new Int32Array(r-t),d.arraycopy(e,t,this.coefficients,0,this.coefficients.length))}else this.coefficients=e}getCoefficients(){return this.coefficients}getDegree(){return this.coefficients.length-1}isZero(){return 0===this.coefficients[0]}getCoefficient(t){return this.coefficients[this.coefficients.length-1-t]}evaluateAt(t){if(0===t)return this.getCoefficient(0);if(1===t){let t=0;for(let e of this.coefficients)t=this.field.add(t,e);return t}let e=this.coefficients[0],r=this.coefficients.length;for(let n=1;n<r;n++)e=this.field.add(this.field.multiply(t,e),this.coefficients[n]);return e}add(t){if(!this.field.equals(t.field))throw new c("ModulusPolys do not have same ModulusGF field");if(this.isZero())return t;if(t.isZero())return this;let e=this.coefficients,r=t.coefficients;if(e.length>r.length){let t=e;e=r,r=t}let n=new Int32Array(r.length),i=r.length-e.length;d.arraycopy(r,0,n,0,i);for(let t=i;t<r.length;t++)n[t]=this.field.add(e[t-i],r[t]);return new xe(this.field,n)}subtract(t){if(!this.field.equals(t.field))throw new c("ModulusPolys do not have same ModulusGF field");return t.isZero()?this:this.add(t.negative())}multiply(t){return t instanceof xe?this.multiplyOther(t):this.multiplyScalar(t)}multiplyOther(t){if(!this.field.equals(t.field))throw new c("ModulusPolys do not have same ModulusGF field");if(this.isZero()||t.isZero())return new xe(this.field,new Int32Array([0]));let e=this.coefficients,r=e.length,n=t.coefficients,i=n.length,o=new Int32Array(r+i-1);for(let t=0;t<r;t++){let r=e[t];for(let e=0;e<i;e++)o[t+e]=this.field.add(o[t+e],this.field.multiply(r,n[e]))}return new xe(this.field,o)}negative(){let t=this.coefficients.length,e=new Int32Array(t);for(let r=0;r<t;r++)e[r]=this.field.subtract(0,this.coefficients[r]);return new xe(this.field,e)}multiplyScalar(t){if(0===t)return new xe(this.field,new Int32Array([0]));if(1===t)return this;let e=this.coefficients.length,r=new Int32Array(e);for(let n=0;n<e;n++)r[n]=this.field.multiply(this.coefficients[n],t);return new xe(this.field,r)}multiplyByMonomial(t,e){if(t<0)throw new c;if(0===e)return new xe(this.field,new Int32Array([0]));let r=this.coefficients.length,n=new Int32Array(r+t);for(let t=0;t<r;t++)n[t]=this.field.multiply(this.coefficients[t],e);return new xe(this.field,n)}toString(){let t=new y;for(let e=this.getDegree();e>=0;e--){let r=this.getCoefficient(e);0!==r&&(r<0?(t.append(" - "),r=-r):t.length()>0&&t.append(" + "),0!==e&&1===r||t.append(r),0!==e&&(1===e?t.append("x"):(t.append("x^"),t.append(e))))}return t.toString()}}class ke{add(t,e){return(t+e)%this.modulus}subtract(t,e){return(this.modulus+t-e)%this.modulus}exp(t){return this.expTable[t]}log(t){if(0===t)throw new c;return this.logTable[t]}inverse(t){if(0===t)throw new K;return this.expTable[this.modulus-this.logTable[t]-1]}multiply(t,e){return 0===t||0===e?0:this.expTable[(this.logTable[t]+this.logTable[e])%(this.modulus-1)]}getSize(){return this.modulus}equals(t){return t===this}}class Ue extends ke{constructor(t,e){super(),this.modulus=t,this.expTable=new Int32Array(t),this.logTable=new Int32Array(t);let r=1;for(let n=0;n<t;n++)this.expTable[n]=r,r=r*e%t;for(let e=0;e<t-1;e++)this.logTable[this.expTable[e]]=e;this.zero=new xe(this,new Int32Array([0])),this.one=new xe(this,new Int32Array([1]))}getZero(){return this.zero}getOne(){return this.one}buildMonomial(t,e){if(t<0)throw new c;if(0===e)return this.zero;let r=new Int32Array(t+1);return r[0]=e,new xe(this,r)}}Ue.PDF417_GF=new Ue(Pe.NUMBER_OF_CODEWORDS,3);class He{constructor(){this.field=Ue.PDF417_GF}decode(t,e,r){let n=new xe(this.field,t),i=new Int32Array(e),o=!1;for(let t=e;t>0;t--){let r=n.evaluateAt(this.field.exp(t));i[e-t]=r,0!==r&&(o=!0)}if(!o)return 0;let s=this.field.getOne();if(null!=r)for(const e of r){let r=this.field.exp(t.length-1-e),n=new xe(this.field,new Int32Array([this.field.subtract(0,r),1]));s=s.multiply(n)}let a=new xe(this.field,i),c=this.runEuclideanAlgorithm(this.field.buildMonomial(e,1),a,e),l=c[0],u=c[1],d=this.findErrorLocations(l),f=this.findErrorMagnitudes(u,l,d);for(let e=0;e<d.length;e++){let r=t.length-1-this.field.log(d[e]);if(r<0)throw h.getChecksumInstance();t[r]=this.field.subtract(t[r],f[e])}return d.length}runEuclideanAlgorithm(t,e,r){if(t.getDegree()<e.getDegree()){let r=t;t=e,e=r}let n=t,i=e,o=this.field.getZero(),s=this.field.getOne();for(;i.getDegree()>=Math.round(r/2);){let t=n,e=o;if(n=i,o=s,n.isZero())throw h.getChecksumInstance();i=t;let r=this.field.getZero(),a=n.getCoefficient(n.getDegree()),c=this.field.inverse(a);for(;i.getDegree()>=n.getDegree()&&!i.isZero();){let t=i.getDegree()-n.getDegree(),e=this.field.multiply(i.getCoefficient(i.getDegree()),c);r=r.add(this.field.buildMonomial(t,e)),i=i.subtract(n.multiplyByMonomial(t,e))}s=r.multiply(o).subtract(e).negative()}let a=s.getCoefficient(0);if(0===a)throw h.getChecksumInstance();let c=this.field.inverse(a);return[s.multiply(c),i.multiply(c)]}findErrorLocations(t){let e=t.getDegree(),r=new Int32Array(e),n=0;for(let i=1;i<this.field.getSize()&&n<e;i++)0===t.evaluateAt(i)&&(r[n]=this.field.inverse(i),n++);if(n!==e)throw h.getChecksumInstance();return r}findErrorMagnitudes(t,e,r){let n=e.getDegree(),i=new Int32Array(n);for(let t=1;t<=n;t++)i[n-t]=this.field.multiply(t,e.getCoefficient(t));let o=new xe(this.field,i),s=r.length,a=new Int32Array(s);for(let e=0;e<s;e++){let n=this.field.inverse(r[e]),i=this.field.subtract(0,t.evaluateAt(n)),s=this.field.inverse(o.evaluateAt(n));a[e]=this.field.multiply(i,s)}return a}}class Ve{constructor(t,e,r,n,i){t instanceof Ve?this.constructor_2(t):this.constructor_1(t,e,r,n,i)}constructor_1(t,e,r,n,i){const o=null==e||null==r,s=null==n||null==i;if(o&&s)throw new D;o?(e=new it(0,n.getY()),r=new it(0,i.getY())):s&&(n=new it(t.getWidth()-1,e.getY()),i=new it(t.getWidth()-1,r.getY())),this.image=t,this.topLeft=e,this.bottomLeft=r,this.topRight=n,this.bottomRight=i,this.minX=Math.trunc(Math.min(e.getX(),r.getX())),this.maxX=Math.trunc(Math.max(n.getX(),i.getX())),this.minY=Math.trunc(Math.min(e.getY(),n.getY())),this.maxY=Math.trunc(Math.max(r.getY(),i.getY()))}constructor_2(t){this.image=t.image,this.topLeft=t.getTopLeft(),this.bottomLeft=t.getBottomLeft(),this.topRight=t.getTopRight(),this.bottomRight=t.getBottomRight(),this.minX=t.getMinX(),this.maxX=t.getMaxX(),this.minY=t.getMinY(),this.maxY=t.getMaxY()}static merge(t,e){return null==t?e:null==e?t:new Ve(t.image,t.topLeft,t.bottomLeft,e.topRight,e.bottomRight)}addMissingRows(t,e,r){let n=this.topLeft,i=this.bottomLeft,o=this.topRight,s=this.bottomRight;if(t>0){let e=r?this.topLeft:this.topRight,i=Math.trunc(e.getY()-t);i<0&&(i=0);let s=new it(e.getX(),i);r?n=s:o=s}if(e>0){let t=r?this.bottomLeft:this.bottomRight,n=Math.trunc(t.getY()+e);n>=this.image.getHeight()&&(n=this.image.getHeight()-1);let o=new it(t.getX(),n);r?i=o:s=o}return new Ve(this.image,n,i,o,s)}getMinX(){return this.minX}getMaxX(){return this.maxX}getMinY(){return this.minY}getMaxY(){return this.maxY}getTopLeft(){return this.topLeft}getTopRight(){return this.topRight}getBottomLeft(){return this.bottomLeft}getBottomRight(){return this.bottomRight}}class ze{constructor(t,e,r,n){this.columnCount=t,this.errorCorrectionLevel=n,this.rowCountUpperPart=e,this.rowCountLowerPart=r,this.rowCount=e+r}getColumnCount(){return this.columnCount}getErrorCorrectionLevel(){return this.errorCorrectionLevel}getRowCount(){return this.rowCount}getRowCountUpperPart(){return this.rowCountUpperPart}getRowCountLowerPart(){return this.rowCountLowerPart}}class Ge{constructor(){this.buffer=""}static form(t,e){let r=-1;return t.replace(/%(-)?(0?[0-9]+)?([.][0-9]+)?([#][0-9]+)?([scfpexd%])/g,(function(t,n,i,o,s,a){if("%%"===t)return"%";if(void 0===e[++r])return;t=o?parseInt(o.substr(1)):void 0;let c,l=s?parseInt(s.substr(1)):void 0;switch(a){case"s":c=e[r];break;case"c":c=e[r][0];break;case"f":c=parseFloat(e[r]).toFixed(t);break;case"p":c=parseFloat(e[r]).toPrecision(t);break;case"e":c=parseFloat(e[r]).toExponential(t);break;case"x":c=parseInt(e[r]).toString(l||16);break;case"d":c=parseFloat(parseInt(e[r],l||10).toPrecision(t)).toFixed(0)}c="object"==typeof c?JSON.stringify(c):(+c).toString(l);let h=parseInt(i),u=i&&i[0]+""=="0"?"0":" ";for(;c.length<h;)c=void 0!==n?c+u:u+c;return c}))}format(t,...e){this.buffer+=Ge.form(t,e)}toString(){return this.buffer}}class Ye{constructor(t){this.boundingBox=new Ve(t),this.codewords=new Array(t.getMaxY()-t.getMinY()+1)}getCodewordNearby(t){let e=this.getCodeword(t);if(null!=e)return e;for(let r=1;r<Ye.MAX_NEARBY_DISTANCE;r++){let n=this.imageRowToCodewordIndex(t)-r;if(n>=0&&(e=this.codewords[n],null!=e))return e;if(n=this.imageRowToCodewordIndex(t)+r,n<this.codewords.length&&(e=this.codewords[n],null!=e))return e}return null}imageRowToCodewordIndex(t){return t-this.boundingBox.getMinY()}setCodeword(t,e){this.codewords[this.imageRowToCodewordIndex(t)]=e}getCodeword(t){return this.codewords[this.imageRowToCodewordIndex(t)]}getBoundingBox(){return this.boundingBox}getCodewords(){return this.codewords}toString(){const t=new Ge;let e=0;for(const r of this.codewords)null!=r?t.format("%3d: %3d|%3d%n",e++,r.getRowNumber(),r.getValue()):t.format("%3d:    |   %n",e++);return t.toString()}}Ye.MAX_NEARBY_DISTANCE=5;class Xe{constructor(){this.values=new Map}setValue(t){t=Math.trunc(t);let e=this.values.get(t);null==e&&(e=0),e++,this.values.set(t,e)}getValue(){let t=-1,e=new Array;for(const[r,n]of this.values.entries()){const i={getKey:()=>r,getValue:()=>n};i.getValue()>t?(t=i.getValue(),e=[],e.push(i.getKey())):i.getValue()===t&&e.push(i.getKey())}return Pe.toIntArray(e)}getConfidence(t){return this.values.get(t)}}class We extends Ye{constructor(t,e){super(t),this._isLeft=e}setRowNumbers(){for(let t of this.getCodewords())null!=t&&t.setRowNumberAsRowIndicatorColumn()}adjustCompleteIndicatorColumnRowNumbers(t){let e=this.getCodewords();this.setRowNumbers(),this.removeIncorrectCodewords(e,t);let r=this.getBoundingBox(),n=this._isLeft?r.getTopLeft():r.getTopRight(),i=this._isLeft?r.getBottomLeft():r.getBottomRight(),o=this.imageRowToCodewordIndex(Math.trunc(n.getY())),s=this.imageRowToCodewordIndex(Math.trunc(i.getY())),a=-1,c=1,l=0;for(let r=o;r<s;r++){if(null==e[r])continue;let n=e[r],i=n.getRowNumber()-a;if(0===i)l++;else if(1===i)c=Math.max(c,l),l=1,a=n.getRowNumber();else if(i<0||n.getRowNumber()>=t.getRowCount()||i>r)e[r]=null;else{let t;t=c>2?(c-2)*i:i;let o=t>=r;for(let n=1;n<=t&&!o;n++)o=null!=e[r-n];o?e[r]=null:(a=n.getRowNumber(),l=1)}}}getRowHeights(){let t=this.getBarcodeMetadata();if(null==t)return null;this.adjustIncompleteIndicatorColumnRowNumbers(t);let e=new Int32Array(t.getRowCount());for(let t of this.getCodewords())if(null!=t){let r=t.getRowNumber();if(r>=e.length)continue;e[r]++}return e}adjustIncompleteIndicatorColumnRowNumbers(t){let e=this.getBoundingBox(),r=this._isLeft?e.getTopLeft():e.getTopRight(),n=this._isLeft?e.getBottomLeft():e.getBottomRight(),i=this.imageRowToCodewordIndex(Math.trunc(r.getY())),o=this.imageRowToCodewordIndex(Math.trunc(n.getY())),s=this.getCodewords(),a=-1;for(let e=i;e<o;e++){if(null==s[e])continue;let r=s[e];r.setRowNumberAsRowIndicatorColumn();let n=r.getRowNumber()-a;0===n||(1===n?a=r.getRowNumber():r.getRowNumber()>=t.getRowCount()?s[e]=null:a=r.getRowNumber())}}getBarcodeMetadata(){let t=this.getCodewords(),e=new Xe,r=new Xe,n=new Xe,i=new Xe;for(let o of t){if(null==o)continue;o.setRowNumberAsRowIndicatorColumn();let t=o.getValue()%30,s=o.getRowNumber();switch(this._isLeft||(s+=2),s%3){case 0:r.setValue(3*t+1);break;case 1:i.setValue(t/3),n.setValue(t%3);break;case 2:e.setValue(t+1)}}if(0===e.getValue().length||0===r.getValue().length||0===n.getValue().length||0===i.getValue().length||e.getValue()[0]<1||r.getValue()[0]+n.getValue()[0]<Pe.MIN_ROWS_IN_BARCODE||r.getValue()[0]+n.getValue()[0]>Pe.MAX_ROWS_IN_BARCODE)return null;let o=new ze(e.getValue()[0],r.getValue()[0],n.getValue()[0],i.getValue()[0]);return this.removeIncorrectCodewords(t,o),o}removeIncorrectCodewords(t,e){for(let r=0;r<t.length;r++){let n=t[r];if(null==t[r])continue;let i=n.getValue()%30,o=n.getRowNumber();if(o>e.getRowCount())t[r]=null;else switch(this._isLeft||(o+=2),o%3){case 0:3*i+1!==e.getRowCountUpperPart()&&(t[r]=null);break;case 1:Math.trunc(i/3)===e.getErrorCorrectionLevel()&&i%3===e.getRowCountLowerPart()||(t[r]=null);break;case 2:i+1!==e.getColumnCount()&&(t[r]=null)}}}isLeft(){return this._isLeft}toString(){return"IsLeft: "+this._isLeft+"\n"+super.toString()}}class je{constructor(t,e){this.ADJUST_ROW_NUMBER_SKIP=2,this.barcodeMetadata=t,this.barcodeColumnCount=t.getColumnCount(),this.boundingBox=e,this.detectionResultColumns=new Array(this.barcodeColumnCount+2)}getDetectionResultColumns(){this.adjustIndicatorColumnRowNumbers(this.detectionResultColumns[0]),this.adjustIndicatorColumnRowNumbers(this.detectionResultColumns[this.barcodeColumnCount+1]);let t,e=Pe.MAX_CODEWORDS_IN_BARCODE;do{t=e,e=this.adjustRowNumbersAndGetCount()}while(e>0&&e<t);return this.detectionResultColumns}adjustIndicatorColumnRowNumbers(t){null!=t&&t.adjustCompleteIndicatorColumnRowNumbers(this.barcodeMetadata)}adjustRowNumbersAndGetCount(){let t=this.adjustRowNumbersByRow();if(0===t)return 0;for(let t=1;t<this.barcodeColumnCount+1;t++){let e=this.detectionResultColumns[t].getCodewords();for(let r=0;r<e.length;r++)null!=e[r]&&(e[r].hasValidRowNumber()||this.adjustRowNumbers(t,r,e))}return t}adjustRowNumbersByRow(){return this.adjustRowNumbersFromBothRI(),this.adjustRowNumbersFromLRI()+this.adjustRowNumbersFromRRI()}adjustRowNumbersFromBothRI(){if(null==this.detectionResultColumns[0]||null==this.detectionResultColumns[this.barcodeColumnCount+1])return;let t=this.detectionResultColumns[0].getCodewords(),e=this.detectionResultColumns[this.barcodeColumnCount+1].getCodewords();for(let r=0;r<t.length;r++)if(null!=t[r]&&null!=e[r]&&t[r].getRowNumber()===e[r].getRowNumber())for(let e=1;e<=this.barcodeColumnCount;e++){let n=this.detectionResultColumns[e].getCodewords()[r];null!=n&&(n.setRowNumber(t[r].getRowNumber()),n.hasValidRowNumber()||(this.detectionResultColumns[e].getCodewords()[r]=null))}}adjustRowNumbersFromRRI(){if(null==this.detectionResultColumns[this.barcodeColumnCount+1])return 0;let t=0,e=this.detectionResultColumns[this.barcodeColumnCount+1].getCodewords();for(let r=0;r<e.length;r++){if(null==e[r])continue;let n=e[r].getRowNumber(),i=0;for(let e=this.barcodeColumnCount+1;e>0&&i<this.ADJUST_ROW_NUMBER_SKIP;e--){let o=this.detectionResultColumns[e].getCodewords()[r];null!=o&&(i=je.adjustRowNumberIfValid(n,i,o),o.hasValidRowNumber()||t++)}}return t}adjustRowNumbersFromLRI(){if(null==this.detectionResultColumns[0])return 0;let t=0,e=this.detectionResultColumns[0].getCodewords();for(let r=0;r<e.length;r++){if(null==e[r])continue;let n=e[r].getRowNumber(),i=0;for(let e=1;e<this.barcodeColumnCount+1&&i<this.ADJUST_ROW_NUMBER_SKIP;e++){let o=this.detectionResultColumns[e].getCodewords()[r];null!=o&&(i=je.adjustRowNumberIfValid(n,i,o),o.hasValidRowNumber()||t++)}}return t}static adjustRowNumberIfValid(t,e,r){return null==r||r.hasValidRowNumber()||(r.isValidRowNumber(t)?(r.setRowNumber(t),e=0):++e),e}adjustRowNumbers(t,e,r){if(!this.detectionResultColumns[t-1])return;let n=r[e],i=this.detectionResultColumns[t-1].getCodewords(),o=i;null!=this.detectionResultColumns[t+1]&&(o=this.detectionResultColumns[t+1].getCodewords());let s=new Array(14);s[2]=i[e],s[3]=o[e],e>0&&(s[0]=r[e-1],s[4]=i[e-1],s[5]=o[e-1]),e>1&&(s[8]=r[e-2],s[10]=i[e-2],s[11]=o[e-2]),e<r.length-1&&(s[1]=r[e+1],s[6]=i[e+1],s[7]=o[e+1]),e<r.length-2&&(s[9]=r[e+2],s[12]=i[e+2],s[13]=o[e+2]);for(let t of s)if(je.adjustRowNumber(n,t))return}static adjustRowNumber(t,e){return!(null==e||!e.hasValidRowNumber()||e.getBucket()!==t.getBucket()||(t.setRowNumber(e.getRowNumber()),0))}getBarcodeColumnCount(){return this.barcodeColumnCount}getBarcodeRowCount(){return this.barcodeMetadata.getRowCount()}getBarcodeECLevel(){return this.barcodeMetadata.getErrorCorrectionLevel()}setBoundingBox(t){this.boundingBox=t}getBoundingBox(){return this.boundingBox}setDetectionResultColumn(t,e){this.detectionResultColumns[t]=e}getDetectionResultColumn(t){return this.detectionResultColumns[t]}toString(){let t=this.detectionResultColumns[0];null==t&&(t=this.detectionResultColumns[this.barcodeColumnCount+1]);let e=new Ge;for(let r=0;r<t.getCodewords().length;r++){e.format("CW %3d:",r);for(let t=0;t<this.barcodeColumnCount+2;t++){if(null==this.detectionResultColumns[t]){e.format("    |   ");continue}let n=this.detectionResultColumns[t].getCodewords()[r];null!=n?e.format(" %3d|%3d",n.getRowNumber(),n.getValue()):e.format("    |   ")}e.format("%n")}return e.toString()}}class Ze{constructor(t,e,r,n){this.rowNumber=Ze.BARCODE_ROW_UNKNOWN,this.startX=Math.trunc(t),this.endX=Math.trunc(e),this.bucket=Math.trunc(r),this.value=Math.trunc(n)}hasValidRowNumber(){return this.isValidRowNumber(this.rowNumber)}isValidRowNumber(t){return t!==Ze.BARCODE_ROW_UNKNOWN&&this.bucket===t%3*3}setRowNumberAsRowIndicatorColumn(){this.rowNumber=Math.trunc(3*Math.trunc(this.value/30)+Math.trunc(this.bucket/3))}getWidth(){return this.endX-this.startX}getStartX(){return this.startX}getEndX(){return this.endX}getBucket(){return this.bucket}getValue(){return this.value}getRowNumber(){return this.rowNumber}setRowNumber(t){this.rowNumber=t}toString(){return this.rowNumber+"|"+this.value}}Ze.BARCODE_ROW_UNKNOWN=-1;class Qe{static initialize(){for(let t=0;t<Pe.SYMBOL_TABLE.length;t++){let e=Pe.SYMBOL_TABLE[t],r=1&e;for(let n=0;n<Pe.BARS_IN_MODULE;n++){let i=0;for(;(1&e)===r;)i+=1,e>>=1;r=1&e,Qe.RATIOS_TABLE[t]||(Qe.RATIOS_TABLE[t]=new Array(Pe.BARS_IN_MODULE)),Qe.RATIOS_TABLE[t][Pe.BARS_IN_MODULE-n-1]=Math.fround(i/Pe.MODULES_IN_CODEWORD)}}this.bSymbolTableReady=!0}static getDecodedValue(t){let e=Qe.getDecodedCodewordValue(Qe.sampleBitCounts(t));return-1!==e?e:Qe.getClosestDecodedValue(t)}static sampleBitCounts(t){let e=rt.sum(t),r=new Int32Array(Pe.BARS_IN_MODULE),n=0,i=0;for(let o=0;o<Pe.MODULES_IN_CODEWORD;o++){let s=e/(2*Pe.MODULES_IN_CODEWORD)+o*e/Pe.MODULES_IN_CODEWORD;i+t[n]<=s&&(i+=t[n],n++),r[n]++}return r}static getDecodedCodewordValue(t){let e=Qe.getBitValue(t);return-1===Pe.getCodeword(e)?-1:e}static getBitValue(t){let e=0;for(let r=0;r<t.length;r++)for(let n=0;n<t[r];n++)e=e<<1|(r%2==0?1:0);return Math.trunc(e)}static getClosestDecodedValue(t){let e=rt.sum(t),r=new Array(Pe.BARS_IN_MODULE);if(e>1)for(let n=0;n<r.length;n++)r[n]=Math.fround(t[n]/e);let n=nt.MAX_VALUE,i=-1;this.bSymbolTableReady||Qe.initialize();for(let t=0;t<Qe.RATIOS_TABLE.length;t++){let e=0,o=Qe.RATIOS_TABLE[t];for(let t=0;t<Pe.BARS_IN_MODULE;t++){let i=Math.fround(o[t]-r[t]);if(e+=Math.fround(i*i),e>=n)break}e<n&&(n=e,i=Pe.SYMBOL_TABLE[t])}return i}}Qe.bSymbolTableReady=!1,Qe.RATIOS_TABLE=new Array(Pe.SYMBOL_TABLE.length).map((t=>new Array(Pe.BARS_IN_MODULE)));class Ke{constructor(){this.segmentCount=-1,this.fileSize=-1,this.timestamp=-1,this.checksum=-1}getSegmentIndex(){return this.segmentIndex}setSegmentIndex(t){this.segmentIndex=t}getFileId(){return this.fileId}setFileId(t){this.fileId=t}getOptionalData(){return this.optionalData}setOptionalData(t){this.optionalData=t}isLastSegment(){return this.lastSegment}setLastSegment(t){this.lastSegment=t}getSegmentCount(){return this.segmentCount}setSegmentCount(t){this.segmentCount=t}getSender(){return this.sender||null}setSender(t){this.sender=t}getAddressee(){return this.addressee||null}setAddressee(t){this.addressee=t}getFileName(){return this.fileName}setFileName(t){this.fileName=t}getFileSize(){return this.fileSize}setFileSize(t){this.fileSize=t}getChecksum(){return this.checksum}setChecksum(t){this.checksum=t}getTimestamp(){return this.timestamp}setTimestamp(t){this.timestamp=t}}class qe{static parseLong(t,e=undefined){return parseInt(t,e)}}class Je extends s{}Je.kind="NullPointerException";class $e{writeBytes(t){this.writeBytesOffset(t,0,t.length)}writeBytesOffset(t,e,r){if(null==t)throw new Je;if(e<0||e>t.length||r<0||e+r>t.length||e+r<0)throw new f;if(0!==r)for(let n=0;n<r;n++)this.write(t[e+n])}flush(){}close(){}}class tr extends s{}class er extends $e{constructor(t=32){if(super(),this.count=0,t<0)throw new c("Negative initial size: "+t);this.buf=new Uint8Array(t)}ensureCapacity(t){t-this.buf.length>0&&this.grow(t)}grow(t){let e=this.buf.length<<1;if(e-t<0&&(e=t),e<0){if(t<0)throw new tr;e=m.MAX_VALUE}this.buf=w.copyOfUint8Array(this.buf,e)}write(t){this.ensureCapacity(this.count+1),this.buf[this.count]=t,this.count+=1}writeBytesOffset(t,e,r){if(e<0||e>t.length||r<0||e+r-t.length>0)throw new f;this.ensureCapacity(this.count+r),d.arraycopy(t,e,this.buf,this.count,r),this.count+=r}writeTo(t){t.writeBytesOffset(this.buf,0,this.count)}reset(){this.count=0}toByteArray(){return w.copyOfUint8Array(this.buf,this.count)}size(){return this.count}toString(t){return t?"string"==typeof t?this.toString_string(t):this.toString_number(t):this.toString_void()}toString_void(){return new String(this.buf).toString()}toString_string(t){return new String(this.buf).toString()}toString_number(t){return new String(this.buf).toString()}close(){}}function rr(){if("undefined"!=typeof window)return window.BigInt||null;if(void 0!==r.g)return r.g.BigInt||null;if("undefined"!=typeof self)return self.BigInt||null;throw new Error("Can't search globals for BigInt!")}let nr;function ir(t){if(void 0===nr&&(nr=rr()),null===nr)throw new Error("BigInt is not supported!");return nr(t)}!function(t){t[t.ALPHA=0]="ALPHA",t[t.LOWER=1]="LOWER",t[t.MIXED=2]="MIXED",t[t.PUNCT=3]="PUNCT",t[t.ALPHA_SHIFT=4]="ALPHA_SHIFT",t[t.PUNCT_SHIFT=5]="PUNCT_SHIFT"}(X||(X={}));class or{static decode(t,e){let r=new y(""),n=I.ISO8859_1;r.enableDecoding(n);let i=1,o=t[i++],s=new Ke;for(;i<t[0];){switch(o){case or.TEXT_COMPACTION_MODE_LATCH:i=or.textCompaction(t,i,r);break;case or.BYTE_COMPACTION_MODE_LATCH:case or.BYTE_COMPACTION_MODE_LATCH_6:i=or.byteCompaction(o,t,n,i,r);break;case or.MODE_SHIFT_TO_BYTE_COMPACTION_MODE:r.append(t[i++]);break;case or.NUMERIC_COMPACTION_MODE_LATCH:i=or.numericCompaction(t,i,r);break;case or.ECI_CHARSET:I.getCharacterSetECIByValue(t[i++]);break;case or.ECI_GENERAL_PURPOSE:i+=2;break;case or.ECI_USER_DEFINED:i++;break;case or.BEGIN_MACRO_PDF417_CONTROL_BLOCK:i=or.decodeMacroBlock(t,i,s);break;case or.BEGIN_MACRO_PDF417_OPTIONAL_FIELD:case or.MACRO_PDF417_TERMINATOR:throw new E;default:i--,i=or.textCompaction(t,i,r)}if(!(i<t.length))throw E.getFormatInstance();o=t[i++]}if(0===r.length())throw E.getFormatInstance();let a=new j(null,r.toString(),null,e);return a.setOther(s),a}static decodeMacroBlock(t,e,r){if(e+or.NUMBER_OF_SEQUENCE_CODEWORDS>t[0])throw E.getFormatInstance();let n=new Int32Array(or.NUMBER_OF_SEQUENCE_CODEWORDS);for(let r=0;r<or.NUMBER_OF_SEQUENCE_CODEWORDS;r++,e++)n[r]=t[e];r.setSegmentIndex(m.parseInt(or.decodeBase900toBase10(n,or.NUMBER_OF_SEQUENCE_CODEWORDS)));let i=new y;e=or.textCompaction(t,e,i),r.setFileId(i.toString());let o=-1;for(t[e]===or.BEGIN_MACRO_PDF417_OPTIONAL_FIELD&&(o=e+1);e<t[0];)switch(t[e]){case or.BEGIN_MACRO_PDF417_OPTIONAL_FIELD:switch(t[++e]){case or.MACRO_PDF417_OPTIONAL_FIELD_FILE_NAME:let n=new y;e=or.textCompaction(t,e+1,n),r.setFileName(n.toString());break;case or.MACRO_PDF417_OPTIONAL_FIELD_SENDER:let i=new y;e=or.textCompaction(t,e+1,i),r.setSender(i.toString());break;case or.MACRO_PDF417_OPTIONAL_FIELD_ADDRESSEE:let o=new y;e=or.textCompaction(t,e+1,o),r.setAddressee(o.toString());break;case or.MACRO_PDF417_OPTIONAL_FIELD_SEGMENT_COUNT:let s=new y;e=or.numericCompaction(t,e+1,s),r.setSegmentCount(m.parseInt(s.toString()));break;case or.MACRO_PDF417_OPTIONAL_FIELD_TIME_STAMP:let a=new y;e=or.numericCompaction(t,e+1,a),r.setTimestamp(qe.parseLong(a.toString()));break;case or.MACRO_PDF417_OPTIONAL_FIELD_CHECKSUM:let c=new y;e=or.numericCompaction(t,e+1,c),r.setChecksum(m.parseInt(c.toString()));break;case or.MACRO_PDF417_OPTIONAL_FIELD_FILE_SIZE:let l=new y;e=or.numericCompaction(t,e+1,l),r.setFileSize(qe.parseLong(l.toString()));break;default:throw E.getFormatInstance()}break;case or.MACRO_PDF417_TERMINATOR:e++,r.setLastSegment(!0);break;default:throw E.getFormatInstance()}if(-1!==o){let n=e-o;r.isLastSegment()&&n--,r.setOptionalData(w.copyOfRange(t,o,o+n))}return e}static textCompaction(t,e,r){let n=new Int32Array(2*(t[0]-e)),i=new Int32Array(2*(t[0]-e)),o=0,s=!1;for(;e<t[0]&&!s;){let r=t[e++];if(r<or.TEXT_COMPACTION_MODE_LATCH)n[o]=r/30,n[o+1]=r%30,o+=2;else switch(r){case or.TEXT_COMPACTION_MODE_LATCH:n[o++]=or.TEXT_COMPACTION_MODE_LATCH;break;case or.BYTE_COMPACTION_MODE_LATCH:case or.BYTE_COMPACTION_MODE_LATCH_6:case or.NUMERIC_COMPACTION_MODE_LATCH:case or.BEGIN_MACRO_PDF417_CONTROL_BLOCK:case or.BEGIN_MACRO_PDF417_OPTIONAL_FIELD:case or.MACRO_PDF417_TERMINATOR:e--,s=!0;break;case or.MODE_SHIFT_TO_BYTE_COMPACTION_MODE:n[o]=or.MODE_SHIFT_TO_BYTE_COMPACTION_MODE,r=t[e++],i[o]=r,o++}}return or.decodeTextCompaction(n,i,o,r),e}static decodeTextCompaction(t,e,r,n){let i=X.ALPHA,o=X.ALPHA,s=0;for(;s<r;){let r=t[s],a="";switch(i){case X.ALPHA:if(r<26)a=String.fromCharCode(65+r);else switch(r){case 26:a=" ";break;case or.LL:i=X.LOWER;break;case or.ML:i=X.MIXED;break;case or.PS:o=i,i=X.PUNCT_SHIFT;break;case or.MODE_SHIFT_TO_BYTE_COMPACTION_MODE:n.append(e[s]);break;case or.TEXT_COMPACTION_MODE_LATCH:i=X.ALPHA}break;case X.LOWER:if(r<26)a=String.fromCharCode(97+r);else switch(r){case 26:a=" ";break;case or.AS:o=i,i=X.ALPHA_SHIFT;break;case or.ML:i=X.MIXED;break;case or.PS:o=i,i=X.PUNCT_SHIFT;break;case or.MODE_SHIFT_TO_BYTE_COMPACTION_MODE:n.append(e[s]);break;case or.TEXT_COMPACTION_MODE_LATCH:i=X.ALPHA}break;case X.MIXED:if(r<or.PL)a=or.MIXED_CHARS[r];else switch(r){case or.PL:i=X.PUNCT;break;case 26:a=" ";break;case or.LL:i=X.LOWER;break;case or.AL:i=X.ALPHA;break;case or.PS:o=i,i=X.PUNCT_SHIFT;break;case or.MODE_SHIFT_TO_BYTE_COMPACTION_MODE:n.append(e[s]);break;case or.TEXT_COMPACTION_MODE_LATCH:i=X.ALPHA}break;case X.PUNCT:if(r<or.PAL)a=or.PUNCT_CHARS[r];else switch(r){case or.PAL:i=X.ALPHA;break;case or.MODE_SHIFT_TO_BYTE_COMPACTION_MODE:n.append(e[s]);break;case or.TEXT_COMPACTION_MODE_LATCH:i=X.ALPHA}break;case X.ALPHA_SHIFT:if(i=o,r<26)a=String.fromCharCode(65+r);else switch(r){case 26:a=" ";break;case or.TEXT_COMPACTION_MODE_LATCH:i=X.ALPHA}break;case X.PUNCT_SHIFT:if(i=o,r<or.PAL)a=or.PUNCT_CHARS[r];else switch(r){case or.PAL:i=X.ALPHA;break;case or.MODE_SHIFT_TO_BYTE_COMPACTION_MODE:n.append(e[s]);break;case or.TEXT_COMPACTION_MODE_LATCH:i=X.ALPHA}}""!==a&&n.append(a),s++}}static byteCompaction(t,e,r,n,i){let o=new er,s=0,a=0,c=!1;switch(t){case or.BYTE_COMPACTION_MODE_LATCH:let t=new Int32Array(6),r=e[n++];for(;n<e[0]&&!c;)switch(t[s++]=r,a=900*a+r,r=e[n++],r){case or.TEXT_COMPACTION_MODE_LATCH:case or.BYTE_COMPACTION_MODE_LATCH:case or.NUMERIC_COMPACTION_MODE_LATCH:case or.BYTE_COMPACTION_MODE_LATCH_6:case or.BEGIN_MACRO_PDF417_CONTROL_BLOCK:case or.BEGIN_MACRO_PDF417_OPTIONAL_FIELD:case or.MACRO_PDF417_TERMINATOR:n--,c=!0;break;default:if(s%5==0&&s>0){for(let t=0;t<6;++t)o.write(Number(ir(a)>>ir(8*(5-t))));a=0,s=0}}n===e[0]&&r<or.TEXT_COMPACTION_MODE_LATCH&&(t[s++]=r);for(let e=0;e<s;e++)o.write(t[e]);break;case or.BYTE_COMPACTION_MODE_LATCH_6:for(;n<e[0]&&!c;){let t=e[n++];if(t<or.TEXT_COMPACTION_MODE_LATCH)s++,a=900*a+t;else switch(t){case or.TEXT_COMPACTION_MODE_LATCH:case or.BYTE_COMPACTION_MODE_LATCH:case or.NUMERIC_COMPACTION_MODE_LATCH:case or.BYTE_COMPACTION_MODE_LATCH_6:case or.BEGIN_MACRO_PDF417_CONTROL_BLOCK:case or.BEGIN_MACRO_PDF417_OPTIONAL_FIELD:case or.MACRO_PDF417_TERMINATOR:n--,c=!0}if(s%5==0&&s>0){for(let t=0;t<6;++t)o.write(Number(ir(a)>>ir(8*(5-t))));a=0,s=0}}}return i.append(_.decode(o.toByteArray(),r)),n}static numericCompaction(t,e,r){let n=0,i=!1,o=new Int32Array(or.MAX_NUMERIC_CODEWORDS);for(;e<t[0]&&!i;){let s=t[e++];if(e===t[0]&&(i=!0),s<or.TEXT_COMPACTION_MODE_LATCH)o[n]=s,n++;else switch(s){case or.TEXT_COMPACTION_MODE_LATCH:case or.BYTE_COMPACTION_MODE_LATCH:case or.BYTE_COMPACTION_MODE_LATCH_6:case or.BEGIN_MACRO_PDF417_CONTROL_BLOCK:case or.BEGIN_MACRO_PDF417_OPTIONAL_FIELD:case or.MACRO_PDF417_TERMINATOR:e--,i=!0}(n%or.MAX_NUMERIC_CODEWORDS==0||s===or.NUMERIC_COMPACTION_MODE_LATCH||i)&&n>0&&(r.append(or.decodeBase900toBase10(o,n)),n=0)}return e}static decodeBase900toBase10(t,e){let r=ir(0);for(let n=0;n<e;n++)r+=or.EXP900[e-n-1]*ir(t[n]);let n=r.toString();if("1"!==n.charAt(0))throw new E;return n.substring(1)}}or.TEXT_COMPACTION_MODE_LATCH=900,or.BYTE_COMPACTION_MODE_LATCH=901,or.NUMERIC_COMPACTION_MODE_LATCH=902,or.BYTE_COMPACTION_MODE_LATCH_6=924,or.ECI_USER_DEFINED=925,or.ECI_GENERAL_PURPOSE=926,or.ECI_CHARSET=927,or.BEGIN_MACRO_PDF417_CONTROL_BLOCK=928,or.BEGIN_MACRO_PDF417_OPTIONAL_FIELD=923,or.MACRO_PDF417_TERMINATOR=922,or.MODE_SHIFT_TO_BYTE_COMPACTION_MODE=913,or.MAX_NUMERIC_CODEWORDS=15,or.MACRO_PDF417_OPTIONAL_FIELD_FILE_NAME=0,or.MACRO_PDF417_OPTIONAL_FIELD_SEGMENT_COUNT=1,or.MACRO_PDF417_OPTIONAL_FIELD_TIME_STAMP=2,or.MACRO_PDF417_OPTIONAL_FIELD_SENDER=3,or.MACRO_PDF417_OPTIONAL_FIELD_ADDRESSEE=4,or.MACRO_PDF417_OPTIONAL_FIELD_FILE_SIZE=5,or.MACRO_PDF417_OPTIONAL_FIELD_CHECKSUM=6,or.PL=25,or.LL=27,or.AS=27,or.ML=28,or.AL=28,or.PS=29,or.PAL=29,or.PUNCT_CHARS=";<>@[\\]_`~!\r\t,:\n-.$/\"|*()?{}'",or.MIXED_CHARS="0123456789&\r\t,:#-.$/+%*=^",or.EXP900=rr()?function(){let t=[];t[0]=ir(1);let e=ir(900);t[1]=e;for(let r=2;r<16;r++)t[r]=t[r-1]*e;return t}():[],or.NUMBER_OF_SEQUENCE_CODEWORDS=2;class sr{constructor(){}static decode(t,e,r,n,i,o,s){let a,c=new Ve(t,e,r,n,i),l=null,h=null;for(let r=!0;;r=!1){if(null!=e&&(l=sr.getRowIndicatorColumn(t,c,e,!0,o,s)),null!=n&&(h=sr.getRowIndicatorColumn(t,c,n,!1,o,s)),a=sr.merge(l,h),null==a)throw D.getNotFoundInstance();let i=a.getBoundingBox();if(!r||null==i||!(i.getMinY()<c.getMinY()||i.getMaxY()>c.getMaxY()))break;c=i}a.setBoundingBox(c);let u=a.getBarcodeColumnCount()+1;a.setDetectionResultColumn(0,l),a.setDetectionResultColumn(u,h);let d=null!=l;for(let e=1;e<=u;e++){let r,n=d?e:u-e;if(void 0!==a.getDetectionResultColumn(n))continue;r=0===n||n===u?new We(c,0===n):new Ye(c),a.setDetectionResultColumn(n,r);let i=-1,l=i;for(let e=c.getMinY();e<=c.getMaxY();e++){if(i=sr.getStartColumn(a,n,e,d),i<0||i>c.getMaxX()){if(-1===l)continue;i=l}let h=sr.detectCodeword(t,c.getMinX(),c.getMaxX(),d,i,e,o,s);null!=h&&(r.setCodeword(e,h),l=i,o=Math.min(o,h.getWidth()),s=Math.max(s,h.getWidth()))}}return sr.createDecoderResult(a)}static merge(t,e){if(null==t&&null==e)return null;let r=sr.getBarcodeMetadata(t,e);if(null==r)return null;let n=Ve.merge(sr.adjustBoundingBox(t),sr.adjustBoundingBox(e));return new je(r,n)}static adjustBoundingBox(t){if(null==t)return null;let e=t.getRowHeights();if(null==e)return null;let r=sr.getMax(e),n=0;for(let t of e)if(n+=r-t,t>0)break;let i=t.getCodewords();for(let t=0;n>0&&null==i[t];t++)n--;let o=0;for(let t=e.length-1;t>=0&&(o+=r-e[t],!(e[t]>0));t--);for(let t=i.length-1;o>0&&null==i[t];t--)o--;return t.getBoundingBox().addMissingRows(n,o,t.isLeft())}static getMax(t){let e=-1;for(let r of t)e=Math.max(e,r);return e}static getBarcodeMetadata(t,e){let r,n;return null==t||null==(r=t.getBarcodeMetadata())?null==e?null:e.getBarcodeMetadata():null==e||null==(n=e.getBarcodeMetadata())?r:r.getColumnCount()!==n.getColumnCount()&&r.getErrorCorrectionLevel()!==n.getErrorCorrectionLevel()&&r.getRowCount()!==n.getRowCount()?null:r}static getRowIndicatorColumn(t,e,r,n,i,o){let s=new We(e,n);for(let a=0;a<2;a++){let c=0===a?1:-1,l=Math.trunc(Math.trunc(r.getX()));for(let a=Math.trunc(Math.trunc(r.getY()));a<=e.getMaxY()&&a>=e.getMinY();a+=c){let e=sr.detectCodeword(t,0,t.getWidth(),n,l,a,i,o);null!=e&&(s.setCodeword(a,e),l=n?e.getStartX():e.getEndX())}}return s}static adjustCodewordCount(t,e){let r=e[0][1],n=r.getValue(),i=t.getBarcodeColumnCount()*t.getBarcodeRowCount()-sr.getNumberOfECCodeWords(t.getBarcodeECLevel());if(0===n.length){if(i<1||i>Pe.MAX_CODEWORDS_IN_BARCODE)throw D.getNotFoundInstance();r.setValue(i)}else n[0]!==i&&r.setValue(i)}static createDecoderResult(t){let e=sr.createBarcodeMatrix(t);sr.adjustCodewordCount(t,e);let r=new Array,n=new Int32Array(t.getBarcodeRowCount()*t.getBarcodeColumnCount()),i=[],o=new Array;for(let s=0;s<t.getBarcodeRowCount();s++)for(let a=0;a<t.getBarcodeColumnCount();a++){let c=e[s][a+1].getValue(),l=s*t.getBarcodeColumnCount()+a;0===c.length?r.push(l):1===c.length?n[l]=c[0]:(o.push(l),i.push(c))}let s=new Array(i.length);for(let t=0;t<s.length;t++)s[t]=i[t];return sr.createDecoderResultFromAmbiguousValues(t.getBarcodeECLevel(),n,Pe.toIntArray(r),Pe.toIntArray(o),s)}static createDecoderResultFromAmbiguousValues(t,e,r,n,i){let o=new Int32Array(n.length),s=100;for(;s-- >0;){for(let t=0;t<o.length;t++)e[n[t]]=i[t][o[t]];try{return sr.decodeCodewords(e,t,r)}catch(t){if(!(t instanceof h))throw t}if(0===o.length)throw h.getChecksumInstance();for(let t=0;t<o.length;t++){if(o[t]<i[t].length-1){o[t]++;break}if(o[t]=0,t===o.length-1)throw h.getChecksumInstance()}}throw h.getChecksumInstance()}static createBarcodeMatrix(t){let e=Array.from({length:t.getBarcodeRowCount()},(()=>new Array(t.getBarcodeColumnCount()+2)));for(let t=0;t<e.length;t++)for(let r=0;r<e[t].length;r++)e[t][r]=new Xe;let r=0;for(let n of t.getDetectionResultColumns()){if(null!=n)for(let t of n.getCodewords())if(null!=t){let n=t.getRowNumber();if(n>=0){if(n>=e.length)continue;e[n][r].setValue(t.getValue())}}r++}return e}static isValidBarcodeColumn(t,e){return e>=0&&e<=t.getBarcodeColumnCount()+1}static getStartColumn(t,e,r,n){let i=n?1:-1,o=null;if(sr.isValidBarcodeColumn(t,e-i)&&(o=t.getDetectionResultColumn(e-i).getCodeword(r)),null!=o)return n?o.getEndX():o.getStartX();if(o=t.getDetectionResultColumn(e).getCodewordNearby(r),null!=o)return n?o.getStartX():o.getEndX();if(sr.isValidBarcodeColumn(t,e-i)&&(o=t.getDetectionResultColumn(e-i).getCodewordNearby(r)),null!=o)return n?o.getEndX():o.getStartX();let s=0;for(;sr.isValidBarcodeColumn(t,e-i);){e-=i;for(let r of t.getDetectionResultColumn(e).getCodewords())if(null!=r)return(n?r.getEndX():r.getStartX())+i*s*(r.getEndX()-r.getStartX());s++}return n?t.getBoundingBox().getMinX():t.getBoundingBox().getMaxX()}static detectCodeword(t,e,r,n,i,o,s,a){i=sr.adjustCodewordStartColumn(t,e,r,n,i,o);let c,l=sr.getModuleBitCount(t,e,r,n,i,o);if(null==l)return null;let h=rt.sum(l);if(n)c=i+h;else{for(let t=0;t<l.length/2;t++){let e=l[t];l[t]=l[l.length-1-t],l[l.length-1-t]=e}c=i,i=c-h}if(!sr.checkCodewordSkew(h,s,a))return null;let u=Qe.getDecodedValue(l),d=Pe.getCodeword(u);return-1===d?null:new Ze(i,c,sr.getCodewordBucketNumber(u),d)}static getModuleBitCount(t,e,r,n,i,o){let s=i,a=new Int32Array(8),c=0,l=n?1:-1,h=n;for(;(n?s<r:s>=e)&&c<a.length;)t.get(s,o)===h?(a[c]++,s+=l):(c++,h=!h);return c===a.length||s===(n?r:e)&&c===a.length-1?a:null}static getNumberOfECCodeWords(t){return 2<<t}static adjustCodewordStartColumn(t,e,r,n,i,o){let s=i,a=n?-1:1;for(let c=0;c<2;c++){for(;(n?s>=e:s<r)&&n===t.get(s,o);){if(Math.abs(i-s)>sr.CODEWORD_SKEW_SIZE)return i;s+=a}a=-a,n=!n}return s}static checkCodewordSkew(t,e,r){return e-sr.CODEWORD_SKEW_SIZE<=t&&t<=r+sr.CODEWORD_SKEW_SIZE}static decodeCodewords(t,e,r){if(0===t.length)throw E.getFormatInstance();let n=1<<e+1,i=sr.correctErrors(t,r,n);sr.verifyCodewordCount(t,n);let o=or.decode(t,""+e);return o.setErrorsCorrected(i),o.setErasures(r.length),o}static correctErrors(t,e,r){if(null!=e&&e.length>r/2+sr.MAX_ERRORS||r<0||r>sr.MAX_EC_CODEWORDS)throw h.getChecksumInstance();return sr.errorCorrection.decode(t,r,e)}static verifyCodewordCount(t,e){if(t.length<4)throw E.getFormatInstance();let r=t[0];if(r>t.length)throw E.getFormatInstance();if(0===r){if(!(e<t.length))throw E.getFormatInstance();t[0]=t.length-e}}static getBitCountForCodeword(t){let e=new Int32Array(8),r=0,n=e.length-1;for(;!((1&t)!==r&&(r=1&t,n--,n<0));)e[n]++,t>>=1;return e}static getCodewordBucketNumber(t){return t instanceof Int32Array?this.getCodewordBucketNumber_Int32Array(t):this.getCodewordBucketNumber_number(t)}static getCodewordBucketNumber_number(t){return sr.getCodewordBucketNumber(sr.getBitCountForCodeword(t))}static getCodewordBucketNumber_Int32Array(t){return(t[0]-t[2]+t[4]-t[6]+9)%9}static toString(t){let e=new Ge;for(let r=0;r<t.length;r++){e.format("Row %2d: ",r);for(let n=0;n<t[r].length;n++){let i=t[r][n];0===i.getValue().length?e.format("        ",null):e.format("%4d(%2d)",i.getValue()[0],i.getConfidence(i.getValue()[0]))}e.format("%n")}return e.toString()}}sr.CODEWORD_SKEW_SIZE=2,sr.MAX_ERRORS=3,sr.MAX_EC_CODEWORDS=512,sr.errorCorrection=new He;class ar{decode(t,e=null){let r=ar.decode(t,e,!1);if(null==r||0===r.length||null==r[0])throw D.getNotFoundInstance();return r[0]}decodeMultiple(t,e=null){try{return ar.decode(t,e,!0)}catch(t){if(t instanceof E||t instanceof h)throw D.getNotFoundInstance();throw t}}static decode(t,e,r){const n=new Array,i=Fe.detectMultiple(t,e,r);for(const t of i.getPoints()){const e=sr.decode(i.getBits(),t[4],t[5],t[6],t[7],ar.getMinCodewordWidth(t),ar.getMaxCodewordWidth(t)),r=new x(e.getText(),e.getRawBytes(),void 0,t,U.PDF_417);r.putMetadata(W.ERROR_CORRECTION_LEVEL,e.getECLevel());const o=e.getOther();null!=o&&r.putMetadata(W.PDF417_EXTRA_METADATA,o),n.push(r)}return n.map((t=>t))}static getMaxWidth(t,e){return null==t||null==e?0:Math.trunc(Math.abs(t.getX()-e.getX()))}static getMinWidth(t,e){return null==t||null==e?m.MAX_VALUE:Math.trunc(Math.abs(t.getX()-e.getX()))}static getMaxCodewordWidth(t){return Math.floor(Math.max(Math.max(ar.getMaxWidth(t[0],t[4]),ar.getMaxWidth(t[6],t[2])*Pe.MODULES_IN_CODEWORD/Pe.MODULES_IN_STOP_PATTERN),Math.max(ar.getMaxWidth(t[1],t[5]),ar.getMaxWidth(t[7],t[3])*Pe.MODULES_IN_CODEWORD/Pe.MODULES_IN_STOP_PATTERN)))}static getMinCodewordWidth(t){return Math.floor(Math.min(Math.min(ar.getMinWidth(t[0],t[4]),ar.getMinWidth(t[6],t[2])*Pe.MODULES_IN_CODEWORD/Pe.MODULES_IN_STOP_PATTERN),Math.min(ar.getMinWidth(t[1],t[5]),ar.getMinWidth(t[7],t[3])*Pe.MODULES_IN_CODEWORD/Pe.MODULES_IN_STOP_PATTERN)))}reset(){}}class cr extends s{}cr.kind="ReaderException";class lr{constructor(t,e){this.verbose=!0===t,e&&this.setHints(e)}decode(t,e){return e&&this.setHints(e),this.decodeInternal(t)}decodeWithState(t){return null!==this.readers&&void 0!==this.readers||this.setHints(null),this.decodeInternal(t)}setHints(t){this.hints=t;const r=!e(t)&&!0===t.get(C.TRY_HARDER),n=e(t)?null:t.get(C.POSSIBLE_FORMATS),i=new Array;if(!e(n)){const e=n.some((t=>t===U.UPC_A||t===U.UPC_E||t===U.EAN_13||t===U.EAN_8||t===U.CODABAR||t===U.CODE_39||t===U.CODE_93||t===U.CODE_128||t===U.ITF||t===U.RSS_14||t===U.RSS_EXPANDED));e&&!r&&i.push(new ie(t,this.verbose)),n.includes(U.QR_CODE)&&i.push(new Le),n.includes(U.DATA_MATRIX)&&i.push(new ge),n.includes(U.AZTEC)&&i.push(new gt),n.includes(U.PDF_417)&&i.push(new ar),e&&r&&i.push(new ie(t,this.verbose))}0===i.length&&(r||i.push(new ie(t,this.verbose)),i.push(new Le),i.push(new ge),i.push(new gt),i.push(new ar),r&&i.push(new ie(t,this.verbose))),this.readers=i}reset(){if(null!==this.readers)for(const t of this.readers)t.reset()}decodeInternal(t){if(null===this.readers)throw new cr("No readers where selected, nothing can be read.");for(const e of this.readers)try{return e.decode(t,this.hints)}catch(t){if(t instanceof cr)continue}throw new D("No MultiFormat Readers were able to detect the code.")}}var hr;!function(t){t[t.ERROR_CORRECTION=0]="ERROR_CORRECTION",t[t.CHARACTER_SET=1]="CHARACTER_SET",t[t.DATA_MATRIX_SHAPE=2]="DATA_MATRIX_SHAPE",t[t.MIN_SIZE=3]="MIN_SIZE",t[t.MAX_SIZE=4]="MAX_SIZE",t[t.MARGIN=5]="MARGIN",t[t.PDF417_COMPACT=6]="PDF417_COMPACT",t[t.PDF417_COMPACTION=7]="PDF417_COMPACTION",t[t.PDF417_DIMENSIONS=8]="PDF417_DIMENSIONS",t[t.AZTEC_LAYERS=9]="AZTEC_LAYERS",t[t.QR_VERSION=10]="QR_VERSION"}(hr||(hr={}));var ur=hr;class dr{constructor(t){this.field=t,this.cachedGenerators=[],this.cachedGenerators.push(new Q(t,Int32Array.from([1])))}buildGenerator(t){const e=this.cachedGenerators;if(t>=e.length){let r=e[e.length-1];const n=this.field;for(let i=e.length;i<=t;i++){const t=r.multiply(new Q(n,Int32Array.from([1,n.exp(i-1+n.getGeneratorBase())])));e.push(t),r=t}}return e[t]}encode(t,e){if(0===e)throw new c("No error correction bytes");const r=t.length-e;if(r<=0)throw new c("No data bytes provided");const n=this.buildGenerator(e),i=new Int32Array(r);d.arraycopy(t,0,i,0,r);let o=new Q(this.field,i);o=o.multiplyByMonomial(e,1);const s=o.divide(n)[1].getCoefficients(),a=e-s.length;for(let e=0;e<a;e++)t[r+e]=0;d.arraycopy(s,0,t,r+a,s.length)}}class fr{constructor(){}static applyMaskPenaltyRule1(t){return fr.applyMaskPenaltyRule1Internal(t,!0)+fr.applyMaskPenaltyRule1Internal(t,!1)}static applyMaskPenaltyRule2(t){let e=0;const r=t.getArray(),n=t.getWidth(),i=t.getHeight();for(let t=0;t<i-1;t++){const i=r[t];for(let o=0;o<n-1;o++){const n=i[o];n===i[o+1]&&n===r[t+1][o]&&n===r[t+1][o+1]&&e++}}return fr.N2*e}static applyMaskPenaltyRule3(t){let e=0;const r=t.getArray(),n=t.getWidth(),i=t.getHeight();for(let t=0;t<i;t++)for(let o=0;o<n;o++){const s=r[t];o+6<n&&1===s[o]&&0===s[o+1]&&1===s[o+2]&&1===s[o+3]&&1===s[o+4]&&0===s[o+5]&&1===s[o+6]&&(fr.isWhiteHorizontal(s,o-4,o)||fr.isWhiteHorizontal(s,o+7,o+11))&&e++,t+6<i&&1===r[t][o]&&0===r[t+1][o]&&1===r[t+2][o]&&1===r[t+3][o]&&1===r[t+4][o]&&0===r[t+5][o]&&1===r[t+6][o]&&(fr.isWhiteVertical(r,o,t-4,t)||fr.isWhiteVertical(r,o,t+7,t+11))&&e++}return e*fr.N3}static isWhiteHorizontal(t,e,r){e=Math.max(e,0),r=Math.min(r,t.length);for(let n=e;n<r;n++)if(1===t[n])return!1;return!0}static isWhiteVertical(t,e,r,n){r=Math.max(r,0),n=Math.min(n,t.length);for(let i=r;i<n;i++)if(1===t[i][e])return!1;return!0}static applyMaskPenaltyRule4(t){let e=0;const r=t.getArray(),n=t.getWidth(),i=t.getHeight();for(let t=0;t<i;t++){const i=r[t];for(let t=0;t<n;t++)1===i[t]&&e++}const o=t.getHeight()*t.getWidth();return Math.floor(10*Math.abs(2*e-o)/o)*fr.N4}static getDataMaskBit(t,e,r){let n,i;switch(t){case 0:n=r+e&1;break;case 1:n=1&r;break;case 2:n=e%3;break;case 3:n=(r+e)%3;break;case 4:n=Math.floor(r/2)+Math.floor(e/3)&1;break;case 5:i=r*e,n=(1&i)+i%3;break;case 6:i=r*e,n=(1&i)+i%3&1;break;case 7:i=r*e,n=i%3+(r+e&1)&1;break;default:throw new c("Invalid mask pattern: "+t)}return 0===n}static applyMaskPenaltyRule1Internal(t,e){let r=0;const n=e?t.getHeight():t.getWidth(),i=e?t.getWidth():t.getHeight(),o=t.getArray();for(let t=0;t<n;t++){let n=0,s=-1;for(let a=0;a<i;a++){const i=e?o[t][a]:o[a][t];i===s?n++:(n>=5&&(r+=fr.N1+(n-5)),n=1,s=i)}n>=5&&(r+=fr.N1+(n-5))}return r}}fr.N1=3,fr.N2=3,fr.N3=40,fr.N4=10;class gr{constructor(t,e){this.width=t,this.height=e;const r=new Array(e);for(let n=0;n!==e;n++)r[n]=new Uint8Array(t);this.bytes=r}getHeight(){return this.height}getWidth(){return this.width}get(t,e){return this.bytes[e][t]}getArray(){return this.bytes}setNumber(t,e,r){this.bytes[e][t]=r}setBoolean(t,e,r){this.bytes[e][t]=r?1:0}clear(t){for(const e of this.bytes)w.fill(e,t)}equals(t){if(!(t instanceof gr))return!1;const e=t;if(this.width!==e.width)return!1;if(this.height!==e.height)return!1;for(let t=0,r=this.height;t<r;++t){const r=this.bytes[t],n=e.bytes[t];for(let t=0,e=this.width;t<e;++t)if(r[t]!==n[t])return!1}return!0}toString(){const t=new y;for(let e=0,r=this.height;e<r;++e){const r=this.bytes[e];for(let e=0,n=this.width;e<n;++e)switch(r[e]){case 0:t.append(" 0");break;case 1:t.append(" 1");break;default:t.append("  ")}t.append("\n")}return t.toString()}}class wr{constructor(){this.maskPattern=-1}getMode(){return this.mode}getECLevel(){return this.ecLevel}getVersion(){return this.version}getMaskPattern(){return this.maskPattern}getMatrix(){return this.matrix}toString(){const t=new y;return t.append("<<\n"),t.append(" mode: "),t.append(this.mode?this.mode.toString():"null"),t.append("\n ecLevel: "),t.append(this.ecLevel?this.ecLevel.toString():"null"),t.append("\n version: "),t.append(this.version?this.version.toString():"null"),t.append("\n maskPattern: "),t.append(this.maskPattern.toString()),this.matrix?(t.append("\n matrix:\n"),t.append(this.matrix.toString())):t.append("\n matrix: null\n"),t.append(">>\n"),t.toString()}setMode(t){this.mode=t}setECLevel(t){this.ecLevel=t}setVersion(t){this.version=t}setMaskPattern(t){this.maskPattern=t}setMatrix(t){this.matrix=t}static isValidMaskPattern(t){return t>=0&&t<wr.NUM_MASK_PATTERNS}}wr.NUM_MASK_PATTERNS=8;class mr extends s{}mr.kind="WriterException";class pr{constructor(){}static clearMatrix(t){t.clear(255)}static buildMatrix(t,e,r,n,i){pr.clearMatrix(i),pr.embedBasicPatterns(r,i),pr.embedTypeInfo(e,n,i),pr.maybeEmbedVersionInfo(r,i),pr.embedDataBits(t,n,i)}static embedBasicPatterns(t,e){pr.embedPositionDetectionPatternsAndSeparators(e),pr.embedDarkDotAtLeftBottomCorner(e),pr.maybeEmbedPositionAdjustmentPatterns(t,e),pr.embedTimingPatterns(e)}static embedTypeInfo(t,e,r){const n=new p;pr.makeTypeInfoBits(t,e,n);for(let t=0,e=n.getSize();t<e;++t){const e=n.get(n.getSize()-1-t),i=pr.TYPE_INFO_COORDINATES[t],o=i[0],s=i[1];if(r.setBoolean(o,s,e),t<8){const n=r.getWidth()-t-1,i=8;r.setBoolean(n,i,e)}else{const n=8,i=r.getHeight()-7+(t-8);r.setBoolean(n,i,e)}}}static maybeEmbedVersionInfo(t,e){if(t.getVersionNumber()<7)return;const r=new p;pr.makeVersionInfoBits(t,r);let n=17;for(let t=0;t<6;++t)for(let i=0;i<3;++i){const o=r.get(n);n--,e.setBoolean(t,e.getHeight()-11+i,o),e.setBoolean(e.getHeight()-11+i,t,o)}}static embedDataBits(t,e,r){let n=0,i=-1,o=r.getWidth()-1,s=r.getHeight()-1;for(;o>0;){for(6===o&&(o-=1);s>=0&&s<r.getHeight();){for(let i=0;i<2;++i){const a=o-i;if(!pr.isEmpty(r.get(a,s)))continue;let c;n<t.getSize()?(c=t.get(n),++n):c=!1,255!==e&&fr.getDataMaskBit(e,a,s)&&(c=!c),r.setBoolean(a,s,c)}s+=i}i=-i,s+=i,o-=2}if(n!==t.getSize())throw new mr("Not all bits consumed: "+n+"/"+t.getSize())}static findMSBSet(t){return 32-m.numberOfLeadingZeros(t)}static calculateBCHCode(t,e){if(0===e)throw new c("0 polynomial");const r=pr.findMSBSet(e);for(t<<=r-1;pr.findMSBSet(t)>=r;)t^=e<<pr.findMSBSet(t)-r;return t}static makeTypeInfoBits(t,e,r){if(!wr.isValidMaskPattern(e))throw new mr("Invalid mask pattern");const n=t.getBits()<<3|e;r.appendBits(n,5);const i=pr.calculateBCHCode(n,pr.TYPE_INFO_POLY);r.appendBits(i,10);const o=new p;if(o.appendBits(pr.TYPE_INFO_MASK_PATTERN,15),r.xor(o),15!==r.getSize())throw new mr("should not happen but we got: "+r.getSize())}static makeVersionInfoBits(t,e){e.appendBits(t.getVersionNumber(),6);const r=pr.calculateBCHCode(t.getVersionNumber(),pr.VERSION_INFO_POLY);if(e.appendBits(r,12),18!==e.getSize())throw new mr("should not happen but we got: "+e.getSize())}static isEmpty(t){return 255===t}static embedTimingPatterns(t){for(let e=8;e<t.getWidth()-8;++e){const r=(e+1)%2;pr.isEmpty(t.get(e,6))&&t.setNumber(e,6,r),pr.isEmpty(t.get(6,e))&&t.setNumber(6,e,r)}}static embedDarkDotAtLeftBottomCorner(t){if(0===t.get(8,t.getHeight()-8))throw new mr;t.setNumber(8,t.getHeight()-8,1)}static embedHorizontalSeparationPattern(t,e,r){for(let n=0;n<8;++n){if(!pr.isEmpty(r.get(t+n,e)))throw new mr;r.setNumber(t+n,e,0)}}static embedVerticalSeparationPattern(t,e,r){for(let n=0;n<7;++n){if(!pr.isEmpty(r.get(t,e+n)))throw new mr;r.setNumber(t,e+n,0)}}static embedPositionAdjustmentPattern(t,e,r){for(let n=0;n<5;++n){const i=pr.POSITION_ADJUSTMENT_PATTERN[n];for(let o=0;o<5;++o)r.setNumber(t+o,e+n,i[o])}}static embedPositionDetectionPattern(t,e,r){for(let n=0;n<7;++n){const i=pr.POSITION_DETECTION_PATTERN[n];for(let o=0;o<7;++o)r.setNumber(t+o,e+n,i[o])}}static embedPositionDetectionPatternsAndSeparators(t){const e=pr.POSITION_DETECTION_PATTERN[0].length;pr.embedPositionDetectionPattern(0,0,t),pr.embedPositionDetectionPattern(t.getWidth()-e,0,t),pr.embedPositionDetectionPattern(0,t.getWidth()-e,t);pr.embedHorizontalSeparationPattern(0,7,t),pr.embedHorizontalSeparationPattern(t.getWidth()-8,7,t),pr.embedHorizontalSeparationPattern(0,t.getWidth()-8,t);pr.embedVerticalSeparationPattern(7,0,t),pr.embedVerticalSeparationPattern(t.getHeight()-7-1,0,t),pr.embedVerticalSeparationPattern(7,t.getHeight()-7,t)}static maybeEmbedPositionAdjustmentPatterns(t,e){if(t.getVersionNumber()<2)return;const r=t.getVersionNumber()-1,n=pr.POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[r];for(let t=0,r=n.length;t!==r;t++){const i=n[t];if(i>=0)for(let t=0;t!==r;t++){const r=n[t];r>=0&&pr.isEmpty(e.get(r,i))&&pr.embedPositionAdjustmentPattern(r-2,i-2,e)}}}}pr.POSITION_DETECTION_PATTERN=Array.from([Int32Array.from([1,1,1,1,1,1,1]),Int32Array.from([1,0,0,0,0,0,1]),Int32Array.from([1,0,1,1,1,0,1]),Int32Array.from([1,0,1,1,1,0,1]),Int32Array.from([1,0,1,1,1,0,1]),Int32Array.from([1,0,0,0,0,0,1]),Int32Array.from([1,1,1,1,1,1,1])]),pr.POSITION_ADJUSTMENT_PATTERN=Array.from([Int32Array.from([1,1,1,1,1]),Int32Array.from([1,0,0,0,1]),Int32Array.from([1,0,1,0,1]),Int32Array.from([1,0,0,0,1]),Int32Array.from([1,1,1,1,1])]),pr.POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE=Array.from([Int32Array.from([-1,-1,-1,-1,-1,-1,-1]),Int32Array.from([6,18,-1,-1,-1,-1,-1]),Int32Array.from([6,22,-1,-1,-1,-1,-1]),Int32Array.from([6,26,-1,-1,-1,-1,-1]),Int32Array.from([6,30,-1,-1,-1,-1,-1]),Int32Array.from([6,34,-1,-1,-1,-1,-1]),Int32Array.from([6,22,38,-1,-1,-1,-1]),Int32Array.from([6,24,42,-1,-1,-1,-1]),Int32Array.from([6,26,46,-1,-1,-1,-1]),Int32Array.from([6,28,50,-1,-1,-1,-1]),Int32Array.from([6,30,54,-1,-1,-1,-1]),Int32Array.from([6,32,58,-1,-1,-1,-1]),Int32Array.from([6,34,62,-1,-1,-1,-1]),Int32Array.from([6,26,46,66,-1,-1,-1]),Int32Array.from([6,26,48,70,-1,-1,-1]),Int32Array.from([6,26,50,74,-1,-1,-1]),Int32Array.from([6,30,54,78,-1,-1,-1]),Int32Array.from([6,30,56,82,-1,-1,-1]),Int32Array.from([6,30,58,86,-1,-1,-1]),Int32Array.from([6,34,62,90,-1,-1,-1]),Int32Array.from([6,28,50,72,94,-1,-1]),Int32Array.from([6,26,50,74,98,-1,-1]),Int32Array.from([6,30,54,78,102,-1,-1]),Int32Array.from([6,28,54,80,106,-1,-1]),Int32Array.from([6,32,58,84,110,-1,-1]),Int32Array.from([6,30,58,86,114,-1,-1]),Int32Array.from([6,34,62,90,118,-1,-1]),Int32Array.from([6,26,50,74,98,122,-1]),Int32Array.from([6,30,54,78,102,126,-1]),Int32Array.from([6,26,52,78,104,130,-1]),Int32Array.from([6,30,56,82,108,134,-1]),Int32Array.from([6,34,60,86,112,138,-1]),Int32Array.from([6,30,58,86,114,142,-1]),Int32Array.from([6,34,62,90,118,146,-1]),Int32Array.from([6,30,54,78,102,126,150]),Int32Array.from([6,24,50,76,102,128,154]),Int32Array.from([6,28,54,80,106,132,158]),Int32Array.from([6,32,58,84,110,136,162]),Int32Array.from([6,26,54,82,110,138,166]),Int32Array.from([6,30,58,86,114,142,170])]),pr.TYPE_INFO_COORDINATES=Array.from([Int32Array.from([8,0]),Int32Array.from([8,1]),Int32Array.from([8,2]),Int32Array.from([8,3]),Int32Array.from([8,4]),Int32Array.from([8,5]),Int32Array.from([8,7]),Int32Array.from([8,8]),Int32Array.from([7,8]),Int32Array.from([5,8]),Int32Array.from([4,8]),Int32Array.from([3,8]),Int32Array.from([2,8]),Int32Array.from([1,8]),Int32Array.from([0,8])]),pr.VERSION_INFO_POLY=7973,pr.TYPE_INFO_POLY=1335,pr.TYPE_INFO_MASK_PATTERN=21522;class Ar{constructor(t,e){this.dataBytes=t,this.errorCorrectionBytes=e}getDataBytes(){return this.dataBytes}getErrorCorrectionBytes(){return this.errorCorrectionBytes}}class Cr{constructor(){}static calculateMaskPenalty(t){return fr.applyMaskPenaltyRule1(t)+fr.applyMaskPenaltyRule2(t)+fr.applyMaskPenaltyRule3(t)+fr.applyMaskPenaltyRule4(t)}static encode(t,e,r=null){let n=Cr.DEFAULT_BYTE_MODE_ENCODING;const i=null!==r&&void 0!==r.get(ur.CHARACTER_SET);i&&(n=r.get(ur.CHARACTER_SET).toString());const o=this.chooseMode(t,n),s=new p;if(o===_e.BYTE&&(i||Cr.DEFAULT_BYTE_MODE_ENCODING!==n)){const t=I.getCharacterSetECIByName(n);void 0!==t&&this.appendECI(t,s)}this.appendModeInfo(o,s);const a=new p;let c;if(this.appendBytes(t,o,a,n),null!==r&&void 0!==r.get(ur.QR_VERSION)){const t=Number.parseInt(r.get(ur.QR_VERSION).toString(),10);c=Ce.getVersionForNumber(t);const n=this.calculateBitsNeeded(o,s,a,c);if(!this.willFit(n,c,e))throw new mr("Data too big for requested version")}else c=this.recommendVersion(e,o,s,a);const l=new p;l.appendBitArray(s);const h=o===_e.BYTE?a.getSizeInBytes():t.length;this.appendLengthInfo(h,c,o,l),l.appendBitArray(a);const u=c.getECBlocksForLevel(e),d=c.getTotalCodewords()-u.getTotalECCodewords();this.terminateBits(d,l);const f=this.interleaveWithECBytes(l,c.getTotalCodewords(),d,u.getNumBlocks()),g=new wr;g.setECLevel(e),g.setMode(o),g.setVersion(c);const w=c.getDimensionForVersion(),m=new gr(w,w),A=this.chooseMaskPattern(f,e,c,m);return g.setMaskPattern(A),pr.buildMatrix(f,e,c,A,m),g.setMatrix(m),g}static recommendVersion(t,e,r,n){const i=this.calculateBitsNeeded(e,r,n,Ce.getVersionForNumber(1)),o=this.chooseVersion(i,t),s=this.calculateBitsNeeded(e,r,n,o);return this.chooseVersion(s,t)}static calculateBitsNeeded(t,e,r,n){return e.getSize()+t.getCharacterCountBits(n)+r.getSize()}static getAlphanumericCode(t){return t<Cr.ALPHANUMERIC_TABLE.length?Cr.ALPHANUMERIC_TABLE[t]:-1}static chooseMode(t,e=null){if(I.SJIS.getName()===e&&this.isOnlyDoubleByteKanji(t))return _e.KANJI;let r=!1,n=!1;for(let e=0,i=t.length;e<i;++e){const i=t.charAt(e);if(Cr.isDigit(i))r=!0;else{if(-1===this.getAlphanumericCode(i.charCodeAt(0)))return _e.BYTE;n=!0}}return n?_e.ALPHANUMERIC:r?_e.NUMERIC:_e.BYTE}static isOnlyDoubleByteKanji(t){let e;try{e=_.encode(t,I.SJIS)}catch(t){return!1}const r=e.length;if(r%2!=0)return!1;for(let t=0;t<r;t+=2){const r=255&e[t];if((r<129||r>159)&&(r<224||r>235))return!1}return!0}static chooseMaskPattern(t,e,r,n){let i=Number.MAX_SAFE_INTEGER,o=-1;for(let s=0;s<wr.NUM_MASK_PATTERNS;s++){pr.buildMatrix(t,e,r,s,n);let a=this.calculateMaskPenalty(n);a<i&&(i=a,o=s)}return o}static chooseVersion(t,e){for(let r=1;r<=40;r++){const n=Ce.getVersionForNumber(r);if(Cr.willFit(t,n,e))return n}throw new mr("Data too big")}static willFit(t,e,r){return e.getTotalCodewords()-e.getECBlocksForLevel(r).getTotalECCodewords()>=(t+7)/8}static terminateBits(t,e){const r=8*t;if(e.getSize()>r)throw new mr("data bits cannot fit in the QR Code"+e.getSize()+" > "+r);for(let t=0;t<4&&e.getSize()<r;++t)e.appendBit(!1);const n=7&e.getSize();if(n>0)for(let t=n;t<8;t++)e.appendBit(!1);const i=t-e.getSizeInBytes();for(let t=0;t<i;++t)e.appendBits(0==(1&t)?236:17,8);if(e.getSize()!==r)throw new mr("Bits size does not equal capacity")}static getNumDataBytesAndNumECBytesForBlockID(t,e,r,n,i,o){if(n>=r)throw new mr("Block ID too large");const s=t%r,a=r-s,c=Math.floor(t/r),l=c+1,h=Math.floor(e/r),u=h+1,d=c-h,f=l-u;if(d!==f)throw new mr("EC bytes mismatch");if(r!==a+s)throw new mr("RS blocks mismatch");if(t!==(h+d)*a+(u+f)*s)throw new mr("Total bytes mismatch");n<a?(i[0]=h,o[0]=d):(i[0]=u,o[0]=f)}static interleaveWithECBytes(t,e,r,n){if(t.getSizeInBytes()!==r)throw new mr("Number of bits and data bytes does not match");let i=0,o=0,s=0;const a=new Array;for(let c=0;c<n;++c){const l=new Int32Array(1),h=new Int32Array(1);Cr.getNumDataBytesAndNumECBytesForBlockID(e,r,n,c,l,h);const u=l[0],d=new Uint8Array(u);t.toBytes(8*i,d,0,u);const f=Cr.generateECBytes(d,h[0]);a.push(new Ar(d,f)),o=Math.max(o,u),s=Math.max(s,f.length),i+=l[0]}if(r!==i)throw new mr("Data bytes does not match offset");const c=new p;for(let t=0;t<o;++t)for(const e of a){const r=e.getDataBytes();t<r.length&&c.appendBits(r[t],8)}for(let t=0;t<s;++t)for(const e of a){const r=e.getErrorCorrectionBytes();t<r.length&&c.appendBits(r[t],8)}if(e!==c.getSizeInBytes())throw new mr("Interleaving error: "+e+" and "+c.getSizeInBytes()+" differ.");return c}static generateECBytes(t,e){const r=t.length,n=new Int32Array(r+e);for(let e=0;e<r;e++)n[e]=255&t[e];new dr(q.QR_CODE_FIELD_256).encode(n,e);const i=new Uint8Array(e);for(let t=0;t<e;t++)i[t]=n[r+t];return i}static appendModeInfo(t,e){e.appendBits(t.getBits(),4)}static appendLengthInfo(t,e,r,n){const i=r.getCharacterCountBits(e);if(t>=1<<i)throw new mr(t+" is bigger than "+((1<<i)-1));n.appendBits(t,i)}static appendBytes(t,e,r,n){switch(e){case _e.NUMERIC:Cr.appendNumericBytes(t,r);break;case _e.ALPHANUMERIC:Cr.appendAlphanumericBytes(t,r);break;case _e.BYTE:Cr.append8BitBytes(t,r,n);break;case _e.KANJI:Cr.appendKanjiBytes(t,r);break;default:throw new mr("Invalid mode: "+e)}}static getDigit(t){return t.charCodeAt(0)-48}static isDigit(t){const e=Cr.getDigit(t);return e>=0&&e<=9}static appendNumericBytes(t,e){const r=t.length;let n=0;for(;n<r;){const i=Cr.getDigit(t.charAt(n));if(n+2<r){const r=Cr.getDigit(t.charAt(n+1)),o=Cr.getDigit(t.charAt(n+2));e.appendBits(100*i+10*r+o,10),n+=3}else if(n+1<r){const r=Cr.getDigit(t.charAt(n+1));e.appendBits(10*i+r,7),n+=2}else e.appendBits(i,4),n++}}static appendAlphanumericBytes(t,e){const r=t.length;let n=0;for(;n<r;){const i=Cr.getAlphanumericCode(t.charCodeAt(n));if(-1===i)throw new mr;if(n+1<r){const r=Cr.getAlphanumericCode(t.charCodeAt(n+1));if(-1===r)throw new mr;e.appendBits(45*i+r,11),n+=2}else e.appendBits(i,6),n++}}static append8BitBytes(t,e,r){let n;try{n=_.encode(t,r)}catch(t){throw new mr(t)}for(let t=0,r=n.length;t!==r;t++){const r=n[t];e.appendBits(r,8)}}static appendKanjiBytes(t,e){let r;try{r=_.encode(t,I.SJIS)}catch(t){throw new mr(t)}const n=r.length;for(let t=0;t<n;t+=2){const n=(255&r[t])<<8&4294967295|255&r[t+1];let i=-1;if(n>=33088&&n<=40956?i=n-33088:n>=57408&&n<=60351&&(i=n-49472),-1===i)throw new mr("Invalid byte sequence");const o=192*(i>>8)+(255&i);e.appendBits(o,13)}}static appendECI(t,e){e.appendBits(_e.ECI.getBits(),4),e.appendBits(t.getValue(),8)}}Cr.ALPHANUMERIC_TABLE=Int32Array.from([-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,36,-1,-1,-1,37,38,-1,-1,-1,-1,39,40,-1,41,42,43,0,1,2,3,4,5,6,7,8,9,44,-1,-1,-1,-1,-1,-1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,-1,-1,-1,-1,-1]),Cr.DEFAULT_BYTE_MODE_ENCODING=I.UTF8.getName();class Er{write(t,e,r,n=null){if(0===t.length)throw new c("Found empty contents");if(e<0||r<0)throw new c("Requested dimensions are too small: "+e+"x"+r);let i=we.L,o=Er.QUIET_ZONE_SIZE;null!==n&&(void 0!==n.get(ur.ERROR_CORRECTION)&&(i=we.fromString(n.get(ur.ERROR_CORRECTION).toString())),void 0!==n.get(ur.MARGIN)&&(o=Number.parseInt(n.get(ur.MARGIN).toString(),10)));const s=Cr.encode(t,i,n);return this.renderResult(s,e,r,o)}writeToDom(t,e,r,n,i=null){"string"==typeof t&&(t=document.querySelector(t));const o=this.write(e,r,n,i);t&&t.appendChild(o)}renderResult(t,e,r,n){const i=t.getMatrix();if(null===i)throw new $;const o=i.getWidth(),s=i.getHeight(),a=o+2*n,c=s+2*n,l=Math.max(e,a),h=Math.max(r,c),u=Math.min(Math.floor(l/a),Math.floor(h/c)),d=Math.floor((l-o*u)/2),f=Math.floor((h-s*u)/2),g=this.createSVGElement(l,h);for(let t=0,e=f;t<s;t++,e+=u)for(let r=0,n=d;r<o;r++,n+=u)if(1===i.get(r,t)){const t=this.createSvgRectElement(n,e,u,u);g.appendChild(t)}return g}createSVGElement(t,e){const r=document.createElementNS(Er.SVG_NS,"svg");return r.setAttributeNS(null,"height",t.toString()),r.setAttributeNS(null,"width",e.toString()),r}createSvgRectElement(t,e,r,n){const i=document.createElementNS(Er.SVG_NS,"rect");return i.setAttributeNS(null,"x",t.toString()),i.setAttributeNS(null,"y",e.toString()),i.setAttributeNS(null,"height",r.toString()),i.setAttributeNS(null,"width",n.toString()),i.setAttributeNS(null,"fill","#000000"),i}}Er.QUIET_ZONE_SIZE=4,Er.SVG_NS="http://www.w3.org/2000/svg";class Ir{encode(t,e,r,n,i){if(0===t.length)throw new c("Found empty contents");if(e!==U.QR_CODE)throw new c("Can only encode QR_CODE, but got "+e);if(r<0||n<0)throw new c(`Requested dimensions are too small: ${r}x${n}`);let o=we.L,s=Ir.QUIET_ZONE_SIZE;null!==i&&(void 0!==i.get(ur.ERROR_CORRECTION)&&(o=we.fromString(i.get(ur.ERROR_CORRECTION).toString())),void 0!==i.get(ur.MARGIN)&&(s=Number.parseInt(i.get(ur.MARGIN).toString(),10)));const a=Cr.encode(t,o,i);return Ir.renderResult(a,r,n,s)}static renderResult(t,e,r,n){const i=t.getMatrix();if(null===i)throw new $;const o=i.getWidth(),s=i.getHeight(),a=o+2*n,c=s+2*n,l=Math.max(e,a),h=Math.max(r,c),u=Math.min(Math.floor(l/a),Math.floor(h/c)),d=Math.floor((l-o*u)/2),f=Math.floor((h-s*u)/2),g=new N(l,h);for(let t=0,e=f;t<s;t++,e+=u)for(let r=0,n=d;r<o;r++,n+=u)1===i.get(r,t)&&g.setRegion(n,e,u,u);return g}}Ir.QUIET_ZONE_SIZE=4;class Sr extends O{constructor(t,e,r,n,i,o,s,a){if(super(o,s),this.yuvData=t,this.dataWidth=e,this.dataHeight=r,this.left=n,this.top=i,n+o>e||i+s>r)throw new c("Crop rectangle does not fit within image data.");a&&this.reverseHorizontal(o,s)}getRow(t,e){if(t<0||t>=this.getHeight())throw new c("Requested row is outside the image: "+t);const r=this.getWidth();(null==e||e.length<r)&&(e=new Uint8ClampedArray(r));const n=(t+this.top)*this.dataWidth+this.left;return d.arraycopy(this.yuvData,n,e,0,r),e}getMatrix(){const t=this.getWidth(),e=this.getHeight();if(t===this.dataWidth&&e===this.dataHeight)return this.yuvData;const r=t*e,n=new Uint8ClampedArray(r);let i=this.top*this.dataWidth+this.left;if(t===this.dataWidth)return d.arraycopy(this.yuvData,i,n,0,r),n;for(let r=0;r<e;r++){const e=r*t;d.arraycopy(this.yuvData,i,n,e,t),i+=this.dataWidth}return n}isCropSupported(){return!0}crop(t,e,r,n){return new Sr(this.yuvData,this.dataWidth,this.dataHeight,this.left+t,this.top+e,r,n,!1)}renderThumbnail(){const t=this.getWidth()/Sr.THUMBNAIL_SCALE_FACTOR,e=this.getHeight()/Sr.THUMBNAIL_SCALE_FACTOR,r=new Int32Array(t*e),n=this.yuvData;let i=this.top*this.dataWidth+this.left;for(let o=0;o<e;o++){const e=o*t;for(let o=0;o<t;o++){const t=255&n[i+o*Sr.THUMBNAIL_SCALE_FACTOR];r[e+o]=4278190080|65793*t}i+=this.dataWidth*Sr.THUMBNAIL_SCALE_FACTOR}return r}getThumbnailWidth(){return this.getWidth()/Sr.THUMBNAIL_SCALE_FACTOR}getThumbnailHeight(){return this.getHeight()/Sr.THUMBNAIL_SCALE_FACTOR}reverseHorizontal(t,e){const r=this.yuvData;for(let n=0,i=this.top*this.dataWidth+this.left;n<e;n++,i+=this.dataWidth){const e=i+t/2;for(let n=i,o=i+t-1;n<e;n++,o--){const t=r[n];r[n]=r[o],r[o]=t}}}invert(){return new b(this)}}Sr.THUMBNAIL_SCALE_FACTOR=2;class _r extends O{constructor(t,e,r,n,i,o,s){if(super(e,r),this.dataWidth=n,this.dataHeight=i,this.left=o,this.top=s,4===t.BYTES_PER_ELEMENT){const n=e*r,i=new Uint8ClampedArray(n);for(let e=0;e<n;e++){const r=t[e],n=r>>16&255,o=r>>7&510,s=255&r;i[e]=(n+o+s)/4&255}this.luminances=i}else this.luminances=t;if(void 0===n&&(this.dataWidth=e),void 0===i&&(this.dataHeight=r),void 0===o&&(this.left=0),void 0===s&&(this.top=0),this.left+e>this.dataWidth||this.top+r>this.dataHeight)throw new c("Crop rectangle does not fit within image data.")}getRow(t,e){if(t<0||t>=this.getHeight())throw new c("Requested row is outside the image: "+t);const r=this.getWidth();(null==e||e.length<r)&&(e=new Uint8ClampedArray(r));const n=(t+this.top)*this.dataWidth+this.left;return d.arraycopy(this.luminances,n,e,0,r),e}getMatrix(){const t=this.getWidth(),e=this.getHeight();if(t===this.dataWidth&&e===this.dataHeight)return this.luminances;const r=t*e,n=new Uint8ClampedArray(r);let i=this.top*this.dataWidth+this.left;if(t===this.dataWidth)return d.arraycopy(this.luminances,i,n,0,r),n;for(let r=0;r<e;r++){const e=r*t;d.arraycopy(this.luminances,i,n,e,t),i+=this.dataWidth}return n}isCropSupported(){return!0}crop(t,e,r,n){return new _r(this.luminances,r,n,this.dataWidth,this.dataHeight,this.left+t,this.top+e)}invert(){return new b(this)}}class Tr extends I{static forName(t){return this.getCharacterSetECIByName(t)}}class yr{}yr.ISO_8859_1=I.ISO8859_1;class Nr{isCompact(){return this.compact}setCompact(t){this.compact=t}getSize(){return this.size}setSize(t){this.size=t}getLayers(){return this.layers}setLayers(t){this.layers=t}getCodeWords(){return this.codeWords}setCodeWords(t){this.codeWords=t}getMatrix(){return this.matrix}setMatrix(t){this.matrix=t}}class Dr{static singletonList(t){return[t]}static min(t,e){return t.sort(e)[0]}}class Mr{constructor(t){this.previous=t}getPrevious(){return this.previous}}class Rr extends Mr{constructor(t,e,r){super(t),this.value=e,this.bitCount=r}appendTo(t,e){t.appendBits(this.value,this.bitCount)}add(t,e){return new Rr(this,t,e)}addBinaryShift(t,e){return console.warn("addBinaryShift on SimpleToken, this simply returns a copy of this token"),new Rr(this,t,e)}toString(){let t=this.value&(1<<this.bitCount)-1;return t|=1<<this.bitCount,"<"+m.toBinaryString(t|1<<this.bitCount).substring(1)+">"}}class Or extends Rr{constructor(t,e,r){super(t,0,0),this.binaryShiftStart=e,this.binaryShiftByteCount=r}appendTo(t,e){for(let r=0;r<this.binaryShiftByteCount;r++)(0===r||31===r&&this.binaryShiftByteCount<=62)&&(t.appendBits(31,5),this.binaryShiftByteCount>62?t.appendBits(this.binaryShiftByteCount-31,16):0===r?t.appendBits(Math.min(this.binaryShiftByteCount,31),5):t.appendBits(this.binaryShiftByteCount-31,5)),t.appendBits(e[this.binaryShiftStart+r],8)}addBinaryShift(t,e){return new Or(this,t,e)}toString(){return"<"+this.binaryShiftStart+"::"+(this.binaryShiftStart+this.binaryShiftByteCount-1)+">"}}function br(t,e,r){return new Rr(t,e,r)}const Br=["UPPER","LOWER","DIGIT","MIXED","PUNCT"],Lr=0,Pr=1,vr=2,Fr=3,xr=4,kr=new Rr(null,0,0),Ur=[Int32Array.from([0,327708,327710,327709,656318]),Int32Array.from([590318,0,327710,327709,656318]),Int32Array.from([262158,590300,0,590301,932798]),Int32Array.from([327709,327708,656318,0,327710]),Int32Array.from([327711,656380,656382,656381,0])];const Hr=function(t){for(let e of t)w.fill(e,-1);return t[Lr][xr]=0,t[Pr][xr]=0,t[Pr][Lr]=28,t[Fr][xr]=0,t[vr][xr]=0,t[vr][Lr]=15,t}(w.createInt32Array(6,6));class Vr{constructor(t,e,r,n){this.token=t,this.mode=e,this.binaryShiftByteCount=r,this.bitCount=n}getMode(){return this.mode}getToken(){return this.token}getBinaryShiftByteCount(){return this.binaryShiftByteCount}getBitCount(){return this.bitCount}latchAndAppend(t,e){let r=this.bitCount,n=this.token;if(t!==this.mode){let e=Ur[this.mode][t];n=br(n,65535&e,e>>16),r+=e>>16}let i=t===vr?4:5;return n=br(n,e,i),new Vr(n,t,0,r+i)}shiftAndAppend(t,e){let r=this.token,n=this.mode===vr?4:5;return r=br(r,Hr[this.mode][t],n),r=br(r,e,5),new Vr(r,this.mode,0,this.bitCount+n+5)}addBinaryShiftChar(t){let e=this.token,r=this.mode,n=this.bitCount;if(this.mode===xr||this.mode===vr){let t=Ur[r][Lr];e=br(e,65535&t,t>>16),n+=t>>16,r=Lr}let i=0===this.binaryShiftByteCount||31===this.binaryShiftByteCount?18:62===this.binaryShiftByteCount?9:8,o=new Vr(e,r,this.binaryShiftByteCount+1,n+i);return 2078===o.binaryShiftByteCount&&(o=o.endBinaryShift(t+1)),o}endBinaryShift(t){if(0===this.binaryShiftByteCount)return this;let e=this.token;return e=function(t,e,r){return new Or(t,e,r)}(e,t-this.binaryShiftByteCount,this.binaryShiftByteCount),new Vr(e,this.mode,0,this.bitCount)}isBetterThanOrEqualTo(t){let e=this.bitCount+(Ur[this.mode][t.mode]>>16);return this.binaryShiftByteCount<t.binaryShiftByteCount?e+=Vr.calculateBinaryShiftCost(t)-Vr.calculateBinaryShiftCost(this):this.binaryShiftByteCount>t.binaryShiftByteCount&&t.binaryShiftByteCount>0&&(e+=10),e<=t.bitCount}toBitArray(t){let e=[];for(let r=this.endBinaryShift(t.length).token;null!==r;r=r.getPrevious())e.unshift(r);let r=new p;for(const n of e)n.appendTo(r,t);return r}toString(){return T.format("%s bits=%d bytes=%d",Br[this.mode],this.bitCount,this.binaryShiftByteCount)}static calculateBinaryShiftCost(t){return t.binaryShiftByteCount>62?21:t.binaryShiftByteCount>31?20:t.binaryShiftByteCount>0?10:0}}Vr.INITIAL_STATE=new Vr(kr,Lr,0,0);const zr=function(t){const e=T.getCharCode(" "),r=T.getCharCode("."),n=T.getCharCode(",");t[Lr][e]=1;const i=T.getCharCode("Z"),o=T.getCharCode("A");for(let e=o;e<=i;e++)t[Lr][e]=e-o+2;t[Pr][e]=1;const s=T.getCharCode("z"),a=T.getCharCode("a");for(let e=a;e<=s;e++)t[Pr][e]=e-a+2;t[vr][e]=1;const c=T.getCharCode("9"),l=T.getCharCode("0");for(let e=l;e<=c;e++)t[vr][e]=e-l+2;t[vr][n]=12,t[vr][r]=13;const h=["\0"," ","","","","","","","","\b","\t","\n","\v","\f","\r","","
+","
+","
+","","@","\\","^","_","`","|","~",""];for(let e=0;e<h.length;e++)t[Fr][T.getCharCode(h[e])]=e;const u=["\0","\r","\0","\0","\0","\0","!","'","#","$","%","&","'","(",")","*","+",",","-",".","/",":",";","<","=",">","?","[","]","{","}"];for(let e=0;e<u.length;e++)T.getCharCode(u[e])>0&&(t[xr][T.getCharCode(u[e])]=e);return t}(w.createInt32Array(5,256));class Gr{constructor(t){this.text=t}encode(){const t=T.getCharCode(" "),e=T.getCharCode("\n");let r=Dr.singletonList(Vr.INITIAL_STATE);for(let n=0;n<this.text.length;n++){let i,o=n+1<this.text.length?this.text[n+1]:0;switch(this.text[n]){case T.getCharCode("\r"):i=o===e?2:0;break;case T.getCharCode("."):i=o===t?3:0;break;case T.getCharCode(","):i=o===t?4:0;break;case T.getCharCode(":"):i=o===t?5:0;break;default:i=0}i>0?(r=Gr.updateStateListForPair(r,n,i),n++):r=this.updateStateListForChar(r,n)}return Dr.min(r,((t,e)=>t.getBitCount()-e.getBitCount())).toBitArray(this.text)}updateStateListForChar(t,e){const r=[];for(let n of t)this.updateStateForChar(n,e,r);return Gr.simplifyStates(r)}updateStateForChar(t,e,r){let n=255&this.text[e],i=zr[t.getMode()][n]>0,o=null;for(let s=0;s<=xr;s++){let a=zr[s][n];if(a>0){if(null==o&&(o=t.endBinaryShift(e)),!i||s===t.getMode()||s===vr){const t=o.latchAndAppend(s,a);r.push(t)}if(!i&&Hr[t.getMode()][s]>=0){const t=o.shiftAndAppend(s,a);r.push(t)}}}if(t.getBinaryShiftByteCount()>0||0===zr[t.getMode()][n]){let n=t.addBinaryShiftChar(e);r.push(n)}}static updateStateListForPair(t,e,r){const n=[];for(let i of t)this.updateStateForPair(i,e,r,n);return this.simplifyStates(n)}static updateStateForPair(t,e,r,n){let i=t.endBinaryShift(e);if(n.push(i.latchAndAppend(xr,r)),t.getMode()!==xr&&n.push(i.shiftAndAppend(xr,r)),3===r||4===r){let t=i.latchAndAppend(vr,16-r).latchAndAppend(vr,1);n.push(t)}if(t.getBinaryShiftByteCount()>0){let r=t.addBinaryShiftChar(e).addBinaryShiftChar(e+1);n.push(r)}}static simplifyStates(t){let e=[];for(const r of t){let t=!0;for(const n of e){if(n.isBetterThanOrEqualTo(r)){t=!1;break}r.isBetterThanOrEqualTo(n)&&(e=e.filter((t=>t!==n)))}t&&e.push(r)}return e}}class Yr{constructor(){}static encodeBytes(t){return Yr.encode(t,Yr.DEFAULT_EC_PERCENT,Yr.DEFAULT_AZTEC_LAYERS)}static encode(t,e,r){let n,i,o,s,a,l=new Gr(t).encode(),h=m.truncDivision(l.getSize()*e,100)+11,u=l.getSize()+h;if(r!==Yr.DEFAULT_AZTEC_LAYERS){if(n=r<0,i=Math.abs(r),i>(n?Yr.MAX_NB_BITS_COMPACT:Yr.MAX_NB_BITS))throw new c(T.format("Illegal value %s for layers",r));o=Yr.totalBitsInLayer(i,n),s=Yr.WORD_SIZE[i];let t=o-o%s;if(a=Yr.stuffBits(l,s),a.getSize()+h>t)throw new c("Data to large for user specified layer");if(n&&a.getSize()>64*s)throw new c("Data to large for user specified layer")}else{s=0,a=null;for(let t=0;;t++){if(t>Yr.MAX_NB_BITS)throw new c("Data too large for an Aztec code");if(n=t<=3,i=n?t+1:t,o=Yr.totalBitsInLayer(i,n),u>o)continue;null!=a&&s===Yr.WORD_SIZE[i]||(s=Yr.WORD_SIZE[i],a=Yr.stuffBits(l,s));let e=o-o%s;if(!(n&&a.getSize()>64*s)&&a.getSize()+h<=e)break}}let d,f=Yr.generateCheckWords(a,o,s),g=a.getSize()/s,w=Yr.generateModeMessage(n,i,g),p=(n?11:14)+4*i,A=new Int32Array(p);if(n){d=p;for(let t=0;t<A.length;t++)A[t]=t}else{d=p+1+2*m.truncDivision(m.truncDivision(p,2)-1,15);let t=m.truncDivision(p,2),e=m.truncDivision(d,2);for(let r=0;r<t;r++){let n=r+m.truncDivision(r,15);A[t-r-1]=e-n-1,A[t+r]=e+n+1}}let C=new N(d);for(let t=0,e=0;t<i;t++){let r=4*(i-t)+(n?9:12);for(let n=0;n<r;n++){let i=2*n;for(let o=0;o<2;o++)f.get(e+i+o)&&C.set(A[2*t+o],A[2*t+n]),f.get(e+2*r+i+o)&&C.set(A[2*t+n],A[p-1-2*t-o]),f.get(e+4*r+i+o)&&C.set(A[p-1-2*t-o],A[p-1-2*t-n]),f.get(e+6*r+i+o)&&C.set(A[p-1-2*t-n],A[2*t+o])}e+=8*r}if(Yr.drawModeMessage(C,n,d,w),n)Yr.drawBullsEye(C,m.truncDivision(d,2),5);else{Yr.drawBullsEye(C,m.truncDivision(d,2),7);for(let t=0,e=0;t<m.truncDivision(p,2)-1;t+=15,e+=16)for(let t=1&m.truncDivision(d,2);t<d;t+=2)C.set(m.truncDivision(d,2)-e,t),C.set(m.truncDivision(d,2)+e,t),C.set(t,m.truncDivision(d,2)-e),C.set(t,m.truncDivision(d,2)+e)}let E=new Nr;return E.setCompact(n),E.setSize(d),E.setLayers(i),E.setCodeWords(g),E.setMatrix(C),E}static drawBullsEye(t,e,r){for(let n=0;n<r;n+=2)for(let r=e-n;r<=e+n;r++)t.set(r,e-n),t.set(r,e+n),t.set(e-n,r),t.set(e+n,r);t.set(e-r,e-r),t.set(e-r+1,e-r),t.set(e-r,e-r+1),t.set(e+r,e-r),t.set(e+r,e-r+1),t.set(e+r,e+r-1)}static generateModeMessage(t,e,r){let n=new p;return t?(n.appendBits(e-1,2),n.appendBits(r-1,6),n=Yr.generateCheckWords(n,28,4)):(n.appendBits(e-1,5),n.appendBits(r-1,11),n=Yr.generateCheckWords(n,40,4)),n}static drawModeMessage(t,e,r,n){let i=m.truncDivision(r,2);if(e)for(let e=0;e<7;e++){let r=i-3+e;n.get(e)&&t.set(r,i-5),n.get(e+7)&&t.set(i+5,r),n.get(20-e)&&t.set(r,i+5),n.get(27-e)&&t.set(i-5,r)}else for(let e=0;e<10;e++){let r=i-5+e+m.truncDivision(e,5);n.get(e)&&t.set(r,i-7),n.get(e+10)&&t.set(i+7,r),n.get(29-e)&&t.set(r,i+7),n.get(39-e)&&t.set(i-7,r)}}static generateCheckWords(t,e,r){let n=t.getSize()/r,i=new dr(Yr.getGF(r)),o=m.truncDivision(e,r),s=Yr.bitsToWords(t,r,o);i.encode(s,o-n);let a=e%r,c=new p;c.appendBits(0,a);for(const t of Array.from(s))c.appendBits(t,r);return c}static bitsToWords(t,e,r){let n,i,o=new Int32Array(r);for(n=0,i=t.getSize()/e;n<i;n++){let r=0;for(let i=0;i<e;i++)r|=t.get(n*e+i)?1<<e-i-1:0;o[n]=r}return o}static getGF(t){switch(t){case 4:return q.AZTEC_PARAM;case 6:return q.AZTEC_DATA_6;case 8:return q.AZTEC_DATA_8;case 10:return q.AZTEC_DATA_10;case 12:return q.AZTEC_DATA_12;default:throw new c("Unsupported word size "+t)}}static stuffBits(t,e){let r=new p,n=t.getSize(),i=(1<<e)-2;for(let o=0;o<n;o+=e){let s=0;for(let r=0;r<e;r++)(o+r>=n||t.get(o+r))&&(s|=1<<e-1-r);(s&i)===i?(r.appendBits(s&i,e),o--):0==(s&i)?(r.appendBits(1|s,e),o--):r.appendBits(s,e)}return r}static totalBitsInLayer(t,e){return((e?88:112)+16*t)*t}}Yr.DEFAULT_EC_PERCENT=33,Yr.DEFAULT_AZTEC_LAYERS=0,Yr.MAX_NB_BITS=32,Yr.MAX_NB_BITS_COMPACT=4,Yr.WORD_SIZE=Int32Array.from([4,6,6,8,8,8,8,8,8,10,10,10,10,10,10,10,10,10,10,10,10,10,10,12,12,12,12,12,12,12,12,12,12]);class Xr{encode(t,e,r,n){return this.encodeWithHints(t,e,r,n,null)}encodeWithHints(t,e,r,n,i){let o=yr.ISO_8859_1,s=Yr.DEFAULT_EC_PERCENT,a=Yr.DEFAULT_AZTEC_LAYERS;return null!=i&&(i.has(ur.CHARACTER_SET)&&(o=Tr.forName(i.get(ur.CHARACTER_SET).toString())),i.has(ur.ERROR_CORRECTION)&&(s=m.parseInt(i.get(ur.ERROR_CORRECTION).toString())),i.has(ur.AZTEC_LAYERS)&&(a=m.parseInt(i.get(ur.AZTEC_LAYERS).toString()))),Xr.encodeLayers(t,e,r,n,o,s,a)}static encodeLayers(t,e,r,n,i,o,s){if(e!==U.AZTEC)throw new c("Can only encode AZTEC, but got "+e);let a=Yr.encode(T.getBytes(t,i),o,s);return Xr.renderResult(a,r,n)}static renderResult(t,e,r){let n=t.getMatrix();if(null==n)throw new $;let i=n.getWidth(),o=n.getHeight(),s=Math.max(e,i),a=Math.max(r,o),c=Math.min(s/i,a/o),l=(s-i*c)/2,h=(a-o*c)/2,u=new N(s,a);for(let t=0,e=h;t<o;t++,e+=c)for(let r=0,o=l;r<i;r++,o+=c)n.get(r,t)&&u.setRegion(o,e,c,c);return u}}t.AbstractExpandedDecoder=Vt,t.ArgumentException=a,t.ArithmeticException=K,t.AztecCode=Nr,t.AztecCodeReader=gt,t.AztecCodeWriter=Xr,t.AztecDecoder=et,t.AztecDetector=ft,t.AztecDetectorResult=st,t.AztecEncoder=Yr,t.AztecHighLevelEncoder=Gr,t.AztecPoint=dt,t.BarcodeFormat=U,t.Binarizer=u,t.BinaryBitmap=l,t.BitArray=p,t.BitMatrix=N,t.BitSource=he,t.BrowserAztecCodeReader=class extends F{constructor(t=500){super(new gt,t)}},t.BrowserBarcodeReader=class extends F{constructor(t=500,e){super(new ie(e),t,e)}},t.BrowserCodeReader=F,t.BrowserDatamatrixCodeReader=class extends F{constructor(t=500){super(new ge,t)}},t.BrowserMultiFormatReader=class extends F{constructor(t=null,e=500){const r=new lr;r.setHints(t),super(r,e)}decodeBitmap(t){return this.reader.decodeWithState(t)}},t.BrowserPDF417Reader=class extends F{constructor(t=500){super(new ar,t)}},t.BrowserQRCodeReader=class extends F{constructor(t=500){super(new Le,t)}},t.BrowserQRCodeSvgWriter=Er,t.CharacterSetECI=I,t.ChecksumException=h,t.Code128Reader=mt,t.Code39Reader=pt,t.DataMatrixDecodedBitStreamParser=ue,t.DataMatrixReader=ge,t.DecodeHintType=C,t.DecoderResult=j,t.DefaultGridSampler=ht,t.DetectorResult=ot,t.EAN13Reader=Tt,t.EncodeHintType=ur,t.Exception=s,t.FormatException=E,t.GenericGF=q,t.GenericGFPoly=Q,t.GlobalHistogramBinarizer=M,t.GridSampler=ct,t.GridSamplerInstance=ut,t.HTMLCanvasElementLuminanceSource=B,t.HybridBinarizer=R,t.ITFReader=At,t.IllegalArgumentException=c,t.IllegalStateException=$,t.InvertedLuminanceSource=b,t.LuminanceSource=O,t.MathUtils=rt,t.MultiFormatOneDReader=ie,t.MultiFormatReader=lr,t.MultiFormatWriter=class{encode(t,e,r,n,i){let o;if(e!==U.QR_CODE)throw new c("No encoder available for format "+e);return o=new Ir,o.encode(t,e,r,n,i)}},t.NotFoundException=D,t.OneDReader=wt,t.PDF417DecodedBitStreamParser=or,t.PDF417DecoderErrorCorrection=He,t.PDF417Reader=ar,t.PDF417ResultMetadata=Ke,t.PerspectiveTransform=lt,t.PlanarYUVLuminanceSource=Sr,t.QRCodeByteMatrix=gr,t.QRCodeDataMask=Ee,t.QRCodeDecodedBitStreamParser=Te,t.QRCodeDecoderErrorCorrectionLevel=we,t.QRCodeDecoderFormatInformation=me,t.QRCodeEncoder=Cr,t.QRCodeEncoderQRCode=wr,t.QRCodeMaskUtil=fr,t.QRCodeMatrixUtil=pr,t.QRCodeMode=_e,t.QRCodeReader=Le,t.QRCodeVersion=Ce,t.QRCodeWriter=Ir,t.RGBLuminanceSource=_r,t.RSS14Reader=ne,t.RSSExpandedReader=ee,t.ReaderException=cr,t.ReedSolomonDecoder=tt,t.ReedSolomonEncoder=dr,t.ReedSolomonException=J,t.Result=x,t.ResultMetadataType=W,t.ResultPoint=it,t.StringUtils=T,t.UnsupportedOperationException=S,t.VideoInputDevice=L,t.WhiteRectangleDetector=at,t.WriterException=mr,t.ZXingArrays=w,t.ZXingCharset=Tr,t.ZXingInteger=m,t.ZXingStandardCharsets=yr,t.ZXingStringBuilder=y,t.ZXingStringEncoding=_,t.ZXingSystem=d,t.createAbstractExpandedDecoder=Jt,Object.defineProperty(t,"__esModule",{value:!0})}(e)}},e={};function r(n){var i=e[n];if(void 0!==i)return i.exports;var o=e[n]={exports:{}};return t[n].call(o.exports,o,o.exports,r),o.exports}r.d=(t,e)=>{for(var n in e)r.o(e,n)&&!r.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),r.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var n={};(()=>{"use strict";var t;r.r(n),r.d(n,{Html5Qrcode:()=>W,Html5QrcodeScanType:()=>i,Html5QrcodeScanner:()=>ft,Html5QrcodeScannerState:()=>w,Html5QrcodeSupportedFormats:()=>t}),function(t){t[t.QR_CODE=0]="QR_CODE",t[t.AZTEC=1]="AZTEC",t[t.CODABAR=2]="CODABAR",t[t.CODE_39=3]="CODE_39",t[t.CODE_93=4]="CODE_93",t[t.CODE_128=5]="CODE_128",t[t.DATA_MATRIX=6]="DATA_MATRIX",t[t.MAXICODE=7]="MAXICODE",t[t.ITF=8]="ITF",t[t.EAN_13=9]="EAN_13",t[t.EAN_8=10]="EAN_8",t[t.PDF_417=11]="PDF_417",t[t.RSS_14=12]="RSS_14",t[t.RSS_EXPANDED=13]="RSS_EXPANDED",t[t.UPC_A=14]="UPC_A",t[t.UPC_E=15]="UPC_E",t[t.UPC_EAN_EXTENSION=16]="UPC_EAN_EXTENSION"}(t||(t={}));var e,i,o=new Map([[t.QR_CODE,"QR_CODE"],[t.AZTEC,"AZTEC"],[t.CODABAR,"CODABAR"],[t.CODE_39,"CODE_39"],[t.CODE_93,"CODE_93"],[t.CODE_128,"CODE_128"],[t.DATA_MATRIX,"DATA_MATRIX"],[t.MAXICODE,"MAXICODE"],[t.ITF,"ITF"],[t.EAN_13,"EAN_13"],[t.EAN_8,"EAN_8"],[t.PDF_417,"PDF_417"],[t.RSS_14,"RSS_14"],[t.RSS_EXPANDED,"RSS_EXPANDED"],[t.UPC_A,"UPC_A"],[t.UPC_E,"UPC_E"],[t.UPC_EAN_EXTENSION,"UPC_EAN_EXTENSION"]]);function s(e){return Object.values(t).includes(e)}!function(t){t[t.UNKNOWN=0]="UNKNOWN",t[t.URL=1]="URL"}(e||(e={})),function(t){t[t.SCAN_TYPE_CAMERA=0]="SCAN_TYPE_CAMERA",t[t.SCAN_TYPE_FILE=1]="SCAN_TYPE_FILE"}(i||(i={}));var a,c=function(){function t(){}return t.GITHUB_PROJECT_URL="https://github.com/mebjas/html5-qrcode",t.SCAN_DEFAULT_FPS=2,t.DEFAULT_DISABLE_FLIP=!1,t.DEFAULT_REMEMBER_LAST_CAMERA_USED=!0,t.DEFAULT_SUPPORTED_SCAN_TYPE=[i.SCAN_TYPE_CAMERA,i.SCAN_TYPE_FILE],t}(),l=function(){function t(t,e){this.format=t,this.formatName=e}return t.prototype.toString=function(){return this.formatName},t.create=function(e){if(!o.has(e))throw"".concat(e," not in html5QrcodeSupportedFormatsTextMap");return new t(e,o.get(e))},t}(),h=function(){function t(){}return t.createFromText=function(t){return{decodedText:t,result:{text:t}}},t.createFromQrcodeResult=function(t){return{decodedText:t.text,result:t}},t}();!function(t){t[t.UNKWOWN_ERROR=0]="UNKWOWN_ERROR",t[t.IMPLEMENTATION_ERROR=1]="IMPLEMENTATION_ERROR",t[t.NO_CODE_FOUND_ERROR=2]="NO_CODE_FOUND_ERROR"}(a||(a={}));var u=function(){function t(){}return t.createFrom=function(t){return{errorMessage:t,type:a.UNKWOWN_ERROR}},t}(),d=function(){function t(t){this.verbose=t}return t.prototype.log=function(t){this.verbose&&console.log(t)},t.prototype.warn=function(t){this.verbose&&console.warn(t)},t.prototype.logError=function(t,e){(this.verbose||!0===e)&&console.error(t)},t.prototype.logErrors=function(t){if(0===t.length)throw"Logger#logError called without arguments";this.verbose&&console.error(t)},t}();function f(t){return null==t}var g,w,m=function(){function t(){}return t.codeParseError=function(t){return"QR code parse error, error = ".concat(t)},t.errorGettingUserMedia=function(t){return"Error getting userMedia, error = ".concat(t)},t.onlyDeviceSupportedError=function(){return"The device doesn't support navigator.mediaDevices , only supported cameraIdOrConfig in this case is deviceId parameter (string)."},t.cameraStreamingNotSupported=function(){return"Camera streaming not supported by the browser."},t.unableToQuerySupportedDevices=function(){return"Unable to query supported devices, unknown error."},t.insecureContextCameraQueryError=function(){return"Camera access is only supported in secure context like https or localhost."},t.scannerPaused=function(){return"Scanner paused"},t}(),p=function(){function t(){}return t.scanningStatus=function(){return"Scanning"},t.idleStatus=function(){return"Idle"},t.errorStatus=function(){return"Error"},t.permissionStatus=function(){return"Permission"},t.noCameraFoundErrorStatus=function(){return"No Cameras"},t.lastMatch=function(t){return"Last Match: ".concat(t)},t.codeScannerTitle=function(){return"Code Scanner"},t.cameraPermissionTitle=function(){return"Request Camera Permissions"},t.cameraPermissionRequesting=function(){return"Requesting camera permissions..."},t.noCameraFound=function(){return"No camera found"},t.scanButtonStopScanningText=function(){return"Stop Scanning"},t.scanButtonStartScanningText=function(){return"Start Scanning"},t.torchOnButton=function(){return"Switch On Torch"},t.torchOffButton=function(){return"Switch Off Torch"},t.torchOnFailedMessage=function(){return"Failed to turn on torch"},t.torchOffFailedMessage=function(){return"Failed to turn off torch"},t.scanButtonScanningStarting=function(){return"Launching Camera..."},t.textIfCameraScanSelected=function(){return"Scan an Image File"},t.textIfFileScanSelected=function(){return"Scan using camera directly"},t.selectCamera=function(){return"Select Camera"},t.fileSelectionChooseImage=function(){return"Choose Image"},t.fileSelectionChooseAnother=function(){return"Choose Another"},t.fileSelectionNoImageSelected=function(){return"No image choosen"},t.anonymousCameraPrefix=function(){return"Anonymous Camera"},t.dragAndDropMessage=function(){return"Or drop an image to scan"},t.dragAndDropMessageOnlyImages=function(){return"Or drop an image to scan (other files not supported)"},t.zoom=function(){return"zoom"},t.loadingImage=function(){return"Loading image..."},t.cameraScanAltText=function(){return"Camera based scan"},t.fileScanAltText=function(){return"Fule based scan"},t}(),A=function(){function t(){}return t.poweredBy=function(){return"Powered by "},t.reportIssues=function(){return"Report issues"},t}(),C=function(){function t(){}return t.isMediaStreamConstraintsValid=function(t,e){if("object"!=typeof t){var r=typeof t;return e.logError("videoConstraints should be of type object, the "+"object passed is of type ".concat(r,"."),!0),!1}for(var n=new Set(["autoGainControl","channelCount","echoCancellation","latency","noiseSuppression","sampleRate","sampleSize","volume"]),i=0,o=Object.keys(t);i<o.length;i++){var s=o[i];if(n.has(s))return e.logError("".concat(s," is not supported videoConstaints."),!0),!1}return!0},t}(),E=r(449),I=function(){function e(e,r,n){if(this.formatMap=new Map([[t.QR_CODE,E.BarcodeFormat.QR_CODE],[t.AZTEC,E.BarcodeFormat.AZTEC],[t.CODABAR,E.BarcodeFormat.CODABAR],[t.CODE_39,E.BarcodeFormat.CODE_39],[t.CODE_93,E.BarcodeFormat.CODE_93],[t.CODE_128,E.BarcodeFormat.CODE_128],[t.DATA_MATRIX,E.BarcodeFormat.DATA_MATRIX],[t.MAXICODE,E.BarcodeFormat.MAXICODE],[t.ITF,E.BarcodeFormat.ITF],[t.EAN_13,E.BarcodeFormat.EAN_13],[t.EAN_8,E.BarcodeFormat.EAN_8],[t.PDF_417,E.BarcodeFormat.PDF_417],[t.RSS_14,E.BarcodeFormat.RSS_14],[t.RSS_EXPANDED,E.BarcodeFormat.RSS_EXPANDED],[t.UPC_A,E.BarcodeFormat.UPC_A],[t.UPC_E,E.BarcodeFormat.UPC_E],[t.UPC_EAN_EXTENSION,E.BarcodeFormat.UPC_EAN_EXTENSION]]),this.reverseFormatMap=this.createReverseFormatMap(),!E)throw"Use html5qrcode.min.js without edit, ZXing not found.";this.verbose=r,this.logger=n;var i=this.createZXingFormats(e),o=new Map;o.set(E.DecodeHintType.POSSIBLE_FORMATS,i),o.set(E.DecodeHintType.TRY_HARDER,!1),this.hints=o}return e.prototype.decodeAsync=function(t){var e=this;return new Promise((function(r,n){try{r(e.decode(t))}catch(t){n(t)}}))},e.prototype.decode=function(t){var e=new E.MultiFormatReader(this.verbose,this.hints),r=new E.HTMLCanvasElementLuminanceSource(t),n=new E.BinaryBitmap(new E.HybridBinarizer(r)),i=e.decode(n);return{text:i.text,format:l.create(this.toHtml5QrcodeSupportedFormats(i.format)),debugData:this.createDebugData()}},e.prototype.createReverseFormatMap=function(){var t=new Map;return this.formatMap.forEach((function(e,r,n){t.set(e,r)})),t},e.prototype.toHtml5QrcodeSupportedFormats=function(t){if(!this.reverseFormatMap.has(t))throw"reverseFormatMap doesn't have ".concat(t);return this.reverseFormatMap.get(t)},e.prototype.createZXingFormats=function(t){for(var e=[],r=0,n=t;r<n.length;r++){var i=n[r];this.formatMap.has(i)?e.push(this.formatMap.get(i)):this.logger.logError("".concat(i," is not supported by")+"ZXingHtml5QrcodeShim")}return e},e.prototype.createDebugData=function(){return{decoderName:"zxing-js"}},e}(),S=function(){function e(r,n,i){if(this.formatMap=new Map([[t.QR_CODE,"qr_code"],[t.AZTEC,"aztec"],[t.CODABAR,"codabar"],[t.CODE_39,"code_39"],[t.CODE_93,"code_93"],[t.CODE_128,"code_128"],[t.DATA_MATRIX,"data_matrix"],[t.ITF,"itf"],[t.EAN_13,"ean_13"],[t.EAN_8,"ean_8"],[t.PDF_417,"pdf417"],[t.UPC_A,"upc_a"],[t.UPC_E,"upc_e"]]),this.reverseFormatMap=this.createReverseFormatMap(),!e.isSupported())throw"Use html5qrcode.min.js without edit, Use BarcodeDetectorDelegate only if it isSupported();";this.verbose=n,this.logger=i;var o=this.createBarcodeDetectorFormats(r);if(this.detector=new BarcodeDetector(o),!this.detector)throw"BarcodeDetector detector not supported"}return e.isSupported=function(){return"BarcodeDetector"in window&&void 0!==new BarcodeDetector({formats:["qr_code"]})},e.prototype.decodeAsync=function(t){return e=this,r=void 0,i=function(){var e,r;return function(t,e){var r,n,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(a){return function(c){return function(a){if(r)throw new TypeError("Generator is already executing.");for(;o&&(o=0,a[0]&&(s=0)),s;)try{if(r=1,n&&(i=2&a[0]?n.return:a[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,a[1])).done)return i;switch(n=0,i&&(a=[2&a[0],i.value]),a[0]){case 0:case 1:i=a;break;case 4:return s.label++,{value:a[1],done:!1};case 5:s.label++,n=a[1],a=[0];continue;case 7:a=s.ops.pop(),s.trys.pop();continue;default:if(!((i=(i=s.trys).length>0&&i[i.length-1])||6!==a[0]&&2!==a[0])){s=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]<i[3])){s.label=a[1];break}if(6===a[0]&&s.label<i[1]){s.label=i[1],i=a;break}if(i&&s.label<i[2]){s.label=i[2],s.ops.push(a);break}i[2]&&s.ops.pop(),s.trys.pop();continue}a=e.call(t,s)}catch(t){a=[6,t],n=0}finally{r=i=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,c])}}}(this,(function(n){switch(n.label){case 0:return[4,this.detector.detect(t)];case 1:if(!(e=n.sent())||0===e.length)throw"No barcode or QR code detected.";return[2,{text:(r=this.selectLargestBarcode(e)).rawValue,format:l.create(this.toHtml5QrcodeSupportedFormats(r.format)),debugData:this.createDebugData()}]}}))},new((n=void 0)||(n=Promise))((function(t,o){function s(t){try{c(i.next(t))}catch(t){o(t)}}function a(t){try{c(i.throw(t))}catch(t){o(t)}}function c(e){var r;e.done?t(e.value):(r=e.value,r instanceof n?r:new n((function(t){t(r)}))).then(s,a)}c((i=i.apply(e,r||[])).next())}));var e,r,n,i},e.prototype.selectLargestBarcode=function(t){for(var e=null,r=0,n=0,i=t;n<i.length;n++){var o=i[n],s=o.boundingBox.width*o.boundingBox.height;s>r&&(r=s,e=o)}if(!e)throw"No largest barcode found";return e},e.prototype.createBarcodeDetectorFormats=function(t){for(var e=[],r=0,n=t;r<n.length;r++){var i=n[r];this.formatMap.has(i)?e.push(this.formatMap.get(i)):this.logger.warn("".concat(i," is not supported by")+"BarcodeDetectorDelegate")}return{formats:e}},e.prototype.toHtml5QrcodeSupportedFormats=function(t){if(!this.reverseFormatMap.has(t))throw"reverseFormatMap doesn't have ".concat(t);return this.reverseFormatMap.get(t)},e.prototype.createReverseFormatMap=function(){var t=new Map;return this.formatMap.forEach((function(e,r,n){t.set(e,r)})),t},e.prototype.createDebugData=function(){return{decoderName:"BarcodeDetector"}},e}(),_=function(t,e,r,n){return new(r||(r=Promise))((function(i,o){function s(t){try{c(n.next(t))}catch(t){o(t)}}function a(t){try{c(n.throw(t))}catch(t){o(t)}}function c(t){var e;t.done?i(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(s,a)}c((n=n.apply(t,e||[])).next())}))},T=function(t,e){var r,n,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(a){return function(c){return function(a){if(r)throw new TypeError("Generator is already executing.");for(;o&&(o=0,a[0]&&(s=0)),s;)try{if(r=1,n&&(i=2&a[0]?n.return:a[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,a[1])).done)return i;switch(n=0,i&&(a=[2&a[0],i.value]),a[0]){case 0:case 1:i=a;break;case 4:return s.label++,{value:a[1],done:!1};case 5:s.label++,n=a[1],a=[0];continue;case 7:a=s.ops.pop(),s.trys.pop();continue;default:if(!((i=(i=s.trys).length>0&&i[i.length-1])||6!==a[0]&&2!==a[0])){s=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]<i[3])){s.label=a[1];break}if(6===a[0]&&s.label<i[1]){s.label=i[1],i=a;break}if(i&&s.label<i[2]){s.label=i[2],s.ops.push(a);break}i[2]&&s.ops.pop(),s.trys.pop();continue}a=e.call(t,s)}catch(t){a=[6,t],n=0}finally{r=i=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,c])}}},y=function(){function t(t,e,r,n){this.EXECUTIONS_TO_REPORT_PERFORMANCE=100,this.executions=0,this.executionResults=[],this.wasPrimaryDecoderUsedInLastDecode=!1,this.verbose=r,e&&S.isSupported()?(this.primaryDecoder=new S(t,r,n),this.secondaryDecoder=new I(t,r,n)):this.primaryDecoder=new I(t,r,n)}return t.prototype.decodeAsync=function(t){return _(this,void 0,void 0,(function(){var e;return T(this,(function(r){switch(r.label){case 0:e=performance.now(),r.label=1;case 1:return r.trys.push([1,,3,4]),[4,this.getDecoder().decodeAsync(t)];case 2:return[2,r.sent()];case 3:return this.possiblyLogPerformance(e),[7];case 4:return[2]}}))}))},t.prototype.decodeRobustlyAsync=function(t){return _(this,void 0,void 0,(function(){var e,r;return T(this,(function(n){switch(n.label){case 0:e=performance.now(),n.label=1;case 1:return n.trys.push([1,3,4,5]),[4,this.primaryDecoder.decodeAsync(t)];case 2:return[2,n.sent()];case 3:if(r=n.sent(),this.secondaryDecoder)return[2,this.secondaryDecoder.decodeAsync(t)];throw r;case 4:return this.possiblyLogPerformance(e),[7];case 5:return[2]}}))}))},t.prototype.getDecoder=function(){return this.secondaryDecoder?!1===this.wasPrimaryDecoderUsedInLastDecode?(this.wasPrimaryDecoderUsedInLastDecode=!0,this.primaryDecoder):(this.wasPrimaryDecoderUsedInLastDecode=!1,this.secondaryDecoder):this.primaryDecoder},t.prototype.possiblyLogPerformance=function(t){if(this.verbose){var e=performance.now()-t;this.executionResults.push(e),this.executions++,this.possiblyFlushPerformanceReport()}},t.prototype.possiblyFlushPerformanceReport=function(){if(!(this.executions<this.EXECUTIONS_TO_REPORT_PERFORMANCE)){for(var t=0,e=0,r=this.executionResults;e<r.length;e++)t+=r[e];var n=t/this.executionResults.length;console.log("".concat(n," ms for ").concat(this.executionResults.length," last runs.")),this.executions=0,this.executionResults=[]}},t}(),N=(g=function(t,e){return g=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},g(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}g(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),D=function(t,e,r,n){return new(r||(r=Promise))((function(i,o){function s(t){try{c(n.next(t))}catch(t){o(t)}}function a(t){try{c(n.throw(t))}catch(t){o(t)}}function c(t){var e;t.done?i(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(s,a)}c((n=n.apply(t,e||[])).next())}))},M=function(t,e){var r,n,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(a){return function(c){return function(a){if(r)throw new TypeError("Generator is already executing.");for(;o&&(o=0,a[0]&&(s=0)),s;)try{if(r=1,n&&(i=2&a[0]?n.return:a[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,a[1])).done)return i;switch(n=0,i&&(a=[2&a[0],i.value]),a[0]){case 0:case 1:i=a;break;case 4:return s.label++,{value:a[1],done:!1};case 5:s.label++,n=a[1],a=[0];continue;case 7:a=s.ops.pop(),s.trys.pop();continue;default:if(!((i=(i=s.trys).length>0&&i[i.length-1])||6!==a[0]&&2!==a[0])){s=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]<i[3])){s.label=a[1];break}if(6===a[0]&&s.label<i[1]){s.label=i[1],i=a;break}if(i&&s.label<i[2]){s.label=i[2],s.ops.push(a);break}i[2]&&s.ops.pop(),s.trys.pop();continue}a=e.call(t,s)}catch(t){a=[6,t],n=0}finally{r=i=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,c])}}},R=function(){function t(t,e){this.name=t,this.track=e}return t.prototype.isSupported=function(){return!!this.track.getCapabilities&&this.name in this.track.getCapabilities()},t.prototype.apply=function(t){var e={};e[this.name]=t;var r={advanced:[e]};return this.track.applyConstraints(r)},t.prototype.value=function(){var t=this.track.getSettings();return this.name in t?t[this.name]:null},t}(),O=function(t){function e(e){return t.call(this,"zoom",e)||this}return N(e,t),e}(function(t){function e(e,r){return t.call(this,e,r)||this}return N(e,t),e.prototype.min=function(){return this.getCapabilities().min},e.prototype.max=function(){return this.getCapabilities().max},e.prototype.step=function(){return this.getCapabilities().step},e.prototype.apply=function(t){var e={};e[this.name]=t;var r={advanced:[e]};return this.track.applyConstraints(r)},e.prototype.getCapabilities=function(){this.failIfNotSupported();var t=this.track.getCapabilities()[this.name];return{min:t.min,max:t.max,step:t.step}},e.prototype.failIfNotSupported=function(){if(!this.isSupported())throw new Error("".concat(this.name," capability not supported"))},e}(R)),b=function(t){function e(e){return t.call(this,"torch",e)||this}return N(e,t),e}(R),B=function(){function t(t){this.track=t}return t.prototype.zoomFeature=function(){return new O(this.track)},t.prototype.torchFeature=function(){return new b(this.track)},t}(),L=function(){function t(t,e,r){this.isClosed=!1,this.parentElement=t,this.mediaStream=e,this.callbacks=r,this.surface=this.createVideoElement(this.parentElement.clientWidth),t.append(this.surface)}return t.prototype.createVideoElement=function(t){var e=document.createElement("video");return e.style.width="".concat(t,"px"),e.style.display="block",e.muted=!0,e.setAttribute("muted","true"),e.playsInline=!0,e},t.prototype.setupSurface=function(){var t=this;this.surface.onabort=function(){throw"RenderedCameraImpl video surface onabort() called"},this.surface.onerror=function(){throw"RenderedCameraImpl video surface onerror() called"};var e=function(){var r=t.surface.clientWidth,n=t.surface.clientHeight;t.callbacks.onRenderSurfaceReady(r,n),t.surface.removeEventListener("playing",e)};this.surface.addEventListener("playing",e),this.surface.srcObject=this.mediaStream,this.surface.play()},t.create=function(e,r,n,i){return D(this,void 0,void 0,(function(){var o,s;return M(this,(function(a){switch(a.label){case 0:return o=new t(e,r,i),n.aspectRatio?(s={aspectRatio:n.aspectRatio},[4,o.getFirstTrackOrFail().applyConstraints(s)]):[3,2];case 1:a.sent(),a.label=2;case 2:return o.setupSurface(),[2,o]}}))}))},t.prototype.failIfClosed=function(){if(this.isClosed)throw"The RenderedCamera has already been closed."},t.prototype.getFirstTrackOrFail=function(){if(this.failIfClosed(),0===this.mediaStream.getVideoTracks().length)throw"No video tracks found";return this.mediaStream.getVideoTracks()[0]},t.prototype.pause=function(){this.failIfClosed(),this.surface.pause()},t.prototype.resume=function(t){this.failIfClosed();var e=this,r=function(){setTimeout(t,200),e.surface.removeEventListener("playing",r)};this.surface.addEventListener("playing",r),this.surface.play()},t.prototype.isPaused=function(){return this.failIfClosed(),this.surface.paused},t.prototype.getSurface=function(){return this.failIfClosed(),this.surface},t.prototype.getRunningTrackCapabilities=function(){return this.getFirstTrackOrFail().getCapabilities()},t.prototype.getRunningTrackSettings=function(){return this.getFirstTrackOrFail().getSettings()},t.prototype.applyVideoConstraints=function(t){return D(this,void 0,void 0,(function(){return M(this,(function(e){if("aspectRatio"in t)throw"Changing 'aspectRatio' in run-time is not yet supported.";return[2,this.getFirstTrackOrFail().applyConstraints(t)]}))}))},t.prototype.close=function(){if(this.isClosed)return Promise.resolve();var t=this;return new Promise((function(e,r){var n=t.mediaStream.getVideoTracks().length,i=0;t.mediaStream.getVideoTracks().forEach((function(r){t.mediaStream.removeTrack(r),r.stop(),++i>=n&&(t.isClosed=!0,t.parentElement.removeChild(t.surface),e())}))}))},t.prototype.getCapabilities=function(){return new B(this.getFirstTrackOrFail())},t}(),P=function(){function t(t){this.mediaStream=t}return t.prototype.render=function(t,e,r){return D(this,void 0,void 0,(function(){return M(this,(function(n){return[2,L.create(t,this.mediaStream,e,r)]}))}))},t.create=function(e){return D(this,void 0,void 0,(function(){var r;return M(this,(function(n){switch(n.label){case 0:if(!navigator.mediaDevices)throw"navigator.mediaDevices not supported";return r={audio:!1,video:e},[4,navigator.mediaDevices.getUserMedia(r)];case 1:return[2,new t(n.sent())]}}))}))},t}(),v=function(t,e,r,n){return new(r||(r=Promise))((function(i,o){function s(t){try{c(n.next(t))}catch(t){o(t)}}function a(t){try{c(n.throw(t))}catch(t){o(t)}}function c(t){var e;t.done?i(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(s,a)}c((n=n.apply(t,e||[])).next())}))},F=function(t,e){var r,n,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(a){return function(c){return function(a){if(r)throw new TypeError("Generator is already executing.");for(;o&&(o=0,a[0]&&(s=0)),s;)try{if(r=1,n&&(i=2&a[0]?n.return:a[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,a[1])).done)return i;switch(n=0,i&&(a=[2&a[0],i.value]),a[0]){case 0:case 1:i=a;break;case 4:return s.label++,{value:a[1],done:!1};case 5:s.label++,n=a[1],a=[0];continue;case 7:a=s.ops.pop(),s.trys.pop();continue;default:if(!((i=(i=s.trys).length>0&&i[i.length-1])||6!==a[0]&&2!==a[0])){s=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]<i[3])){s.label=a[1];break}if(6===a[0]&&s.label<i[1]){s.label=i[1],i=a;break}if(i&&s.label<i[2]){s.label=i[2],s.ops.push(a);break}i[2]&&s.ops.pop(),s.trys.pop();continue}a=e.call(t,s)}catch(t){a=[6,t],n=0}finally{r=i=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,c])}}},x=function(){function t(){}return t.failIfNotSupported=function(){return v(this,void 0,void 0,(function(){return F(this,(function(e){if(!navigator.mediaDevices)throw"navigator.mediaDevices not supported";return[2,new t]}))}))},t.prototype.create=function(t){return v(this,void 0,void 0,(function(){return F(this,(function(e){return[2,P.create(t)]}))}))},t}(),k=function(){function t(){}return t.retrieve=function(){if(navigator.mediaDevices)return t.getCamerasFromMediaDevices();var e=MediaStreamTrack;return MediaStreamTrack&&e.getSources?t.getCamerasFromMediaStreamTrack():t.rejectWithError()},t.rejectWithError=function(){var e=m.unableToQuerySupportedDevices();return t.isHttpsOrLocalhost()||(e=m.insecureContextCameraQueryError()),Promise.reject(e)},t.isHttpsOrLocalhost=function(){if("https:"===location.protocol)return!0;var t=location.host.split(":")[0];return"127.0.0.1"===t||"localhost"===t},t.getCamerasFromMediaDevices=function(){return t=this,e=void 0,n=function(){var t,e,r,n,i,o,s;return function(t,e){var r,n,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(a){return function(c){return function(a){if(r)throw new TypeError("Generator is already executing.");for(;o&&(o=0,a[0]&&(s=0)),s;)try{if(r=1,n&&(i=2&a[0]?n.return:a[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,a[1])).done)return i;switch(n=0,i&&(a=[2&a[0],i.value]),a[0]){case 0:case 1:i=a;break;case 4:return s.label++,{value:a[1],done:!1};case 5:s.label++,n=a[1],a=[0];continue;case 7:a=s.ops.pop(),s.trys.pop();continue;default:if(!((i=(i=s.trys).length>0&&i[i.length-1])||6!==a[0]&&2!==a[0])){s=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]<i[3])){s.label=a[1];break}if(6===a[0]&&s.label<i[1]){s.label=i[1],i=a;break}if(i&&s.label<i[2]){s.label=i[2],s.ops.push(a);break}i[2]&&s.ops.pop(),s.trys.pop();continue}a=e.call(t,s)}catch(t){a=[6,t],n=0}finally{r=i=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,c])}}}(this,(function(a){switch(a.label){case 0:return t=function(t){for(var e=0,r=t.getVideoTracks();e<r.length;e++){var n=r[e];n.enabled=!1,n.stop(),t.removeTrack(n)}},[4,navigator.mediaDevices.getUserMedia({audio:!1,video:!0})];case 1:return e=a.sent(),[4,navigator.mediaDevices.enumerateDevices()];case 2:for(r=a.sent(),n=[],i=0,o=r;i<o.length;i++)"videoinput"===(s=o[i]).kind&&n.push({id:s.deviceId,label:s.label});return t(e),[2,n]}}))},new((r=void 0)||(r=Promise))((function(i,o){function s(t){try{c(n.next(t))}catch(t){o(t)}}function a(t){try{c(n.throw(t))}catch(t){o(t)}}function c(t){var e;t.done?i(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(s,a)}c((n=n.apply(t,e||[])).next())}));var t,e,r,n},t.getCamerasFromMediaStreamTrack=function(){return new Promise((function(t,e){MediaStreamTrack.getSources((function(e){for(var r=[],n=0,i=e;n<i.length;n++){var o=i[n];"video"===o.kind&&r.push({id:o.id,label:o.label})}t(r)}))}))},t}();!function(t){t[t.UNKNOWN=0]="UNKNOWN",t[t.NOT_STARTED=1]="NOT_STARTED",t[t.SCANNING=2]="SCANNING",t[t.PAUSED=3]="PAUSED"}(w||(w={}));var U,H=function(){function t(){this.state=w.NOT_STARTED,this.onGoingTransactionNewState=w.UNKNOWN}return t.prototype.directTransition=function(t){this.failIfTransitionOngoing(),this.validateTransition(t),this.state=t},t.prototype.startTransition=function(t){return this.failIfTransitionOngoing(),this.validateTransition(t),this.onGoingTransactionNewState=t,this},t.prototype.execute=function(){if(this.onGoingTransactionNewState===w.UNKNOWN)throw"Transaction is already cancelled, cannot execute().";var t=this.onGoingTransactionNewState;this.onGoingTransactionNewState=w.UNKNOWN,this.directTransition(t)},t.prototype.cancel=function(){if(this.onGoingTransactionNewState===w.UNKNOWN)throw"Transaction is already cancelled, cannot cancel().";this.onGoingTransactionNewState=w.UNKNOWN},t.prototype.getState=function(){return this.state},t.prototype.failIfTransitionOngoing=function(){if(this.onGoingTransactionNewState!==w.UNKNOWN)throw"Cannot transition to a new state, already under transition"},t.prototype.validateTransition=function(t){switch(this.state){case w.UNKNOWN:throw"Transition from unknown is not allowed";case w.NOT_STARTED:this.failIfNewStateIs(t,[w.PAUSED]);case w.SCANNING:case w.PAUSED:}},t.prototype.failIfNewStateIs=function(t,e){for(var r=0,n=e;r<n.length;r++)if(t===n[r])throw"Cannot transition from ".concat(this.state," to ").concat(t)},t}(),V=function(){function t(t){this.stateManager=t}return t.prototype.startTransition=function(t){return this.stateManager.startTransition(t)},t.prototype.directTransition=function(t){this.stateManager.directTransition(t)},t.prototype.getState=function(){return this.stateManager.getState()},t.prototype.canScanFile=function(){return this.stateManager.getState()===w.NOT_STARTED},t.prototype.isScanning=function(){return this.stateManager.getState()!==w.NOT_STARTED},t.prototype.isStrictlyScanning=function(){return this.stateManager.getState()===w.SCANNING},t.prototype.isPaused=function(){return this.stateManager.getState()===w.PAUSED},t}(),z=function(){function t(){}return t.create=function(){return new V(new H)},t}(),G=function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},t(e,r)};return function(e,r){if("function"!=typeof r&&null!==r)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");function n(){this.constructor=e}t(e,r),e.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),Y=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return G(e,t),e.DEFAULT_WIDTH=300,e.DEFAULT_WIDTH_OFFSET=2,e.FILE_SCAN_MIN_HEIGHT=300,e.FILE_SCAN_HIDDEN_CANVAS_PADDING=100,e.MIN_QR_BOX_SIZE=50,e.SHADED_LEFT=1,e.SHADED_RIGHT=2,e.SHADED_TOP=3,e.SHADED_BOTTOM=4,e.SHADED_REGION_ELEMENT_ID="qr-shaded-region",e.VERBOSE=!1,e.BORDER_SHADER_DEFAULT_COLOR="#ffffff",e.BORDER_SHADER_MATCH_COLOR="rgb(90, 193, 56)",e}(c),X=function(){function t(t,e){this.logger=e,this.fps=Y.SCAN_DEFAULT_FPS,t?(t.fps&&(this.fps=t.fps),this.disableFlip=!0===t.disableFlip,this.qrbox=t.qrbox,this.aspectRatio=t.aspectRatio,this.videoConstraints=t.videoConstraints):this.disableFlip=Y.DEFAULT_DISABLE_FLIP}return t.prototype.isMediaStreamConstraintsValid=function(){return this.videoConstraints?C.isMediaStreamConstraintsValid(this.videoConstraints,this.logger):(this.logger.logError("Empty videoConstraints",!0),!1)},t.prototype.isShadedBoxEnabled=function(){return!f(this.qrbox)},t.create=function(e,r){return new t(e,r)},t}(),W=function(){function e(t,e){if(this.element=null,this.canvasElement=null,this.scannerPausedUiElement=null,this.hasBorderShaders=null,this.borderShaders=null,this.qrMatch=null,this.renderedCamera=null,this.qrRegion=null,this.context=null,this.lastScanImageFile=null,this.isScanning=!1,!document.getElementById(t))throw"HTML Element with id=".concat(t," not found");var r;this.elementId=t,this.verbose=!1,"boolean"==typeof e?this.verbose=!0===e:e&&(r=e,this.verbose=!0===r.verbose,r.experimentalFeatures),this.logger=new d(this.verbose),this.qrcode=new y(this.getSupportedFormats(e),this.getUseBarCodeDetectorIfSupported(r),this.verbose,this.logger),this.foreverScanTimeout,this.shouldScan=!0,this.stateManagerProxy=z.create()}return e.prototype.start=function(t,e,r,n){var i,o=this;if(!t)throw"cameraIdOrConfig is required";if(!r||"function"!=typeof r)throw"qrCodeSuccessCallback is required and should be a function.";i=n||(this.verbose?this.logger.log:function(){});var s=X.create(e,this.logger);this.clearElement();var a=!1;s.videoConstraints&&(s.isMediaStreamConstraintsValid()?a=!0:this.logger.logError("'videoConstraints' is not valid 'MediaStreamConstraints, it will be ignored.'",!0));var c=a,l=document.getElementById(this.elementId);l.clientWidth?l.clientWidth:Y.DEFAULT_WIDTH,l.style.position="relative",this.shouldScan=!0,this.element=l;var h=this,u=this.stateManagerProxy.startTransition(w.SCANNING);return new Promise((function(e,n){var a=c?s.videoConstraints:h.createVideoConstraints(t);if(!a)return u.cancel(),void n("videoConstraints should be defined");var l={};c&&!s.aspectRatio||(l.aspectRatio=s.aspectRatio);var d={onRenderSurfaceReady:function(t,e){h.setupUi(t,e,s),h.isScanning=!0,h.foreverScan(s,r,i)}};x.failIfNotSupported().then((function(t){t.create(a).then((function(t){return t.render(o.element,l,d).then((function(t){h.renderedCamera=t,u.execute(),e(null)})).catch((function(t){u.cancel(),n(t)}))})).catch((function(t){u.cancel(),n(m.errorGettingUserMedia(t))}))})).catch((function(t){u.cancel(),n(m.cameraStreamingNotSupported())}))}))},e.prototype.pause=function(t){if(!this.stateManagerProxy.isStrictlyScanning())throw"Cannot pause, scanner is not scanning.";this.stateManagerProxy.directTransition(w.PAUSED),this.showPausedState(),(f(t)||!0!==t)&&(t=!1),t&&this.renderedCamera&&this.renderedCamera.pause()},e.prototype.resume=function(){if(!this.stateManagerProxy.isPaused())throw"Cannot result, scanner is not paused.";if(!this.renderedCamera)throw"renderedCamera doesn't exist while trying resume()";var t=this,e=function(){t.stateManagerProxy.directTransition(w.SCANNING),t.hidePausedState()};this.renderedCamera.isPaused()?this.renderedCamera.resume((function(){e()})):e()},e.prototype.getState=function(){return this.stateManagerProxy.getState()},e.prototype.stop=function(){var t=this;if(!this.stateManagerProxy.isScanning())throw"Cannot stop, scanner is not running or paused.";var e=this.stateManagerProxy.startTransition(w.NOT_STARTED);this.shouldScan=!1,this.foreverScanTimeout&&clearTimeout(this.foreverScanTimeout);var r=this;return this.renderedCamera.close().then((function(){return r.renderedCamera=null,r.element&&(r.element.removeChild(r.canvasElement),r.canvasElement=null),function(){if(t.element){var e=document.getElementById(Y.SHADED_REGION_ELEMENT_ID);e&&t.element.removeChild(e)}}(),r.qrRegion&&(r.qrRegion=null),r.context&&(r.context=null),e.execute(),r.hidePausedState(),r.isScanning=!1,Promise.resolve()}))},e.prototype.scanFile=function(t,e){return this.scanFileV2(t,e).then((function(t){return t.decodedText}))},e.prototype.scanFileV2=function(t,e){var r=this;if(!(t&&t instanceof File))throw"imageFile argument is mandatory and should be instance of File. Use 'event.target.files[0]'.";if(f(e)&&(e=!0),!this.stateManagerProxy.canScanFile())throw"Cannot start file scan - ongoing camera scan";return new Promise((function(n,i){r.possiblyCloseLastScanImageFile(),r.clearElement(),r.lastScanImageFile=URL.createObjectURL(t);var o=new Image;o.onload=function(){var t=o.width,s=o.height,a=document.getElementById(r.elementId),c=a.clientWidth?a.clientWidth:Y.DEFAULT_WIDTH,l=Math.max(a.clientHeight?a.clientHeight:s,Y.FILE_SCAN_MIN_HEIGHT),u=r.computeCanvasDrawConfig(t,s,c,l);if(e){var d=r.createCanvasElement(c,l,"qr-canvas-visible");d.style.display="inline-block",a.appendChild(d);var f=d.getContext("2d");if(!f)throw"Unable to get 2d context from canvas";f.canvas.width=c,f.canvas.height=l,f.drawImage(o,0,0,t,s,u.x,u.y,u.width,u.height)}var g=Y.FILE_SCAN_HIDDEN_CANVAS_PADDING,w=Math.max(o.width,u.width),m=Math.max(o.height,u.height),p=w+2*g,A=m+2*g,C=r.createCanvasElement(p,A);a.appendChild(C);var E=C.getContext("2d");if(!E)throw"Unable to get 2d context from canvas";E.canvas.width=p,E.canvas.height=A,E.drawImage(o,0,0,t,s,g,g,w,m);try{r.qrcode.decodeRobustlyAsync(C).then((function(t){n(h.createFromQrcodeResult(t))})).catch(i)}catch(t){i("QR code parse error, error = ".concat(t))}},o.onerror=i,o.onabort=i,o.onstalled=i,o.onsuspend=i,o.src=URL.createObjectURL(t)}))},e.prototype.clear=function(){this.clearElement()},e.getCameras=function(){return k.retrieve()},e.prototype.getRunningTrackCapabilities=function(){return this.getRenderedCameraOrFail().getRunningTrackCapabilities()},e.prototype.getRunningTrackSettings=function(){return this.getRenderedCameraOrFail().getRunningTrackSettings()},e.prototype.getRunningTrackCameraCapabilities=function(){return this.getRenderedCameraOrFail().getCapabilities()},e.prototype.applyVideoConstraints=function(t){if(!t)throw"videoConstaints is required argument.";if(!C.isMediaStreamConstraintsValid(t,this.logger))throw"invalid videoConstaints passed, check logs for more details";return this.getRenderedCameraOrFail().applyVideoConstraints(t)},e.prototype.getRenderedCameraOrFail=function(){if(null==this.renderedCamera)throw"Scanning is not in running state, call this API only when QR code scanning using camera is in running state.";return this.renderedCamera},e.prototype.getSupportedFormats=function(e){var r=[t.QR_CODE,t.AZTEC,t.CODABAR,t.CODE_39,t.CODE_93,t.CODE_128,t.DATA_MATRIX,t.MAXICODE,t.ITF,t.EAN_13,t.EAN_8,t.PDF_417,t.RSS_14,t.RSS_EXPANDED,t.UPC_A,t.UPC_E,t.UPC_EAN_EXTENSION];if(!e||"boolean"==typeof e)return r;if(!e.formatsToSupport)return r;if(!Array.isArray(e.formatsToSupport))throw"configOrVerbosityFlag.formatsToSupport should be undefined or an array.";if(0===e.formatsToSupport.length)throw"Atleast 1 formatsToSupport is needed.";for(var n=[],i=0,o=e.formatsToSupport;i<o.length;i++){var a=o[i];s(a)?n.push(a):this.logger.warn("Invalid format: ".concat(a," passed in config, ignoring."))}if(0===n.length)throw"None of formatsToSupport match supported values.";return n},e.prototype.getUseBarCodeDetectorIfSupported=function(t){if(f(t))return!0;if(!f(t.useBarCodeDetectorIfSupported))return!1!==t.useBarCodeDetectorIfSupported;if(f(t.experimentalFeatures))return!0;var e=t.experimentalFeatures;return!!f(e.useBarCodeDetectorIfSupported)||!1!==e.useBarCodeDetectorIfSupported},e.prototype.validateQrboxSize=function(t,e,r){var n=r.qrbox;this.validateQrboxConfig(n);var i,o=this.toQrdimensions(t,e,n),s=function(t){if(t<Y.MIN_QR_BOX_SIZE)throw"minimum size of 'config.qrbox' dimension value is"+" ".concat(Y.MIN_QR_BOX_SIZE,"px.")};s(o.width),s(o.height),o.width=((i=o.width)>t&&(this.logger.warn("`qrbox.width` or `qrbox` is larger than the width of the root element. The width will be truncated to the width of root element."),i=t),i)},e.prototype.validateQrboxConfig=function(t){if("number"!=typeof t&&"function"!=typeof t&&(void 0===t.width||void 0===t.height))throw"Invalid instance of QrDimensions passed for 'config.qrbox'. Both 'width' and 'height' should be set."},e.prototype.toQrdimensions=function(t,e,r){if("number"==typeof r)return{width:r,height:r};if("function"==typeof r)try{return r(t,e)}catch(t){throw new Error("qrbox config was passed as a function but it failed with unknown error"+t)}return r},e.prototype.setupUi=function(t,e,r){r.isShadedBoxEnabled()&&this.validateQrboxSize(t,e,r);var n=f(r.qrbox)?{width:t,height:e}:r.qrbox;this.validateQrboxConfig(n);var i=this.toQrdimensions(t,e,n);i.height>e&&this.logger.warn("[Html5Qrcode] config.qrbox has height that isgreater than the height of the video stream. Shading will be ignored");var o=r.isShadedBoxEnabled()&&i.height<=e,s={x:0,y:0,width:t,height:e},a=o?this.getShadedRegionBounds(t,e,i):s,c=this.createCanvasElement(a.width,a.height),l=c.getContext("2d",{willReadFrequently:!0});l.canvas.width=a.width,l.canvas.height=a.height,this.element.append(c),o&&this.possiblyInsertShadingElement(this.element,t,e,i),this.createScannerPausedUiElement(this.element),this.qrRegion=a,this.context=l,this.canvasElement=c},e.prototype.createScannerPausedUiElement=function(t){var e=document.createElement("div");e.innerText=m.scannerPaused(),e.style.display="none",e.style.position="absolute",e.style.top="0px",e.style.zIndex="1",e.style.background="rgba(9, 9, 9, 0.46)",e.style.color="#FFECEC",e.style.textAlign="center",e.style.width="100%",t.appendChild(e),this.scannerPausedUiElement=e},e.prototype.scanContext=function(t,e){var r=this;return this.stateManagerProxy.isPaused()?Promise.resolve(!1):this.qrcode.decodeAsync(this.canvasElement).then((function(e){return t(e.text,h.createFromQrcodeResult(e)),r.possiblyUpdateShaders(!0),!0})).catch((function(t){r.possiblyUpdateShaders(!1);var n=m.codeParseError(t);return e(n,u.createFrom(n)),!1}))},e.prototype.foreverScan=function(t,e,r){var n=this;if(this.shouldScan&&this.renderedCamera){var i=this.renderedCamera.getSurface(),o=i.videoWidth/i.clientWidth,s=i.videoHeight/i.clientHeight;if(!this.qrRegion)throw"qrRegion undefined when localMediaStream is ready.";var a=this.qrRegion.width*o,c=this.qrRegion.height*s,l=this.qrRegion.x*o,h=this.qrRegion.y*s;this.context.drawImage(i,l,h,a,c,0,0,this.qrRegion.width,this.qrRegion.height);var u=function(){n.foreverScanTimeout=setTimeout((function(){n.foreverScan(t,e,r)}),n.getTimeoutFps(t.fps))};this.scanContext(e,r).then((function(i){i||!0===t.disableFlip?u():(n.context.translate(n.context.canvas.width,0),n.context.scale(-1,1),n.scanContext(e,r).finally((function(){u()})))})).catch((function(t){n.logger.logError("Error happend while scanning context",t),u()}))}},e.prototype.createVideoConstraints=function(t){if("string"==typeof t)return{deviceId:{exact:t}};if("object"==typeof t){var e="facingMode",r="deviceId",n={user:!0,environment:!0},i="exact",o=function(t){if(t in n)return!0;throw"config has invalid 'facingMode' value = "+"'".concat(t,"'")},s=Object.keys(t);if(1!==s.length)throw"'cameraIdOrConfig' object should have exactly 1 key,"+" if passed as an object, found ".concat(s.length," keys");var a=Object.keys(t)[0];if(a!==e&&a!==r)throw"Only '".concat(e,"' and '").concat(r,"' ")+" are supported for 'cameraIdOrConfig'";if(a!==e){var c=t.deviceId;if("string"==typeof c)return{deviceId:c};if("object"==typeof c){if(i in c)return{deviceId:{exact:c["".concat(i)]}};throw"'deviceId' should be string or object with"+" ".concat(i," as key.")}throw"Invalid type of 'deviceId' = ".concat(typeof c)}var l=t.facingMode;if("string"==typeof l){if(o(l))return{facingMode:l}}else{if("object"!=typeof l)throw"Invalid type of 'facingMode' = ".concat(typeof l);if(!(i in l))throw"'facingMode' should be string or object with"+" ".concat(i," as key.");if(o(l["".concat(i)]))return{facingMode:{exact:l["".concat(i)]}}}}throw"Invalid type of 'cameraIdOrConfig' = ".concat(typeof t)},e.prototype.computeCanvasDrawConfig=function(t,e,r,n){if(t<=r&&e<=n)return{x:(r-t)/2,y:(n-e)/2,width:t,height:e};var i=t,o=e;return t>r&&(e*=r/t,t=r),e>n&&(t*=n/e,e=n),this.logger.log("Image downsampled from "+"".concat(i,"X").concat(o)+" to ".concat(t,"X").concat(e,".")),this.computeCanvasDrawConfig(t,e,r,n)},e.prototype.clearElement=function(){if(this.stateManagerProxy.isScanning())throw"Cannot clear while scan is ongoing, close it first.";var t=document.getElementById(this.elementId);t&&(t.innerHTML="")},e.prototype.possiblyUpdateShaders=function(t){this.qrMatch!==t&&(this.hasBorderShaders&&this.borderShaders&&this.borderShaders.length&&this.borderShaders.forEach((function(e){e.style.backgroundColor=t?Y.BORDER_SHADER_MATCH_COLOR:Y.BORDER_SHADER_DEFAULT_COLOR})),this.qrMatch=t)},e.prototype.possiblyCloseLastScanImageFile=function(){this.lastScanImageFile&&(URL.revokeObjectURL(this.lastScanImageFile),this.lastScanImageFile=null)},e.prototype.createCanvasElement=function(t,e,r){var n=t,i=e,o=document.createElement("canvas");return o.style.width="".concat(n,"px"),o.style.height="".concat(i,"px"),o.style.display="none",o.id=f(r)?"qr-canvas":r,o},e.prototype.getShadedRegionBounds=function(t,e,r){if(r.width>t||r.height>e)throw"'config.qrbox' dimensions should not be greater than the dimensions of the root HTML element.";return{x:(t-r.width)/2,y:(e-r.height)/2,width:r.width,height:r.height}},e.prototype.possiblyInsertShadingElement=function(t,e,r,n){if(!(e-n.width<1||r-n.height<1)){var i=document.createElement("div");i.style.position="absolute";var o=(e-n.width)/2,s=(r-n.height)/2;if(i.style.borderLeft="".concat(o,"px solid rgba(0, 0, 0, 0.48)"),i.style.borderRight="".concat(o,"px solid rgba(0, 0, 0, 0.48)"),i.style.borderTop="".concat(s,"px solid rgba(0, 0, 0, 0.48)"),i.style.borderBottom="".concat(s,"px solid rgba(0, 0, 0, 0.48)"),i.style.boxSizing="border-box",i.style.top="0px",i.style.bottom="0px",i.style.left="0px",i.style.right="0px",i.id="".concat(Y.SHADED_REGION_ELEMENT_ID),e-n.width<11||r-n.height<11)this.hasBorderShaders=!1;else{this.insertShaderBorders(i,40,5,-5,null,0,!0),this.insertShaderBorders(i,40,5,-5,null,0,!1),this.insertShaderBorders(i,40,5,null,-5,0,!0),this.insertShaderBorders(i,40,5,null,-5,0,!1),this.insertShaderBorders(i,5,45,-5,null,-5,!0),this.insertShaderBorders(i,5,45,null,-5,-5,!0),this.insertShaderBorders(i,5,45,-5,null,-5,!1),this.insertShaderBorders(i,5,45,null,-5,-5,!1),this.hasBorderShaders=!0}t.append(i)}},e.prototype.insertShaderBorders=function(t,e,r,n,i,o,s){var a=document.createElement("div");a.style.position="absolute",a.style.backgroundColor=Y.BORDER_SHADER_DEFAULT_COLOR,a.style.width="".concat(e,"px"),a.style.height="".concat(r,"px"),null!==n&&(a.style.top="".concat(n,"px")),null!==i&&(a.style.bottom="".concat(i,"px")),s?a.style.left="".concat(o,"px"):a.style.right="".concat(o,"px"),this.borderShaders||(this.borderShaders=[]),this.borderShaders.push(a),t.appendChild(a)},e.prototype.showPausedState=function(){if(!this.scannerPausedUiElement)throw"[internal error] scanner paused UI element not found";this.scannerPausedUiElement.style.display="block"},e.prototype.hidePausedState=function(){if(!this.scannerPausedUiElement)throw"[internal error] scanner paused UI element not found";this.scannerPausedUiElement.style.display="none"},e.prototype.getTimeoutFps=function(t){return 1e3/t},e}(),j="data:image/svg+xml;base64,",Z=j+"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzNzEuNjQzIDM3MS42NDMiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDM3MS42NDMgMzcxLjY0MyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBhdGggZD0iTTEwNS4wODQgMzguMjcxaDE2My43Njh2MjBIMTA1LjA4NHoiLz48cGF0aCBkPSJNMzExLjU5NiAxOTAuMTg5Yy03LjQ0MS05LjM0Ny0xOC40MDMtMTYuMjA2LTMyLjc0My0yMC41MjJWMzBjMC0xNi41NDItMTMuNDU4LTMwLTMwLTMwSDEyNS4wODRjLTE2LjU0MiAwLTMwIDEzLjQ1OC0zMCAzMHYxMjAuMTQzaC04LjI5NmMtMTYuNTQyIDAtMzAgMTMuNDU4LTMwIDMwdjEuMzMzYTI5LjgwNCAyOS44MDQgMCAwIDAgNC42MDMgMTUuOTM5Yy03LjM0IDUuNDc0LTEyLjEwMyAxNC4yMjEtMTIuMTAzIDI0LjA2MXYxLjMzM2MwIDkuODQgNC43NjMgMTguNTg3IDEyLjEwMyAyNC4wNjJhMjkuODEgMjkuODEgMCAwIDAtNC42MDMgMTUuOTM4djEuMzMzYzAgMTYuNTQyIDEzLjQ1OCAzMCAzMCAzMGg4LjMyNGMuNDI3IDExLjYzMSA3LjUwMyAyMS41ODcgMTcuNTM0IDI2LjE3Ny45MzEgMTAuNTAzIDQuMDg0IDMwLjE4NyAxNC43NjggNDUuNTM3YTkuOTg4IDkuOTg4IDAgMCAwIDguMjE2IDQuMjg4IDkuOTU4IDkuOTU4IDAgMCAwIDUuNzA0LTEuNzkzYzQuNTMzLTMuMTU1IDUuNjUtOS4zODggMi40OTUtMTMuOTIxLTYuNzk4LTkuNzY3LTkuNjAyLTIyLjYwOC0xMC43Ni0zMS40aDgyLjY4NWMuMjcyLjQxNC41NDUuODE4LjgxNSAxLjIxIDMuMTQyIDQuNTQxIDkuMzcyIDUuNjc5IDEzLjkxMyAyLjUzNCA0LjU0Mi0zLjE0MiA1LjY3Ny05LjM3MSAyLjUzNS0xMy45MTMtMTEuOTE5LTE3LjIyOS04Ljc4Ny0zNS44ODQgOS41ODEtNTcuMDEyIDMuMDY3LTIuNjUyIDEyLjMwNy0xMS43MzIgMTEuMjE3LTI0LjAzMy0uODI4LTkuMzQzLTcuMTA5LTE3LjE5NC0xOC42NjktMjMuMzM3YTkuODU3IDkuODU3IDAgMCAwLTEuMDYxLS40ODZjLS40NjYtLjE4Mi0xMS40MDMtNC41NzktOS43NDEtMTUuNzA2IDEuMDA3LTYuNzM3IDE0Ljc2OC04LjI3MyAyMy43NjYtNy42NjYgMjMuMTU2IDEuNTY5IDM5LjY5OCA3LjgwMyA0Ny44MzYgMTguMDI2IDUuNzUyIDcuMjI1IDcuNjA3IDE2LjYyMyA1LjY3MyAyOC43MzMtLjQxMyAyLjU4NS0uODI0IDUuMjQxLTEuMjQ1IDcuOTU5LTUuNzU2IDM3LjE5NC0xMi45MTkgODMuNDgzLTQ5Ljg3IDExNC42NjEtNC4yMjEgMy41NjEtNC43NTYgOS44Ny0xLjE5NCAxNC4wOTJhOS45OCA5Ljk4IDAgMCAwIDcuNjQ4IDMuNTUxIDkuOTU1IDkuOTU1IDAgMCAwIDYuNDQ0LTIuMzU4YzQyLjY3Mi0zNi4wMDUgNTAuODAyLTg4LjUzMyA1Ni43MzctMTI2Ljg4OC40MTUtMi42ODQuODIxLTUuMzA5IDEuMjI5LTcuODYzIDIuODM0LTE3LjcyMS0uNDU1LTMyLjY0MS05Ljc3Mi00NC4zNDV6bS0yMzIuMzA4IDQyLjYyYy01LjUxNCAwLTEwLTQuNDg2LTEwLTEwdi0xLjMzM2MwLTUuNTE0IDQuNDg2LTEwIDEwLTEwaDE1djIxLjMzM2gtMTV6bS0yLjUtNTIuNjY2YzAtNS41MTQgNC40ODYtMTAgMTAtMTBoNy41djIxLjMzM2gtNy41Yy01LjUxNCAwLTEwLTQuNDg2LTEwLTEwdi0xLjMzM3ptMTcuNSA5My45OTloLTcuNWMtNS41MTQgMC0xMC00LjQ4Ni0xMC0xMHYtMS4zMzNjMC01LjUxNCA0LjQ4Ni0xMCAxMC0xMGg3LjV2MjEuMzMzem0zMC43OTYgMjguODg3Yy01LjUxNCAwLTEwLTQuNDg2LTEwLTEwdi04LjI3MWg5MS40NTdjLS44NTEgNi42NjgtLjQzNyAxMi43ODcuNzMxIDE4LjI3MWgtODIuMTg4em03OS40ODItMTEzLjY5OGMtMy4xMjQgMjAuOTA2IDEyLjQyNyAzMy4xODQgMjEuNjI1IDM3LjA0IDUuNDQxIDIuOTY4IDcuNTUxIDUuNjQ3IDcuNzAxIDcuMTg4LjIxIDIuMTUtMi41NTMgNS42ODQtNC40NzcgNy4yNTEtLjQ4Mi4zNzgtLjkyOS44LTEuMzM1IDEuMjYxLTYuOTg3IDcuOTM2LTExLjk4MiAxNS41Mi0xNS40MzIgMjIuNjg4aC05Ny41NjRWMzBjMC01LjUxNCA0LjQ4Ni0xMCAxMC0xMGgxMjMuNzY5YzUuNTE0IDAgMTAgNC40ODYgMTAgMTB2MTM1LjU3OWMtMy4wMzItLjM4MS02LjE1LS42OTQtOS4zODktLjkxNC0yNS4xNTktMS42OTQtNDIuMzcgNy43NDgtNDQuODk4IDI0LjY2NnoiLz48cGF0aCBkPSJNMTc5LjEyOSA4My4xNjdoLTI0LjA2YTUgNSAwIDAgMC01IDV2MjQuMDYxYTUgNSAwIDAgMCA1IDVoMjQuMDZhNSA1IDAgMCAwIDUtNVY4OC4xNjdhNSA1IDAgMCAwLTUtNXpNMTcyLjYyOSAxNDIuODZoLTEyLjU2VjEzMC44YTUgNSAwIDEgMC0xMCAwdjE3LjA2MWE1IDUgMCAwIDAgNSA1aDE3LjU2YTUgNSAwIDEgMCAwLTEwLjAwMXpNMjE2LjU2OCA4My4xNjdoLTI0LjA2YTUgNSAwIDAgMC01IDV2MjQuMDYxYTUgNSAwIDAgMCA1IDVoMjQuMDZhNSA1IDAgMCAwIDUtNVY4OC4xNjdhNSA1IDAgMCAwLTUtNXptLTUgMjQuMDYxaC0xNC4wNlY5My4xNjdoMTQuMDZ2MTQuMDYxek0yMTEuNjY5IDEyNS45MzZIMTk3LjQxYTUgNSAwIDAgMC01IDV2MTQuMjU3YTUgNSAwIDAgMCA1IDVoMTQuMjU5YTUgNSAwIDAgMCA1LTV2LTE0LjI1N2E1IDUgMCAwIDAtNS01eiIvPjwvc3ZnPg==",Q=j+"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1OS4wMTggNTkuMDE4IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1OS4wMTggNTkuMDE4IiB4bWw6c3BhY2U9InByZXNlcnZlIj48cGF0aCBkPSJtNTguNzQxIDU0LjgwOS01Ljk2OS02LjI0NGExMC43NCAxMC43NCAwIDAgMCAyLjgyLTcuMjVjMC01Ljk1My00Ljg0My0xMC43OTYtMTAuNzk2LTEwLjc5NlMzNCAzNS4zNjEgMzQgNDEuMzE0IDM4Ljg0MyA1Mi4xMSA0NC43OTYgNTIuMTFjMi40NDEgMCA0LjY4OC0uODI0IDYuNDk5LTIuMTk2bDYuMDAxIDYuMjc3YS45OTguOTk4IDAgMCAwIDEuNDE0LjAzMiAxIDEgMCAwIDAgLjAzMS0xLjQxNHpNMzYgNDEuMzE0YzAtNC44NSAzLjk0Ni04Ljc5NiA4Ljc5Ni04Ljc5NnM4Ljc5NiAzLjk0NiA4Ljc5NiA4Ljc5Ni0zLjk0NiA4Ljc5Ni04Ljc5NiA4Ljc5NlMzNiA0Ni4xNjQgMzYgNDEuMzE0ek0xMC40MzEgMTYuMDg4YzAgMy4wNyAyLjQ5OCA1LjU2OCA1LjU2OSA1LjU2OHM1LjU2OS0yLjQ5OCA1LjU2OS01LjU2OGMwLTMuMDcxLTIuNDk4LTUuNTY5LTUuNTY5LTUuNTY5cy01LjU2OSAyLjQ5OC01LjU2OSA1LjU2OXptOS4xMzggMGMwIDEuOTY4LTEuNjAyIDMuNTY4LTMuNTY5IDMuNTY4cy0zLjU2OS0xLjYwMS0zLjU2OS0zLjU2OCAxLjYwMi0zLjU2OSAzLjU2OS0zLjU2OSAzLjU2OSAxLjYwMSAzLjU2OSAzLjU2OXoiLz48cGF0aCBkPSJtMzAuODgyIDI4Ljk4NyA5LjE4LTEwLjA1NCAxMS4yNjIgMTAuMzIzYTEgMSAwIDAgMCAxLjM1MS0xLjQ3NWwtMTItMTFhMSAxIDAgMCAwLTEuNDE0LjA2M2wtOS43OTQgMTAuNzI3LTQuNzQzLTQuNzQzYTEuMDAzIDEuMDAzIDAgMCAwLTEuMzY4LS4wNDRMNi4zMzkgMzcuNzY4YTEgMSAwIDEgMCAxLjMyMiAxLjUwMWwxNi4zMTMtMTQuMzYyIDcuMzE5IDcuMzE4YS45OTkuOTk5IDAgMSAwIDEuNDE0LTEuNDE0bC0xLjgyNS0xLjgyNHoiLz48cGF0aCBkPSJNMzAgNDYuNTE4SDJ2LTQyaDU0djI4YTEgMSAwIDEgMCAyIDB2LTI5YTEgMSAwIDAgMC0xLTFIMWExIDEgMCAwIDAtMSAxdjQ0YTEgMSAwIDAgMCAxIDFoMjlhMSAxIDAgMSAwIDAtMnoiLz48L3N2Zz4=",K=j+"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NjAgNDYwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA0NjAgNDYwIiB4bWw6c3BhY2U9InByZXNlcnZlIj48cGF0aCBkPSJNMjMwIDBDMTAyLjk3NSAwIDAgMTAyLjk3NSAwIDIzMHMxMDIuOTc1IDIzMCAyMzAgMjMwIDIzMC0xMDIuOTc0IDIzMC0yMzBTMzU3LjAyNSAwIDIzMCAwem0zOC4zMzMgMzc3LjM2YzAgOC42NzYtNy4wMzQgMTUuNzEtMTUuNzEgMTUuNzFoLTQzLjEwMWMtOC42NzYgMC0xNS43MS03LjAzNC0xNS43MS0xNS43MVYyMDIuNDc3YzAtOC42NzYgNy4wMzMtMTUuNzEgMTUuNzEtMTUuNzFoNDMuMTAxYzguNjc2IDAgMTUuNzEgNy4wMzMgMTUuNzEgMTUuNzFWMzc3LjM2ek0yMzAgMTU3Yy0yMS41MzkgMC0zOS0xNy40NjEtMzktMzlzMTcuNDYxLTM5IDM5LTM5IDM5IDE3LjQ2MSAzOSAzOS0xNy40NjEgMzktMzkgMzl6Ii8+PC9zdmc+",q=function(){function t(){}return t.createDefault=function(){return{hasPermission:!1,lastUsedCameraId:null}},t}(),J=function(){function t(){this.data=q.createDefault();var e=localStorage.getItem(t.LOCAL_STORAGE_KEY);e?this.data=JSON.parse(e):this.reset()}return t.prototype.hasCameraPermissions=function(){return this.data.hasPermission},t.prototype.getLastUsedCameraId=function(){return this.data.lastUsedCameraId},t.prototype.setHasPermission=function(t){this.data.hasPermission=t,this.flush()},t.prototype.setLastUsedCameraId=function(t){this.data.lastUsedCameraId=t,this.flush()},t.prototype.resetLastUsedCameraId=function(){this.data.lastUsedCameraId=null,this.flush()},t.prototype.reset=function(){this.data=q.createDefault(),this.flush()},t.prototype.flush=function(){localStorage.setItem(t.LOCAL_STORAGE_KEY,JSON.stringify(this.data))},t.LOCAL_STORAGE_KEY="HTML5_QRCODE_DATA",t}(),$=function(){function t(){this.infoDiv=document.createElement("div")}return t.prototype.renderInto=function(t){this.infoDiv.style.position="absolute",this.infoDiv.style.top="10px",this.infoDiv.style.right="10px",this.infoDiv.style.zIndex="2",this.infoDiv.style.display="none",this.infoDiv.style.padding="5pt",this.infoDiv.style.border="1px solid #171717",this.infoDiv.style.fontSize="10pt",this.infoDiv.style.background="rgb(0 0 0 / 69%)",this.infoDiv.style.borderRadius="5px",this.infoDiv.style.textAlign="center",this.infoDiv.style.fontWeight="400",this.infoDiv.style.color="white",this.infoDiv.innerText=A.poweredBy();var e=document.createElement("a");e.innerText="ScanApp",e.href="https://scanapp.org",e.target="new",e.style.color="white",this.infoDiv.appendChild(e);var r=document.createElement("br"),n=document.createElement("br");this.infoDiv.appendChild(r),this.infoDiv.appendChild(n);var i=document.createElement("a");i.innerText=A.reportIssues(),i.href="https://github.com/mebjas/html5-qrcode/issues",i.target="new",i.style.color="white",this.infoDiv.appendChild(i),t.appendChild(this.infoDiv)},t.prototype.show=function(){this.infoDiv.style.display="block"},t.prototype.hide=function(){this.infoDiv.style.display="none"},t}(),tt=function(){function t(t,e){this.isShowingInfoIcon=!0,this.onTapIn=t,this.onTapOut=e,this.infoIcon=document.createElement("img")}return t.prototype.renderInto=function(t){var e=this;this.infoIcon.alt="Info icon",this.infoIcon.src=K,this.infoIcon.style.position="absolute",this.infoIcon.style.top="4px",this.infoIcon.style.right="4px",this.infoIcon.style.opacity="0.6",this.infoIcon.style.cursor="pointer",this.infoIcon.style.zIndex="2",this.infoIcon.style.width="16px",this.infoIcon.style.height="16px",this.infoIcon.onmouseover=function(t){return e.onHoverIn()},this.infoIcon.onmouseout=function(t){return e.onHoverOut()},this.infoIcon.onclick=function(t){return e.onClick()},t.appendChild(this.infoIcon)},t.prototype.onHoverIn=function(){this.isShowingInfoIcon&&(this.infoIcon.style.opacity="1")},t.prototype.onHoverOut=function(){this.isShowingInfoIcon&&(this.infoIcon.style.opacity="0.6")},t.prototype.onClick=function(){this.isShowingInfoIcon?(this.isShowingInfoIcon=!1,this.onTapIn(),this.infoIcon.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAQgAAAEIBarqQRAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAE1SURBVDiNfdI7S0NBEAXgLya1otFgpbYSbISAgpXYi6CmiH9KCAiChaVga6OiWPgfRDQ+0itaGVNosXtluWwcuMzePfM4M3sq8lbHBubwg1dc4m1E/J/N4ghDPOIsfk/4xiEao5KX0McFljN4C9d4QTPXuY99jP3DsIoDPGM6BY5i5yI5R7O4q+ImFkJY2DCh3cAH2klyB+9J1xUMMAG7eCh1a+Mr+k48b5diXrFVwwLuS+BJ9MfR7+G0FHOHhTHhnXNWS87VDF4pcnfQK4Ep7XScNLmPTZgURNKKYENYWDpzW1BhscS1WHS8CDgURFJQrWcoF3c13KKbgg1BYQfy8xZWEzTTw1QZbAoKu8FqJnktdu5hcVSHmchiILzzuaDQvjBzV2m8yohCE1jHfPx/xhU+y4G/D75ELlRJsSYAAAAASUVORK5CYII=",this.infoIcon.style.opacity="1"):(this.isShowingInfoIcon=!0,this.onTapOut(),this.infoIcon.src=K,this.infoIcon.style.opacity="0.6")},t}(),et=function(){function t(){var t=this;this.infoDiv=new $,this.infoIcon=new tt((function(){t.infoDiv.show()}),(function(){t.infoDiv.hide()}))}return t.prototype.renderInto=function(t){this.infoDiv.renderInto(t),this.infoIcon.renderInto(t)},t}(),rt=function(){function t(){}return t.hasPermissions=function(){return t=this,e=void 0,n=function(){var t,e,r,n;return function(t,e){var r,n,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(a){return function(c){return function(a){if(r)throw new TypeError("Generator is already executing.");for(;o&&(o=0,a[0]&&(s=0)),s;)try{if(r=1,n&&(i=2&a[0]?n.return:a[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,a[1])).done)return i;switch(n=0,i&&(a=[2&a[0],i.value]),a[0]){case 0:case 1:i=a;break;case 4:return s.label++,{value:a[1],done:!1};case 5:s.label++,n=a[1],a=[0];continue;case 7:a=s.ops.pop(),s.trys.pop();continue;default:if(!((i=(i=s.trys).length>0&&i[i.length-1])||6!==a[0]&&2!==a[0])){s=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]<i[3])){s.label=a[1];break}if(6===a[0]&&s.label<i[1]){s.label=i[1],i=a;break}if(i&&s.label<i[2]){s.label=i[2],s.ops.push(a);break}i[2]&&s.ops.pop(),s.trys.pop();continue}a=e.call(t,s)}catch(t){a=[6,t],n=0}finally{r=i=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,c])}}}(this,(function(i){switch(i.label){case 0:return[4,navigator.mediaDevices.enumerateDevices()];case 1:for(t=i.sent(),e=0,r=t;e<r.length;e++)if("videoinput"===(n=r[e]).kind&&n.label)return[2,!0];return[2,!1]}}))},new((r=void 0)||(r=Promise))((function(i,o){function s(t){try{c(n.next(t))}catch(t){o(t)}}function a(t){try{c(n.throw(t))}catch(t){o(t)}}function c(t){var e;t.done?i(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(s,a)}c((n=n.apply(t,e||[])).next())}));var t,e,r,n},t}(),nt=function(){function t(t){this.supportedScanTypes=this.validateAndReturnScanTypes(t)}return t.prototype.getDefaultScanType=function(){return this.supportedScanTypes[0]},t.prototype.hasMoreThanOneScanType=function(){return this.supportedScanTypes.length>1},t.prototype.isCameraScanRequired=function(){for(var e=0,r=this.supportedScanTypes;e<r.length;e++){var n=r[e];if(t.isCameraScanType(n))return!0}return!1},t.isCameraScanType=function(t){return t===i.SCAN_TYPE_CAMERA},t.isFileScanType=function(t){return t===i.SCAN_TYPE_FILE},t.prototype.validateAndReturnScanTypes=function(t){if(!t||0===t.length)return c.DEFAULT_SUPPORTED_SCAN_TYPE;var e=c.DEFAULT_SUPPORTED_SCAN_TYPE.length;if(t.length>e)throw"Max ".concat(e," values expected for ")+"supportedScanTypes";for(var r=0,n=t;r<n.length;r++){var i=n[r];if(!c.DEFAULT_SUPPORTED_SCAN_TYPE.includes(i))throw"Unsupported scan type ".concat(i)}return t},t}(),it=function(){function t(){}return t.ALL_ELEMENT_CLASS="html5-qrcode-element",t.CAMERA_PERMISSION_BUTTON_ID="html5-qrcode-button-camera-permission",t.CAMERA_START_BUTTON_ID="html5-qrcode-button-camera-start",t.CAMERA_STOP_BUTTON_ID="html5-qrcode-button-camera-stop",t.TORCH_BUTTON_ID="html5-qrcode-button-torch",t.CAMERA_SELECTION_SELECT_ID="html5-qrcode-select-camera",t.FILE_SELECTION_BUTTON_ID="html5-qrcode-button-file-selection",t.ZOOM_SLIDER_ID="html5-qrcode-input-range-zoom",t.SCAN_TYPE_CHANGE_ANCHOR_ID="html5-qrcode-anchor-scan-type-change",t.TORCH_BUTTON_CLASS_TORCH_ON="html5-qrcode-button-torch-on",t.TORCH_BUTTON_CLASS_TORCH_OFF="html5-qrcode-button-torch-off",t}(),ot=function(){function t(){}return t.createElement=function(t,e){var r=document.createElement(t);return r.id=e,r.classList.add(it.ALL_ELEMENT_CLASS),"button"===t&&r.setAttribute("type","button"),r},t}(),st=function(t,e,r,n){return new(r||(r=Promise))((function(i,o){function s(t){try{c(n.next(t))}catch(t){o(t)}}function a(t){try{c(n.throw(t))}catch(t){o(t)}}function c(t){var e;t.done?i(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(s,a)}c((n=n.apply(t,e||[])).next())}))},at=function(t,e){var r,n,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(a){return function(c){return function(a){if(r)throw new TypeError("Generator is already executing.");for(;o&&(o=0,a[0]&&(s=0)),s;)try{if(r=1,n&&(i=2&a[0]?n.return:a[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,a[1])).done)return i;switch(n=0,i&&(a=[2&a[0],i.value]),a[0]){case 0:case 1:i=a;break;case 4:return s.label++,{value:a[1],done:!1};case 5:s.label++,n=a[1],a=[0];continue;case 7:a=s.ops.pop(),s.trys.pop();continue;default:if(!((i=(i=s.trys).length>0&&i[i.length-1])||6!==a[0]&&2!==a[0])){s=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]<i[3])){s.label=a[1];break}if(6===a[0]&&s.label<i[1]){s.label=i[1],i=a;break}if(i&&s.label<i[2]){s.label=i[2],s.ops.push(a);break}i[2]&&s.ops.pop(),s.trys.pop();continue}a=e.call(t,s)}catch(t){a=[6,t],n=0}finally{r=i=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,c])}}},ct=function(){function t(t,e,r){this.isTorchOn=!1,this.torchCapability=t,this.buttonController=e,this.onTorchActionFailureCallback=r}return t.prototype.isTorchEnabled=function(){return this.isTorchOn},t.prototype.flipState=function(){return st(this,void 0,void 0,(function(){var t,e;return at(this,(function(r){switch(r.label){case 0:this.buttonController.disable(),t=!this.isTorchOn,r.label=1;case 1:return r.trys.push([1,3,,4]),[4,this.torchCapability.apply(t)];case 2:return r.sent(),this.updateUiBasedOnLatestSettings(this.torchCapability.value(),t),[3,4];case 3:return e=r.sent(),this.propagateFailure(t,e),this.buttonController.enable(),[3,4];case 4:return[2]}}))}))},t.prototype.updateUiBasedOnLatestSettings=function(t,e){t===e?(this.buttonController.setText(e?p.torchOffButton():p.torchOnButton()),this.isTorchOn=e):this.propagateFailure(e),this.buttonController.enable()},t.prototype.propagateFailure=function(t,e){var r=t?p.torchOnFailedMessage():p.torchOffFailedMessage();e&&(r+="; Error = "+e),this.onTorchActionFailureCallback(r)},t.prototype.reset=function(){this.isTorchOn=!1},t}(),lt=function(){function t(t,e){this.onTorchActionFailureCallback=e,this.torchButton=ot.createElement("button",it.TORCH_BUTTON_ID),this.torchController=new ct(t,this,e)}return t.prototype.render=function(t,e){var r=this;this.torchButton.innerText=p.torchOnButton(),this.torchButton.style.display=e.display,this.torchButton.style.marginLeft=e.marginLeft;var n=this;this.torchButton.addEventListener("click",(function(t){return st(r,void 0,void 0,(function(){return at(this,(function(t){switch(t.label){case 0:return[4,n.torchController.flipState()];case 1:return t.sent(),n.torchController.isTorchEnabled()?(n.torchButton.classList.remove(it.TORCH_BUTTON_CLASS_TORCH_OFF),n.torchButton.classList.add(it.TORCH_BUTTON_CLASS_TORCH_ON)):(n.torchButton.classList.remove(it.TORCH_BUTTON_CLASS_TORCH_ON),n.torchButton.classList.add(it.TORCH_BUTTON_CLASS_TORCH_OFF)),[2]}}))}))})),t.appendChild(this.torchButton)},t.prototype.updateTorchCapability=function(t){this.torchController=new ct(t,this,this.onTorchActionFailureCallback)},t.prototype.getTorchButton=function(){return this.torchButton},t.prototype.hide=function(){this.torchButton.style.display="none"},t.prototype.show=function(){this.torchButton.style.display="inline-block"},t.prototype.disable=function(){this.torchButton.disabled=!0},t.prototype.enable=function(){this.torchButton.disabled=!1},t.prototype.setText=function(t){this.torchButton.innerText=t},t.prototype.reset=function(){this.torchButton.innerText=p.torchOnButton(),this.torchController.reset()},t.create=function(e,r,n,i){var o=new t(r,i);return o.render(e,n),o},t}(),ht=function(){function t(t,e,r){this.fileBasedScanRegion=this.createFileBasedScanRegion(),this.fileBasedScanRegion.style.display=e?"block":"none",t.appendChild(this.fileBasedScanRegion);var n=document.createElement("label");n.setAttribute("for",this.getFileScanInputId()),n.style.display="inline-block",this.fileBasedScanRegion.appendChild(n),this.fileSelectionButton=ot.createElement("button",it.FILE_SELECTION_BUTTON_ID),this.setInitialValueToButton(),this.fileSelectionButton.addEventListener("click",(function(t){n.click()})),n.append(this.fileSelectionButton),this.fileScanInput=ot.createElement("input",this.getFileScanInputId()),this.fileScanInput.type="file",this.fileScanInput.accept="image/*",this.fileScanInput.style.display="none",n.appendChild(this.fileScanInput);var i=this;this.fileScanInput.addEventListener("change",(function(t){if(null!=t&&null!=t.target){var e=t.target;if(!e.files||0!==e.files.length){var n=e.files[0],o=n.name;i.setImageNameToButton(o),r(n)}}}));var o=this.createDragAndDropMessage();this.fileBasedScanRegion.appendChild(o),this.fileBasedScanRegion.addEventListener("dragenter",(function(t){i.fileBasedScanRegion.style.border=i.fileBasedScanRegionActiveBorder(),t.stopPropagation(),t.preventDefault()})),this.fileBasedScanRegion.addEventListener("dragleave",(function(t){i.fileBasedScanRegion.style.border=i.fileBasedScanRegionDefaultBorder(),t.stopPropagation(),t.preventDefault()})),this.fileBasedScanRegion.addEventListener("dragover",(function(t){i.fileBasedScanRegion.style.border=i.fileBasedScanRegionActiveBorder(),t.stopPropagation(),t.preventDefault()})),this.fileBasedScanRegion.addEventListener("drop",(function(t){t.stopPropagation(),t.preventDefault(),i.fileBasedScanRegion.style.border=i.fileBasedScanRegionDefaultBorder();var e=t.dataTransfer;if(e){var n=e.files;if(!n||0===n.length)return;for(var s=!1,a=0;a<n.length;++a){var c=n.item(a);if(c&&c.type.match(/image.*/)){s=!0;var l=c.name;i.setImageNameToButton(l),r(c),o.innerText=p.dragAndDropMessage();break}}s||(o.innerText=p.dragAndDropMessageOnlyImages())}}))}return t.prototype.hide=function(){this.fileBasedScanRegion.style.display="none",this.fileScanInput.disabled=!0},t.prototype.show=function(){this.fileBasedScanRegion.style.display="block",this.fileScanInput.disabled=!1},t.prototype.isShowing=function(){return"block"===this.fileBasedScanRegion.style.display},t.prototype.resetValue=function(){this.fileScanInput.value="",this.setInitialValueToButton()},t.prototype.createFileBasedScanRegion=function(){var t=document.createElement("div");return t.style.textAlign="center",t.style.margin="auto",t.style.width="80%",t.style.maxWidth="600px",t.style.border=this.fileBasedScanRegionDefaultBorder(),t.style.padding="10px",t.style.marginBottom="10px",t},t.prototype.fileBasedScanRegionDefaultBorder=function(){return"6px dashed #ebebeb"},t.prototype.fileBasedScanRegionActiveBorder=function(){return"6px dashed rgb(153 151 151)"},t.prototype.createDragAndDropMessage=function(){var t=document.createElement("div");return t.innerText=p.dragAndDropMessage(),t.style.fontWeight="400",t},t.prototype.setImageNameToButton=function(t){if(t.length>20){var e=t.substring(0,8),r=t.length,n=t.substring(r-8,r);t="".concat(e,"....").concat(n)}var i=p.fileSelectionChooseAnother()+" - "+t;this.fileSelectionButton.innerText=i},t.prototype.setInitialValueToButton=function(){var t=p.fileSelectionChooseImage()+" - "+p.fileSelectionNoImageSelected();this.fileSelectionButton.innerText=t},t.prototype.getFileScanInputId=function(){return"html5-qrcode-private-filescan-input"},t.create=function(e,r,n){return new t(e,r,n)},t}(),ut=function(){function t(t){this.selectElement=ot.createElement("select",it.CAMERA_SELECTION_SELECT_ID),this.cameras=t,this.options=[]}return t.prototype.render=function(t){var e=document.createElement("span");e.style.marginRight="10px";var r=this.cameras.length;if(0===r)throw new Error("No cameras found");if(1===r)e.style.display="none";else{var n=p.selectCamera();e.innerText="".concat(n," (").concat(this.cameras.length,")  ")}for(var i=1,o=0,s=this.cameras;o<s.length;o++){var a=s[o],c=a.id,l=null==a.label?c:a.label;l&&""!==l||(l=[p.anonymousCameraPrefix(),i++].join(" "));var h=document.createElement("option");h.value=c,h.innerText=l,this.options.push(h),this.selectElement.appendChild(h)}e.appendChild(this.selectElement),t.appendChild(e)},t.prototype.disable=function(){this.selectElement.disabled=!0},t.prototype.isDisabled=function(){return!0===this.selectElement.disabled},t.prototype.enable=function(){this.selectElement.disabled=!1},t.prototype.getValue=function(){return this.selectElement.value},t.prototype.hasValue=function(t){for(var e=0,r=this.options;e<r.length;e++)if(r[e].value===t)return!0;return!1},t.prototype.setValue=function(t){if(!this.hasValue(t))throw new Error("".concat(t," is not present in the camera list."));this.selectElement.value=t},t.prototype.hasSingleItem=function(){return 1===this.cameras.length},t.prototype.numCameras=function(){return this.cameras.length},t.create=function(e,r){var n=new t(r);return n.render(e),n},t}(),dt=function(){function t(){this.onChangeCallback=null,this.zoomElementContainer=document.createElement("div"),this.rangeInput=ot.createElement("input",it.ZOOM_SLIDER_ID),this.rangeInput.type="range",this.rangeText=document.createElement("span"),this.rangeInput.min="1",this.rangeInput.max="5",this.rangeInput.value="1",this.rangeInput.step="0.1"}return t.prototype.render=function(t,e){this.zoomElementContainer.style.display=e?"block":"none",this.zoomElementContainer.style.padding="5px 10px",this.zoomElementContainer.style.textAlign="center",t.appendChild(this.zoomElementContainer),this.rangeInput.style.display="inline-block",this.rangeInput.style.width="50%",this.rangeInput.style.height="5px",this.rangeInput.style.background="#d3d3d3",this.rangeInput.style.outline="none",this.rangeInput.style.opacity="0.7";var r=p.zoom();this.rangeText.innerText="".concat(this.rangeInput.value,"x ").concat(r),this.rangeText.style.marginRight="10px";var n=this;this.rangeInput.addEventListener("input",(function(){return n.onValueChange()})),this.rangeInput.addEventListener("change",(function(){return n.onValueChange()})),this.zoomElementContainer.appendChild(this.rangeInput),this.zoomElementContainer.appendChild(this.rangeText)},t.prototype.onValueChange=function(){var t=p.zoom();this.rangeText.innerText="".concat(this.rangeInput.value,"x ").concat(t),this.onChangeCallback&&this.onChangeCallback(parseFloat(this.rangeInput.value))},t.prototype.setValues=function(t,e,r,n){this.rangeInput.min=t.toString(),this.rangeInput.max=e.toString(),this.rangeInput.step=n.toString(),this.rangeInput.value=r.toString(),this.onValueChange()},t.prototype.show=function(){this.zoomElementContainer.style.display="block"},t.prototype.hide=function(){this.zoomElementContainer.style.display="none"},t.prototype.setOnCameraZoomValueChangeCallback=function(t){this.onChangeCallback=t},t.prototype.removeOnCameraZoomValueChangeCallback=function(){this.onChangeCallback=null},t.create=function(e,r){var n=new t;return n.render(e,r),n},t}();!function(t){t[t.STATUS_DEFAULT=0]="STATUS_DEFAULT",t[t.STATUS_SUCCESS=1]="STATUS_SUCCESS",t[t.STATUS_WARNING=2]="STATUS_WARNING",t[t.STATUS_REQUESTING_PERMISSION=3]="STATUS_REQUESTING_PERMISSION"}(U||(U={}));var ft=function(){function t(t,e,r){if(this.lastMatchFound=null,this.cameraScanImage=null,this.fileScanImage=null,this.fileSelectionUi=null,this.elementId=t,this.config=this.createConfig(e),this.verbose=!0===r,!document.getElementById(t))throw"HTML Element with id=".concat(t," not found");this.scanTypeSelector=new nt(this.config.supportedScanTypes),this.currentScanType=this.scanTypeSelector.getDefaultScanType(),this.sectionSwapAllowed=!0,this.logger=new d(this.verbose),this.persistedDataManager=new J,!0!==e.rememberLastUsedCamera&&this.persistedDataManager.reset()}return t.prototype.render=function(t,e){var r=this;this.lastMatchFound=null,this.qrCodeSuccessCallback=function(e,n){if(t)t(e,n);else{if(r.lastMatchFound===e)return;r.lastMatchFound=e,r.setHeaderMessage(p.lastMatch(e),U.STATUS_SUCCESS)}},this.qrCodeErrorCallback=function(t,r){e&&e(t,r)};var n,i,o=document.getElementById(this.elementId);if(!o)throw"HTML Element with id=".concat(this.elementId," not found");o.innerHTML="",this.createBasicLayout(o),this.html5Qrcode=new W(this.getScanRegionId(),(n=this.config,i=this.verbose,{formatsToSupport:n.formatsToSupport,useBarCodeDetectorIfSupported:n.useBarCodeDetectorIfSupported,experimentalFeatures:n.experimentalFeatures,verbose:i}))},t.prototype.pause=function(t){(f(t)||!0!==t)&&(t=!1),this.getHtml5QrcodeOrFail().pause(t)},t.prototype.resume=function(){this.getHtml5QrcodeOrFail().resume()},t.prototype.getState=function(){return this.getHtml5QrcodeOrFail().getState()},t.prototype.clear=function(){var t=this,e=function(){var e=document.getElementById(t.elementId);e&&(e.innerHTML="",t.resetBasicLayout(e))};return this.html5Qrcode?new Promise((function(r,n){t.html5Qrcode?t.html5Qrcode.isScanning?t.html5Qrcode.stop().then((function(n){t.html5Qrcode?(t.html5Qrcode.clear(),e(),r()):r()})).catch((function(e){t.verbose&&t.logger.logError("Unable to stop qrcode scanner",e),n(e)})):(t.html5Qrcode.clear(),e(),r()):r()})):Promise.resolve()},t.prototype.getRunningTrackCapabilities=function(){return this.getHtml5QrcodeOrFail().getRunningTrackCapabilities()},t.prototype.getRunningTrackSettings=function(){return this.getHtml5QrcodeOrFail().getRunningTrackSettings()},t.prototype.applyVideoConstraints=function(t){return this.getHtml5QrcodeOrFail().applyVideoConstraints(t)},t.prototype.getHtml5QrcodeOrFail=function(){if(!this.html5Qrcode)throw"Code scanner not initialized.";return this.html5Qrcode},t.prototype.createConfig=function(t){return t?(t.fps||(t.fps=c.SCAN_DEFAULT_FPS),t.rememberLastUsedCamera!==!c.DEFAULT_REMEMBER_LAST_CAMERA_USED&&(t.rememberLastUsedCamera=c.DEFAULT_REMEMBER_LAST_CAMERA_USED),t.supportedScanTypes||(t.supportedScanTypes=c.DEFAULT_SUPPORTED_SCAN_TYPE),t):{fps:c.SCAN_DEFAULT_FPS,rememberLastUsedCamera:c.DEFAULT_REMEMBER_LAST_CAMERA_USED,supportedScanTypes:c.DEFAULT_SUPPORTED_SCAN_TYPE}},t.prototype.createBasicLayout=function(t){t.style.position="relative",t.style.padding="0px",t.style.border="1px solid silver",this.createHeader(t);var e=document.createElement("div"),r=this.getScanRegionId();e.id=r,e.style.width="100%",e.style.minHeight="100px",e.style.textAlign="center",t.appendChild(e),nt.isCameraScanType(this.currentScanType)?this.insertCameraScanImageToScanRegion():this.insertFileScanImageToScanRegion();var n=document.createElement("div"),i=this.getDashboardId();n.id=i,n.style.width="100%",t.appendChild(n),this.setupInitialDashboard(n)},t.prototype.resetBasicLayout=function(t){t.style.border="none"},t.prototype.setupInitialDashboard=function(t){this.createSection(t),this.createSectionControlPanel(),this.scanTypeSelector.hasMoreThanOneScanType()&&this.createSectionSwap()},t.prototype.createHeader=function(t){var e=document.createElement("div");e.style.textAlign="left",e.style.margin="0px",t.appendChild(e),(new et).renderInto(e);var r=document.createElement("div");r.id=this.getHeaderMessageContainerId(),r.style.display="none",r.style.textAlign="center",r.style.fontSize="14px",r.style.padding="2px 10px",r.style.margin="4px",r.style.borderTop="1px solid #f6f6f6",e.appendChild(r)},t.prototype.createSection=function(t){var e=document.createElement("div");e.id=this.getDashboardSectionId(),e.style.width="100%",e.style.padding="10px 0px 10px 0px",e.style.textAlign="left",t.appendChild(e)},t.prototype.createCameraListUi=function(t,e,r){var n=this;n.showHideScanTypeSwapLink(!1),n.setHeaderMessage(p.cameraPermissionRequesting());var i=function(){r||n.createPermissionButton(t,e)};W.getCameras().then((function(r){n.persistedDataManager.setHasPermission(!0),n.showHideScanTypeSwapLink(!0),n.resetHeaderMessage(),r&&r.length>0?(t.removeChild(e),n.renderCameraSelection(r)):(n.setHeaderMessage(p.noCameraFound(),U.STATUS_WARNING),i())})).catch((function(t){n.persistedDataManager.setHasPermission(!1),r?r.disabled=!1:i(),n.setHeaderMessage(t,U.STATUS_WARNING),n.showHideScanTypeSwapLink(!0)}))},t.prototype.createPermissionButton=function(t,e){var r=this,n=ot.createElement("button",this.getCameraPermissionButtonId());n.innerText=p.cameraPermissionTitle(),n.addEventListener("click",(function(){n.disabled=!0,r.createCameraListUi(t,e,n)})),e.appendChild(n)},t.prototype.createPermissionsUi=function(t,e){var r=this;nt.isCameraScanType(this.currentScanType)&&this.persistedDataManager.hasCameraPermissions()?rt.hasPermissions().then((function(n){n?r.createCameraListUi(t,e):(r.persistedDataManager.setHasPermission(!1),r.createPermissionButton(t,e))})).catch((function(n){r.persistedDataManager.setHasPermission(!1),r.createPermissionButton(t,e)})):this.createPermissionButton(t,e)},t.prototype.createSectionControlPanel=function(){var t=document.getElementById(this.getDashboardSectionId()),e=document.createElement("div");t.appendChild(e);var r=document.createElement("div");r.id=this.getDashboardSectionCameraScanRegionId(),r.style.display=nt.isCameraScanType(this.currentScanType)?"block":"none",e.appendChild(r);var n=document.createElement("div");n.style.textAlign="center",r.appendChild(n),this.scanTypeSelector.isCameraScanRequired()&&this.createPermissionsUi(r,n),this.renderFileScanUi(e)},t.prototype.renderFileScanUi=function(t){var e=nt.isFileScanType(this.currentScanType),r=this;this.fileSelectionUi=ht.create(t,e,(function(t){if(!r.html5Qrcode)throw"html5Qrcode not defined";nt.isFileScanType(r.currentScanType)&&(r.setHeaderMessage(p.loadingImage()),r.html5Qrcode.scanFileV2(t,!0).then((function(t){r.resetHeaderMessage(),r.qrCodeSuccessCallback(t.decodedText,t)})).catch((function(t){r.setHeaderMessage(t,U.STATUS_WARNING),r.qrCodeErrorCallback(t,u.createFrom(t))})))}))},t.prototype.renderCameraSelection=function(t){var e=this,r=this,n=document.getElementById(this.getDashboardSectionCameraScanRegionId());n.style.textAlign="center";var i=dt.create(n,!1),o=ut.create(n,t),s=document.createElement("span"),a=ot.createElement("button",it.CAMERA_START_BUTTON_ID);a.innerText=p.scanButtonStartScanningText(),s.appendChild(a);var c,l=ot.createElement("button",it.CAMERA_STOP_BUTTON_ID);l.innerText=p.scanButtonStopScanningText(),l.style.display="none",l.disabled=!0,s.appendChild(l),n.appendChild(s);var h=function(t){t||(a.style.display="none"),a.innerText=p.scanButtonStartScanningText(),a.style.opacity="1",a.disabled=!1,t&&(a.style.display="inline-block")};if(a.addEventListener("click",(function(t){a.innerText=p.scanButtonScanningStarting(),o.disable(),a.disabled=!0,a.style.opacity="0.5",e.scanTypeSelector.hasMoreThanOneScanType()&&r.showHideScanTypeSwapLink(!1),r.resetHeaderMessage();var n,u=o.getValue();r.persistedDataManager.setLastUsedCameraId(u),r.html5Qrcode.start(u,(n=r.config,{fps:n.fps,qrbox:n.qrbox,aspectRatio:n.aspectRatio,disableFlip:n.disableFlip,videoConstraints:n.videoConstraints}),r.qrCodeSuccessCallback,r.qrCodeErrorCallback).then((function(t){l.disabled=!1,l.style.display="inline-block",h(!1);var n=r.html5Qrcode.getRunningTrackCameraCapabilities();!0===e.config.showTorchButtonIfSupported&&function(t){t.torchFeature().isSupported()?(c?c.updateTorchCapability(t.torchFeature()):c=lt.create(s,t.torchFeature(),{display:"none",marginLeft:"5px"},(function(t){r.setHeaderMessage(t,U.STATUS_WARNING)})),c.show()):c&&c.hide()}(n),!0===e.config.showZoomSliderIfSupported&&function(t){var r=t.zoomFeature();if(r.isSupported()){i.setOnCameraZoomValueChangeCallback((function(t){r.apply(t)}));var n,o,s,a=1;e.config.defaultZoomValueIfSupported&&(a=e.config.defaultZoomValueIfSupported),n=a,o=r.min(),a=n>(s=r.max())?s:n<o?o:n,i.setValues(r.min(),r.max(),a,r.step()),i.show()}}(n)})).catch((function(t){r.showHideScanTypeSwapLink(!0),o.enable(),h(!0),r.setHeaderMessage(t,U.STATUS_WARNING)}))})),o.hasSingleItem()&&a.click(),l.addEventListener("click",(function(t){if(!r.html5Qrcode)throw"html5Qrcode not defined";l.disabled=!0,r.html5Qrcode.stop().then((function(t){e.scanTypeSelector.hasMoreThanOneScanType()&&r.showHideScanTypeSwapLink(!0),o.enable(),a.disabled=!1,l.style.display="none",a.style.display="inline-block",c&&(c.reset(),c.hide()),i.removeOnCameraZoomValueChangeCallback(),i.hide(),r.insertCameraScanImageToScanRegion()})).catch((function(t){l.disabled=!1,r.setHeaderMessage(t,U.STATUS_WARNING)}))})),r.persistedDataManager.getLastUsedCameraId()){var u=r.persistedDataManager.getLastUsedCameraId();o.hasValue(u)?(o.setValue(u),a.click()):r.persistedDataManager.resetLastUsedCameraId()}},t.prototype.createSectionSwap=function(){var t=this,e=p.textIfCameraScanSelected(),r=p.textIfFileScanSelected(),n=document.getElementById(this.getDashboardSectionId()),o=document.createElement("div");o.style.textAlign="center";var s=ot.createElement("span",this.getDashboardSectionSwapLinkId());s.style.textDecoration="underline",s.style.cursor="pointer",s.innerText=nt.isCameraScanType(this.currentScanType)?e:r,s.addEventListener("click",(function(){t.sectionSwapAllowed?(t.resetHeaderMessage(),t.fileSelectionUi.resetValue(),t.sectionSwapAllowed=!1,nt.isCameraScanType(t.currentScanType)?(t.clearScanRegion(),t.getCameraScanRegion().style.display="none",t.fileSelectionUi.show(),s.innerText=r,t.currentScanType=i.SCAN_TYPE_FILE,t.insertFileScanImageToScanRegion()):(t.clearScanRegion(),t.getCameraScanRegion().style.display="block",t.fileSelectionUi.hide(),s.innerText=e,t.currentScanType=i.SCAN_TYPE_CAMERA,t.insertCameraScanImageToScanRegion(),t.startCameraScanIfPermissionExistsOnSwap()),t.sectionSwapAllowed=!0):t.verbose&&t.logger.logError("Section swap called when not allowed")})),o.appendChild(s),n.appendChild(o)},t.prototype.startCameraScanIfPermissionExistsOnSwap=function(){var t=this,e=this;this.persistedDataManager.hasCameraPermissions()&&rt.hasPermissions().then((function(r){if(r){var n=document.getElementById(e.getCameraPermissionButtonId());if(!n)throw t.logger.logError("Permission button not found, fail;"),"Permission button not found";n.click()}else e.persistedDataManager.setHasPermission(!1)})).catch((function(t){e.persistedDataManager.setHasPermission(!1)}))},t.prototype.resetHeaderMessage=function(){document.getElementById(this.getHeaderMessageContainerId()).style.display="none"},t.prototype.setHeaderMessage=function(t,e){e||(e=U.STATUS_DEFAULT);var r=this.getHeaderMessageDiv();switch(r.innerText=t,r.style.display="block",e){case U.STATUS_SUCCESS:r.style.background="rgba(106, 175, 80, 0.26)",r.style.color="#477735";break;case U.STATUS_WARNING:r.style.background="rgba(203, 36, 49, 0.14)",r.style.color="#cb2431";break;case U.STATUS_DEFAULT:default:r.style.background="rgba(0, 0, 0, 0)",r.style.color="rgb(17, 17, 17)"}},t.prototype.showHideScanTypeSwapLink=function(t){this.scanTypeSelector.hasMoreThanOneScanType()&&(!0!==t&&(t=!1),this.sectionSwapAllowed=t,this.getDashboardSectionSwapLink().style.display=t?"inline-block":"none")},t.prototype.insertCameraScanImageToScanRegion=function(){var t=this,e=document.getElementById(this.getScanRegionId());if(this.cameraScanImage)return e.innerHTML="<br>",void e.appendChild(this.cameraScanImage);this.cameraScanImage=new Image,this.cameraScanImage.onload=function(r){e.innerHTML="<br>",e.appendChild(t.cameraScanImage)},this.cameraScanImage.width=64,this.cameraScanImage.style.opacity="0.8",this.cameraScanImage.src=Z,this.cameraScanImage.alt=p.cameraScanAltText()},t.prototype.insertFileScanImageToScanRegion=function(){var t=this,e=document.getElementById(this.getScanRegionId());if(this.fileScanImage)return e.innerHTML="<br>",void e.appendChild(this.fileScanImage);this.fileScanImage=new Image,this.fileScanImage.onload=function(r){e.innerHTML="<br>",e.appendChild(t.fileScanImage)},this.fileScanImage.width=64,this.fileScanImage.style.opacity="0.8",this.fileScanImage.src=Q,this.fileScanImage.alt=p.fileScanAltText()},t.prototype.clearScanRegion=function(){document.getElementById(this.getScanRegionId()).innerHTML=""},t.prototype.getDashboardSectionId=function(){return"".concat(this.elementId,"__dashboard_section")},t.prototype.getDashboardSectionCameraScanRegionId=function(){return"".concat(this.elementId,"__dashboard_section_csr")},t.prototype.getDashboardSectionSwapLinkId=function(){return it.SCAN_TYPE_CHANGE_ANCHOR_ID},t.prototype.getScanRegionId=function(){return"".concat(this.elementId,"__scan_region")},t.prototype.getDashboardId=function(){return"".concat(this.elementId,"__dashboard")},t.prototype.getHeaderMessageContainerId=function(){return"".concat(this.elementId,"__header_message")},t.prototype.getCameraPermissionButtonId=function(){return it.CAMERA_PERMISSION_BUTTON_ID},t.prototype.getCameraScanRegion=function(){return document.getElementById(this.getDashboardSectionCameraScanRegionId())},t.prototype.getDashboardSectionSwapLink=function(){return document.getElementById(this.getDashboardSectionSwapLinkId())},t.prototype.getHeaderMessageDiv=function(){return document.getElementById(this.getHeaderMessageContainerId())},t}()})(),__Html5QrcodeLibrary__=n})();if (window) { if (!Html5QrcodeScanner) { var Html5QrcodeScanner = window.__Html5QrcodeLibrary__.Html5QrcodeScanner; } if (!Html5Qrcode) { var Html5Qrcode = window.__Html5QrcodeLibrary__.Html5Qrcode; } if (!Html5QrcodeSupportedFormats) { var Html5QrcodeSupportedFormats = window.__Html5QrcodeLibrary__.Html5QrcodeSupportedFormats } if (!Html5QrcodeScannerState) { var Html5QrcodeScannerState = window.__Html5QrcodeLibrary__.Html5QrcodeScannerState; } if (!Html5QrcodeScanType) { var Html5QrcodeScanType = window.__Html5QrcodeLibrary__.Html5QrcodeScanType; }}
Index: /mods/mod_ticket/assets/js/vue.esm-browser.js
===================================================================
--- /mods/mod_ticket/assets/js/vue.esm-browser.js	(revision 8427)
+++ /mods/mod_ticket/assets/js/vue.esm-browser.js	(revision 8427)
@@ -0,0 +1,15386 @@
+function makeMap(str, expectsLowerCase) {
+  const map = /* @__PURE__ */ Object.create(null);
+  const list = str.split(",");
+  for (let i = 0; i < list.length; i++) {
+    map[list[i]] = true;
+  }
+  return expectsLowerCase ? (val) => !!map[val.toLowerCase()] : (val) => !!map[val];
+}
+
+const EMPTY_OBJ = Object.freeze({}) ;
+const EMPTY_ARR = Object.freeze([]) ;
+const NOOP = () => {
+};
+const NO = () => false;
+const onRE = /^on[^a-z]/;
+const isOn = (key) => onRE.test(key);
+const isModelListener = (key) => key.startsWith("onUpdate:");
+const extend = Object.assign;
+const remove = (arr, el) => {
+  const i = arr.indexOf(el);
+  if (i > -1) {
+    arr.splice(i, 1);
+  }
+};
+const hasOwnProperty$1 = Object.prototype.hasOwnProperty;
+const hasOwn = (val, key) => hasOwnProperty$1.call(val, key);
+const isArray = Array.isArray;
+const isMap = (val) => toTypeString(val) === "[object Map]";
+const isSet = (val) => toTypeString(val) === "[object Set]";
+const isDate = (val) => toTypeString(val) === "[object Date]";
+const isRegExp = (val) => toTypeString(val) === "[object RegExp]";
+const isFunction = (val) => typeof val === "function";
+const isString = (val) => typeof val === "string";
+const isSymbol = (val) => typeof val === "symbol";
+const isObject = (val) => val !== null && typeof val === "object";
+const isPromise = (val) => {
+  return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);
+};
+const objectToString = Object.prototype.toString;
+const toTypeString = (value) => objectToString.call(value);
+const toRawType = (value) => {
+  return toTypeString(value).slice(8, -1);
+};
+const isPlainObject = (val) => toTypeString(val) === "[object Object]";
+const isIntegerKey = (key) => isString(key) && key !== "NaN" && key[0] !== "-" && "" + parseInt(key, 10) === key;
+const isReservedProp = /* @__PURE__ */ makeMap(
+  // the leading comma is intentional so empty string "" is also included
+  ",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"
+);
+const isBuiltInDirective = /* @__PURE__ */ makeMap(
+  "bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"
+);
+const cacheStringFunction = (fn) => {
+  const cache = /* @__PURE__ */ Object.create(null);
+  return (str) => {
+    const hit = cache[str];
+    return hit || (cache[str] = fn(str));
+  };
+};
+const camelizeRE = /-(\w)/g;
+const camelize = cacheStringFunction((str) => {
+  return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : "");
+});
+const hyphenateRE = /\B([A-Z])/g;
+const hyphenate = cacheStringFunction(
+  (str) => str.replace(hyphenateRE, "-$1").toLowerCase()
+);
+const capitalize = cacheStringFunction((str) => {
+  return str.charAt(0).toUpperCase() + str.slice(1);
+});
+const toHandlerKey = cacheStringFunction((str) => {
+  const s = str ? `on${capitalize(str)}` : ``;
+  return s;
+});
+const hasChanged = (value, oldValue) => !Object.is(value, oldValue);
+const invokeArrayFns = (fns, arg) => {
+  for (let i = 0; i < fns.length; i++) {
+    fns[i](arg);
+  }
+};
+const def = (obj, key, value) => {
+  Object.defineProperty(obj, key, {
+    configurable: true,
+    enumerable: false,
+    value
+  });
+};
+const looseToNumber = (val) => {
+  const n = parseFloat(val);
+  return isNaN(n) ? val : n;
+};
+const toNumber = (val) => {
+  const n = isString(val) ? Number(val) : NaN;
+  return isNaN(n) ? val : n;
+};
+let _globalThis;
+const getGlobalThis = () => {
+  return _globalThis || (_globalThis = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : {});
+};
+
+const PatchFlagNames = {
+  [1]: `TEXT`,
+  [2]: `CLASS`,
+  [4]: `STYLE`,
+  [8]: `PROPS`,
+  [16]: `FULL_PROPS`,
+  [32]: `HYDRATE_EVENTS`,
+  [64]: `STABLE_FRAGMENT`,
+  [128]: `KEYED_FRAGMENT`,
+  [256]: `UNKEYED_FRAGMENT`,
+  [512]: `NEED_PATCH`,
+  [1024]: `DYNAMIC_SLOTS`,
+  [2048]: `DEV_ROOT_FRAGMENT`,
+  [-1]: `HOISTED`,
+  [-2]: `BAIL`
+};
+
+const slotFlagsText = {
+  [1]: "STABLE",
+  [2]: "DYNAMIC",
+  [3]: "FORWARDED"
+};
+
+const GLOBALS_ALLOWED = "Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console";
+const isGloballyAllowed = /* @__PURE__ */ makeMap(GLOBALS_ALLOWED);
+
+const range = 2;
+function generateCodeFrame(source, start = 0, end = source.length) {
+  let lines = source.split(/(\r?\n)/);
+  const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);
+  lines = lines.filter((_, idx) => idx % 2 === 0);
+  let count = 0;
+  const res = [];
+  for (let i = 0; i < lines.length; i++) {
+    count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0);
+    if (count >= start) {
+      for (let j = i - range; j <= i + range || end > count; j++) {
+        if (j < 0 || j >= lines.length)
+          continue;
+        const line = j + 1;
+        res.push(
+          `${line}${" ".repeat(Math.max(3 - String(line).length, 0))}|  ${lines[j]}`
+        );
+        const lineLength = lines[j].length;
+        const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0;
+        if (j === i) {
+          const pad = start - (count - (lineLength + newLineSeqLength));
+          const length = Math.max(
+            1,
+            end > count ? lineLength - pad : end - start
+          );
+          res.push(`   |  ` + " ".repeat(pad) + "^".repeat(length));
+        } else if (j > i) {
+          if (end > count) {
+            const length = Math.max(Math.min(end - count, lineLength), 1);
+            res.push(`   |  ` + "^".repeat(length));
+          }
+          count += lineLength + newLineSeqLength;
+        }
+      }
+      break;
+    }
+  }
+  return res.join("\n");
+}
+
+function normalizeStyle(value) {
+  if (isArray(value)) {
+    const res = {};
+    for (let i = 0; i < value.length; i++) {
+      const item = value[i];
+      const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);
+      if (normalized) {
+        for (const key in normalized) {
+          res[key] = normalized[key];
+        }
+      }
+    }
+    return res;
+  } else if (isString(value) || isObject(value)) {
+    return value;
+  }
+}
+const listDelimiterRE = /;(?![^(]*\))/g;
+const propertyDelimiterRE = /:([^]+)/;
+const styleCommentRE = /\/\*[^]*?\*\//g;
+function parseStringStyle(cssText) {
+  const ret = {};
+  cssText.replace(styleCommentRE, "").split(listDelimiterRE).forEach((item) => {
+    if (item) {
+      const tmp = item.split(propertyDelimiterRE);
+      tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());
+    }
+  });
+  return ret;
+}
+function normalizeClass(value) {
+  let res = "";
+  if (isString(value)) {
+    res = value;
+  } else if (isArray(value)) {
+    for (let i = 0; i < value.length; i++) {
+      const normalized = normalizeClass(value[i]);
+      if (normalized) {
+        res += normalized + " ";
+      }
+    }
+  } else if (isObject(value)) {
+    for (const name in value) {
+      if (value[name]) {
+        res += name + " ";
+      }
+    }
+  }
+  return res.trim();
+}
+function normalizeProps(props) {
+  if (!props)
+    return null;
+  let { class: klass, style } = props;
+  if (klass && !isString(klass)) {
+    props.class = normalizeClass(klass);
+  }
+  if (style) {
+    props.style = normalizeStyle(style);
+  }
+  return props;
+}
+
+const HTML_TAGS = "html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot";
+const SVG_TAGS = "svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view";
+const VOID_TAGS = "area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr";
+const isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);
+const isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS);
+const isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS);
+
+const specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;
+const isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs);
+function includeBooleanAttr(value) {
+  return !!value || value === "";
+}
+
+function looseCompareArrays(a, b) {
+  if (a.length !== b.length)
+    return false;
+  let equal = true;
+  for (let i = 0; equal && i < a.length; i++) {
+    equal = looseEqual(a[i], b[i]);
+  }
+  return equal;
+}
+function looseEqual(a, b) {
+  if (a === b)
+    return true;
+  let aValidType = isDate(a);
+  let bValidType = isDate(b);
+  if (aValidType || bValidType) {
+    return aValidType && bValidType ? a.getTime() === b.getTime() : false;
+  }
+  aValidType = isSymbol(a);
+  bValidType = isSymbol(b);
+  if (aValidType || bValidType) {
+    return a === b;
+  }
+  aValidType = isArray(a);
+  bValidType = isArray(b);
+  if (aValidType || bValidType) {
+    return aValidType && bValidType ? looseCompareArrays(a, b) : false;
+  }
+  aValidType = isObject(a);
+  bValidType = isObject(b);
+  if (aValidType || bValidType) {
+    if (!aValidType || !bValidType) {
+      return false;
+    }
+    const aKeysCount = Object.keys(a).length;
+    const bKeysCount = Object.keys(b).length;
+    if (aKeysCount !== bKeysCount) {
+      return false;
+    }
+    for (const key in a) {
+      const aHasKey = a.hasOwnProperty(key);
+      const bHasKey = b.hasOwnProperty(key);
+      if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {
+        return false;
+      }
+    }
+  }
+  return String(a) === String(b);
+}
+function looseIndexOf(arr, val) {
+  return arr.findIndex((item) => looseEqual(item, val));
+}
+
+const toDisplayString = (val) => {
+  return isString(val) ? val : val == null ? "" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? JSON.stringify(val, replacer, 2) : String(val);
+};
+const replacer = (_key, val) => {
+  if (val && val.__v_isRef) {
+    return replacer(_key, val.value);
+  } else if (isMap(val)) {
+    return {
+      [`Map(${val.size})`]: [...val.entries()].reduce((entries, [key, val2]) => {
+        entries[`${key} =>`] = val2;
+        return entries;
+      }, {})
+    };
+  } else if (isSet(val)) {
+    return {
+      [`Set(${val.size})`]: [...val.values()]
+    };
+  } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {
+    return String(val);
+  }
+  return val;
+};
+
+function warn$1(msg, ...args) {
+  console.warn(`[Vue warn] ${msg}`, ...args);
+}
+
+let activeEffectScope;
+class EffectScope {
+  constructor(detached = false) {
+    this.detached = detached;
+    /**
+     * @internal
+     */
+    this._active = true;
+    /**
+     * @internal
+     */
+    this.effects = [];
+    /**
+     * @internal
+     */
+    this.cleanups = [];
+    this.parent = activeEffectScope;
+    if (!detached && activeEffectScope) {
+      this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(
+        this
+      ) - 1;
+    }
+  }
+  get active() {
+    return this._active;
+  }
+  run(fn) {
+    if (this._active) {
+      const currentEffectScope = activeEffectScope;
+      try {
+        activeEffectScope = this;
+        return fn();
+      } finally {
+        activeEffectScope = currentEffectScope;
+      }
+    } else {
+      warn$1(`cannot run an inactive effect scope.`);
+    }
+  }
+  /**
+   * This should only be called on non-detached scopes
+   * @internal
+   */
+  on() {
+    activeEffectScope = this;
+  }
+  /**
+   * This should only be called on non-detached scopes
+   * @internal
+   */
+  off() {
+    activeEffectScope = this.parent;
+  }
+  stop(fromParent) {
+    if (this._active) {
+      let i, l;
+      for (i = 0, l = this.effects.length; i < l; i++) {
+        this.effects[i].stop();
+      }
+      for (i = 0, l = this.cleanups.length; i < l; i++) {
+        this.cleanups[i]();
+      }
+      if (this.scopes) {
+        for (i = 0, l = this.scopes.length; i < l; i++) {
+          this.scopes[i].stop(true);
+        }
+      }
+      if (!this.detached && this.parent && !fromParent) {
+        const last = this.parent.scopes.pop();
+        if (last && last !== this) {
+          this.parent.scopes[this.index] = last;
+          last.index = this.index;
+        }
+      }
+      this.parent = void 0;
+      this._active = false;
+    }
+  }
+}
+function effectScope(detached) {
+  return new EffectScope(detached);
+}
+function recordEffectScope(effect, scope = activeEffectScope) {
+  if (scope && scope.active) {
+    scope.effects.push(effect);
+  }
+}
+function getCurrentScope() {
+  return activeEffectScope;
+}
+function onScopeDispose(fn) {
+  if (activeEffectScope) {
+    activeEffectScope.cleanups.push(fn);
+  } else {
+    warn$1(
+      `onScopeDispose() is called when there is no active effect scope to be associated with.`
+    );
+  }
+}
+
+const createDep = (effects) => {
+  const dep = new Set(effects);
+  dep.w = 0;
+  dep.n = 0;
+  return dep;
+};
+const wasTracked = (dep) => (dep.w & trackOpBit) > 0;
+const newTracked = (dep) => (dep.n & trackOpBit) > 0;
+const initDepMarkers = ({ deps }) => {
+  if (deps.length) {
+    for (let i = 0; i < deps.length; i++) {
+      deps[i].w |= trackOpBit;
+    }
+  }
+};
+const finalizeDepMarkers = (effect) => {
+  const { deps } = effect;
+  if (deps.length) {
+    let ptr = 0;
+    for (let i = 0; i < deps.length; i++) {
+      const dep = deps[i];
+      if (wasTracked(dep) && !newTracked(dep)) {
+        dep.delete(effect);
+      } else {
+        deps[ptr++] = dep;
+      }
+      dep.w &= ~trackOpBit;
+      dep.n &= ~trackOpBit;
+    }
+    deps.length = ptr;
+  }
+};
+
+const targetMap = /* @__PURE__ */ new WeakMap();
+let effectTrackDepth = 0;
+let trackOpBit = 1;
+const maxMarkerBits = 30;
+let activeEffect;
+const ITERATE_KEY = Symbol("iterate" );
+const MAP_KEY_ITERATE_KEY = Symbol("Map key iterate" );
+class ReactiveEffect {
+  constructor(fn, scheduler = null, scope) {
+    this.fn = fn;
+    this.scheduler = scheduler;
+    this.active = true;
+    this.deps = [];
+    this.parent = void 0;
+    recordEffectScope(this, scope);
+  }
+  run() {
+    if (!this.active) {
+      return this.fn();
+    }
+    let parent = activeEffect;
+    let lastShouldTrack = shouldTrack;
+    while (parent) {
+      if (parent === this) {
+        return;
+      }
+      parent = parent.parent;
+    }
+    try {
+      this.parent = activeEffect;
+      activeEffect = this;
+      shouldTrack = true;
+      trackOpBit = 1 << ++effectTrackDepth;
+      if (effectTrackDepth <= maxMarkerBits) {
+        initDepMarkers(this);
+      } else {
+        cleanupEffect(this);
+      }
+      return this.fn();
+    } finally {
+      if (effectTrackDepth <= maxMarkerBits) {
+        finalizeDepMarkers(this);
+      }
+      trackOpBit = 1 << --effectTrackDepth;
+      activeEffect = this.parent;
+      shouldTrack = lastShouldTrack;
+      this.parent = void 0;
+      if (this.deferStop) {
+        this.stop();
+      }
+    }
+  }
+  stop() {
+    if (activeEffect === this) {
+      this.deferStop = true;
+    } else if (this.active) {
+      cleanupEffect(this);
+      if (this.onStop) {
+        this.onStop();
+      }
+      this.active = false;
+    }
+  }
+}
+function cleanupEffect(effect2) {
+  const { deps } = effect2;
+  if (deps.length) {
+    for (let i = 0; i < deps.length; i++) {
+      deps[i].delete(effect2);
+    }
+    deps.length = 0;
+  }
+}
+function effect(fn, options) {
+  if (fn.effect instanceof ReactiveEffect) {
+    fn = fn.effect.fn;
+  }
+  const _effect = new ReactiveEffect(fn);
+  if (options) {
+    extend(_effect, options);
+    if (options.scope)
+      recordEffectScope(_effect, options.scope);
+  }
+  if (!options || !options.lazy) {
+    _effect.run();
+  }
+  const runner = _effect.run.bind(_effect);
+  runner.effect = _effect;
+  return runner;
+}
+function stop(runner) {
+  runner.effect.stop();
+}
+let shouldTrack = true;
+const trackStack = [];
+function pauseTracking() {
+  trackStack.push(shouldTrack);
+  shouldTrack = false;
+}
+function resetTracking() {
+  const last = trackStack.pop();
+  shouldTrack = last === void 0 ? true : last;
+}
+function track(target, type, key) {
+  if (shouldTrack && activeEffect) {
+    let depsMap = targetMap.get(target);
+    if (!depsMap) {
+      targetMap.set(target, depsMap = /* @__PURE__ */ new Map());
+    }
+    let dep = depsMap.get(key);
+    if (!dep) {
+      depsMap.set(key, dep = createDep());
+    }
+    const eventInfo = { effect: activeEffect, target, type, key } ;
+    trackEffects(dep, eventInfo);
+  }
+}
+function trackEffects(dep, debuggerEventExtraInfo) {
+  let shouldTrack2 = false;
+  if (effectTrackDepth <= maxMarkerBits) {
+    if (!newTracked(dep)) {
+      dep.n |= trackOpBit;
+      shouldTrack2 = !wasTracked(dep);
+    }
+  } else {
+    shouldTrack2 = !dep.has(activeEffect);
+  }
+  if (shouldTrack2) {
+    dep.add(activeEffect);
+    activeEffect.deps.push(dep);
+    if (activeEffect.onTrack) {
+      activeEffect.onTrack(
+        extend(
+          {
+            effect: activeEffect
+          },
+          debuggerEventExtraInfo
+        )
+      );
+    }
+  }
+}
+function trigger(target, type, key, newValue, oldValue, oldTarget) {
+  const depsMap = targetMap.get(target);
+  if (!depsMap) {
+    return;
+  }
+  let deps = [];
+  if (type === "clear") {
+    deps = [...depsMap.values()];
+  } else if (key === "length" && isArray(target)) {
+    const newLength = Number(newValue);
+    depsMap.forEach((dep, key2) => {
+      if (key2 === "length" || key2 >= newLength) {
+        deps.push(dep);
+      }
+    });
+  } else {
+    if (key !== void 0) {
+      deps.push(depsMap.get(key));
+    }
+    switch (type) {
+      case "add":
+        if (!isArray(target)) {
+          deps.push(depsMap.get(ITERATE_KEY));
+          if (isMap(target)) {
+            deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));
+          }
+        } else if (isIntegerKey(key)) {
+          deps.push(depsMap.get("length"));
+        }
+        break;
+      case "delete":
+        if (!isArray(target)) {
+          deps.push(depsMap.get(ITERATE_KEY));
+          if (isMap(target)) {
+            deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));
+          }
+        }
+        break;
+      case "set":
+        if (isMap(target)) {
+          deps.push(depsMap.get(ITERATE_KEY));
+        }
+        break;
+    }
+  }
+  const eventInfo = { target, type, key, newValue, oldValue, oldTarget } ;
+  if (deps.length === 1) {
+    if (deps[0]) {
+      {
+        triggerEffects(deps[0], eventInfo);
+      }
+    }
+  } else {
+    const effects = [];
+    for (const dep of deps) {
+      if (dep) {
+        effects.push(...dep);
+      }
+    }
+    {
+      triggerEffects(createDep(effects), eventInfo);
+    }
+  }
+}
+function triggerEffects(dep, debuggerEventExtraInfo) {
+  const effects = isArray(dep) ? dep : [...dep];
+  for (const effect2 of effects) {
+    if (effect2.computed) {
+      triggerEffect(effect2, debuggerEventExtraInfo);
+    }
+  }
+  for (const effect2 of effects) {
+    if (!effect2.computed) {
+      triggerEffect(effect2, debuggerEventExtraInfo);
+    }
+  }
+}
+function triggerEffect(effect2, debuggerEventExtraInfo) {
+  if (effect2 !== activeEffect || effect2.allowRecurse) {
+    if (effect2.onTrigger) {
+      effect2.onTrigger(extend({ effect: effect2 }, debuggerEventExtraInfo));
+    }
+    if (effect2.scheduler) {
+      effect2.scheduler();
+    } else {
+      effect2.run();
+    }
+  }
+}
+function getDepFromReactive(object, key) {
+  var _a;
+  return (_a = targetMap.get(object)) == null ? void 0 : _a.get(key);
+}
+
+const isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);
+const builtInSymbols = new Set(
+  /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== "arguments" && key !== "caller").map((key) => Symbol[key]).filter(isSymbol)
+);
+const arrayInstrumentations = /* @__PURE__ */ createArrayInstrumentations();
+function createArrayInstrumentations() {
+  const instrumentations = {};
+  ["includes", "indexOf", "lastIndexOf"].forEach((key) => {
+    instrumentations[key] = function(...args) {
+      const arr = toRaw(this);
+      for (let i = 0, l = this.length; i < l; i++) {
+        track(arr, "get", i + "");
+      }
+      const res = arr[key](...args);
+      if (res === -1 || res === false) {
+        return arr[key](...args.map(toRaw));
+      } else {
+        return res;
+      }
+    };
+  });
+  ["push", "pop", "shift", "unshift", "splice"].forEach((key) => {
+    instrumentations[key] = function(...args) {
+      pauseTracking();
+      const res = toRaw(this)[key].apply(this, args);
+      resetTracking();
+      return res;
+    };
+  });
+  return instrumentations;
+}
+function hasOwnProperty(key) {
+  const obj = toRaw(this);
+  track(obj, "has", key);
+  return obj.hasOwnProperty(key);
+}
+class BaseReactiveHandler {
+  constructor(_isReadonly = false, _shallow = false) {
+    this._isReadonly = _isReadonly;
+    this._shallow = _shallow;
+  }
+  get(target, key, receiver) {
+    const isReadonly2 = this._isReadonly, shallow = this._shallow;
+    if (key === "__v_isReactive") {
+      return !isReadonly2;
+    } else if (key === "__v_isReadonly") {
+      return isReadonly2;
+    } else if (key === "__v_isShallow") {
+      return shallow;
+    } else if (key === "__v_raw" && receiver === (isReadonly2 ? shallow ? shallowReadonlyMap : readonlyMap : shallow ? shallowReactiveMap : reactiveMap).get(target)) {
+      return target;
+    }
+    const targetIsArray = isArray(target);
+    if (!isReadonly2) {
+      if (targetIsArray && hasOwn(arrayInstrumentations, key)) {
+        return Reflect.get(arrayInstrumentations, key, receiver);
+      }
+      if (key === "hasOwnProperty") {
+        return hasOwnProperty;
+      }
+    }
+    const res = Reflect.get(target, key, receiver);
+    if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {
+      return res;
+    }
+    if (!isReadonly2) {
+      track(target, "get", key);
+    }
+    if (shallow) {
+      return res;
+    }
+    if (isRef(res)) {
+      return targetIsArray && isIntegerKey(key) ? res : res.value;
+    }
+    if (isObject(res)) {
+      return isReadonly2 ? readonly(res) : reactive(res);
+    }
+    return res;
+  }
+}
+class MutableReactiveHandler extends BaseReactiveHandler {
+  constructor(shallow = false) {
+    super(false, shallow);
+  }
+  set(target, key, value, receiver) {
+    let oldValue = target[key];
+    if (isReadonly(oldValue) && isRef(oldValue) && !isRef(value)) {
+      return false;
+    }
+    if (!this._shallow) {
+      if (!isShallow(value) && !isReadonly(value)) {
+        oldValue = toRaw(oldValue);
+        value = toRaw(value);
+      }
+      if (!isArray(target) && isRef(oldValue) && !isRef(value)) {
+        oldValue.value = value;
+        return true;
+      }
+    }
+    const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key);
+    const result = Reflect.set(target, key, value, receiver);
+    if (target === toRaw(receiver)) {
+      if (!hadKey) {
+        trigger(target, "add", key, value);
+      } else if (hasChanged(value, oldValue)) {
+        trigger(target, "set", key, value, oldValue);
+      }
+    }
+    return result;
+  }
+  deleteProperty(target, key) {
+    const hadKey = hasOwn(target, key);
+    const oldValue = target[key];
+    const result = Reflect.deleteProperty(target, key);
+    if (result && hadKey) {
+      trigger(target, "delete", key, void 0, oldValue);
+    }
+    return result;
+  }
+  has(target, key) {
+    const result = Reflect.has(target, key);
+    if (!isSymbol(key) || !builtInSymbols.has(key)) {
+      track(target, "has", key);
+    }
+    return result;
+  }
+  ownKeys(target) {
+    track(
+      target,
+      "iterate",
+      isArray(target) ? "length" : ITERATE_KEY
+    );
+    return Reflect.ownKeys(target);
+  }
+}
+class ReadonlyReactiveHandler extends BaseReactiveHandler {
+  constructor(shallow = false) {
+    super(true, shallow);
+  }
+  set(target, key) {
+    {
+      warn$1(
+        `Set operation on key "${String(key)}" failed: target is readonly.`,
+        target
+      );
+    }
+    return true;
+  }
+  deleteProperty(target, key) {
+    {
+      warn$1(
+        `Delete operation on key "${String(key)}" failed: target is readonly.`,
+        target
+      );
+    }
+    return true;
+  }
+}
+const mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler();
+const readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler();
+const shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler(
+  true
+);
+const shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true);
+
+const toShallow = (value) => value;
+const getProto = (v) => Reflect.getPrototypeOf(v);
+function get(target, key, isReadonly = false, isShallow = false) {
+  target = target["__v_raw"];
+  const rawTarget = toRaw(target);
+  const rawKey = toRaw(key);
+  if (!isReadonly) {
+    if (hasChanged(key, rawKey)) {
+      track(rawTarget, "get", key);
+    }
+    track(rawTarget, "get", rawKey);
+  }
+  const { has: has2 } = getProto(rawTarget);
+  const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
+  if (has2.call(rawTarget, key)) {
+    return wrap(target.get(key));
+  } else if (has2.call(rawTarget, rawKey)) {
+    return wrap(target.get(rawKey));
+  } else if (target !== rawTarget) {
+    target.get(key);
+  }
+}
+function has(key, isReadonly = false) {
+  const target = this["__v_raw"];
+  const rawTarget = toRaw(target);
+  const rawKey = toRaw(key);
+  if (!isReadonly) {
+    if (hasChanged(key, rawKey)) {
+      track(rawTarget, "has", key);
+    }
+    track(rawTarget, "has", rawKey);
+  }
+  return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);
+}
+function size(target, isReadonly = false) {
+  target = target["__v_raw"];
+  !isReadonly && track(toRaw(target), "iterate", ITERATE_KEY);
+  return Reflect.get(target, "size", target);
+}
+function add(value) {
+  value = toRaw(value);
+  const target = toRaw(this);
+  const proto = getProto(target);
+  const hadKey = proto.has.call(target, value);
+  if (!hadKey) {
+    target.add(value);
+    trigger(target, "add", value, value);
+  }
+  return this;
+}
+function set(key, value) {
+  value = toRaw(value);
+  const target = toRaw(this);
+  const { has: has2, get: get2 } = getProto(target);
+  let hadKey = has2.call(target, key);
+  if (!hadKey) {
+    key = toRaw(key);
+    hadKey = has2.call(target, key);
+  } else {
+    checkIdentityKeys(target, has2, key);
+  }
+  const oldValue = get2.call(target, key);
+  target.set(key, value);
+  if (!hadKey) {
+    trigger(target, "add", key, value);
+  } else if (hasChanged(value, oldValue)) {
+    trigger(target, "set", key, value, oldValue);
+  }
+  return this;
+}
+function deleteEntry(key) {
+  const target = toRaw(this);
+  const { has: has2, get: get2 } = getProto(target);
+  let hadKey = has2.call(target, key);
+  if (!hadKey) {
+    key = toRaw(key);
+    hadKey = has2.call(target, key);
+  } else {
+    checkIdentityKeys(target, has2, key);
+  }
+  const oldValue = get2 ? get2.call(target, key) : void 0;
+  const result = target.delete(key);
+  if (hadKey) {
+    trigger(target, "delete", key, void 0, oldValue);
+  }
+  return result;
+}
+function clear() {
+  const target = toRaw(this);
+  const hadItems = target.size !== 0;
+  const oldTarget = isMap(target) ? new Map(target) : new Set(target) ;
+  const result = target.clear();
+  if (hadItems) {
+    trigger(target, "clear", void 0, void 0, oldTarget);
+  }
+  return result;
+}
+function createForEach(isReadonly, isShallow) {
+  return function forEach(callback, thisArg) {
+    const observed = this;
+    const target = observed["__v_raw"];
+    const rawTarget = toRaw(target);
+    const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
+    !isReadonly && track(rawTarget, "iterate", ITERATE_KEY);
+    return target.forEach((value, key) => {
+      return callback.call(thisArg, wrap(value), wrap(key), observed);
+    });
+  };
+}
+function createIterableMethod(method, isReadonly, isShallow) {
+  return function(...args) {
+    const target = this["__v_raw"];
+    const rawTarget = toRaw(target);
+    const targetIsMap = isMap(rawTarget);
+    const isPair = method === "entries" || method === Symbol.iterator && targetIsMap;
+    const isKeyOnly = method === "keys" && targetIsMap;
+    const innerIterator = target[method](...args);
+    const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
+    !isReadonly && track(
+      rawTarget,
+      "iterate",
+      isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY
+    );
+    return {
+      // iterator protocol
+      next() {
+        const { value, done } = innerIterator.next();
+        return done ? { value, done } : {
+          value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),
+          done
+        };
+      },
+      // iterable protocol
+      [Symbol.iterator]() {
+        return this;
+      }
+    };
+  };
+}
+function createReadonlyMethod(type) {
+  return function(...args) {
+    {
+      const key = args[0] ? `on key "${args[0]}" ` : ``;
+      console.warn(
+        `${capitalize(type)} operation ${key}failed: target is readonly.`,
+        toRaw(this)
+      );
+    }
+    return type === "delete" ? false : this;
+  };
+}
+function createInstrumentations() {
+  const mutableInstrumentations2 = {
+    get(key) {
+      return get(this, key);
+    },
+    get size() {
+      return size(this);
+    },
+    has,
+    add,
+    set,
+    delete: deleteEntry,
+    clear,
+    forEach: createForEach(false, false)
+  };
+  const shallowInstrumentations2 = {
+    get(key) {
+      return get(this, key, false, true);
+    },
+    get size() {
+      return size(this);
+    },
+    has,
+    add,
+    set,
+    delete: deleteEntry,
+    clear,
+    forEach: createForEach(false, true)
+  };
+  const readonlyInstrumentations2 = {
+    get(key) {
+      return get(this, key, true);
+    },
+    get size() {
+      return size(this, true);
+    },
+    has(key) {
+      return has.call(this, key, true);
+    },
+    add: createReadonlyMethod("add"),
+    set: createReadonlyMethod("set"),
+    delete: createReadonlyMethod("delete"),
+    clear: createReadonlyMethod("clear"),
+    forEach: createForEach(true, false)
+  };
+  const shallowReadonlyInstrumentations2 = {
+    get(key) {
+      return get(this, key, true, true);
+    },
+    get size() {
+      return size(this, true);
+    },
+    has(key) {
+      return has.call(this, key, true);
+    },
+    add: createReadonlyMethod("add"),
+    set: createReadonlyMethod("set"),
+    delete: createReadonlyMethod("delete"),
+    clear: createReadonlyMethod("clear"),
+    forEach: createForEach(true, true)
+  };
+  const iteratorMethods = ["keys", "values", "entries", Symbol.iterator];
+  iteratorMethods.forEach((method) => {
+    mutableInstrumentations2[method] = createIterableMethod(
+      method,
+      false,
+      false
+    );
+    readonlyInstrumentations2[method] = createIterableMethod(
+      method,
+      true,
+      false
+    );
+    shallowInstrumentations2[method] = createIterableMethod(
+      method,
+      false,
+      true
+    );
+    shallowReadonlyInstrumentations2[method] = createIterableMethod(
+      method,
+      true,
+      true
+    );
+  });
+  return [
+    mutableInstrumentations2,
+    readonlyInstrumentations2,
+    shallowInstrumentations2,
+    shallowReadonlyInstrumentations2
+  ];
+}
+const [
+  mutableInstrumentations,
+  readonlyInstrumentations,
+  shallowInstrumentations,
+  shallowReadonlyInstrumentations
+] = /* @__PURE__ */ createInstrumentations();
+function createInstrumentationGetter(isReadonly, shallow) {
+  const instrumentations = shallow ? isReadonly ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly ? readonlyInstrumentations : mutableInstrumentations;
+  return (target, key, receiver) => {
+    if (key === "__v_isReactive") {
+      return !isReadonly;
+    } else if (key === "__v_isReadonly") {
+      return isReadonly;
+    } else if (key === "__v_raw") {
+      return target;
+    }
+    return Reflect.get(
+      hasOwn(instrumentations, key) && key in target ? instrumentations : target,
+      key,
+      receiver
+    );
+  };
+}
+const mutableCollectionHandlers = {
+  get: /* @__PURE__ */ createInstrumentationGetter(false, false)
+};
+const shallowCollectionHandlers = {
+  get: /* @__PURE__ */ createInstrumentationGetter(false, true)
+};
+const readonlyCollectionHandlers = {
+  get: /* @__PURE__ */ createInstrumentationGetter(true, false)
+};
+const shallowReadonlyCollectionHandlers = {
+  get: /* @__PURE__ */ createInstrumentationGetter(true, true)
+};
+function checkIdentityKeys(target, has2, key) {
+  const rawKey = toRaw(key);
+  if (rawKey !== key && has2.call(target, rawKey)) {
+    const type = toRawType(target);
+    console.warn(
+      `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`
+    );
+  }
+}
+
+const reactiveMap = /* @__PURE__ */ new WeakMap();
+const shallowReactiveMap = /* @__PURE__ */ new WeakMap();
+const readonlyMap = /* @__PURE__ */ new WeakMap();
+const shallowReadonlyMap = /* @__PURE__ */ new WeakMap();
+function targetTypeMap(rawType) {
+  switch (rawType) {
+    case "Object":
+    case "Array":
+      return 1 /* COMMON */;
+    case "Map":
+    case "Set":
+    case "WeakMap":
+    case "WeakSet":
+      return 2 /* COLLECTION */;
+    default:
+      return 0 /* INVALID */;
+  }
+}
+function getTargetType(value) {
+  return value["__v_skip"] || !Object.isExtensible(value) ? 0 /* INVALID */ : targetTypeMap(toRawType(value));
+}
+function reactive(target) {
+  if (isReadonly(target)) {
+    return target;
+  }
+  return createReactiveObject(
+    target,
+    false,
+    mutableHandlers,
+    mutableCollectionHandlers,
+    reactiveMap
+  );
+}
+function shallowReactive(target) {
+  return createReactiveObject(
+    target,
+    false,
+    shallowReactiveHandlers,
+    shallowCollectionHandlers,
+    shallowReactiveMap
+  );
+}
+function readonly(target) {
+  return createReactiveObject(
+    target,
+    true,
+    readonlyHandlers,
+    readonlyCollectionHandlers,
+    readonlyMap
+  );
+}
+function shallowReadonly(target) {
+  return createReactiveObject(
+    target,
+    true,
+    shallowReadonlyHandlers,
+    shallowReadonlyCollectionHandlers,
+    shallowReadonlyMap
+  );
+}
+function createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {
+  if (!isObject(target)) {
+    {
+      console.warn(`value cannot be made reactive: ${String(target)}`);
+    }
+    return target;
+  }
+  if (target["__v_raw"] && !(isReadonly2 && target["__v_isReactive"])) {
+    return target;
+  }
+  const existingProxy = proxyMap.get(target);
+  if (existingProxy) {
+    return existingProxy;
+  }
+  const targetType = getTargetType(target);
+  if (targetType === 0 /* INVALID */) {
+    return target;
+  }
+  const proxy = new Proxy(
+    target,
+    targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers
+  );
+  proxyMap.set(target, proxy);
+  return proxy;
+}
+function isReactive(value) {
+  if (isReadonly(value)) {
+    return isReactive(value["__v_raw"]);
+  }
+  return !!(value && value["__v_isReactive"]);
+}
+function isReadonly(value) {
+  return !!(value && value["__v_isReadonly"]);
+}
+function isShallow(value) {
+  return !!(value && value["__v_isShallow"]);
+}
+function isProxy(value) {
+  return isReactive(value) || isReadonly(value);
+}
+function toRaw(observed) {
+  const raw = observed && observed["__v_raw"];
+  return raw ? toRaw(raw) : observed;
+}
+function markRaw(value) {
+  def(value, "__v_skip", true);
+  return value;
+}
+const toReactive = (value) => isObject(value) ? reactive(value) : value;
+const toReadonly = (value) => isObject(value) ? readonly(value) : value;
+
+function trackRefValue(ref2) {
+  if (shouldTrack && activeEffect) {
+    ref2 = toRaw(ref2);
+    {
+      trackEffects(ref2.dep || (ref2.dep = createDep()), {
+        target: ref2,
+        type: "get",
+        key: "value"
+      });
+    }
+  }
+}
+function triggerRefValue(ref2, newVal) {
+  ref2 = toRaw(ref2);
+  const dep = ref2.dep;
+  if (dep) {
+    {
+      triggerEffects(dep, {
+        target: ref2,
+        type: "set",
+        key: "value",
+        newValue: newVal
+      });
+    }
+  }
+}
+function isRef(r) {
+  return !!(r && r.__v_isRef === true);
+}
+function ref(value) {
+  return createRef(value, false);
+}
+function shallowRef(value) {
+  return createRef(value, true);
+}
+function createRef(rawValue, shallow) {
+  if (isRef(rawValue)) {
+    return rawValue;
+  }
+  return new RefImpl(rawValue, shallow);
+}
+class RefImpl {
+  constructor(value, __v_isShallow) {
+    this.__v_isShallow = __v_isShallow;
+    this.dep = void 0;
+    this.__v_isRef = true;
+    this._rawValue = __v_isShallow ? value : toRaw(value);
+    this._value = __v_isShallow ? value : toReactive(value);
+  }
+  get value() {
+    trackRefValue(this);
+    return this._value;
+  }
+  set value(newVal) {
+    const useDirectValue = this.__v_isShallow || isShallow(newVal) || isReadonly(newVal);
+    newVal = useDirectValue ? newVal : toRaw(newVal);
+    if (hasChanged(newVal, this._rawValue)) {
+      this._rawValue = newVal;
+      this._value = useDirectValue ? newVal : toReactive(newVal);
+      triggerRefValue(this, newVal);
+    }
+  }
+}
+function triggerRef(ref2) {
+  triggerRefValue(ref2, ref2.value );
+}
+function unref(ref2) {
+  return isRef(ref2) ? ref2.value : ref2;
+}
+function toValue(source) {
+  return isFunction(source) ? source() : unref(source);
+}
+const shallowUnwrapHandlers = {
+  get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)),
+  set: (target, key, value, receiver) => {
+    const oldValue = target[key];
+    if (isRef(oldValue) && !isRef(value)) {
+      oldValue.value = value;
+      return true;
+    } else {
+      return Reflect.set(target, key, value, receiver);
+    }
+  }
+};
+function proxyRefs(objectWithRefs) {
+  return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);
+}
+class CustomRefImpl {
+  constructor(factory) {
+    this.dep = void 0;
+    this.__v_isRef = true;
+    const { get, set } = factory(
+      () => trackRefValue(this),
+      () => triggerRefValue(this)
+    );
+    this._get = get;
+    this._set = set;
+  }
+  get value() {
+    return this._get();
+  }
+  set value(newVal) {
+    this._set(newVal);
+  }
+}
+function customRef(factory) {
+  return new CustomRefImpl(factory);
+}
+function toRefs(object) {
+  if (!isProxy(object)) {
+    console.warn(`toRefs() expects a reactive object but received a plain one.`);
+  }
+  const ret = isArray(object) ? new Array(object.length) : {};
+  for (const key in object) {
+    ret[key] = propertyToRef(object, key);
+  }
+  return ret;
+}
+class ObjectRefImpl {
+  constructor(_object, _key, _defaultValue) {
+    this._object = _object;
+    this._key = _key;
+    this._defaultValue = _defaultValue;
+    this.__v_isRef = true;
+  }
+  get value() {
+    const val = this._object[this._key];
+    return val === void 0 ? this._defaultValue : val;
+  }
+  set value(newVal) {
+    this._object[this._key] = newVal;
+  }
+  get dep() {
+    return getDepFromReactive(toRaw(this._object), this._key);
+  }
+}
+class GetterRefImpl {
+  constructor(_getter) {
+    this._getter = _getter;
+    this.__v_isRef = true;
+    this.__v_isReadonly = true;
+  }
+  get value() {
+    return this._getter();
+  }
+}
+function toRef(source, key, defaultValue) {
+  if (isRef(source)) {
+    return source;
+  } else if (isFunction(source)) {
+    return new GetterRefImpl(source);
+  } else if (isObject(source) && arguments.length > 1) {
+    return propertyToRef(source, key, defaultValue);
+  } else {
+    return ref(source);
+  }
+}
+function propertyToRef(source, key, defaultValue) {
+  const val = source[key];
+  return isRef(val) ? val : new ObjectRefImpl(source, key, defaultValue);
+}
+
+class ComputedRefImpl {
+  constructor(getter, _setter, isReadonly, isSSR) {
+    this._setter = _setter;
+    this.dep = void 0;
+    this.__v_isRef = true;
+    this["__v_isReadonly"] = false;
+    this._dirty = true;
+    this.effect = new ReactiveEffect(getter, () => {
+      if (!this._dirty) {
+        this._dirty = true;
+        triggerRefValue(this);
+      }
+    });
+    this.effect.computed = this;
+    this.effect.active = this._cacheable = !isSSR;
+    this["__v_isReadonly"] = isReadonly;
+  }
+  get value() {
+    const self = toRaw(this);
+    trackRefValue(self);
+    if (self._dirty || !self._cacheable) {
+      self._dirty = false;
+      self._value = self.effect.run();
+    }
+    return self._value;
+  }
+  set value(newValue) {
+    this._setter(newValue);
+  }
+}
+function computed$1(getterOrOptions, debugOptions, isSSR = false) {
+  let getter;
+  let setter;
+  const onlyGetter = isFunction(getterOrOptions);
+  if (onlyGetter) {
+    getter = getterOrOptions;
+    setter = () => {
+      console.warn("Write operation failed: computed value is readonly");
+    } ;
+  } else {
+    getter = getterOrOptions.get;
+    setter = getterOrOptions.set;
+  }
+  const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR);
+  if (debugOptions && !isSSR) {
+    cRef.effect.onTrack = debugOptions.onTrack;
+    cRef.effect.onTrigger = debugOptions.onTrigger;
+  }
+  return cRef;
+}
+
+const stack = [];
+function pushWarningContext(vnode) {
+  stack.push(vnode);
+}
+function popWarningContext() {
+  stack.pop();
+}
+function warn(msg, ...args) {
+  pauseTracking();
+  const instance = stack.length ? stack[stack.length - 1].component : null;
+  const appWarnHandler = instance && instance.appContext.config.warnHandler;
+  const trace = getComponentTrace();
+  if (appWarnHandler) {
+    callWithErrorHandling(
+      appWarnHandler,
+      instance,
+      11,
+      [
+        msg + args.join(""),
+        instance && instance.proxy,
+        trace.map(
+          ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`
+        ).join("\n"),
+        trace
+      ]
+    );
+  } else {
+    const warnArgs = [`[Vue warn]: ${msg}`, ...args];
+    if (trace.length && // avoid spamming console during tests
+    true) {
+      warnArgs.push(`
+`, ...formatTrace(trace));
+    }
+    console.warn(...warnArgs);
+  }
+  resetTracking();
+}
+function getComponentTrace() {
+  let currentVNode = stack[stack.length - 1];
+  if (!currentVNode) {
+    return [];
+  }
+  const normalizedStack = [];
+  while (currentVNode) {
+    const last = normalizedStack[0];
+    if (last && last.vnode === currentVNode) {
+      last.recurseCount++;
+    } else {
+      normalizedStack.push({
+        vnode: currentVNode,
+        recurseCount: 0
+      });
+    }
+    const parentInstance = currentVNode.component && currentVNode.component.parent;
+    currentVNode = parentInstance && parentInstance.vnode;
+  }
+  return normalizedStack;
+}
+function formatTrace(trace) {
+  const logs = [];
+  trace.forEach((entry, i) => {
+    logs.push(...i === 0 ? [] : [`
+`], ...formatTraceEntry(entry));
+  });
+  return logs;
+}
+function formatTraceEntry({ vnode, recurseCount }) {
+  const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;
+  const isRoot = vnode.component ? vnode.component.parent == null : false;
+  const open = ` at <${formatComponentName(
+    vnode.component,
+    vnode.type,
+    isRoot
+  )}`;
+  const close = `>` + postfix;
+  return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close];
+}
+function formatProps(props) {
+  const res = [];
+  const keys = Object.keys(props);
+  keys.slice(0, 3).forEach((key) => {
+    res.push(...formatProp(key, props[key]));
+  });
+  if (keys.length > 3) {
+    res.push(` ...`);
+  }
+  return res;
+}
+function formatProp(key, value, raw) {
+  if (isString(value)) {
+    value = JSON.stringify(value);
+    return raw ? value : [`${key}=${value}`];
+  } else if (typeof value === "number" || typeof value === "boolean" || value == null) {
+    return raw ? value : [`${key}=${value}`];
+  } else if (isRef(value)) {
+    value = formatProp(key, toRaw(value.value), true);
+    return raw ? value : [`${key}=Ref<`, value, `>`];
+  } else if (isFunction(value)) {
+    return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];
+  } else {
+    value = toRaw(value);
+    return raw ? value : [`${key}=`, value];
+  }
+}
+function assertNumber(val, type) {
+  if (val === void 0) {
+    return;
+  } else if (typeof val !== "number") {
+    warn(`${type} is not a valid number - got ${JSON.stringify(val)}.`);
+  } else if (isNaN(val)) {
+    warn(`${type} is NaN - the duration expression might be incorrect.`);
+  }
+}
+
+const ErrorTypeStrings = {
+  ["sp"]: "serverPrefetch hook",
+  ["bc"]: "beforeCreate hook",
+  ["c"]: "created hook",
+  ["bm"]: "beforeMount hook",
+  ["m"]: "mounted hook",
+  ["bu"]: "beforeUpdate hook",
+  ["u"]: "updated",
+  ["bum"]: "beforeUnmount hook",
+  ["um"]: "unmounted hook",
+  ["a"]: "activated hook",
+  ["da"]: "deactivated hook",
+  ["ec"]: "errorCaptured hook",
+  ["rtc"]: "renderTracked hook",
+  ["rtg"]: "renderTriggered hook",
+  [0]: "setup function",
+  [1]: "render function",
+  [2]: "watcher getter",
+  [3]: "watcher callback",
+  [4]: "watcher cleanup function",
+  [5]: "native event handler",
+  [6]: "component event handler",
+  [7]: "vnode hook",
+  [8]: "directive hook",
+  [9]: "transition hook",
+  [10]: "app errorHandler",
+  [11]: "app warnHandler",
+  [12]: "ref function",
+  [13]: "async component loader",
+  [14]: "scheduler flush. This is likely a Vue internals bug. Please open an issue at https://new-issue.vuejs.org/?repo=vuejs/core"
+};
+function callWithErrorHandling(fn, instance, type, args) {
+  let res;
+  try {
+    res = args ? fn(...args) : fn();
+  } catch (err) {
+    handleError(err, instance, type);
+  }
+  return res;
+}
+function callWithAsyncErrorHandling(fn, instance, type, args) {
+  if (isFunction(fn)) {
+    const res = callWithErrorHandling(fn, instance, type, args);
+    if (res && isPromise(res)) {
+      res.catch((err) => {
+        handleError(err, instance, type);
+      });
+    }
+    return res;
+  }
+  const values = [];
+  for (let i = 0; i < fn.length; i++) {
+    values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));
+  }
+  return values;
+}
+function handleError(err, instance, type, throwInDev = true) {
+  const contextVNode = instance ? instance.vnode : null;
+  if (instance) {
+    let cur = instance.parent;
+    const exposedInstance = instance.proxy;
+    const errorInfo = ErrorTypeStrings[type] ;
+    while (cur) {
+      const errorCapturedHooks = cur.ec;
+      if (errorCapturedHooks) {
+        for (let i = 0; i < errorCapturedHooks.length; i++) {
+          if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {
+            return;
+          }
+        }
+      }
+      cur = cur.parent;
+    }
+    const appErrorHandler = instance.appContext.config.errorHandler;
+    if (appErrorHandler) {
+      callWithErrorHandling(
+        appErrorHandler,
+        null,
+        10,
+        [err, exposedInstance, errorInfo]
+      );
+      return;
+    }
+  }
+  logError(err, type, contextVNode, throwInDev);
+}
+function logError(err, type, contextVNode, throwInDev = true) {
+  {
+    const info = ErrorTypeStrings[type];
+    if (contextVNode) {
+      pushWarningContext(contextVNode);
+    }
+    warn(`Unhandled error${info ? ` during execution of ${info}` : ``}`);
+    if (contextVNode) {
+      popWarningContext();
+    }
+    if (throwInDev) {
+      throw err;
+    } else {
+      console.error(err);
+    }
+  }
+}
+
+let isFlushing = false;
+let isFlushPending = false;
+const queue = [];
+let flushIndex = 0;
+const pendingPostFlushCbs = [];
+let activePostFlushCbs = null;
+let postFlushIndex = 0;
+const resolvedPromise = /* @__PURE__ */ Promise.resolve();
+let currentFlushPromise = null;
+const RECURSION_LIMIT = 100;
+function nextTick(fn) {
+  const p = currentFlushPromise || resolvedPromise;
+  return fn ? p.then(this ? fn.bind(this) : fn) : p;
+}
+function findInsertionIndex(id) {
+  let start = flushIndex + 1;
+  let end = queue.length;
+  while (start < end) {
+    const middle = start + end >>> 1;
+    const middleJobId = getId(queue[middle]);
+    middleJobId < id ? start = middle + 1 : end = middle;
+  }
+  return start;
+}
+function queueJob(job) {
+  if (!queue.length || !queue.includes(
+    job,
+    isFlushing && job.allowRecurse ? flushIndex + 1 : flushIndex
+  )) {
+    if (job.id == null) {
+      queue.push(job);
+    } else {
+      queue.splice(findInsertionIndex(job.id), 0, job);
+    }
+    queueFlush();
+  }
+}
+function queueFlush() {
+  if (!isFlushing && !isFlushPending) {
+    isFlushPending = true;
+    currentFlushPromise = resolvedPromise.then(flushJobs);
+  }
+}
+function invalidateJob(job) {
+  const i = queue.indexOf(job);
+  if (i > flushIndex) {
+    queue.splice(i, 1);
+  }
+}
+function queuePostFlushCb(cb) {
+  if (!isArray(cb)) {
+    if (!activePostFlushCbs || !activePostFlushCbs.includes(
+      cb,
+      cb.allowRecurse ? postFlushIndex + 1 : postFlushIndex
+    )) {
+      pendingPostFlushCbs.push(cb);
+    }
+  } else {
+    pendingPostFlushCbs.push(...cb);
+  }
+  queueFlush();
+}
+function flushPreFlushCbs(seen, i = isFlushing ? flushIndex + 1 : 0) {
+  {
+    seen = seen || /* @__PURE__ */ new Map();
+  }
+  for (; i < queue.length; i++) {
+    const cb = queue[i];
+    if (cb && cb.pre) {
+      if (checkRecursiveUpdates(seen, cb)) {
+        continue;
+      }
+      queue.splice(i, 1);
+      i--;
+      cb();
+    }
+  }
+}
+function flushPostFlushCbs(seen) {
+  if (pendingPostFlushCbs.length) {
+    const deduped = [...new Set(pendingPostFlushCbs)];
+    pendingPostFlushCbs.length = 0;
+    if (activePostFlushCbs) {
+      activePostFlushCbs.push(...deduped);
+      return;
+    }
+    activePostFlushCbs = deduped;
+    {
+      seen = seen || /* @__PURE__ */ new Map();
+    }
+    activePostFlushCbs.sort((a, b) => getId(a) - getId(b));
+    for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {
+      if (checkRecursiveUpdates(seen, activePostFlushCbs[postFlushIndex])) {
+        continue;
+      }
+      activePostFlushCbs[postFlushIndex]();
+    }
+    activePostFlushCbs = null;
+    postFlushIndex = 0;
+  }
+}
+const getId = (job) => job.id == null ? Infinity : job.id;
+const comparator = (a, b) => {
+  const diff = getId(a) - getId(b);
+  if (diff === 0) {
+    if (a.pre && !b.pre)
+      return -1;
+    if (b.pre && !a.pre)
+      return 1;
+  }
+  return diff;
+};
+function flushJobs(seen) {
+  isFlushPending = false;
+  isFlushing = true;
+  {
+    seen = seen || /* @__PURE__ */ new Map();
+  }
+  queue.sort(comparator);
+  const check = (job) => checkRecursiveUpdates(seen, job) ;
+  try {
+    for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {
+      const job = queue[flushIndex];
+      if (job && job.active !== false) {
+        if (check(job)) {
+          continue;
+        }
+        callWithErrorHandling(job, null, 14);
+      }
+    }
+  } finally {
+    flushIndex = 0;
+    queue.length = 0;
+    flushPostFlushCbs(seen);
+    isFlushing = false;
+    currentFlushPromise = null;
+    if (queue.length || pendingPostFlushCbs.length) {
+      flushJobs(seen);
+    }
+  }
+}
+function checkRecursiveUpdates(seen, fn) {
+  if (!seen.has(fn)) {
+    seen.set(fn, 1);
+  } else {
+    const count = seen.get(fn);
+    if (count > RECURSION_LIMIT) {
+      const instance = fn.ownerInstance;
+      const componentName = instance && getComponentName(instance.type);
+      warn(
+        `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`
+      );
+      return true;
+    } else {
+      seen.set(fn, count + 1);
+    }
+  }
+}
+
+let isHmrUpdating = false;
+const hmrDirtyComponents = /* @__PURE__ */ new Set();
+{
+  getGlobalThis().__VUE_HMR_RUNTIME__ = {
+    createRecord: tryWrap(createRecord),
+    rerender: tryWrap(rerender),
+    reload: tryWrap(reload)
+  };
+}
+const map = /* @__PURE__ */ new Map();
+function registerHMR(instance) {
+  const id = instance.type.__hmrId;
+  let record = map.get(id);
+  if (!record) {
+    createRecord(id, instance.type);
+    record = map.get(id);
+  }
+  record.instances.add(instance);
+}
+function unregisterHMR(instance) {
+  map.get(instance.type.__hmrId).instances.delete(instance);
+}
+function createRecord(id, initialDef) {
+  if (map.has(id)) {
+    return false;
+  }
+  map.set(id, {
+    initialDef: normalizeClassComponent(initialDef),
+    instances: /* @__PURE__ */ new Set()
+  });
+  return true;
+}
+function normalizeClassComponent(component) {
+  return isClassComponent(component) ? component.__vccOpts : component;
+}
+function rerender(id, newRender) {
+  const record = map.get(id);
+  if (!record) {
+    return;
+  }
+  record.initialDef.render = newRender;
+  [...record.instances].forEach((instance) => {
+    if (newRender) {
+      instance.render = newRender;
+      normalizeClassComponent(instance.type).render = newRender;
+    }
+    instance.renderCache = [];
+    isHmrUpdating = true;
+    instance.update();
+    isHmrUpdating = false;
+  });
+}
+function reload(id, newComp) {
+  const record = map.get(id);
+  if (!record)
+    return;
+  newComp = normalizeClassComponent(newComp);
+  updateComponentDef(record.initialDef, newComp);
+  const instances = [...record.instances];
+  for (const instance of instances) {
+    const oldComp = normalizeClassComponent(instance.type);
+    if (!hmrDirtyComponents.has(oldComp)) {
+      if (oldComp !== record.initialDef) {
+        updateComponentDef(oldComp, newComp);
+      }
+      hmrDirtyComponents.add(oldComp);
+    }
+    instance.appContext.propsCache.delete(instance.type);
+    instance.appContext.emitsCache.delete(instance.type);
+    instance.appContext.optionsCache.delete(instance.type);
+    if (instance.ceReload) {
+      hmrDirtyComponents.add(oldComp);
+      instance.ceReload(newComp.styles);
+      hmrDirtyComponents.delete(oldComp);
+    } else if (instance.parent) {
+      queueJob(instance.parent.update);
+    } else if (instance.appContext.reload) {
+      instance.appContext.reload();
+    } else if (typeof window !== "undefined") {
+      window.location.reload();
+    } else {
+      console.warn(
+        "[HMR] Root or manually mounted instance modified. Full reload required."
+      );
+    }
+  }
+  queuePostFlushCb(() => {
+    for (const instance of instances) {
+      hmrDirtyComponents.delete(
+        normalizeClassComponent(instance.type)
+      );
+    }
+  });
+}
+function updateComponentDef(oldComp, newComp) {
+  extend(oldComp, newComp);
+  for (const key in oldComp) {
+    if (key !== "__file" && !(key in newComp)) {
+      delete oldComp[key];
+    }
+  }
+}
+function tryWrap(fn) {
+  return (id, arg) => {
+    try {
+      return fn(id, arg);
+    } catch (e) {
+      console.error(e);
+      console.warn(
+        `[HMR] Something went wrong during Vue component hot-reload. Full reload required.`
+      );
+    }
+  };
+}
+
+let devtools;
+let buffer = [];
+let devtoolsNotInstalled = false;
+function emit$1(event, ...args) {
+  if (devtools) {
+    devtools.emit(event, ...args);
+  } else if (!devtoolsNotInstalled) {
+    buffer.push({ event, args });
+  }
+}
+function setDevtoolsHook(hook, target) {
+  var _a, _b;
+  devtools = hook;
+  if (devtools) {
+    devtools.enabled = true;
+    buffer.forEach(({ event, args }) => devtools.emit(event, ...args));
+    buffer = [];
+  } else if (
+    // handle late devtools injection - only do this if we are in an actual
+    // browser environment to avoid the timer handle stalling test runner exit
+    // (#4815)
+    typeof window !== "undefined" && // some envs mock window but not fully
+    window.HTMLElement && // also exclude jsdom
+    !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes("jsdom"))
+  ) {
+    const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || [];
+    replay.push((newHook) => {
+      setDevtoolsHook(newHook, target);
+    });
+    setTimeout(() => {
+      if (!devtools) {
+        target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null;
+        devtoolsNotInstalled = true;
+        buffer = [];
+      }
+    }, 3e3);
+  } else {
+    devtoolsNotInstalled = true;
+    buffer = [];
+  }
+}
+function devtoolsInitApp(app, version) {
+  emit$1("app:init" /* APP_INIT */, app, version, {
+    Fragment,
+    Text,
+    Comment,
+    Static
+  });
+}
+function devtoolsUnmountApp(app) {
+  emit$1("app:unmount" /* APP_UNMOUNT */, app);
+}
+const devtoolsComponentAdded = /* @__PURE__ */ createDevtoolsComponentHook(
+  "component:added" /* COMPONENT_ADDED */
+);
+const devtoolsComponentUpdated = /* @__PURE__ */ createDevtoolsComponentHook("component:updated" /* COMPONENT_UPDATED */);
+const _devtoolsComponentRemoved = /* @__PURE__ */ createDevtoolsComponentHook(
+  "component:removed" /* COMPONENT_REMOVED */
+);
+const devtoolsComponentRemoved = (component) => {
+  if (devtools && typeof devtools.cleanupBuffer === "function" && // remove the component if it wasn't buffered
+  !devtools.cleanupBuffer(component)) {
+    _devtoolsComponentRemoved(component);
+  }
+};
+function createDevtoolsComponentHook(hook) {
+  return (component) => {
+    emit$1(
+      hook,
+      component.appContext.app,
+      component.uid,
+      component.parent ? component.parent.uid : void 0,
+      component
+    );
+  };
+}
+const devtoolsPerfStart = /* @__PURE__ */ createDevtoolsPerformanceHook(
+  "perf:start" /* PERFORMANCE_START */
+);
+const devtoolsPerfEnd = /* @__PURE__ */ createDevtoolsPerformanceHook(
+  "perf:end" /* PERFORMANCE_END */
+);
+function createDevtoolsPerformanceHook(hook) {
+  return (component, type, time) => {
+    emit$1(hook, component.appContext.app, component.uid, component, type, time);
+  };
+}
+function devtoolsComponentEmit(component, event, params) {
+  emit$1(
+    "component:emit" /* COMPONENT_EMIT */,
+    component.appContext.app,
+    component,
+    event,
+    params
+  );
+}
+
+function emit(instance, event, ...rawArgs) {
+  if (instance.isUnmounted)
+    return;
+  const props = instance.vnode.props || EMPTY_OBJ;
+  {
+    const {
+      emitsOptions,
+      propsOptions: [propsOptions]
+    } = instance;
+    if (emitsOptions) {
+      if (!(event in emitsOptions) && true) {
+        if (!propsOptions || !(toHandlerKey(event) in propsOptions)) {
+          warn(
+            `Component emitted event "${event}" but it is neither declared in the emits option nor as an "${toHandlerKey(event)}" prop.`
+          );
+        }
+      } else {
+        const validator = emitsOptions[event];
+        if (isFunction(validator)) {
+          const isValid = validator(...rawArgs);
+          if (!isValid) {
+            warn(
+              `Invalid event arguments: event validation failed for event "${event}".`
+            );
+          }
+        }
+      }
+    }
+  }
+  let args = rawArgs;
+  const isModelListener = event.startsWith("update:");
+  const modelArg = isModelListener && event.slice(7);
+  if (modelArg && modelArg in props) {
+    const modifiersKey = `${modelArg === "modelValue" ? "model" : modelArg}Modifiers`;
+    const { number, trim } = props[modifiersKey] || EMPTY_OBJ;
+    if (trim) {
+      args = rawArgs.map((a) => isString(a) ? a.trim() : a);
+    }
+    if (number) {
+      args = rawArgs.map(looseToNumber);
+    }
+  }
+  {
+    devtoolsComponentEmit(instance, event, args);
+  }
+  {
+    const lowerCaseEvent = event.toLowerCase();
+    if (lowerCaseEvent !== event && props[toHandlerKey(lowerCaseEvent)]) {
+      warn(
+        `Event "${lowerCaseEvent}" is emitted in component ${formatComponentName(
+          instance,
+          instance.type
+        )} but the handler is registered for "${event}". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. You should probably use "${hyphenate(event)}" instead of "${event}".`
+      );
+    }
+  }
+  let handlerName;
+  let handler = props[handlerName = toHandlerKey(event)] || // also try camelCase event handler (#2249)
+  props[handlerName = toHandlerKey(camelize(event))];
+  if (!handler && isModelListener) {
+    handler = props[handlerName = toHandlerKey(hyphenate(event))];
+  }
+  if (handler) {
+    callWithAsyncErrorHandling(
+      handler,
+      instance,
+      6,
+      args
+    );
+  }
+  const onceHandler = props[handlerName + `Once`];
+  if (onceHandler) {
+    if (!instance.emitted) {
+      instance.emitted = {};
+    } else if (instance.emitted[handlerName]) {
+      return;
+    }
+    instance.emitted[handlerName] = true;
+    callWithAsyncErrorHandling(
+      onceHandler,
+      instance,
+      6,
+      args
+    );
+  }
+}
+function normalizeEmitsOptions(comp, appContext, asMixin = false) {
+  const cache = appContext.emitsCache;
+  const cached = cache.get(comp);
+  if (cached !== void 0) {
+    return cached;
+  }
+  const raw = comp.emits;
+  let normalized = {};
+  let hasExtends = false;
+  if (!isFunction(comp)) {
+    const extendEmits = (raw2) => {
+      const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true);
+      if (normalizedFromExtend) {
+        hasExtends = true;
+        extend(normalized, normalizedFromExtend);
+      }
+    };
+    if (!asMixin && appContext.mixins.length) {
+      appContext.mixins.forEach(extendEmits);
+    }
+    if (comp.extends) {
+      extendEmits(comp.extends);
+    }
+    if (comp.mixins) {
+      comp.mixins.forEach(extendEmits);
+    }
+  }
+  if (!raw && !hasExtends) {
+    if (isObject(comp)) {
+      cache.set(comp, null);
+    }
+    return null;
+  }
+  if (isArray(raw)) {
+    raw.forEach((key) => normalized[key] = null);
+  } else {
+    extend(normalized, raw);
+  }
+  if (isObject(comp)) {
+    cache.set(comp, normalized);
+  }
+  return normalized;
+}
+function isEmitListener(options, key) {
+  if (!options || !isOn(key)) {
+    return false;
+  }
+  key = key.slice(2).replace(/Once$/, "");
+  return hasOwn(options, key[0].toLowerCase() + key.slice(1)) || hasOwn(options, hyphenate(key)) || hasOwn(options, key);
+}
+
+let currentRenderingInstance = null;
+let currentScopeId = null;
+function setCurrentRenderingInstance(instance) {
+  const prev = currentRenderingInstance;
+  currentRenderingInstance = instance;
+  currentScopeId = instance && instance.type.__scopeId || null;
+  return prev;
+}
+function pushScopeId(id) {
+  currentScopeId = id;
+}
+function popScopeId() {
+  currentScopeId = null;
+}
+const withScopeId = (_id) => withCtx;
+function withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) {
+  if (!ctx)
+    return fn;
+  if (fn._n) {
+    return fn;
+  }
+  const renderFnWithContext = (...args) => {
+    if (renderFnWithContext._d) {
+      setBlockTracking(-1);
+    }
+    const prevInstance = setCurrentRenderingInstance(ctx);
+    let res;
+    try {
+      res = fn(...args);
+    } finally {
+      setCurrentRenderingInstance(prevInstance);
+      if (renderFnWithContext._d) {
+        setBlockTracking(1);
+      }
+    }
+    {
+      devtoolsComponentUpdated(ctx);
+    }
+    return res;
+  };
+  renderFnWithContext._n = true;
+  renderFnWithContext._c = true;
+  renderFnWithContext._d = true;
+  return renderFnWithContext;
+}
+
+let accessedAttrs = false;
+function markAttrsAccessed() {
+  accessedAttrs = true;
+}
+function renderComponentRoot(instance) {
+  const {
+    type: Component,
+    vnode,
+    proxy,
+    withProxy,
+    props,
+    propsOptions: [propsOptions],
+    slots,
+    attrs,
+    emit,
+    render,
+    renderCache,
+    data,
+    setupState,
+    ctx,
+    inheritAttrs
+  } = instance;
+  let result;
+  let fallthroughAttrs;
+  const prev = setCurrentRenderingInstance(instance);
+  {
+    accessedAttrs = false;
+  }
+  try {
+    if (vnode.shapeFlag & 4) {
+      const proxyToUse = withProxy || proxy;
+      result = normalizeVNode(
+        render.call(
+          proxyToUse,
+          proxyToUse,
+          renderCache,
+          props,
+          setupState,
+          data,
+          ctx
+        )
+      );
+      fallthroughAttrs = attrs;
+    } else {
+      const render2 = Component;
+      if (attrs === props) {
+        markAttrsAccessed();
+      }
+      result = normalizeVNode(
+        render2.length > 1 ? render2(
+          props,
+          true ? {
+            get attrs() {
+              markAttrsAccessed();
+              return attrs;
+            },
+            slots,
+            emit
+          } : { attrs, slots, emit }
+        ) : render2(
+          props,
+          null
+          /* we know it doesn't need it */
+        )
+      );
+      fallthroughAttrs = Component.props ? attrs : getFunctionalFallthrough(attrs);
+    }
+  } catch (err) {
+    blockStack.length = 0;
+    handleError(err, instance, 1);
+    result = createVNode(Comment);
+  }
+  let root = result;
+  let setRoot = void 0;
+  if (result.patchFlag > 0 && result.patchFlag & 2048) {
+    [root, setRoot] = getChildRoot(result);
+  }
+  if (fallthroughAttrs && inheritAttrs !== false) {
+    const keys = Object.keys(fallthroughAttrs);
+    const { shapeFlag } = root;
+    if (keys.length) {
+      if (shapeFlag & (1 | 6)) {
+        if (propsOptions && keys.some(isModelListener)) {
+          fallthroughAttrs = filterModelListeners(
+            fallthroughAttrs,
+            propsOptions
+          );
+        }
+        root = cloneVNode(root, fallthroughAttrs);
+      } else if (!accessedAttrs && root.type !== Comment) {
+        const allAttrs = Object.keys(attrs);
+        const eventAttrs = [];
+        const extraAttrs = [];
+        for (let i = 0, l = allAttrs.length; i < l; i++) {
+          const key = allAttrs[i];
+          if (isOn(key)) {
+            if (!isModelListener(key)) {
+              eventAttrs.push(key[2].toLowerCase() + key.slice(3));
+            }
+          } else {
+            extraAttrs.push(key);
+          }
+        }
+        if (extraAttrs.length) {
+          warn(
+            `Extraneous non-props attributes (${extraAttrs.join(", ")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes.`
+          );
+        }
+        if (eventAttrs.length) {
+          warn(
+            `Extraneous non-emits event listeners (${eventAttrs.join(", ")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes. If the listener is intended to be a component custom event listener only, declare it using the "emits" option.`
+          );
+        }
+      }
+    }
+  }
+  if (vnode.dirs) {
+    if (!isElementRoot(root)) {
+      warn(
+        `Runtime directive used on component with non-element root node. The directives will not function as intended.`
+      );
+    }
+    root = cloneVNode(root);
+    root.dirs = root.dirs ? root.dirs.concat(vnode.dirs) : vnode.dirs;
+  }
+  if (vnode.transition) {
+    if (!isElementRoot(root)) {
+      warn(
+        `Component inside <Transition> renders non-element root node that cannot be animated.`
+      );
+    }
+    root.transition = vnode.transition;
+  }
+  if (setRoot) {
+    setRoot(root);
+  } else {
+    result = root;
+  }
+  setCurrentRenderingInstance(prev);
+  return result;
+}
+const getChildRoot = (vnode) => {
+  const rawChildren = vnode.children;
+  const dynamicChildren = vnode.dynamicChildren;
+  const childRoot = filterSingleRoot(rawChildren);
+  if (!childRoot) {
+    return [vnode, void 0];
+  }
+  const index = rawChildren.indexOf(childRoot);
+  const dynamicIndex = dynamicChildren ? dynamicChildren.indexOf(childRoot) : -1;
+  const setRoot = (updatedRoot) => {
+    rawChildren[index] = updatedRoot;
+    if (dynamicChildren) {
+      if (dynamicIndex > -1) {
+        dynamicChildren[dynamicIndex] = updatedRoot;
+      } else if (updatedRoot.patchFlag > 0) {
+        vnode.dynamicChildren = [...dynamicChildren, updatedRoot];
+      }
+    }
+  };
+  return [normalizeVNode(childRoot), setRoot];
+};
+function filterSingleRoot(children) {
+  let singleRoot;
+  for (let i = 0; i < children.length; i++) {
+    const child = children[i];
+    if (isVNode(child)) {
+      if (child.type !== Comment || child.children === "v-if") {
+        if (singleRoot) {
+          return;
+        } else {
+          singleRoot = child;
+        }
+      }
+    } else {
+      return;
+    }
+  }
+  return singleRoot;
+}
+const getFunctionalFallthrough = (attrs) => {
+  let res;
+  for (const key in attrs) {
+    if (key === "class" || key === "style" || isOn(key)) {
+      (res || (res = {}))[key] = attrs[key];
+    }
+  }
+  return res;
+};
+const filterModelListeners = (attrs, props) => {
+  const res = {};
+  for (const key in attrs) {
+    if (!isModelListener(key) || !(key.slice(9) in props)) {
+      res[key] = attrs[key];
+    }
+  }
+  return res;
+};
+const isElementRoot = (vnode) => {
+  return vnode.shapeFlag & (6 | 1) || vnode.type === Comment;
+};
+function shouldUpdateComponent(prevVNode, nextVNode, optimized) {
+  const { props: prevProps, children: prevChildren, component } = prevVNode;
+  const { props: nextProps, children: nextChildren, patchFlag } = nextVNode;
+  const emits = component.emitsOptions;
+  if ((prevChildren || nextChildren) && isHmrUpdating) {
+    return true;
+  }
+  if (nextVNode.dirs || nextVNode.transition) {
+    return true;
+  }
+  if (optimized && patchFlag >= 0) {
+    if (patchFlag & 1024) {
+      return true;
+    }
+    if (patchFlag & 16) {
+      if (!prevProps) {
+        return !!nextProps;
+      }
+      return hasPropsChanged(prevProps, nextProps, emits);
+    } else if (patchFlag & 8) {
+      const dynamicProps = nextVNode.dynamicProps;
+      for (let i = 0; i < dynamicProps.length; i++) {
+        const key = dynamicProps[i];
+        if (nextProps[key] !== prevProps[key] && !isEmitListener(emits, key)) {
+          return true;
+        }
+      }
+    }
+  } else {
+    if (prevChildren || nextChildren) {
+      if (!nextChildren || !nextChildren.$stable) {
+        return true;
+      }
+    }
+    if (prevProps === nextProps) {
+      return false;
+    }
+    if (!prevProps) {
+      return !!nextProps;
+    }
+    if (!nextProps) {
+      return true;
+    }
+    return hasPropsChanged(prevProps, nextProps, emits);
+  }
+  return false;
+}
+function hasPropsChanged(prevProps, nextProps, emitsOptions) {
+  const nextKeys = Object.keys(nextProps);
+  if (nextKeys.length !== Object.keys(prevProps).length) {
+    return true;
+  }
+  for (let i = 0; i < nextKeys.length; i++) {
+    const key = nextKeys[i];
+    if (nextProps[key] !== prevProps[key] && !isEmitListener(emitsOptions, key)) {
+      return true;
+    }
+  }
+  return false;
+}
+function updateHOCHostEl({ vnode, parent }, el) {
+  while (parent && parent.subTree === vnode) {
+    (vnode = parent.vnode).el = el;
+    parent = parent.parent;
+  }
+}
+
+const isSuspense = (type) => type.__isSuspense;
+const SuspenseImpl = {
+  name: "Suspense",
+  // In order to make Suspense tree-shakable, we need to avoid importing it
+  // directly in the renderer. The renderer checks for the __isSuspense flag
+  // on a vnode's type and calls the `process` method, passing in renderer
+  // internals.
+  __isSuspense: true,
+  process(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, rendererInternals) {
+    if (n1 == null) {
+      mountSuspense(
+        n2,
+        container,
+        anchor,
+        parentComponent,
+        parentSuspense,
+        isSVG,
+        slotScopeIds,
+        optimized,
+        rendererInternals
+      );
+    } else {
+      patchSuspense(
+        n1,
+        n2,
+        container,
+        anchor,
+        parentComponent,
+        isSVG,
+        slotScopeIds,
+        optimized,
+        rendererInternals
+      );
+    }
+  },
+  hydrate: hydrateSuspense,
+  create: createSuspenseBoundary,
+  normalize: normalizeSuspenseChildren
+};
+const Suspense = SuspenseImpl ;
+function triggerEvent(vnode, name) {
+  const eventListener = vnode.props && vnode.props[name];
+  if (isFunction(eventListener)) {
+    eventListener();
+  }
+}
+function mountSuspense(vnode, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, rendererInternals) {
+  const {
+    p: patch,
+    o: { createElement }
+  } = rendererInternals;
+  const hiddenContainer = createElement("div");
+  const suspense = vnode.suspense = createSuspenseBoundary(
+    vnode,
+    parentSuspense,
+    parentComponent,
+    container,
+    hiddenContainer,
+    anchor,
+    isSVG,
+    slotScopeIds,
+    optimized,
+    rendererInternals
+  );
+  patch(
+    null,
+    suspense.pendingBranch = vnode.ssContent,
+    hiddenContainer,
+    null,
+    parentComponent,
+    suspense,
+    isSVG,
+    slotScopeIds
+  );
+  if (suspense.deps > 0) {
+    triggerEvent(vnode, "onPending");
+    triggerEvent(vnode, "onFallback");
+    patch(
+      null,
+      vnode.ssFallback,
+      container,
+      anchor,
+      parentComponent,
+      null,
+      // fallback tree will not have suspense context
+      isSVG,
+      slotScopeIds
+    );
+    setActiveBranch(suspense, vnode.ssFallback);
+  } else {
+    suspense.resolve(false, true);
+  }
+}
+function patchSuspense(n1, n2, container, anchor, parentComponent, isSVG, slotScopeIds, optimized, { p: patch, um: unmount, o: { createElement } }) {
+  const suspense = n2.suspense = n1.suspense;
+  suspense.vnode = n2;
+  n2.el = n1.el;
+  const newBranch = n2.ssContent;
+  const newFallback = n2.ssFallback;
+  const { activeBranch, pendingBranch, isInFallback, isHydrating } = suspense;
+  if (pendingBranch) {
+    suspense.pendingBranch = newBranch;
+    if (isSameVNodeType(newBranch, pendingBranch)) {
+      patch(
+        pendingBranch,
+        newBranch,
+        suspense.hiddenContainer,
+        null,
+        parentComponent,
+        suspense,
+        isSVG,
+        slotScopeIds,
+        optimized
+      );
+      if (suspense.deps <= 0) {
+        suspense.resolve();
+      } else if (isInFallback) {
+        patch(
+          activeBranch,
+          newFallback,
+          container,
+          anchor,
+          parentComponent,
+          null,
+          // fallback tree will not have suspense context
+          isSVG,
+          slotScopeIds,
+          optimized
+        );
+        setActiveBranch(suspense, newFallback);
+      }
+    } else {
+      suspense.pendingId++;
+      if (isHydrating) {
+        suspense.isHydrating = false;
+        suspense.activeBranch = pendingBranch;
+      } else {
+        unmount(pendingBranch, parentComponent, suspense);
+      }
+      suspense.deps = 0;
+      suspense.effects.length = 0;
+      suspense.hiddenContainer = createElement("div");
+      if (isInFallback) {
+        patch(
+          null,
+          newBranch,
+          suspense.hiddenContainer,
+          null,
+          parentComponent,
+          suspense,
+          isSVG,
+          slotScopeIds,
+          optimized
+        );
+        if (suspense.deps <= 0) {
+          suspense.resolve();
+        } else {
+          patch(
+            activeBranch,
+            newFallback,
+            container,
+            anchor,
+            parentComponent,
+            null,
+            // fallback tree will not have suspense context
+            isSVG,
+            slotScopeIds,
+            optimized
+          );
+          setActiveBranch(suspense, newFallback);
+        }
+      } else if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {
+        patch(
+          activeBranch,
+          newBranch,
+          container,
+          anchor,
+          parentComponent,
+          suspense,
+          isSVG,
+          slotScopeIds,
+          optimized
+        );
+        suspense.resolve(true);
+      } else {
+        patch(
+          null,
+          newBranch,
+          suspense.hiddenContainer,
+          null,
+          parentComponent,
+          suspense,
+          isSVG,
+          slotScopeIds,
+          optimized
+        );
+        if (suspense.deps <= 0) {
+          suspense.resolve();
+        }
+      }
+    }
+  } else {
+    if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {
+      patch(
+        activeBranch,
+        newBranch,
+        container,
+        anchor,
+        parentComponent,
+        suspense,
+        isSVG,
+        slotScopeIds,
+        optimized
+      );
+      setActiveBranch(suspense, newBranch);
+    } else {
+      triggerEvent(n2, "onPending");
+      suspense.pendingBranch = newBranch;
+      suspense.pendingId++;
+      patch(
+        null,
+        newBranch,
+        suspense.hiddenContainer,
+        null,
+        parentComponent,
+        suspense,
+        isSVG,
+        slotScopeIds,
+        optimized
+      );
+      if (suspense.deps <= 0) {
+        suspense.resolve();
+      } else {
+        const { timeout, pendingId } = suspense;
+        if (timeout > 0) {
+          setTimeout(() => {
+            if (suspense.pendingId === pendingId) {
+              suspense.fallback(newFallback);
+            }
+          }, timeout);
+        } else if (timeout === 0) {
+          suspense.fallback(newFallback);
+        }
+      }
+    }
+  }
+}
+let hasWarned = false;
+function createSuspenseBoundary(vnode, parentSuspense, parentComponent, container, hiddenContainer, anchor, isSVG, slotScopeIds, optimized, rendererInternals, isHydrating = false) {
+  if (!hasWarned) {
+    hasWarned = true;
+    console[console.info ? "info" : "log"](
+      `<Suspense> is an experimental feature and its API will likely change.`
+    );
+  }
+  const {
+    p: patch,
+    m: move,
+    um: unmount,
+    n: next,
+    o: { parentNode, remove }
+  } = rendererInternals;
+  let parentSuspenseId;
+  const isSuspensible = isVNodeSuspensible(vnode);
+  if (isSuspensible) {
+    if (parentSuspense == null ? void 0 : parentSuspense.pendingBranch) {
+      parentSuspenseId = parentSuspense.pendingId;
+      parentSuspense.deps++;
+    }
+  }
+  const timeout = vnode.props ? toNumber(vnode.props.timeout) : void 0;
+  {
+    assertNumber(timeout, `Suspense timeout`);
+  }
+  const suspense = {
+    vnode,
+    parent: parentSuspense,
+    parentComponent,
+    isSVG,
+    container,
+    hiddenContainer,
+    anchor,
+    deps: 0,
+    pendingId: 0,
+    timeout: typeof timeout === "number" ? timeout : -1,
+    activeBranch: null,
+    pendingBranch: null,
+    isInFallback: true,
+    isHydrating,
+    isUnmounted: false,
+    effects: [],
+    resolve(resume = false, sync = false) {
+      {
+        if (!resume && !suspense.pendingBranch) {
+          throw new Error(
+            `suspense.resolve() is called without a pending branch.`
+          );
+        }
+        if (suspense.isUnmounted) {
+          throw new Error(
+            `suspense.resolve() is called on an already unmounted suspense boundary.`
+          );
+        }
+      }
+      const {
+        vnode: vnode2,
+        activeBranch,
+        pendingBranch,
+        pendingId,
+        effects,
+        parentComponent: parentComponent2,
+        container: container2
+      } = suspense;
+      if (suspense.isHydrating) {
+        suspense.isHydrating = false;
+      } else if (!resume) {
+        const delayEnter = activeBranch && pendingBranch.transition && pendingBranch.transition.mode === "out-in";
+        if (delayEnter) {
+          activeBranch.transition.afterLeave = () => {
+            if (pendingId === suspense.pendingId) {
+              move(pendingBranch, container2, anchor2, 0);
+            }
+          };
+        }
+        let { anchor: anchor2 } = suspense;
+        if (activeBranch) {
+          anchor2 = next(activeBranch);
+          unmount(activeBranch, parentComponent2, suspense, true);
+        }
+        if (!delayEnter) {
+          move(pendingBranch, container2, anchor2, 0);
+        }
+      }
+      setActiveBranch(suspense, pendingBranch);
+      suspense.pendingBranch = null;
+      suspense.isInFallback = false;
+      let parent = suspense.parent;
+      let hasUnresolvedAncestor = false;
+      while (parent) {
+        if (parent.pendingBranch) {
+          parent.effects.push(...effects);
+          hasUnresolvedAncestor = true;
+          break;
+        }
+        parent = parent.parent;
+      }
+      if (!hasUnresolvedAncestor) {
+        queuePostFlushCb(effects);
+      }
+      suspense.effects = [];
+      if (isSuspensible) {
+        if (parentSuspense && parentSuspense.pendingBranch && parentSuspenseId === parentSuspense.pendingId) {
+          parentSuspense.deps--;
+          if (parentSuspense.deps === 0 && !sync) {
+            parentSuspense.resolve();
+          }
+        }
+      }
+      triggerEvent(vnode2, "onResolve");
+    },
+    fallback(fallbackVNode) {
+      if (!suspense.pendingBranch) {
+        return;
+      }
+      const { vnode: vnode2, activeBranch, parentComponent: parentComponent2, container: container2, isSVG: isSVG2 } = suspense;
+      triggerEvent(vnode2, "onFallback");
+      const anchor2 = next(activeBranch);
+      const mountFallback = () => {
+        if (!suspense.isInFallback) {
+          return;
+        }
+        patch(
+          null,
+          fallbackVNode,
+          container2,
+          anchor2,
+          parentComponent2,
+          null,
+          // fallback tree will not have suspense context
+          isSVG2,
+          slotScopeIds,
+          optimized
+        );
+        setActiveBranch(suspense, fallbackVNode);
+      };
+      const delayEnter = fallbackVNode.transition && fallbackVNode.transition.mode === "out-in";
+      if (delayEnter) {
+        activeBranch.transition.afterLeave = mountFallback;
+      }
+      suspense.isInFallback = true;
+      unmount(
+        activeBranch,
+        parentComponent2,
+        null,
+        // no suspense so unmount hooks fire now
+        true
+        // shouldRemove
+      );
+      if (!delayEnter) {
+        mountFallback();
+      }
+    },
+    move(container2, anchor2, type) {
+      suspense.activeBranch && move(suspense.activeBranch, container2, anchor2, type);
+      suspense.container = container2;
+    },
+    next() {
+      return suspense.activeBranch && next(suspense.activeBranch);
+    },
+    registerDep(instance, setupRenderEffect) {
+      const isInPendingSuspense = !!suspense.pendingBranch;
+      if (isInPendingSuspense) {
+        suspense.deps++;
+      }
+      const hydratedEl = instance.vnode.el;
+      instance.asyncDep.catch((err) => {
+        handleError(err, instance, 0);
+      }).then((asyncSetupResult) => {
+        if (instance.isUnmounted || suspense.isUnmounted || suspense.pendingId !== instance.suspenseId) {
+          return;
+        }
+        instance.asyncResolved = true;
+        const { vnode: vnode2 } = instance;
+        {
+          pushWarningContext(vnode2);
+        }
+        handleSetupResult(instance, asyncSetupResult, false);
+        if (hydratedEl) {
+          vnode2.el = hydratedEl;
+        }
+        const placeholder = !hydratedEl && instance.subTree.el;
+        setupRenderEffect(
+          instance,
+          vnode2,
+          // component may have been moved before resolve.
+          // if this is not a hydration, instance.subTree will be the comment
+          // placeholder.
+          parentNode(hydratedEl || instance.subTree.el),
+          // anchor will not be used if this is hydration, so only need to
+          // consider the comment placeholder case.
+          hydratedEl ? null : next(instance.subTree),
+          suspense,
+          isSVG,
+          optimized
+        );
+        if (placeholder) {
+          remove(placeholder);
+        }
+        updateHOCHostEl(instance, vnode2.el);
+        {
+          popWarningContext();
+        }
+        if (isInPendingSuspense && --suspense.deps === 0) {
+          suspense.resolve();
+        }
+      });
+    },
+    unmount(parentSuspense2, doRemove) {
+      suspense.isUnmounted = true;
+      if (suspense.activeBranch) {
+        unmount(
+          suspense.activeBranch,
+          parentComponent,
+          parentSuspense2,
+          doRemove
+        );
+      }
+      if (suspense.pendingBranch) {
+        unmount(
+          suspense.pendingBranch,
+          parentComponent,
+          parentSuspense2,
+          doRemove
+        );
+      }
+    }
+  };
+  return suspense;
+}
+function hydrateSuspense(node, vnode, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, rendererInternals, hydrateNode) {
+  const suspense = vnode.suspense = createSuspenseBoundary(
+    vnode,
+    parentSuspense,
+    parentComponent,
+    node.parentNode,
+    document.createElement("div"),
+    null,
+    isSVG,
+    slotScopeIds,
+    optimized,
+    rendererInternals,
+    true
+    /* hydrating */
+  );
+  const result = hydrateNode(
+    node,
+    suspense.pendingBranch = vnode.ssContent,
+    parentComponent,
+    suspense,
+    slotScopeIds,
+    optimized
+  );
+  if (suspense.deps === 0) {
+    suspense.resolve(false, true);
+  }
+  return result;
+}
+function normalizeSuspenseChildren(vnode) {
+  const { shapeFlag, children } = vnode;
+  const isSlotChildren = shapeFlag & 32;
+  vnode.ssContent = normalizeSuspenseSlot(
+    isSlotChildren ? children.default : children
+  );
+  vnode.ssFallback = isSlotChildren ? normalizeSuspenseSlot(children.fallback) : createVNode(Comment);
+}
+function normalizeSuspenseSlot(s) {
+  let block;
+  if (isFunction(s)) {
+    const trackBlock = isBlockTreeEnabled && s._c;
+    if (trackBlock) {
+      s._d = false;
+      openBlock();
+    }
+    s = s();
+    if (trackBlock) {
+      s._d = true;
+      block = currentBlock;
+      closeBlock();
+    }
+  }
+  if (isArray(s)) {
+    const singleChild = filterSingleRoot(s);
+    if (!singleChild) {
+      warn(`<Suspense> slots expect a single root node.`);
+    }
+    s = singleChild;
+  }
+  s = normalizeVNode(s);
+  if (block && !s.dynamicChildren) {
+    s.dynamicChildren = block.filter((c) => c !== s);
+  }
+  return s;
+}
+function queueEffectWithSuspense(fn, suspense) {
+  if (suspense && suspense.pendingBranch) {
+    if (isArray(fn)) {
+      suspense.effects.push(...fn);
+    } else {
+      suspense.effects.push(fn);
+    }
+  } else {
+    queuePostFlushCb(fn);
+  }
+}
+function setActiveBranch(suspense, branch) {
+  suspense.activeBranch = branch;
+  const { vnode, parentComponent } = suspense;
+  const el = vnode.el = branch.el;
+  if (parentComponent && parentComponent.subTree === vnode) {
+    parentComponent.vnode.el = el;
+    updateHOCHostEl(parentComponent, el);
+  }
+}
+function isVNodeSuspensible(vnode) {
+  var _a;
+  return ((_a = vnode.props) == null ? void 0 : _a.suspensible) != null && vnode.props.suspensible !== false;
+}
+
+function watchEffect(effect, options) {
+  return doWatch(effect, null, options);
+}
+function watchPostEffect(effect, options) {
+  return doWatch(
+    effect,
+    null,
+    extend({}, options, { flush: "post" }) 
+  );
+}
+function watchSyncEffect(effect, options) {
+  return doWatch(
+    effect,
+    null,
+    extend({}, options, { flush: "sync" }) 
+  );
+}
+const INITIAL_WATCHER_VALUE = {};
+function watch(source, cb, options) {
+  if (!isFunction(cb)) {
+    warn(
+      `\`watch(fn, options?)\` signature has been moved to a separate API. Use \`watchEffect(fn, options?)\` instead. \`watch\` now only supports \`watch(source, cb, options?) signature.`
+    );
+  }
+  return doWatch(source, cb, options);
+}
+function doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = EMPTY_OBJ) {
+  var _a;
+  if (!cb) {
+    if (immediate !== void 0) {
+      warn(
+        `watch() "immediate" option is only respected when using the watch(source, callback, options?) signature.`
+      );
+    }
+    if (deep !== void 0) {
+      warn(
+        `watch() "deep" option is only respected when using the watch(source, callback, options?) signature.`
+      );
+    }
+  }
+  const warnInvalidSource = (s) => {
+    warn(
+      `Invalid watch source: `,
+      s,
+      `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`
+    );
+  };
+  const instance = getCurrentScope() === ((_a = currentInstance) == null ? void 0 : _a.scope) ? currentInstance : null;
+  let getter;
+  let forceTrigger = false;
+  let isMultiSource = false;
+  if (isRef(source)) {
+    getter = () => source.value;
+    forceTrigger = isShallow(source);
+  } else if (isReactive(source)) {
+    getter = () => source;
+    deep = true;
+  } else if (isArray(source)) {
+    isMultiSource = true;
+    forceTrigger = source.some((s) => isReactive(s) || isShallow(s));
+    getter = () => source.map((s) => {
+      if (isRef(s)) {
+        return s.value;
+      } else if (isReactive(s)) {
+        return traverse(s);
+      } else if (isFunction(s)) {
+        return callWithErrorHandling(s, instance, 2);
+      } else {
+        warnInvalidSource(s);
+      }
+    });
+  } else if (isFunction(source)) {
+    if (cb) {
+      getter = () => callWithErrorHandling(source, instance, 2);
+    } else {
+      getter = () => {
+        if (instance && instance.isUnmounted) {
+          return;
+        }
+        if (cleanup) {
+          cleanup();
+        }
+        return callWithAsyncErrorHandling(
+          source,
+          instance,
+          3,
+          [onCleanup]
+        );
+      };
+    }
+  } else {
+    getter = NOOP;
+    warnInvalidSource(source);
+  }
+  if (cb && deep) {
+    const baseGetter = getter;
+    getter = () => traverse(baseGetter());
+  }
+  let cleanup;
+  let onCleanup = (fn) => {
+    cleanup = effect.onStop = () => {
+      callWithErrorHandling(fn, instance, 4);
+    };
+  };
+  let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;
+  const job = () => {
+    if (!effect.active) {
+      return;
+    }
+    if (cb) {
+      const newValue = effect.run();
+      if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue)) || false) {
+        if (cleanup) {
+          cleanup();
+        }
+        callWithAsyncErrorHandling(cb, instance, 3, [
+          newValue,
+          // pass undefined as the old value when it's changed for the first time
+          oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue,
+          onCleanup
+        ]);
+        oldValue = newValue;
+      }
+    } else {
+      effect.run();
+    }
+  };
+  job.allowRecurse = !!cb;
+  let scheduler;
+  if (flush === "sync") {
+    scheduler = job;
+  } else if (flush === "post") {
+    scheduler = () => queuePostRenderEffect(job, instance && instance.suspense);
+  } else {
+    job.pre = true;
+    if (instance)
+      job.id = instance.uid;
+    scheduler = () => queueJob(job);
+  }
+  const effect = new ReactiveEffect(getter, scheduler);
+  {
+    effect.onTrack = onTrack;
+    effect.onTrigger = onTrigger;
+  }
+  if (cb) {
+    if (immediate) {
+      job();
+    } else {
+      oldValue = effect.run();
+    }
+  } else if (flush === "post") {
+    queuePostRenderEffect(
+      effect.run.bind(effect),
+      instance && instance.suspense
+    );
+  } else {
+    effect.run();
+  }
+  const unwatch = () => {
+    effect.stop();
+    if (instance && instance.scope) {
+      remove(instance.scope.effects, effect);
+    }
+  };
+  return unwatch;
+}
+function instanceWatch(source, value, options) {
+  const publicThis = this.proxy;
+  const getter = isString(source) ? source.includes(".") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis);
+  let cb;
+  if (isFunction(value)) {
+    cb = value;
+  } else {
+    cb = value.handler;
+    options = value;
+  }
+  const cur = currentInstance;
+  setCurrentInstance(this);
+  const res = doWatch(getter, cb.bind(publicThis), options);
+  if (cur) {
+    setCurrentInstance(cur);
+  } else {
+    unsetCurrentInstance();
+  }
+  return res;
+}
+function createPathGetter(ctx, path) {
+  const segments = path.split(".");
+  return () => {
+    let cur = ctx;
+    for (let i = 0; i < segments.length && cur; i++) {
+      cur = cur[segments[i]];
+    }
+    return cur;
+  };
+}
+function traverse(value, seen) {
+  if (!isObject(value) || value["__v_skip"]) {
+    return value;
+  }
+  seen = seen || /* @__PURE__ */ new Set();
+  if (seen.has(value)) {
+    return value;
+  }
+  seen.add(value);
+  if (isRef(value)) {
+    traverse(value.value, seen);
+  } else if (isArray(value)) {
+    for (let i = 0; i < value.length; i++) {
+      traverse(value[i], seen);
+    }
+  } else if (isSet(value) || isMap(value)) {
+    value.forEach((v) => {
+      traverse(v, seen);
+    });
+  } else if (isPlainObject(value)) {
+    for (const key in value) {
+      traverse(value[key], seen);
+    }
+  }
+  return value;
+}
+
+function validateDirectiveName(name) {
+  if (isBuiltInDirective(name)) {
+    warn("Do not use built-in directive ids as custom directive id: " + name);
+  }
+}
+function withDirectives(vnode, directives) {
+  const internalInstance = currentRenderingInstance;
+  if (internalInstance === null) {
+    warn(`withDirectives can only be used inside render functions.`);
+    return vnode;
+  }
+  const instance = getExposeProxy(internalInstance) || internalInstance.proxy;
+  const bindings = vnode.dirs || (vnode.dirs = []);
+  for (let i = 0; i < directives.length; i++) {
+    let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i];
+    if (dir) {
+      if (isFunction(dir)) {
+        dir = {
+          mounted: dir,
+          updated: dir
+        };
+      }
+      if (dir.deep) {
+        traverse(value);
+      }
+      bindings.push({
+        dir,
+        instance,
+        value,
+        oldValue: void 0,
+        arg,
+        modifiers
+      });
+    }
+  }
+  return vnode;
+}
+function invokeDirectiveHook(vnode, prevVNode, instance, name) {
+  const bindings = vnode.dirs;
+  const oldBindings = prevVNode && prevVNode.dirs;
+  for (let i = 0; i < bindings.length; i++) {
+    const binding = bindings[i];
+    if (oldBindings) {
+      binding.oldValue = oldBindings[i].value;
+    }
+    let hook = binding.dir[name];
+    if (hook) {
+      pauseTracking();
+      callWithAsyncErrorHandling(hook, instance, 8, [
+        vnode.el,
+        binding,
+        vnode,
+        prevVNode
+      ]);
+      resetTracking();
+    }
+  }
+}
+
+const leaveCbKey = Symbol("_leaveCb");
+const enterCbKey$1 = Symbol("_enterCb");
+function useTransitionState() {
+  const state = {
+    isMounted: false,
+    isLeaving: false,
+    isUnmounting: false,
+    leavingVNodes: /* @__PURE__ */ new Map()
+  };
+  onMounted(() => {
+    state.isMounted = true;
+  });
+  onBeforeUnmount(() => {
+    state.isUnmounting = true;
+  });
+  return state;
+}
+const TransitionHookValidator = [Function, Array];
+const BaseTransitionPropsValidators = {
+  mode: String,
+  appear: Boolean,
+  persisted: Boolean,
+  // enter
+  onBeforeEnter: TransitionHookValidator,
+  onEnter: TransitionHookValidator,
+  onAfterEnter: TransitionHookValidator,
+  onEnterCancelled: TransitionHookValidator,
+  // leave
+  onBeforeLeave: TransitionHookValidator,
+  onLeave: TransitionHookValidator,
+  onAfterLeave: TransitionHookValidator,
+  onLeaveCancelled: TransitionHookValidator,
+  // appear
+  onBeforeAppear: TransitionHookValidator,
+  onAppear: TransitionHookValidator,
+  onAfterAppear: TransitionHookValidator,
+  onAppearCancelled: TransitionHookValidator
+};
+const BaseTransitionImpl = {
+  name: `BaseTransition`,
+  props: BaseTransitionPropsValidators,
+  setup(props, { slots }) {
+    const instance = getCurrentInstance();
+    const state = useTransitionState();
+    let prevTransitionKey;
+    return () => {
+      const children = slots.default && getTransitionRawChildren(slots.default(), true);
+      if (!children || !children.length) {
+        return;
+      }
+      let child = children[0];
+      if (children.length > 1) {
+        let hasFound = false;
+        for (const c of children) {
+          if (c.type !== Comment) {
+            if (hasFound) {
+              warn(
+                "<transition> can only be used on a single element or component. Use <transition-group> for lists."
+              );
+              break;
+            }
+            child = c;
+            hasFound = true;
+          }
+        }
+      }
+      const rawProps = toRaw(props);
+      const { mode } = rawProps;
+      if (mode && mode !== "in-out" && mode !== "out-in" && mode !== "default") {
+        warn(`invalid <transition> mode: ${mode}`);
+      }
+      if (state.isLeaving) {
+        return emptyPlaceholder(child);
+      }
+      const innerChild = getKeepAliveChild(child);
+      if (!innerChild) {
+        return emptyPlaceholder(child);
+      }
+      const enterHooks = resolveTransitionHooks(
+        innerChild,
+        rawProps,
+        state,
+        instance
+      );
+      setTransitionHooks(innerChild, enterHooks);
+      const oldChild = instance.subTree;
+      const oldInnerChild = oldChild && getKeepAliveChild(oldChild);
+      let transitionKeyChanged = false;
+      const { getTransitionKey } = innerChild.type;
+      if (getTransitionKey) {
+        const key = getTransitionKey();
+        if (prevTransitionKey === void 0) {
+          prevTransitionKey = key;
+        } else if (key !== prevTransitionKey) {
+          prevTransitionKey = key;
+          transitionKeyChanged = true;
+        }
+      }
+      if (oldInnerChild && oldInnerChild.type !== Comment && (!isSameVNodeType(innerChild, oldInnerChild) || transitionKeyChanged)) {
+        const leavingHooks = resolveTransitionHooks(
+          oldInnerChild,
+          rawProps,
+          state,
+          instance
+        );
+        setTransitionHooks(oldInnerChild, leavingHooks);
+        if (mode === "out-in") {
+          state.isLeaving = true;
+          leavingHooks.afterLeave = () => {
+            state.isLeaving = false;
+            if (instance.update.active !== false) {
+              instance.update();
+            }
+          };
+          return emptyPlaceholder(child);
+        } else if (mode === "in-out" && innerChild.type !== Comment) {
+          leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => {
+            const leavingVNodesCache = getLeavingNodesForType(
+              state,
+              oldInnerChild
+            );
+            leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild;
+            el[leaveCbKey] = () => {
+              earlyRemove();
+              el[leaveCbKey] = void 0;
+              delete enterHooks.delayedLeave;
+            };
+            enterHooks.delayedLeave = delayedLeave;
+          };
+        }
+      }
+      return child;
+    };
+  }
+};
+const BaseTransition = BaseTransitionImpl;
+function getLeavingNodesForType(state, vnode) {
+  const { leavingVNodes } = state;
+  let leavingVNodesCache = leavingVNodes.get(vnode.type);
+  if (!leavingVNodesCache) {
+    leavingVNodesCache = /* @__PURE__ */ Object.create(null);
+    leavingVNodes.set(vnode.type, leavingVNodesCache);
+  }
+  return leavingVNodesCache;
+}
+function resolveTransitionHooks(vnode, props, state, instance) {
+  const {
+    appear,
+    mode,
+    persisted = false,
+    onBeforeEnter,
+    onEnter,
+    onAfterEnter,
+    onEnterCancelled,
+    onBeforeLeave,
+    onLeave,
+    onAfterLeave,
+    onLeaveCancelled,
+    onBeforeAppear,
+    onAppear,
+    onAfterAppear,
+    onAppearCancelled
+  } = props;
+  const key = String(vnode.key);
+  const leavingVNodesCache = getLeavingNodesForType(state, vnode);
+  const callHook = (hook, args) => {
+    hook && callWithAsyncErrorHandling(
+      hook,
+      instance,
+      9,
+      args
+    );
+  };
+  const callAsyncHook = (hook, args) => {
+    const done = args[1];
+    callHook(hook, args);
+    if (isArray(hook)) {
+      if (hook.every((hook2) => hook2.length <= 1))
+        done();
+    } else if (hook.length <= 1) {
+      done();
+    }
+  };
+  const hooks = {
+    mode,
+    persisted,
+    beforeEnter(el) {
+      let hook = onBeforeEnter;
+      if (!state.isMounted) {
+        if (appear) {
+          hook = onBeforeAppear || onBeforeEnter;
+        } else {
+          return;
+        }
+      }
+      if (el[leaveCbKey]) {
+        el[leaveCbKey](
+          true
+          /* cancelled */
+        );
+      }
+      const leavingVNode = leavingVNodesCache[key];
+      if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el[leaveCbKey]) {
+        leavingVNode.el[leaveCbKey]();
+      }
+      callHook(hook, [el]);
+    },
+    enter(el) {
+      let hook = onEnter;
+      let afterHook = onAfterEnter;
+      let cancelHook = onEnterCancelled;
+      if (!state.isMounted) {
+        if (appear) {
+          hook = onAppear || onEnter;
+          afterHook = onAfterAppear || onAfterEnter;
+          cancelHook = onAppearCancelled || onEnterCancelled;
+        } else {
+          return;
+        }
+      }
+      let called = false;
+      const done = el[enterCbKey$1] = (cancelled) => {
+        if (called)
+          return;
+        called = true;
+        if (cancelled) {
+          callHook(cancelHook, [el]);
+        } else {
+          callHook(afterHook, [el]);
+        }
+        if (hooks.delayedLeave) {
+          hooks.delayedLeave();
+        }
+        el[enterCbKey$1] = void 0;
+      };
+      if (hook) {
+        callAsyncHook(hook, [el, done]);
+      } else {
+        done();
+      }
+    },
+    leave(el, remove) {
+      const key2 = String(vnode.key);
+      if (el[enterCbKey$1]) {
+        el[enterCbKey$1](
+          true
+          /* cancelled */
+        );
+      }
+      if (state.isUnmounting) {
+        return remove();
+      }
+      callHook(onBeforeLeave, [el]);
+      let called = false;
+      const done = el[leaveCbKey] = (cancelled) => {
+        if (called)
+          return;
+        called = true;
+        remove();
+        if (cancelled) {
+          callHook(onLeaveCancelled, [el]);
+        } else {
+          callHook(onAfterLeave, [el]);
+        }
+        el[leaveCbKey] = void 0;
+        if (leavingVNodesCache[key2] === vnode) {
+          delete leavingVNodesCache[key2];
+        }
+      };
+      leavingVNodesCache[key2] = vnode;
+      if (onLeave) {
+        callAsyncHook(onLeave, [el, done]);
+      } else {
+        done();
+      }
+    },
+    clone(vnode2) {
+      return resolveTransitionHooks(vnode2, props, state, instance);
+    }
+  };
+  return hooks;
+}
+function emptyPlaceholder(vnode) {
+  if (isKeepAlive(vnode)) {
+    vnode = cloneVNode(vnode);
+    vnode.children = null;
+    return vnode;
+  }
+}
+function getKeepAliveChild(vnode) {
+  return isKeepAlive(vnode) ? vnode.children ? vnode.children[0] : void 0 : vnode;
+}
+function setTransitionHooks(vnode, hooks) {
+  if (vnode.shapeFlag & 6 && vnode.component) {
+    setTransitionHooks(vnode.component.subTree, hooks);
+  } else if (vnode.shapeFlag & 128) {
+    vnode.ssContent.transition = hooks.clone(vnode.ssContent);
+    vnode.ssFallback.transition = hooks.clone(vnode.ssFallback);
+  } else {
+    vnode.transition = hooks;
+  }
+}
+function getTransitionRawChildren(children, keepComment = false, parentKey) {
+  let ret = [];
+  let keyedFragmentCount = 0;
+  for (let i = 0; i < children.length; i++) {
+    let child = children[i];
+    const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i);
+    if (child.type === Fragment) {
+      if (child.patchFlag & 128)
+        keyedFragmentCount++;
+      ret = ret.concat(
+        getTransitionRawChildren(child.children, keepComment, key)
+      );
+    } else if (keepComment || child.type !== Comment) {
+      ret.push(key != null ? cloneVNode(child, { key }) : child);
+    }
+  }
+  if (keyedFragmentCount > 1) {
+    for (let i = 0; i < ret.length; i++) {
+      ret[i].patchFlag = -2;
+    }
+  }
+  return ret;
+}
+
+/*! #__NO_SIDE_EFFECTS__ */
+// @__NO_SIDE_EFFECTS__
+function defineComponent(options, extraOptions) {
+  return isFunction(options) ? (
+    // #8326: extend call and options.name access are considered side-effects
+    // by Rollup, so we have to wrap it in a pure-annotated IIFE.
+    /* @__PURE__ */ (() => extend({ name: options.name }, extraOptions, { setup: options }))()
+  ) : options;
+}
+
+const isAsyncWrapper = (i) => !!i.type.__asyncLoader;
+/*! #__NO_SIDE_EFFECTS__ */
+// @__NO_SIDE_EFFECTS__
+function defineAsyncComponent(source) {
+  if (isFunction(source)) {
+    source = { loader: source };
+  }
+  const {
+    loader,
+    loadingComponent,
+    errorComponent,
+    delay = 200,
+    timeout,
+    // undefined = never times out
+    suspensible = true,
+    onError: userOnError
+  } = source;
+  let pendingRequest = null;
+  let resolvedComp;
+  let retries = 0;
+  const retry = () => {
+    retries++;
+    pendingRequest = null;
+    return load();
+  };
+  const load = () => {
+    let thisRequest;
+    return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => {
+      err = err instanceof Error ? err : new Error(String(err));
+      if (userOnError) {
+        return new Promise((resolve, reject) => {
+          const userRetry = () => resolve(retry());
+          const userFail = () => reject(err);
+          userOnError(err, userRetry, userFail, retries + 1);
+        });
+      } else {
+        throw err;
+      }
+    }).then((comp) => {
+      if (thisRequest !== pendingRequest && pendingRequest) {
+        return pendingRequest;
+      }
+      if (!comp) {
+        warn(
+          `Async component loader resolved to undefined. If you are using retry(), make sure to return its return value.`
+        );
+      }
+      if (comp && (comp.__esModule || comp[Symbol.toStringTag] === "Module")) {
+        comp = comp.default;
+      }
+      if (comp && !isObject(comp) && !isFunction(comp)) {
+        throw new Error(`Invalid async component load result: ${comp}`);
+      }
+      resolvedComp = comp;
+      return comp;
+    }));
+  };
+  return defineComponent({
+    name: "AsyncComponentWrapper",
+    __asyncLoader: load,
+    get __asyncResolved() {
+      return resolvedComp;
+    },
+    setup() {
+      const instance = currentInstance;
+      if (resolvedComp) {
+        return () => createInnerComp(resolvedComp, instance);
+      }
+      const onError = (err) => {
+        pendingRequest = null;
+        handleError(
+          err,
+          instance,
+          13,
+          !errorComponent
+          /* do not throw in dev if user provided error component */
+        );
+      };
+      if (suspensible && instance.suspense || false) {
+        return load().then((comp) => {
+          return () => createInnerComp(comp, instance);
+        }).catch((err) => {
+          onError(err);
+          return () => errorComponent ? createVNode(errorComponent, {
+            error: err
+          }) : null;
+        });
+      }
+      const loaded = ref(false);
+      const error = ref();
+      const delayed = ref(!!delay);
+      if (delay) {
+        setTimeout(() => {
+          delayed.value = false;
+        }, delay);
+      }
+      if (timeout != null) {
+        setTimeout(() => {
+          if (!loaded.value && !error.value) {
+            const err = new Error(
+              `Async component timed out after ${timeout}ms.`
+            );
+            onError(err);
+            error.value = err;
+          }
+        }, timeout);
+      }
+      load().then(() => {
+        loaded.value = true;
+        if (instance.parent && isKeepAlive(instance.parent.vnode)) {
+          queueJob(instance.parent.update);
+        }
+      }).catch((err) => {
+        onError(err);
+        error.value = err;
+      });
+      return () => {
+        if (loaded.value && resolvedComp) {
+          return createInnerComp(resolvedComp, instance);
+        } else if (error.value && errorComponent) {
+          return createVNode(errorComponent, {
+            error: error.value
+          });
+        } else if (loadingComponent && !delayed.value) {
+          return createVNode(loadingComponent);
+        }
+      };
+    }
+  });
+}
+function createInnerComp(comp, parent) {
+  const { ref: ref2, props, children, ce } = parent.vnode;
+  const vnode = createVNode(comp, props, children);
+  vnode.ref = ref2;
+  vnode.ce = ce;
+  delete parent.vnode.ce;
+  return vnode;
+}
+
+const isKeepAlive = (vnode) => vnode.type.__isKeepAlive;
+const KeepAliveImpl = {
+  name: `KeepAlive`,
+  // Marker for special handling inside the renderer. We are not using a ===
+  // check directly on KeepAlive in the renderer, because importing it directly
+  // would prevent it from being tree-shaken.
+  __isKeepAlive: true,
+  props: {
+    include: [String, RegExp, Array],
+    exclude: [String, RegExp, Array],
+    max: [String, Number]
+  },
+  setup(props, { slots }) {
+    const instance = getCurrentInstance();
+    const sharedContext = instance.ctx;
+    const cache = /* @__PURE__ */ new Map();
+    const keys = /* @__PURE__ */ new Set();
+    let current = null;
+    {
+      instance.__v_cache = cache;
+    }
+    const parentSuspense = instance.suspense;
+    const {
+      renderer: {
+        p: patch,
+        m: move,
+        um: _unmount,
+        o: { createElement }
+      }
+    } = sharedContext;
+    const storageContainer = createElement("div");
+    sharedContext.activate = (vnode, container, anchor, isSVG, optimized) => {
+      const instance2 = vnode.component;
+      move(vnode, container, anchor, 0, parentSuspense);
+      patch(
+        instance2.vnode,
+        vnode,
+        container,
+        anchor,
+        instance2,
+        parentSuspense,
+        isSVG,
+        vnode.slotScopeIds,
+        optimized
+      );
+      queuePostRenderEffect(() => {
+        instance2.isDeactivated = false;
+        if (instance2.a) {
+          invokeArrayFns(instance2.a);
+        }
+        const vnodeHook = vnode.props && vnode.props.onVnodeMounted;
+        if (vnodeHook) {
+          invokeVNodeHook(vnodeHook, instance2.parent, vnode);
+        }
+      }, parentSuspense);
+      {
+        devtoolsComponentAdded(instance2);
+      }
+    };
+    sharedContext.deactivate = (vnode) => {
+      const instance2 = vnode.component;
+      move(vnode, storageContainer, null, 1, parentSuspense);
+      queuePostRenderEffect(() => {
+        if (instance2.da) {
+          invokeArrayFns(instance2.da);
+        }
+        const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted;
+        if (vnodeHook) {
+          invokeVNodeHook(vnodeHook, instance2.parent, vnode);
+        }
+        instance2.isDeactivated = true;
+      }, parentSuspense);
+      {
+        devtoolsComponentAdded(instance2);
+      }
+    };
+    function unmount(vnode) {
+      resetShapeFlag(vnode);
+      _unmount(vnode, instance, parentSuspense, true);
+    }
+    function pruneCache(filter) {
+      cache.forEach((vnode, key) => {
+        const name = getComponentName(vnode.type);
+        if (name && (!filter || !filter(name))) {
+          pruneCacheEntry(key);
+        }
+      });
+    }
+    function pruneCacheEntry(key) {
+      const cached = cache.get(key);
+      if (!current || !isSameVNodeType(cached, current)) {
+        unmount(cached);
+      } else if (current) {
+        resetShapeFlag(current);
+      }
+      cache.delete(key);
+      keys.delete(key);
+    }
+    watch(
+      () => [props.include, props.exclude],
+      ([include, exclude]) => {
+        include && pruneCache((name) => matches(include, name));
+        exclude && pruneCache((name) => !matches(exclude, name));
+      },
+      // prune post-render after `current` has been updated
+      { flush: "post", deep: true }
+    );
+    let pendingCacheKey = null;
+    const cacheSubtree = () => {
+      if (pendingCacheKey != null) {
+        cache.set(pendingCacheKey, getInnerChild(instance.subTree));
+      }
+    };
+    onMounted(cacheSubtree);
+    onUpdated(cacheSubtree);
+    onBeforeUnmount(() => {
+      cache.forEach((cached) => {
+        const { subTree, suspense } = instance;
+        const vnode = getInnerChild(subTree);
+        if (cached.type === vnode.type && cached.key === vnode.key) {
+          resetShapeFlag(vnode);
+          const da = vnode.component.da;
+          da && queuePostRenderEffect(da, suspense);
+          return;
+        }
+        unmount(cached);
+      });
+    });
+    return () => {
+      pendingCacheKey = null;
+      if (!slots.default) {
+        return null;
+      }
+      const children = slots.default();
+      const rawVNode = children[0];
+      if (children.length > 1) {
+        {
+          warn(`KeepAlive should contain exactly one component child.`);
+        }
+        current = null;
+        return children;
+      } else if (!isVNode(rawVNode) || !(rawVNode.shapeFlag & 4) && !(rawVNode.shapeFlag & 128)) {
+        current = null;
+        return rawVNode;
+      }
+      let vnode = getInnerChild(rawVNode);
+      const comp = vnode.type;
+      const name = getComponentName(
+        isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : comp
+      );
+      const { include, exclude, max } = props;
+      if (include && (!name || !matches(include, name)) || exclude && name && matches(exclude, name)) {
+        current = vnode;
+        return rawVNode;
+      }
+      const key = vnode.key == null ? comp : vnode.key;
+      const cachedVNode = cache.get(key);
+      if (vnode.el) {
+        vnode = cloneVNode(vnode);
+        if (rawVNode.shapeFlag & 128) {
+          rawVNode.ssContent = vnode;
+        }
+      }
+      pendingCacheKey = key;
+      if (cachedVNode) {
+        vnode.el = cachedVNode.el;
+        vnode.component = cachedVNode.component;
+        if (vnode.transition) {
+          setTransitionHooks(vnode, vnode.transition);
+        }
+        vnode.shapeFlag |= 512;
+        keys.delete(key);
+        keys.add(key);
+      } else {
+        keys.add(key);
+        if (max && keys.size > parseInt(max, 10)) {
+          pruneCacheEntry(keys.values().next().value);
+        }
+      }
+      vnode.shapeFlag |= 256;
+      current = vnode;
+      return isSuspense(rawVNode.type) ? rawVNode : vnode;
+    };
+  }
+};
+const KeepAlive = KeepAliveImpl;
+function matches(pattern, name) {
+  if (isArray(pattern)) {
+    return pattern.some((p) => matches(p, name));
+  } else if (isString(pattern)) {
+    return pattern.split(",").includes(name);
+  } else if (isRegExp(pattern)) {
+    return pattern.test(name);
+  }
+  return false;
+}
+function onActivated(hook, target) {
+  registerKeepAliveHook(hook, "a", target);
+}
+function onDeactivated(hook, target) {
+  registerKeepAliveHook(hook, "da", target);
+}
+function registerKeepAliveHook(hook, type, target = currentInstance) {
+  const wrappedHook = hook.__wdc || (hook.__wdc = () => {
+    let current = target;
+    while (current) {
+      if (current.isDeactivated) {
+        return;
+      }
+      current = current.parent;
+    }
+    return hook();
+  });
+  injectHook(type, wrappedHook, target);
+  if (target) {
+    let current = target.parent;
+    while (current && current.parent) {
+      if (isKeepAlive(current.parent.vnode)) {
+        injectToKeepAliveRoot(wrappedHook, type, target, current);
+      }
+      current = current.parent;
+    }
+  }
+}
+function injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {
+  const injected = injectHook(
+    type,
+    hook,
+    keepAliveRoot,
+    true
+    /* prepend */
+  );
+  onUnmounted(() => {
+    remove(keepAliveRoot[type], injected);
+  }, target);
+}
+function resetShapeFlag(vnode) {
+  vnode.shapeFlag &= ~256;
+  vnode.shapeFlag &= ~512;
+}
+function getInnerChild(vnode) {
+  return vnode.shapeFlag & 128 ? vnode.ssContent : vnode;
+}
+
+function injectHook(type, hook, target = currentInstance, prepend = false) {
+  if (target) {
+    const hooks = target[type] || (target[type] = []);
+    const wrappedHook = hook.__weh || (hook.__weh = (...args) => {
+      if (target.isUnmounted) {
+        return;
+      }
+      pauseTracking();
+      setCurrentInstance(target);
+      const res = callWithAsyncErrorHandling(hook, target, type, args);
+      unsetCurrentInstance();
+      resetTracking();
+      return res;
+    });
+    if (prepend) {
+      hooks.unshift(wrappedHook);
+    } else {
+      hooks.push(wrappedHook);
+    }
+    return wrappedHook;
+  } else {
+    const apiName = toHandlerKey(ErrorTypeStrings[type].replace(/ hook$/, ""));
+    warn(
+      `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup().` + (` If you are using async setup(), make sure to register lifecycle hooks before the first await statement.` )
+    );
+  }
+}
+const createHook = (lifecycle) => (hook, target = currentInstance) => (
+  // post-create lifecycle registrations are noops during SSR (except for serverPrefetch)
+  (!isInSSRComponentSetup || lifecycle === "sp") && injectHook(lifecycle, (...args) => hook(...args), target)
+);
+const onBeforeMount = createHook("bm");
+const onMounted = createHook("m");
+const onBeforeUpdate = createHook("bu");
+const onUpdated = createHook("u");
+const onBeforeUnmount = createHook("bum");
+const onUnmounted = createHook("um");
+const onServerPrefetch = createHook("sp");
+const onRenderTriggered = createHook(
+  "rtg"
+);
+const onRenderTracked = createHook(
+  "rtc"
+);
+function onErrorCaptured(hook, target = currentInstance) {
+  injectHook("ec", hook, target);
+}
+
+const COMPONENTS = "components";
+const DIRECTIVES = "directives";
+function resolveComponent(name, maybeSelfReference) {
+  return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name;
+}
+const NULL_DYNAMIC_COMPONENT = Symbol.for("v-ndc");
+function resolveDynamicComponent(component) {
+  if (isString(component)) {
+    return resolveAsset(COMPONENTS, component, false) || component;
+  } else {
+    return component || NULL_DYNAMIC_COMPONENT;
+  }
+}
+function resolveDirective(name) {
+  return resolveAsset(DIRECTIVES, name);
+}
+function resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) {
+  const instance = currentRenderingInstance || currentInstance;
+  if (instance) {
+    const Component = instance.type;
+    if (type === COMPONENTS) {
+      const selfName = getComponentName(
+        Component,
+        false
+        /* do not include inferred name to avoid breaking existing code */
+      );
+      if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) {
+        return Component;
+      }
+    }
+    const res = (
+      // local registration
+      // check instance[type] first which is resolved for options API
+      resolve(instance[type] || Component[type], name) || // global registration
+      resolve(instance.appContext[type], name)
+    );
+    if (!res && maybeSelfReference) {
+      return Component;
+    }
+    if (warnMissing && !res) {
+      const extra = type === COMPONENTS ? `
+If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``;
+      warn(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`);
+    }
+    return res;
+  } else {
+    warn(
+      `resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().`
+    );
+  }
+}
+function resolve(registry, name) {
+  return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]);
+}
+
+function renderList(source, renderItem, cache, index) {
+  let ret;
+  const cached = cache && cache[index];
+  if (isArray(source) || isString(source)) {
+    ret = new Array(source.length);
+    for (let i = 0, l = source.length; i < l; i++) {
+      ret[i] = renderItem(source[i], i, void 0, cached && cached[i]);
+    }
+  } else if (typeof source === "number") {
+    if (!Number.isInteger(source)) {
+      warn(`The v-for range expect an integer value but got ${source}.`);
+    }
+    ret = new Array(source);
+    for (let i = 0; i < source; i++) {
+      ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]);
+    }
+  } else if (isObject(source)) {
+    if (source[Symbol.iterator]) {
+      ret = Array.from(
+        source,
+        (item, i) => renderItem(item, i, void 0, cached && cached[i])
+      );
+    } else {
+      const keys = Object.keys(source);
+      ret = new Array(keys.length);
+      for (let i = 0, l = keys.length; i < l; i++) {
+        const key = keys[i];
+        ret[i] = renderItem(source[key], key, i, cached && cached[i]);
+      }
+    }
+  } else {
+    ret = [];
+  }
+  if (cache) {
+    cache[index] = ret;
+  }
+  return ret;
+}
+
+function createSlots(slots, dynamicSlots) {
+  for (let i = 0; i < dynamicSlots.length; i++) {
+    const slot = dynamicSlots[i];
+    if (isArray(slot)) {
+      for (let j = 0; j < slot.length; j++) {
+        slots[slot[j].name] = slot[j].fn;
+      }
+    } else if (slot) {
+      slots[slot.name] = slot.key ? (...args) => {
+        const res = slot.fn(...args);
+        if (res)
+          res.key = slot.key;
+        return res;
+      } : slot.fn;
+    }
+  }
+  return slots;
+}
+
+function renderSlot(slots, name, props = {}, fallback, noSlotted) {
+  if (currentRenderingInstance.isCE || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.isCE) {
+    if (name !== "default")
+      props.name = name;
+    return createVNode("slot", props, fallback && fallback());
+  }
+  let slot = slots[name];
+  if (slot && slot.length > 1) {
+    warn(
+      `SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template.`
+    );
+    slot = () => [];
+  }
+  if (slot && slot._c) {
+    slot._d = false;
+  }
+  openBlock();
+  const validSlotContent = slot && ensureValidVNode(slot(props));
+  const rendered = createBlock(
+    Fragment,
+    {
+      key: props.key || // slot content array of a dynamic conditional slot may have a branch
+      // key attached in the `createSlots` helper, respect that
+      validSlotContent && validSlotContent.key || `_${name}`
+    },
+    validSlotContent || (fallback ? fallback() : []),
+    validSlotContent && slots._ === 1 ? 64 : -2
+  );
+  if (!noSlotted && rendered.scopeId) {
+    rendered.slotScopeIds = [rendered.scopeId + "-s"];
+  }
+  if (slot && slot._c) {
+    slot._d = true;
+  }
+  return rendered;
+}
+function ensureValidVNode(vnodes) {
+  return vnodes.some((child) => {
+    if (!isVNode(child))
+      return true;
+    if (child.type === Comment)
+      return false;
+    if (child.type === Fragment && !ensureValidVNode(child.children))
+      return false;
+    return true;
+  }) ? vnodes : null;
+}
+
+function toHandlers(obj, preserveCaseIfNecessary) {
+  const ret = {};
+  if (!isObject(obj)) {
+    warn(`v-on with no argument expects an object value.`);
+    return ret;
+  }
+  for (const key in obj) {
+    ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key];
+  }
+  return ret;
+}
+
+const getPublicInstance = (i) => {
+  if (!i)
+    return null;
+  if (isStatefulComponent(i))
+    return getExposeProxy(i) || i.proxy;
+  return getPublicInstance(i.parent);
+};
+const publicPropertiesMap = (
+  // Move PURE marker to new line to workaround compiler discarding it
+  // due to type annotation
+  /* @__PURE__ */ extend(/* @__PURE__ */ Object.create(null), {
+    $: (i) => i,
+    $el: (i) => i.vnode.el,
+    $data: (i) => i.data,
+    $props: (i) => shallowReadonly(i.props) ,
+    $attrs: (i) => shallowReadonly(i.attrs) ,
+    $slots: (i) => shallowReadonly(i.slots) ,
+    $refs: (i) => shallowReadonly(i.refs) ,
+    $parent: (i) => getPublicInstance(i.parent),
+    $root: (i) => getPublicInstance(i.root),
+    $emit: (i) => i.emit,
+    $options: (i) => resolveMergedOptions(i) ,
+    $forceUpdate: (i) => i.f || (i.f = () => queueJob(i.update)),
+    $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)),
+    $watch: (i) => instanceWatch.bind(i) 
+  })
+);
+const isReservedPrefix = (key) => key === "_" || key === "$";
+const hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key);
+const PublicInstanceProxyHandlers = {
+  get({ _: instance }, key) {
+    const { ctx, setupState, data, props, accessCache, type, appContext } = instance;
+    if (key === "__isVue") {
+      return true;
+    }
+    let normalizedProps;
+    if (key[0] !== "$") {
+      const n = accessCache[key];
+      if (n !== void 0) {
+        switch (n) {
+          case 1 /* SETUP */:
+            return setupState[key];
+          case 2 /* DATA */:
+            return data[key];
+          case 4 /* CONTEXT */:
+            return ctx[key];
+          case 3 /* PROPS */:
+            return props[key];
+        }
+      } else if (hasSetupBinding(setupState, key)) {
+        accessCache[key] = 1 /* SETUP */;
+        return setupState[key];
+      } else if (data !== EMPTY_OBJ && hasOwn(data, key)) {
+        accessCache[key] = 2 /* DATA */;
+        return data[key];
+      } else if (
+        // only cache other properties when instance has declared (thus stable)
+        // props
+        (normalizedProps = instance.propsOptions[0]) && hasOwn(normalizedProps, key)
+      ) {
+        accessCache[key] = 3 /* PROPS */;
+        return props[key];
+      } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {
+        accessCache[key] = 4 /* CONTEXT */;
+        return ctx[key];
+      } else if (shouldCacheAccess) {
+        accessCache[key] = 0 /* OTHER */;
+      }
+    }
+    const publicGetter = publicPropertiesMap[key];
+    let cssModule, globalProperties;
+    if (publicGetter) {
+      if (key === "$attrs") {
+        track(instance, "get", key);
+        markAttrsAccessed();
+      } else if (key === "$slots") {
+        track(instance, "get", key);
+      }
+      return publicGetter(instance);
+    } else if (
+      // css module (injected by vue-loader)
+      (cssModule = type.__cssModules) && (cssModule = cssModule[key])
+    ) {
+      return cssModule;
+    } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {
+      accessCache[key] = 4 /* CONTEXT */;
+      return ctx[key];
+    } else if (
+      // global properties
+      globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key)
+    ) {
+      {
+        return globalProperties[key];
+      }
+    } else if (currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading
+    // to infinite warning loop
+    key.indexOf("__v") !== 0)) {
+      if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) {
+        warn(
+          `Property ${JSON.stringify(
+            key
+          )} must be accessed via $data because it starts with a reserved character ("$" or "_") and is not proxied on the render context.`
+        );
+      } else if (instance === currentRenderingInstance) {
+        warn(
+          `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.`
+        );
+      }
+    }
+  },
+  set({ _: instance }, key, value) {
+    const { data, setupState, ctx } = instance;
+    if (hasSetupBinding(setupState, key)) {
+      setupState[key] = value;
+      return true;
+    } else if (setupState.__isScriptSetup && hasOwn(setupState, key)) {
+      warn(`Cannot mutate <script setup> binding "${key}" from Options API.`);
+      return false;
+    } else if (data !== EMPTY_OBJ && hasOwn(data, key)) {
+      data[key] = value;
+      return true;
+    } else if (hasOwn(instance.props, key)) {
+      warn(`Attempting to mutate prop "${key}". Props are readonly.`);
+      return false;
+    }
+    if (key[0] === "$" && key.slice(1) in instance) {
+      warn(
+        `Attempting to mutate public property "${key}". Properties starting with $ are reserved and readonly.`
+      );
+      return false;
+    } else {
+      if (key in instance.appContext.config.globalProperties) {
+        Object.defineProperty(ctx, key, {
+          enumerable: true,
+          configurable: true,
+          value
+        });
+      } else {
+        ctx[key] = value;
+      }
+    }
+    return true;
+  },
+  has({
+    _: { data, setupState, accessCache, ctx, appContext, propsOptions }
+  }, key) {
+    let normalizedProps;
+    return !!accessCache[key] || data !== EMPTY_OBJ && hasOwn(data, key) || hasSetupBinding(setupState, key) || (normalizedProps = propsOptions[0]) && hasOwn(normalizedProps, key) || hasOwn(ctx, key) || hasOwn(publicPropertiesMap, key) || hasOwn(appContext.config.globalProperties, key);
+  },
+  defineProperty(target, key, descriptor) {
+    if (descriptor.get != null) {
+      target._.accessCache[key] = 0;
+    } else if (hasOwn(descriptor, "value")) {
+      this.set(target, key, descriptor.value, null);
+    }
+    return Reflect.defineProperty(target, key, descriptor);
+  }
+};
+{
+  PublicInstanceProxyHandlers.ownKeys = (target) => {
+    warn(
+      `Avoid app logic that relies on enumerating keys on a component instance. The keys will be empty in production mode to avoid performance overhead.`
+    );
+    return Reflect.ownKeys(target);
+  };
+}
+const RuntimeCompiledPublicInstanceProxyHandlers = /* @__PURE__ */ extend(
+  {},
+  PublicInstanceProxyHandlers,
+  {
+    get(target, key) {
+      if (key === Symbol.unscopables) {
+        return;
+      }
+      return PublicInstanceProxyHandlers.get(target, key, target);
+    },
+    has(_, key) {
+      const has = key[0] !== "_" && !isGloballyAllowed(key);
+      if (!has && PublicInstanceProxyHandlers.has(_, key)) {
+        warn(
+          `Property ${JSON.stringify(
+            key
+          )} should not start with _ which is a reserved prefix for Vue internals.`
+        );
+      }
+      return has;
+    }
+  }
+);
+function createDevRenderContext(instance) {
+  const target = {};
+  Object.defineProperty(target, `_`, {
+    configurable: true,
+    enumerable: false,
+    get: () => instance
+  });
+  Object.keys(publicPropertiesMap).forEach((key) => {
+    Object.defineProperty(target, key, {
+      configurable: true,
+      enumerable: false,
+      get: () => publicPropertiesMap[key](instance),
+      // intercepted by the proxy so no need for implementation,
+      // but needed to prevent set errors
+      set: NOOP
+    });
+  });
+  return target;
+}
+function exposePropsOnRenderContext(instance) {
+  const {
+    ctx,
+    propsOptions: [propsOptions]
+  } = instance;
+  if (propsOptions) {
+    Object.keys(propsOptions).forEach((key) => {
+      Object.defineProperty(ctx, key, {
+        enumerable: true,
+        configurable: true,
+        get: () => instance.props[key],
+        set: NOOP
+      });
+    });
+  }
+}
+function exposeSetupStateOnRenderContext(instance) {
+  const { ctx, setupState } = instance;
+  Object.keys(toRaw(setupState)).forEach((key) => {
+    if (!setupState.__isScriptSetup) {
+      if (isReservedPrefix(key[0])) {
+        warn(
+          `setup() return property ${JSON.stringify(
+            key
+          )} should not start with "$" or "_" which are reserved prefixes for Vue internals.`
+        );
+        return;
+      }
+      Object.defineProperty(ctx, key, {
+        enumerable: true,
+        configurable: true,
+        get: () => setupState[key],
+        set: NOOP
+      });
+    }
+  });
+}
+
+const warnRuntimeUsage = (method) => warn(
+  `${method}() is a compiler-hint helper that is only usable inside <script setup> of a single file component. Its arguments should be compiled away and passing it at runtime has no effect.`
+);
+function defineProps() {
+  {
+    warnRuntimeUsage(`defineProps`);
+  }
+  return null;
+}
+function defineEmits() {
+  {
+    warnRuntimeUsage(`defineEmits`);
+  }
+  return null;
+}
+function defineExpose(exposed) {
+  {
+    warnRuntimeUsage(`defineExpose`);
+  }
+}
+function defineOptions(options) {
+  {
+    warnRuntimeUsage(`defineOptions`);
+  }
+}
+function defineSlots() {
+  {
+    warnRuntimeUsage(`defineSlots`);
+  }
+  return null;
+}
+function defineModel() {
+  {
+    warnRuntimeUsage("defineModel");
+  }
+}
+function withDefaults(props, defaults) {
+  {
+    warnRuntimeUsage(`withDefaults`);
+  }
+  return null;
+}
+function useSlots() {
+  return getContext().slots;
+}
+function useAttrs() {
+  return getContext().attrs;
+}
+function useModel(props, name, options) {
+  const i = getCurrentInstance();
+  if (!i) {
+    warn(`useModel() called without active instance.`);
+    return ref();
+  }
+  if (!i.propsOptions[0][name]) {
+    warn(`useModel() called with prop "${name}" which is not declared.`);
+    return ref();
+  }
+  if (options && options.local) {
+    const proxy = ref(props[name]);
+    watch(
+      () => props[name],
+      (v) => proxy.value = v
+    );
+    watch(proxy, (value) => {
+      if (value !== props[name]) {
+        i.emit(`update:${name}`, value);
+      }
+    });
+    return proxy;
+  } else {
+    return {
+      __v_isRef: true,
+      get value() {
+        return props[name];
+      },
+      set value(value) {
+        i.emit(`update:${name}`, value);
+      }
+    };
+  }
+}
+function getContext() {
+  const i = getCurrentInstance();
+  if (!i) {
+    warn(`useContext() called without active instance.`);
+  }
+  return i.setupContext || (i.setupContext = createSetupContext(i));
+}
+function normalizePropsOrEmits(props) {
+  return isArray(props) ? props.reduce(
+    (normalized, p) => (normalized[p] = null, normalized),
+    {}
+  ) : props;
+}
+function mergeDefaults(raw, defaults) {
+  const props = normalizePropsOrEmits(raw);
+  for (const key in defaults) {
+    if (key.startsWith("__skip"))
+      continue;
+    let opt = props[key];
+    if (opt) {
+      if (isArray(opt) || isFunction(opt)) {
+        opt = props[key] = { type: opt, default: defaults[key] };
+      } else {
+        opt.default = defaults[key];
+      }
+    } else if (opt === null) {
+      opt = props[key] = { default: defaults[key] };
+    } else {
+      warn(`props default key "${key}" has no corresponding declaration.`);
+    }
+    if (opt && defaults[`__skip_${key}`]) {
+      opt.skipFactory = true;
+    }
+  }
+  return props;
+}
+function mergeModels(a, b) {
+  if (!a || !b)
+    return a || b;
+  if (isArray(a) && isArray(b))
+    return a.concat(b);
+  return extend({}, normalizePropsOrEmits(a), normalizePropsOrEmits(b));
+}
+function createPropsRestProxy(props, excludedKeys) {
+  const ret = {};
+  for (const key in props) {
+    if (!excludedKeys.includes(key)) {
+      Object.defineProperty(ret, key, {
+        enumerable: true,
+        get: () => props[key]
+      });
+    }
+  }
+  return ret;
+}
+function withAsyncContext(getAwaitable) {
+  const ctx = getCurrentInstance();
+  if (!ctx) {
+    warn(
+      `withAsyncContext called without active current instance. This is likely a bug.`
+    );
+  }
+  let awaitable = getAwaitable();
+  unsetCurrentInstance();
+  if (isPromise(awaitable)) {
+    awaitable = awaitable.catch((e) => {
+      setCurrentInstance(ctx);
+      throw e;
+    });
+  }
+  return [awaitable, () => setCurrentInstance(ctx)];
+}
+
+function createDuplicateChecker() {
+  const cache = /* @__PURE__ */ Object.create(null);
+  return (type, key) => {
+    if (cache[key]) {
+      warn(`${type} property "${key}" is already defined in ${cache[key]}.`);
+    } else {
+      cache[key] = type;
+    }
+  };
+}
+let shouldCacheAccess = true;
+function applyOptions(instance) {
+  const options = resolveMergedOptions(instance);
+  const publicThis = instance.proxy;
+  const ctx = instance.ctx;
+  shouldCacheAccess = false;
+  if (options.beforeCreate) {
+    callHook$1(options.beforeCreate, instance, "bc");
+  }
+  const {
+    // state
+    data: dataOptions,
+    computed: computedOptions,
+    methods,
+    watch: watchOptions,
+    provide: provideOptions,
+    inject: injectOptions,
+    // lifecycle
+    created,
+    beforeMount,
+    mounted,
+    beforeUpdate,
+    updated,
+    activated,
+    deactivated,
+    beforeDestroy,
+    beforeUnmount,
+    destroyed,
+    unmounted,
+    render,
+    renderTracked,
+    renderTriggered,
+    errorCaptured,
+    serverPrefetch,
+    // public API
+    expose,
+    inheritAttrs,
+    // assets
+    components,
+    directives,
+    filters
+  } = options;
+  const checkDuplicateProperties = createDuplicateChecker() ;
+  {
+    const [propsOptions] = instance.propsOptions;
+    if (propsOptions) {
+      for (const key in propsOptions) {
+        checkDuplicateProperties("Props" /* PROPS */, key);
+      }
+    }
+  }
+  if (injectOptions) {
+    resolveInjections(injectOptions, ctx, checkDuplicateProperties);
+  }
+  if (methods) {
+    for (const key in methods) {
+      const methodHandler = methods[key];
+      if (isFunction(methodHandler)) {
+        {
+          Object.defineProperty(ctx, key, {
+            value: methodHandler.bind(publicThis),
+            configurable: true,
+            enumerable: true,
+            writable: true
+          });
+        }
+        {
+          checkDuplicateProperties("Methods" /* METHODS */, key);
+        }
+      } else {
+        warn(
+          `Method "${key}" has type "${typeof methodHandler}" in the component definition. Did you reference the function correctly?`
+        );
+      }
+    }
+  }
+  if (dataOptions) {
+    if (!isFunction(dataOptions)) {
+      warn(
+        `The data option must be a function. Plain object usage is no longer supported.`
+      );
+    }
+    const data = dataOptions.call(publicThis, publicThis);
+    if (isPromise(data)) {
+      warn(
+        `data() returned a Promise - note data() cannot be async; If you intend to perform data fetching before component renders, use async setup() + <Suspense>.`
+      );
+    }
+    if (!isObject(data)) {
+      warn(`data() should return an object.`);
+    } else {
+      instance.data = reactive(data);
+      {
+        for (const key in data) {
+          checkDuplicateProperties("Data" /* DATA */, key);
+          if (!isReservedPrefix(key[0])) {
+            Object.defineProperty(ctx, key, {
+              configurable: true,
+              enumerable: true,
+              get: () => data[key],
+              set: NOOP
+            });
+          }
+        }
+      }
+    }
+  }
+  shouldCacheAccess = true;
+  if (computedOptions) {
+    for (const key in computedOptions) {
+      const opt = computedOptions[key];
+      const get = isFunction(opt) ? opt.bind(publicThis, publicThis) : isFunction(opt.get) ? opt.get.bind(publicThis, publicThis) : NOOP;
+      if (get === NOOP) {
+        warn(`Computed property "${key}" has no getter.`);
+      }
+      const set = !isFunction(opt) && isFunction(opt.set) ? opt.set.bind(publicThis) : () => {
+        warn(
+          `Write operation failed: computed property "${key}" is readonly.`
+        );
+      } ;
+      const c = computed({
+        get,
+        set
+      });
+      Object.defineProperty(ctx, key, {
+        enumerable: true,
+        configurable: true,
+        get: () => c.value,
+        set: (v) => c.value = v
+      });
+      {
+        checkDuplicateProperties("Computed" /* COMPUTED */, key);
+      }
+    }
+  }
+  if (watchOptions) {
+    for (const key in watchOptions) {
+      createWatcher(watchOptions[key], ctx, publicThis, key);
+    }
+  }
+  if (provideOptions) {
+    const provides = isFunction(provideOptions) ? provideOptions.call(publicThis) : provideOptions;
+    Reflect.ownKeys(provides).forEach((key) => {
+      provide(key, provides[key]);
+    });
+  }
+  if (created) {
+    callHook$1(created, instance, "c");
+  }
+  function registerLifecycleHook(register, hook) {
+    if (isArray(hook)) {
+      hook.forEach((_hook) => register(_hook.bind(publicThis)));
+    } else if (hook) {
+      register(hook.bind(publicThis));
+    }
+  }
+  registerLifecycleHook(onBeforeMount, beforeMount);
+  registerLifecycleHook(onMounted, mounted);
+  registerLifecycleHook(onBeforeUpdate, beforeUpdate);
+  registerLifecycleHook(onUpdated, updated);
+  registerLifecycleHook(onActivated, activated);
+  registerLifecycleHook(onDeactivated, deactivated);
+  registerLifecycleHook(onErrorCaptured, errorCaptured);
+  registerLifecycleHook(onRenderTracked, renderTracked);
+  registerLifecycleHook(onRenderTriggered, renderTriggered);
+  registerLifecycleHook(onBeforeUnmount, beforeUnmount);
+  registerLifecycleHook(onUnmounted, unmounted);
+  registerLifecycleHook(onServerPrefetch, serverPrefetch);
+  if (isArray(expose)) {
+    if (expose.length) {
+      const exposed = instance.exposed || (instance.exposed = {});
+      expose.forEach((key) => {
+        Object.defineProperty(exposed, key, {
+          get: () => publicThis[key],
+          set: (val) => publicThis[key] = val
+        });
+      });
+    } else if (!instance.exposed) {
+      instance.exposed = {};
+    }
+  }
+  if (render && instance.render === NOOP) {
+    instance.render = render;
+  }
+  if (inheritAttrs != null) {
+    instance.inheritAttrs = inheritAttrs;
+  }
+  if (components)
+    instance.components = components;
+  if (directives)
+    instance.directives = directives;
+}
+function resolveInjections(injectOptions, ctx, checkDuplicateProperties = NOOP) {
+  if (isArray(injectOptions)) {
+    injectOptions = normalizeInject(injectOptions);
+  }
+  for (const key in injectOptions) {
+    const opt = injectOptions[key];
+    let injected;
+    if (isObject(opt)) {
+      if ("default" in opt) {
+        injected = inject(
+          opt.from || key,
+          opt.default,
+          true
+          /* treat default function as factory */
+        );
+      } else {
+        injected = inject(opt.from || key);
+      }
+    } else {
+      injected = inject(opt);
+    }
+    if (isRef(injected)) {
+      Object.defineProperty(ctx, key, {
+        enumerable: true,
+        configurable: true,
+        get: () => injected.value,
+        set: (v) => injected.value = v
+      });
+    } else {
+      ctx[key] = injected;
+    }
+    {
+      checkDuplicateProperties("Inject" /* INJECT */, key);
+    }
+  }
+}
+function callHook$1(hook, instance, type) {
+  callWithAsyncErrorHandling(
+    isArray(hook) ? hook.map((h) => h.bind(instance.proxy)) : hook.bind(instance.proxy),
+    instance,
+    type
+  );
+}
+function createWatcher(raw, ctx, publicThis, key) {
+  const getter = key.includes(".") ? createPathGetter(publicThis, key) : () => publicThis[key];
+  if (isString(raw)) {
+    const handler = ctx[raw];
+    if (isFunction(handler)) {
+      watch(getter, handler);
+    } else {
+      warn(`Invalid watch handler specified by key "${raw}"`, handler);
+    }
+  } else if (isFunction(raw)) {
+    watch(getter, raw.bind(publicThis));
+  } else if (isObject(raw)) {
+    if (isArray(raw)) {
+      raw.forEach((r) => createWatcher(r, ctx, publicThis, key));
+    } else {
+      const handler = isFunction(raw.handler) ? raw.handler.bind(publicThis) : ctx[raw.handler];
+      if (isFunction(handler)) {
+        watch(getter, handler, raw);
+      } else {
+        warn(`Invalid watch handler specified by key "${raw.handler}"`, handler);
+      }
+    }
+  } else {
+    warn(`Invalid watch option: "${key}"`, raw);
+  }
+}
+function resolveMergedOptions(instance) {
+  const base = instance.type;
+  const { mixins, extends: extendsOptions } = base;
+  const {
+    mixins: globalMixins,
+    optionsCache: cache,
+    config: { optionMergeStrategies }
+  } = instance.appContext;
+  const cached = cache.get(base);
+  let resolved;
+  if (cached) {
+    resolved = cached;
+  } else if (!globalMixins.length && !mixins && !extendsOptions) {
+    {
+      resolved = base;
+    }
+  } else {
+    resolved = {};
+    if (globalMixins.length) {
+      globalMixins.forEach(
+        (m) => mergeOptions(resolved, m, optionMergeStrategies, true)
+      );
+    }
+    mergeOptions(resolved, base, optionMergeStrategies);
+  }
+  if (isObject(base)) {
+    cache.set(base, resolved);
+  }
+  return resolved;
+}
+function mergeOptions(to, from, strats, asMixin = false) {
+  const { mixins, extends: extendsOptions } = from;
+  if (extendsOptions) {
+    mergeOptions(to, extendsOptions, strats, true);
+  }
+  if (mixins) {
+    mixins.forEach(
+      (m) => mergeOptions(to, m, strats, true)
+    );
+  }
+  for (const key in from) {
+    if (asMixin && key === "expose") {
+      warn(
+        `"expose" option is ignored when declared in mixins or extends. It should only be declared in the base component itself.`
+      );
+    } else {
+      const strat = internalOptionMergeStrats[key] || strats && strats[key];
+      to[key] = strat ? strat(to[key], from[key]) : from[key];
+    }
+  }
+  return to;
+}
+const internalOptionMergeStrats = {
+  data: mergeDataFn,
+  props: mergeEmitsOrPropsOptions,
+  emits: mergeEmitsOrPropsOptions,
+  // objects
+  methods: mergeObjectOptions,
+  computed: mergeObjectOptions,
+  // lifecycle
+  beforeCreate: mergeAsArray$1,
+  created: mergeAsArray$1,
+  beforeMount: mergeAsArray$1,
+  mounted: mergeAsArray$1,
+  beforeUpdate: mergeAsArray$1,
+  updated: mergeAsArray$1,
+  beforeDestroy: mergeAsArray$1,
+  beforeUnmount: mergeAsArray$1,
+  destroyed: mergeAsArray$1,
+  unmounted: mergeAsArray$1,
+  activated: mergeAsArray$1,
+  deactivated: mergeAsArray$1,
+  errorCaptured: mergeAsArray$1,
+  serverPrefetch: mergeAsArray$1,
+  // assets
+  components: mergeObjectOptions,
+  directives: mergeObjectOptions,
+  // watch
+  watch: mergeWatchOptions,
+  // provide / inject
+  provide: mergeDataFn,
+  inject: mergeInject
+};
+function mergeDataFn(to, from) {
+  if (!from) {
+    return to;
+  }
+  if (!to) {
+    return from;
+  }
+  return function mergedDataFn() {
+    return (extend)(
+      isFunction(to) ? to.call(this, this) : to,
+      isFunction(from) ? from.call(this, this) : from
+    );
+  };
+}
+function mergeInject(to, from) {
+  return mergeObjectOptions(normalizeInject(to), normalizeInject(from));
+}
+function normalizeInject(raw) {
+  if (isArray(raw)) {
+    const res = {};
+    for (let i = 0; i < raw.length; i++) {
+      res[raw[i]] = raw[i];
+    }
+    return res;
+  }
+  return raw;
+}
+function mergeAsArray$1(to, from) {
+  return to ? [...new Set([].concat(to, from))] : from;
+}
+function mergeObjectOptions(to, from) {
+  return to ? extend(/* @__PURE__ */ Object.create(null), to, from) : from;
+}
+function mergeEmitsOrPropsOptions(to, from) {
+  if (to) {
+    if (isArray(to) && isArray(from)) {
+      return [.../* @__PURE__ */ new Set([...to, ...from])];
+    }
+    return extend(
+      /* @__PURE__ */ Object.create(null),
+      normalizePropsOrEmits(to),
+      normalizePropsOrEmits(from != null ? from : {})
+    );
+  } else {
+    return from;
+  }
+}
+function mergeWatchOptions(to, from) {
+  if (!to)
+    return from;
+  if (!from)
+    return to;
+  const merged = extend(/* @__PURE__ */ Object.create(null), to);
+  for (const key in from) {
+    merged[key] = mergeAsArray$1(to[key], from[key]);
+  }
+  return merged;
+}
+
+function createAppContext() {
+  return {
+    app: null,
+    config: {
+      isNativeTag: NO,
+      performance: false,
+      globalProperties: {},
+      optionMergeStrategies: {},
+      errorHandler: void 0,
+      warnHandler: void 0,
+      compilerOptions: {}
+    },
+    mixins: [],
+    components: {},
+    directives: {},
+    provides: /* @__PURE__ */ Object.create(null),
+    optionsCache: /* @__PURE__ */ new WeakMap(),
+    propsCache: /* @__PURE__ */ new WeakMap(),
+    emitsCache: /* @__PURE__ */ new WeakMap()
+  };
+}
+let uid$1 = 0;
+function createAppAPI(render, hydrate) {
+  return function createApp(rootComponent, rootProps = null) {
+    if (!isFunction(rootComponent)) {
+      rootComponent = extend({}, rootComponent);
+    }
+    if (rootProps != null && !isObject(rootProps)) {
+      warn(`root props passed to app.mount() must be an object.`);
+      rootProps = null;
+    }
+    const context = createAppContext();
+    {
+      Object.defineProperty(context.config, "unwrapInjectedRef", {
+        get() {
+          return true;
+        },
+        set() {
+          warn(
+            `app.config.unwrapInjectedRef has been deprecated. 3.3 now always unwraps injected refs in Options API.`
+          );
+        }
+      });
+    }
+    const installedPlugins = /* @__PURE__ */ new WeakSet();
+    let isMounted = false;
+    const app = context.app = {
+      _uid: uid$1++,
+      _component: rootComponent,
+      _props: rootProps,
+      _container: null,
+      _context: context,
+      _instance: null,
+      version,
+      get config() {
+        return context.config;
+      },
+      set config(v) {
+        {
+          warn(
+            `app.config cannot be replaced. Modify individual options instead.`
+          );
+        }
+      },
+      use(plugin, ...options) {
+        if (installedPlugins.has(plugin)) {
+          warn(`Plugin has already been applied to target app.`);
+        } else if (plugin && isFunction(plugin.install)) {
+          installedPlugins.add(plugin);
+          plugin.install(app, ...options);
+        } else if (isFunction(plugin)) {
+          installedPlugins.add(plugin);
+          plugin(app, ...options);
+        } else {
+          warn(
+            `A plugin must either be a function or an object with an "install" function.`
+          );
+        }
+        return app;
+      },
+      mixin(mixin) {
+        {
+          if (!context.mixins.includes(mixin)) {
+            context.mixins.push(mixin);
+          } else {
+            warn(
+              "Mixin has already been applied to target app" + (mixin.name ? `: ${mixin.name}` : "")
+            );
+          }
+        }
+        return app;
+      },
+      component(name, component) {
+        {
+          validateComponentName(name, context.config);
+        }
+        if (!component) {
+          return context.components[name];
+        }
+        if (context.components[name]) {
+          warn(`Component "${name}" has already been registered in target app.`);
+        }
+        context.components[name] = component;
+        return app;
+      },
+      directive(name, directive) {
+        {
+          validateDirectiveName(name);
+        }
+        if (!directive) {
+          return context.directives[name];
+        }
+        if (context.directives[name]) {
+          warn(`Directive "${name}" has already been registered in target app.`);
+        }
+        context.directives[name] = directive;
+        return app;
+      },
+      mount(rootContainer, isHydrate, isSVG) {
+        if (!isMounted) {
+          if (rootContainer.__vue_app__) {
+            warn(
+              `There is already an app instance mounted on the host container.
+ If you want to mount another app on the same host container, you need to unmount the previous app by calling \`app.unmount()\` first.`
+            );
+          }
+          const vnode = createVNode(rootComponent, rootProps);
+          vnode.appContext = context;
+          {
+            context.reload = () => {
+              render(cloneVNode(vnode), rootContainer, isSVG);
+            };
+          }
+          if (isHydrate && hydrate) {
+            hydrate(vnode, rootContainer);
+          } else {
+            render(vnode, rootContainer, isSVG);
+          }
+          isMounted = true;
+          app._container = rootContainer;
+          rootContainer.__vue_app__ = app;
+          {
+            app._instance = vnode.component;
+            devtoolsInitApp(app, version);
+          }
+          return getExposeProxy(vnode.component) || vnode.component.proxy;
+        } else {
+          warn(
+            `App has already been mounted.
+If you want to remount the same app, move your app creation logic into a factory function and create fresh app instances for each mount - e.g. \`const createMyApp = () => createApp(App)\``
+          );
+        }
+      },
+      unmount() {
+        if (isMounted) {
+          render(null, app._container);
+          {
+            app._instance = null;
+            devtoolsUnmountApp(app);
+          }
+          delete app._container.__vue_app__;
+        } else {
+          warn(`Cannot unmount an app that is not mounted.`);
+        }
+      },
+      provide(key, value) {
+        if (key in context.provides) {
+          warn(
+            `App already provides property with key "${String(key)}". It will be overwritten with the new value.`
+          );
+        }
+        context.provides[key] = value;
+        return app;
+      },
+      runWithContext(fn) {
+        currentApp = app;
+        try {
+          return fn();
+        } finally {
+          currentApp = null;
+        }
+      }
+    };
+    return app;
+  };
+}
+let currentApp = null;
+
+function provide(key, value) {
+  if (!currentInstance) {
+    {
+      warn(`provide() can only be used inside setup().`);
+    }
+  } else {
+    let provides = currentInstance.provides;
+    const parentProvides = currentInstance.parent && currentInstance.parent.provides;
+    if (parentProvides === provides) {
+      provides = currentInstance.provides = Object.create(parentProvides);
+    }
+    provides[key] = value;
+  }
+}
+function inject(key, defaultValue, treatDefaultAsFactory = false) {
+  const instance = currentInstance || currentRenderingInstance;
+  if (instance || currentApp) {
+    const provides = instance ? instance.parent == null ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : currentApp._context.provides;
+    if (provides && key in provides) {
+      return provides[key];
+    } else if (arguments.length > 1) {
+      return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue;
+    } else {
+      warn(`injection "${String(key)}" not found.`);
+    }
+  } else {
+    warn(`inject() can only be used inside setup() or functional components.`);
+  }
+}
+function hasInjectionContext() {
+  return !!(currentInstance || currentRenderingInstance || currentApp);
+}
+
+function initProps(instance, rawProps, isStateful, isSSR = false) {
+  const props = {};
+  const attrs = {};
+  def(attrs, InternalObjectKey, 1);
+  instance.propsDefaults = /* @__PURE__ */ Object.create(null);
+  setFullProps(instance, rawProps, props, attrs);
+  for (const key in instance.propsOptions[0]) {
+    if (!(key in props)) {
+      props[key] = void 0;
+    }
+  }
+  {
+    validateProps(rawProps || {}, props, instance);
+  }
+  if (isStateful) {
+    instance.props = isSSR ? props : shallowReactive(props);
+  } else {
+    if (!instance.type.props) {
+      instance.props = attrs;
+    } else {
+      instance.props = props;
+    }
+  }
+  instance.attrs = attrs;
+}
+function isInHmrContext(instance) {
+  while (instance) {
+    if (instance.type.__hmrId)
+      return true;
+    instance = instance.parent;
+  }
+}
+function updateProps(instance, rawProps, rawPrevProps, optimized) {
+  const {
+    props,
+    attrs,
+    vnode: { patchFlag }
+  } = instance;
+  const rawCurrentProps = toRaw(props);
+  const [options] = instance.propsOptions;
+  let hasAttrsChanged = false;
+  if (
+    // always force full diff in dev
+    // - #1942 if hmr is enabled with sfc component
+    // - vite#872 non-sfc component used by sfc component
+    !isInHmrContext(instance) && (optimized || patchFlag > 0) && !(patchFlag & 16)
+  ) {
+    if (patchFlag & 8) {
+      const propsToUpdate = instance.vnode.dynamicProps;
+      for (let i = 0; i < propsToUpdate.length; i++) {
+        let key = propsToUpdate[i];
+        if (isEmitListener(instance.emitsOptions, key)) {
+          continue;
+        }
+        const value = rawProps[key];
+        if (options) {
+          if (hasOwn(attrs, key)) {
+            if (value !== attrs[key]) {
+              attrs[key] = value;
+              hasAttrsChanged = true;
+            }
+          } else {
+            const camelizedKey = camelize(key);
+            props[camelizedKey] = resolvePropValue(
+              options,
+              rawCurrentProps,
+              camelizedKey,
+              value,
+              instance,
+              false
+              /* isAbsent */
+            );
+          }
+        } else {
+          if (value !== attrs[key]) {
+            attrs[key] = value;
+            hasAttrsChanged = true;
+          }
+        }
+      }
+    }
+  } else {
+    if (setFullProps(instance, rawProps, props, attrs)) {
+      hasAttrsChanged = true;
+    }
+    let kebabKey;
+    for (const key in rawCurrentProps) {
+      if (!rawProps || // for camelCase
+      !hasOwn(rawProps, key) && // it's possible the original props was passed in as kebab-case
+      // and converted to camelCase (#955)
+      ((kebabKey = hyphenate(key)) === key || !hasOwn(rawProps, kebabKey))) {
+        if (options) {
+          if (rawPrevProps && // for camelCase
+          (rawPrevProps[key] !== void 0 || // for kebab-case
+          rawPrevProps[kebabKey] !== void 0)) {
+            props[key] = resolvePropValue(
+              options,
+              rawCurrentProps,
+              key,
+              void 0,
+              instance,
+              true
+              /* isAbsent */
+            );
+          }
+        } else {
+          delete props[key];
+        }
+      }
+    }
+    if (attrs !== rawCurrentProps) {
+      for (const key in attrs) {
+        if (!rawProps || !hasOwn(rawProps, key) && true) {
+          delete attrs[key];
+          hasAttrsChanged = true;
+        }
+      }
+    }
+  }
+  if (hasAttrsChanged) {
+    trigger(instance, "set", "$attrs");
+  }
+  {
+    validateProps(rawProps || {}, props, instance);
+  }
+}
+function setFullProps(instance, rawProps, props, attrs) {
+  const [options, needCastKeys] = instance.propsOptions;
+  let hasAttrsChanged = false;
+  let rawCastValues;
+  if (rawProps) {
+    for (let key in rawProps) {
+      if (isReservedProp(key)) {
+        continue;
+      }
+      const value = rawProps[key];
+      let camelKey;
+      if (options && hasOwn(options, camelKey = camelize(key))) {
+        if (!needCastKeys || !needCastKeys.includes(camelKey)) {
+          props[camelKey] = value;
+        } else {
+          (rawCastValues || (rawCastValues = {}))[camelKey] = value;
+        }
+      } else if (!isEmitListener(instance.emitsOptions, key)) {
+        if (!(key in attrs) || value !== attrs[key]) {
+          attrs[key] = value;
+          hasAttrsChanged = true;
+        }
+      }
+    }
+  }
+  if (needCastKeys) {
+    const rawCurrentProps = toRaw(props);
+    const castValues = rawCastValues || EMPTY_OBJ;
+    for (let i = 0; i < needCastKeys.length; i++) {
+      const key = needCastKeys[i];
+      props[key] = resolvePropValue(
+        options,
+        rawCurrentProps,
+        key,
+        castValues[key],
+        instance,
+        !hasOwn(castValues, key)
+      );
+    }
+  }
+  return hasAttrsChanged;
+}
+function resolvePropValue(options, props, key, value, instance, isAbsent) {
+  const opt = options[key];
+  if (opt != null) {
+    const hasDefault = hasOwn(opt, "default");
+    if (hasDefault && value === void 0) {
+      const defaultValue = opt.default;
+      if (opt.type !== Function && !opt.skipFactory && isFunction(defaultValue)) {
+        const { propsDefaults } = instance;
+        if (key in propsDefaults) {
+          value = propsDefaults[key];
+        } else {
+          setCurrentInstance(instance);
+          value = propsDefaults[key] = defaultValue.call(
+            null,
+            props
+          );
+          unsetCurrentInstance();
+        }
+      } else {
+        value = defaultValue;
+      }
+    }
+    if (opt[0 /* shouldCast */]) {
+      if (isAbsent && !hasDefault) {
+        value = false;
+      } else if (opt[1 /* shouldCastTrue */] && (value === "" || value === hyphenate(key))) {
+        value = true;
+      }
+    }
+  }
+  return value;
+}
+function normalizePropsOptions(comp, appContext, asMixin = false) {
+  const cache = appContext.propsCache;
+  const cached = cache.get(comp);
+  if (cached) {
+    return cached;
+  }
+  const raw = comp.props;
+  const normalized = {};
+  const needCastKeys = [];
+  let hasExtends = false;
+  if (!isFunction(comp)) {
+    const extendProps = (raw2) => {
+      hasExtends = true;
+      const [props, keys] = normalizePropsOptions(raw2, appContext, true);
+      extend(normalized, props);
+      if (keys)
+        needCastKeys.push(...keys);
+    };
+    if (!asMixin && appContext.mixins.length) {
+      appContext.mixins.forEach(extendProps);
+    }
+    if (comp.extends) {
+      extendProps(comp.extends);
+    }
+    if (comp.mixins) {
+      comp.mixins.forEach(extendProps);
+    }
+  }
+  if (!raw && !hasExtends) {
+    if (isObject(comp)) {
+      cache.set(comp, EMPTY_ARR);
+    }
+    return EMPTY_ARR;
+  }
+  if (isArray(raw)) {
+    for (let i = 0; i < raw.length; i++) {
+      if (!isString(raw[i])) {
+        warn(`props must be strings when using array syntax.`, raw[i]);
+      }
+      const normalizedKey = camelize(raw[i]);
+      if (validatePropName(normalizedKey)) {
+        normalized[normalizedKey] = EMPTY_OBJ;
+      }
+    }
+  } else if (raw) {
+    if (!isObject(raw)) {
+      warn(`invalid props options`, raw);
+    }
+    for (const key in raw) {
+      const normalizedKey = camelize(key);
+      if (validatePropName(normalizedKey)) {
+        const opt = raw[key];
+        const prop = normalized[normalizedKey] = isArray(opt) || isFunction(opt) ? { type: opt } : extend({}, opt);
+        if (prop) {
+          const booleanIndex = getTypeIndex(Boolean, prop.type);
+          const stringIndex = getTypeIndex(String, prop.type);
+          prop[0 /* shouldCast */] = booleanIndex > -1;
+          prop[1 /* shouldCastTrue */] = stringIndex < 0 || booleanIndex < stringIndex;
+          if (booleanIndex > -1 || hasOwn(prop, "default")) {
+            needCastKeys.push(normalizedKey);
+          }
+        }
+      }
+    }
+  }
+  const res = [normalized, needCastKeys];
+  if (isObject(comp)) {
+    cache.set(comp, res);
+  }
+  return res;
+}
+function validatePropName(key) {
+  if (key[0] !== "$") {
+    return true;
+  } else {
+    warn(`Invalid prop name: "${key}" is a reserved property.`);
+  }
+  return false;
+}
+function getType(ctor) {
+  const match = ctor && ctor.toString().match(/^\s*(function|class) (\w+)/);
+  return match ? match[2] : ctor === null ? "null" : "";
+}
+function isSameType(a, b) {
+  return getType(a) === getType(b);
+}
+function getTypeIndex(type, expectedTypes) {
+  if (isArray(expectedTypes)) {
+    return expectedTypes.findIndex((t) => isSameType(t, type));
+  } else if (isFunction(expectedTypes)) {
+    return isSameType(expectedTypes, type) ? 0 : -1;
+  }
+  return -1;
+}
+function validateProps(rawProps, props, instance) {
+  const resolvedValues = toRaw(props);
+  const options = instance.propsOptions[0];
+  for (const key in options) {
+    let opt = options[key];
+    if (opt == null)
+      continue;
+    validateProp(
+      key,
+      resolvedValues[key],
+      opt,
+      !hasOwn(rawProps, key) && !hasOwn(rawProps, hyphenate(key))
+    );
+  }
+}
+function validateProp(name, value, prop, isAbsent) {
+  const { type, required, validator, skipCheck } = prop;
+  if (required && isAbsent) {
+    warn('Missing required prop: "' + name + '"');
+    return;
+  }
+  if (value == null && !required) {
+    return;
+  }
+  if (type != null && type !== true && !skipCheck) {
+    let isValid = false;
+    const types = isArray(type) ? type : [type];
+    const expectedTypes = [];
+    for (let i = 0; i < types.length && !isValid; i++) {
+      const { valid, expectedType } = assertType(value, types[i]);
+      expectedTypes.push(expectedType || "");
+      isValid = valid;
+    }
+    if (!isValid) {
+      warn(getInvalidTypeMessage(name, value, expectedTypes));
+      return;
+    }
+  }
+  if (validator && !validator(value)) {
+    warn('Invalid prop: custom validator check failed for prop "' + name + '".');
+  }
+}
+const isSimpleType = /* @__PURE__ */ makeMap(
+  "String,Number,Boolean,Function,Symbol,BigInt"
+);
+function assertType(value, type) {
+  let valid;
+  const expectedType = getType(type);
+  if (isSimpleType(expectedType)) {
+    const t = typeof value;
+    valid = t === expectedType.toLowerCase();
+    if (!valid && t === "object") {
+      valid = value instanceof type;
+    }
+  } else if (expectedType === "Object") {
+    valid = isObject(value);
+  } else if (expectedType === "Array") {
+    valid = isArray(value);
+  } else if (expectedType === "null") {
+    valid = value === null;
+  } else {
+    valid = value instanceof type;
+  }
+  return {
+    valid,
+    expectedType
+  };
+}
+function getInvalidTypeMessage(name, value, expectedTypes) {
+  let message = `Invalid prop: type check failed for prop "${name}". Expected ${expectedTypes.map(capitalize).join(" | ")}`;
+  const expectedType = expectedTypes[0];
+  const receivedType = toRawType(value);
+  const expectedValue = styleValue(value, expectedType);
+  const receivedValue = styleValue(value, receivedType);
+  if (expectedTypes.length === 1 && isExplicable(expectedType) && !isBoolean(expectedType, receivedType)) {
+    message += ` with value ${expectedValue}`;
+  }
+  message += `, got ${receivedType} `;
+  if (isExplicable(receivedType)) {
+    message += `with value ${receivedValue}.`;
+  }
+  return message;
+}
+function styleValue(value, type) {
+  if (type === "String") {
+    return `"${value}"`;
+  } else if (type === "Number") {
+    return `${Number(value)}`;
+  } else {
+    return `${value}`;
+  }
+}
+function isExplicable(type) {
+  const explicitTypes = ["string", "number", "boolean"];
+  return explicitTypes.some((elem) => type.toLowerCase() === elem);
+}
+function isBoolean(...args) {
+  return args.some((elem) => elem.toLowerCase() === "boolean");
+}
+
+const isInternalKey = (key) => key[0] === "_" || key === "$stable";
+const normalizeSlotValue = (value) => isArray(value) ? value.map(normalizeVNode) : [normalizeVNode(value)];
+const normalizeSlot = (key, rawSlot, ctx) => {
+  if (rawSlot._n) {
+    return rawSlot;
+  }
+  const normalized = withCtx((...args) => {
+    if (currentInstance) {
+      warn(
+        `Slot "${key}" invoked outside of the render function: this will not track dependencies used in the slot. Invoke the slot function inside the render function instead.`
+      );
+    }
+    return normalizeSlotValue(rawSlot(...args));
+  }, ctx);
+  normalized._c = false;
+  return normalized;
+};
+const normalizeObjectSlots = (rawSlots, slots, instance) => {
+  const ctx = rawSlots._ctx;
+  for (const key in rawSlots) {
+    if (isInternalKey(key))
+      continue;
+    const value = rawSlots[key];
+    if (isFunction(value)) {
+      slots[key] = normalizeSlot(key, value, ctx);
+    } else if (value != null) {
+      {
+        warn(
+          `Non-function value encountered for slot "${key}". Prefer function slots for better performance.`
+        );
+      }
+      const normalized = normalizeSlotValue(value);
+      slots[key] = () => normalized;
+    }
+  }
+};
+const normalizeVNodeSlots = (instance, children) => {
+  if (!isKeepAlive(instance.vnode) && true) {
+    warn(
+      `Non-function value encountered for default slot. Prefer function slots for better performance.`
+    );
+  }
+  const normalized = normalizeSlotValue(children);
+  instance.slots.default = () => normalized;
+};
+const initSlots = (instance, children) => {
+  if (instance.vnode.shapeFlag & 32) {
+    const type = children._;
+    if (type) {
+      instance.slots = toRaw(children);
+      def(children, "_", type);
+    } else {
+      normalizeObjectSlots(
+        children,
+        instance.slots = {});
+    }
+  } else {
+    instance.slots = {};
+    if (children) {
+      normalizeVNodeSlots(instance, children);
+    }
+  }
+  def(instance.slots, InternalObjectKey, 1);
+};
+const updateSlots = (instance, children, optimized) => {
+  const { vnode, slots } = instance;
+  let needDeletionCheck = true;
+  let deletionComparisonTarget = EMPTY_OBJ;
+  if (vnode.shapeFlag & 32) {
+    const type = children._;
+    if (type) {
+      if (isHmrUpdating) {
+        extend(slots, children);
+        trigger(instance, "set", "$slots");
+      } else if (optimized && type === 1) {
+        needDeletionCheck = false;
+      } else {
+        extend(slots, children);
+        if (!optimized && type === 1) {
+          delete slots._;
+        }
+      }
+    } else {
+      needDeletionCheck = !children.$stable;
+      normalizeObjectSlots(children, slots);
+    }
+    deletionComparisonTarget = children;
+  } else if (children) {
+    normalizeVNodeSlots(instance, children);
+    deletionComparisonTarget = { default: 1 };
+  }
+  if (needDeletionCheck) {
+    for (const key in slots) {
+      if (!isInternalKey(key) && deletionComparisonTarget[key] == null) {
+        delete slots[key];
+      }
+    }
+  }
+};
+
+function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) {
+  if (isArray(rawRef)) {
+    rawRef.forEach(
+      (r, i) => setRef(
+        r,
+        oldRawRef && (isArray(oldRawRef) ? oldRawRef[i] : oldRawRef),
+        parentSuspense,
+        vnode,
+        isUnmount
+      )
+    );
+    return;
+  }
+  if (isAsyncWrapper(vnode) && !isUnmount) {
+    return;
+  }
+  const refValue = vnode.shapeFlag & 4 ? getExposeProxy(vnode.component) || vnode.component.proxy : vnode.el;
+  const value = isUnmount ? null : refValue;
+  const { i: owner, r: ref } = rawRef;
+  if (!owner) {
+    warn(
+      `Missing ref owner context. ref cannot be used on hoisted vnodes. A vnode with ref must be created inside the render function.`
+    );
+    return;
+  }
+  const oldRef = oldRawRef && oldRawRef.r;
+  const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs;
+  const setupState = owner.setupState;
+  if (oldRef != null && oldRef !== ref) {
+    if (isString(oldRef)) {
+      refs[oldRef] = null;
+      if (hasOwn(setupState, oldRef)) {
+        setupState[oldRef] = null;
+      }
+    } else if (isRef(oldRef)) {
+      oldRef.value = null;
+    }
+  }
+  if (isFunction(ref)) {
+    callWithErrorHandling(ref, owner, 12, [value, refs]);
+  } else {
+    const _isString = isString(ref);
+    const _isRef = isRef(ref);
+    if (_isString || _isRef) {
+      const doSet = () => {
+        if (rawRef.f) {
+          const existing = _isString ? hasOwn(setupState, ref) ? setupState[ref] : refs[ref] : ref.value;
+          if (isUnmount) {
+            isArray(existing) && remove(existing, refValue);
+          } else {
+            if (!isArray(existing)) {
+              if (_isString) {
+                refs[ref] = [refValue];
+                if (hasOwn(setupState, ref)) {
+                  setupState[ref] = refs[ref];
+                }
+              } else {
+                ref.value = [refValue];
+                if (rawRef.k)
+                  refs[rawRef.k] = ref.value;
+              }
+            } else if (!existing.includes(refValue)) {
+              existing.push(refValue);
+            }
+          }
+        } else if (_isString) {
+          refs[ref] = value;
+          if (hasOwn(setupState, ref)) {
+            setupState[ref] = value;
+          }
+        } else if (_isRef) {
+          ref.value = value;
+          if (rawRef.k)
+            refs[rawRef.k] = value;
+        } else {
+          warn("Invalid template ref type:", ref, `(${typeof ref})`);
+        }
+      };
+      if (value) {
+        doSet.id = -1;
+        queuePostRenderEffect(doSet, parentSuspense);
+      } else {
+        doSet();
+      }
+    } else {
+      warn("Invalid template ref type:", ref, `(${typeof ref})`);
+    }
+  }
+}
+
+let hasMismatch = false;
+const isSVGContainer = (container) => /svg/.test(container.namespaceURI) && container.tagName !== "foreignObject";
+const isComment = (node) => node.nodeType === 8 /* COMMENT */;
+function createHydrationFunctions(rendererInternals) {
+  const {
+    mt: mountComponent,
+    p: patch,
+    o: {
+      patchProp,
+      createText,
+      nextSibling,
+      parentNode,
+      remove,
+      insert,
+      createComment
+    }
+  } = rendererInternals;
+  const hydrate = (vnode, container) => {
+    if (!container.hasChildNodes()) {
+      warn(
+        `Attempting to hydrate existing markup but container is empty. Performing full mount instead.`
+      );
+      patch(null, vnode, container);
+      flushPostFlushCbs();
+      container._vnode = vnode;
+      return;
+    }
+    hasMismatch = false;
+    hydrateNode(container.firstChild, vnode, null, null, null);
+    flushPostFlushCbs();
+    container._vnode = vnode;
+    if (hasMismatch && true) {
+      console.error(`Hydration completed but contains mismatches.`);
+    }
+  };
+  const hydrateNode = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized = false) => {
+    const isFragmentStart = isComment(node) && node.data === "[";
+    const onMismatch = () => handleMismatch(
+      node,
+      vnode,
+      parentComponent,
+      parentSuspense,
+      slotScopeIds,
+      isFragmentStart
+    );
+    const { type, ref, shapeFlag, patchFlag } = vnode;
+    let domType = node.nodeType;
+    vnode.el = node;
+    if (patchFlag === -2) {
+      optimized = false;
+      vnode.dynamicChildren = null;
+    }
+    let nextNode = null;
+    switch (type) {
+      case Text:
+        if (domType !== 3 /* TEXT */) {
+          if (vnode.children === "") {
+            insert(vnode.el = createText(""), parentNode(node), node);
+            nextNode = node;
+          } else {
+            nextNode = onMismatch();
+          }
+        } else {
+          if (node.data !== vnode.children) {
+            hasMismatch = true;
+            warn(
+              `Hydration text mismatch:
+- Server rendered: ${JSON.stringify(
+                node.data
+              )}
+- Client rendered: ${JSON.stringify(vnode.children)}`
+            );
+            node.data = vnode.children;
+          }
+          nextNode = nextSibling(node);
+        }
+        break;
+      case Comment:
+        if (domType !== 8 /* COMMENT */ || isFragmentStart) {
+          nextNode = onMismatch();
+        } else {
+          nextNode = nextSibling(node);
+        }
+        break;
+      case Static:
+        if (isFragmentStart) {
+          node = nextSibling(node);
+          domType = node.nodeType;
+        }
+        if (domType === 1 /* ELEMENT */ || domType === 3 /* TEXT */) {
+          nextNode = node;
+          const needToAdoptContent = !vnode.children.length;
+          for (let i = 0; i < vnode.staticCount; i++) {
+            if (needToAdoptContent)
+              vnode.children += nextNode.nodeType === 1 /* ELEMENT */ ? nextNode.outerHTML : nextNode.data;
+            if (i === vnode.staticCount - 1) {
+              vnode.anchor = nextNode;
+            }
+            nextNode = nextSibling(nextNode);
+          }
+          return isFragmentStart ? nextSibling(nextNode) : nextNode;
+        } else {
+          onMismatch();
+        }
+        break;
+      case Fragment:
+        if (!isFragmentStart) {
+          nextNode = onMismatch();
+        } else {
+          nextNode = hydrateFragment(
+            node,
+            vnode,
+            parentComponent,
+            parentSuspense,
+            slotScopeIds,
+            optimized
+          );
+        }
+        break;
+      default:
+        if (shapeFlag & 1) {
+          if (domType !== 1 /* ELEMENT */ || vnode.type.toLowerCase() !== node.tagName.toLowerCase()) {
+            nextNode = onMismatch();
+          } else {
+            nextNode = hydrateElement(
+              node,
+              vnode,
+              parentComponent,
+              parentSuspense,
+              slotScopeIds,
+              optimized
+            );
+          }
+        } else if (shapeFlag & 6) {
+          vnode.slotScopeIds = slotScopeIds;
+          const container = parentNode(node);
+          mountComponent(
+            vnode,
+            container,
+            null,
+            parentComponent,
+            parentSuspense,
+            isSVGContainer(container),
+            optimized
+          );
+          nextNode = isFragmentStart ? locateClosingAsyncAnchor(node) : nextSibling(node);
+          if (nextNode && isComment(nextNode) && nextNode.data === "teleport end") {
+            nextNode = nextSibling(nextNode);
+          }
+          if (isAsyncWrapper(vnode)) {
+            let subTree;
+            if (isFragmentStart) {
+              subTree = createVNode(Fragment);
+              subTree.anchor = nextNode ? nextNode.previousSibling : container.lastChild;
+            } else {
+              subTree = node.nodeType === 3 ? createTextVNode("") : createVNode("div");
+            }
+            subTree.el = node;
+            vnode.component.subTree = subTree;
+          }
+        } else if (shapeFlag & 64) {
+          if (domType !== 8 /* COMMENT */) {
+            nextNode = onMismatch();
+          } else {
+            nextNode = vnode.type.hydrate(
+              node,
+              vnode,
+              parentComponent,
+              parentSuspense,
+              slotScopeIds,
+              optimized,
+              rendererInternals,
+              hydrateChildren
+            );
+          }
+        } else if (shapeFlag & 128) {
+          nextNode = vnode.type.hydrate(
+            node,
+            vnode,
+            parentComponent,
+            parentSuspense,
+            isSVGContainer(parentNode(node)),
+            slotScopeIds,
+            optimized,
+            rendererInternals,
+            hydrateNode
+          );
+        } else {
+          warn("Invalid HostVNode type:", type, `(${typeof type})`);
+        }
+    }
+    if (ref != null) {
+      setRef(ref, null, parentSuspense, vnode);
+    }
+    return nextNode;
+  };
+  const hydrateElement = (el, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {
+    optimized = optimized || !!vnode.dynamicChildren;
+    const { type, props, patchFlag, shapeFlag, dirs } = vnode;
+    const forcePatchValue = type === "input" && dirs || type === "option";
+    {
+      if (dirs) {
+        invokeDirectiveHook(vnode, null, parentComponent, "created");
+      }
+      if (props) {
+        if (forcePatchValue || !optimized || patchFlag & (16 | 32)) {
+          for (const key in props) {
+            if (forcePatchValue && key.endsWith("value") || isOn(key) && !isReservedProp(key)) {
+              patchProp(
+                el,
+                key,
+                null,
+                props[key],
+                false,
+                void 0,
+                parentComponent
+              );
+            }
+          }
+        } else if (props.onClick) {
+          patchProp(
+            el,
+            "onClick",
+            null,
+            props.onClick,
+            false,
+            void 0,
+            parentComponent
+          );
+        }
+      }
+      let vnodeHooks;
+      if (vnodeHooks = props && props.onVnodeBeforeMount) {
+        invokeVNodeHook(vnodeHooks, parentComponent, vnode);
+      }
+      if (dirs) {
+        invokeDirectiveHook(vnode, null, parentComponent, "beforeMount");
+      }
+      if ((vnodeHooks = props && props.onVnodeMounted) || dirs) {
+        queueEffectWithSuspense(() => {
+          vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode);
+          dirs && invokeDirectiveHook(vnode, null, parentComponent, "mounted");
+        }, parentSuspense);
+      }
+      if (shapeFlag & 16 && // skip if element has innerHTML / textContent
+      !(props && (props.innerHTML || props.textContent))) {
+        let next = hydrateChildren(
+          el.firstChild,
+          vnode,
+          el,
+          parentComponent,
+          parentSuspense,
+          slotScopeIds,
+          optimized
+        );
+        let hasWarned = false;
+        while (next) {
+          hasMismatch = true;
+          if (!hasWarned) {
+            warn(
+              `Hydration children mismatch in <${vnode.type}>: server rendered element contains more child nodes than client vdom.`
+            );
+            hasWarned = true;
+          }
+          const cur = next;
+          next = next.nextSibling;
+          remove(cur);
+        }
+      } else if (shapeFlag & 8) {
+        if (el.textContent !== vnode.children) {
+          hasMismatch = true;
+          warn(
+            `Hydration text content mismatch in <${vnode.type}>:
+- Server rendered: ${el.textContent}
+- Client rendered: ${vnode.children}`
+          );
+          el.textContent = vnode.children;
+        }
+      }
+    }
+    return el.nextSibling;
+  };
+  const hydrateChildren = (node, parentVNode, container, parentComponent, parentSuspense, slotScopeIds, optimized) => {
+    optimized = optimized || !!parentVNode.dynamicChildren;
+    const children = parentVNode.children;
+    const l = children.length;
+    let hasWarned = false;
+    for (let i = 0; i < l; i++) {
+      const vnode = optimized ? children[i] : children[i] = normalizeVNode(children[i]);
+      if (node) {
+        node = hydrateNode(
+          node,
+          vnode,
+          parentComponent,
+          parentSuspense,
+          slotScopeIds,
+          optimized
+        );
+      } else if (vnode.type === Text && !vnode.children) {
+        continue;
+      } else {
+        hasMismatch = true;
+        if (!hasWarned) {
+          warn(
+            `Hydration children mismatch in <${container.tagName.toLowerCase()}>: server rendered element contains fewer child nodes than client vdom.`
+          );
+          hasWarned = true;
+        }
+        patch(
+          null,
+          vnode,
+          container,
+          null,
+          parentComponent,
+          parentSuspense,
+          isSVGContainer(container),
+          slotScopeIds
+        );
+      }
+    }
+    return node;
+  };
+  const hydrateFragment = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {
+    const { slotScopeIds: fragmentSlotScopeIds } = vnode;
+    if (fragmentSlotScopeIds) {
+      slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;
+    }
+    const container = parentNode(node);
+    const next = hydrateChildren(
+      nextSibling(node),
+      vnode,
+      container,
+      parentComponent,
+      parentSuspense,
+      slotScopeIds,
+      optimized
+    );
+    if (next && isComment(next) && next.data === "]") {
+      return nextSibling(vnode.anchor = next);
+    } else {
+      hasMismatch = true;
+      insert(vnode.anchor = createComment(`]`), container, next);
+      return next;
+    }
+  };
+  const handleMismatch = (node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragment) => {
+    hasMismatch = true;
+    warn(
+      `Hydration node mismatch:
+- Client vnode:`,
+      vnode.type,
+      `
+- Server rendered DOM:`,
+      node,
+      node.nodeType === 3 /* TEXT */ ? `(text)` : isComment(node) && node.data === "[" ? `(start of fragment)` : ``
+    );
+    vnode.el = null;
+    if (isFragment) {
+      const end = locateClosingAsyncAnchor(node);
+      while (true) {
+        const next2 = nextSibling(node);
+        if (next2 && next2 !== end) {
+          remove(next2);
+        } else {
+          break;
+        }
+      }
+    }
+    const next = nextSibling(node);
+    const container = parentNode(node);
+    remove(node);
+    patch(
+      null,
+      vnode,
+      container,
+      next,
+      parentComponent,
+      parentSuspense,
+      isSVGContainer(container),
+      slotScopeIds
+    );
+    return next;
+  };
+  const locateClosingAsyncAnchor = (node) => {
+    let match = 0;
+    while (node) {
+      node = nextSibling(node);
+      if (node && isComment(node)) {
+        if (node.data === "[")
+          match++;
+        if (node.data === "]") {
+          if (match === 0) {
+            return nextSibling(node);
+          } else {
+            match--;
+          }
+        }
+      }
+    }
+    return node;
+  };
+  return [hydrate, hydrateNode];
+}
+
+let supported;
+let perf;
+function startMeasure(instance, type) {
+  if (instance.appContext.config.performance && isSupported()) {
+    perf.mark(`vue-${type}-${instance.uid}`);
+  }
+  {
+    devtoolsPerfStart(instance, type, isSupported() ? perf.now() : Date.now());
+  }
+}
+function endMeasure(instance, type) {
+  if (instance.appContext.config.performance && isSupported()) {
+    const startTag = `vue-${type}-${instance.uid}`;
+    const endTag = startTag + `:end`;
+    perf.mark(endTag);
+    perf.measure(
+      `<${formatComponentName(instance, instance.type)}> ${type}`,
+      startTag,
+      endTag
+    );
+    perf.clearMarks(startTag);
+    perf.clearMarks(endTag);
+  }
+  {
+    devtoolsPerfEnd(instance, type, isSupported() ? perf.now() : Date.now());
+  }
+}
+function isSupported() {
+  if (supported !== void 0) {
+    return supported;
+  }
+  if (typeof window !== "undefined" && window.performance) {
+    supported = true;
+    perf = window.performance;
+  } else {
+    supported = false;
+  }
+  return supported;
+}
+
+const queuePostRenderEffect = queueEffectWithSuspense ;
+function createRenderer(options) {
+  return baseCreateRenderer(options);
+}
+function createHydrationRenderer(options) {
+  return baseCreateRenderer(options, createHydrationFunctions);
+}
+function baseCreateRenderer(options, createHydrationFns) {
+  const target = getGlobalThis();
+  target.__VUE__ = true;
+  {
+    setDevtoolsHook(target.__VUE_DEVTOOLS_GLOBAL_HOOK__, target);
+  }
+  const {
+    insert: hostInsert,
+    remove: hostRemove,
+    patchProp: hostPatchProp,
+    createElement: hostCreateElement,
+    createText: hostCreateText,
+    createComment: hostCreateComment,
+    setText: hostSetText,
+    setElementText: hostSetElementText,
+    parentNode: hostParentNode,
+    nextSibling: hostNextSibling,
+    setScopeId: hostSetScopeId = NOOP,
+    insertStaticContent: hostInsertStaticContent
+  } = options;
+  const patch = (n1, n2, container, anchor = null, parentComponent = null, parentSuspense = null, isSVG = false, slotScopeIds = null, optimized = isHmrUpdating ? false : !!n2.dynamicChildren) => {
+    if (n1 === n2) {
+      return;
+    }
+    if (n1 && !isSameVNodeType(n1, n2)) {
+      anchor = getNextHostNode(n1);
+      unmount(n1, parentComponent, parentSuspense, true);
+      n1 = null;
+    }
+    if (n2.patchFlag === -2) {
+      optimized = false;
+      n2.dynamicChildren = null;
+    }
+    const { type, ref, shapeFlag } = n2;
+    switch (type) {
+      case Text:
+        processText(n1, n2, container, anchor);
+        break;
+      case Comment:
+        processCommentNode(n1, n2, container, anchor);
+        break;
+      case Static:
+        if (n1 == null) {
+          mountStaticNode(n2, container, anchor, isSVG);
+        } else {
+          patchStaticNode(n1, n2, container, isSVG);
+        }
+        break;
+      case Fragment:
+        processFragment(
+          n1,
+          n2,
+          container,
+          anchor,
+          parentComponent,
+          parentSuspense,
+          isSVG,
+          slotScopeIds,
+          optimized
+        );
+        break;
+      default:
+        if (shapeFlag & 1) {
+          processElement(
+            n1,
+            n2,
+            container,
+            anchor,
+            parentComponent,
+            parentSuspense,
+            isSVG,
+            slotScopeIds,
+            optimized
+          );
+        } else if (shapeFlag & 6) {
+          processComponent(
+            n1,
+            n2,
+            container,
+            anchor,
+            parentComponent,
+            parentSuspense,
+            isSVG,
+            slotScopeIds,
+            optimized
+          );
+        } else if (shapeFlag & 64) {
+          type.process(
+            n1,
+            n2,
+            container,
+            anchor,
+            parentComponent,
+            parentSuspense,
+            isSVG,
+            slotScopeIds,
+            optimized,
+            internals
+          );
+        } else if (shapeFlag & 128) {
+          type.process(
+            n1,
+            n2,
+            container,
+            anchor,
+            parentComponent,
+            parentSuspense,
+            isSVG,
+            slotScopeIds,
+            optimized,
+            internals
+          );
+        } else {
+          warn("Invalid VNode type:", type, `(${typeof type})`);
+        }
+    }
+    if (ref != null && parentComponent) {
+      setRef(ref, n1 && n1.ref, parentSuspense, n2 || n1, !n2);
+    }
+  };
+  const processText = (n1, n2, container, anchor) => {
+    if (n1 == null) {
+      hostInsert(
+        n2.el = hostCreateText(n2.children),
+        container,
+        anchor
+      );
+    } else {
+      const el = n2.el = n1.el;
+      if (n2.children !== n1.children) {
+        hostSetText(el, n2.children);
+      }
+    }
+  };
+  const processCommentNode = (n1, n2, container, anchor) => {
+    if (n1 == null) {
+      hostInsert(
+        n2.el = hostCreateComment(n2.children || ""),
+        container,
+        anchor
+      );
+    } else {
+      n2.el = n1.el;
+    }
+  };
+  const mountStaticNode = (n2, container, anchor, isSVG) => {
+    [n2.el, n2.anchor] = hostInsertStaticContent(
+      n2.children,
+      container,
+      anchor,
+      isSVG,
+      n2.el,
+      n2.anchor
+    );
+  };
+  const patchStaticNode = (n1, n2, container, isSVG) => {
+    if (n2.children !== n1.children) {
+      const anchor = hostNextSibling(n1.anchor);
+      removeStaticNode(n1);
+      [n2.el, n2.anchor] = hostInsertStaticContent(
+        n2.children,
+        container,
+        anchor,
+        isSVG
+      );
+    } else {
+      n2.el = n1.el;
+      n2.anchor = n1.anchor;
+    }
+  };
+  const moveStaticNode = ({ el, anchor }, container, nextSibling) => {
+    let next;
+    while (el && el !== anchor) {
+      next = hostNextSibling(el);
+      hostInsert(el, container, nextSibling);
+      el = next;
+    }
+    hostInsert(anchor, container, nextSibling);
+  };
+  const removeStaticNode = ({ el, anchor }) => {
+    let next;
+    while (el && el !== anchor) {
+      next = hostNextSibling(el);
+      hostRemove(el);
+      el = next;
+    }
+    hostRemove(anchor);
+  };
+  const processElement = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {
+    isSVG = isSVG || n2.type === "svg";
+    if (n1 == null) {
+      mountElement(
+        n2,
+        container,
+        anchor,
+        parentComponent,
+        parentSuspense,
+        isSVG,
+        slotScopeIds,
+        optimized
+      );
+    } else {
+      patchElement(
+        n1,
+        n2,
+        parentComponent,
+        parentSuspense,
+        isSVG,
+        slotScopeIds,
+        optimized
+      );
+    }
+  };
+  const mountElement = (vnode, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {
+    let el;
+    let vnodeHook;
+    const { type, props, shapeFlag, transition, dirs } = vnode;
+    el = vnode.el = hostCreateElement(
+      vnode.type,
+      isSVG,
+      props && props.is,
+      props
+    );
+    if (shapeFlag & 8) {
+      hostSetElementText(el, vnode.children);
+    } else if (shapeFlag & 16) {
+      mountChildren(
+        vnode.children,
+        el,
+        null,
+        parentComponent,
+        parentSuspense,
+        isSVG && type !== "foreignObject",
+        slotScopeIds,
+        optimized
+      );
+    }
+    if (dirs) {
+      invokeDirectiveHook(vnode, null, parentComponent, "created");
+    }
+    setScopeId(el, vnode, vnode.scopeId, slotScopeIds, parentComponent);
+    if (props) {
+      for (const key in props) {
+        if (key !== "value" && !isReservedProp(key)) {
+          hostPatchProp(
+            el,
+            key,
+            null,
+            props[key],
+            isSVG,
+            vnode.children,
+            parentComponent,
+            parentSuspense,
+            unmountChildren
+          );
+        }
+      }
+      if ("value" in props) {
+        hostPatchProp(el, "value", null, props.value);
+      }
+      if (vnodeHook = props.onVnodeBeforeMount) {
+        invokeVNodeHook(vnodeHook, parentComponent, vnode);
+      }
+    }
+    {
+      Object.defineProperty(el, "__vnode", {
+        value: vnode,
+        enumerable: false
+      });
+      Object.defineProperty(el, "__vueParentComponent", {
+        value: parentComponent,
+        enumerable: false
+      });
+    }
+    if (dirs) {
+      invokeDirectiveHook(vnode, null, parentComponent, "beforeMount");
+    }
+    const needCallTransitionHooks = (!parentSuspense || parentSuspense && !parentSuspense.pendingBranch) && transition && !transition.persisted;
+    if (needCallTransitionHooks) {
+      transition.beforeEnter(el);
+    }
+    hostInsert(el, container, anchor);
+    if ((vnodeHook = props && props.onVnodeMounted) || needCallTransitionHooks || dirs) {
+      queuePostRenderEffect(() => {
+        vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);
+        needCallTransitionHooks && transition.enter(el);
+        dirs && invokeDirectiveHook(vnode, null, parentComponent, "mounted");
+      }, parentSuspense);
+    }
+  };
+  const setScopeId = (el, vnode, scopeId, slotScopeIds, parentComponent) => {
+    if (scopeId) {
+      hostSetScopeId(el, scopeId);
+    }
+    if (slotScopeIds) {
+      for (let i = 0; i < slotScopeIds.length; i++) {
+        hostSetScopeId(el, slotScopeIds[i]);
+      }
+    }
+    if (parentComponent) {
+      let subTree = parentComponent.subTree;
+      if (subTree.patchFlag > 0 && subTree.patchFlag & 2048) {
+        subTree = filterSingleRoot(subTree.children) || subTree;
+      }
+      if (vnode === subTree) {
+        const parentVNode = parentComponent.vnode;
+        setScopeId(
+          el,
+          parentVNode,
+          parentVNode.scopeId,
+          parentVNode.slotScopeIds,
+          parentComponent.parent
+        );
+      }
+    }
+  };
+  const mountChildren = (children, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, start = 0) => {
+    for (let i = start; i < children.length; i++) {
+      const child = children[i] = optimized ? cloneIfMounted(children[i]) : normalizeVNode(children[i]);
+      patch(
+        null,
+        child,
+        container,
+        anchor,
+        parentComponent,
+        parentSuspense,
+        isSVG,
+        slotScopeIds,
+        optimized
+      );
+    }
+  };
+  const patchElement = (n1, n2, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {
+    const el = n2.el = n1.el;
+    let { patchFlag, dynamicChildren, dirs } = n2;
+    patchFlag |= n1.patchFlag & 16;
+    const oldProps = n1.props || EMPTY_OBJ;
+    const newProps = n2.props || EMPTY_OBJ;
+    let vnodeHook;
+    parentComponent && toggleRecurse(parentComponent, false);
+    if (vnodeHook = newProps.onVnodeBeforeUpdate) {
+      invokeVNodeHook(vnodeHook, parentComponent, n2, n1);
+    }
+    if (dirs) {
+      invokeDirectiveHook(n2, n1, parentComponent, "beforeUpdate");
+    }
+    parentComponent && toggleRecurse(parentComponent, true);
+    if (isHmrUpdating) {
+      patchFlag = 0;
+      optimized = false;
+      dynamicChildren = null;
+    }
+    const areChildrenSVG = isSVG && n2.type !== "foreignObject";
+    if (dynamicChildren) {
+      patchBlockChildren(
+        n1.dynamicChildren,
+        dynamicChildren,
+        el,
+        parentComponent,
+        parentSuspense,
+        areChildrenSVG,
+        slotScopeIds
+      );
+      {
+        traverseStaticChildren(n1, n2);
+      }
+    } else if (!optimized) {
+      patchChildren(
+        n1,
+        n2,
+        el,
+        null,
+        parentComponent,
+        parentSuspense,
+        areChildrenSVG,
+        slotScopeIds,
+        false
+      );
+    }
+    if (patchFlag > 0) {
+      if (patchFlag & 16) {
+        patchProps(
+          el,
+          n2,
+          oldProps,
+          newProps,
+          parentComponent,
+          parentSuspense,
+          isSVG
+        );
+      } else {
+        if (patchFlag & 2) {
+          if (oldProps.class !== newProps.class) {
+            hostPatchProp(el, "class", null, newProps.class, isSVG);
+          }
+        }
+        if (patchFlag & 4) {
+          hostPatchProp(el, "style", oldProps.style, newProps.style, isSVG);
+        }
+        if (patchFlag & 8) {
+          const propsToUpdate = n2.dynamicProps;
+          for (let i = 0; i < propsToUpdate.length; i++) {
+            const key = propsToUpdate[i];
+            const prev = oldProps[key];
+            const next = newProps[key];
+            if (next !== prev || key === "value") {
+              hostPatchProp(
+                el,
+                key,
+                prev,
+                next,
+                isSVG,
+                n1.children,
+                parentComponent,
+                parentSuspense,
+                unmountChildren
+              );
+            }
+          }
+        }
+      }
+      if (patchFlag & 1) {
+        if (n1.children !== n2.children) {
+          hostSetElementText(el, n2.children);
+        }
+      }
+    } else if (!optimized && dynamicChildren == null) {
+      patchProps(
+        el,
+        n2,
+        oldProps,
+        newProps,
+        parentComponent,
+        parentSuspense,
+        isSVG
+      );
+    }
+    if ((vnodeHook = newProps.onVnodeUpdated) || dirs) {
+      queuePostRenderEffect(() => {
+        vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, n2, n1);
+        dirs && invokeDirectiveHook(n2, n1, parentComponent, "updated");
+      }, parentSuspense);
+    }
+  };
+  const patchBlockChildren = (oldChildren, newChildren, fallbackContainer, parentComponent, parentSuspense, isSVG, slotScopeIds) => {
+    for (let i = 0; i < newChildren.length; i++) {
+      const oldVNode = oldChildren[i];
+      const newVNode = newChildren[i];
+      const container = (
+        // oldVNode may be an errored async setup() component inside Suspense
+        // which will not have a mounted element
+        oldVNode.el && // - In the case of a Fragment, we need to provide the actual parent
+        // of the Fragment itself so it can move its children.
+        (oldVNode.type === Fragment || // - In the case of different nodes, there is going to be a replacement
+        // which also requires the correct parent container
+        !isSameVNodeType(oldVNode, newVNode) || // - In the case of a component, it could contain anything.
+        oldVNode.shapeFlag & (6 | 64)) ? hostParentNode(oldVNode.el) : (
+          // In other cases, the parent container is not actually used so we
+          // just pass the block element here to avoid a DOM parentNode call.
+          fallbackContainer
+        )
+      );
+      patch(
+        oldVNode,
+        newVNode,
+        container,
+        null,
+        parentComponent,
+        parentSuspense,
+        isSVG,
+        slotScopeIds,
+        true
+      );
+    }
+  };
+  const patchProps = (el, vnode, oldProps, newProps, parentComponent, parentSuspense, isSVG) => {
+    if (oldProps !== newProps) {
+      if (oldProps !== EMPTY_OBJ) {
+        for (const key in oldProps) {
+          if (!isReservedProp(key) && !(key in newProps)) {
+            hostPatchProp(
+              el,
+              key,
+              oldProps[key],
+              null,
+              isSVG,
+              vnode.children,
+              parentComponent,
+              parentSuspense,
+              unmountChildren
+            );
+          }
+        }
+      }
+      for (const key in newProps) {
+        if (isReservedProp(key))
+          continue;
+        const next = newProps[key];
+        const prev = oldProps[key];
+        if (next !== prev && key !== "value") {
+          hostPatchProp(
+            el,
+            key,
+            prev,
+            next,
+            isSVG,
+            vnode.children,
+            parentComponent,
+            parentSuspense,
+            unmountChildren
+          );
+        }
+      }
+      if ("value" in newProps) {
+        hostPatchProp(el, "value", oldProps.value, newProps.value);
+      }
+    }
+  };
+  const processFragment = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {
+    const fragmentStartAnchor = n2.el = n1 ? n1.el : hostCreateText("");
+    const fragmentEndAnchor = n2.anchor = n1 ? n1.anchor : hostCreateText("");
+    let { patchFlag, dynamicChildren, slotScopeIds: fragmentSlotScopeIds } = n2;
+    if (
+      // #5523 dev root fragment may inherit directives
+      isHmrUpdating || patchFlag & 2048
+    ) {
+      patchFlag = 0;
+      optimized = false;
+      dynamicChildren = null;
+    }
+    if (fragmentSlotScopeIds) {
+      slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;
+    }
+    if (n1 == null) {
+      hostInsert(fragmentStartAnchor, container, anchor);
+      hostInsert(fragmentEndAnchor, container, anchor);
+      mountChildren(
+        n2.children,
+        container,
+        fragmentEndAnchor,
+        parentComponent,
+        parentSuspense,
+        isSVG,
+        slotScopeIds,
+        optimized
+      );
+    } else {
+      if (patchFlag > 0 && patchFlag & 64 && dynamicChildren && // #2715 the previous fragment could've been a BAILed one as a result
+      // of renderSlot() with no valid children
+      n1.dynamicChildren) {
+        patchBlockChildren(
+          n1.dynamicChildren,
+          dynamicChildren,
+          container,
+          parentComponent,
+          parentSuspense,
+          isSVG,
+          slotScopeIds
+        );
+        {
+          traverseStaticChildren(n1, n2);
+        }
+      } else {
+        patchChildren(
+          n1,
+          n2,
+          container,
+          fragmentEndAnchor,
+          parentComponent,
+          parentSuspense,
+          isSVG,
+          slotScopeIds,
+          optimized
+        );
+      }
+    }
+  };
+  const processComponent = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {
+    n2.slotScopeIds = slotScopeIds;
+    if (n1 == null) {
+      if (n2.shapeFlag & 512) {
+        parentComponent.ctx.activate(
+          n2,
+          container,
+          anchor,
+          isSVG,
+          optimized
+        );
+      } else {
+        mountComponent(
+          n2,
+          container,
+          anchor,
+          parentComponent,
+          parentSuspense,
+          isSVG,
+          optimized
+        );
+      }
+    } else {
+      updateComponent(n1, n2, optimized);
+    }
+  };
+  const mountComponent = (initialVNode, container, anchor, parentComponent, parentSuspense, isSVG, optimized) => {
+    const instance = (initialVNode.component = createComponentInstance(
+      initialVNode,
+      parentComponent,
+      parentSuspense
+    ));
+    if (instance.type.__hmrId) {
+      registerHMR(instance);
+    }
+    {
+      pushWarningContext(initialVNode);
+      startMeasure(instance, `mount`);
+    }
+    if (isKeepAlive(initialVNode)) {
+      instance.ctx.renderer = internals;
+    }
+    {
+      {
+        startMeasure(instance, `init`);
+      }
+      setupComponent(instance);
+      {
+        endMeasure(instance, `init`);
+      }
+    }
+    if (instance.asyncDep) {
+      parentSuspense && parentSuspense.registerDep(instance, setupRenderEffect);
+      if (!initialVNode.el) {
+        const placeholder = instance.subTree = createVNode(Comment);
+        processCommentNode(null, placeholder, container, anchor);
+      }
+      return;
+    }
+    setupRenderEffect(
+      instance,
+      initialVNode,
+      container,
+      anchor,
+      parentSuspense,
+      isSVG,
+      optimized
+    );
+    {
+      popWarningContext();
+      endMeasure(instance, `mount`);
+    }
+  };
+  const updateComponent = (n1, n2, optimized) => {
+    const instance = n2.component = n1.component;
+    if (shouldUpdateComponent(n1, n2, optimized)) {
+      if (instance.asyncDep && !instance.asyncResolved) {
+        {
+          pushWarningContext(n2);
+        }
+        updateComponentPreRender(instance, n2, optimized);
+        {
+          popWarningContext();
+        }
+        return;
+      } else {
+        instance.next = n2;
+        invalidateJob(instance.update);
+        instance.update();
+      }
+    } else {
+      n2.el = n1.el;
+      instance.vnode = n2;
+    }
+  };
+  const setupRenderEffect = (instance, initialVNode, container, anchor, parentSuspense, isSVG, optimized) => {
+    const componentUpdateFn = () => {
+      if (!instance.isMounted) {
+        let vnodeHook;
+        const { el, props } = initialVNode;
+        const { bm, m, parent } = instance;
+        const isAsyncWrapperVNode = isAsyncWrapper(initialVNode);
+        toggleRecurse(instance, false);
+        if (bm) {
+          invokeArrayFns(bm);
+        }
+        if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeBeforeMount)) {
+          invokeVNodeHook(vnodeHook, parent, initialVNode);
+        }
+        toggleRecurse(instance, true);
+        if (el && hydrateNode) {
+          const hydrateSubTree = () => {
+            {
+              startMeasure(instance, `render`);
+            }
+            instance.subTree = renderComponentRoot(instance);
+            {
+              endMeasure(instance, `render`);
+            }
+            {
+              startMeasure(instance, `hydrate`);
+            }
+            hydrateNode(
+              el,
+              instance.subTree,
+              instance,
+              parentSuspense,
+              null
+            );
+            {
+              endMeasure(instance, `hydrate`);
+            }
+          };
+          if (isAsyncWrapperVNode) {
+            initialVNode.type.__asyncLoader().then(
+              // note: we are moving the render call into an async callback,
+              // which means it won't track dependencies - but it's ok because
+              // a server-rendered async wrapper is already in resolved state
+              // and it will never need to change.
+              () => !instance.isUnmounted && hydrateSubTree()
+            );
+          } else {
+            hydrateSubTree();
+          }
+        } else {
+          {
+            startMeasure(instance, `render`);
+          }
+          const subTree = instance.subTree = renderComponentRoot(instance);
+          {
+            endMeasure(instance, `render`);
+          }
+          {
+            startMeasure(instance, `patch`);
+          }
+          patch(
+            null,
+            subTree,
+            container,
+            anchor,
+            instance,
+            parentSuspense,
+            isSVG
+          );
+          {
+            endMeasure(instance, `patch`);
+          }
+          initialVNode.el = subTree.el;
+        }
+        if (m) {
+          queuePostRenderEffect(m, parentSuspense);
+        }
+        if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeMounted)) {
+          const scopedInitialVNode = initialVNode;
+          queuePostRenderEffect(
+            () => invokeVNodeHook(vnodeHook, parent, scopedInitialVNode),
+            parentSuspense
+          );
+        }
+        if (initialVNode.shapeFlag & 256 || parent && isAsyncWrapper(parent.vnode) && parent.vnode.shapeFlag & 256) {
+          instance.a && queuePostRenderEffect(instance.a, parentSuspense);
+        }
+        instance.isMounted = true;
+        {
+          devtoolsComponentAdded(instance);
+        }
+        initialVNode = container = anchor = null;
+      } else {
+        let { next, bu, u, parent, vnode } = instance;
+        let originNext = next;
+        let vnodeHook;
+        {
+          pushWarningContext(next || instance.vnode);
+        }
+        toggleRecurse(instance, false);
+        if (next) {
+          next.el = vnode.el;
+          updateComponentPreRender(instance, next, optimized);
+        } else {
+          next = vnode;
+        }
+        if (bu) {
+          invokeArrayFns(bu);
+        }
+        if (vnodeHook = next.props && next.props.onVnodeBeforeUpdate) {
+          invokeVNodeHook(vnodeHook, parent, next, vnode);
+        }
+        toggleRecurse(instance, true);
+        {
+          startMeasure(instance, `render`);
+        }
+        const nextTree = renderComponentRoot(instance);
+        {
+          endMeasure(instance, `render`);
+        }
+        const prevTree = instance.subTree;
+        instance.subTree = nextTree;
+        {
+          startMeasure(instance, `patch`);
+        }
+        patch(
+          prevTree,
+          nextTree,
+          // parent may have changed if it's in a teleport
+          hostParentNode(prevTree.el),
+          // anchor may have changed if it's in a fragment
+          getNextHostNode(prevTree),
+          instance,
+          parentSuspense,
+          isSVG
+        );
+        {
+          endMeasure(instance, `patch`);
+        }
+        next.el = nextTree.el;
+        if (originNext === null) {
+          updateHOCHostEl(instance, nextTree.el);
+        }
+        if (u) {
+          queuePostRenderEffect(u, parentSuspense);
+        }
+        if (vnodeHook = next.props && next.props.onVnodeUpdated) {
+          queuePostRenderEffect(
+            () => invokeVNodeHook(vnodeHook, parent, next, vnode),
+            parentSuspense
+          );
+        }
+        {
+          devtoolsComponentUpdated(instance);
+        }
+        {
+          popWarningContext();
+        }
+      }
+    };
+    const effect = instance.effect = new ReactiveEffect(
+      componentUpdateFn,
+      () => queueJob(update),
+      instance.scope
+      // track it in component's effect scope
+    );
+    const update = instance.update = () => effect.run();
+    update.id = instance.uid;
+    toggleRecurse(instance, true);
+    {
+      effect.onTrack = instance.rtc ? (e) => invokeArrayFns(instance.rtc, e) : void 0;
+      effect.onTrigger = instance.rtg ? (e) => invokeArrayFns(instance.rtg, e) : void 0;
+      update.ownerInstance = instance;
+    }
+    update();
+  };
+  const updateComponentPreRender = (instance, nextVNode, optimized) => {
+    nextVNode.component = instance;
+    const prevProps = instance.vnode.props;
+    instance.vnode = nextVNode;
+    instance.next = null;
+    updateProps(instance, nextVNode.props, prevProps, optimized);
+    updateSlots(instance, nextVNode.children, optimized);
+    pauseTracking();
+    flushPreFlushCbs();
+    resetTracking();
+  };
+  const patchChildren = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized = false) => {
+    const c1 = n1 && n1.children;
+    const prevShapeFlag = n1 ? n1.shapeFlag : 0;
+    const c2 = n2.children;
+    const { patchFlag, shapeFlag } = n2;
+    if (patchFlag > 0) {
+      if (patchFlag & 128) {
+        patchKeyedChildren(
+          c1,
+          c2,
+          container,
+          anchor,
+          parentComponent,
+          parentSuspense,
+          isSVG,
+          slotScopeIds,
+          optimized
+        );
+        return;
+      } else if (patchFlag & 256) {
+        patchUnkeyedChildren(
+          c1,
+          c2,
+          container,
+          anchor,
+          parentComponent,
+          parentSuspense,
+          isSVG,
+          slotScopeIds,
+          optimized
+        );
+        return;
+      }
+    }
+    if (shapeFlag & 8) {
+      if (prevShapeFlag & 16) {
+        unmountChildren(c1, parentComponent, parentSuspense);
+      }
+      if (c2 !== c1) {
+        hostSetElementText(container, c2);
+      }
+    } else {
+      if (prevShapeFlag & 16) {
+        if (shapeFlag & 16) {
+          patchKeyedChildren(
+            c1,
+            c2,
+            container,
+            anchor,
+            parentComponent,
+            parentSuspense,
+            isSVG,
+            slotScopeIds,
+            optimized
+          );
+        } else {
+          unmountChildren(c1, parentComponent, parentSuspense, true);
+        }
+      } else {
+        if (prevShapeFlag & 8) {
+          hostSetElementText(container, "");
+        }
+        if (shapeFlag & 16) {
+          mountChildren(
+            c2,
+            container,
+            anchor,
+            parentComponent,
+            parentSuspense,
+            isSVG,
+            slotScopeIds,
+            optimized
+          );
+        }
+      }
+    }
+  };
+  const patchUnkeyedChildren = (c1, c2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {
+    c1 = c1 || EMPTY_ARR;
+    c2 = c2 || EMPTY_ARR;
+    const oldLength = c1.length;
+    const newLength = c2.length;
+    const commonLength = Math.min(oldLength, newLength);
+    let i;
+    for (i = 0; i < commonLength; i++) {
+      const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);
+      patch(
+        c1[i],
+        nextChild,
+        container,
+        null,
+        parentComponent,
+        parentSuspense,
+        isSVG,
+        slotScopeIds,
+        optimized
+      );
+    }
+    if (oldLength > newLength) {
+      unmountChildren(
+        c1,
+        parentComponent,
+        parentSuspense,
+        true,
+        false,
+        commonLength
+      );
+    } else {
+      mountChildren(
+        c2,
+        container,
+        anchor,
+        parentComponent,
+        parentSuspense,
+        isSVG,
+        slotScopeIds,
+        optimized,
+        commonLength
+      );
+    }
+  };
+  const patchKeyedChildren = (c1, c2, container, parentAnchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {
+    let i = 0;
+    const l2 = c2.length;
+    let e1 = c1.length - 1;
+    let e2 = l2 - 1;
+    while (i <= e1 && i <= e2) {
+      const n1 = c1[i];
+      const n2 = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);
+      if (isSameVNodeType(n1, n2)) {
+        patch(
+          n1,
+          n2,
+          container,
+          null,
+          parentComponent,
+          parentSuspense,
+          isSVG,
+          slotScopeIds,
+          optimized
+        );
+      } else {
+        break;
+      }
+      i++;
+    }
+    while (i <= e1 && i <= e2) {
+      const n1 = c1[e1];
+      const n2 = c2[e2] = optimized ? cloneIfMounted(c2[e2]) : normalizeVNode(c2[e2]);
+      if (isSameVNodeType(n1, n2)) {
+        patch(
+          n1,
+          n2,
+          container,
+          null,
+          parentComponent,
+          parentSuspense,
+          isSVG,
+          slotScopeIds,
+          optimized
+        );
+      } else {
+        break;
+      }
+      e1--;
+      e2--;
+    }
+    if (i > e1) {
+      if (i <= e2) {
+        const nextPos = e2 + 1;
+        const anchor = nextPos < l2 ? c2[nextPos].el : parentAnchor;
+        while (i <= e2) {
+          patch(
+            null,
+            c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]),
+            container,
+            anchor,
+            parentComponent,
+            parentSuspense,
+            isSVG,
+            slotScopeIds,
+            optimized
+          );
+          i++;
+        }
+      }
+    } else if (i > e2) {
+      while (i <= e1) {
+        unmount(c1[i], parentComponent, parentSuspense, true);
+        i++;
+      }
+    } else {
+      const s1 = i;
+      const s2 = i;
+      const keyToNewIndexMap = /* @__PURE__ */ new Map();
+      for (i = s2; i <= e2; i++) {
+        const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);
+        if (nextChild.key != null) {
+          if (keyToNewIndexMap.has(nextChild.key)) {
+            warn(
+              `Duplicate keys found during update:`,
+              JSON.stringify(nextChild.key),
+              `Make sure keys are unique.`
+            );
+          }
+          keyToNewIndexMap.set(nextChild.key, i);
+        }
+      }
+      let j;
+      let patched = 0;
+      const toBePatched = e2 - s2 + 1;
+      let moved = false;
+      let maxNewIndexSoFar = 0;
+      const newIndexToOldIndexMap = new Array(toBePatched);
+      for (i = 0; i < toBePatched; i++)
+        newIndexToOldIndexMap[i] = 0;
+      for (i = s1; i <= e1; i++) {
+        const prevChild = c1[i];
+        if (patched >= toBePatched) {
+          unmount(prevChild, parentComponent, parentSuspense, true);
+          continue;
+        }
+        let newIndex;
+        if (prevChild.key != null) {
+          newIndex = keyToNewIndexMap.get(prevChild.key);
+        } else {
+          for (j = s2; j <= e2; j++) {
+            if (newIndexToOldIndexMap[j - s2] === 0 && isSameVNodeType(prevChild, c2[j])) {
+              newIndex = j;
+              break;
+            }
+          }
+        }
+        if (newIndex === void 0) {
+          unmount(prevChild, parentComponent, parentSuspense, true);
+        } else {
+          newIndexToOldIndexMap[newIndex - s2] = i + 1;
+          if (newIndex >= maxNewIndexSoFar) {
+            maxNewIndexSoFar = newIndex;
+          } else {
+            moved = true;
+          }
+          patch(
+            prevChild,
+            c2[newIndex],
+            container,
+            null,
+            parentComponent,
+            parentSuspense,
+            isSVG,
+            slotScopeIds,
+            optimized
+          );
+          patched++;
+        }
+      }
+      const increasingNewIndexSequence = moved ? getSequence(newIndexToOldIndexMap) : EMPTY_ARR;
+      j = increasingNewIndexSequence.length - 1;
+      for (i = toBePatched - 1; i >= 0; i--) {
+        const nextIndex = s2 + i;
+        const nextChild = c2[nextIndex];
+        const anchor = nextIndex + 1 < l2 ? c2[nextIndex + 1].el : parentAnchor;
+        if (newIndexToOldIndexMap[i] === 0) {
+          patch(
+            null,
+            nextChild,
+            container,
+            anchor,
+            parentComponent,
+            parentSuspense,
+            isSVG,
+            slotScopeIds,
+            optimized
+          );
+        } else if (moved) {
+          if (j < 0 || i !== increasingNewIndexSequence[j]) {
+            move(nextChild, container, anchor, 2);
+          } else {
+            j--;
+          }
+        }
+      }
+    }
+  };
+  const move = (vnode, container, anchor, moveType, parentSuspense = null) => {
+    const { el, type, transition, children, shapeFlag } = vnode;
+    if (shapeFlag & 6) {
+      move(vnode.component.subTree, container, anchor, moveType);
+      return;
+    }
+    if (shapeFlag & 128) {
+      vnode.suspense.move(container, anchor, moveType);
+      return;
+    }
+    if (shapeFlag & 64) {
+      type.move(vnode, container, anchor, internals);
+      return;
+    }
+    if (type === Fragment) {
+      hostInsert(el, container, anchor);
+      for (let i = 0; i < children.length; i++) {
+        move(children[i], container, anchor, moveType);
+      }
+      hostInsert(vnode.anchor, container, anchor);
+      return;
+    }
+    if (type === Static) {
+      moveStaticNode(vnode, container, anchor);
+      return;
+    }
+    const needTransition = moveType !== 2 && shapeFlag & 1 && transition;
+    if (needTransition) {
+      if (moveType === 0) {
+        transition.beforeEnter(el);
+        hostInsert(el, container, anchor);
+        queuePostRenderEffect(() => transition.enter(el), parentSuspense);
+      } else {
+        const { leave, delayLeave, afterLeave } = transition;
+        const remove2 = () => hostInsert(el, container, anchor);
+        const performLeave = () => {
+          leave(el, () => {
+            remove2();
+            afterLeave && afterLeave();
+          });
+        };
+        if (delayLeave) {
+          delayLeave(el, remove2, performLeave);
+        } else {
+          performLeave();
+        }
+      }
+    } else {
+      hostInsert(el, container, anchor);
+    }
+  };
+  const unmount = (vnode, parentComponent, parentSuspense, doRemove = false, optimized = false) => {
+    const {
+      type,
+      props,
+      ref,
+      children,
+      dynamicChildren,
+      shapeFlag,
+      patchFlag,
+      dirs
+    } = vnode;
+    if (ref != null) {
+      setRef(ref, null, parentSuspense, vnode, true);
+    }
+    if (shapeFlag & 256) {
+      parentComponent.ctx.deactivate(vnode);
+      return;
+    }
+    const shouldInvokeDirs = shapeFlag & 1 && dirs;
+    const shouldInvokeVnodeHook = !isAsyncWrapper(vnode);
+    let vnodeHook;
+    if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeBeforeUnmount)) {
+      invokeVNodeHook(vnodeHook, parentComponent, vnode);
+    }
+    if (shapeFlag & 6) {
+      unmountComponent(vnode.component, parentSuspense, doRemove);
+    } else {
+      if (shapeFlag & 128) {
+        vnode.suspense.unmount(parentSuspense, doRemove);
+        return;
+      }
+      if (shouldInvokeDirs) {
+        invokeDirectiveHook(vnode, null, parentComponent, "beforeUnmount");
+      }
+      if (shapeFlag & 64) {
+        vnode.type.remove(
+          vnode,
+          parentComponent,
+          parentSuspense,
+          optimized,
+          internals,
+          doRemove
+        );
+      } else if (dynamicChildren && // #1153: fast path should not be taken for non-stable (v-for) fragments
+      (type !== Fragment || patchFlag > 0 && patchFlag & 64)) {
+        unmountChildren(
+          dynamicChildren,
+          parentComponent,
+          parentSuspense,
+          false,
+          true
+        );
+      } else if (type === Fragment && patchFlag & (128 | 256) || !optimized && shapeFlag & 16) {
+        unmountChildren(children, parentComponent, parentSuspense);
+      }
+      if (doRemove) {
+        remove(vnode);
+      }
+    }
+    if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeUnmounted) || shouldInvokeDirs) {
+      queuePostRenderEffect(() => {
+        vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);
+        shouldInvokeDirs && invokeDirectiveHook(vnode, null, parentComponent, "unmounted");
+      }, parentSuspense);
+    }
+  };
+  const remove = (vnode) => {
+    const { type, el, anchor, transition } = vnode;
+    if (type === Fragment) {
+      if (vnode.patchFlag > 0 && vnode.patchFlag & 2048 && transition && !transition.persisted) {
+        vnode.children.forEach((child) => {
+          if (child.type === Comment) {
+            hostRemove(child.el);
+          } else {
+            remove(child);
+          }
+        });
+      } else {
+        removeFragment(el, anchor);
+      }
+      return;
+    }
+    if (type === Static) {
+      removeStaticNode(vnode);
+      return;
+    }
+    const performRemove = () => {
+      hostRemove(el);
+      if (transition && !transition.persisted && transition.afterLeave) {
+        transition.afterLeave();
+      }
+    };
+    if (vnode.shapeFlag & 1 && transition && !transition.persisted) {
+      const { leave, delayLeave } = transition;
+      const performLeave = () => leave(el, performRemove);
+      if (delayLeave) {
+        delayLeave(vnode.el, performRemove, performLeave);
+      } else {
+        performLeave();
+      }
+    } else {
+      performRemove();
+    }
+  };
+  const removeFragment = (cur, end) => {
+    let next;
+    while (cur !== end) {
+      next = hostNextSibling(cur);
+      hostRemove(cur);
+      cur = next;
+    }
+    hostRemove(end);
+  };
+  const unmountComponent = (instance, parentSuspense, doRemove) => {
+    if (instance.type.__hmrId) {
+      unregisterHMR(instance);
+    }
+    const { bum, scope, update, subTree, um } = instance;
+    if (bum) {
+      invokeArrayFns(bum);
+    }
+    scope.stop();
+    if (update) {
+      update.active = false;
+      unmount(subTree, instance, parentSuspense, doRemove);
+    }
+    if (um) {
+      queuePostRenderEffect(um, parentSuspense);
+    }
+    queuePostRenderEffect(() => {
+      instance.isUnmounted = true;
+    }, parentSuspense);
+    if (parentSuspense && parentSuspense.pendingBranch && !parentSuspense.isUnmounted && instance.asyncDep && !instance.asyncResolved && instance.suspenseId === parentSuspense.pendingId) {
+      parentSuspense.deps--;
+      if (parentSuspense.deps === 0) {
+        parentSuspense.resolve();
+      }
+    }
+    {
+      devtoolsComponentRemoved(instance);
+    }
+  };
+  const unmountChildren = (children, parentComponent, parentSuspense, doRemove = false, optimized = false, start = 0) => {
+    for (let i = start; i < children.length; i++) {
+      unmount(children[i], parentComponent, parentSuspense, doRemove, optimized);
+    }
+  };
+  const getNextHostNode = (vnode) => {
+    if (vnode.shapeFlag & 6) {
+      return getNextHostNode(vnode.component.subTree);
+    }
+    if (vnode.shapeFlag & 128) {
+      return vnode.suspense.next();
+    }
+    return hostNextSibling(vnode.anchor || vnode.el);
+  };
+  const render = (vnode, container, isSVG) => {
+    if (vnode == null) {
+      if (container._vnode) {
+        unmount(container._vnode, null, null, true);
+      }
+    } else {
+      patch(container._vnode || null, vnode, container, null, null, null, isSVG);
+    }
+    flushPreFlushCbs();
+    flushPostFlushCbs();
+    container._vnode = vnode;
+  };
+  const internals = {
+    p: patch,
+    um: unmount,
+    m: move,
+    r: remove,
+    mt: mountComponent,
+    mc: mountChildren,
+    pc: patchChildren,
+    pbc: patchBlockChildren,
+    n: getNextHostNode,
+    o: options
+  };
+  let hydrate;
+  let hydrateNode;
+  if (createHydrationFns) {
+    [hydrate, hydrateNode] = createHydrationFns(
+      internals
+    );
+  }
+  return {
+    render,
+    hydrate,
+    createApp: createAppAPI(render, hydrate)
+  };
+}
+function toggleRecurse({ effect, update }, allowed) {
+  effect.allowRecurse = update.allowRecurse = allowed;
+}
+function traverseStaticChildren(n1, n2, shallow = false) {
+  const ch1 = n1.children;
+  const ch2 = n2.children;
+  if (isArray(ch1) && isArray(ch2)) {
+    for (let i = 0; i < ch1.length; i++) {
+      const c1 = ch1[i];
+      let c2 = ch2[i];
+      if (c2.shapeFlag & 1 && !c2.dynamicChildren) {
+        if (c2.patchFlag <= 0 || c2.patchFlag === 32) {
+          c2 = ch2[i] = cloneIfMounted(ch2[i]);
+          c2.el = c1.el;
+        }
+        if (!shallow)
+          traverseStaticChildren(c1, c2);
+      }
+      if (c2.type === Text) {
+        c2.el = c1.el;
+      }
+      if (c2.type === Comment && !c2.el) {
+        c2.el = c1.el;
+      }
+    }
+  }
+}
+function getSequence(arr) {
+  const p = arr.slice();
+  const result = [0];
+  let i, j, u, v, c;
+  const len = arr.length;
+  for (i = 0; i < len; i++) {
+    const arrI = arr[i];
+    if (arrI !== 0) {
+      j = result[result.length - 1];
+      if (arr[j] < arrI) {
+        p[i] = j;
+        result.push(i);
+        continue;
+      }
+      u = 0;
+      v = result.length - 1;
+      while (u < v) {
+        c = u + v >> 1;
+        if (arr[result[c]] < arrI) {
+          u = c + 1;
+        } else {
+          v = c;
+        }
+      }
+      if (arrI < arr[result[u]]) {
+        if (u > 0) {
+          p[i] = result[u - 1];
+        }
+        result[u] = i;
+      }
+    }
+  }
+  u = result.length;
+  v = result[u - 1];
+  while (u-- > 0) {
+    result[u] = v;
+    v = p[v];
+  }
+  return result;
+}
+
+const isTeleport = (type) => type.__isTeleport;
+const isTeleportDisabled = (props) => props && (props.disabled || props.disabled === "");
+const isTargetSVG = (target) => typeof SVGElement !== "undefined" && target instanceof SVGElement;
+const resolveTarget = (props, select) => {
+  const targetSelector = props && props.to;
+  if (isString(targetSelector)) {
+    if (!select) {
+      warn(
+        `Current renderer does not support string target for Teleports. (missing querySelector renderer option)`
+      );
+      return null;
+    } else {
+      const target = select(targetSelector);
+      if (!target) {
+        warn(
+          `Failed to locate Teleport target with selector "${targetSelector}". Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree.`
+        );
+      }
+      return target;
+    }
+  } else {
+    if (!targetSelector && !isTeleportDisabled(props)) {
+      warn(`Invalid Teleport target: ${targetSelector}`);
+    }
+    return targetSelector;
+  }
+};
+const TeleportImpl = {
+  __isTeleport: true,
+  process(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, internals) {
+    const {
+      mc: mountChildren,
+      pc: patchChildren,
+      pbc: patchBlockChildren,
+      o: { insert, querySelector, createText, createComment }
+    } = internals;
+    const disabled = isTeleportDisabled(n2.props);
+    let { shapeFlag, children, dynamicChildren } = n2;
+    if (isHmrUpdating) {
+      optimized = false;
+      dynamicChildren = null;
+    }
+    if (n1 == null) {
+      const placeholder = n2.el = createComment("teleport start") ;
+      const mainAnchor = n2.anchor = createComment("teleport end") ;
+      insert(placeholder, container, anchor);
+      insert(mainAnchor, container, anchor);
+      const target = n2.target = resolveTarget(n2.props, querySelector);
+      const targetAnchor = n2.targetAnchor = createText("");
+      if (target) {
+        insert(targetAnchor, target);
+        isSVG = isSVG || isTargetSVG(target);
+      } else if (!disabled) {
+        warn("Invalid Teleport target on mount:", target, `(${typeof target})`);
+      }
+      const mount = (container2, anchor2) => {
+        if (shapeFlag & 16) {
+          mountChildren(
+            children,
+            container2,
+            anchor2,
+            parentComponent,
+            parentSuspense,
+            isSVG,
+            slotScopeIds,
+            optimized
+          );
+        }
+      };
+      if (disabled) {
+        mount(container, mainAnchor);
+      } else if (target) {
+        mount(target, targetAnchor);
+      }
+    } else {
+      n2.el = n1.el;
+      const mainAnchor = n2.anchor = n1.anchor;
+      const target = n2.target = n1.target;
+      const targetAnchor = n2.targetAnchor = n1.targetAnchor;
+      const wasDisabled = isTeleportDisabled(n1.props);
+      const currentContainer = wasDisabled ? container : target;
+      const currentAnchor = wasDisabled ? mainAnchor : targetAnchor;
+      isSVG = isSVG || isTargetSVG(target);
+      if (dynamicChildren) {
+        patchBlockChildren(
+          n1.dynamicChildren,
+          dynamicChildren,
+          currentContainer,
+          parentComponent,
+          parentSuspense,
+          isSVG,
+          slotScopeIds
+        );
+        traverseStaticChildren(n1, n2, true);
+      } else if (!optimized) {
+        patchChildren(
+          n1,
+          n2,
+          currentContainer,
+          currentAnchor,
+          parentComponent,
+          parentSuspense,
+          isSVG,
+          slotScopeIds,
+          false
+        );
+      }
+      if (disabled) {
+        if (!wasDisabled) {
+          moveTeleport(
+            n2,
+            container,
+            mainAnchor,
+            internals,
+            1
+          );
+        } else {
+          if (n2.props && n1.props && n2.props.to !== n1.props.to) {
+            n2.props.to = n1.props.to;
+          }
+        }
+      } else {
+        if ((n2.props && n2.props.to) !== (n1.props && n1.props.to)) {
+          const nextTarget = n2.target = resolveTarget(
+            n2.props,
+            querySelector
+          );
+          if (nextTarget) {
+            moveTeleport(
+              n2,
+              nextTarget,
+              null,
+              internals,
+              0
+            );
+          } else {
+            warn(
+              "Invalid Teleport target on update:",
+              target,
+              `(${typeof target})`
+            );
+          }
+        } else if (wasDisabled) {
+          moveTeleport(
+            n2,
+            target,
+            targetAnchor,
+            internals,
+            1
+          );
+        }
+      }
+    }
+    updateCssVars(n2);
+  },
+  remove(vnode, parentComponent, parentSuspense, optimized, { um: unmount, o: { remove: hostRemove } }, doRemove) {
+    const { shapeFlag, children, anchor, targetAnchor, target, props } = vnode;
+    if (target) {
+      hostRemove(targetAnchor);
+    }
+    doRemove && hostRemove(anchor);
+    if (shapeFlag & 16) {
+      const shouldRemove = doRemove || !isTeleportDisabled(props);
+      for (let i = 0; i < children.length; i++) {
+        const child = children[i];
+        unmount(
+          child,
+          parentComponent,
+          parentSuspense,
+          shouldRemove,
+          !!child.dynamicChildren
+        );
+      }
+    }
+  },
+  move: moveTeleport,
+  hydrate: hydrateTeleport
+};
+function moveTeleport(vnode, container, parentAnchor, { o: { insert }, m: move }, moveType = 2) {
+  if (moveType === 0) {
+    insert(vnode.targetAnchor, container, parentAnchor);
+  }
+  const { el, anchor, shapeFlag, children, props } = vnode;
+  const isReorder = moveType === 2;
+  if (isReorder) {
+    insert(el, container, parentAnchor);
+  }
+  if (!isReorder || isTeleportDisabled(props)) {
+    if (shapeFlag & 16) {
+      for (let i = 0; i < children.length; i++) {
+        move(
+          children[i],
+          container,
+          parentAnchor,
+          2
+        );
+      }
+    }
+  }
+  if (isReorder) {
+    insert(anchor, container, parentAnchor);
+  }
+}
+function hydrateTeleport(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized, {
+  o: { nextSibling, parentNode, querySelector }
+}, hydrateChildren) {
+  const target = vnode.target = resolveTarget(
+    vnode.props,
+    querySelector
+  );
+  if (target) {
+    const targetNode = target._lpa || target.firstChild;
+    if (vnode.shapeFlag & 16) {
+      if (isTeleportDisabled(vnode.props)) {
+        vnode.anchor = hydrateChildren(
+          nextSibling(node),
+          vnode,
+          parentNode(node),
+          parentComponent,
+          parentSuspense,
+          slotScopeIds,
+          optimized
+        );
+        vnode.targetAnchor = targetNode;
+      } else {
+        vnode.anchor = nextSibling(node);
+        let targetAnchor = targetNode;
+        while (targetAnchor) {
+          targetAnchor = nextSibling(targetAnchor);
+          if (targetAnchor && targetAnchor.nodeType === 8 && targetAnchor.data === "teleport anchor") {
+            vnode.targetAnchor = targetAnchor;
+            target._lpa = vnode.targetAnchor && nextSibling(vnode.targetAnchor);
+            break;
+          }
+        }
+        hydrateChildren(
+          targetNode,
+          vnode,
+          target,
+          parentComponent,
+          parentSuspense,
+          slotScopeIds,
+          optimized
+        );
+      }
+    }
+    updateCssVars(vnode);
+  }
+  return vnode.anchor && nextSibling(vnode.anchor);
+}
+const Teleport = TeleportImpl;
+function updateCssVars(vnode) {
+  const ctx = vnode.ctx;
+  if (ctx && ctx.ut) {
+    let node = vnode.children[0].el;
+    while (node && node !== vnode.targetAnchor) {
+      if (node.nodeType === 1)
+        node.setAttribute("data-v-owner", ctx.uid);
+      node = node.nextSibling;
+    }
+    ctx.ut();
+  }
+}
+
+const Fragment = Symbol.for("v-fgt");
+const Text = Symbol.for("v-txt");
+const Comment = Symbol.for("v-cmt");
+const Static = Symbol.for("v-stc");
+const blockStack = [];
+let currentBlock = null;
+function openBlock(disableTracking = false) {
+  blockStack.push(currentBlock = disableTracking ? null : []);
+}
+function closeBlock() {
+  blockStack.pop();
+  currentBlock = blockStack[blockStack.length - 1] || null;
+}
+let isBlockTreeEnabled = 1;
+function setBlockTracking(value) {
+  isBlockTreeEnabled += value;
+}
+function setupBlock(vnode) {
+  vnode.dynamicChildren = isBlockTreeEnabled > 0 ? currentBlock || EMPTY_ARR : null;
+  closeBlock();
+  if (isBlockTreeEnabled > 0 && currentBlock) {
+    currentBlock.push(vnode);
+  }
+  return vnode;
+}
+function createElementBlock(type, props, children, patchFlag, dynamicProps, shapeFlag) {
+  return setupBlock(
+    createBaseVNode(
+      type,
+      props,
+      children,
+      patchFlag,
+      dynamicProps,
+      shapeFlag,
+      true
+      /* isBlock */
+    )
+  );
+}
+function createBlock(type, props, children, patchFlag, dynamicProps) {
+  return setupBlock(
+    createVNode(
+      type,
+      props,
+      children,
+      patchFlag,
+      dynamicProps,
+      true
+      /* isBlock: prevent a block from tracking itself */
+    )
+  );
+}
+function isVNode(value) {
+  return value ? value.__v_isVNode === true : false;
+}
+function isSameVNodeType(n1, n2) {
+  if (n2.shapeFlag & 6 && hmrDirtyComponents.has(n2.type)) {
+    n1.shapeFlag &= ~256;
+    n2.shapeFlag &= ~512;
+    return false;
+  }
+  return n1.type === n2.type && n1.key === n2.key;
+}
+let vnodeArgsTransformer;
+function transformVNodeArgs(transformer) {
+  vnodeArgsTransformer = transformer;
+}
+const createVNodeWithArgsTransform = (...args) => {
+  return _createVNode(
+    ...vnodeArgsTransformer ? vnodeArgsTransformer(args, currentRenderingInstance) : args
+  );
+};
+const InternalObjectKey = `__vInternal`;
+const normalizeKey = ({ key }) => key != null ? key : null;
+const normalizeRef = ({
+  ref,
+  ref_key,
+  ref_for
+}) => {
+  if (typeof ref === "number") {
+    ref = "" + ref;
+  }
+  return ref != null ? isString(ref) || isRef(ref) || isFunction(ref) ? { i: currentRenderingInstance, r: ref, k: ref_key, f: !!ref_for } : ref : null;
+};
+function createBaseVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, shapeFlag = type === Fragment ? 0 : 1, isBlockNode = false, needFullChildrenNormalization = false) {
+  const vnode = {
+    __v_isVNode: true,
+    __v_skip: true,
+    type,
+    props,
+    key: props && normalizeKey(props),
+    ref: props && normalizeRef(props),
+    scopeId: currentScopeId,
+    slotScopeIds: null,
+    children,
+    component: null,
+    suspense: null,
+    ssContent: null,
+    ssFallback: null,
+    dirs: null,
+    transition: null,
+    el: null,
+    anchor: null,
+    target: null,
+    targetAnchor: null,
+    staticCount: 0,
+    shapeFlag,
+    patchFlag,
+    dynamicProps,
+    dynamicChildren: null,
+    appContext: null,
+    ctx: currentRenderingInstance
+  };
+  if (needFullChildrenNormalization) {
+    normalizeChildren(vnode, children);
+    if (shapeFlag & 128) {
+      type.normalize(vnode);
+    }
+  } else if (children) {
+    vnode.shapeFlag |= isString(children) ? 8 : 16;
+  }
+  if (vnode.key !== vnode.key) {
+    warn(`VNode created with invalid key (NaN). VNode type:`, vnode.type);
+  }
+  if (isBlockTreeEnabled > 0 && // avoid a block node from tracking itself
+  !isBlockNode && // has current parent block
+  currentBlock && // presence of a patch flag indicates this node needs patching on updates.
+  // component nodes also should always be patched, because even if the
+  // component doesn't need to update, it needs to persist the instance on to
+  // the next vnode so that it can be properly unmounted later.
+  (vnode.patchFlag > 0 || shapeFlag & 6) && // the EVENTS flag is only for hydration and if it is the only flag, the
+  // vnode should not be considered dynamic due to handler caching.
+  vnode.patchFlag !== 32) {
+    currentBlock.push(vnode);
+  }
+  return vnode;
+}
+const createVNode = createVNodeWithArgsTransform ;
+function _createVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, isBlockNode = false) {
+  if (!type || type === NULL_DYNAMIC_COMPONENT) {
+    if (!type) {
+      warn(`Invalid vnode type when creating vnode: ${type}.`);
+    }
+    type = Comment;
+  }
+  if (isVNode(type)) {
+    const cloned = cloneVNode(
+      type,
+      props,
+      true
+      /* mergeRef: true */
+    );
+    if (children) {
+      normalizeChildren(cloned, children);
+    }
+    if (isBlockTreeEnabled > 0 && !isBlockNode && currentBlock) {
+      if (cloned.shapeFlag & 6) {
+        currentBlock[currentBlock.indexOf(type)] = cloned;
+      } else {
+        currentBlock.push(cloned);
+      }
+    }
+    cloned.patchFlag |= -2;
+    return cloned;
+  }
+  if (isClassComponent(type)) {
+    type = type.__vccOpts;
+  }
+  if (props) {
+    props = guardReactiveProps(props);
+    let { class: klass, style } = props;
+    if (klass && !isString(klass)) {
+      props.class = normalizeClass(klass);
+    }
+    if (isObject(style)) {
+      if (isProxy(style) && !isArray(style)) {
+        style = extend({}, style);
+      }
+      props.style = normalizeStyle(style);
+    }
+  }
+  const shapeFlag = isString(type) ? 1 : isSuspense(type) ? 128 : isTeleport(type) ? 64 : isObject(type) ? 4 : isFunction(type) ? 2 : 0;
+  if (shapeFlag & 4 && isProxy(type)) {
+    type = toRaw(type);
+    warn(
+      `Vue received a Component which was made a reactive object. This can lead to unnecessary performance overhead, and should be avoided by marking the component with \`markRaw\` or using \`shallowRef\` instead of \`ref\`.`,
+      `
+Component that was made reactive: `,
+      type
+    );
+  }
+  return createBaseVNode(
+    type,
+    props,
+    children,
+    patchFlag,
+    dynamicProps,
+    shapeFlag,
+    isBlockNode,
+    true
+  );
+}
+function guardReactiveProps(props) {
+  if (!props)
+    return null;
+  return isProxy(props) || InternalObjectKey in props ? extend({}, props) : props;
+}
+function cloneVNode(vnode, extraProps, mergeRef = false) {
+  const { props, ref, patchFlag, children } = vnode;
+  const mergedProps = extraProps ? mergeProps(props || {}, extraProps) : props;
+  const cloned = {
+    __v_isVNode: true,
+    __v_skip: true,
+    type: vnode.type,
+    props: mergedProps,
+    key: mergedProps && normalizeKey(mergedProps),
+    ref: extraProps && extraProps.ref ? (
+      // #2078 in the case of <component :is="vnode" ref="extra"/>
+      // if the vnode itself already has a ref, cloneVNode will need to merge
+      // the refs so the single vnode can be set on multiple refs
+      mergeRef && ref ? isArray(ref) ? ref.concat(normalizeRef(extraProps)) : [ref, normalizeRef(extraProps)] : normalizeRef(extraProps)
+    ) : ref,
+    scopeId: vnode.scopeId,
+    slotScopeIds: vnode.slotScopeIds,
+    children: patchFlag === -1 && isArray(children) ? children.map(deepCloneVNode) : children,
+    target: vnode.target,
+    targetAnchor: vnode.targetAnchor,
+    staticCount: vnode.staticCount,
+    shapeFlag: vnode.shapeFlag,
+    // if the vnode is cloned with extra props, we can no longer assume its
+    // existing patch flag to be reliable and need to add the FULL_PROPS flag.
+    // note: preserve flag for fragments since they use the flag for children
+    // fast paths only.
+    patchFlag: extraProps && vnode.type !== Fragment ? patchFlag === -1 ? 16 : patchFlag | 16 : patchFlag,
+    dynamicProps: vnode.dynamicProps,
+    dynamicChildren: vnode.dynamicChildren,
+    appContext: vnode.appContext,
+    dirs: vnode.dirs,
+    transition: vnode.transition,
+    // These should technically only be non-null on mounted VNodes. However,
+    // they *should* be copied for kept-alive vnodes. So we just always copy
+    // them since them being non-null during a mount doesn't affect the logic as
+    // they will simply be overwritten.
+    component: vnode.component,
+    suspense: vnode.suspense,
+    ssContent: vnode.ssContent && cloneVNode(vnode.ssContent),
+    ssFallback: vnode.ssFallback && cloneVNode(vnode.ssFallback),
+    el: vnode.el,
+    anchor: vnode.anchor,
+    ctx: vnode.ctx,
+    ce: vnode.ce
+  };
+  return cloned;
+}
+function deepCloneVNode(vnode) {
+  const cloned = cloneVNode(vnode);
+  if (isArray(vnode.children)) {
+    cloned.children = vnode.children.map(deepCloneVNode);
+  }
+  return cloned;
+}
+function createTextVNode(text = " ", flag = 0) {
+  return createVNode(Text, null, text, flag);
+}
+function createStaticVNode(content, numberOfNodes) {
+  const vnode = createVNode(Static, null, content);
+  vnode.staticCount = numberOfNodes;
+  return vnode;
+}
+function createCommentVNode(text = "", asBlock = false) {
+  return asBlock ? (openBlock(), createBlock(Comment, null, text)) : createVNode(Comment, null, text);
+}
+function normalizeVNode(child) {
+  if (child == null || typeof child === "boolean") {
+    return createVNode(Comment);
+  } else if (isArray(child)) {
+    return createVNode(
+      Fragment,
+      null,
+      // #3666, avoid reference pollution when reusing vnode
+      child.slice()
+    );
+  } else if (typeof child === "object") {
+    return cloneIfMounted(child);
+  } else {
+    return createVNode(Text, null, String(child));
+  }
+}
+function cloneIfMounted(child) {
+  return child.el === null && child.patchFlag !== -1 || child.memo ? child : cloneVNode(child);
+}
+function normalizeChildren(vnode, children) {
+  let type = 0;
+  const { shapeFlag } = vnode;
+  if (children == null) {
+    children = null;
+  } else if (isArray(children)) {
+    type = 16;
+  } else if (typeof children === "object") {
+    if (shapeFlag & (1 | 64)) {
+      const slot = children.default;
+      if (slot) {
+        slot._c && (slot._d = false);
+        normalizeChildren(vnode, slot());
+        slot._c && (slot._d = true);
+      }
+      return;
+    } else {
+      type = 32;
+      const slotFlag = children._;
+      if (!slotFlag && !(InternalObjectKey in children)) {
+        children._ctx = currentRenderingInstance;
+      } else if (slotFlag === 3 && currentRenderingInstance) {
+        if (currentRenderingInstance.slots._ === 1) {
+          children._ = 1;
+        } else {
+          children._ = 2;
+          vnode.patchFlag |= 1024;
+        }
+      }
+    }
+  } else if (isFunction(children)) {
+    children = { default: children, _ctx: currentRenderingInstance };
+    type = 32;
+  } else {
+    children = String(children);
+    if (shapeFlag & 64) {
+      type = 16;
+      children = [createTextVNode(children)];
+    } else {
+      type = 8;
+    }
+  }
+  vnode.children = children;
+  vnode.shapeFlag |= type;
+}
+function mergeProps(...args) {
+  const ret = {};
+  for (let i = 0; i < args.length; i++) {
+    const toMerge = args[i];
+    for (const key in toMerge) {
+      if (key === "class") {
+        if (ret.class !== toMerge.class) {
+          ret.class = normalizeClass([ret.class, toMerge.class]);
+        }
+      } else if (key === "style") {
+        ret.style = normalizeStyle([ret.style, toMerge.style]);
+      } else if (isOn(key)) {
+        const existing = ret[key];
+        const incoming = toMerge[key];
+        if (incoming && existing !== incoming && !(isArray(existing) && existing.includes(incoming))) {
+          ret[key] = existing ? [].concat(existing, incoming) : incoming;
+        }
+      } else if (key !== "") {
+        ret[key] = toMerge[key];
+      }
+    }
+  }
+  return ret;
+}
+function invokeVNodeHook(hook, instance, vnode, prevVNode = null) {
+  callWithAsyncErrorHandling(hook, instance, 7, [
+    vnode,
+    prevVNode
+  ]);
+}
+
+const emptyAppContext = createAppContext();
+let uid = 0;
+function createComponentInstance(vnode, parent, suspense) {
+  const type = vnode.type;
+  const appContext = (parent ? parent.appContext : vnode.appContext) || emptyAppContext;
+  const instance = {
+    uid: uid++,
+    vnode,
+    type,
+    parent,
+    appContext,
+    root: null,
+    // to be immediately set
+    next: null,
+    subTree: null,
+    // will be set synchronously right after creation
+    effect: null,
+    update: null,
+    // will be set synchronously right after creation
+    scope: new EffectScope(
+      true
+      /* detached */
+    ),
+    render: null,
+    proxy: null,
+    exposed: null,
+    exposeProxy: null,
+    withProxy: null,
+    provides: parent ? parent.provides : Object.create(appContext.provides),
+    accessCache: null,
+    renderCache: [],
+    // local resolved assets
+    components: null,
+    directives: null,
+    // resolved props and emits options
+    propsOptions: normalizePropsOptions(type, appContext),
+    emitsOptions: normalizeEmitsOptions(type, appContext),
+    // emit
+    emit: null,
+    // to be set immediately
+    emitted: null,
+    // props default value
+    propsDefaults: EMPTY_OBJ,
+    // inheritAttrs
+    inheritAttrs: type.inheritAttrs,
+    // state
+    ctx: EMPTY_OBJ,
+    data: EMPTY_OBJ,
+    props: EMPTY_OBJ,
+    attrs: EMPTY_OBJ,
+    slots: EMPTY_OBJ,
+    refs: EMPTY_OBJ,
+    setupState: EMPTY_OBJ,
+    setupContext: null,
+    attrsProxy: null,
+    slotsProxy: null,
+    // suspense related
+    suspense,
+    suspenseId: suspense ? suspense.pendingId : 0,
+    asyncDep: null,
+    asyncResolved: false,
+    // lifecycle hooks
+    // not using enums here because it results in computed properties
+    isMounted: false,
+    isUnmounted: false,
+    isDeactivated: false,
+    bc: null,
+    c: null,
+    bm: null,
+    m: null,
+    bu: null,
+    u: null,
+    um: null,
+    bum: null,
+    da: null,
+    a: null,
+    rtg: null,
+    rtc: null,
+    ec: null,
+    sp: null
+  };
+  {
+    instance.ctx = createDevRenderContext(instance);
+  }
+  instance.root = parent ? parent.root : instance;
+  instance.emit = emit.bind(null, instance);
+  if (vnode.ce) {
+    vnode.ce(instance);
+  }
+  return instance;
+}
+let currentInstance = null;
+const getCurrentInstance = () => currentInstance || currentRenderingInstance;
+let internalSetCurrentInstance;
+{
+  internalSetCurrentInstance = (i) => {
+    currentInstance = i;
+  };
+}
+const setCurrentInstance = (instance) => {
+  internalSetCurrentInstance(instance);
+  instance.scope.on();
+};
+const unsetCurrentInstance = () => {
+  currentInstance && currentInstance.scope.off();
+  internalSetCurrentInstance(null);
+};
+const isBuiltInTag = /* @__PURE__ */ makeMap("slot,component");
+function validateComponentName(name, config) {
+  const appIsNativeTag = config.isNativeTag || NO;
+  if (isBuiltInTag(name) || appIsNativeTag(name)) {
+    warn(
+      "Do not use built-in or reserved HTML elements as component id: " + name
+    );
+  }
+}
+function isStatefulComponent(instance) {
+  return instance.vnode.shapeFlag & 4;
+}
+let isInSSRComponentSetup = false;
+function setupComponent(instance, isSSR = false) {
+  isInSSRComponentSetup = isSSR;
+  const { props, children } = instance.vnode;
+  const isStateful = isStatefulComponent(instance);
+  initProps(instance, props, isStateful, isSSR);
+  initSlots(instance, children);
+  const setupResult = isStateful ? setupStatefulComponent(instance, isSSR) : void 0;
+  isInSSRComponentSetup = false;
+  return setupResult;
+}
+function setupStatefulComponent(instance, isSSR) {
+  var _a;
+  const Component = instance.type;
+  {
+    if (Component.name) {
+      validateComponentName(Component.name, instance.appContext.config);
+    }
+    if (Component.components) {
+      const names = Object.keys(Component.components);
+      for (let i = 0; i < names.length; i++) {
+        validateComponentName(names[i], instance.appContext.config);
+      }
+    }
+    if (Component.directives) {
+      const names = Object.keys(Component.directives);
+      for (let i = 0; i < names.length; i++) {
+        validateDirectiveName(names[i]);
+      }
+    }
+    if (Component.compilerOptions && isRuntimeOnly()) {
+      warn(
+        `"compilerOptions" is only supported when using a build of Vue that includes the runtime compiler. Since you are using a runtime-only build, the options should be passed via your build tool config instead.`
+      );
+    }
+  }
+  instance.accessCache = /* @__PURE__ */ Object.create(null);
+  instance.proxy = markRaw(new Proxy(instance.ctx, PublicInstanceProxyHandlers));
+  {
+    exposePropsOnRenderContext(instance);
+  }
+  const { setup } = Component;
+  if (setup) {
+    const setupContext = instance.setupContext = setup.length > 1 ? createSetupContext(instance) : null;
+    setCurrentInstance(instance);
+    pauseTracking();
+    const setupResult = callWithErrorHandling(
+      setup,
+      instance,
+      0,
+      [shallowReadonly(instance.props) , setupContext]
+    );
+    resetTracking();
+    unsetCurrentInstance();
+    if (isPromise(setupResult)) {
+      setupResult.then(unsetCurrentInstance, unsetCurrentInstance);
+      if (isSSR) {
+        return setupResult.then((resolvedResult) => {
+          handleSetupResult(instance, resolvedResult, isSSR);
+        }).catch((e) => {
+          handleError(e, instance, 0);
+        });
+      } else {
+        instance.asyncDep = setupResult;
+        if (!instance.suspense) {
+          const name = (_a = Component.name) != null ? _a : "Anonymous";
+          warn(
+            `Component <${name}>: setup function returned a promise, but no <Suspense> boundary was found in the parent component tree. A component with async setup() must be nested in a <Suspense> in order to be rendered.`
+          );
+        }
+      }
+    } else {
+      handleSetupResult(instance, setupResult, isSSR);
+    }
+  } else {
+    finishComponentSetup(instance, isSSR);
+  }
+}
+function handleSetupResult(instance, setupResult, isSSR) {
+  if (isFunction(setupResult)) {
+    {
+      instance.render = setupResult;
+    }
+  } else if (isObject(setupResult)) {
+    if (isVNode(setupResult)) {
+      warn(
+        `setup() should not return VNodes directly - return a render function instead.`
+      );
+    }
+    {
+      instance.devtoolsRawSetupState = setupResult;
+    }
+    instance.setupState = proxyRefs(setupResult);
+    {
+      exposeSetupStateOnRenderContext(instance);
+    }
+  } else if (setupResult !== void 0) {
+    warn(
+      `setup() should return an object. Received: ${setupResult === null ? "null" : typeof setupResult}`
+    );
+  }
+  finishComponentSetup(instance, isSSR);
+}
+let compile$1;
+let installWithProxy;
+function registerRuntimeCompiler(_compile) {
+  compile$1 = _compile;
+  installWithProxy = (i) => {
+    if (i.render._rc) {
+      i.withProxy = new Proxy(i.ctx, RuntimeCompiledPublicInstanceProxyHandlers);
+    }
+  };
+}
+const isRuntimeOnly = () => !compile$1;
+function finishComponentSetup(instance, isSSR, skipOptions) {
+  const Component = instance.type;
+  if (!instance.render) {
+    if (!isSSR && compile$1 && !Component.render) {
+      const template = Component.template || resolveMergedOptions(instance).template;
+      if (template) {
+        {
+          startMeasure(instance, `compile`);
+        }
+        const { isCustomElement, compilerOptions } = instance.appContext.config;
+        const { delimiters, compilerOptions: componentCompilerOptions } = Component;
+        const finalCompilerOptions = extend(
+          extend(
+            {
+              isCustomElement,
+              delimiters
+            },
+            compilerOptions
+          ),
+          componentCompilerOptions
+        );
+        Component.render = compile$1(template, finalCompilerOptions);
+        {
+          endMeasure(instance, `compile`);
+        }
+      }
+    }
+    instance.render = Component.render || NOOP;
+    if (installWithProxy) {
+      installWithProxy(instance);
+    }
+  }
+  {
+    setCurrentInstance(instance);
+    pauseTracking();
+    try {
+      applyOptions(instance);
+    } finally {
+      resetTracking();
+      unsetCurrentInstance();
+    }
+  }
+  if (!Component.render && instance.render === NOOP && !isSSR) {
+    if (!compile$1 && Component.template) {
+      warn(
+        `Component provided template option but runtime compilation is not supported in this build of Vue.` + (` Use "vue.esm-browser.js" instead.` )
+        /* should not happen */
+      );
+    } else {
+      warn(`Component is missing template or render function.`);
+    }
+  }
+}
+function getAttrsProxy(instance) {
+  return instance.attrsProxy || (instance.attrsProxy = new Proxy(
+    instance.attrs,
+    {
+      get(target, key) {
+        markAttrsAccessed();
+        track(instance, "get", "$attrs");
+        return target[key];
+      },
+      set() {
+        warn(`setupContext.attrs is readonly.`);
+        return false;
+      },
+      deleteProperty() {
+        warn(`setupContext.attrs is readonly.`);
+        return false;
+      }
+    } 
+  ));
+}
+function getSlotsProxy(instance) {
+  return instance.slotsProxy || (instance.slotsProxy = new Proxy(instance.slots, {
+    get(target, key) {
+      track(instance, "get", "$slots");
+      return target[key];
+    }
+  }));
+}
+function createSetupContext(instance) {
+  const expose = (exposed) => {
+    {
+      if (instance.exposed) {
+        warn(`expose() should be called only once per setup().`);
+      }
+      if (exposed != null) {
+        let exposedType = typeof exposed;
+        if (exposedType === "object") {
+          if (isArray(exposed)) {
+            exposedType = "array";
+          } else if (isRef(exposed)) {
+            exposedType = "ref";
+          }
+        }
+        if (exposedType !== "object") {
+          warn(
+            `expose() should be passed a plain object, received ${exposedType}.`
+          );
+        }
+      }
+    }
+    instance.exposed = exposed || {};
+  };
+  {
+    return Object.freeze({
+      get attrs() {
+        return getAttrsProxy(instance);
+      },
+      get slots() {
+        return getSlotsProxy(instance);
+      },
+      get emit() {
+        return (event, ...args) => instance.emit(event, ...args);
+      },
+      expose
+    });
+  }
+}
+function getExposeProxy(instance) {
+  if (instance.exposed) {
+    return instance.exposeProxy || (instance.exposeProxy = new Proxy(proxyRefs(markRaw(instance.exposed)), {
+      get(target, key) {
+        if (key in target) {
+          return target[key];
+        } else if (key in publicPropertiesMap) {
+          return publicPropertiesMap[key](instance);
+        }
+      },
+      has(target, key) {
+        return key in target || key in publicPropertiesMap;
+      }
+    }));
+  }
+}
+const classifyRE = /(?:^|[-_])(\w)/g;
+const classify = (str) => str.replace(classifyRE, (c) => c.toUpperCase()).replace(/[-_]/g, "");
+function getComponentName(Component, includeInferred = true) {
+  return isFunction(Component) ? Component.displayName || Component.name : Component.name || includeInferred && Component.__name;
+}
+function formatComponentName(instance, Component, isRoot = false) {
+  let name = getComponentName(Component);
+  if (!name && Component.__file) {
+    const match = Component.__file.match(/([^/\\]+)\.\w+$/);
+    if (match) {
+      name = match[1];
+    }
+  }
+  if (!name && instance && instance.parent) {
+    const inferFromRegistry = (registry) => {
+      for (const key in registry) {
+        if (registry[key] === Component) {
+          return key;
+        }
+      }
+    };
+    name = inferFromRegistry(
+      instance.components || instance.parent.type.components
+    ) || inferFromRegistry(instance.appContext.components);
+  }
+  return name ? classify(name) : isRoot ? `App` : `Anonymous`;
+}
+function isClassComponent(value) {
+  return isFunction(value) && "__vccOpts" in value;
+}
+
+const computed = (getterOrOptions, debugOptions) => {
+  return computed$1(getterOrOptions, debugOptions, isInSSRComponentSetup);
+};
+
+function h(type, propsOrChildren, children) {
+  const l = arguments.length;
+  if (l === 2) {
+    if (isObject(propsOrChildren) && !isArray(propsOrChildren)) {
+      if (isVNode(propsOrChildren)) {
+        return createVNode(type, null, [propsOrChildren]);
+      }
+      return createVNode(type, propsOrChildren);
+    } else {
+      return createVNode(type, null, propsOrChildren);
+    }
+  } else {
+    if (l > 3) {
+      children = Array.prototype.slice.call(arguments, 2);
+    } else if (l === 3 && isVNode(children)) {
+      children = [children];
+    }
+    return createVNode(type, propsOrChildren, children);
+  }
+}
+
+const ssrContextKey = Symbol.for("v-scx");
+const useSSRContext = () => {
+  {
+    const ctx = inject(ssrContextKey);
+    if (!ctx) {
+      warn(
+        `Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build.`
+      );
+    }
+    return ctx;
+  }
+};
+
+function initCustomFormatter() {
+  if (typeof window === "undefined") {
+    return;
+  }
+  const vueStyle = { style: "color:#3ba776" };
+  const numberStyle = { style: "color:#0b1bc9" };
+  const stringStyle = { style: "color:#b62e24" };
+  const keywordStyle = { style: "color:#9d288c" };
+  const formatter = {
+    header(obj) {
+      if (!isObject(obj)) {
+        return null;
+      }
+      if (obj.__isVue) {
+        return ["div", vueStyle, `VueInstance`];
+      } else if (isRef(obj)) {
+        return [
+          "div",
+          {},
+          ["span", vueStyle, genRefFlag(obj)],
+          "<",
+          formatValue(obj.value),
+          `>`
+        ];
+      } else if (isReactive(obj)) {
+        return [
+          "div",
+          {},
+          ["span", vueStyle, isShallow(obj) ? "ShallowReactive" : "Reactive"],
+          "<",
+          formatValue(obj),
+          `>${isReadonly(obj) ? ` (readonly)` : ``}`
+        ];
+      } else if (isReadonly(obj)) {
+        return [
+          "div",
+          {},
+          ["span", vueStyle, isShallow(obj) ? "ShallowReadonly" : "Readonly"],
+          "<",
+          formatValue(obj),
+          ">"
+        ];
+      }
+      return null;
+    },
+    hasBody(obj) {
+      return obj && obj.__isVue;
+    },
+    body(obj) {
+      if (obj && obj.__isVue) {
+        return [
+          "div",
+          {},
+          ...formatInstance(obj.$)
+        ];
+      }
+    }
+  };
+  function formatInstance(instance) {
+    const blocks = [];
+    if (instance.type.props && instance.props) {
+      blocks.push(createInstanceBlock("props", toRaw(instance.props)));
+    }
+    if (instance.setupState !== EMPTY_OBJ) {
+      blocks.push(createInstanceBlock("setup", instance.setupState));
+    }
+    if (instance.data !== EMPTY_OBJ) {
+      blocks.push(createInstanceBlock("data", toRaw(instance.data)));
+    }
+    const computed = extractKeys(instance, "computed");
+    if (computed) {
+      blocks.push(createInstanceBlock("computed", computed));
+    }
+    const injected = extractKeys(instance, "inject");
+    if (injected) {
+      blocks.push(createInstanceBlock("injected", injected));
+    }
+    blocks.push([
+      "div",
+      {},
+      [
+        "span",
+        {
+          style: keywordStyle.style + ";opacity:0.66"
+        },
+        "$ (internal): "
+      ],
+      ["object", { object: instance }]
+    ]);
+    return blocks;
+  }
+  function createInstanceBlock(type, target) {
+    target = extend({}, target);
+    if (!Object.keys(target).length) {
+      return ["span", {}];
+    }
+    return [
+      "div",
+      { style: "line-height:1.25em;margin-bottom:0.6em" },
+      [
+        "div",
+        {
+          style: "color:#476582"
+        },
+        type
+      ],
+      [
+        "div",
+        {
+          style: "padding-left:1.25em"
+        },
+        ...Object.keys(target).map((key) => {
+          return [
+            "div",
+            {},
+            ["span", keywordStyle, key + ": "],
+            formatValue(target[key], false)
+          ];
+        })
+      ]
+    ];
+  }
+  function formatValue(v, asRaw = true) {
+    if (typeof v === "number") {
+      return ["span", numberStyle, v];
+    } else if (typeof v === "string") {
+      return ["span", stringStyle, JSON.stringify(v)];
+    } else if (typeof v === "boolean") {
+      return ["span", keywordStyle, v];
+    } else if (isObject(v)) {
+      return ["object", { object: asRaw ? toRaw(v) : v }];
+    } else {
+      return ["span", stringStyle, String(v)];
+    }
+  }
+  function extractKeys(instance, type) {
+    const Comp = instance.type;
+    if (isFunction(Comp)) {
+      return;
+    }
+    const extracted = {};
+    for (const key in instance.ctx) {
+      if (isKeyOfType(Comp, key, type)) {
+        extracted[key] = instance.ctx[key];
+      }
+    }
+    return extracted;
+  }
+  function isKeyOfType(Comp, key, type) {
+    const opts = Comp[type];
+    if (isArray(opts) && opts.includes(key) || isObject(opts) && key in opts) {
+      return true;
+    }
+    if (Comp.extends && isKeyOfType(Comp.extends, key, type)) {
+      return true;
+    }
+    if (Comp.mixins && Comp.mixins.some((m) => isKeyOfType(m, key, type))) {
+      return true;
+    }
+  }
+  function genRefFlag(v) {
+    if (isShallow(v)) {
+      return `ShallowRef`;
+    }
+    if (v.effect) {
+      return `ComputedRef`;
+    }
+    return `Ref`;
+  }
+  if (window.devtoolsFormatters) {
+    window.devtoolsFormatters.push(formatter);
+  } else {
+    window.devtoolsFormatters = [formatter];
+  }
+}
+
+function withMemo(memo, render, cache, index) {
+  const cached = cache[index];
+  if (cached && isMemoSame(cached, memo)) {
+    return cached;
+  }
+  const ret = render();
+  ret.memo = memo.slice();
+  return cache[index] = ret;
+}
+function isMemoSame(cached, memo) {
+  const prev = cached.memo;
+  if (prev.length != memo.length) {
+    return false;
+  }
+  for (let i = 0; i < prev.length; i++) {
+    if (hasChanged(prev[i], memo[i])) {
+      return false;
+    }
+  }
+  if (isBlockTreeEnabled > 0 && currentBlock) {
+    currentBlock.push(cached);
+  }
+  return true;
+}
+
+const version = "3.3.6";
+const ssrUtils = null;
+const resolveFilter = null;
+const compatUtils = null;
+
+const svgNS = "http://www.w3.org/2000/svg";
+const doc = typeof document !== "undefined" ? document : null;
+const templateContainer = doc && /* @__PURE__ */ doc.createElement("template");
+const nodeOps = {
+  insert: (child, parent, anchor) => {
+    parent.insertBefore(child, anchor || null);
+  },
+  remove: (child) => {
+    const parent = child.parentNode;
+    if (parent) {
+      parent.removeChild(child);
+    }
+  },
+  createElement: (tag, isSVG, is, props) => {
+    const el = isSVG ? doc.createElementNS(svgNS, tag) : doc.createElement(tag, is ? { is } : void 0);
+    if (tag === "select" && props && props.multiple != null) {
+      el.setAttribute("multiple", props.multiple);
+    }
+    return el;
+  },
+  createText: (text) => doc.createTextNode(text),
+  createComment: (text) => doc.createComment(text),
+  setText: (node, text) => {
+    node.nodeValue = text;
+  },
+  setElementText: (el, text) => {
+    el.textContent = text;
+  },
+  parentNode: (node) => node.parentNode,
+  nextSibling: (node) => node.nextSibling,
+  querySelector: (selector) => doc.querySelector(selector),
+  setScopeId(el, id) {
+    el.setAttribute(id, "");
+  },
+  // __UNSAFE__
+  // Reason: innerHTML.
+  // Static content here can only come from compiled templates.
+  // As long as the user only uses trusted templates, this is safe.
+  insertStaticContent(content, parent, anchor, isSVG, start, end) {
+    const before = anchor ? anchor.previousSibling : parent.lastChild;
+    if (start && (start === end || start.nextSibling)) {
+      while (true) {
+        parent.insertBefore(start.cloneNode(true), anchor);
+        if (start === end || !(start = start.nextSibling))
+          break;
+      }
+    } else {
+      templateContainer.innerHTML = isSVG ? `<svg>${content}</svg>` : content;
+      const template = templateContainer.content;
+      if (isSVG) {
+        const wrapper = template.firstChild;
+        while (wrapper.firstChild) {
+          template.appendChild(wrapper.firstChild);
+        }
+        template.removeChild(wrapper);
+      }
+      parent.insertBefore(template, anchor);
+    }
+    return [
+      // first
+      before ? before.nextSibling : parent.firstChild,
+      // last
+      anchor ? anchor.previousSibling : parent.lastChild
+    ];
+  }
+};
+
+const TRANSITION$1 = "transition";
+const ANIMATION = "animation";
+const vtcKey = Symbol("_vtc");
+const Transition = (props, { slots }) => h(BaseTransition, resolveTransitionProps(props), slots);
+Transition.displayName = "Transition";
+const DOMTransitionPropsValidators = {
+  name: String,
+  type: String,
+  css: {
+    type: Boolean,
+    default: true
+  },
+  duration: [String, Number, Object],
+  enterFromClass: String,
+  enterActiveClass: String,
+  enterToClass: String,
+  appearFromClass: String,
+  appearActiveClass: String,
+  appearToClass: String,
+  leaveFromClass: String,
+  leaveActiveClass: String,
+  leaveToClass: String
+};
+const TransitionPropsValidators = Transition.props = /* @__PURE__ */ extend(
+  {},
+  BaseTransitionPropsValidators,
+  DOMTransitionPropsValidators
+);
+const callHook = (hook, args = []) => {
+  if (isArray(hook)) {
+    hook.forEach((h2) => h2(...args));
+  } else if (hook) {
+    hook(...args);
+  }
+};
+const hasExplicitCallback = (hook) => {
+  return hook ? isArray(hook) ? hook.some((h2) => h2.length > 1) : hook.length > 1 : false;
+};
+function resolveTransitionProps(rawProps) {
+  const baseProps = {};
+  for (const key in rawProps) {
+    if (!(key in DOMTransitionPropsValidators)) {
+      baseProps[key] = rawProps[key];
+    }
+  }
+  if (rawProps.css === false) {
+    return baseProps;
+  }
+  const {
+    name = "v",
+    type,
+    duration,
+    enterFromClass = `${name}-enter-from`,
+    enterActiveClass = `${name}-enter-active`,
+    enterToClass = `${name}-enter-to`,
+    appearFromClass = enterFromClass,
+    appearActiveClass = enterActiveClass,
+    appearToClass = enterToClass,
+    leaveFromClass = `${name}-leave-from`,
+    leaveActiveClass = `${name}-leave-active`,
+    leaveToClass = `${name}-leave-to`
+  } = rawProps;
+  const durations = normalizeDuration(duration);
+  const enterDuration = durations && durations[0];
+  const leaveDuration = durations && durations[1];
+  const {
+    onBeforeEnter,
+    onEnter,
+    onEnterCancelled,
+    onLeave,
+    onLeaveCancelled,
+    onBeforeAppear = onBeforeEnter,
+    onAppear = onEnter,
+    onAppearCancelled = onEnterCancelled
+  } = baseProps;
+  const finishEnter = (el, isAppear, done) => {
+    removeTransitionClass(el, isAppear ? appearToClass : enterToClass);
+    removeTransitionClass(el, isAppear ? appearActiveClass : enterActiveClass);
+    done && done();
+  };
+  const finishLeave = (el, done) => {
+    el._isLeaving = false;
+    removeTransitionClass(el, leaveFromClass);
+    removeTransitionClass(el, leaveToClass);
+    removeTransitionClass(el, leaveActiveClass);
+    done && done();
+  };
+  const makeEnterHook = (isAppear) => {
+    return (el, done) => {
+      const hook = isAppear ? onAppear : onEnter;
+      const resolve = () => finishEnter(el, isAppear, done);
+      callHook(hook, [el, resolve]);
+      nextFrame(() => {
+        removeTransitionClass(el, isAppear ? appearFromClass : enterFromClass);
+        addTransitionClass(el, isAppear ? appearToClass : enterToClass);
+        if (!hasExplicitCallback(hook)) {
+          whenTransitionEnds(el, type, enterDuration, resolve);
+        }
+      });
+    };
+  };
+  return extend(baseProps, {
+    onBeforeEnter(el) {
+      callHook(onBeforeEnter, [el]);
+      addTransitionClass(el, enterFromClass);
+      addTransitionClass(el, enterActiveClass);
+    },
+    onBeforeAppear(el) {
+      callHook(onBeforeAppear, [el]);
+      addTransitionClass(el, appearFromClass);
+      addTransitionClass(el, appearActiveClass);
+    },
+    onEnter: makeEnterHook(false),
+    onAppear: makeEnterHook(true),
+    onLeave(el, done) {
+      el._isLeaving = true;
+      const resolve = () => finishLeave(el, done);
+      addTransitionClass(el, leaveFromClass);
+      forceReflow();
+      addTransitionClass(el, leaveActiveClass);
+      nextFrame(() => {
+        if (!el._isLeaving) {
+          return;
+        }
+        removeTransitionClass(el, leaveFromClass);
+        addTransitionClass(el, leaveToClass);
+        if (!hasExplicitCallback(onLeave)) {
+          whenTransitionEnds(el, type, leaveDuration, resolve);
+        }
+      });
+      callHook(onLeave, [el, resolve]);
+    },
+    onEnterCancelled(el) {
+      finishEnter(el, false);
+      callHook(onEnterCancelled, [el]);
+    },
+    onAppearCancelled(el) {
+      finishEnter(el, true);
+      callHook(onAppearCancelled, [el]);
+    },
+    onLeaveCancelled(el) {
+      finishLeave(el);
+      callHook(onLeaveCancelled, [el]);
+    }
+  });
+}
+function normalizeDuration(duration) {
+  if (duration == null) {
+    return null;
+  } else if (isObject(duration)) {
+    return [NumberOf(duration.enter), NumberOf(duration.leave)];
+  } else {
+    const n = NumberOf(duration);
+    return [n, n];
+  }
+}
+function NumberOf(val) {
+  const res = toNumber(val);
+  {
+    assertNumber(res, "<transition> explicit duration");
+  }
+  return res;
+}
+function addTransitionClass(el, cls) {
+  cls.split(/\s+/).forEach((c) => c && el.classList.add(c));
+  (el[vtcKey] || (el[vtcKey] = /* @__PURE__ */ new Set())).add(cls);
+}
+function removeTransitionClass(el, cls) {
+  cls.split(/\s+/).forEach((c) => c && el.classList.remove(c));
+  const _vtc = el[vtcKey];
+  if (_vtc) {
+    _vtc.delete(cls);
+    if (!_vtc.size) {
+      el[vtcKey] = void 0;
+    }
+  }
+}
+function nextFrame(cb) {
+  requestAnimationFrame(() => {
+    requestAnimationFrame(cb);
+  });
+}
+let endId = 0;
+function whenTransitionEnds(el, expectedType, explicitTimeout, resolve) {
+  const id = el._endId = ++endId;
+  const resolveIfNotStale = () => {
+    if (id === el._endId) {
+      resolve();
+    }
+  };
+  if (explicitTimeout) {
+    return setTimeout(resolveIfNotStale, explicitTimeout);
+  }
+  const { type, timeout, propCount } = getTransitionInfo(el, expectedType);
+  if (!type) {
+    return resolve();
+  }
+  const endEvent = type + "end";
+  let ended = 0;
+  const end = () => {
+    el.removeEventListener(endEvent, onEnd);
+    resolveIfNotStale();
+  };
+  const onEnd = (e) => {
+    if (e.target === el && ++ended >= propCount) {
+      end();
+    }
+  };
+  setTimeout(() => {
+    if (ended < propCount) {
+      end();
+    }
+  }, timeout + 1);
+  el.addEventListener(endEvent, onEnd);
+}
+function getTransitionInfo(el, expectedType) {
+  const styles = window.getComputedStyle(el);
+  const getStyleProperties = (key) => (styles[key] || "").split(", ");
+  const transitionDelays = getStyleProperties(`${TRANSITION$1}Delay`);
+  const transitionDurations = getStyleProperties(`${TRANSITION$1}Duration`);
+  const transitionTimeout = getTimeout(transitionDelays, transitionDurations);
+  const animationDelays = getStyleProperties(`${ANIMATION}Delay`);
+  const animationDurations = getStyleProperties(`${ANIMATION}Duration`);
+  const animationTimeout = getTimeout(animationDelays, animationDurations);
+  let type = null;
+  let timeout = 0;
+  let propCount = 0;
+  if (expectedType === TRANSITION$1) {
+    if (transitionTimeout > 0) {
+      type = TRANSITION$1;
+      timeout = transitionTimeout;
+      propCount = transitionDurations.length;
+    }
+  } else if (expectedType === ANIMATION) {
+    if (animationTimeout > 0) {
+      type = ANIMATION;
+      timeout = animationTimeout;
+      propCount = animationDurations.length;
+    }
+  } else {
+    timeout = Math.max(transitionTimeout, animationTimeout);
+    type = timeout > 0 ? transitionTimeout > animationTimeout ? TRANSITION$1 : ANIMATION : null;
+    propCount = type ? type === TRANSITION$1 ? transitionDurations.length : animationDurations.length : 0;
+  }
+  const hasTransform = type === TRANSITION$1 && /\b(transform|all)(,|$)/.test(
+    getStyleProperties(`${TRANSITION$1}Property`).toString()
+  );
+  return {
+    type,
+    timeout,
+    propCount,
+    hasTransform
+  };
+}
+function getTimeout(delays, durations) {
+  while (delays.length < durations.length) {
+    delays = delays.concat(delays);
+  }
+  return Math.max(...durations.map((d, i) => toMs(d) + toMs(delays[i])));
+}
+function toMs(s) {
+  if (s === "auto")
+    return 0;
+  return Number(s.slice(0, -1).replace(",", ".")) * 1e3;
+}
+function forceReflow() {
+  return document.body.offsetHeight;
+}
+
+function patchClass(el, value, isSVG) {
+  const transitionClasses = el[vtcKey];
+  if (transitionClasses) {
+    value = (value ? [value, ...transitionClasses] : [...transitionClasses]).join(" ");
+  }
+  if (value == null) {
+    el.removeAttribute("class");
+  } else if (isSVG) {
+    el.setAttribute("class", value);
+  } else {
+    el.className = value;
+  }
+}
+
+const vShowOldKey = Symbol("_vod");
+const vShow = {
+  beforeMount(el, { value }, { transition }) {
+    el[vShowOldKey] = el.style.display === "none" ? "" : el.style.display;
+    if (transition && value) {
+      transition.beforeEnter(el);
+    } else {
+      setDisplay(el, value);
+    }
+  },
+  mounted(el, { value }, { transition }) {
+    if (transition && value) {
+      transition.enter(el);
+    }
+  },
+  updated(el, { value, oldValue }, { transition }) {
+    if (!value === !oldValue)
+      return;
+    if (transition) {
+      if (value) {
+        transition.beforeEnter(el);
+        setDisplay(el, true);
+        transition.enter(el);
+      } else {
+        transition.leave(el, () => {
+          setDisplay(el, false);
+        });
+      }
+    } else {
+      setDisplay(el, value);
+    }
+  },
+  beforeUnmount(el, { value }) {
+    setDisplay(el, value);
+  }
+};
+function setDisplay(el, value) {
+  el.style.display = value ? el[vShowOldKey] : "none";
+}
+
+function patchStyle(el, prev, next) {
+  const style = el.style;
+  const isCssString = isString(next);
+  if (next && !isCssString) {
+    if (prev && !isString(prev)) {
+      for (const key in prev) {
+        if (next[key] == null) {
+          setStyle(style, key, "");
+        }
+      }
+    }
+    for (const key in next) {
+      setStyle(style, key, next[key]);
+    }
+  } else {
+    const currentDisplay = style.display;
+    if (isCssString) {
+      if (prev !== next) {
+        style.cssText = next;
+      }
+    } else if (prev) {
+      el.removeAttribute("style");
+    }
+    if (vShowOldKey in el) {
+      style.display = currentDisplay;
+    }
+  }
+}
+const semicolonRE = /[^\\];\s*$/;
+const importantRE = /\s*!important$/;
+function setStyle(style, name, val) {
+  if (isArray(val)) {
+    val.forEach((v) => setStyle(style, name, v));
+  } else {
+    if (val == null)
+      val = "";
+    {
+      if (semicolonRE.test(val)) {
+        warn(
+          `Unexpected semicolon at the end of '${name}' style value: '${val}'`
+        );
+      }
+    }
+    if (name.startsWith("--")) {
+      style.setProperty(name, val);
+    } else {
+      const prefixed = autoPrefix(style, name);
+      if (importantRE.test(val)) {
+        style.setProperty(
+          hyphenate(prefixed),
+          val.replace(importantRE, ""),
+          "important"
+        );
+      } else {
+        style[prefixed] = val;
+      }
+    }
+  }
+}
+const prefixes = ["Webkit", "Moz", "ms"];
+const prefixCache = {};
+function autoPrefix(style, rawName) {
+  const cached = prefixCache[rawName];
+  if (cached) {
+    return cached;
+  }
+  let name = camelize(rawName);
+  if (name !== "filter" && name in style) {
+    return prefixCache[rawName] = name;
+  }
+  name = capitalize(name);
+  for (let i = 0; i < prefixes.length; i++) {
+    const prefixed = prefixes[i] + name;
+    if (prefixed in style) {
+      return prefixCache[rawName] = prefixed;
+    }
+  }
+  return rawName;
+}
+
+const xlinkNS = "http://www.w3.org/1999/xlink";
+function patchAttr(el, key, value, isSVG, instance) {
+  if (isSVG && key.startsWith("xlink:")) {
+    if (value == null) {
+      el.removeAttributeNS(xlinkNS, key.slice(6, key.length));
+    } else {
+      el.setAttributeNS(xlinkNS, key, value);
+    }
+  } else {
+    const isBoolean = isSpecialBooleanAttr(key);
+    if (value == null || isBoolean && !includeBooleanAttr(value)) {
+      el.removeAttribute(key);
+    } else {
+      el.setAttribute(key, isBoolean ? "" : value);
+    }
+  }
+}
+
+function patchDOMProp(el, key, value, prevChildren, parentComponent, parentSuspense, unmountChildren) {
+  if (key === "innerHTML" || key === "textContent") {
+    if (prevChildren) {
+      unmountChildren(prevChildren, parentComponent, parentSuspense);
+    }
+    el[key] = value == null ? "" : value;
+    return;
+  }
+  const tag = el.tagName;
+  if (key === "value" && tag !== "PROGRESS" && // custom elements may use _value internally
+  !tag.includes("-")) {
+    el._value = value;
+    const oldValue = tag === "OPTION" ? el.getAttribute("value") : el.value;
+    const newValue = value == null ? "" : value;
+    if (oldValue !== newValue) {
+      el.value = newValue;
+    }
+    if (value == null) {
+      el.removeAttribute(key);
+    }
+    return;
+  }
+  let needRemove = false;
+  if (value === "" || value == null) {
+    const type = typeof el[key];
+    if (type === "boolean") {
+      value = includeBooleanAttr(value);
+    } else if (value == null && type === "string") {
+      value = "";
+      needRemove = true;
+    } else if (type === "number") {
+      value = 0;
+      needRemove = true;
+    }
+  }
+  try {
+    el[key] = value;
+  } catch (e) {
+    if (!needRemove) {
+      warn(
+        `Failed setting prop "${key}" on <${tag.toLowerCase()}>: value ${value} is invalid.`,
+        e
+      );
+    }
+  }
+  needRemove && el.removeAttribute(key);
+}
+
+function addEventListener(el, event, handler, options) {
+  el.addEventListener(event, handler, options);
+}
+function removeEventListener(el, event, handler, options) {
+  el.removeEventListener(event, handler, options);
+}
+const veiKey = Symbol("_vei");
+function patchEvent(el, rawName, prevValue, nextValue, instance = null) {
+  const invokers = el[veiKey] || (el[veiKey] = {});
+  const existingInvoker = invokers[rawName];
+  if (nextValue && existingInvoker) {
+    existingInvoker.value = nextValue;
+  } else {
+    const [name, options] = parseName(rawName);
+    if (nextValue) {
+      const invoker = invokers[rawName] = createInvoker(nextValue, instance);
+      addEventListener(el, name, invoker, options);
+    } else if (existingInvoker) {
+      removeEventListener(el, name, existingInvoker, options);
+      invokers[rawName] = void 0;
+    }
+  }
+}
+const optionsModifierRE = /(?:Once|Passive|Capture)$/;
+function parseName(name) {
+  let options;
+  if (optionsModifierRE.test(name)) {
+    options = {};
+    let m;
+    while (m = name.match(optionsModifierRE)) {
+      name = name.slice(0, name.length - m[0].length);
+      options[m[0].toLowerCase()] = true;
+    }
+  }
+  const event = name[2] === ":" ? name.slice(3) : hyphenate(name.slice(2));
+  return [event, options];
+}
+let cachedNow = 0;
+const p = /* @__PURE__ */ Promise.resolve();
+const getNow = () => cachedNow || (p.then(() => cachedNow = 0), cachedNow = Date.now());
+function createInvoker(initialValue, instance) {
+  const invoker = (e) => {
+    if (!e._vts) {
+      e._vts = Date.now();
+    } else if (e._vts <= invoker.attached) {
+      return;
+    }
+    callWithAsyncErrorHandling(
+      patchStopImmediatePropagation(e, invoker.value),
+      instance,
+      5,
+      [e]
+    );
+  };
+  invoker.value = initialValue;
+  invoker.attached = getNow();
+  return invoker;
+}
+function patchStopImmediatePropagation(e, value) {
+  if (isArray(value)) {
+    const originalStop = e.stopImmediatePropagation;
+    e.stopImmediatePropagation = () => {
+      originalStop.call(e);
+      e._stopped = true;
+    };
+    return value.map((fn) => (e2) => !e2._stopped && fn && fn(e2));
+  } else {
+    return value;
+  }
+}
+
+const nativeOnRE = /^on[a-z]/;
+const patchProp = (el, key, prevValue, nextValue, isSVG = false, prevChildren, parentComponent, parentSuspense, unmountChildren) => {
+  if (key === "class") {
+    patchClass(el, nextValue, isSVG);
+  } else if (key === "style") {
+    patchStyle(el, prevValue, nextValue);
+  } else if (isOn(key)) {
+    if (!isModelListener(key)) {
+      patchEvent(el, key, prevValue, nextValue, parentComponent);
+    }
+  } else if (key[0] === "." ? (key = key.slice(1), true) : key[0] === "^" ? (key = key.slice(1), false) : shouldSetAsProp(el, key, nextValue, isSVG)) {
+    patchDOMProp(
+      el,
+      key,
+      nextValue,
+      prevChildren,
+      parentComponent,
+      parentSuspense,
+      unmountChildren
+    );
+  } else {
+    if (key === "true-value") {
+      el._trueValue = nextValue;
+    } else if (key === "false-value") {
+      el._falseValue = nextValue;
+    }
+    patchAttr(el, key, nextValue, isSVG);
+  }
+};
+function shouldSetAsProp(el, key, value, isSVG) {
+  if (isSVG) {
+    if (key === "innerHTML" || key === "textContent") {
+      return true;
+    }
+    if (key in el && nativeOnRE.test(key) && isFunction(value)) {
+      return true;
+    }
+    return false;
+  }
+  if (key === "spellcheck" || key === "draggable" || key === "translate") {
+    return false;
+  }
+  if (key === "form") {
+    return false;
+  }
+  if (key === "list" && el.tagName === "INPUT") {
+    return false;
+  }
+  if (key === "type" && el.tagName === "TEXTAREA") {
+    return false;
+  }
+  if (nativeOnRE.test(key) && isString(value)) {
+    return false;
+  }
+  return key in el;
+}
+
+/*! #__NO_SIDE_EFFECTS__ */
+// @__NO_SIDE_EFFECTS__
+function defineCustomElement(options, hydrate2) {
+  const Comp = defineComponent(options);
+  class VueCustomElement extends VueElement {
+    constructor(initialProps) {
+      super(Comp, initialProps, hydrate2);
+    }
+  }
+  VueCustomElement.def = Comp;
+  return VueCustomElement;
+}
+/*! #__NO_SIDE_EFFECTS__ */
+const defineSSRCustomElement = /* @__NO_SIDE_EFFECTS__ */ (options) => {
+  return /* @__PURE__ */ defineCustomElement(options, hydrate);
+};
+const BaseClass = typeof HTMLElement !== "undefined" ? HTMLElement : class {
+};
+class VueElement extends BaseClass {
+  constructor(_def, _props = {}, hydrate2) {
+    super();
+    this._def = _def;
+    this._props = _props;
+    /**
+     * @internal
+     */
+    this._instance = null;
+    this._connected = false;
+    this._resolved = false;
+    this._numberProps = null;
+    this._ob = null;
+    if (this.shadowRoot && hydrate2) {
+      hydrate2(this._createVNode(), this.shadowRoot);
+    } else {
+      if (this.shadowRoot) {
+        warn(
+          `Custom element has pre-rendered declarative shadow root but is not defined as hydratable. Use \`defineSSRCustomElement\`.`
+        );
+      }
+      this.attachShadow({ mode: "open" });
+      if (!this._def.__asyncLoader) {
+        this._resolveProps(this._def);
+      }
+    }
+  }
+  connectedCallback() {
+    this._connected = true;
+    if (!this._instance) {
+      if (this._resolved) {
+        this._update();
+      } else {
+        this._resolveDef();
+      }
+    }
+  }
+  disconnectedCallback() {
+    this._connected = false;
+    if (this._ob) {
+      this._ob.disconnect();
+      this._ob = null;
+    }
+    nextTick(() => {
+      if (!this._connected) {
+        render(null, this.shadowRoot);
+        this._instance = null;
+      }
+    });
+  }
+  /**
+   * resolve inner component definition (handle possible async component)
+   */
+  _resolveDef() {
+    this._resolved = true;
+    for (let i = 0; i < this.attributes.length; i++) {
+      this._setAttr(this.attributes[i].name);
+    }
+    this._ob = new MutationObserver((mutations) => {
+      for (const m of mutations) {
+        this._setAttr(m.attributeName);
+      }
+    });
+    this._ob.observe(this, { attributes: true });
+    const resolve = (def, isAsync = false) => {
+      const { props, styles } = def;
+      let numberProps;
+      if (props && !isArray(props)) {
+        for (const key in props) {
+          const opt = props[key];
+          if (opt === Number || opt && opt.type === Number) {
+            if (key in this._props) {
+              this._props[key] = toNumber(this._props[key]);
+            }
+            (numberProps || (numberProps = /* @__PURE__ */ Object.create(null)))[camelize(key)] = true;
+          }
+        }
+      }
+      this._numberProps = numberProps;
+      if (isAsync) {
+        this._resolveProps(def);
+      }
+      this._applyStyles(styles);
+      this._update();
+    };
+    const asyncDef = this._def.__asyncLoader;
+    if (asyncDef) {
+      asyncDef().then((def) => resolve(def, true));
+    } else {
+      resolve(this._def);
+    }
+  }
+  _resolveProps(def) {
+    const { props } = def;
+    const declaredPropKeys = isArray(props) ? props : Object.keys(props || {});
+    for (const key of Object.keys(this)) {
+      if (key[0] !== "_" && declaredPropKeys.includes(key)) {
+        this._setProp(key, this[key], true, false);
+      }
+    }
+    for (const key of declaredPropKeys.map(camelize)) {
+      Object.defineProperty(this, key, {
+        get() {
+          return this._getProp(key);
+        },
+        set(val) {
+          this._setProp(key, val);
+        }
+      });
+    }
+  }
+  _setAttr(key) {
+    let value = this.getAttribute(key);
+    const camelKey = camelize(key);
+    if (this._numberProps && this._numberProps[camelKey]) {
+      value = toNumber(value);
+    }
+    this._setProp(camelKey, value, false);
+  }
+  /**
+   * @internal
+   */
+  _getProp(key) {
+    return this._props[key];
+  }
+  /**
+   * @internal
+   */
+  _setProp(key, val, shouldReflect = true, shouldUpdate = true) {
+    if (val !== this._props[key]) {
+      this._props[key] = val;
+      if (shouldUpdate && this._instance) {
+        this._update();
+      }
+      if (shouldReflect) {
+        if (val === true) {
+          this.setAttribute(hyphenate(key), "");
+        } else if (typeof val === "string" || typeof val === "number") {
+          this.setAttribute(hyphenate(key), val + "");
+        } else if (!val) {
+          this.removeAttribute(hyphenate(key));
+        }
+      }
+    }
+  }
+  _update() {
+    render(this._createVNode(), this.shadowRoot);
+  }
+  _createVNode() {
+    const vnode = createVNode(this._def, extend({}, this._props));
+    if (!this._instance) {
+      vnode.ce = (instance) => {
+        this._instance = instance;
+        instance.isCE = true;
+        {
+          instance.ceReload = (newStyles) => {
+            if (this._styles) {
+              this._styles.forEach((s) => this.shadowRoot.removeChild(s));
+              this._styles.length = 0;
+            }
+            this._applyStyles(newStyles);
+            this._instance = null;
+            this._update();
+          };
+        }
+        const dispatch = (event, args) => {
+          this.dispatchEvent(
+            new CustomEvent(event, {
+              detail: args
+            })
+          );
+        };
+        instance.emit = (event, ...args) => {
+          dispatch(event, args);
+          if (hyphenate(event) !== event) {
+            dispatch(hyphenate(event), args);
+          }
+        };
+        let parent = this;
+        while (parent = parent && (parent.parentNode || parent.host)) {
+          if (parent instanceof VueElement) {
+            instance.parent = parent._instance;
+            instance.provides = parent._instance.provides;
+            break;
+          }
+        }
+      };
+    }
+    return vnode;
+  }
+  _applyStyles(styles) {
+    if (styles) {
+      styles.forEach((css) => {
+        const s = document.createElement("style");
+        s.textContent = css;
+        this.shadowRoot.appendChild(s);
+        {
+          (this._styles || (this._styles = [])).push(s);
+        }
+      });
+    }
+  }
+}
+
+function useCssModule(name = "$style") {
+  {
+    const instance = getCurrentInstance();
+    if (!instance) {
+      warn(`useCssModule must be called inside setup()`);
+      return EMPTY_OBJ;
+    }
+    const modules = instance.type.__cssModules;
+    if (!modules) {
+      warn(`Current instance does not have CSS modules injected.`);
+      return EMPTY_OBJ;
+    }
+    const mod = modules[name];
+    if (!mod) {
+      warn(`Current instance does not have CSS module named "${name}".`);
+      return EMPTY_OBJ;
+    }
+    return mod;
+  }
+}
+
+function useCssVars(getter) {
+  const instance = getCurrentInstance();
+  if (!instance) {
+    warn(`useCssVars is called without current active component instance.`);
+    return;
+  }
+  const updateTeleports = instance.ut = (vars = getter(instance.proxy)) => {
+    Array.from(
+      document.querySelectorAll(`[data-v-owner="${instance.uid}"]`)
+    ).forEach((node) => setVarsOnNode(node, vars));
+  };
+  const setVars = () => {
+    const vars = getter(instance.proxy);
+    setVarsOnVNode(instance.subTree, vars);
+    updateTeleports(vars);
+  };
+  watchPostEffect(setVars);
+  onMounted(() => {
+    const ob = new MutationObserver(setVars);
+    ob.observe(instance.subTree.el.parentNode, { childList: true });
+    onUnmounted(() => ob.disconnect());
+  });
+}
+function setVarsOnVNode(vnode, vars) {
+  if (vnode.shapeFlag & 128) {
+    const suspense = vnode.suspense;
+    vnode = suspense.activeBranch;
+    if (suspense.pendingBranch && !suspense.isHydrating) {
+      suspense.effects.push(() => {
+        setVarsOnVNode(suspense.activeBranch, vars);
+      });
+    }
+  }
+  while (vnode.component) {
+    vnode = vnode.component.subTree;
+  }
+  if (vnode.shapeFlag & 1 && vnode.el) {
+    setVarsOnNode(vnode.el, vars);
+  } else if (vnode.type === Fragment) {
+    vnode.children.forEach((c) => setVarsOnVNode(c, vars));
+  } else if (vnode.type === Static) {
+    let { el, anchor } = vnode;
+    while (el) {
+      setVarsOnNode(el, vars);
+      if (el === anchor)
+        break;
+      el = el.nextSibling;
+    }
+  }
+}
+function setVarsOnNode(el, vars) {
+  if (el.nodeType === 1) {
+    const style = el.style;
+    for (const key in vars) {
+      style.setProperty(`--${key}`, vars[key]);
+    }
+  }
+}
+
+const positionMap = /* @__PURE__ */ new WeakMap();
+const newPositionMap = /* @__PURE__ */ new WeakMap();
+const moveCbKey = Symbol("_moveCb");
+const enterCbKey = Symbol("_enterCb");
+const TransitionGroupImpl = {
+  name: "TransitionGroup",
+  props: /* @__PURE__ */ extend({}, TransitionPropsValidators, {
+    tag: String,
+    moveClass: String
+  }),
+  setup(props, { slots }) {
+    const instance = getCurrentInstance();
+    const state = useTransitionState();
+    let prevChildren;
+    let children;
+    onUpdated(() => {
+      if (!prevChildren.length) {
+        return;
+      }
+      const moveClass = props.moveClass || `${props.name || "v"}-move`;
+      if (!hasCSSTransform(
+        prevChildren[0].el,
+        instance.vnode.el,
+        moveClass
+      )) {
+        return;
+      }
+      prevChildren.forEach(callPendingCbs);
+      prevChildren.forEach(recordPosition);
+      const movedChildren = prevChildren.filter(applyTranslation);
+      forceReflow();
+      movedChildren.forEach((c) => {
+        const el = c.el;
+        const style = el.style;
+        addTransitionClass(el, moveClass);
+        style.transform = style.webkitTransform = style.transitionDuration = "";
+        const cb = el[moveCbKey] = (e) => {
+          if (e && e.target !== el) {
+            return;
+          }
+          if (!e || /transform$/.test(e.propertyName)) {
+            el.removeEventListener("transitionend", cb);
+            el[moveCbKey] = null;
+            removeTransitionClass(el, moveClass);
+          }
+        };
+        el.addEventListener("transitionend", cb);
+      });
+    });
+    return () => {
+      const rawProps = toRaw(props);
+      const cssTransitionProps = resolveTransitionProps(rawProps);
+      let tag = rawProps.tag || Fragment;
+      prevChildren = children;
+      children = slots.default ? getTransitionRawChildren(slots.default()) : [];
+      for (let i = 0; i < children.length; i++) {
+        const child = children[i];
+        if (child.key != null) {
+          setTransitionHooks(
+            child,
+            resolveTransitionHooks(child, cssTransitionProps, state, instance)
+          );
+        } else {
+          warn(`<TransitionGroup> children must be keyed.`);
+        }
+      }
+      if (prevChildren) {
+        for (let i = 0; i < prevChildren.length; i++) {
+          const child = prevChildren[i];
+          setTransitionHooks(
+            child,
+            resolveTransitionHooks(child, cssTransitionProps, state, instance)
+          );
+          positionMap.set(child, child.el.getBoundingClientRect());
+        }
+      }
+      return createVNode(tag, null, children);
+    };
+  }
+};
+const removeMode = (props) => delete props.mode;
+/* @__PURE__ */ removeMode(TransitionGroupImpl.props);
+const TransitionGroup = TransitionGroupImpl;
+function callPendingCbs(c) {
+  const el = c.el;
+  if (el[moveCbKey]) {
+    el[moveCbKey]();
+  }
+  if (el[enterCbKey]) {
+    el[enterCbKey]();
+  }
+}
+function recordPosition(c) {
+  newPositionMap.set(c, c.el.getBoundingClientRect());
+}
+function applyTranslation(c) {
+  const oldPos = positionMap.get(c);
+  const newPos = newPositionMap.get(c);
+  const dx = oldPos.left - newPos.left;
+  const dy = oldPos.top - newPos.top;
+  if (dx || dy) {
+    const s = c.el.style;
+    s.transform = s.webkitTransform = `translate(${dx}px,${dy}px)`;
+    s.transitionDuration = "0s";
+    return c;
+  }
+}
+function hasCSSTransform(el, root, moveClass) {
+  const clone = el.cloneNode();
+  const _vtc = el[vtcKey];
+  if (_vtc) {
+    _vtc.forEach((cls) => {
+      cls.split(/\s+/).forEach((c) => c && clone.classList.remove(c));
+    });
+  }
+  moveClass.split(/\s+/).forEach((c) => c && clone.classList.add(c));
+  clone.style.display = "none";
+  const container = root.nodeType === 1 ? root : root.parentNode;
+  container.appendChild(clone);
+  const { hasTransform } = getTransitionInfo(clone);
+  container.removeChild(clone);
+  return hasTransform;
+}
+
+const getModelAssigner = (vnode) => {
+  const fn = vnode.props["onUpdate:modelValue"] || false;
+  return isArray(fn) ? (value) => invokeArrayFns(fn, value) : fn;
+};
+function onCompositionStart(e) {
+  e.target.composing = true;
+}
+function onCompositionEnd(e) {
+  const target = e.target;
+  if (target.composing) {
+    target.composing = false;
+    target.dispatchEvent(new Event("input"));
+  }
+}
+const assignKey = Symbol("_assign");
+const vModelText = {
+  created(el, { modifiers: { lazy, trim, number } }, vnode) {
+    el[assignKey] = getModelAssigner(vnode);
+    const castToNumber = number || vnode.props && vnode.props.type === "number";
+    addEventListener(el, lazy ? "change" : "input", (e) => {
+      if (e.target.composing)
+        return;
+      let domValue = el.value;
+      if (trim) {
+        domValue = domValue.trim();
+      }
+      if (castToNumber) {
+        domValue = looseToNumber(domValue);
+      }
+      el[assignKey](domValue);
+    });
+    if (trim) {
+      addEventListener(el, "change", () => {
+        el.value = el.value.trim();
+      });
+    }
+    if (!lazy) {
+      addEventListener(el, "compositionstart", onCompositionStart);
+      addEventListener(el, "compositionend", onCompositionEnd);
+      addEventListener(el, "change", onCompositionEnd);
+    }
+  },
+  // set value on mounted so it's after min/max for type="range"
+  mounted(el, { value }) {
+    el.value = value == null ? "" : value;
+  },
+  beforeUpdate(el, { value, modifiers: { lazy, trim, number } }, vnode) {
+    el[assignKey] = getModelAssigner(vnode);
+    if (el.composing)
+      return;
+    if (document.activeElement === el && el.type !== "range") {
+      if (lazy) {
+        return;
+      }
+      if (trim && el.value.trim() === value) {
+        return;
+      }
+      if ((number || el.type === "number") && looseToNumber(el.value) === value) {
+        return;
+      }
+    }
+    const newValue = value == null ? "" : value;
+    if (el.value !== newValue) {
+      el.value = newValue;
+    }
+  }
+};
+const vModelCheckbox = {
+  // #4096 array checkboxes need to be deep traversed
+  deep: true,
+  created(el, _, vnode) {
+    el[assignKey] = getModelAssigner(vnode);
+    addEventListener(el, "change", () => {
+      const modelValue = el._modelValue;
+      const elementValue = getValue(el);
+      const checked = el.checked;
+      const assign = el[assignKey];
+      if (isArray(modelValue)) {
+        const index = looseIndexOf(modelValue, elementValue);
+        const found = index !== -1;
+        if (checked && !found) {
+          assign(modelValue.concat(elementValue));
+        } else if (!checked && found) {
+          const filtered = [...modelValue];
+          filtered.splice(index, 1);
+          assign(filtered);
+        }
+      } else if (isSet(modelValue)) {
+        const cloned = new Set(modelValue);
+        if (checked) {
+          cloned.add(elementValue);
+        } else {
+          cloned.delete(elementValue);
+        }
+        assign(cloned);
+      } else {
+        assign(getCheckboxValue(el, checked));
+      }
+    });
+  },
+  // set initial checked on mount to wait for true-value/false-value
+  mounted: setChecked,
+  beforeUpdate(el, binding, vnode) {
+    el[assignKey] = getModelAssigner(vnode);
+    setChecked(el, binding, vnode);
+  }
+};
+function setChecked(el, { value, oldValue }, vnode) {
+  el._modelValue = value;
+  if (isArray(value)) {
+    el.checked = looseIndexOf(value, vnode.props.value) > -1;
+  } else if (isSet(value)) {
+    el.checked = value.has(vnode.props.value);
+  } else if (value !== oldValue) {
+    el.checked = looseEqual(value, getCheckboxValue(el, true));
+  }
+}
+const vModelRadio = {
+  created(el, { value }, vnode) {
+    el.checked = looseEqual(value, vnode.props.value);
+    el[assignKey] = getModelAssigner(vnode);
+    addEventListener(el, "change", () => {
+      el[assignKey](getValue(el));
+    });
+  },
+  beforeUpdate(el, { value, oldValue }, vnode) {
+    el[assignKey] = getModelAssigner(vnode);
+    if (value !== oldValue) {
+      el.checked = looseEqual(value, vnode.props.value);
+    }
+  }
+};
+const vModelSelect = {
+  // <select multiple> value need to be deep traversed
+  deep: true,
+  created(el, { value, modifiers: { number } }, vnode) {
+    const isSetModel = isSet(value);
+    addEventListener(el, "change", () => {
+      const selectedVal = Array.prototype.filter.call(el.options, (o) => o.selected).map(
+        (o) => number ? looseToNumber(getValue(o)) : getValue(o)
+      );
+      el[assignKey](
+        el.multiple ? isSetModel ? new Set(selectedVal) : selectedVal : selectedVal[0]
+      );
+    });
+    el[assignKey] = getModelAssigner(vnode);
+  },
+  // set value in mounted & updated because <select> relies on its children
+  // <option>s.
+  mounted(el, { value }) {
+    setSelected(el, value);
+  },
+  beforeUpdate(el, _binding, vnode) {
+    el[assignKey] = getModelAssigner(vnode);
+  },
+  updated(el, { value }) {
+    setSelected(el, value);
+  }
+};
+function setSelected(el, value) {
+  const isMultiple = el.multiple;
+  if (isMultiple && !isArray(value) && !isSet(value)) {
+    warn(
+      `<select multiple v-model> expects an Array or Set value for its binding, but got ${Object.prototype.toString.call(value).slice(8, -1)}.`
+    );
+    return;
+  }
+  for (let i = 0, l = el.options.length; i < l; i++) {
+    const option = el.options[i];
+    const optionValue = getValue(option);
+    if (isMultiple) {
+      if (isArray(value)) {
+        option.selected = looseIndexOf(value, optionValue) > -1;
+      } else {
+        option.selected = value.has(optionValue);
+      }
+    } else {
+      if (looseEqual(getValue(option), value)) {
+        if (el.selectedIndex !== i)
+          el.selectedIndex = i;
+        return;
+      }
+    }
+  }
+  if (!isMultiple && el.selectedIndex !== -1) {
+    el.selectedIndex = -1;
+  }
+}
+function getValue(el) {
+  return "_value" in el ? el._value : el.value;
+}
+function getCheckboxValue(el, checked) {
+  const key = checked ? "_trueValue" : "_falseValue";
+  return key in el ? el[key] : checked;
+}
+const vModelDynamic = {
+  created(el, binding, vnode) {
+    callModelHook(el, binding, vnode, null, "created");
+  },
+  mounted(el, binding, vnode) {
+    callModelHook(el, binding, vnode, null, "mounted");
+  },
+  beforeUpdate(el, binding, vnode, prevVNode) {
+    callModelHook(el, binding, vnode, prevVNode, "beforeUpdate");
+  },
+  updated(el, binding, vnode, prevVNode) {
+    callModelHook(el, binding, vnode, prevVNode, "updated");
+  }
+};
+function resolveDynamicModel(tagName, type) {
+  switch (tagName) {
+    case "SELECT":
+      return vModelSelect;
+    case "TEXTAREA":
+      return vModelText;
+    default:
+      switch (type) {
+        case "checkbox":
+          return vModelCheckbox;
+        case "radio":
+          return vModelRadio;
+        default:
+          return vModelText;
+      }
+  }
+}
+function callModelHook(el, binding, vnode, prevVNode, hook) {
+  const modelToUse = resolveDynamicModel(
+    el.tagName,
+    vnode.props && vnode.props.type
+  );
+  const fn = modelToUse[hook];
+  fn && fn(el, binding, vnode, prevVNode);
+}
+
+const systemModifiers = ["ctrl", "shift", "alt", "meta"];
+const modifierGuards = {
+  stop: (e) => e.stopPropagation(),
+  prevent: (e) => e.preventDefault(),
+  self: (e) => e.target !== e.currentTarget,
+  ctrl: (e) => !e.ctrlKey,
+  shift: (e) => !e.shiftKey,
+  alt: (e) => !e.altKey,
+  meta: (e) => !e.metaKey,
+  left: (e) => "button" in e && e.button !== 0,
+  middle: (e) => "button" in e && e.button !== 1,
+  right: (e) => "button" in e && e.button !== 2,
+  exact: (e, modifiers) => systemModifiers.some((m) => e[`${m}Key`] && !modifiers.includes(m))
+};
+const withModifiers = (fn, modifiers) => {
+  return (event, ...args) => {
+    for (let i = 0; i < modifiers.length; i++) {
+      const guard = modifierGuards[modifiers[i]];
+      if (guard && guard(event, modifiers))
+        return;
+    }
+    return fn(event, ...args);
+  };
+};
+const keyNames = {
+  esc: "escape",
+  space: " ",
+  up: "arrow-up",
+  left: "arrow-left",
+  right: "arrow-right",
+  down: "arrow-down",
+  delete: "backspace"
+};
+const withKeys = (fn, modifiers) => {
+  return (event) => {
+    if (!("key" in event)) {
+      return;
+    }
+    const eventKey = hyphenate(event.key);
+    if (modifiers.some((k) => k === eventKey || keyNames[k] === eventKey)) {
+      return fn(event);
+    }
+  };
+};
+
+const rendererOptions = /* @__PURE__ */ extend({ patchProp }, nodeOps);
+let renderer;
+let enabledHydration = false;
+function ensureRenderer() {
+  return renderer || (renderer = createRenderer(rendererOptions));
+}
+function ensureHydrationRenderer() {
+  renderer = enabledHydration ? renderer : createHydrationRenderer(rendererOptions);
+  enabledHydration = true;
+  return renderer;
+}
+const render = (...args) => {
+  ensureRenderer().render(...args);
+};
+const hydrate = (...args) => {
+  ensureHydrationRenderer().hydrate(...args);
+};
+const createApp = (...args) => {
+  const app = ensureRenderer().createApp(...args);
+  {
+    injectNativeTagCheck(app);
+    injectCompilerOptionsCheck(app);
+  }
+  const { mount } = app;
+  app.mount = (containerOrSelector) => {
+    const container = normalizeContainer(containerOrSelector);
+    if (!container)
+      return;
+    const component = app._component;
+    if (!isFunction(component) && !component.render && !component.template) {
+      component.template = container.innerHTML;
+    }
+    container.innerHTML = "";
+    const proxy = mount(container, false, container instanceof SVGElement);
+    if (container instanceof Element) {
+      container.removeAttribute("v-cloak");
+      container.setAttribute("data-v-app", "");
+    }
+    return proxy;
+  };
+  return app;
+};
+const createSSRApp = (...args) => {
+  const app = ensureHydrationRenderer().createApp(...args);
+  {
+    injectNativeTagCheck(app);
+    injectCompilerOptionsCheck(app);
+  }
+  const { mount } = app;
+  app.mount = (containerOrSelector) => {
+    const container = normalizeContainer(containerOrSelector);
+    if (container) {
+      return mount(container, true, container instanceof SVGElement);
+    }
+  };
+  return app;
+};
+function injectNativeTagCheck(app) {
+  Object.defineProperty(app.config, "isNativeTag", {
+    value: (tag) => isHTMLTag(tag) || isSVGTag(tag),
+    writable: false
+  });
+}
+function injectCompilerOptionsCheck(app) {
+  if (isRuntimeOnly()) {
+    const isCustomElement = app.config.isCustomElement;
+    Object.defineProperty(app.config, "isCustomElement", {
+      get() {
+        return isCustomElement;
+      },
+      set() {
+        warn(
+          `The \`isCustomElement\` config option is deprecated. Use \`compilerOptions.isCustomElement\` instead.`
+        );
+      }
+    });
+    const compilerOptions = app.config.compilerOptions;
+    const msg = `The \`compilerOptions\` config option is only respected when using a build of Vue.js that includes the runtime compiler (aka "full build"). Since you are using the runtime-only build, \`compilerOptions\` must be passed to \`@vue/compiler-dom\` in the build setup instead.
+- For vue-loader: pass it via vue-loader's \`compilerOptions\` loader option.
+- For vue-cli: see https://cli.vuejs.org/guide/webpack.html#modifying-options-of-a-loader
+- For vite: pass it via @vitejs/plugin-vue options. See https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue#example-for-passing-options-to-vuecompiler-sfc`;
+    Object.defineProperty(app.config, "compilerOptions", {
+      get() {
+        warn(msg);
+        return compilerOptions;
+      },
+      set() {
+        warn(msg);
+      }
+    });
+  }
+}
+function normalizeContainer(container) {
+  if (isString(container)) {
+    const res = document.querySelector(container);
+    if (!res) {
+      warn(
+        `Failed to mount app: mount target selector "${container}" returned null.`
+      );
+    }
+    return res;
+  }
+  if (window.ShadowRoot && container instanceof window.ShadowRoot && container.mode === "closed") {
+    warn(
+      `mounting on a ShadowRoot with \`{mode: "closed"}\` may lead to unpredictable bugs`
+    );
+  }
+  return container;
+}
+const initDirectivesForSSR = NOOP;
+
+var runtimeDom = /*#__PURE__*/Object.freeze({
+  __proto__: null,
+  BaseTransition: BaseTransition,
+  BaseTransitionPropsValidators: BaseTransitionPropsValidators,
+  Comment: Comment,
+  EffectScope: EffectScope,
+  Fragment: Fragment,
+  KeepAlive: KeepAlive,
+  ReactiveEffect: ReactiveEffect,
+  Static: Static,
+  Suspense: Suspense,
+  Teleport: Teleport,
+  Text: Text,
+  Transition: Transition,
+  TransitionGroup: TransitionGroup,
+  VueElement: VueElement,
+  assertNumber: assertNumber,
+  callWithAsyncErrorHandling: callWithAsyncErrorHandling,
+  callWithErrorHandling: callWithErrorHandling,
+  camelize: camelize,
+  capitalize: capitalize,
+  cloneVNode: cloneVNode,
+  compatUtils: compatUtils,
+  computed: computed,
+  createApp: createApp,
+  createBlock: createBlock,
+  createCommentVNode: createCommentVNode,
+  createElementBlock: createElementBlock,
+  createElementVNode: createBaseVNode,
+  createHydrationRenderer: createHydrationRenderer,
+  createPropsRestProxy: createPropsRestProxy,
+  createRenderer: createRenderer,
+  createSSRApp: createSSRApp,
+  createSlots: createSlots,
+  createStaticVNode: createStaticVNode,
+  createTextVNode: createTextVNode,
+  createVNode: createVNode,
+  customRef: customRef,
+  defineAsyncComponent: defineAsyncComponent,
+  defineComponent: defineComponent,
+  defineCustomElement: defineCustomElement,
+  defineEmits: defineEmits,
+  defineExpose: defineExpose,
+  defineModel: defineModel,
+  defineOptions: defineOptions,
+  defineProps: defineProps,
+  defineSSRCustomElement: defineSSRCustomElement,
+  defineSlots: defineSlots,
+  get devtools () { return devtools; },
+  effect: effect,
+  effectScope: effectScope,
+  getCurrentInstance: getCurrentInstance,
+  getCurrentScope: getCurrentScope,
+  getTransitionRawChildren: getTransitionRawChildren,
+  guardReactiveProps: guardReactiveProps,
+  h: h,
+  handleError: handleError,
+  hasInjectionContext: hasInjectionContext,
+  hydrate: hydrate,
+  initCustomFormatter: initCustomFormatter,
+  initDirectivesForSSR: initDirectivesForSSR,
+  inject: inject,
+  isMemoSame: isMemoSame,
+  isProxy: isProxy,
+  isReactive: isReactive,
+  isReadonly: isReadonly,
+  isRef: isRef,
+  isRuntimeOnly: isRuntimeOnly,
+  isShallow: isShallow,
+  isVNode: isVNode,
+  markRaw: markRaw,
+  mergeDefaults: mergeDefaults,
+  mergeModels: mergeModels,
+  mergeProps: mergeProps,
+  nextTick: nextTick,
+  normalizeClass: normalizeClass,
+  normalizeProps: normalizeProps,
+  normalizeStyle: normalizeStyle,
+  onActivated: onActivated,
+  onBeforeMount: onBeforeMount,
+  onBeforeUnmount: onBeforeUnmount,
+  onBeforeUpdate: onBeforeUpdate,
+  onDeactivated: onDeactivated,
+  onErrorCaptured: onErrorCaptured,
+  onMounted: onMounted,
+  onRenderTracked: onRenderTracked,
+  onRenderTriggered: onRenderTriggered,
+  onScopeDispose: onScopeDispose,
+  onServerPrefetch: onServerPrefetch,
+  onUnmounted: onUnmounted,
+  onUpdated: onUpdated,
+  openBlock: openBlock,
+  popScopeId: popScopeId,
+  provide: provide,
+  proxyRefs: proxyRefs,
+  pushScopeId: pushScopeId,
+  queuePostFlushCb: queuePostFlushCb,
+  reactive: reactive,
+  readonly: readonly,
+  ref: ref,
+  registerRuntimeCompiler: registerRuntimeCompiler,
+  render: render,
+  renderList: renderList,
+  renderSlot: renderSlot,
+  resolveComponent: resolveComponent,
+  resolveDirective: resolveDirective,
+  resolveDynamicComponent: resolveDynamicComponent,
+  resolveFilter: resolveFilter,
+  resolveTransitionHooks: resolveTransitionHooks,
+  setBlockTracking: setBlockTracking,
+  setDevtoolsHook: setDevtoolsHook,
+  setTransitionHooks: setTransitionHooks,
+  shallowReactive: shallowReactive,
+  shallowReadonly: shallowReadonly,
+  shallowRef: shallowRef,
+  ssrContextKey: ssrContextKey,
+  ssrUtils: ssrUtils,
+  stop: stop,
+  toDisplayString: toDisplayString,
+  toHandlerKey: toHandlerKey,
+  toHandlers: toHandlers,
+  toRaw: toRaw,
+  toRef: toRef,
+  toRefs: toRefs,
+  toValue: toValue,
+  transformVNodeArgs: transformVNodeArgs,
+  triggerRef: triggerRef,
+  unref: unref,
+  useAttrs: useAttrs,
+  useCssModule: useCssModule,
+  useCssVars: useCssVars,
+  useModel: useModel,
+  useSSRContext: useSSRContext,
+  useSlots: useSlots,
+  useTransitionState: useTransitionState,
+  vModelCheckbox: vModelCheckbox,
+  vModelDynamic: vModelDynamic,
+  vModelRadio: vModelRadio,
+  vModelSelect: vModelSelect,
+  vModelText: vModelText,
+  vShow: vShow,
+  version: version,
+  warn: warn,
+  watch: watch,
+  watchEffect: watchEffect,
+  watchPostEffect: watchPostEffect,
+  watchSyncEffect: watchSyncEffect,
+  withAsyncContext: withAsyncContext,
+  withCtx: withCtx,
+  withDefaults: withDefaults,
+  withDirectives: withDirectives,
+  withKeys: withKeys,
+  withMemo: withMemo,
+  withModifiers: withModifiers,
+  withScopeId: withScopeId
+});
+
+function initDev() {
+  {
+    {
+      console.info(
+        `You are running a development build of Vue.
+Make sure to use the production build (*.prod.js) when deploying for production.`
+      );
+    }
+    initCustomFormatter();
+  }
+}
+
+function defaultOnError(error) {
+  throw error;
+}
+function defaultOnWarn(msg) {
+  console.warn(`[Vue warn] ${msg.message}`);
+}
+function createCompilerError(code, loc, messages, additionalMessage) {
+  const msg = (messages || errorMessages)[code] + (additionalMessage || ``) ;
+  const error = new SyntaxError(String(msg));
+  error.code = code;
+  error.loc = loc;
+  return error;
+}
+const errorMessages = {
+  // parse errors
+  [0]: "Illegal comment.",
+  [1]: "CDATA section is allowed only in XML context.",
+  [2]: "Duplicate attribute.",
+  [3]: "End tag cannot have attributes.",
+  [4]: "Illegal '/' in tags.",
+  [5]: "Unexpected EOF in tag.",
+  [6]: "Unexpected EOF in CDATA section.",
+  [7]: "Unexpected EOF in comment.",
+  [8]: "Unexpected EOF in script.",
+  [9]: "Unexpected EOF in tag.",
+  [10]: "Incorrectly closed comment.",
+  [11]: "Incorrectly opened comment.",
+  [12]: "Illegal tag name. Use '&lt;' to print '<'.",
+  [13]: "Attribute value was expected.",
+  [14]: "End tag name was expected.",
+  [15]: "Whitespace was expected.",
+  [16]: "Unexpected '<!--' in comment.",
+  [17]: `Attribute name cannot contain U+0022 ("), U+0027 ('), and U+003C (<).`,
+  [18]: "Unquoted attribute value cannot contain U+0022 (\"), U+0027 ('), U+003C (<), U+003D (=), and U+0060 (`).",
+  [19]: "Attribute name cannot start with '='.",
+  [21]: "'<?' is allowed only in XML context.",
+  [20]: `Unexpected null character.`,
+  [22]: "Illegal '/' in tags.",
+  // Vue-specific parse errors
+  [23]: "Invalid end tag.",
+  [24]: "Element is missing end tag.",
+  [25]: "Interpolation end sign was not found.",
+  [27]: "End bracket for dynamic directive argument was not found. Note that dynamic directive argument cannot contain spaces.",
+  [26]: "Legal directive name was expected.",
+  // transform errors
+  [28]: `v-if/v-else-if is missing expression.`,
+  [29]: `v-if/else branches must use unique keys.`,
+  [30]: `v-else/v-else-if has no adjacent v-if or v-else-if.`,
+  [31]: `v-for is missing expression.`,
+  [32]: `v-for has invalid expression.`,
+  [33]: `<template v-for> key should be placed on the <template> tag.`,
+  [34]: `v-bind is missing expression.`,
+  [35]: `v-on is missing expression.`,
+  [36]: `Unexpected custom directive on <slot> outlet.`,
+  [37]: `Mixed v-slot usage on both the component and nested <template>. When there are multiple named slots, all slots should use <template> syntax to avoid scope ambiguity.`,
+  [38]: `Duplicate slot names found. `,
+  [39]: `Extraneous children found when component already has explicitly named default slot. These children will be ignored.`,
+  [40]: `v-slot can only be used on components or <template> tags.`,
+  [41]: `v-model is missing expression.`,
+  [42]: `v-model value must be a valid JavaScript member expression.`,
+  [43]: `v-model cannot be used on v-for or v-slot scope variables because they are not writable.`,
+  [44]: `v-model cannot be used on a prop, because local prop bindings are not writable.
+Use a v-bind binding combined with a v-on listener that emits update:x event instead.`,
+  [45]: `Error parsing JavaScript expression: `,
+  [46]: `<KeepAlive> expects exactly one child component.`,
+  // generic errors
+  [47]: `"prefixIdentifiers" option is not supported in this build of compiler.`,
+  [48]: `ES module mode is not supported in this build of compiler.`,
+  [49]: `"cacheHandlers" option is only supported when the "prefixIdentifiers" option is enabled.`,
+  [50]: `"scopeId" option is only supported in module mode.`,
+  // deprecations
+  [51]: `@vnode-* hooks in templates are deprecated. Use the vue: prefix instead. For example, @vnode-mounted should be changed to @vue:mounted. @vnode-* hooks support will be removed in 3.4.`,
+  [52]: `v-is="component-name" has been deprecated. Use is="vue:component-name" instead. v-is support will be removed in 3.4.`,
+  // just to fulfill types
+  [53]: ``
+};
+
+const FRAGMENT = Symbol(`Fragment` );
+const TELEPORT = Symbol(`Teleport` );
+const SUSPENSE = Symbol(`Suspense` );
+const KEEP_ALIVE = Symbol(`KeepAlive` );
+const BASE_TRANSITION = Symbol(`BaseTransition` );
+const OPEN_BLOCK = Symbol(`openBlock` );
+const CREATE_BLOCK = Symbol(`createBlock` );
+const CREATE_ELEMENT_BLOCK = Symbol(`createElementBlock` );
+const CREATE_VNODE = Symbol(`createVNode` );
+const CREATE_ELEMENT_VNODE = Symbol(`createElementVNode` );
+const CREATE_COMMENT = Symbol(`createCommentVNode` );
+const CREATE_TEXT = Symbol(`createTextVNode` );
+const CREATE_STATIC = Symbol(`createStaticVNode` );
+const RESOLVE_COMPONENT = Symbol(`resolveComponent` );
+const RESOLVE_DYNAMIC_COMPONENT = Symbol(
+  `resolveDynamicComponent` 
+);
+const RESOLVE_DIRECTIVE = Symbol(`resolveDirective` );
+const RESOLVE_FILTER = Symbol(`resolveFilter` );
+const WITH_DIRECTIVES = Symbol(`withDirectives` );
+const RENDER_LIST = Symbol(`renderList` );
+const RENDER_SLOT = Symbol(`renderSlot` );
+const CREATE_SLOTS = Symbol(`createSlots` );
+const TO_DISPLAY_STRING = Symbol(`toDisplayString` );
+const MERGE_PROPS = Symbol(`mergeProps` );
+const NORMALIZE_CLASS = Symbol(`normalizeClass` );
+const NORMALIZE_STYLE = Symbol(`normalizeStyle` );
+const NORMALIZE_PROPS = Symbol(`normalizeProps` );
+const GUARD_REACTIVE_PROPS = Symbol(`guardReactiveProps` );
+const TO_HANDLERS = Symbol(`toHandlers` );
+const CAMELIZE = Symbol(`camelize` );
+const CAPITALIZE = Symbol(`capitalize` );
+const TO_HANDLER_KEY = Symbol(`toHandlerKey` );
+const SET_BLOCK_TRACKING = Symbol(`setBlockTracking` );
+const PUSH_SCOPE_ID = Symbol(`pushScopeId` );
+const POP_SCOPE_ID = Symbol(`popScopeId` );
+const WITH_CTX = Symbol(`withCtx` );
+const UNREF = Symbol(`unref` );
+const IS_REF = Symbol(`isRef` );
+const WITH_MEMO = Symbol(`withMemo` );
+const IS_MEMO_SAME = Symbol(`isMemoSame` );
+const helperNameMap = {
+  [FRAGMENT]: `Fragment`,
+  [TELEPORT]: `Teleport`,
+  [SUSPENSE]: `Suspense`,
+  [KEEP_ALIVE]: `KeepAlive`,
+  [BASE_TRANSITION]: `BaseTransition`,
+  [OPEN_BLOCK]: `openBlock`,
+  [CREATE_BLOCK]: `createBlock`,
+  [CREATE_ELEMENT_BLOCK]: `createElementBlock`,
+  [CREATE_VNODE]: `createVNode`,
+  [CREATE_ELEMENT_VNODE]: `createElementVNode`,
+  [CREATE_COMMENT]: `createCommentVNode`,
+  [CREATE_TEXT]: `createTextVNode`,
+  [CREATE_STATIC]: `createStaticVNode`,
+  [RESOLVE_COMPONENT]: `resolveComponent`,
+  [RESOLVE_DYNAMIC_COMPONENT]: `resolveDynamicComponent`,
+  [RESOLVE_DIRECTIVE]: `resolveDirective`,
+  [RESOLVE_FILTER]: `resolveFilter`,
+  [WITH_DIRECTIVES]: `withDirectives`,
+  [RENDER_LIST]: `renderList`,
+  [RENDER_SLOT]: `renderSlot`,
+  [CREATE_SLOTS]: `createSlots`,
+  [TO_DISPLAY_STRING]: `toDisplayString`,
+  [MERGE_PROPS]: `mergeProps`,
+  [NORMALIZE_CLASS]: `normalizeClass`,
+  [NORMALIZE_STYLE]: `normalizeStyle`,
+  [NORMALIZE_PROPS]: `normalizeProps`,
+  [GUARD_REACTIVE_PROPS]: `guardReactiveProps`,
+  [TO_HANDLERS]: `toHandlers`,
+  [CAMELIZE]: `camelize`,
+  [CAPITALIZE]: `capitalize`,
+  [TO_HANDLER_KEY]: `toHandlerKey`,
+  [SET_BLOCK_TRACKING]: `setBlockTracking`,
+  [PUSH_SCOPE_ID]: `pushScopeId`,
+  [POP_SCOPE_ID]: `popScopeId`,
+  [WITH_CTX]: `withCtx`,
+  [UNREF]: `unref`,
+  [IS_REF]: `isRef`,
+  [WITH_MEMO]: `withMemo`,
+  [IS_MEMO_SAME]: `isMemoSame`
+};
+function registerRuntimeHelpers(helpers) {
+  Object.getOwnPropertySymbols(helpers).forEach((s) => {
+    helperNameMap[s] = helpers[s];
+  });
+}
+
+const locStub = {
+  source: "",
+  start: { line: 1, column: 1, offset: 0 },
+  end: { line: 1, column: 1, offset: 0 }
+};
+function createRoot(children, loc = locStub) {
+  return {
+    type: 0,
+    children,
+    helpers: /* @__PURE__ */ new Set(),
+    components: [],
+    directives: [],
+    hoists: [],
+    imports: [],
+    cached: 0,
+    temps: 0,
+    codegenNode: void 0,
+    loc
+  };
+}
+function createVNodeCall(context, tag, props, children, patchFlag, dynamicProps, directives, isBlock = false, disableTracking = false, isComponent = false, loc = locStub) {
+  if (context) {
+    if (isBlock) {
+      context.helper(OPEN_BLOCK);
+      context.helper(getVNodeBlockHelper(context.inSSR, isComponent));
+    } else {
+      context.helper(getVNodeHelper(context.inSSR, isComponent));
+    }
+    if (directives) {
+      context.helper(WITH_DIRECTIVES);
+    }
+  }
+  return {
+    type: 13,
+    tag,
+    props,
+    children,
+    patchFlag,
+    dynamicProps,
+    directives,
+    isBlock,
+    disableTracking,
+    isComponent,
+    loc
+  };
+}
+function createArrayExpression(elements, loc = locStub) {
+  return {
+    type: 17,
+    loc,
+    elements
+  };
+}
+function createObjectExpression(properties, loc = locStub) {
+  return {
+    type: 15,
+    loc,
+    properties
+  };
+}
+function createObjectProperty(key, value) {
+  return {
+    type: 16,
+    loc: locStub,
+    key: isString(key) ? createSimpleExpression(key, true) : key,
+    value
+  };
+}
+function createSimpleExpression(content, isStatic = false, loc = locStub, constType = 0) {
+  return {
+    type: 4,
+    loc,
+    content,
+    isStatic,
+    constType: isStatic ? 3 : constType
+  };
+}
+function createCompoundExpression(children, loc = locStub) {
+  return {
+    type: 8,
+    loc,
+    children
+  };
+}
+function createCallExpression(callee, args = [], loc = locStub) {
+  return {
+    type: 14,
+    loc,
+    callee,
+    arguments: args
+  };
+}
+function createFunctionExpression(params, returns = void 0, newline = false, isSlot = false, loc = locStub) {
+  return {
+    type: 18,
+    params,
+    returns,
+    newline,
+    isSlot,
+    loc
+  };
+}
+function createConditionalExpression(test, consequent, alternate, newline = true) {
+  return {
+    type: 19,
+    test,
+    consequent,
+    alternate,
+    newline,
+    loc: locStub
+  };
+}
+function createCacheExpression(index, value, isVNode = false) {
+  return {
+    type: 20,
+    index,
+    value,
+    isVNode,
+    loc: locStub
+  };
+}
+function createBlockStatement(body) {
+  return {
+    type: 21,
+    body,
+    loc: locStub
+  };
+}
+function getVNodeHelper(ssr, isComponent) {
+  return ssr || isComponent ? CREATE_VNODE : CREATE_ELEMENT_VNODE;
+}
+function getVNodeBlockHelper(ssr, isComponent) {
+  return ssr || isComponent ? CREATE_BLOCK : CREATE_ELEMENT_BLOCK;
+}
+function convertToBlock(node, { helper, removeHelper, inSSR }) {
+  if (!node.isBlock) {
+    node.isBlock = true;
+    removeHelper(getVNodeHelper(inSSR, node.isComponent));
+    helper(OPEN_BLOCK);
+    helper(getVNodeBlockHelper(inSSR, node.isComponent));
+  }
+}
+
+const isStaticExp = (p) => p.type === 4 && p.isStatic;
+const isBuiltInType = (tag, expected) => tag === expected || tag === hyphenate(expected);
+function isCoreComponent(tag) {
+  if (isBuiltInType(tag, "Teleport")) {
+    return TELEPORT;
+  } else if (isBuiltInType(tag, "Suspense")) {
+    return SUSPENSE;
+  } else if (isBuiltInType(tag, "KeepAlive")) {
+    return KEEP_ALIVE;
+  } else if (isBuiltInType(tag, "BaseTransition")) {
+    return BASE_TRANSITION;
+  }
+}
+const nonIdentifierRE = /^\d|[^\$\w]/;
+const isSimpleIdentifier = (name) => !nonIdentifierRE.test(name);
+const validFirstIdentCharRE = /[A-Za-z_$\xA0-\uFFFF]/;
+const validIdentCharRE = /[\.\?\w$\xA0-\uFFFF]/;
+const whitespaceRE = /\s+[.[]\s*|\s*[.[]\s+/g;
+const isMemberExpressionBrowser = (path) => {
+  path = path.trim().replace(whitespaceRE, (s) => s.trim());
+  let state = 0 /* inMemberExp */;
+  let stateStack = [];
+  let currentOpenBracketCount = 0;
+  let currentOpenParensCount = 0;
+  let currentStringType = null;
+  for (let i = 0; i < path.length; i++) {
+    const char = path.charAt(i);
+    switch (state) {
+      case 0 /* inMemberExp */:
+        if (char === "[") {
+          stateStack.push(state);
+          state = 1 /* inBrackets */;
+          currentOpenBracketCount++;
+        } else if (char === "(") {
+          stateStack.push(state);
+          state = 2 /* inParens */;
+          currentOpenParensCount++;
+        } else if (!(i === 0 ? validFirstIdentCharRE : validIdentCharRE).test(char)) {
+          return false;
+        }
+        break;
+      case 1 /* inBrackets */:
+        if (char === `'` || char === `"` || char === "`") {
+          stateStack.push(state);
+          state = 3 /* inString */;
+          currentStringType = char;
+        } else if (char === `[`) {
+          currentOpenBracketCount++;
+        } else if (char === `]`) {
+          if (!--currentOpenBracketCount) {
+            state = stateStack.pop();
+          }
+        }
+        break;
+      case 2 /* inParens */:
+        if (char === `'` || char === `"` || char === "`") {
+          stateStack.push(state);
+          state = 3 /* inString */;
+          currentStringType = char;
+        } else if (char === `(`) {
+          currentOpenParensCount++;
+        } else if (char === `)`) {
+          if (i === path.length - 1) {
+            return false;
+          }
+          if (!--currentOpenParensCount) {
+            state = stateStack.pop();
+          }
+        }
+        break;
+      case 3 /* inString */:
+        if (char === currentStringType) {
+          state = stateStack.pop();
+          currentStringType = null;
+        }
+        break;
+    }
+  }
+  return !currentOpenBracketCount && !currentOpenParensCount;
+};
+const isMemberExpression = isMemberExpressionBrowser ;
+function getInnerRange(loc, offset, length) {
+  const source = loc.source.slice(offset, offset + length);
+  const newLoc = {
+    source,
+    start: advancePositionWithClone(loc.start, loc.source, offset),
+    end: loc.end
+  };
+  if (length != null) {
+    newLoc.end = advancePositionWithClone(
+      loc.start,
+      loc.source,
+      offset + length
+    );
+  }
+  return newLoc;
+}
+function advancePositionWithClone(pos, source, numberOfCharacters = source.length) {
+  return advancePositionWithMutation(
+    extend({}, pos),
+    source,
+    numberOfCharacters
+  );
+}
+function advancePositionWithMutation(pos, source, numberOfCharacters = source.length) {
+  let linesCount = 0;
+  let lastNewLinePos = -1;
+  for (let i = 0; i < numberOfCharacters; i++) {
+    if (source.charCodeAt(i) === 10) {
+      linesCount++;
+      lastNewLinePos = i;
+    }
+  }
+  pos.offset += numberOfCharacters;
+  pos.line += linesCount;
+  pos.column = lastNewLinePos === -1 ? pos.column + numberOfCharacters : numberOfCharacters - lastNewLinePos;
+  return pos;
+}
+function assert(condition, msg) {
+  if (!condition) {
+    throw new Error(msg || `unexpected compiler condition`);
+  }
+}
+function findDir(node, name, allowEmpty = false) {
+  for (let i = 0; i < node.props.length; i++) {
+    const p = node.props[i];
+    if (p.type === 7 && (allowEmpty || p.exp) && (isString(name) ? p.name === name : name.test(p.name))) {
+      return p;
+    }
+  }
+}
+function findProp(node, name, dynamicOnly = false, allowEmpty = false) {
+  for (let i = 0; i < node.props.length; i++) {
+    const p = node.props[i];
+    if (p.type === 6) {
+      if (dynamicOnly)
+        continue;
+      if (p.name === name && (p.value || allowEmpty)) {
+        return p;
+      }
+    } else if (p.name === "bind" && (p.exp || allowEmpty) && isStaticArgOf(p.arg, name)) {
+      return p;
+    }
+  }
+}
+function isStaticArgOf(arg, name) {
+  return !!(arg && isStaticExp(arg) && arg.content === name);
+}
+function hasDynamicKeyVBind(node) {
+  return node.props.some(
+    (p) => p.type === 7 && p.name === "bind" && (!p.arg || // v-bind="obj"
+    p.arg.type !== 4 || // v-bind:[_ctx.foo]
+    !p.arg.isStatic)
+    // v-bind:[foo]
+  );
+}
+function isText$1(node) {
+  return node.type === 5 || node.type === 2;
+}
+function isVSlot(p) {
+  return p.type === 7 && p.name === "slot";
+}
+function isTemplateNode(node) {
+  return node.type === 1 && node.tagType === 3;
+}
+function isSlotOutlet(node) {
+  return node.type === 1 && node.tagType === 2;
+}
+const propsHelperSet = /* @__PURE__ */ new Set([NORMALIZE_PROPS, GUARD_REACTIVE_PROPS]);
+function getUnnormalizedProps(props, callPath = []) {
+  if (props && !isString(props) && props.type === 14) {
+    const callee = props.callee;
+    if (!isString(callee) && propsHelperSet.has(callee)) {
+      return getUnnormalizedProps(
+        props.arguments[0],
+        callPath.concat(props)
+      );
+    }
+  }
+  return [props, callPath];
+}
+function injectProp(node, prop, context) {
+  let propsWithInjection;
+  let props = node.type === 13 ? node.props : node.arguments[2];
+  let callPath = [];
+  let parentCall;
+  if (props && !isString(props) && props.type === 14) {
+    const ret = getUnnormalizedProps(props);
+    props = ret[0];
+    callPath = ret[1];
+    parentCall = callPath[callPath.length - 1];
+  }
+  if (props == null || isString(props)) {
+    propsWithInjection = createObjectExpression([prop]);
+  } else if (props.type === 14) {
+    const first = props.arguments[0];
+    if (!isString(first) && first.type === 15) {
+      if (!hasProp(prop, first)) {
+        first.properties.unshift(prop);
+      }
+    } else {
+      if (props.callee === TO_HANDLERS) {
+        propsWithInjection = createCallExpression(context.helper(MERGE_PROPS), [
+          createObjectExpression([prop]),
+          props
+        ]);
+      } else {
+        props.arguments.unshift(createObjectExpression([prop]));
+      }
+    }
+    !propsWithInjection && (propsWithInjection = props);
+  } else if (props.type === 15) {
+    if (!hasProp(prop, props)) {
+      props.properties.unshift(prop);
+    }
+    propsWithInjection = props;
+  } else {
+    propsWithInjection = createCallExpression(context.helper(MERGE_PROPS), [
+      createObjectExpression([prop]),
+      props
+    ]);
+    if (parentCall && parentCall.callee === GUARD_REACTIVE_PROPS) {
+      parentCall = callPath[callPath.length - 2];
+    }
+  }
+  if (node.type === 13) {
+    if (parentCall) {
+      parentCall.arguments[0] = propsWithInjection;
+    } else {
+      node.props = propsWithInjection;
+    }
+  } else {
+    if (parentCall) {
+      parentCall.arguments[0] = propsWithInjection;
+    } else {
+      node.arguments[2] = propsWithInjection;
+    }
+  }
+}
+function hasProp(prop, props) {
+  let result = false;
+  if (prop.key.type === 4) {
+    const propKeyName = prop.key.content;
+    result = props.properties.some(
+      (p) => p.key.type === 4 && p.key.content === propKeyName
+    );
+  }
+  return result;
+}
+function toValidAssetId(name, type) {
+  return `_${type}_${name.replace(/[^\w]/g, (searchValue, replaceValue) => {
+    return searchValue === "-" ? "_" : name.charCodeAt(replaceValue).toString();
+  })}`;
+}
+function getMemoedVNodeCall(node) {
+  if (node.type === 14 && node.callee === WITH_MEMO) {
+    return node.arguments[1].returns;
+  } else {
+    return node;
+  }
+}
+
+const decodeRE = /&(gt|lt|amp|apos|quot);/g;
+const decodeMap = {
+  gt: ">",
+  lt: "<",
+  amp: "&",
+  apos: "'",
+  quot: '"'
+};
+const defaultParserOptions = {
+  delimiters: [`{{`, `}}`],
+  getNamespace: () => 0,
+  getTextMode: () => 0,
+  isVoidTag: NO,
+  isPreTag: NO,
+  isCustomElement: NO,
+  decodeEntities: (rawText) => rawText.replace(decodeRE, (_, p1) => decodeMap[p1]),
+  onError: defaultOnError,
+  onWarn: defaultOnWarn,
+  comments: true
+};
+function baseParse(content, options = {}) {
+  const context = createParserContext(content, options);
+  const start = getCursor(context);
+  return createRoot(
+    parseChildren(context, 0, []),
+    getSelection(context, start)
+  );
+}
+function createParserContext(content, rawOptions) {
+  const options = extend({}, defaultParserOptions);
+  let key;
+  for (key in rawOptions) {
+    options[key] = rawOptions[key] === void 0 ? defaultParserOptions[key] : rawOptions[key];
+  }
+  return {
+    options,
+    column: 1,
+    line: 1,
+    offset: 0,
+    originalSource: content,
+    source: content,
+    inPre: false,
+    inVPre: false,
+    onWarn: options.onWarn
+  };
+}
+function parseChildren(context, mode, ancestors) {
+  const parent = last(ancestors);
+  const ns = parent ? parent.ns : 0;
+  const nodes = [];
+  while (!isEnd(context, mode, ancestors)) {
+    const s = context.source;
+    let node = void 0;
+    if (mode === 0 || mode === 1) {
+      if (!context.inVPre && startsWith(s, context.options.delimiters[0])) {
+        node = parseInterpolation(context, mode);
+      } else if (mode === 0 && s[0] === "<") {
+        if (s.length === 1) {
+          emitError(context, 5, 1);
+        } else if (s[1] === "!") {
+          if (startsWith(s, "<!--")) {
+            node = parseComment(context);
+          } else if (startsWith(s, "<!DOCTYPE")) {
+            node = parseBogusComment(context);
+          } else if (startsWith(s, "<![CDATA[")) {
+            if (ns !== 0) {
+              node = parseCDATA(context, ancestors);
+            } else {
+              emitError(context, 1);
+              node = parseBogusComment(context);
+            }
+          } else {
+            emitError(context, 11);
+            node = parseBogusComment(context);
+          }
+        } else if (s[1] === "/") {
+          if (s.length === 2) {
+            emitError(context, 5, 2);
+          } else if (s[2] === ">") {
+            emitError(context, 14, 2);
+            advanceBy(context, 3);
+            continue;
+          } else if (/[a-z]/i.test(s[2])) {
+            emitError(context, 23);
+            parseTag(context, 1 /* End */, parent);
+            continue;
+          } else {
+            emitError(
+              context,
+              12,
+              2
+            );
+            node = parseBogusComment(context);
+          }
+        } else if (/[a-z]/i.test(s[1])) {
+          node = parseElement(context, ancestors);
+        } else if (s[1] === "?") {
+          emitError(
+            context,
+            21,
+            1
+          );
+          node = parseBogusComment(context);
+        } else {
+          emitError(context, 12, 1);
+        }
+      }
+    }
+    if (!node) {
+      node = parseText(context, mode);
+    }
+    if (isArray(node)) {
+      for (let i = 0; i < node.length; i++) {
+        pushNode(nodes, node[i]);
+      }
+    } else {
+      pushNode(nodes, node);
+    }
+  }
+  let removedWhitespace = false;
+  if (mode !== 2 && mode !== 1) {
+    const shouldCondense = context.options.whitespace !== "preserve";
+    for (let i = 0; i < nodes.length; i++) {
+      const node = nodes[i];
+      if (node.type === 2) {
+        if (!context.inPre) {
+          if (!/[^\t\r\n\f ]/.test(node.content)) {
+            const prev = nodes[i - 1];
+            const next = nodes[i + 1];
+            if (!prev || !next || shouldCondense && (prev.type === 3 && next.type === 3 || prev.type === 3 && next.type === 1 || prev.type === 1 && next.type === 3 || prev.type === 1 && next.type === 1 && /[\r\n]/.test(node.content))) {
+              removedWhitespace = true;
+              nodes[i] = null;
+            } else {
+              node.content = " ";
+            }
+          } else if (shouldCondense) {
+            node.content = node.content.replace(/[\t\r\n\f ]+/g, " ");
+          }
+        } else {
+          node.content = node.content.replace(/\r\n/g, "\n");
+        }
+      } else if (node.type === 3 && !context.options.comments) {
+        removedWhitespace = true;
+        nodes[i] = null;
+      }
+    }
+    if (context.inPre && parent && context.options.isPreTag(parent.tag)) {
+      const first = nodes[0];
+      if (first && first.type === 2) {
+        first.content = first.content.replace(/^\r?\n/, "");
+      }
+    }
+  }
+  return removedWhitespace ? nodes.filter(Boolean) : nodes;
+}
+function pushNode(nodes, node) {
+  if (node.type === 2) {
+    const prev = last(nodes);
+    if (prev && prev.type === 2 && prev.loc.end.offset === node.loc.start.offset) {
+      prev.content += node.content;
+      prev.loc.end = node.loc.end;
+      prev.loc.source += node.loc.source;
+      return;
+    }
+  }
+  nodes.push(node);
+}
+function parseCDATA(context, ancestors) {
+  advanceBy(context, 9);
+  const nodes = parseChildren(context, 3, ancestors);
+  if (context.source.length === 0) {
+    emitError(context, 6);
+  } else {
+    advanceBy(context, 3);
+  }
+  return nodes;
+}
+function parseComment(context) {
+  const start = getCursor(context);
+  let content;
+  const match = /--(\!)?>/.exec(context.source);
+  if (!match) {
+    content = context.source.slice(4);
+    advanceBy(context, context.source.length);
+    emitError(context, 7);
+  } else {
+    if (match.index <= 3) {
+      emitError(context, 0);
+    }
+    if (match[1]) {
+      emitError(context, 10);
+    }
+    content = context.source.slice(4, match.index);
+    const s = context.source.slice(0, match.index);
+    let prevIndex = 1, nestedIndex = 0;
+    while ((nestedIndex = s.indexOf("<!--", prevIndex)) !== -1) {
+      advanceBy(context, nestedIndex - prevIndex + 1);
+      if (nestedIndex + 4 < s.length) {
+        emitError(context, 16);
+      }
+      prevIndex = nestedIndex + 1;
+    }
+    advanceBy(context, match.index + match[0].length - prevIndex + 1);
+  }
+  return {
+    type: 3,
+    content,
+    loc: getSelection(context, start)
+  };
+}
+function parseBogusComment(context) {
+  const start = getCursor(context);
+  const contentStart = context.source[1] === "?" ? 1 : 2;
+  let content;
+  const closeIndex = context.source.indexOf(">");
+  if (closeIndex === -1) {
+    content = context.source.slice(contentStart);
+    advanceBy(context, context.source.length);
+  } else {
+    content = context.source.slice(contentStart, closeIndex);
+    advanceBy(context, closeIndex + 1);
+  }
+  return {
+    type: 3,
+    content,
+    loc: getSelection(context, start)
+  };
+}
+function parseElement(context, ancestors) {
+  const wasInPre = context.inPre;
+  const wasInVPre = context.inVPre;
+  const parent = last(ancestors);
+  const element = parseTag(context, 0 /* Start */, parent);
+  const isPreBoundary = context.inPre && !wasInPre;
+  const isVPreBoundary = context.inVPre && !wasInVPre;
+  if (element.isSelfClosing || context.options.isVoidTag(element.tag)) {
+    if (isPreBoundary) {
+      context.inPre = false;
+    }
+    if (isVPreBoundary) {
+      context.inVPre = false;
+    }
+    return element;
+  }
+  ancestors.push(element);
+  const mode = context.options.getTextMode(element, parent);
+  const children = parseChildren(context, mode, ancestors);
+  ancestors.pop();
+  element.children = children;
+  if (startsWithEndTagOpen(context.source, element.tag)) {
+    parseTag(context, 1 /* End */, parent);
+  } else {
+    emitError(context, 24, 0, element.loc.start);
+    if (context.source.length === 0 && element.tag.toLowerCase() === "script") {
+      const first = children[0];
+      if (first && startsWith(first.loc.source, "<!--")) {
+        emitError(context, 8);
+      }
+    }
+  }
+  element.loc = getSelection(context, element.loc.start);
+  if (isPreBoundary) {
+    context.inPre = false;
+  }
+  if (isVPreBoundary) {
+    context.inVPre = false;
+  }
+  return element;
+}
+const isSpecialTemplateDirective = /* @__PURE__ */ makeMap(
+  `if,else,else-if,for,slot`
+);
+function parseTag(context, type, parent) {
+  const start = getCursor(context);
+  const match = /^<\/?([a-z][^\t\r\n\f />]*)/i.exec(context.source);
+  const tag = match[1];
+  const ns = context.options.getNamespace(tag, parent);
+  advanceBy(context, match[0].length);
+  advanceSpaces(context);
+  const cursor = getCursor(context);
+  const currentSource = context.source;
+  if (context.options.isPreTag(tag)) {
+    context.inPre = true;
+  }
+  let props = parseAttributes(context, type);
+  if (type === 0 /* Start */ && !context.inVPre && props.some((p) => p.type === 7 && p.name === "pre")) {
+    context.inVPre = true;
+    extend(context, cursor);
+    context.source = currentSource;
+    props = parseAttributes(context, type).filter((p) => p.name !== "v-pre");
+  }
+  let isSelfClosing = false;
+  if (context.source.length === 0) {
+    emitError(context, 9);
+  } else {
+    isSelfClosing = startsWith(context.source, "/>");
+    if (type === 1 /* End */ && isSelfClosing) {
+      emitError(context, 4);
+    }
+    advanceBy(context, isSelfClosing ? 2 : 1);
+  }
+  if (type === 1 /* End */) {
+    return;
+  }
+  let tagType = 0;
+  if (!context.inVPre) {
+    if (tag === "slot") {
+      tagType = 2;
+    } else if (tag === "template") {
+      if (props.some(
+        (p) => p.type === 7 && isSpecialTemplateDirective(p.name)
+      )) {
+        tagType = 3;
+      }
+    } else if (isComponent(tag, props, context)) {
+      tagType = 1;
+    }
+  }
+  return {
+    type: 1,
+    ns,
+    tag,
+    tagType,
+    props,
+    isSelfClosing,
+    children: [],
+    loc: getSelection(context, start),
+    codegenNode: void 0
+    // to be created during transform phase
+  };
+}
+function isComponent(tag, props, context) {
+  const options = context.options;
+  if (options.isCustomElement(tag)) {
+    return false;
+  }
+  if (tag === "component" || /^[A-Z]/.test(tag) || isCoreComponent(tag) || options.isBuiltInComponent && options.isBuiltInComponent(tag) || options.isNativeTag && !options.isNativeTag(tag)) {
+    return true;
+  }
+  for (let i = 0; i < props.length; i++) {
+    const p = props[i];
+    if (p.type === 6) {
+      if (p.name === "is" && p.value) {
+        if (p.value.content.startsWith("vue:")) {
+          return true;
+        }
+      }
+    } else {
+      if (p.name === "is") {
+        return true;
+      } else if (
+        // :is on plain element - only treat as component in compat mode
+        p.name === "bind" && isStaticArgOf(p.arg, "is") && false
+      ) {
+        return true;
+      }
+    }
+  }
+}
+function parseAttributes(context, type) {
+  const props = [];
+  const attributeNames = /* @__PURE__ */ new Set();
+  while (context.source.length > 0 && !startsWith(context.source, ">") && !startsWith(context.source, "/>")) {
+    if (startsWith(context.source, "/")) {
+      emitError(context, 22);
+      advanceBy(context, 1);
+      advanceSpaces(context);
+      continue;
+    }
+    if (type === 1 /* End */) {
+      emitError(context, 3);
+    }
+    const attr = parseAttribute(context, attributeNames);
+    if (attr.type === 6 && attr.value && attr.name === "class") {
+      attr.value.content = attr.value.content.replace(/\s+/g, " ").trim();
+    }
+    if (type === 0 /* Start */) {
+      props.push(attr);
+    }
+    if (/^[^\t\r\n\f />]/.test(context.source)) {
+      emitError(context, 15);
+    }
+    advanceSpaces(context);
+  }
+  return props;
+}
+function parseAttribute(context, nameSet) {
+  var _a;
+  const start = getCursor(context);
+  const match = /^[^\t\r\n\f />][^\t\r\n\f />=]*/.exec(context.source);
+  const name = match[0];
+  if (nameSet.has(name)) {
+    emitError(context, 2);
+  }
+  nameSet.add(name);
+  if (name[0] === "=") {
+    emitError(context, 19);
+  }
+  {
+    const pattern = /["'<]/g;
+    let m;
+    while (m = pattern.exec(name)) {
+      emitError(
+        context,
+        17,
+        m.index
+      );
+    }
+  }
+  advanceBy(context, name.length);
+  let value = void 0;
+  if (/^[\t\r\n\f ]*=/.test(context.source)) {
+    advanceSpaces(context);
+    advanceBy(context, 1);
+    advanceSpaces(context);
+    value = parseAttributeValue(context);
+    if (!value) {
+      emitError(context, 13);
+    }
+  }
+  const loc = getSelection(context, start);
+  if (!context.inVPre && /^(v-[A-Za-z0-9-]|:|\.|@|#)/.test(name)) {
+    const match2 = /(?:^v-([a-z0-9-]+))?(?:(?::|^\.|^@|^#)(\[[^\]]+\]|[^\.]+))?(.+)?$/i.exec(
+      name
+    );
+    let isPropShorthand = startsWith(name, ".");
+    let dirName = match2[1] || (isPropShorthand || startsWith(name, ":") ? "bind" : startsWith(name, "@") ? "on" : "slot");
+    let arg;
+    if (match2[2]) {
+      const isSlot = dirName === "slot";
+      const startOffset = name.lastIndexOf(
+        match2[2],
+        name.length - (((_a = match2[3]) == null ? void 0 : _a.length) || 0)
+      );
+      const loc2 = getSelection(
+        context,
+        getNewPosition(context, start, startOffset),
+        getNewPosition(
+          context,
+          start,
+          startOffset + match2[2].length + (isSlot && match2[3] || "").length
+        )
+      );
+      let content = match2[2];
+      let isStatic = true;
+      if (content.startsWith("[")) {
+        isStatic = false;
+        if (!content.endsWith("]")) {
+          emitError(
+            context,
+            27
+          );
+          content = content.slice(1);
+        } else {
+          content = content.slice(1, content.length - 1);
+        }
+      } else if (isSlot) {
+        content += match2[3] || "";
+      }
+      arg = {
+        type: 4,
+        content,
+        isStatic,
+        constType: isStatic ? 3 : 0,
+        loc: loc2
+      };
+    }
+    if (value && value.isQuoted) {
+      const valueLoc = value.loc;
+      valueLoc.start.offset++;
+      valueLoc.start.column++;
+      valueLoc.end = advancePositionWithClone(valueLoc.start, value.content);
+      valueLoc.source = valueLoc.source.slice(1, -1);
+    }
+    const modifiers = match2[3] ? match2[3].slice(1).split(".") : [];
+    if (isPropShorthand)
+      modifiers.push("prop");
+    return {
+      type: 7,
+      name: dirName,
+      exp: value && {
+        type: 4,
+        content: value.content,
+        isStatic: false,
+        // Treat as non-constant by default. This can be potentially set to
+        // other values by `transformExpression` to make it eligible for hoisting.
+        constType: 0,
+        loc: value.loc
+      },
+      arg,
+      modifiers,
+      loc
+    };
+  }
+  if (!context.inVPre && startsWith(name, "v-")) {
+    emitError(context, 26);
+  }
+  return {
+    type: 6,
+    name,
+    value: value && {
+      type: 2,
+      content: value.content,
+      loc: value.loc
+    },
+    loc
+  };
+}
+function parseAttributeValue(context) {
+  const start = getCursor(context);
+  let content;
+  const quote = context.source[0];
+  const isQuoted = quote === `"` || quote === `'`;
+  if (isQuoted) {
+    advanceBy(context, 1);
+    const endIndex = context.source.indexOf(quote);
+    if (endIndex === -1) {
+      content = parseTextData(
+        context,
+        context.source.length,
+        4
+      );
+    } else {
+      content = parseTextData(context, endIndex, 4);
+      advanceBy(context, 1);
+    }
+  } else {
+    const match = /^[^\t\r\n\f >]+/.exec(context.source);
+    if (!match) {
+      return void 0;
+    }
+    const unexpectedChars = /["'<=`]/g;
+    let m;
+    while (m = unexpectedChars.exec(match[0])) {
+      emitError(
+        context,
+        18,
+        m.index
+      );
+    }
+    content = parseTextData(context, match[0].length, 4);
+  }
+  return { content, isQuoted, loc: getSelection(context, start) };
+}
+function parseInterpolation(context, mode) {
+  const [open, close] = context.options.delimiters;
+  const closeIndex = context.source.indexOf(close, open.length);
+  if (closeIndex === -1) {
+    emitError(context, 25);
+    return void 0;
+  }
+  const start = getCursor(context);
+  advanceBy(context, open.length);
+  const innerStart = getCursor(context);
+  const innerEnd = getCursor(context);
+  const rawContentLength = closeIndex - open.length;
+  const rawContent = context.source.slice(0, rawContentLength);
+  const preTrimContent = parseTextData(context, rawContentLength, mode);
+  const content = preTrimContent.trim();
+  const startOffset = preTrimContent.indexOf(content);
+  if (startOffset > 0) {
+    advancePositionWithMutation(innerStart, rawContent, startOffset);
+  }
+  const endOffset = rawContentLength - (preTrimContent.length - content.length - startOffset);
+  advancePositionWithMutation(innerEnd, rawContent, endOffset);
+  advanceBy(context, close.length);
+  return {
+    type: 5,
+    content: {
+      type: 4,
+      isStatic: false,
+      // Set `isConstant` to false by default and will decide in transformExpression
+      constType: 0,
+      content,
+      loc: getSelection(context, innerStart, innerEnd)
+    },
+    loc: getSelection(context, start)
+  };
+}
+function parseText(context, mode) {
+  const endTokens = mode === 3 ? ["]]>"] : ["<", context.options.delimiters[0]];
+  let endIndex = context.source.length;
+  for (let i = 0; i < endTokens.length; i++) {
+    const index = context.source.indexOf(endTokens[i], 1);
+    if (index !== -1 && endIndex > index) {
+      endIndex = index;
+    }
+  }
+  const start = getCursor(context);
+  const content = parseTextData(context, endIndex, mode);
+  return {
+    type: 2,
+    content,
+    loc: getSelection(context, start)
+  };
+}
+function parseTextData(context, length, mode) {
+  const rawText = context.source.slice(0, length);
+  advanceBy(context, length);
+  if (mode === 2 || mode === 3 || !rawText.includes("&")) {
+    return rawText;
+  } else {
+    return context.options.decodeEntities(
+      rawText,
+      mode === 4
+    );
+  }
+}
+function getCursor(context) {
+  const { column, line, offset } = context;
+  return { column, line, offset };
+}
+function getSelection(context, start, end) {
+  end = end || getCursor(context);
+  return {
+    start,
+    end,
+    source: context.originalSource.slice(start.offset, end.offset)
+  };
+}
+function last(xs) {
+  return xs[xs.length - 1];
+}
+function startsWith(source, searchString) {
+  return source.startsWith(searchString);
+}
+function advanceBy(context, numberOfCharacters) {
+  const { source } = context;
+  advancePositionWithMutation(context, source, numberOfCharacters);
+  context.source = source.slice(numberOfCharacters);
+}
+function advanceSpaces(context) {
+  const match = /^[\t\r\n\f ]+/.exec(context.source);
+  if (match) {
+    advanceBy(context, match[0].length);
+  }
+}
+function getNewPosition(context, start, numberOfCharacters) {
+  return advancePositionWithClone(
+    start,
+    context.originalSource.slice(start.offset, numberOfCharacters),
+    numberOfCharacters
+  );
+}
+function emitError(context, code, offset, loc = getCursor(context)) {
+  if (offset) {
+    loc.offset += offset;
+    loc.column += offset;
+  }
+  context.options.onError(
+    createCompilerError(code, {
+      start: loc,
+      end: loc,
+      source: ""
+    })
+  );
+}
+function isEnd(context, mode, ancestors) {
+  const s = context.source;
+  switch (mode) {
+    case 0:
+      if (startsWith(s, "</")) {
+        for (let i = ancestors.length - 1; i >= 0; --i) {
+          if (startsWithEndTagOpen(s, ancestors[i].tag)) {
+            return true;
+          }
+        }
+      }
+      break;
+    case 1:
+    case 2: {
+      const parent = last(ancestors);
+      if (parent && startsWithEndTagOpen(s, parent.tag)) {
+        return true;
+      }
+      break;
+    }
+    case 3:
+      if (startsWith(s, "]]>")) {
+        return true;
+      }
+      break;
+  }
+  return !s;
+}
+function startsWithEndTagOpen(source, tag) {
+  return startsWith(source, "</") && source.slice(2, 2 + tag.length).toLowerCase() === tag.toLowerCase() && /[\t\r\n\f />]/.test(source[2 + tag.length] || ">");
+}
+
+function hoistStatic(root, context) {
+  walk(
+    root,
+    context,
+    // Root node is unfortunately non-hoistable due to potential parent
+    // fallthrough attributes.
+    isSingleElementRoot(root, root.children[0])
+  );
+}
+function isSingleElementRoot(root, child) {
+  const { children } = root;
+  return children.length === 1 && child.type === 1 && !isSlotOutlet(child);
+}
+function walk(node, context, doNotHoistNode = false) {
+  const { children } = node;
+  const originalCount = children.length;
+  let hoistedCount = 0;
+  for (let i = 0; i < children.length; i++) {
+    const child = children[i];
+    if (child.type === 1 && child.tagType === 0) {
+      const constantType = doNotHoistNode ? 0 : getConstantType(child, context);
+      if (constantType > 0) {
+        if (constantType >= 2) {
+          child.codegenNode.patchFlag = -1 + (` /* HOISTED */` );
+          child.codegenNode = context.hoist(child.codegenNode);
+          hoistedCount++;
+          continue;
+        }
+      } else {
+        const codegenNode = child.codegenNode;
+        if (codegenNode.type === 13) {
+          const flag = getPatchFlag(codegenNode);
+          if ((!flag || flag === 512 || flag === 1) && getGeneratedPropsConstantType(child, context) >= 2) {
+            const props = getNodeProps(child);
+            if (props) {
+              codegenNode.props = context.hoist(props);
+            }
+          }
+          if (codegenNode.dynamicProps) {
+            codegenNode.dynamicProps = context.hoist(codegenNode.dynamicProps);
+          }
+        }
+      }
+    }
+    if (child.type === 1) {
+      const isComponent = child.tagType === 1;
+      if (isComponent) {
+        context.scopes.vSlot++;
+      }
+      walk(child, context);
+      if (isComponent) {
+        context.scopes.vSlot--;
+      }
+    } else if (child.type === 11) {
+      walk(child, context, child.children.length === 1);
+    } else if (child.type === 9) {
+      for (let i2 = 0; i2 < child.branches.length; i2++) {
+        walk(
+          child.branches[i2],
+          context,
+          child.branches[i2].children.length === 1
+        );
+      }
+    }
+  }
+  if (hoistedCount && context.transformHoist) {
+    context.transformHoist(children, context, node);
+  }
+  if (hoistedCount && hoistedCount === originalCount && node.type === 1 && node.tagType === 0 && node.codegenNode && node.codegenNode.type === 13 && isArray(node.codegenNode.children)) {
+    node.codegenNode.children = context.hoist(
+      createArrayExpression(node.codegenNode.children)
+    );
+  }
+}
+function getConstantType(node, context) {
+  const { constantCache } = context;
+  switch (node.type) {
+    case 1:
+      if (node.tagType !== 0) {
+        return 0;
+      }
+      const cached = constantCache.get(node);
+      if (cached !== void 0) {
+        return cached;
+      }
+      const codegenNode = node.codegenNode;
+      if (codegenNode.type !== 13) {
+        return 0;
+      }
+      if (codegenNode.isBlock && node.tag !== "svg" && node.tag !== "foreignObject") {
+        return 0;
+      }
+      const flag = getPatchFlag(codegenNode);
+      if (!flag) {
+        let returnType2 = 3;
+        const generatedPropsType = getGeneratedPropsConstantType(node, context);
+        if (generatedPropsType === 0) {
+          constantCache.set(node, 0);
+          return 0;
+        }
+        if (generatedPropsType < returnType2) {
+          returnType2 = generatedPropsType;
+        }
+        for (let i = 0; i < node.children.length; i++) {
+          const childType = getConstantType(node.children[i], context);
+          if (childType === 0) {
+            constantCache.set(node, 0);
+            return 0;
+          }
+          if (childType < returnType2) {
+            returnType2 = childType;
+          }
+        }
+        if (returnType2 > 1) {
+          for (let i = 0; i < node.props.length; i++) {
+            const p = node.props[i];
+            if (p.type === 7 && p.name === "bind" && p.exp) {
+              const expType = getConstantType(p.exp, context);
+              if (expType === 0) {
+                constantCache.set(node, 0);
+                return 0;
+              }
+              if (expType < returnType2) {
+                returnType2 = expType;
+              }
+            }
+          }
+        }
+        if (codegenNode.isBlock) {
+          for (let i = 0; i < node.props.length; i++) {
+            const p = node.props[i];
+            if (p.type === 7) {
+              constantCache.set(node, 0);
+              return 0;
+            }
+          }
+          context.removeHelper(OPEN_BLOCK);
+          context.removeHelper(
+            getVNodeBlockHelper(context.inSSR, codegenNode.isComponent)
+          );
+          codegenNode.isBlock = false;
+          context.helper(getVNodeHelper(context.inSSR, codegenNode.isComponent));
+        }
+        constantCache.set(node, returnType2);
+        return returnType2;
+      } else {
+        constantCache.set(node, 0);
+        return 0;
+      }
+    case 2:
+    case 3:
+      return 3;
+    case 9:
+    case 11:
+    case 10:
+      return 0;
+    case 5:
+    case 12:
+      return getConstantType(node.content, context);
+    case 4:
+      return node.constType;
+    case 8:
+      let returnType = 3;
+      for (let i = 0; i < node.children.length; i++) {
+        const child = node.children[i];
+        if (isString(child) || isSymbol(child)) {
+          continue;
+        }
+        const childType = getConstantType(child, context);
+        if (childType === 0) {
+          return 0;
+        } else if (childType < returnType) {
+          returnType = childType;
+        }
+      }
+      return returnType;
+    default:
+      return 0;
+  }
+}
+const allowHoistedHelperSet = /* @__PURE__ */ new Set([
+  NORMALIZE_CLASS,
+  NORMALIZE_STYLE,
+  NORMALIZE_PROPS,
+  GUARD_REACTIVE_PROPS
+]);
+function getConstantTypeOfHelperCall(value, context) {
+  if (value.type === 14 && !isString(value.callee) && allowHoistedHelperSet.has(value.callee)) {
+    const arg = value.arguments[0];
+    if (arg.type === 4) {
+      return getConstantType(arg, context);
+    } else if (arg.type === 14) {
+      return getConstantTypeOfHelperCall(arg, context);
+    }
+  }
+  return 0;
+}
+function getGeneratedPropsConstantType(node, context) {
+  let returnType = 3;
+  const props = getNodeProps(node);
+  if (props && props.type === 15) {
+    const { properties } = props;
+    for (let i = 0; i < properties.length; i++) {
+      const { key, value } = properties[i];
+      const keyType = getConstantType(key, context);
+      if (keyType === 0) {
+        return keyType;
+      }
+      if (keyType < returnType) {
+        returnType = keyType;
+      }
+      let valueType;
+      if (value.type === 4) {
+        valueType = getConstantType(value, context);
+      } else if (value.type === 14) {
+        valueType = getConstantTypeOfHelperCall(value, context);
+      } else {
+        valueType = 0;
+      }
+      if (valueType === 0) {
+        return valueType;
+      }
+      if (valueType < returnType) {
+        returnType = valueType;
+      }
+    }
+  }
+  return returnType;
+}
+function getNodeProps(node) {
+  const codegenNode = node.codegenNode;
+  if (codegenNode.type === 13) {
+    return codegenNode.props;
+  }
+}
+function getPatchFlag(node) {
+  const flag = node.patchFlag;
+  return flag ? parseInt(flag, 10) : void 0;
+}
+
+function createTransformContext(root, {
+  filename = "",
+  prefixIdentifiers = false,
+  hoistStatic: hoistStatic2 = false,
+  cacheHandlers = false,
+  nodeTransforms = [],
+  directiveTransforms = {},
+  transformHoist = null,
+  isBuiltInComponent = NOOP,
+  isCustomElement = NOOP,
+  expressionPlugins = [],
+  scopeId = null,
+  slotted = true,
+  ssr = false,
+  inSSR = false,
+  ssrCssVars = ``,
+  bindingMetadata = EMPTY_OBJ,
+  inline = false,
+  isTS = false,
+  onError = defaultOnError,
+  onWarn = defaultOnWarn,
+  compatConfig
+}) {
+  const nameMatch = filename.replace(/\?.*$/, "").match(/([^/\\]+)\.\w+$/);
+  const context = {
+    // options
+    selfName: nameMatch && capitalize(camelize(nameMatch[1])),
+    prefixIdentifiers,
+    hoistStatic: hoistStatic2,
+    cacheHandlers,
+    nodeTransforms,
+    directiveTransforms,
+    transformHoist,
+    isBuiltInComponent,
+    isCustomElement,
+    expressionPlugins,
+    scopeId,
+    slotted,
+    ssr,
+    inSSR,
+    ssrCssVars,
+    bindingMetadata,
+    inline,
+    isTS,
+    onError,
+    onWarn,
+    compatConfig,
+    // state
+    root,
+    helpers: /* @__PURE__ */ new Map(),
+    components: /* @__PURE__ */ new Set(),
+    directives: /* @__PURE__ */ new Set(),
+    hoists: [],
+    imports: [],
+    constantCache: /* @__PURE__ */ new WeakMap(),
+    temps: 0,
+    cached: 0,
+    identifiers: /* @__PURE__ */ Object.create(null),
+    scopes: {
+      vFor: 0,
+      vSlot: 0,
+      vPre: 0,
+      vOnce: 0
+    },
+    parent: null,
+    currentNode: root,
+    childIndex: 0,
+    inVOnce: false,
+    // methods
+    helper(name) {
+      const count = context.helpers.get(name) || 0;
+      context.helpers.set(name, count + 1);
+      return name;
+    },
+    removeHelper(name) {
+      const count = context.helpers.get(name);
+      if (count) {
+        const currentCount = count - 1;
+        if (!currentCount) {
+          context.helpers.delete(name);
+        } else {
+          context.helpers.set(name, currentCount);
+        }
+      }
+    },
+    helperString(name) {
+      return `_${helperNameMap[context.helper(name)]}`;
+    },
+    replaceNode(node) {
+      {
+        if (!context.currentNode) {
+          throw new Error(`Node being replaced is already removed.`);
+        }
+        if (!context.parent) {
+          throw new Error(`Cannot replace root node.`);
+        }
+      }
+      context.parent.children[context.childIndex] = context.currentNode = node;
+    },
+    removeNode(node) {
+      if (!context.parent) {
+        throw new Error(`Cannot remove root node.`);
+      }
+      const list = context.parent.children;
+      const removalIndex = node ? list.indexOf(node) : context.currentNode ? context.childIndex : -1;
+      if (removalIndex < 0) {
+        throw new Error(`node being removed is not a child of current parent`);
+      }
+      if (!node || node === context.currentNode) {
+        context.currentNode = null;
+        context.onNodeRemoved();
+      } else {
+        if (context.childIndex > removalIndex) {
+          context.childIndex--;
+          context.onNodeRemoved();
+        }
+      }
+      context.parent.children.splice(removalIndex, 1);
+    },
+    onNodeRemoved: () => {
+    },
+    addIdentifiers(exp) {
+    },
+    removeIdentifiers(exp) {
+    },
+    hoist(exp) {
+      if (isString(exp))
+        exp = createSimpleExpression(exp);
+      context.hoists.push(exp);
+      const identifier = createSimpleExpression(
+        `_hoisted_${context.hoists.length}`,
+        false,
+        exp.loc,
+        2
+      );
+      identifier.hoisted = exp;
+      return identifier;
+    },
+    cache(exp, isVNode = false) {
+      return createCacheExpression(context.cached++, exp, isVNode);
+    }
+  };
+  return context;
+}
+function transform(root, options) {
+  const context = createTransformContext(root, options);
+  traverseNode(root, context);
+  if (options.hoistStatic) {
+    hoistStatic(root, context);
+  }
+  if (!options.ssr) {
+    createRootCodegen(root, context);
+  }
+  root.helpers = /* @__PURE__ */ new Set([...context.helpers.keys()]);
+  root.components = [...context.components];
+  root.directives = [...context.directives];
+  root.imports = context.imports;
+  root.hoists = context.hoists;
+  root.temps = context.temps;
+  root.cached = context.cached;
+}
+function createRootCodegen(root, context) {
+  const { helper } = context;
+  const { children } = root;
+  if (children.length === 1) {
+    const child = children[0];
+    if (isSingleElementRoot(root, child) && child.codegenNode) {
+      const codegenNode = child.codegenNode;
+      if (codegenNode.type === 13) {
+        convertToBlock(codegenNode, context);
+      }
+      root.codegenNode = codegenNode;
+    } else {
+      root.codegenNode = child;
+    }
+  } else if (children.length > 1) {
+    let patchFlag = 64;
+    let patchFlagText = PatchFlagNames[64];
+    if (children.filter((c) => c.type !== 3).length === 1) {
+      patchFlag |= 2048;
+      patchFlagText += `, ${PatchFlagNames[2048]}`;
+    }
+    root.codegenNode = createVNodeCall(
+      context,
+      helper(FRAGMENT),
+      void 0,
+      root.children,
+      patchFlag + (` /* ${patchFlagText} */` ),
+      void 0,
+      void 0,
+      true,
+      void 0,
+      false
+      /* isComponent */
+    );
+  } else ;
+}
+function traverseChildren(parent, context) {
+  let i = 0;
+  const nodeRemoved = () => {
+    i--;
+  };
+  for (; i < parent.children.length; i++) {
+    const child = parent.children[i];
+    if (isString(child))
+      continue;
+    context.parent = parent;
+    context.childIndex = i;
+    context.onNodeRemoved = nodeRemoved;
+    traverseNode(child, context);
+  }
+}
+function traverseNode(node, context) {
+  context.currentNode = node;
+  const { nodeTransforms } = context;
+  const exitFns = [];
+  for (let i2 = 0; i2 < nodeTransforms.length; i2++) {
+    const onExit = nodeTransforms[i2](node, context);
+    if (onExit) {
+      if (isArray(onExit)) {
+        exitFns.push(...onExit);
+      } else {
+        exitFns.push(onExit);
+      }
+    }
+    if (!context.currentNode) {
+      return;
+    } else {
+      node = context.currentNode;
+    }
+  }
+  switch (node.type) {
+    case 3:
+      if (!context.ssr) {
+        context.helper(CREATE_COMMENT);
+      }
+      break;
+    case 5:
+      if (!context.ssr) {
+        context.helper(TO_DISPLAY_STRING);
+      }
+      break;
+    case 9:
+      for (let i2 = 0; i2 < node.branches.length; i2++) {
+        traverseNode(node.branches[i2], context);
+      }
+      break;
+    case 10:
+    case 11:
+    case 1:
+    case 0:
+      traverseChildren(node, context);
+      break;
+  }
+  context.currentNode = node;
+  let i = exitFns.length;
+  while (i--) {
+    exitFns[i]();
+  }
+}
+function createStructuralDirectiveTransform(name, fn) {
+  const matches = isString(name) ? (n) => n === name : (n) => name.test(n);
+  return (node, context) => {
+    if (node.type === 1) {
+      const { props } = node;
+      if (node.tagType === 3 && props.some(isVSlot)) {
+        return;
+      }
+      const exitFns = [];
+      for (let i = 0; i < props.length; i++) {
+        const prop = props[i];
+        if (prop.type === 7 && matches(prop.name)) {
+          props.splice(i, 1);
+          i--;
+          const onExit = fn(node, prop, context);
+          if (onExit)
+            exitFns.push(onExit);
+        }
+      }
+      return exitFns;
+    }
+  };
+}
+
+const PURE_ANNOTATION = `/*#__PURE__*/`;
+const aliasHelper = (s) => `${helperNameMap[s]}: _${helperNameMap[s]}`;
+function createCodegenContext(ast, {
+  mode = "function",
+  prefixIdentifiers = mode === "module",
+  sourceMap = false,
+  filename = `template.vue.html`,
+  scopeId = null,
+  optimizeImports = false,
+  runtimeGlobalName = `Vue`,
+  runtimeModuleName = `vue`,
+  ssrRuntimeModuleName = "vue/server-renderer",
+  ssr = false,
+  isTS = false,
+  inSSR = false
+}) {
+  const context = {
+    mode,
+    prefixIdentifiers,
+    sourceMap,
+    filename,
+    scopeId,
+    optimizeImports,
+    runtimeGlobalName,
+    runtimeModuleName,
+    ssrRuntimeModuleName,
+    ssr,
+    isTS,
+    inSSR,
+    source: ast.loc.source,
+    code: ``,
+    column: 1,
+    line: 1,
+    offset: 0,
+    indentLevel: 0,
+    pure: false,
+    map: void 0,
+    helper(key) {
+      return `_${helperNameMap[key]}`;
+    },
+    push(code, node) {
+      context.code += code;
+    },
+    indent() {
+      newline(++context.indentLevel);
+    },
+    deindent(withoutNewLine = false) {
+      if (withoutNewLine) {
+        --context.indentLevel;
+      } else {
+        newline(--context.indentLevel);
+      }
+    },
+    newline() {
+      newline(context.indentLevel);
+    }
+  };
+  function newline(n) {
+    context.push("\n" + `  `.repeat(n));
+  }
+  return context;
+}
+function generate(ast, options = {}) {
+  const context = createCodegenContext(ast, options);
+  if (options.onContextCreated)
+    options.onContextCreated(context);
+  const {
+    mode,
+    push,
+    prefixIdentifiers,
+    indent,
+    deindent,
+    newline,
+    scopeId,
+    ssr
+  } = context;
+  const helpers = Array.from(ast.helpers);
+  const hasHelpers = helpers.length > 0;
+  const useWithBlock = !prefixIdentifiers && mode !== "module";
+  const isSetupInlined = false;
+  const preambleContext = isSetupInlined ? createCodegenContext(ast, options) : context;
+  {
+    genFunctionPreamble(ast, preambleContext);
+  }
+  const functionName = ssr ? `ssrRender` : `render`;
+  const args = ssr ? ["_ctx", "_push", "_parent", "_attrs"] : ["_ctx", "_cache"];
+  const signature = args.join(", ");
+  {
+    push(`function ${functionName}(${signature}) {`);
+  }
+  indent();
+  if (useWithBlock) {
+    push(`with (_ctx) {`);
+    indent();
+    if (hasHelpers) {
+      push(`const { ${helpers.map(aliasHelper).join(", ")} } = _Vue`);
+      push(`
+`);
+      newline();
+    }
+  }
+  if (ast.components.length) {
+    genAssets(ast.components, "component", context);
+    if (ast.directives.length || ast.temps > 0) {
+      newline();
+    }
+  }
+  if (ast.directives.length) {
+    genAssets(ast.directives, "directive", context);
+    if (ast.temps > 0) {
+      newline();
+    }
+  }
+  if (ast.temps > 0) {
+    push(`let `);
+    for (let i = 0; i < ast.temps; i++) {
+      push(`${i > 0 ? `, ` : ``}_temp${i}`);
+    }
+  }
+  if (ast.components.length || ast.directives.length || ast.temps) {
+    push(`
+`);
+    newline();
+  }
+  if (!ssr) {
+    push(`return `);
+  }
+  if (ast.codegenNode) {
+    genNode(ast.codegenNode, context);
+  } else {
+    push(`null`);
+  }
+  if (useWithBlock) {
+    deindent();
+    push(`}`);
+  }
+  deindent();
+  push(`}`);
+  return {
+    ast,
+    code: context.code,
+    preamble: isSetupInlined ? preambleContext.code : ``,
+    // SourceMapGenerator does have toJSON() method but it's not in the types
+    map: context.map ? context.map.toJSON() : void 0
+  };
+}
+function genFunctionPreamble(ast, context) {
+  const {
+    ssr,
+    prefixIdentifiers,
+    push,
+    newline,
+    runtimeModuleName,
+    runtimeGlobalName,
+    ssrRuntimeModuleName
+  } = context;
+  const VueBinding = runtimeGlobalName;
+  const helpers = Array.from(ast.helpers);
+  if (helpers.length > 0) {
+    {
+      push(`const _Vue = ${VueBinding}
+`);
+      if (ast.hoists.length) {
+        const staticHelpers = [
+          CREATE_VNODE,
+          CREATE_ELEMENT_VNODE,
+          CREATE_COMMENT,
+          CREATE_TEXT,
+          CREATE_STATIC
+        ].filter((helper) => helpers.includes(helper)).map(aliasHelper).join(", ");
+        push(`const { ${staticHelpers} } = _Vue
+`);
+      }
+    }
+  }
+  genHoists(ast.hoists, context);
+  newline();
+  push(`return `);
+}
+function genAssets(assets, type, { helper, push, newline, isTS }) {
+  const resolver = helper(
+    type === "component" ? RESOLVE_COMPONENT : RESOLVE_DIRECTIVE
+  );
+  for (let i = 0; i < assets.length; i++) {
+    let id = assets[i];
+    const maybeSelfReference = id.endsWith("__self");
+    if (maybeSelfReference) {
+      id = id.slice(0, -6);
+    }
+    push(
+      `const ${toValidAssetId(id, type)} = ${resolver}(${JSON.stringify(id)}${maybeSelfReference ? `, true` : ``})${isTS ? `!` : ``}`
+    );
+    if (i < assets.length - 1) {
+      newline();
+    }
+  }
+}
+function genHoists(hoists, context) {
+  if (!hoists.length) {
+    return;
+  }
+  context.pure = true;
+  const { push, newline, helper, scopeId, mode } = context;
+  newline();
+  for (let i = 0; i < hoists.length; i++) {
+    const exp = hoists[i];
+    if (exp) {
+      push(
+        `const _hoisted_${i + 1} = ${``}`
+      );
+      genNode(exp, context);
+      newline();
+    }
+  }
+  context.pure = false;
+}
+function isText(n) {
+  return isString(n) || n.type === 4 || n.type === 2 || n.type === 5 || n.type === 8;
+}
+function genNodeListAsArray(nodes, context) {
+  const multilines = nodes.length > 3 || nodes.some((n) => isArray(n) || !isText(n));
+  context.push(`[`);
+  multilines && context.indent();
+  genNodeList(nodes, context, multilines);
+  multilines && context.deindent();
+  context.push(`]`);
+}
+function genNodeList(nodes, context, multilines = false, comma = true) {
+  const { push, newline } = context;
+  for (let i = 0; i < nodes.length; i++) {
+    const node = nodes[i];
+    if (isString(node)) {
+      push(node);
+    } else if (isArray(node)) {
+      genNodeListAsArray(node, context);
+    } else {
+      genNode(node, context);
+    }
+    if (i < nodes.length - 1) {
+      if (multilines) {
+        comma && push(",");
+        newline();
+      } else {
+        comma && push(", ");
+      }
+    }
+  }
+}
+function genNode(node, context) {
+  if (isString(node)) {
+    context.push(node);
+    return;
+  }
+  if (isSymbol(node)) {
+    context.push(context.helper(node));
+    return;
+  }
+  switch (node.type) {
+    case 1:
+    case 9:
+    case 11:
+      assert(
+        node.codegenNode != null,
+        `Codegen node is missing for element/if/for node. Apply appropriate transforms first.`
+      );
+      genNode(node.codegenNode, context);
+      break;
+    case 2:
+      genText(node, context);
+      break;
+    case 4:
+      genExpression(node, context);
+      break;
+    case 5:
+      genInterpolation(node, context);
+      break;
+    case 12:
+      genNode(node.codegenNode, context);
+      break;
+    case 8:
+      genCompoundExpression(node, context);
+      break;
+    case 3:
+      genComment(node, context);
+      break;
+    case 13:
+      genVNodeCall(node, context);
+      break;
+    case 14:
+      genCallExpression(node, context);
+      break;
+    case 15:
+      genObjectExpression(node, context);
+      break;
+    case 17:
+      genArrayExpression(node, context);
+      break;
+    case 18:
+      genFunctionExpression(node, context);
+      break;
+    case 19:
+      genConditionalExpression(node, context);
+      break;
+    case 20:
+      genCacheExpression(node, context);
+      break;
+    case 21:
+      genNodeList(node.body, context, true, false);
+      break;
+    case 22:
+      break;
+    case 23:
+      break;
+    case 24:
+      break;
+    case 25:
+      break;
+    case 26:
+      break;
+    case 10:
+      break;
+    default:
+      {
+        assert(false, `unhandled codegen node type: ${node.type}`);
+        const exhaustiveCheck = node;
+        return exhaustiveCheck;
+      }
+  }
+}
+function genText(node, context) {
+  context.push(JSON.stringify(node.content), node);
+}
+function genExpression(node, context) {
+  const { content, isStatic } = node;
+  context.push(isStatic ? JSON.stringify(content) : content, node);
+}
+function genInterpolation(node, context) {
+  const { push, helper, pure } = context;
+  if (pure)
+    push(PURE_ANNOTATION);
+  push(`${helper(TO_DISPLAY_STRING)}(`);
+  genNode(node.content, context);
+  push(`)`);
+}
+function genCompoundExpression(node, context) {
+  for (let i = 0; i < node.children.length; i++) {
+    const child = node.children[i];
+    if (isString(child)) {
+      context.push(child);
+    } else {
+      genNode(child, context);
+    }
+  }
+}
+function genExpressionAsPropertyKey(node, context) {
+  const { push } = context;
+  if (node.type === 8) {
+    push(`[`);
+    genCompoundExpression(node, context);
+    push(`]`);
+  } else if (node.isStatic) {
+    const text = isSimpleIdentifier(node.content) ? node.content : JSON.stringify(node.content);
+    push(text, node);
+  } else {
+    push(`[${node.content}]`, node);
+  }
+}
+function genComment(node, context) {
+  const { push, helper, pure } = context;
+  if (pure) {
+    push(PURE_ANNOTATION);
+  }
+  push(`${helper(CREATE_COMMENT)}(${JSON.stringify(node.content)})`, node);
+}
+function genVNodeCall(node, context) {
+  const { push, helper, pure } = context;
+  const {
+    tag,
+    props,
+    children,
+    patchFlag,
+    dynamicProps,
+    directives,
+    isBlock,
+    disableTracking,
+    isComponent
+  } = node;
+  if (directives) {
+    push(helper(WITH_DIRECTIVES) + `(`);
+  }
+  if (isBlock) {
+    push(`(${helper(OPEN_BLOCK)}(${disableTracking ? `true` : ``}), `);
+  }
+  if (pure) {
+    push(PURE_ANNOTATION);
+  }
+  const callHelper = isBlock ? getVNodeBlockHelper(context.inSSR, isComponent) : getVNodeHelper(context.inSSR, isComponent);
+  push(helper(callHelper) + `(`, node);
+  genNodeList(
+    genNullableArgs([tag, props, children, patchFlag, dynamicProps]),
+    context
+  );
+  push(`)`);
+  if (isBlock) {
+    push(`)`);
+  }
+  if (directives) {
+    push(`, `);
+    genNode(directives, context);
+    push(`)`);
+  }
+}
+function genNullableArgs(args) {
+  let i = args.length;
+  while (i--) {
+    if (args[i] != null)
+      break;
+  }
+  return args.slice(0, i + 1).map((arg) => arg || `null`);
+}
+function genCallExpression(node, context) {
+  const { push, helper, pure } = context;
+  const callee = isString(node.callee) ? node.callee : helper(node.callee);
+  if (pure) {
+    push(PURE_ANNOTATION);
+  }
+  push(callee + `(`, node);
+  genNodeList(node.arguments, context);
+  push(`)`);
+}
+function genObjectExpression(node, context) {
+  const { push, indent, deindent, newline } = context;
+  const { properties } = node;
+  if (!properties.length) {
+    push(`{}`, node);
+    return;
+  }
+  const multilines = properties.length > 1 || properties.some((p) => p.value.type !== 4);
+  push(multilines ? `{` : `{ `);
+  multilines && indent();
+  for (let i = 0; i < properties.length; i++) {
+    const { key, value } = properties[i];
+    genExpressionAsPropertyKey(key, context);
+    push(`: `);
+    genNode(value, context);
+    if (i < properties.length - 1) {
+      push(`,`);
+      newline();
+    }
+  }
+  multilines && deindent();
+  push(multilines ? `}` : ` }`);
+}
+function genArrayExpression(node, context) {
+  genNodeListAsArray(node.elements, context);
+}
+function genFunctionExpression(node, context) {
+  const { push, indent, deindent } = context;
+  const { params, returns, body, newline, isSlot } = node;
+  if (isSlot) {
+    push(`_${helperNameMap[WITH_CTX]}(`);
+  }
+  push(`(`, node);
+  if (isArray(params)) {
+    genNodeList(params, context);
+  } else if (params) {
+    genNode(params, context);
+  }
+  push(`) => `);
+  if (newline || body) {
+    push(`{`);
+    indent();
+  }
+  if (returns) {
+    if (newline) {
+      push(`return `);
+    }
+    if (isArray(returns)) {
+      genNodeListAsArray(returns, context);
+    } else {
+      genNode(returns, context);
+    }
+  } else if (body) {
+    genNode(body, context);
+  }
+  if (newline || body) {
+    deindent();
+    push(`}`);
+  }
+  if (isSlot) {
+    push(`)`);
+  }
+}
+function genConditionalExpression(node, context) {
+  const { test, consequent, alternate, newline: needNewline } = node;
+  const { push, indent, deindent, newline } = context;
+  if (test.type === 4) {
+    const needsParens = !isSimpleIdentifier(test.content);
+    needsParens && push(`(`);
+    genExpression(test, context);
+    needsParens && push(`)`);
+  } else {
+    push(`(`);
+    genNode(test, context);
+    push(`)`);
+  }
+  needNewline && indent();
+  context.indentLevel++;
+  needNewline || push(` `);
+  push(`? `);
+  genNode(consequent, context);
+  context.indentLevel--;
+  needNewline && newline();
+  needNewline || push(` `);
+  push(`: `);
+  const isNested = alternate.type === 19;
+  if (!isNested) {
+    context.indentLevel++;
+  }
+  genNode(alternate, context);
+  if (!isNested) {
+    context.indentLevel--;
+  }
+  needNewline && deindent(
+    true
+    /* without newline */
+  );
+}
+function genCacheExpression(node, context) {
+  const { push, helper, indent, deindent, newline } = context;
+  push(`_cache[${node.index}] || (`);
+  if (node.isVNode) {
+    indent();
+    push(`${helper(SET_BLOCK_TRACKING)}(-1),`);
+    newline();
+  }
+  push(`_cache[${node.index}] = `);
+  genNode(node.value, context);
+  if (node.isVNode) {
+    push(`,`);
+    newline();
+    push(`${helper(SET_BLOCK_TRACKING)}(1),`);
+    newline();
+    push(`_cache[${node.index}]`);
+    deindent();
+  }
+  push(`)`);
+}
+
+const prohibitedKeywordRE = new RegExp(
+  "\\b" + "arguments,await,break,case,catch,class,const,continue,debugger,default,delete,do,else,export,extends,finally,for,function,if,import,let,new,return,super,switch,throw,try,var,void,while,with,yield".split(",").join("\\b|\\b") + "\\b"
+);
+const stripStringRE = /'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"|`(?:[^`\\]|\\.)*\$\{|\}(?:[^`\\]|\\.)*`|`(?:[^`\\]|\\.)*`/g;
+function validateBrowserExpression(node, context, asParams = false, asRawStatements = false) {
+  const exp = node.content;
+  if (!exp.trim()) {
+    return;
+  }
+  try {
+    new Function(
+      asRawStatements ? ` ${exp} ` : `return ${asParams ? `(${exp}) => {}` : `(${exp})`}`
+    );
+  } catch (e) {
+    let message = e.message;
+    const keywordMatch = exp.replace(stripStringRE, "").match(prohibitedKeywordRE);
+    if (keywordMatch) {
+      message = `avoid using JavaScript keyword as property name: "${keywordMatch[0]}"`;
+    }
+    context.onError(
+      createCompilerError(
+        45,
+        node.loc,
+        void 0,
+        message
+      )
+    );
+  }
+}
+
+const transformExpression = (node, context) => {
+  if (node.type === 5) {
+    node.content = processExpression(
+      node.content,
+      context
+    );
+  } else if (node.type === 1) {
+    for (let i = 0; i < node.props.length; i++) {
+      const dir = node.props[i];
+      if (dir.type === 7 && dir.name !== "for") {
+        const exp = dir.exp;
+        const arg = dir.arg;
+        if (exp && exp.type === 4 && !(dir.name === "on" && arg)) {
+          dir.exp = processExpression(
+            exp,
+            context,
+            // slot args must be processed as function params
+            dir.name === "slot"
+          );
+        }
+        if (arg && arg.type === 4 && !arg.isStatic) {
+          dir.arg = processExpression(arg, context);
+        }
+      }
+    }
+  }
+};
+function processExpression(node, context, asParams = false, asRawStatements = false, localVars = Object.create(context.identifiers)) {
+  {
+    {
+      validateBrowserExpression(node, context, asParams, asRawStatements);
+    }
+    return node;
+  }
+}
+
+const transformIf = createStructuralDirectiveTransform(
+  /^(if|else|else-if)$/,
+  (node, dir, context) => {
+    return processIf(node, dir, context, (ifNode, branch, isRoot) => {
+      const siblings = context.parent.children;
+      let i = siblings.indexOf(ifNode);
+      let key = 0;
+      while (i-- >= 0) {
+        const sibling = siblings[i];
+        if (sibling && sibling.type === 9) {
+          key += sibling.branches.length;
+        }
+      }
+      return () => {
+        if (isRoot) {
+          ifNode.codegenNode = createCodegenNodeForBranch(
+            branch,
+            key,
+            context
+          );
+        } else {
+          const parentCondition = getParentCondition(ifNode.codegenNode);
+          parentCondition.alternate = createCodegenNodeForBranch(
+            branch,
+            key + ifNode.branches.length - 1,
+            context
+          );
+        }
+      };
+    });
+  }
+);
+function processIf(node, dir, context, processCodegen) {
+  if (dir.name !== "else" && (!dir.exp || !dir.exp.content.trim())) {
+    const loc = dir.exp ? dir.exp.loc : node.loc;
+    context.onError(
+      createCompilerError(28, dir.loc)
+    );
+    dir.exp = createSimpleExpression(`true`, false, loc);
+  }
+  if (dir.exp) {
+    validateBrowserExpression(dir.exp, context);
+  }
+  if (dir.name === "if") {
+    const branch = createIfBranch(node, dir);
+    const ifNode = {
+      type: 9,
+      loc: node.loc,
+      branches: [branch]
+    };
+    context.replaceNode(ifNode);
+    if (processCodegen) {
+      return processCodegen(ifNode, branch, true);
+    }
+  } else {
+    const siblings = context.parent.children;
+    const comments = [];
+    let i = siblings.indexOf(node);
+    while (i-- >= -1) {
+      const sibling = siblings[i];
+      if (sibling && sibling.type === 3) {
+        context.removeNode(sibling);
+        comments.unshift(sibling);
+        continue;
+      }
+      if (sibling && sibling.type === 2 && !sibling.content.trim().length) {
+        context.removeNode(sibling);
+        continue;
+      }
+      if (sibling && sibling.type === 9) {
+        if (dir.name === "else-if" && sibling.branches[sibling.branches.length - 1].condition === void 0) {
+          context.onError(
+            createCompilerError(30, node.loc)
+          );
+        }
+        context.removeNode();
+        const branch = createIfBranch(node, dir);
+        if (comments.length && // #3619 ignore comments if the v-if is direct child of <transition>
+        !(context.parent && context.parent.type === 1 && isBuiltInType(context.parent.tag, "transition"))) {
+          branch.children = [...comments, ...branch.children];
+        }
+        {
+          const key = branch.userKey;
+          if (key) {
+            sibling.branches.forEach(({ userKey }) => {
+              if (isSameKey(userKey, key)) {
+                context.onError(
+                  createCompilerError(
+                    29,
+                    branch.userKey.loc
+                  )
+                );
+              }
+            });
+          }
+        }
+        sibling.branches.push(branch);
+        const onExit = processCodegen && processCodegen(sibling, branch, false);
+        traverseNode(branch, context);
+        if (onExit)
+          onExit();
+        context.currentNode = null;
+      } else {
+        context.onError(
+          createCompilerError(30, node.loc)
+        );
+      }
+      break;
+    }
+  }
+}
+function createIfBranch(node, dir) {
+  const isTemplateIf = node.tagType === 3;
+  return {
+    type: 10,
+    loc: node.loc,
+    condition: dir.name === "else" ? void 0 : dir.exp,
+    children: isTemplateIf && !findDir(node, "for") ? node.children : [node],
+    userKey: findProp(node, `key`),
+    isTemplateIf
+  };
+}
+function createCodegenNodeForBranch(branch, keyIndex, context) {
+  if (branch.condition) {
+    return createConditionalExpression(
+      branch.condition,
+      createChildrenCodegenNode(branch, keyIndex, context),
+      // make sure to pass in asBlock: true so that the comment node call
+      // closes the current block.
+      createCallExpression(context.helper(CREATE_COMMENT), [
+        '"v-if"' ,
+        "true"
+      ])
+    );
+  } else {
+    return createChildrenCodegenNode(branch, keyIndex, context);
+  }
+}
+function createChildrenCodegenNode(branch, keyIndex, context) {
+  const { helper } = context;
+  const keyProperty = createObjectProperty(
+    `key`,
+    createSimpleExpression(
+      `${keyIndex}`,
+      false,
+      locStub,
+      2
+    )
+  );
+  const { children } = branch;
+  const firstChild = children[0];
+  const needFragmentWrapper = children.length !== 1 || firstChild.type !== 1;
+  if (needFragmentWrapper) {
+    if (children.length === 1 && firstChild.type === 11) {
+      const vnodeCall = firstChild.codegenNode;
+      injectProp(vnodeCall, keyProperty, context);
+      return vnodeCall;
+    } else {
+      let patchFlag = 64;
+      let patchFlagText = PatchFlagNames[64];
+      if (!branch.isTemplateIf && children.filter((c) => c.type !== 3).length === 1) {
+        patchFlag |= 2048;
+        patchFlagText += `, ${PatchFlagNames[2048]}`;
+      }
+      return createVNodeCall(
+        context,
+        helper(FRAGMENT),
+        createObjectExpression([keyProperty]),
+        children,
+        patchFlag + (` /* ${patchFlagText} */` ),
+        void 0,
+        void 0,
+        true,
+        false,
+        false,
+        branch.loc
+      );
+    }
+  } else {
+    const ret = firstChild.codegenNode;
+    const vnodeCall = getMemoedVNodeCall(ret);
+    if (vnodeCall.type === 13) {
+      convertToBlock(vnodeCall, context);
+    }
+    injectProp(vnodeCall, keyProperty, context);
+    return ret;
+  }
+}
+function isSameKey(a, b) {
+  if (!a || a.type !== b.type) {
+    return false;
+  }
+  if (a.type === 6) {
+    if (a.value.content !== b.value.content) {
+      return false;
+    }
+  } else {
+    const exp = a.exp;
+    const branchExp = b.exp;
+    if (exp.type !== branchExp.type) {
+      return false;
+    }
+    if (exp.type !== 4 || exp.isStatic !== branchExp.isStatic || exp.content !== branchExp.content) {
+      return false;
+    }
+  }
+  return true;
+}
+function getParentCondition(node) {
+  while (true) {
+    if (node.type === 19) {
+      if (node.alternate.type === 19) {
+        node = node.alternate;
+      } else {
+        return node;
+      }
+    } else if (node.type === 20) {
+      node = node.value;
+    }
+  }
+}
+
+const transformFor = createStructuralDirectiveTransform(
+  "for",
+  (node, dir, context) => {
+    const { helper, removeHelper } = context;
+    return processFor(node, dir, context, (forNode) => {
+      const renderExp = createCallExpression(helper(RENDER_LIST), [
+        forNode.source
+      ]);
+      const isTemplate = isTemplateNode(node);
+      const memo = findDir(node, "memo");
+      const keyProp = findProp(node, `key`);
+      const keyExp = keyProp && (keyProp.type === 6 ? createSimpleExpression(keyProp.value.content, true) : keyProp.exp);
+      const keyProperty = keyProp ? createObjectProperty(`key`, keyExp) : null;
+      const isStableFragment = forNode.source.type === 4 && forNode.source.constType > 0;
+      const fragmentFlag = isStableFragment ? 64 : keyProp ? 128 : 256;
+      forNode.codegenNode = createVNodeCall(
+        context,
+        helper(FRAGMENT),
+        void 0,
+        renderExp,
+        fragmentFlag + (` /* ${PatchFlagNames[fragmentFlag]} */` ),
+        void 0,
+        void 0,
+        true,
+        !isStableFragment,
+        false,
+        node.loc
+      );
+      return () => {
+        let childBlock;
+        const { children } = forNode;
+        if (isTemplate) {
+          node.children.some((c) => {
+            if (c.type === 1) {
+              const key = findProp(c, "key");
+              if (key) {
+                context.onError(
+                  createCompilerError(
+                    33,
+                    key.loc
+                  )
+                );
+                return true;
+              }
+            }
+          });
+        }
+        const needFragmentWrapper = children.length !== 1 || children[0].type !== 1;
+        const slotOutlet = isSlotOutlet(node) ? node : isTemplate && node.children.length === 1 && isSlotOutlet(node.children[0]) ? node.children[0] : null;
+        if (slotOutlet) {
+          childBlock = slotOutlet.codegenNode;
+          if (isTemplate && keyProperty) {
+            injectProp(childBlock, keyProperty, context);
+          }
+        } else if (needFragmentWrapper) {
+          childBlock = createVNodeCall(
+            context,
+            helper(FRAGMENT),
+            keyProperty ? createObjectExpression([keyProperty]) : void 0,
+            node.children,
+            64 + (` /* ${PatchFlagNames[64]} */` ),
+            void 0,
+            void 0,
+            true,
+            void 0,
+            false
+            /* isComponent */
+          );
+        } else {
+          childBlock = children[0].codegenNode;
+          if (isTemplate && keyProperty) {
+            injectProp(childBlock, keyProperty, context);
+          }
+          if (childBlock.isBlock !== !isStableFragment) {
+            if (childBlock.isBlock) {
+              removeHelper(OPEN_BLOCK);
+              removeHelper(
+                getVNodeBlockHelper(context.inSSR, childBlock.isComponent)
+              );
+            } else {
+              removeHelper(
+                getVNodeHelper(context.inSSR, childBlock.isComponent)
+              );
+            }
+          }
+          childBlock.isBlock = !isStableFragment;
+          if (childBlock.isBlock) {
+            helper(OPEN_BLOCK);
+            helper(getVNodeBlockHelper(context.inSSR, childBlock.isComponent));
+          } else {
+            helper(getVNodeHelper(context.inSSR, childBlock.isComponent));
+          }
+        }
+        if (memo) {
+          const loop = createFunctionExpression(
+            createForLoopParams(forNode.parseResult, [
+              createSimpleExpression(`_cached`)
+            ])
+          );
+          loop.body = createBlockStatement([
+            createCompoundExpression([`const _memo = (`, memo.exp, `)`]),
+            createCompoundExpression([
+              `if (_cached`,
+              ...keyExp ? [` && _cached.key === `, keyExp] : [],
+              ` && ${context.helperString(
+                IS_MEMO_SAME
+              )}(_cached, _memo)) return _cached`
+            ]),
+            createCompoundExpression([`const _item = `, childBlock]),
+            createSimpleExpression(`_item.memo = _memo`),
+            createSimpleExpression(`return _item`)
+          ]);
+          renderExp.arguments.push(
+            loop,
+            createSimpleExpression(`_cache`),
+            createSimpleExpression(String(context.cached++))
+          );
+        } else {
+          renderExp.arguments.push(
+            createFunctionExpression(
+              createForLoopParams(forNode.parseResult),
+              childBlock,
+              true
+              /* force newline */
+            )
+          );
+        }
+      };
+    });
+  }
+);
+function processFor(node, dir, context, processCodegen) {
+  if (!dir.exp) {
+    context.onError(
+      createCompilerError(31, dir.loc)
+    );
+    return;
+  }
+  const parseResult = parseForExpression(
+    // can only be simple expression because vFor transform is applied
+    // before expression transform.
+    dir.exp,
+    context
+  );
+  if (!parseResult) {
+    context.onError(
+      createCompilerError(32, dir.loc)
+    );
+    return;
+  }
+  const { addIdentifiers, removeIdentifiers, scopes } = context;
+  const { source, value, key, index } = parseResult;
+  const forNode = {
+    type: 11,
+    loc: dir.loc,
+    source,
+    valueAlias: value,
+    keyAlias: key,
+    objectIndexAlias: index,
+    parseResult,
+    children: isTemplateNode(node) ? node.children : [node]
+  };
+  context.replaceNode(forNode);
+  scopes.vFor++;
+  const onExit = processCodegen && processCodegen(forNode);
+  return () => {
+    scopes.vFor--;
+    if (onExit)
+      onExit();
+  };
+}
+const forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/;
+const forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/;
+const stripParensRE = /^\(|\)$/g;
+function parseForExpression(input, context) {
+  const loc = input.loc;
+  const exp = input.content;
+  const inMatch = exp.match(forAliasRE);
+  if (!inMatch)
+    return;
+  const [, LHS, RHS] = inMatch;
+  const result = {
+    source: createAliasExpression(
+      loc,
+      RHS.trim(),
+      exp.indexOf(RHS, LHS.length)
+    ),
+    value: void 0,
+    key: void 0,
+    index: void 0
+  };
+  {
+    validateBrowserExpression(result.source, context);
+  }
+  let valueContent = LHS.trim().replace(stripParensRE, "").trim();
+  const trimmedOffset = LHS.indexOf(valueContent);
+  const iteratorMatch = valueContent.match(forIteratorRE);
+  if (iteratorMatch) {
+    valueContent = valueContent.replace(forIteratorRE, "").trim();
+    const keyContent = iteratorMatch[1].trim();
+    let keyOffset;
+    if (keyContent) {
+      keyOffset = exp.indexOf(keyContent, trimmedOffset + valueContent.length);
+      result.key = createAliasExpression(loc, keyContent, keyOffset);
+      {
+        validateBrowserExpression(
+          result.key,
+          context,
+          true
+        );
+      }
+    }
+    if (iteratorMatch[2]) {
+      const indexContent = iteratorMatch[2].trim();
+      if (indexContent) {
+        result.index = createAliasExpression(
+          loc,
+          indexContent,
+          exp.indexOf(
+            indexContent,
+            result.key ? keyOffset + keyContent.length : trimmedOffset + valueContent.length
+          )
+        );
+        {
+          validateBrowserExpression(
+            result.index,
+            context,
+            true
+          );
+        }
+      }
+    }
+  }
+  if (valueContent) {
+    result.value = createAliasExpression(loc, valueContent, trimmedOffset);
+    {
+      validateBrowserExpression(
+        result.value,
+        context,
+        true
+      );
+    }
+  }
+  return result;
+}
+function createAliasExpression(range, content, offset) {
+  return createSimpleExpression(
+    content,
+    false,
+    getInnerRange(range, offset, content.length)
+  );
+}
+function createForLoopParams({ value, key, index }, memoArgs = []) {
+  return createParamsList([value, key, index, ...memoArgs]);
+}
+function createParamsList(args) {
+  let i = args.length;
+  while (i--) {
+    if (args[i])
+      break;
+  }
+  return args.slice(0, i + 1).map((arg, i2) => arg || createSimpleExpression(`_`.repeat(i2 + 1), false));
+}
+
+const defaultFallback = createSimpleExpression(`undefined`, false);
+const trackSlotScopes = (node, context) => {
+  if (node.type === 1 && (node.tagType === 1 || node.tagType === 3)) {
+    const vSlot = findDir(node, "slot");
+    if (vSlot) {
+      vSlot.exp;
+      context.scopes.vSlot++;
+      return () => {
+        context.scopes.vSlot--;
+      };
+    }
+  }
+};
+const buildClientSlotFn = (props, children, loc) => createFunctionExpression(
+  props,
+  children,
+  false,
+  true,
+  children.length ? children[0].loc : loc
+);
+function buildSlots(node, context, buildSlotFn = buildClientSlotFn) {
+  context.helper(WITH_CTX);
+  const { children, loc } = node;
+  const slotsProperties = [];
+  const dynamicSlots = [];
+  let hasDynamicSlots = context.scopes.vSlot > 0 || context.scopes.vFor > 0;
+  const onComponentSlot = findDir(node, "slot", true);
+  if (onComponentSlot) {
+    const { arg, exp } = onComponentSlot;
+    if (arg && !isStaticExp(arg)) {
+      hasDynamicSlots = true;
+    }
+    slotsProperties.push(
+      createObjectProperty(
+        arg || createSimpleExpression("default", true),
+        buildSlotFn(exp, children, loc)
+      )
+    );
+  }
+  let hasTemplateSlots = false;
+  let hasNamedDefaultSlot = false;
+  const implicitDefaultChildren = [];
+  const seenSlotNames = /* @__PURE__ */ new Set();
+  let conditionalBranchIndex = 0;
+  for (let i = 0; i < children.length; i++) {
+    const slotElement = children[i];
+    let slotDir;
+    if (!isTemplateNode(slotElement) || !(slotDir = findDir(slotElement, "slot", true))) {
+      if (slotElement.type !== 3) {
+        implicitDefaultChildren.push(slotElement);
+      }
+      continue;
+    }
+    if (onComponentSlot) {
+      context.onError(
+        createCompilerError(37, slotDir.loc)
+      );
+      break;
+    }
+    hasTemplateSlots = true;
+    const { children: slotChildren, loc: slotLoc } = slotElement;
+    const {
+      arg: slotName = createSimpleExpression(`default`, true),
+      exp: slotProps,
+      loc: dirLoc
+    } = slotDir;
+    let staticSlotName;
+    if (isStaticExp(slotName)) {
+      staticSlotName = slotName ? slotName.content : `default`;
+    } else {
+      hasDynamicSlots = true;
+    }
+    const slotFunction = buildSlotFn(slotProps, slotChildren, slotLoc);
+    let vIf;
+    let vElse;
+    let vFor;
+    if (vIf = findDir(slotElement, "if")) {
+      hasDynamicSlots = true;
+      dynamicSlots.push(
+        createConditionalExpression(
+          vIf.exp,
+          buildDynamicSlot(slotName, slotFunction, conditionalBranchIndex++),
+          defaultFallback
+        )
+      );
+    } else if (vElse = findDir(
+      slotElement,
+      /^else(-if)?$/,
+      true
+      /* allowEmpty */
+    )) {
+      let j = i;
+      let prev;
+      while (j--) {
+        prev = children[j];
+        if (prev.type !== 3) {
+          break;
+        }
+      }
+      if (prev && isTemplateNode(prev) && findDir(prev, "if")) {
+        children.splice(i, 1);
+        i--;
+        let conditional = dynamicSlots[dynamicSlots.length - 1];
+        while (conditional.alternate.type === 19) {
+          conditional = conditional.alternate;
+        }
+        conditional.alternate = vElse.exp ? createConditionalExpression(
+          vElse.exp,
+          buildDynamicSlot(
+            slotName,
+            slotFunction,
+            conditionalBranchIndex++
+          ),
+          defaultFallback
+        ) : buildDynamicSlot(slotName, slotFunction, conditionalBranchIndex++);
+      } else {
+        context.onError(
+          createCompilerError(30, vElse.loc)
+        );
+      }
+    } else if (vFor = findDir(slotElement, "for")) {
+      hasDynamicSlots = true;
+      const parseResult = vFor.parseResult || parseForExpression(vFor.exp, context);
+      if (parseResult) {
+        dynamicSlots.push(
+          createCallExpression(context.helper(RENDER_LIST), [
+            parseResult.source,
+            createFunctionExpression(
+              createForLoopParams(parseResult),
+              buildDynamicSlot(slotName, slotFunction),
+              true
+              /* force newline */
+            )
+          ])
+        );
+      } else {
+        context.onError(
+          createCompilerError(32, vFor.loc)
+        );
+      }
+    } else {
+      if (staticSlotName) {
+        if (seenSlotNames.has(staticSlotName)) {
+          context.onError(
+            createCompilerError(
+              38,
+              dirLoc
+            )
+          );
+          continue;
+        }
+        seenSlotNames.add(staticSlotName);
+        if (staticSlotName === "default") {
+          hasNamedDefaultSlot = true;
+        }
+      }
+      slotsProperties.push(createObjectProperty(slotName, slotFunction));
+    }
+  }
+  if (!onComponentSlot) {
+    const buildDefaultSlotProperty = (props, children2) => {
+      const fn = buildSlotFn(props, children2, loc);
+      return createObjectProperty(`default`, fn);
+    };
+    if (!hasTemplateSlots) {
+      slotsProperties.push(buildDefaultSlotProperty(void 0, children));
+    } else if (implicitDefaultChildren.length && // #3766
+    // with whitespace: 'preserve', whitespaces between slots will end up in
+    // implicitDefaultChildren. Ignore if all implicit children are whitespaces.
+    implicitDefaultChildren.some((node2) => isNonWhitespaceContent(node2))) {
+      if (hasNamedDefaultSlot) {
+        context.onError(
+          createCompilerError(
+            39,
+            implicitDefaultChildren[0].loc
+          )
+        );
+      } else {
+        slotsProperties.push(
+          buildDefaultSlotProperty(void 0, implicitDefaultChildren)
+        );
+      }
+    }
+  }
+  const slotFlag = hasDynamicSlots ? 2 : hasForwardedSlots(node.children) ? 3 : 1;
+  let slots = createObjectExpression(
+    slotsProperties.concat(
+      createObjectProperty(
+        `_`,
+        // 2 = compiled but dynamic = can skip normalization, but must run diff
+        // 1 = compiled and static = can skip normalization AND diff as optimized
+        createSimpleExpression(
+          slotFlag + (` /* ${slotFlagsText[slotFlag]} */` ),
+          false
+        )
+      )
+    ),
+    loc
+  );
+  if (dynamicSlots.length) {
+    slots = createCallExpression(context.helper(CREATE_SLOTS), [
+      slots,
+      createArrayExpression(dynamicSlots)
+    ]);
+  }
+  return {
+    slots,
+    hasDynamicSlots
+  };
+}
+function buildDynamicSlot(name, fn, index) {
+  const props = [
+    createObjectProperty(`name`, name),
+    createObjectProperty(`fn`, fn)
+  ];
+  if (index != null) {
+    props.push(
+      createObjectProperty(`key`, createSimpleExpression(String(index), true))
+    );
+  }
+  return createObjectExpression(props);
+}
+function hasForwardedSlots(children) {
+  for (let i = 0; i < children.length; i++) {
+    const child = children[i];
+    switch (child.type) {
+      case 1:
+        if (child.tagType === 2 || hasForwardedSlots(child.children)) {
+          return true;
+        }
+        break;
+      case 9:
+        if (hasForwardedSlots(child.branches))
+          return true;
+        break;
+      case 10:
+      case 11:
+        if (hasForwardedSlots(child.children))
+          return true;
+        break;
+    }
+  }
+  return false;
+}
+function isNonWhitespaceContent(node) {
+  if (node.type !== 2 && node.type !== 12)
+    return true;
+  return node.type === 2 ? !!node.content.trim() : isNonWhitespaceContent(node.content);
+}
+
+const directiveImportMap = /* @__PURE__ */ new WeakMap();
+const transformElement = (node, context) => {
+  return function postTransformElement() {
+    node = context.currentNode;
+    if (!(node.type === 1 && (node.tagType === 0 || node.tagType === 1))) {
+      return;
+    }
+    const { tag, props } = node;
+    const isComponent = node.tagType === 1;
+    let vnodeTag = isComponent ? resolveComponentType(node, context) : `"${tag}"`;
+    const isDynamicComponent = isObject(vnodeTag) && vnodeTag.callee === RESOLVE_DYNAMIC_COMPONENT;
+    let vnodeProps;
+    let vnodeChildren;
+    let vnodePatchFlag;
+    let patchFlag = 0;
+    let vnodeDynamicProps;
+    let dynamicPropNames;
+    let vnodeDirectives;
+    let shouldUseBlock = (
+      // dynamic component may resolve to plain elements
+      isDynamicComponent || vnodeTag === TELEPORT || vnodeTag === SUSPENSE || !isComponent && // <svg> and <foreignObject> must be forced into blocks so that block
+      // updates inside get proper isSVG flag at runtime. (#639, #643)
+      // This is technically web-specific, but splitting the logic out of core
+      // leads to too much unnecessary complexity.
+      (tag === "svg" || tag === "foreignObject")
+    );
+    if (props.length > 0) {
+      const propsBuildResult = buildProps(
+        node,
+        context,
+        void 0,
+        isComponent,
+        isDynamicComponent
+      );
+      vnodeProps = propsBuildResult.props;
+      patchFlag = propsBuildResult.patchFlag;
+      dynamicPropNames = propsBuildResult.dynamicPropNames;
+      const directives = propsBuildResult.directives;
+      vnodeDirectives = directives && directives.length ? createArrayExpression(
+        directives.map((dir) => buildDirectiveArgs(dir, context))
+      ) : void 0;
+      if (propsBuildResult.shouldUseBlock) {
+        shouldUseBlock = true;
+      }
+    }
+    if (node.children.length > 0) {
+      if (vnodeTag === KEEP_ALIVE) {
+        shouldUseBlock = true;
+        patchFlag |= 1024;
+        if (node.children.length > 1) {
+          context.onError(
+            createCompilerError(46, {
+              start: node.children[0].loc.start,
+              end: node.children[node.children.length - 1].loc.end,
+              source: ""
+            })
+          );
+        }
+      }
+      const shouldBuildAsSlots = isComponent && // Teleport is not a real component and has dedicated runtime handling
+      vnodeTag !== TELEPORT && // explained above.
+      vnodeTag !== KEEP_ALIVE;
+      if (shouldBuildAsSlots) {
+        const { slots, hasDynamicSlots } = buildSlots(node, context);
+        vnodeChildren = slots;
+        if (hasDynamicSlots) {
+          patchFlag |= 1024;
+        }
+      } else if (node.children.length === 1 && vnodeTag !== TELEPORT) {
+        const child = node.children[0];
+        const type = child.type;
+        const hasDynamicTextChild = type === 5 || type === 8;
+        if (hasDynamicTextChild && getConstantType(child, context) === 0) {
+          patchFlag |= 1;
+        }
+        if (hasDynamicTextChild || type === 2) {
+          vnodeChildren = child;
+        } else {
+          vnodeChildren = node.children;
+        }
+      } else {
+        vnodeChildren = node.children;
+      }
+    }
+    if (patchFlag !== 0) {
+      {
+        if (patchFlag < 0) {
+          vnodePatchFlag = patchFlag + ` /* ${PatchFlagNames[patchFlag]} */`;
+        } else {
+          const flagNames = Object.keys(PatchFlagNames).map(Number).filter((n) => n > 0 && patchFlag & n).map((n) => PatchFlagNames[n]).join(`, `);
+          vnodePatchFlag = patchFlag + ` /* ${flagNames} */`;
+        }
+      }
+      if (dynamicPropNames && dynamicPropNames.length) {
+        vnodeDynamicProps = stringifyDynamicPropNames(dynamicPropNames);
+      }
+    }
+    node.codegenNode = createVNodeCall(
+      context,
+      vnodeTag,
+      vnodeProps,
+      vnodeChildren,
+      vnodePatchFlag,
+      vnodeDynamicProps,
+      vnodeDirectives,
+      !!shouldUseBlock,
+      false,
+      isComponent,
+      node.loc
+    );
+  };
+};
+function resolveComponentType(node, context, ssr = false) {
+  let { tag } = node;
+  const isExplicitDynamic = isComponentTag(tag);
+  const isProp = findProp(node, "is");
+  if (isProp) {
+    if (isExplicitDynamic || false) {
+      const exp = isProp.type === 6 ? isProp.value && createSimpleExpression(isProp.value.content, true) : isProp.exp;
+      if (exp) {
+        return createCallExpression(context.helper(RESOLVE_DYNAMIC_COMPONENT), [
+          exp
+        ]);
+      }
+    } else if (isProp.type === 6 && isProp.value.content.startsWith("vue:")) {
+      tag = isProp.value.content.slice(4);
+    }
+  }
+  const isDir = !isExplicitDynamic && findDir(node, "is");
+  if (isDir && isDir.exp) {
+    {
+      context.onWarn(
+        createCompilerError(52, isDir.loc)
+      );
+    }
+    return createCallExpression(context.helper(RESOLVE_DYNAMIC_COMPONENT), [
+      isDir.exp
+    ]);
+  }
+  const builtIn = isCoreComponent(tag) || context.isBuiltInComponent(tag);
+  if (builtIn) {
+    if (!ssr)
+      context.helper(builtIn);
+    return builtIn;
+  }
+  context.helper(RESOLVE_COMPONENT);
+  context.components.add(tag);
+  return toValidAssetId(tag, `component`);
+}
+function buildProps(node, context, props = node.props, isComponent, isDynamicComponent, ssr = false) {
+  const { tag, loc: elementLoc, children } = node;
+  let properties = [];
+  const mergeArgs = [];
+  const runtimeDirectives = [];
+  const hasChildren = children.length > 0;
+  let shouldUseBlock = false;
+  let patchFlag = 0;
+  let hasRef = false;
+  let hasClassBinding = false;
+  let hasStyleBinding = false;
+  let hasHydrationEventBinding = false;
+  let hasDynamicKeys = false;
+  let hasVnodeHook = false;
+  const dynamicPropNames = [];
+  const pushMergeArg = (arg) => {
+    if (properties.length) {
+      mergeArgs.push(
+        createObjectExpression(dedupeProperties(properties), elementLoc)
+      );
+      properties = [];
+    }
+    if (arg)
+      mergeArgs.push(arg);
+  };
+  const analyzePatchFlag = ({ key, value }) => {
+    if (isStaticExp(key)) {
+      const name = key.content;
+      const isEventHandler = isOn(name);
+      if (isEventHandler && (!isComponent || isDynamicComponent) && // omit the flag for click handlers because hydration gives click
+      // dedicated fast path.
+      name.toLowerCase() !== "onclick" && // omit v-model handlers
+      name !== "onUpdate:modelValue" && // omit onVnodeXXX hooks
+      !isReservedProp(name)) {
+        hasHydrationEventBinding = true;
+      }
+      if (isEventHandler && isReservedProp(name)) {
+        hasVnodeHook = true;
+      }
+      if (value.type === 20 || (value.type === 4 || value.type === 8) && getConstantType(value, context) > 0) {
+        return;
+      }
+      if (name === "ref") {
+        hasRef = true;
+      } else if (name === "class") {
+        hasClassBinding = true;
+      } else if (name === "style") {
+        hasStyleBinding = true;
+      } else if (name !== "key" && !dynamicPropNames.includes(name)) {
+        dynamicPropNames.push(name);
+      }
+      if (isComponent && (name === "class" || name === "style") && !dynamicPropNames.includes(name)) {
+        dynamicPropNames.push(name);
+      }
+    } else {
+      hasDynamicKeys = true;
+    }
+  };
+  for (let i = 0; i < props.length; i++) {
+    const prop = props[i];
+    if (prop.type === 6) {
+      const { loc, name, value } = prop;
+      let isStatic = true;
+      if (name === "ref") {
+        hasRef = true;
+        if (context.scopes.vFor > 0) {
+          properties.push(
+            createObjectProperty(
+              createSimpleExpression("ref_for", true),
+              createSimpleExpression("true")
+            )
+          );
+        }
+      }
+      if (name === "is" && (isComponentTag(tag) || value && value.content.startsWith("vue:") || false)) {
+        continue;
+      }
+      properties.push(
+        createObjectProperty(
+          createSimpleExpression(
+            name,
+            true,
+            getInnerRange(loc, 0, name.length)
+          ),
+          createSimpleExpression(
+            value ? value.content : "",
+            isStatic,
+            value ? value.loc : loc
+          )
+        )
+      );
+    } else {
+      const { name, arg, exp, loc } = prop;
+      const isVBind = name === "bind";
+      const isVOn = name === "on";
+      if (name === "slot") {
+        if (!isComponent) {
+          context.onError(
+            createCompilerError(40, loc)
+          );
+        }
+        continue;
+      }
+      if (name === "once" || name === "memo") {
+        continue;
+      }
+      if (name === "is" || isVBind && isStaticArgOf(arg, "is") && (isComponentTag(tag) || false)) {
+        continue;
+      }
+      if (isVOn && ssr) {
+        continue;
+      }
+      if (
+        // #938: elements with dynamic keys should be forced into blocks
+        isVBind && isStaticArgOf(arg, "key") || // inline before-update hooks need to force block so that it is invoked
+        // before children
+        isVOn && hasChildren && isStaticArgOf(arg, "vue:before-update")
+      ) {
+        shouldUseBlock = true;
+      }
+      if (isVBind && isStaticArgOf(arg, "ref") && context.scopes.vFor > 0) {
+        properties.push(
+          createObjectProperty(
+            createSimpleExpression("ref_for", true),
+            createSimpleExpression("true")
+          )
+        );
+      }
+      if (!arg && (isVBind || isVOn)) {
+        hasDynamicKeys = true;
+        if (exp) {
+          if (isVBind) {
+            pushMergeArg();
+            mergeArgs.push(exp);
+          } else {
+            pushMergeArg({
+              type: 14,
+              loc,
+              callee: context.helper(TO_HANDLERS),
+              arguments: isComponent ? [exp] : [exp, `true`]
+            });
+          }
+        } else {
+          context.onError(
+            createCompilerError(
+              isVBind ? 34 : 35,
+              loc
+            )
+          );
+        }
+        continue;
+      }
+      const directiveTransform = context.directiveTransforms[name];
+      if (directiveTransform) {
+        const { props: props2, needRuntime } = directiveTransform(prop, node, context);
+        !ssr && props2.forEach(analyzePatchFlag);
+        if (isVOn && arg && !isStaticExp(arg)) {
+          pushMergeArg(createObjectExpression(props2, elementLoc));
+        } else {
+          properties.push(...props2);
+        }
+        if (needRuntime) {
+          runtimeDirectives.push(prop);
+          if (isSymbol(needRuntime)) {
+            directiveImportMap.set(prop, needRuntime);
+          }
+        }
+      } else if (!isBuiltInDirective(name)) {
+        runtimeDirectives.push(prop);
+        if (hasChildren) {
+          shouldUseBlock = true;
+        }
+      }
+    }
+  }
+  let propsExpression = void 0;
+  if (mergeArgs.length) {
+    pushMergeArg();
+    if (mergeArgs.length > 1) {
+      propsExpression = createCallExpression(
+        context.helper(MERGE_PROPS),
+        mergeArgs,
+        elementLoc
+      );
+    } else {
+      propsExpression = mergeArgs[0];
+    }
+  } else if (properties.length) {
+    propsExpression = createObjectExpression(
+      dedupeProperties(properties),
+      elementLoc
+    );
+  }
+  if (hasDynamicKeys) {
+    patchFlag |= 16;
+  } else {
+    if (hasClassBinding && !isComponent) {
+      patchFlag |= 2;
+    }
+    if (hasStyleBinding && !isComponent) {
+      patchFlag |= 4;
+    }
+    if (dynamicPropNames.length) {
+      patchFlag |= 8;
+    }
+    if (hasHydrationEventBinding) {
+      patchFlag |= 32;
+    }
+  }
+  if (!shouldUseBlock && (patchFlag === 0 || patchFlag === 32) && (hasRef || hasVnodeHook || runtimeDirectives.length > 0)) {
+    patchFlag |= 512;
+  }
+  if (!context.inSSR && propsExpression) {
+    switch (propsExpression.type) {
+      case 15:
+        let classKeyIndex = -1;
+        let styleKeyIndex = -1;
+        let hasDynamicKey = false;
+        for (let i = 0; i < propsExpression.properties.length; i++) {
+          const key = propsExpression.properties[i].key;
+          if (isStaticExp(key)) {
+            if (key.content === "class") {
+              classKeyIndex = i;
+            } else if (key.content === "style") {
+              styleKeyIndex = i;
+            }
+          } else if (!key.isHandlerKey) {
+            hasDynamicKey = true;
+          }
+        }
+        const classProp = propsExpression.properties[classKeyIndex];
+        const styleProp = propsExpression.properties[styleKeyIndex];
+        if (!hasDynamicKey) {
+          if (classProp && !isStaticExp(classProp.value)) {
+            classProp.value = createCallExpression(
+              context.helper(NORMALIZE_CLASS),
+              [classProp.value]
+            );
+          }
+          if (styleProp && // the static style is compiled into an object,
+          // so use `hasStyleBinding` to ensure that it is a dynamic style binding
+          (hasStyleBinding || styleProp.value.type === 4 && styleProp.value.content.trim()[0] === `[` || // v-bind:style and style both exist,
+          // v-bind:style with static literal object
+          styleProp.value.type === 17)) {
+            styleProp.value = createCallExpression(
+              context.helper(NORMALIZE_STYLE),
+              [styleProp.value]
+            );
+          }
+        } else {
+          propsExpression = createCallExpression(
+            context.helper(NORMALIZE_PROPS),
+            [propsExpression]
+          );
+        }
+        break;
+      case 14:
+        break;
+      default:
+        propsExpression = createCallExpression(
+          context.helper(NORMALIZE_PROPS),
+          [
+            createCallExpression(context.helper(GUARD_REACTIVE_PROPS), [
+              propsExpression
+            ])
+          ]
+        );
+        break;
+    }
+  }
+  return {
+    props: propsExpression,
+    directives: runtimeDirectives,
+    patchFlag,
+    dynamicPropNames,
+    shouldUseBlock
+  };
+}
+function dedupeProperties(properties) {
+  const knownProps = /* @__PURE__ */ new Map();
+  const deduped = [];
+  for (let i = 0; i < properties.length; i++) {
+    const prop = properties[i];
+    if (prop.key.type === 8 || !prop.key.isStatic) {
+      deduped.push(prop);
+      continue;
+    }
+    const name = prop.key.content;
+    const existing = knownProps.get(name);
+    if (existing) {
+      if (name === "style" || name === "class" || isOn(name)) {
+        mergeAsArray(existing, prop);
+      }
+    } else {
+      knownProps.set(name, prop);
+      deduped.push(prop);
+    }
+  }
+  return deduped;
+}
+function mergeAsArray(existing, incoming) {
+  if (existing.value.type === 17) {
+    existing.value.elements.push(incoming.value);
+  } else {
+    existing.value = createArrayExpression(
+      [existing.value, incoming.value],
+      existing.loc
+    );
+  }
+}
+function buildDirectiveArgs(dir, context) {
+  const dirArgs = [];
+  const runtime = directiveImportMap.get(dir);
+  if (runtime) {
+    dirArgs.push(context.helperString(runtime));
+  } else {
+    {
+      context.helper(RESOLVE_DIRECTIVE);
+      context.directives.add(dir.name);
+      dirArgs.push(toValidAssetId(dir.name, `directive`));
+    }
+  }
+  const { loc } = dir;
+  if (dir.exp)
+    dirArgs.push(dir.exp);
+  if (dir.arg) {
+    if (!dir.exp) {
+      dirArgs.push(`void 0`);
+    }
+    dirArgs.push(dir.arg);
+  }
+  if (Object.keys(dir.modifiers).length) {
+    if (!dir.arg) {
+      if (!dir.exp) {
+        dirArgs.push(`void 0`);
+      }
+      dirArgs.push(`void 0`);
+    }
+    const trueExpression = createSimpleExpression(`true`, false, loc);
+    dirArgs.push(
+      createObjectExpression(
+        dir.modifiers.map(
+          (modifier) => createObjectProperty(modifier, trueExpression)
+        ),
+        loc
+      )
+    );
+  }
+  return createArrayExpression(dirArgs, dir.loc);
+}
+function stringifyDynamicPropNames(props) {
+  let propsNamesString = `[`;
+  for (let i = 0, l = props.length; i < l; i++) {
+    propsNamesString += JSON.stringify(props[i]);
+    if (i < l - 1)
+      propsNamesString += ", ";
+  }
+  return propsNamesString + `]`;
+}
+function isComponentTag(tag) {
+  return tag === "component" || tag === "Component";
+}
+
+const transformSlotOutlet = (node, context) => {
+  if (isSlotOutlet(node)) {
+    const { children, loc } = node;
+    const { slotName, slotProps } = processSlotOutlet(node, context);
+    const slotArgs = [
+      context.prefixIdentifiers ? `_ctx.$slots` : `$slots`,
+      slotName,
+      "{}",
+      "undefined",
+      "true"
+    ];
+    let expectedLen = 2;
+    if (slotProps) {
+      slotArgs[2] = slotProps;
+      expectedLen = 3;
+    }
+    if (children.length) {
+      slotArgs[3] = createFunctionExpression([], children, false, false, loc);
+      expectedLen = 4;
+    }
+    if (context.scopeId && !context.slotted) {
+      expectedLen = 5;
+    }
+    slotArgs.splice(expectedLen);
+    node.codegenNode = createCallExpression(
+      context.helper(RENDER_SLOT),
+      slotArgs,
+      loc
+    );
+  }
+};
+function processSlotOutlet(node, context) {
+  let slotName = `"default"`;
+  let slotProps = void 0;
+  const nonNameProps = [];
+  for (let i = 0; i < node.props.length; i++) {
+    const p = node.props[i];
+    if (p.type === 6) {
+      if (p.value) {
+        if (p.name === "name") {
+          slotName = JSON.stringify(p.value.content);
+        } else {
+          p.name = camelize(p.name);
+          nonNameProps.push(p);
+        }
+      }
+    } else {
+      if (p.name === "bind" && isStaticArgOf(p.arg, "name")) {
+        if (p.exp)
+          slotName = p.exp;
+      } else {
+        if (p.name === "bind" && p.arg && isStaticExp(p.arg)) {
+          p.arg.content = camelize(p.arg.content);
+        }
+        nonNameProps.push(p);
+      }
+    }
+  }
+  if (nonNameProps.length > 0) {
+    const { props, directives } = buildProps(
+      node,
+      context,
+      nonNameProps,
+      false,
+      false
+    );
+    slotProps = props;
+    if (directives.length) {
+      context.onError(
+        createCompilerError(
+          36,
+          directives[0].loc
+        )
+      );
+    }
+  }
+  return {
+    slotName,
+    slotProps
+  };
+}
+
+const fnExpRE = /^\s*([\w$_]+|(async\s*)?\([^)]*?\))\s*(:[^=]+)?=>|^\s*(async\s+)?function(?:\s+[\w$]+)?\s*\(/;
+const transformOn$1 = (dir, node, context, augmentor) => {
+  const { loc, modifiers, arg } = dir;
+  if (!dir.exp && !modifiers.length) {
+    context.onError(createCompilerError(35, loc));
+  }
+  let eventName;
+  if (arg.type === 4) {
+    if (arg.isStatic) {
+      let rawName = arg.content;
+      if (rawName.startsWith("vnode")) {
+        context.onWarn(
+          createCompilerError(51, arg.loc)
+        );
+      }
+      if (rawName.startsWith("vue:")) {
+        rawName = `vnode-${rawName.slice(4)}`;
+      }
+      const eventString = node.tagType !== 0 || rawName.startsWith("vnode") || !/[A-Z]/.test(rawName) ? (
+        // for non-element and vnode lifecycle event listeners, auto convert
+        // it to camelCase. See issue #2249
+        toHandlerKey(camelize(rawName))
+      ) : (
+        // preserve case for plain element listeners that have uppercase
+        // letters, as these may be custom elements' custom events
+        `on:${rawName}`
+      );
+      eventName = createSimpleExpression(eventString, true, arg.loc);
+    } else {
+      eventName = createCompoundExpression([
+        `${context.helperString(TO_HANDLER_KEY)}(`,
+        arg,
+        `)`
+      ]);
+    }
+  } else {
+    eventName = arg;
+    eventName.children.unshift(`${context.helperString(TO_HANDLER_KEY)}(`);
+    eventName.children.push(`)`);
+  }
+  let exp = dir.exp;
+  if (exp && !exp.content.trim()) {
+    exp = void 0;
+  }
+  let shouldCache = context.cacheHandlers && !exp && !context.inVOnce;
+  if (exp) {
+    const isMemberExp = isMemberExpression(exp.content);
+    const isInlineStatement = !(isMemberExp || fnExpRE.test(exp.content));
+    const hasMultipleStatements = exp.content.includes(`;`);
+    {
+      validateBrowserExpression(
+        exp,
+        context,
+        false,
+        hasMultipleStatements
+      );
+    }
+    if (isInlineStatement || shouldCache && isMemberExp) {
+      exp = createCompoundExpression([
+        `${isInlineStatement ? `$event` : `${``}(...args)`} => ${hasMultipleStatements ? `{` : `(`}`,
+        exp,
+        hasMultipleStatements ? `}` : `)`
+      ]);
+    }
+  }
+  let ret = {
+    props: [
+      createObjectProperty(
+        eventName,
+        exp || createSimpleExpression(`() => {}`, false, loc)
+      )
+    ]
+  };
+  if (augmentor) {
+    ret = augmentor(ret);
+  }
+  if (shouldCache) {
+    ret.props[0].value = context.cache(ret.props[0].value);
+  }
+  ret.props.forEach((p) => p.key.isHandlerKey = true);
+  return ret;
+};
+
+const transformBind = (dir, _node, context) => {
+  const { exp, modifiers, loc } = dir;
+  const arg = dir.arg;
+  if (arg.type !== 4) {
+    arg.children.unshift(`(`);
+    arg.children.push(`) || ""`);
+  } else if (!arg.isStatic) {
+    arg.content = `${arg.content} || ""`;
+  }
+  if (modifiers.includes("camel")) {
+    if (arg.type === 4) {
+      if (arg.isStatic) {
+        arg.content = camelize(arg.content);
+      } else {
+        arg.content = `${context.helperString(CAMELIZE)}(${arg.content})`;
+      }
+    } else {
+      arg.children.unshift(`${context.helperString(CAMELIZE)}(`);
+      arg.children.push(`)`);
+    }
+  }
+  if (!context.inSSR) {
+    if (modifiers.includes("prop")) {
+      injectPrefix(arg, ".");
+    }
+    if (modifiers.includes("attr")) {
+      injectPrefix(arg, "^");
+    }
+  }
+  if (!exp || exp.type === 4 && !exp.content.trim()) {
+    context.onError(createCompilerError(34, loc));
+    return {
+      props: [createObjectProperty(arg, createSimpleExpression("", true, loc))]
+    };
+  }
+  return {
+    props: [createObjectProperty(arg, exp)]
+  };
+};
+const injectPrefix = (arg, prefix) => {
+  if (arg.type === 4) {
+    if (arg.isStatic) {
+      arg.content = prefix + arg.content;
+    } else {
+      arg.content = `\`${prefix}\${${arg.content}}\``;
+    }
+  } else {
+    arg.children.unshift(`'${prefix}' + (`);
+    arg.children.push(`)`);
+  }
+};
+
+const transformText = (node, context) => {
+  if (node.type === 0 || node.type === 1 || node.type === 11 || node.type === 10) {
+    return () => {
+      const children = node.children;
+      let currentContainer = void 0;
+      let hasText = false;
+      for (let i = 0; i < children.length; i++) {
+        const child = children[i];
+        if (isText$1(child)) {
+          hasText = true;
+          for (let j = i + 1; j < children.length; j++) {
+            const next = children[j];
+            if (isText$1(next)) {
+              if (!currentContainer) {
+                currentContainer = children[i] = createCompoundExpression(
+                  [child],
+                  child.loc
+                );
+              }
+              currentContainer.children.push(` + `, next);
+              children.splice(j, 1);
+              j--;
+            } else {
+              currentContainer = void 0;
+              break;
+            }
+          }
+        }
+      }
+      if (!hasText || // if this is a plain element with a single text child, leave it
+      // as-is since the runtime has dedicated fast path for this by directly
+      // setting textContent of the element.
+      // for component root it's always normalized anyway.
+      children.length === 1 && (node.type === 0 || node.type === 1 && node.tagType === 0 && // #3756
+      // custom directives can potentially add DOM elements arbitrarily,
+      // we need to avoid setting textContent of the element at runtime
+      // to avoid accidentally overwriting the DOM elements added
+      // by the user through custom directives.
+      !node.props.find(
+        (p) => p.type === 7 && !context.directiveTransforms[p.name]
+      ) && // in compat mode, <template> tags with no special directives
+      // will be rendered as a fragment so its children must be
+      // converted into vnodes.
+      true)) {
+        return;
+      }
+      for (let i = 0; i < children.length; i++) {
+        const child = children[i];
+        if (isText$1(child) || child.type === 8) {
+          const callArgs = [];
+          if (child.type !== 2 || child.content !== " ") {
+            callArgs.push(child);
+          }
+          if (!context.ssr && getConstantType(child, context) === 0) {
+            callArgs.push(
+              1 + (` /* ${PatchFlagNames[1]} */` )
+            );
+          }
+          children[i] = {
+            type: 12,
+            content: child,
+            loc: child.loc,
+            codegenNode: createCallExpression(
+              context.helper(CREATE_TEXT),
+              callArgs
+            )
+          };
+        }
+      }
+    };
+  }
+};
+
+const seen$1 = /* @__PURE__ */ new WeakSet();
+const transformOnce = (node, context) => {
+  if (node.type === 1 && findDir(node, "once", true)) {
+    if (seen$1.has(node) || context.inVOnce || context.inSSR) {
+      return;
+    }
+    seen$1.add(node);
+    context.inVOnce = true;
+    context.helper(SET_BLOCK_TRACKING);
+    return () => {
+      context.inVOnce = false;
+      const cur = context.currentNode;
+      if (cur.codegenNode) {
+        cur.codegenNode = context.cache(
+          cur.codegenNode,
+          true
+          /* isVNode */
+        );
+      }
+    };
+  }
+};
+
+const transformModel$1 = (dir, node, context) => {
+  const { exp, arg } = dir;
+  if (!exp) {
+    context.onError(
+      createCompilerError(41, dir.loc)
+    );
+    return createTransformProps();
+  }
+  const rawExp = exp.loc.source;
+  const expString = exp.type === 4 ? exp.content : rawExp;
+  const bindingType = context.bindingMetadata[rawExp];
+  if (bindingType === "props" || bindingType === "props-aliased") {
+    context.onError(createCompilerError(44, exp.loc));
+    return createTransformProps();
+  }
+  const maybeRef = false;
+  if (!expString.trim() || !isMemberExpression(expString) && !maybeRef) {
+    context.onError(
+      createCompilerError(42, exp.loc)
+    );
+    return createTransformProps();
+  }
+  const propName = arg ? arg : createSimpleExpression("modelValue", true);
+  const eventName = arg ? isStaticExp(arg) ? `onUpdate:${camelize(arg.content)}` : createCompoundExpression(['"onUpdate:" + ', arg]) : `onUpdate:modelValue`;
+  let assignmentExp;
+  const eventArg = context.isTS ? `($event: any)` : `$event`;
+  {
+    assignmentExp = createCompoundExpression([
+      `${eventArg} => ((`,
+      exp,
+      `) = $event)`
+    ]);
+  }
+  const props = [
+    // modelValue: foo
+    createObjectProperty(propName, dir.exp),
+    // "onUpdate:modelValue": $event => (foo = $event)
+    createObjectProperty(eventName, assignmentExp)
+  ];
+  if (dir.modifiers.length && node.tagType === 1) {
+    const modifiers = dir.modifiers.map((m) => (isSimpleIdentifier(m) ? m : JSON.stringify(m)) + `: true`).join(`, `);
+    const modifiersKey = arg ? isStaticExp(arg) ? `${arg.content}Modifiers` : createCompoundExpression([arg, ' + "Modifiers"']) : `modelModifiers`;
+    props.push(
+      createObjectProperty(
+        modifiersKey,
+        createSimpleExpression(
+          `{ ${modifiers} }`,
+          false,
+          dir.loc,
+          2
+        )
+      )
+    );
+  }
+  return createTransformProps(props);
+};
+function createTransformProps(props = []) {
+  return { props };
+}
+
+const seen = /* @__PURE__ */ new WeakSet();
+const transformMemo = (node, context) => {
+  if (node.type === 1) {
+    const dir = findDir(node, "memo");
+    if (!dir || seen.has(node)) {
+      return;
+    }
+    seen.add(node);
+    return () => {
+      const codegenNode = node.codegenNode || context.currentNode.codegenNode;
+      if (codegenNode && codegenNode.type === 13) {
+        if (node.tagType !== 1) {
+          convertToBlock(codegenNode, context);
+        }
+        node.codegenNode = createCallExpression(context.helper(WITH_MEMO), [
+          dir.exp,
+          createFunctionExpression(void 0, codegenNode),
+          `_cache`,
+          String(context.cached++)
+        ]);
+      }
+    };
+  }
+};
+
+function getBaseTransformPreset(prefixIdentifiers) {
+  return [
+    [
+      transformOnce,
+      transformIf,
+      transformMemo,
+      transformFor,
+      ...[],
+      ...[transformExpression] ,
+      transformSlotOutlet,
+      transformElement,
+      trackSlotScopes,
+      transformText
+    ],
+    {
+      on: transformOn$1,
+      bind: transformBind,
+      model: transformModel$1
+    }
+  ];
+}
+function baseCompile(template, options = {}) {
+  const onError = options.onError || defaultOnError;
+  const isModuleMode = options.mode === "module";
+  {
+    if (options.prefixIdentifiers === true) {
+      onError(createCompilerError(47));
+    } else if (isModuleMode) {
+      onError(createCompilerError(48));
+    }
+  }
+  const prefixIdentifiers = false;
+  if (options.cacheHandlers) {
+    onError(createCompilerError(49));
+  }
+  if (options.scopeId && !isModuleMode) {
+    onError(createCompilerError(50));
+  }
+  const ast = isString(template) ? baseParse(template, options) : template;
+  const [nodeTransforms, directiveTransforms] = getBaseTransformPreset();
+  transform(
+    ast,
+    extend({}, options, {
+      prefixIdentifiers,
+      nodeTransforms: [
+        ...nodeTransforms,
+        ...options.nodeTransforms || []
+        // user transforms
+      ],
+      directiveTransforms: extend(
+        {},
+        directiveTransforms,
+        options.directiveTransforms || {}
+        // user transforms
+      )
+    })
+  );
+  return generate(
+    ast,
+    extend({}, options, {
+      prefixIdentifiers
+    })
+  );
+}
+
+const noopDirectiveTransform = () => ({ props: [] });
+
+const V_MODEL_RADIO = Symbol(`vModelRadio` );
+const V_MODEL_CHECKBOX = Symbol(`vModelCheckbox` );
+const V_MODEL_TEXT = Symbol(`vModelText` );
+const V_MODEL_SELECT = Symbol(`vModelSelect` );
+const V_MODEL_DYNAMIC = Symbol(`vModelDynamic` );
+const V_ON_WITH_MODIFIERS = Symbol(`vOnModifiersGuard` );
+const V_ON_WITH_KEYS = Symbol(`vOnKeysGuard` );
+const V_SHOW = Symbol(`vShow` );
+const TRANSITION = Symbol(`Transition` );
+const TRANSITION_GROUP = Symbol(`TransitionGroup` );
+registerRuntimeHelpers({
+  [V_MODEL_RADIO]: `vModelRadio`,
+  [V_MODEL_CHECKBOX]: `vModelCheckbox`,
+  [V_MODEL_TEXT]: `vModelText`,
+  [V_MODEL_SELECT]: `vModelSelect`,
+  [V_MODEL_DYNAMIC]: `vModelDynamic`,
+  [V_ON_WITH_MODIFIERS]: `withModifiers`,
+  [V_ON_WITH_KEYS]: `withKeys`,
+  [V_SHOW]: `vShow`,
+  [TRANSITION]: `Transition`,
+  [TRANSITION_GROUP]: `TransitionGroup`
+});
+
+let decoder;
+function decodeHtmlBrowser(raw, asAttr = false) {
+  if (!decoder) {
+    decoder = document.createElement("div");
+  }
+  if (asAttr) {
+    decoder.innerHTML = `<div foo="${raw.replace(/"/g, "&quot;")}">`;
+    return decoder.children[0].getAttribute("foo");
+  } else {
+    decoder.innerHTML = raw;
+    return decoder.textContent;
+  }
+}
+
+const isRawTextContainer = /* @__PURE__ */ makeMap(
+  "style,iframe,script,noscript",
+  true
+);
+const parserOptions = {
+  isVoidTag,
+  isNativeTag: (tag) => isHTMLTag(tag) || isSVGTag(tag),
+  isPreTag: (tag) => tag === "pre",
+  decodeEntities: decodeHtmlBrowser ,
+  isBuiltInComponent: (tag) => {
+    if (isBuiltInType(tag, `Transition`)) {
+      return TRANSITION;
+    } else if (isBuiltInType(tag, `TransitionGroup`)) {
+      return TRANSITION_GROUP;
+    }
+  },
+  // https://html.spec.whatwg.org/multipage/parsing.html#tree-construction-dispatcher
+  getNamespace(tag, parent) {
+    let ns = parent ? parent.ns : 0;
+    if (parent && ns === 2) {
+      if (parent.tag === "annotation-xml") {
+        if (tag === "svg") {
+          return 1;
+        }
+        if (parent.props.some(
+          (a) => a.type === 6 && a.name === "encoding" && a.value != null && (a.value.content === "text/html" || a.value.content === "application/xhtml+xml")
+        )) {
+          ns = 0;
+        }
+      } else if (/^m(?:[ions]|text)$/.test(parent.tag) && tag !== "mglyph" && tag !== "malignmark") {
+        ns = 0;
+      }
+    } else if (parent && ns === 1) {
+      if (parent.tag === "foreignObject" || parent.tag === "desc" || parent.tag === "title") {
+        ns = 0;
+      }
+    }
+    if (ns === 0) {
+      if (tag === "svg") {
+        return 1;
+      }
+      if (tag === "math") {
+        return 2;
+      }
+    }
+    return ns;
+  },
+  // https://html.spec.whatwg.org/multipage/parsing.html#parsing-html-fragments
+  getTextMode({ tag, ns }) {
+    if (ns === 0) {
+      if (tag === "textarea" || tag === "title") {
+        return 1;
+      }
+      if (isRawTextContainer(tag)) {
+        return 2;
+      }
+    }
+    return 0;
+  }
+};
+
+const transformStyle = (node) => {
+  if (node.type === 1) {
+    node.props.forEach((p, i) => {
+      if (p.type === 6 && p.name === "style" && p.value) {
+        node.props[i] = {
+          type: 7,
+          name: `bind`,
+          arg: createSimpleExpression(`style`, true, p.loc),
+          exp: parseInlineCSS(p.value.content, p.loc),
+          modifiers: [],
+          loc: p.loc
+        };
+      }
+    });
+  }
+};
+const parseInlineCSS = (cssText, loc) => {
+  const normalized = parseStringStyle(cssText);
+  return createSimpleExpression(
+    JSON.stringify(normalized),
+    false,
+    loc,
+    3
+  );
+};
+
+function createDOMCompilerError(code, loc) {
+  return createCompilerError(
+    code,
+    loc,
+    DOMErrorMessages 
+  );
+}
+const DOMErrorMessages = {
+  [53]: `v-html is missing expression.`,
+  [54]: `v-html will override element children.`,
+  [55]: `v-text is missing expression.`,
+  [56]: `v-text will override element children.`,
+  [57]: `v-model can only be used on <input>, <textarea> and <select> elements.`,
+  [58]: `v-model argument is not supported on plain elements.`,
+  [59]: `v-model cannot be used on file inputs since they are read-only. Use a v-on:change listener instead.`,
+  [60]: `Unnecessary value binding used alongside v-model. It will interfere with v-model's behavior.`,
+  [61]: `v-show is missing expression.`,
+  [62]: `<Transition> expects exactly one child element or component.`,
+  [63]: `Tags with side effect (<script> and <style>) are ignored in client component templates.`
+};
+
+const transformVHtml = (dir, node, context) => {
+  const { exp, loc } = dir;
+  if (!exp) {
+    context.onError(
+      createDOMCompilerError(53, loc)
+    );
+  }
+  if (node.children.length) {
+    context.onError(
+      createDOMCompilerError(54, loc)
+    );
+    node.children.length = 0;
+  }
+  return {
+    props: [
+      createObjectProperty(
+        createSimpleExpression(`innerHTML`, true, loc),
+        exp || createSimpleExpression("", true)
+      )
+    ]
+  };
+};
+
+const transformVText = (dir, node, context) => {
+  const { exp, loc } = dir;
+  if (!exp) {
+    context.onError(
+      createDOMCompilerError(55, loc)
+    );
+  }
+  if (node.children.length) {
+    context.onError(
+      createDOMCompilerError(56, loc)
+    );
+    node.children.length = 0;
+  }
+  return {
+    props: [
+      createObjectProperty(
+        createSimpleExpression(`textContent`, true),
+        exp ? getConstantType(exp, context) > 0 ? exp : createCallExpression(
+          context.helperString(TO_DISPLAY_STRING),
+          [exp],
+          loc
+        ) : createSimpleExpression("", true)
+      )
+    ]
+  };
+};
+
+const transformModel = (dir, node, context) => {
+  const baseResult = transformModel$1(dir, node, context);
+  if (!baseResult.props.length || node.tagType === 1) {
+    return baseResult;
+  }
+  if (dir.arg) {
+    context.onError(
+      createDOMCompilerError(
+        58,
+        dir.arg.loc
+      )
+    );
+  }
+  function checkDuplicatedValue() {
+    const value = findProp(node, "value");
+    if (value) {
+      context.onError(
+        createDOMCompilerError(
+          60,
+          value.loc
+        )
+      );
+    }
+  }
+  const { tag } = node;
+  const isCustomElement = context.isCustomElement(tag);
+  if (tag === "input" || tag === "textarea" || tag === "select" || isCustomElement) {
+    let directiveToUse = V_MODEL_TEXT;
+    let isInvalidType = false;
+    if (tag === "input" || isCustomElement) {
+      const type = findProp(node, `type`);
+      if (type) {
+        if (type.type === 7) {
+          directiveToUse = V_MODEL_DYNAMIC;
+        } else if (type.value) {
+          switch (type.value.content) {
+            case "radio":
+              directiveToUse = V_MODEL_RADIO;
+              break;
+            case "checkbox":
+              directiveToUse = V_MODEL_CHECKBOX;
+              break;
+            case "file":
+              isInvalidType = true;
+              context.onError(
+                createDOMCompilerError(
+                  59,
+                  dir.loc
+                )
+              );
+              break;
+            default:
+              checkDuplicatedValue();
+              break;
+          }
+        }
+      } else if (hasDynamicKeyVBind(node)) {
+        directiveToUse = V_MODEL_DYNAMIC;
+      } else {
+        checkDuplicatedValue();
+      }
+    } else if (tag === "select") {
+      directiveToUse = V_MODEL_SELECT;
+    } else {
+      checkDuplicatedValue();
+    }
+    if (!isInvalidType) {
+      baseResult.needRuntime = context.helper(directiveToUse);
+    }
+  } else {
+    context.onError(
+      createDOMCompilerError(
+        57,
+        dir.loc
+      )
+    );
+  }
+  baseResult.props = baseResult.props.filter(
+    (p) => !(p.key.type === 4 && p.key.content === "modelValue")
+  );
+  return baseResult;
+};
+
+const isEventOptionModifier = /* @__PURE__ */ makeMap(`passive,once,capture`);
+const isNonKeyModifier = /* @__PURE__ */ makeMap(
+  // event propagation management
+  `stop,prevent,self,ctrl,shift,alt,meta,exact,middle`
+);
+const maybeKeyModifier = /* @__PURE__ */ makeMap("left,right");
+const isKeyboardEvent = /* @__PURE__ */ makeMap(
+  `onkeyup,onkeydown,onkeypress`,
+  true
+);
+const resolveModifiers = (key, modifiers, context, loc) => {
+  const keyModifiers = [];
+  const nonKeyModifiers = [];
+  const eventOptionModifiers = [];
+  for (let i = 0; i < modifiers.length; i++) {
+    const modifier = modifiers[i];
+    if (isEventOptionModifier(modifier)) {
+      eventOptionModifiers.push(modifier);
+    } else {
+      if (maybeKeyModifier(modifier)) {
+        if (isStaticExp(key)) {
+          if (isKeyboardEvent(key.content)) {
+            keyModifiers.push(modifier);
+          } else {
+            nonKeyModifiers.push(modifier);
+          }
+        } else {
+          keyModifiers.push(modifier);
+          nonKeyModifiers.push(modifier);
+        }
+      } else {
+        if (isNonKeyModifier(modifier)) {
+          nonKeyModifiers.push(modifier);
+        } else {
+          keyModifiers.push(modifier);
+        }
+      }
+    }
+  }
+  return {
+    keyModifiers,
+    nonKeyModifiers,
+    eventOptionModifiers
+  };
+};
+const transformClick = (key, event) => {
+  const isStaticClick = isStaticExp(key) && key.content.toLowerCase() === "onclick";
+  return isStaticClick ? createSimpleExpression(event, true) : key.type !== 4 ? createCompoundExpression([
+    `(`,
+    key,
+    `) === "onClick" ? "${event}" : (`,
+    key,
+    `)`
+  ]) : key;
+};
+const transformOn = (dir, node, context) => {
+  return transformOn$1(dir, node, context, (baseResult) => {
+    const { modifiers } = dir;
+    if (!modifiers.length)
+      return baseResult;
+    let { key, value: handlerExp } = baseResult.props[0];
+    const { keyModifiers, nonKeyModifiers, eventOptionModifiers } = resolveModifiers(key, modifiers, context, dir.loc);
+    if (nonKeyModifiers.includes("right")) {
+      key = transformClick(key, `onContextmenu`);
+    }
+    if (nonKeyModifiers.includes("middle")) {
+      key = transformClick(key, `onMouseup`);
+    }
+    if (nonKeyModifiers.length) {
+      handlerExp = createCallExpression(context.helper(V_ON_WITH_MODIFIERS), [
+        handlerExp,
+        JSON.stringify(nonKeyModifiers)
+      ]);
+    }
+    if (keyModifiers.length && // if event name is dynamic, always wrap with keys guard
+    (!isStaticExp(key) || isKeyboardEvent(key.content))) {
+      handlerExp = createCallExpression(context.helper(V_ON_WITH_KEYS), [
+        handlerExp,
+        JSON.stringify(keyModifiers)
+      ]);
+    }
+    if (eventOptionModifiers.length) {
+      const modifierPostfix = eventOptionModifiers.map(capitalize).join("");
+      key = isStaticExp(key) ? createSimpleExpression(`${key.content}${modifierPostfix}`, true) : createCompoundExpression([`(`, key, `) + "${modifierPostfix}"`]);
+    }
+    return {
+      props: [createObjectProperty(key, handlerExp)]
+    };
+  });
+};
+
+const transformShow = (dir, node, context) => {
+  const { exp, loc } = dir;
+  if (!exp) {
+    context.onError(
+      createDOMCompilerError(61, loc)
+    );
+  }
+  return {
+    props: [],
+    needRuntime: context.helper(V_SHOW)
+  };
+};
+
+const transformTransition = (node, context) => {
+  if (node.type === 1 && node.tagType === 1) {
+    const component = context.isBuiltInComponent(node.tag);
+    if (component === TRANSITION) {
+      return () => {
+        if (!node.children.length) {
+          return;
+        }
+        if (hasMultipleChildren(node)) {
+          context.onError(
+            createDOMCompilerError(
+              62,
+              {
+                start: node.children[0].loc.start,
+                end: node.children[node.children.length - 1].loc.end,
+                source: ""
+              }
+            )
+          );
+        }
+        const child = node.children[0];
+        if (child.type === 1) {
+          for (const p of child.props) {
+            if (p.type === 7 && p.name === "show") {
+              node.props.push({
+                type: 6,
+                name: "persisted",
+                value: void 0,
+                loc: node.loc
+              });
+            }
+          }
+        }
+      };
+    }
+  }
+};
+function hasMultipleChildren(node) {
+  const children = node.children = node.children.filter(
+    (c) => c.type !== 3 && !(c.type === 2 && !c.content.trim())
+  );
+  const child = children[0];
+  return children.length !== 1 || child.type === 11 || child.type === 9 && child.branches.some(hasMultipleChildren);
+}
+
+const ignoreSideEffectTags = (node, context) => {
+  if (node.type === 1 && node.tagType === 0 && (node.tag === "script" || node.tag === "style")) {
+    context.onError(
+      createDOMCompilerError(
+        63,
+        node.loc
+      )
+    );
+    context.removeNode();
+  }
+};
+
+const DOMNodeTransforms = [
+  transformStyle,
+  ...[transformTransition] 
+];
+const DOMDirectiveTransforms = {
+  cloak: noopDirectiveTransform,
+  html: transformVHtml,
+  text: transformVText,
+  model: transformModel,
+  // override compiler-core
+  on: transformOn,
+  // override compiler-core
+  show: transformShow
+};
+function compile(template, options = {}) {
+  return baseCompile(
+    template,
+    extend({}, parserOptions, options, {
+      nodeTransforms: [
+        // ignore <script> and <tag>
+        // this is not put inside DOMNodeTransforms because that list is used
+        // by compiler-ssr to generate vnode fallback branches
+        ignoreSideEffectTags,
+        ...DOMNodeTransforms,
+        ...options.nodeTransforms || []
+      ],
+      directiveTransforms: extend(
+        {},
+        DOMDirectiveTransforms,
+        options.directiveTransforms || {}
+      ),
+      transformHoist: null 
+    })
+  );
+}
+
+{
+  initDev();
+}
+const compileCache = /* @__PURE__ */ Object.create(null);
+function compileToFunction(template, options) {
+  if (!isString(template)) {
+    if (template.nodeType) {
+      template = template.innerHTML;
+    } else {
+      warn(`invalid template option: `, template);
+      return NOOP;
+    }
+  }
+  const key = template;
+  const cached = compileCache[key];
+  if (cached) {
+    return cached;
+  }
+  if (template[0] === "#") {
+    const el = document.querySelector(template);
+    if (!el) {
+      warn(`Template element not found or is empty: ${template}`);
+    }
+    template = el ? el.innerHTML : ``;
+  }
+  const opts = extend(
+    {
+      hoistStatic: true,
+      onError: onError ,
+      onWarn: (e) => onError(e, true) 
+    },
+    options
+  );
+  if (!opts.isCustomElement && typeof customElements !== "undefined") {
+    opts.isCustomElement = (tag) => !!customElements.get(tag);
+  }
+  const { code } = compile(template, opts);
+  function onError(err, asWarning = false) {
+    const message = asWarning ? err.message : `Template compilation error: ${err.message}`;
+    const codeFrame = err.loc && generateCodeFrame(
+      template,
+      err.loc.start.offset,
+      err.loc.end.offset
+    );
+    warn(codeFrame ? `${message}
+${codeFrame}` : message);
+  }
+  const render = new Function("Vue", code)(runtimeDom);
+  render._rc = true;
+  return compileCache[key] = render;
+}
+registerRuntimeCompiler(compileToFunction);
+
+export { BaseTransition, BaseTransitionPropsValidators, Comment, EffectScope, Fragment, KeepAlive, ReactiveEffect, Static, Suspense, Teleport, Text, Transition, TransitionGroup, VueElement, assertNumber, callWithAsyncErrorHandling, callWithErrorHandling, camelize, capitalize, cloneVNode, compatUtils, compileToFunction as compile, computed, createApp, createBlock, createCommentVNode, createElementBlock, createBaseVNode as createElementVNode, createHydrationRenderer, createPropsRestProxy, createRenderer, createSSRApp, createSlots, createStaticVNode, createTextVNode, createVNode, customRef, defineAsyncComponent, defineComponent, defineCustomElement, defineEmits, defineExpose, defineModel, defineOptions, defineProps, defineSSRCustomElement, defineSlots, devtools, effect, effectScope, getCurrentInstance, getCurrentScope, getTransitionRawChildren, guardReactiveProps, h, handleError, hasInjectionContext, hydrate, initCustomFormatter, initDirectivesForSSR, inject, isMemoSame, isProxy, isReactive, isReadonly, isRef, isRuntimeOnly, isShallow, isVNode, markRaw, mergeDefaults, mergeModels, mergeProps, nextTick, normalizeClass, normalizeProps, normalizeStyle, onActivated, onBeforeMount, onBeforeUnmount, onBeforeUpdate, onDeactivated, onErrorCaptured, onMounted, onRenderTracked, onRenderTriggered, onScopeDispose, onServerPrefetch, onUnmounted, onUpdated, openBlock, popScopeId, provide, proxyRefs, pushScopeId, queuePostFlushCb, reactive, readonly, ref, registerRuntimeCompiler, render, renderList, renderSlot, resolveComponent, resolveDirective, resolveDynamicComponent, resolveFilter, resolveTransitionHooks, setBlockTracking, setDevtoolsHook, setTransitionHooks, shallowReactive, shallowReadonly, shallowRef, ssrContextKey, ssrUtils, stop, toDisplayString, toHandlerKey, toHandlers, toRaw, toRef, toRefs, toValue, transformVNodeArgs, triggerRef, unref, useAttrs, useCssModule, useCssVars, useModel, useSSRContext, useSlots, useTransitionState, vModelCheckbox, vModelDynamic, vModelRadio, vModelSelect, vModelText, vShow, version, warn, watch, watchEffect, watchPostEffect, watchSyncEffect, withAsyncContext, withCtx, withDefaults, withDirectives, withKeys, withMemo, withModifiers, withScopeId };
Index: /mods/mod_ticket/assets/js/vue3.3.6.global.js
===================================================================
--- /mods/mod_ticket/assets/js/vue3.3.6.global.js	(revision 8427)
+++ /mods/mod_ticket/assets/js/vue3.3.6.global.js	(revision 8427)
@@ -0,0 +1,15370 @@
+var Vue = (function (exports) {
+  'use strict';
+
+  function makeMap(str, expectsLowerCase) {
+    const map = /* @__PURE__ */ Object.create(null);
+    const list = str.split(",");
+    for (let i = 0; i < list.length; i++) {
+      map[list[i]] = true;
+    }
+    return expectsLowerCase ? (val) => !!map[val.toLowerCase()] : (val) => !!map[val];
+  }
+
+  const EMPTY_OBJ = Object.freeze({}) ;
+  const EMPTY_ARR = Object.freeze([]) ;
+  const NOOP = () => {
+  };
+  const NO = () => false;
+  const onRE = /^on[^a-z]/;
+  const isOn = (key) => onRE.test(key);
+  const isModelListener = (key) => key.startsWith("onUpdate:");
+  const extend = Object.assign;
+  const remove = (arr, el) => {
+    const i = arr.indexOf(el);
+    if (i > -1) {
+      arr.splice(i, 1);
+    }
+  };
+  const hasOwnProperty$1 = Object.prototype.hasOwnProperty;
+  const hasOwn = (val, key) => hasOwnProperty$1.call(val, key);
+  const isArray = Array.isArray;
+  const isMap = (val) => toTypeString(val) === "[object Map]";
+  const isSet = (val) => toTypeString(val) === "[object Set]";
+  const isDate = (val) => toTypeString(val) === "[object Date]";
+  const isRegExp = (val) => toTypeString(val) === "[object RegExp]";
+  const isFunction = (val) => typeof val === "function";
+  const isString = (val) => typeof val === "string";
+  const isSymbol = (val) => typeof val === "symbol";
+  const isObject = (val) => val !== null && typeof val === "object";
+  const isPromise = (val) => {
+    return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);
+  };
+  const objectToString = Object.prototype.toString;
+  const toTypeString = (value) => objectToString.call(value);
+  const toRawType = (value) => {
+    return toTypeString(value).slice(8, -1);
+  };
+  const isPlainObject = (val) => toTypeString(val) === "[object Object]";
+  const isIntegerKey = (key) => isString(key) && key !== "NaN" && key[0] !== "-" && "" + parseInt(key, 10) === key;
+  const isReservedProp = /* @__PURE__ */ makeMap(
+    // the leading comma is intentional so empty string "" is also included
+    ",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"
+  );
+  const isBuiltInDirective = /* @__PURE__ */ makeMap(
+    "bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"
+  );
+  const cacheStringFunction = (fn) => {
+    const cache = /* @__PURE__ */ Object.create(null);
+    return (str) => {
+      const hit = cache[str];
+      return hit || (cache[str] = fn(str));
+    };
+  };
+  const camelizeRE = /-(\w)/g;
+  const camelize = cacheStringFunction((str) => {
+    return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : "");
+  });
+  const hyphenateRE = /\B([A-Z])/g;
+  const hyphenate = cacheStringFunction(
+    (str) => str.replace(hyphenateRE, "-$1").toLowerCase()
+  );
+  const capitalize = cacheStringFunction((str) => {
+    return str.charAt(0).toUpperCase() + str.slice(1);
+  });
+  const toHandlerKey = cacheStringFunction((str) => {
+    const s = str ? `on${capitalize(str)}` : ``;
+    return s;
+  });
+  const hasChanged = (value, oldValue) => !Object.is(value, oldValue);
+  const invokeArrayFns = (fns, arg) => {
+    for (let i = 0; i < fns.length; i++) {
+      fns[i](arg);
+    }
+  };
+  const def = (obj, key, value) => {
+    Object.defineProperty(obj, key, {
+      configurable: true,
+      enumerable: false,
+      value
+    });
+  };
+  const looseToNumber = (val) => {
+    const n = parseFloat(val);
+    return isNaN(n) ? val : n;
+  };
+  const toNumber = (val) => {
+    const n = isString(val) ? Number(val) : NaN;
+    return isNaN(n) ? val : n;
+  };
+  let _globalThis;
+  const getGlobalThis = () => {
+    return _globalThis || (_globalThis = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : {});
+  };
+
+  const PatchFlagNames = {
+    [1]: `TEXT`,
+    [2]: `CLASS`,
+    [4]: `STYLE`,
+    [8]: `PROPS`,
+    [16]: `FULL_PROPS`,
+    [32]: `HYDRATE_EVENTS`,
+    [64]: `STABLE_FRAGMENT`,
+    [128]: `KEYED_FRAGMENT`,
+    [256]: `UNKEYED_FRAGMENT`,
+    [512]: `NEED_PATCH`,
+    [1024]: `DYNAMIC_SLOTS`,
+    [2048]: `DEV_ROOT_FRAGMENT`,
+    [-1]: `HOISTED`,
+    [-2]: `BAIL`
+  };
+
+  const slotFlagsText = {
+    [1]: "STABLE",
+    [2]: "DYNAMIC",
+    [3]: "FORWARDED"
+  };
+
+  const GLOBALS_ALLOWED = "Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console";
+  const isGloballyAllowed = /* @__PURE__ */ makeMap(GLOBALS_ALLOWED);
+
+  const range = 2;
+  function generateCodeFrame(source, start = 0, end = source.length) {
+    let lines = source.split(/(\r?\n)/);
+    const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);
+    lines = lines.filter((_, idx) => idx % 2 === 0);
+    let count = 0;
+    const res = [];
+    for (let i = 0; i < lines.length; i++) {
+      count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0);
+      if (count >= start) {
+        for (let j = i - range; j <= i + range || end > count; j++) {
+          if (j < 0 || j >= lines.length)
+            continue;
+          const line = j + 1;
+          res.push(
+            `${line}${" ".repeat(Math.max(3 - String(line).length, 0))}|  ${lines[j]}`
+          );
+          const lineLength = lines[j].length;
+          const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0;
+          if (j === i) {
+            const pad = start - (count - (lineLength + newLineSeqLength));
+            const length = Math.max(
+              1,
+              end > count ? lineLength - pad : end - start
+            );
+            res.push(`   |  ` + " ".repeat(pad) + "^".repeat(length));
+          } else if (j > i) {
+            if (end > count) {
+              const length = Math.max(Math.min(end - count, lineLength), 1);
+              res.push(`   |  ` + "^".repeat(length));
+            }
+            count += lineLength + newLineSeqLength;
+          }
+        }
+        break;
+      }
+    }
+    return res.join("\n");
+  }
+
+  function normalizeStyle(value) {
+    if (isArray(value)) {
+      const res = {};
+      for (let i = 0; i < value.length; i++) {
+        const item = value[i];
+        const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);
+        if (normalized) {
+          for (const key in normalized) {
+            res[key] = normalized[key];
+          }
+        }
+      }
+      return res;
+    } else if (isString(value) || isObject(value)) {
+      return value;
+    }
+  }
+  const listDelimiterRE = /;(?![^(]*\))/g;
+  const propertyDelimiterRE = /:([^]+)/;
+  const styleCommentRE = /\/\*[^]*?\*\//g;
+  function parseStringStyle(cssText) {
+    const ret = {};
+    cssText.replace(styleCommentRE, "").split(listDelimiterRE).forEach((item) => {
+      if (item) {
+        const tmp = item.split(propertyDelimiterRE);
+        tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());
+      }
+    });
+    return ret;
+  }
+  function normalizeClass(value) {
+    let res = "";
+    if (isString(value)) {
+      res = value;
+    } else if (isArray(value)) {
+      for (let i = 0; i < value.length; i++) {
+        const normalized = normalizeClass(value[i]);
+        if (normalized) {
+          res += normalized + " ";
+        }
+      }
+    } else if (isObject(value)) {
+      for (const name in value) {
+        if (value[name]) {
+          res += name + " ";
+        }
+      }
+    }
+    return res.trim();
+  }
+  function normalizeProps(props) {
+    if (!props)
+      return null;
+    let { class: klass, style } = props;
+    if (klass && !isString(klass)) {
+      props.class = normalizeClass(klass);
+    }
+    if (style) {
+      props.style = normalizeStyle(style);
+    }
+    return props;
+  }
+
+  const HTML_TAGS = "html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot";
+  const SVG_TAGS = "svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view";
+  const VOID_TAGS = "area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr";
+  const isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);
+  const isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS);
+  const isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS);
+
+  const specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;
+  const isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs);
+  function includeBooleanAttr(value) {
+    return !!value || value === "";
+  }
+
+  function looseCompareArrays(a, b) {
+    if (a.length !== b.length)
+      return false;
+    let equal = true;
+    for (let i = 0; equal && i < a.length; i++) {
+      equal = looseEqual(a[i], b[i]);
+    }
+    return equal;
+  }
+  function looseEqual(a, b) {
+    if (a === b)
+      return true;
+    let aValidType = isDate(a);
+    let bValidType = isDate(b);
+    if (aValidType || bValidType) {
+      return aValidType && bValidType ? a.getTime() === b.getTime() : false;
+    }
+    aValidType = isSymbol(a);
+    bValidType = isSymbol(b);
+    if (aValidType || bValidType) {
+      return a === b;
+    }
+    aValidType = isArray(a);
+    bValidType = isArray(b);
+    if (aValidType || bValidType) {
+      return aValidType && bValidType ? looseCompareArrays(a, b) : false;
+    }
+    aValidType = isObject(a);
+    bValidType = isObject(b);
+    if (aValidType || bValidType) {
+      if (!aValidType || !bValidType) {
+        return false;
+      }
+      const aKeysCount = Object.keys(a).length;
+      const bKeysCount = Object.keys(b).length;
+      if (aKeysCount !== bKeysCount) {
+        return false;
+      }
+      for (const key in a) {
+        const aHasKey = a.hasOwnProperty(key);
+        const bHasKey = b.hasOwnProperty(key);
+        if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {
+          return false;
+        }
+      }
+    }
+    return String(a) === String(b);
+  }
+  function looseIndexOf(arr, val) {
+    return arr.findIndex((item) => looseEqual(item, val));
+  }
+
+  const toDisplayString = (val) => {
+    return isString(val) ? val : val == null ? "" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? JSON.stringify(val, replacer, 2) : String(val);
+  };
+  const replacer = (_key, val) => {
+    if (val && val.__v_isRef) {
+      return replacer(_key, val.value);
+    } else if (isMap(val)) {
+      return {
+        [`Map(${val.size})`]: [...val.entries()].reduce((entries, [key, val2]) => {
+          entries[`${key} =>`] = val2;
+          return entries;
+        }, {})
+      };
+    } else if (isSet(val)) {
+      return {
+        [`Set(${val.size})`]: [...val.values()]
+      };
+    } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {
+      return String(val);
+    }
+    return val;
+  };
+
+  function warn$1(msg, ...args) {
+    console.warn(`[Vue warn] ${msg}`, ...args);
+  }
+
+  let activeEffectScope;
+  class EffectScope {
+    constructor(detached = false) {
+      this.detached = detached;
+      /**
+       * @internal
+       */
+      this._active = true;
+      /**
+       * @internal
+       */
+      this.effects = [];
+      /**
+       * @internal
+       */
+      this.cleanups = [];
+      this.parent = activeEffectScope;
+      if (!detached && activeEffectScope) {
+        this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(
+          this
+        ) - 1;
+      }
+    }
+    get active() {
+      return this._active;
+    }
+    run(fn) {
+      if (this._active) {
+        const currentEffectScope = activeEffectScope;
+        try {
+          activeEffectScope = this;
+          return fn();
+        } finally {
+          activeEffectScope = currentEffectScope;
+        }
+      } else {
+        warn$1(`cannot run an inactive effect scope.`);
+      }
+    }
+    /**
+     * This should only be called on non-detached scopes
+     * @internal
+     */
+    on() {
+      activeEffectScope = this;
+    }
+    /**
+     * This should only be called on non-detached scopes
+     * @internal
+     */
+    off() {
+      activeEffectScope = this.parent;
+    }
+    stop(fromParent) {
+      if (this._active) {
+        let i, l;
+        for (i = 0, l = this.effects.length; i < l; i++) {
+          this.effects[i].stop();
+        }
+        for (i = 0, l = this.cleanups.length; i < l; i++) {
+          this.cleanups[i]();
+        }
+        if (this.scopes) {
+          for (i = 0, l = this.scopes.length; i < l; i++) {
+            this.scopes[i].stop(true);
+          }
+        }
+        if (!this.detached && this.parent && !fromParent) {
+          const last = this.parent.scopes.pop();
+          if (last && last !== this) {
+            this.parent.scopes[this.index] = last;
+            last.index = this.index;
+          }
+        }
+        this.parent = void 0;
+        this._active = false;
+      }
+    }
+  }
+  function effectScope(detached) {
+    return new EffectScope(detached);
+  }
+  function recordEffectScope(effect, scope = activeEffectScope) {
+    if (scope && scope.active) {
+      scope.effects.push(effect);
+    }
+  }
+  function getCurrentScope() {
+    return activeEffectScope;
+  }
+  function onScopeDispose(fn) {
+    if (activeEffectScope) {
+      activeEffectScope.cleanups.push(fn);
+    } else {
+      warn$1(
+        `onScopeDispose() is called when there is no active effect scope to be associated with.`
+      );
+    }
+  }
+
+  const createDep = (effects) => {
+    const dep = new Set(effects);
+    dep.w = 0;
+    dep.n = 0;
+    return dep;
+  };
+  const wasTracked = (dep) => (dep.w & trackOpBit) > 0;
+  const newTracked = (dep) => (dep.n & trackOpBit) > 0;
+  const initDepMarkers = ({ deps }) => {
+    if (deps.length) {
+      for (let i = 0; i < deps.length; i++) {
+        deps[i].w |= trackOpBit;
+      }
+    }
+  };
+  const finalizeDepMarkers = (effect) => {
+    const { deps } = effect;
+    if (deps.length) {
+      let ptr = 0;
+      for (let i = 0; i < deps.length; i++) {
+        const dep = deps[i];
+        if (wasTracked(dep) && !newTracked(dep)) {
+          dep.delete(effect);
+        } else {
+          deps[ptr++] = dep;
+        }
+        dep.w &= ~trackOpBit;
+        dep.n &= ~trackOpBit;
+      }
+      deps.length = ptr;
+    }
+  };
+
+  const targetMap = /* @__PURE__ */ new WeakMap();
+  let effectTrackDepth = 0;
+  let trackOpBit = 1;
+  const maxMarkerBits = 30;
+  let activeEffect;
+  const ITERATE_KEY = Symbol("iterate" );
+  const MAP_KEY_ITERATE_KEY = Symbol("Map key iterate" );
+  class ReactiveEffect {
+    constructor(fn, scheduler = null, scope) {
+      this.fn = fn;
+      this.scheduler = scheduler;
+      this.active = true;
+      this.deps = [];
+      this.parent = void 0;
+      recordEffectScope(this, scope);
+    }
+    run() {
+      if (!this.active) {
+        return this.fn();
+      }
+      let parent = activeEffect;
+      let lastShouldTrack = shouldTrack;
+      while (parent) {
+        if (parent === this) {
+          return;
+        }
+        parent = parent.parent;
+      }
+      try {
+        this.parent = activeEffect;
+        activeEffect = this;
+        shouldTrack = true;
+        trackOpBit = 1 << ++effectTrackDepth;
+        if (effectTrackDepth <= maxMarkerBits) {
+          initDepMarkers(this);
+        } else {
+          cleanupEffect(this);
+        }
+        return this.fn();
+      } finally {
+        if (effectTrackDepth <= maxMarkerBits) {
+          finalizeDepMarkers(this);
+        }
+        trackOpBit = 1 << --effectTrackDepth;
+        activeEffect = this.parent;
+        shouldTrack = lastShouldTrack;
+        this.parent = void 0;
+        if (this.deferStop) {
+          this.stop();
+        }
+      }
+    }
+    stop() {
+      if (activeEffect === this) {
+        this.deferStop = true;
+      } else if (this.active) {
+        cleanupEffect(this);
+        if (this.onStop) {
+          this.onStop();
+        }
+        this.active = false;
+      }
+    }
+  }
+  function cleanupEffect(effect2) {
+    const { deps } = effect2;
+    if (deps.length) {
+      for (let i = 0; i < deps.length; i++) {
+        deps[i].delete(effect2);
+      }
+      deps.length = 0;
+    }
+  }
+  function effect(fn, options) {
+    if (fn.effect instanceof ReactiveEffect) {
+      fn = fn.effect.fn;
+    }
+    const _effect = new ReactiveEffect(fn);
+    if (options) {
+      extend(_effect, options);
+      if (options.scope)
+        recordEffectScope(_effect, options.scope);
+    }
+    if (!options || !options.lazy) {
+      _effect.run();
+    }
+    const runner = _effect.run.bind(_effect);
+    runner.effect = _effect;
+    return runner;
+  }
+  function stop(runner) {
+    runner.effect.stop();
+  }
+  let shouldTrack = true;
+  const trackStack = [];
+  function pauseTracking() {
+    trackStack.push(shouldTrack);
+    shouldTrack = false;
+  }
+  function resetTracking() {
+    const last = trackStack.pop();
+    shouldTrack = last === void 0 ? true : last;
+  }
+  function track(target, type, key) {
+    if (shouldTrack && activeEffect) {
+      let depsMap = targetMap.get(target);
+      if (!depsMap) {
+        targetMap.set(target, depsMap = /* @__PURE__ */ new Map());
+      }
+      let dep = depsMap.get(key);
+      if (!dep) {
+        depsMap.set(key, dep = createDep());
+      }
+      const eventInfo = { effect: activeEffect, target, type, key } ;
+      trackEffects(dep, eventInfo);
+    }
+  }
+  function trackEffects(dep, debuggerEventExtraInfo) {
+    let shouldTrack2 = false;
+    if (effectTrackDepth <= maxMarkerBits) {
+      if (!newTracked(dep)) {
+        dep.n |= trackOpBit;
+        shouldTrack2 = !wasTracked(dep);
+      }
+    } else {
+      shouldTrack2 = !dep.has(activeEffect);
+    }
+    if (shouldTrack2) {
+      dep.add(activeEffect);
+      activeEffect.deps.push(dep);
+      if (activeEffect.onTrack) {
+        activeEffect.onTrack(
+          extend(
+            {
+              effect: activeEffect
+            },
+            debuggerEventExtraInfo
+          )
+        );
+      }
+    }
+  }
+  function trigger(target, type, key, newValue, oldValue, oldTarget) {
+    const depsMap = targetMap.get(target);
+    if (!depsMap) {
+      return;
+    }
+    let deps = [];
+    if (type === "clear") {
+      deps = [...depsMap.values()];
+    } else if (key === "length" && isArray(target)) {
+      const newLength = Number(newValue);
+      depsMap.forEach((dep, key2) => {
+        if (key2 === "length" || key2 >= newLength) {
+          deps.push(dep);
+        }
+      });
+    } else {
+      if (key !== void 0) {
+        deps.push(depsMap.get(key));
+      }
+      switch (type) {
+        case "add":
+          if (!isArray(target)) {
+            deps.push(depsMap.get(ITERATE_KEY));
+            if (isMap(target)) {
+              deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));
+            }
+          } else if (isIntegerKey(key)) {
+            deps.push(depsMap.get("length"));
+          }
+          break;
+        case "delete":
+          if (!isArray(target)) {
+            deps.push(depsMap.get(ITERATE_KEY));
+            if (isMap(target)) {
+              deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));
+            }
+          }
+          break;
+        case "set":
+          if (isMap(target)) {
+            deps.push(depsMap.get(ITERATE_KEY));
+          }
+          break;
+      }
+    }
+    const eventInfo = { target, type, key, newValue, oldValue, oldTarget } ;
+    if (deps.length === 1) {
+      if (deps[0]) {
+        {
+          triggerEffects(deps[0], eventInfo);
+        }
+      }
+    } else {
+      const effects = [];
+      for (const dep of deps) {
+        if (dep) {
+          effects.push(...dep);
+        }
+      }
+      {
+        triggerEffects(createDep(effects), eventInfo);
+      }
+    }
+  }
+  function triggerEffects(dep, debuggerEventExtraInfo) {
+    const effects = isArray(dep) ? dep : [...dep];
+    for (const effect2 of effects) {
+      if (effect2.computed) {
+        triggerEffect(effect2, debuggerEventExtraInfo);
+      }
+    }
+    for (const effect2 of effects) {
+      if (!effect2.computed) {
+        triggerEffect(effect2, debuggerEventExtraInfo);
+      }
+    }
+  }
+  function triggerEffect(effect2, debuggerEventExtraInfo) {
+    if (effect2 !== activeEffect || effect2.allowRecurse) {
+      if (effect2.onTrigger) {
+        effect2.onTrigger(extend({ effect: effect2 }, debuggerEventExtraInfo));
+      }
+      if (effect2.scheduler) {
+        effect2.scheduler();
+      } else {
+        effect2.run();
+      }
+    }
+  }
+  function getDepFromReactive(object, key) {
+    var _a;
+    return (_a = targetMap.get(object)) == null ? void 0 : _a.get(key);
+  }
+
+  const isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);
+  const builtInSymbols = new Set(
+    /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== "arguments" && key !== "caller").map((key) => Symbol[key]).filter(isSymbol)
+  );
+  const arrayInstrumentations = /* @__PURE__ */ createArrayInstrumentations();
+  function createArrayInstrumentations() {
+    const instrumentations = {};
+    ["includes", "indexOf", "lastIndexOf"].forEach((key) => {
+      instrumentations[key] = function(...args) {
+        const arr = toRaw(this);
+        for (let i = 0, l = this.length; i < l; i++) {
+          track(arr, "get", i + "");
+        }
+        const res = arr[key](...args);
+        if (res === -1 || res === false) {
+          return arr[key](...args.map(toRaw));
+        } else {
+          return res;
+        }
+      };
+    });
+    ["push", "pop", "shift", "unshift", "splice"].forEach((key) => {
+      instrumentations[key] = function(...args) {
+        pauseTracking();
+        const res = toRaw(this)[key].apply(this, args);
+        resetTracking();
+        return res;
+      };
+    });
+    return instrumentations;
+  }
+  function hasOwnProperty(key) {
+    const obj = toRaw(this);
+    track(obj, "has", key);
+    return obj.hasOwnProperty(key);
+  }
+  class BaseReactiveHandler {
+    constructor(_isReadonly = false, _shallow = false) {
+      this._isReadonly = _isReadonly;
+      this._shallow = _shallow;
+    }
+    get(target, key, receiver) {
+      const isReadonly2 = this._isReadonly, shallow = this._shallow;
+      if (key === "__v_isReactive") {
+        return !isReadonly2;
+      } else if (key === "__v_isReadonly") {
+        return isReadonly2;
+      } else if (key === "__v_isShallow") {
+        return shallow;
+      } else if (key === "__v_raw" && receiver === (isReadonly2 ? shallow ? shallowReadonlyMap : readonlyMap : shallow ? shallowReactiveMap : reactiveMap).get(target)) {
+        return target;
+      }
+      const targetIsArray = isArray(target);
+      if (!isReadonly2) {
+        if (targetIsArray && hasOwn(arrayInstrumentations, key)) {
+          return Reflect.get(arrayInstrumentations, key, receiver);
+        }
+        if (key === "hasOwnProperty") {
+          return hasOwnProperty;
+        }
+      }
+      const res = Reflect.get(target, key, receiver);
+      if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {
+        return res;
+      }
+      if (!isReadonly2) {
+        track(target, "get", key);
+      }
+      if (shallow) {
+        return res;
+      }
+      if (isRef(res)) {
+        return targetIsArray && isIntegerKey(key) ? res : res.value;
+      }
+      if (isObject(res)) {
+        return isReadonly2 ? readonly(res) : reactive(res);
+      }
+      return res;
+    }
+  }
+  class MutableReactiveHandler extends BaseReactiveHandler {
+    constructor(shallow = false) {
+      super(false, shallow);
+    }
+    set(target, key, value, receiver) {
+      let oldValue = target[key];
+      if (isReadonly(oldValue) && isRef(oldValue) && !isRef(value)) {
+        return false;
+      }
+      if (!this._shallow) {
+        if (!isShallow(value) && !isReadonly(value)) {
+          oldValue = toRaw(oldValue);
+          value = toRaw(value);
+        }
+        if (!isArray(target) && isRef(oldValue) && !isRef(value)) {
+          oldValue.value = value;
+          return true;
+        }
+      }
+      const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key);
+      const result = Reflect.set(target, key, value, receiver);
+      if (target === toRaw(receiver)) {
+        if (!hadKey) {
+          trigger(target, "add", key, value);
+        } else if (hasChanged(value, oldValue)) {
+          trigger(target, "set", key, value, oldValue);
+        }
+      }
+      return result;
+    }
+    deleteProperty(target, key) {
+      const hadKey = hasOwn(target, key);
+      const oldValue = target[key];
+      const result = Reflect.deleteProperty(target, key);
+      if (result && hadKey) {
+        trigger(target, "delete", key, void 0, oldValue);
+      }
+      return result;
+    }
+    has(target, key) {
+      const result = Reflect.has(target, key);
+      if (!isSymbol(key) || !builtInSymbols.has(key)) {
+        track(target, "has", key);
+      }
+      return result;
+    }
+    ownKeys(target) {
+      track(
+        target,
+        "iterate",
+        isArray(target) ? "length" : ITERATE_KEY
+      );
+      return Reflect.ownKeys(target);
+    }
+  }
+  class ReadonlyReactiveHandler extends BaseReactiveHandler {
+    constructor(shallow = false) {
+      super(true, shallow);
+    }
+    set(target, key) {
+      {
+        warn$1(
+          `Set operation on key "${String(key)}" failed: target is readonly.`,
+          target
+        );
+      }
+      return true;
+    }
+    deleteProperty(target, key) {
+      {
+        warn$1(
+          `Delete operation on key "${String(key)}" failed: target is readonly.`,
+          target
+        );
+      }
+      return true;
+    }
+  }
+  const mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler();
+  const readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler();
+  const shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler(
+    true
+  );
+  const shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true);
+
+  const toShallow = (value) => value;
+  const getProto = (v) => Reflect.getPrototypeOf(v);
+  function get(target, key, isReadonly = false, isShallow = false) {
+    target = target["__v_raw"];
+    const rawTarget = toRaw(target);
+    const rawKey = toRaw(key);
+    if (!isReadonly) {
+      if (hasChanged(key, rawKey)) {
+        track(rawTarget, "get", key);
+      }
+      track(rawTarget, "get", rawKey);
+    }
+    const { has: has2 } = getProto(rawTarget);
+    const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
+    if (has2.call(rawTarget, key)) {
+      return wrap(target.get(key));
+    } else if (has2.call(rawTarget, rawKey)) {
+      return wrap(target.get(rawKey));
+    } else if (target !== rawTarget) {
+      target.get(key);
+    }
+  }
+  function has(key, isReadonly = false) {
+    const target = this["__v_raw"];
+    const rawTarget = toRaw(target);
+    const rawKey = toRaw(key);
+    if (!isReadonly) {
+      if (hasChanged(key, rawKey)) {
+        track(rawTarget, "has", key);
+      }
+      track(rawTarget, "has", rawKey);
+    }
+    return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);
+  }
+  function size(target, isReadonly = false) {
+    target = target["__v_raw"];
+    !isReadonly && track(toRaw(target), "iterate", ITERATE_KEY);
+    return Reflect.get(target, "size", target);
+  }
+  function add(value) {
+    value = toRaw(value);
+    const target = toRaw(this);
+    const proto = getProto(target);
+    const hadKey = proto.has.call(target, value);
+    if (!hadKey) {
+      target.add(value);
+      trigger(target, "add", value, value);
+    }
+    return this;
+  }
+  function set(key, value) {
+    value = toRaw(value);
+    const target = toRaw(this);
+    const { has: has2, get: get2 } = getProto(target);
+    let hadKey = has2.call(target, key);
+    if (!hadKey) {
+      key = toRaw(key);
+      hadKey = has2.call(target, key);
+    } else {
+      checkIdentityKeys(target, has2, key);
+    }
+    const oldValue = get2.call(target, key);
+    target.set(key, value);
+    if (!hadKey) {
+      trigger(target, "add", key, value);
+    } else if (hasChanged(value, oldValue)) {
+      trigger(target, "set", key, value, oldValue);
+    }
+    return this;
+  }
+  function deleteEntry(key) {
+    const target = toRaw(this);
+    const { has: has2, get: get2 } = getProto(target);
+    let hadKey = has2.call(target, key);
+    if (!hadKey) {
+      key = toRaw(key);
+      hadKey = has2.call(target, key);
+    } else {
+      checkIdentityKeys(target, has2, key);
+    }
+    const oldValue = get2 ? get2.call(target, key) : void 0;
+    const result = target.delete(key);
+    if (hadKey) {
+      trigger(target, "delete", key, void 0, oldValue);
+    }
+    return result;
+  }
+  function clear() {
+    const target = toRaw(this);
+    const hadItems = target.size !== 0;
+    const oldTarget = isMap(target) ? new Map(target) : new Set(target) ;
+    const result = target.clear();
+    if (hadItems) {
+      trigger(target, "clear", void 0, void 0, oldTarget);
+    }
+    return result;
+  }
+  function createForEach(isReadonly, isShallow) {
+    return function forEach(callback, thisArg) {
+      const observed = this;
+      const target = observed["__v_raw"];
+      const rawTarget = toRaw(target);
+      const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
+      !isReadonly && track(rawTarget, "iterate", ITERATE_KEY);
+      return target.forEach((value, key) => {
+        return callback.call(thisArg, wrap(value), wrap(key), observed);
+      });
+    };
+  }
+  function createIterableMethod(method, isReadonly, isShallow) {
+    return function(...args) {
+      const target = this["__v_raw"];
+      const rawTarget = toRaw(target);
+      const targetIsMap = isMap(rawTarget);
+      const isPair = method === "entries" || method === Symbol.iterator && targetIsMap;
+      const isKeyOnly = method === "keys" && targetIsMap;
+      const innerIterator = target[method](...args);
+      const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
+      !isReadonly && track(
+        rawTarget,
+        "iterate",
+        isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY
+      );
+      return {
+        // iterator protocol
+        next() {
+          const { value, done } = innerIterator.next();
+          return done ? { value, done } : {
+            value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),
+            done
+          };
+        },
+        // iterable protocol
+        [Symbol.iterator]() {
+          return this;
+        }
+      };
+    };
+  }
+  function createReadonlyMethod(type) {
+    return function(...args) {
+      {
+        const key = args[0] ? `on key "${args[0]}" ` : ``;
+        console.warn(
+          `${capitalize(type)} operation ${key}failed: target is readonly.`,
+          toRaw(this)
+        );
+      }
+      return type === "delete" ? false : this;
+    };
+  }
+  function createInstrumentations() {
+    const mutableInstrumentations2 = {
+      get(key) {
+        return get(this, key);
+      },
+      get size() {
+        return size(this);
+      },
+      has,
+      add,
+      set,
+      delete: deleteEntry,
+      clear,
+      forEach: createForEach(false, false)
+    };
+    const shallowInstrumentations2 = {
+      get(key) {
+        return get(this, key, false, true);
+      },
+      get size() {
+        return size(this);
+      },
+      has,
+      add,
+      set,
+      delete: deleteEntry,
+      clear,
+      forEach: createForEach(false, true)
+    };
+    const readonlyInstrumentations2 = {
+      get(key) {
+        return get(this, key, true);
+      },
+      get size() {
+        return size(this, true);
+      },
+      has(key) {
+        return has.call(this, key, true);
+      },
+      add: createReadonlyMethod("add"),
+      set: createReadonlyMethod("set"),
+      delete: createReadonlyMethod("delete"),
+      clear: createReadonlyMethod("clear"),
+      forEach: createForEach(true, false)
+    };
+    const shallowReadonlyInstrumentations2 = {
+      get(key) {
+        return get(this, key, true, true);
+      },
+      get size() {
+        return size(this, true);
+      },
+      has(key) {
+        return has.call(this, key, true);
+      },
+      add: createReadonlyMethod("add"),
+      set: createReadonlyMethod("set"),
+      delete: createReadonlyMethod("delete"),
+      clear: createReadonlyMethod("clear"),
+      forEach: createForEach(true, true)
+    };
+    const iteratorMethods = ["keys", "values", "entries", Symbol.iterator];
+    iteratorMethods.forEach((method) => {
+      mutableInstrumentations2[method] = createIterableMethod(
+        method,
+        false,
+        false
+      );
+      readonlyInstrumentations2[method] = createIterableMethod(
+        method,
+        true,
+        false
+      );
+      shallowInstrumentations2[method] = createIterableMethod(
+        method,
+        false,
+        true
+      );
+      shallowReadonlyInstrumentations2[method] = createIterableMethod(
+        method,
+        true,
+        true
+      );
+    });
+    return [
+      mutableInstrumentations2,
+      readonlyInstrumentations2,
+      shallowInstrumentations2,
+      shallowReadonlyInstrumentations2
+    ];
+  }
+  const [
+    mutableInstrumentations,
+    readonlyInstrumentations,
+    shallowInstrumentations,
+    shallowReadonlyInstrumentations
+  ] = /* @__PURE__ */ createInstrumentations();
+  function createInstrumentationGetter(isReadonly, shallow) {
+    const instrumentations = shallow ? isReadonly ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly ? readonlyInstrumentations : mutableInstrumentations;
+    return (target, key, receiver) => {
+      if (key === "__v_isReactive") {
+        return !isReadonly;
+      } else if (key === "__v_isReadonly") {
+        return isReadonly;
+      } else if (key === "__v_raw") {
+        return target;
+      }
+      return Reflect.get(
+        hasOwn(instrumentations, key) && key in target ? instrumentations : target,
+        key,
+        receiver
+      );
+    };
+  }
+  const mutableCollectionHandlers = {
+    get: /* @__PURE__ */ createInstrumentationGetter(false, false)
+  };
+  const shallowCollectionHandlers = {
+    get: /* @__PURE__ */ createInstrumentationGetter(false, true)
+  };
+  const readonlyCollectionHandlers = {
+    get: /* @__PURE__ */ createInstrumentationGetter(true, false)
+  };
+  const shallowReadonlyCollectionHandlers = {
+    get: /* @__PURE__ */ createInstrumentationGetter(true, true)
+  };
+  function checkIdentityKeys(target, has2, key) {
+    const rawKey = toRaw(key);
+    if (rawKey !== key && has2.call(target, rawKey)) {
+      const type = toRawType(target);
+      console.warn(
+        `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`
+      );
+    }
+  }
+
+  const reactiveMap = /* @__PURE__ */ new WeakMap();
+  const shallowReactiveMap = /* @__PURE__ */ new WeakMap();
+  const readonlyMap = /* @__PURE__ */ new WeakMap();
+  const shallowReadonlyMap = /* @__PURE__ */ new WeakMap();
+  function targetTypeMap(rawType) {
+    switch (rawType) {
+      case "Object":
+      case "Array":
+        return 1 /* COMMON */;
+      case "Map":
+      case "Set":
+      case "WeakMap":
+      case "WeakSet":
+        return 2 /* COLLECTION */;
+      default:
+        return 0 /* INVALID */;
+    }
+  }
+  function getTargetType(value) {
+    return value["__v_skip"] || !Object.isExtensible(value) ? 0 /* INVALID */ : targetTypeMap(toRawType(value));
+  }
+  function reactive(target) {
+    if (isReadonly(target)) {
+      return target;
+    }
+    return createReactiveObject(
+      target,
+      false,
+      mutableHandlers,
+      mutableCollectionHandlers,
+      reactiveMap
+    );
+  }
+  function shallowReactive(target) {
+    return createReactiveObject(
+      target,
+      false,
+      shallowReactiveHandlers,
+      shallowCollectionHandlers,
+      shallowReactiveMap
+    );
+  }
+  function readonly(target) {
+    return createReactiveObject(
+      target,
+      true,
+      readonlyHandlers,
+      readonlyCollectionHandlers,
+      readonlyMap
+    );
+  }
+  function shallowReadonly(target) {
+    return createReactiveObject(
+      target,
+      true,
+      shallowReadonlyHandlers,
+      shallowReadonlyCollectionHandlers,
+      shallowReadonlyMap
+    );
+  }
+  function createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {
+    if (!isObject(target)) {
+      {
+        console.warn(`value cannot be made reactive: ${String(target)}`);
+      }
+      return target;
+    }
+    if (target["__v_raw"] && !(isReadonly2 && target["__v_isReactive"])) {
+      return target;
+    }
+    const existingProxy = proxyMap.get(target);
+    if (existingProxy) {
+      return existingProxy;
+    }
+    const targetType = getTargetType(target);
+    if (targetType === 0 /* INVALID */) {
+      return target;
+    }
+    const proxy = new Proxy(
+      target,
+      targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers
+    );
+    proxyMap.set(target, proxy);
+    return proxy;
+  }
+  function isReactive(value) {
+    if (isReadonly(value)) {
+      return isReactive(value["__v_raw"]);
+    }
+    return !!(value && value["__v_isReactive"]);
+  }
+  function isReadonly(value) {
+    return !!(value && value["__v_isReadonly"]);
+  }
+  function isShallow(value) {
+    return !!(value && value["__v_isShallow"]);
+  }
+  function isProxy(value) {
+    return isReactive(value) || isReadonly(value);
+  }
+  function toRaw(observed) {
+    const raw = observed && observed["__v_raw"];
+    return raw ? toRaw(raw) : observed;
+  }
+  function markRaw(value) {
+    def(value, "__v_skip", true);
+    return value;
+  }
+  const toReactive = (value) => isObject(value) ? reactive(value) : value;
+  const toReadonly = (value) => isObject(value) ? readonly(value) : value;
+
+  function trackRefValue(ref2) {
+    if (shouldTrack && activeEffect) {
+      ref2 = toRaw(ref2);
+      {
+        trackEffects(ref2.dep || (ref2.dep = createDep()), {
+          target: ref2,
+          type: "get",
+          key: "value"
+        });
+      }
+    }
+  }
+  function triggerRefValue(ref2, newVal) {
+    ref2 = toRaw(ref2);
+    const dep = ref2.dep;
+    if (dep) {
+      {
+        triggerEffects(dep, {
+          target: ref2,
+          type: "set",
+          key: "value",
+          newValue: newVal
+        });
+      }
+    }
+  }
+  function isRef(r) {
+    return !!(r && r.__v_isRef === true);
+  }
+  function ref(value) {
+    return createRef(value, false);
+  }
+  function shallowRef(value) {
+    return createRef(value, true);
+  }
+  function createRef(rawValue, shallow) {
+    if (isRef(rawValue)) {
+      return rawValue;
+    }
+    return new RefImpl(rawValue, shallow);
+  }
+  class RefImpl {
+    constructor(value, __v_isShallow) {
+      this.__v_isShallow = __v_isShallow;
+      this.dep = void 0;
+      this.__v_isRef = true;
+      this._rawValue = __v_isShallow ? value : toRaw(value);
+      this._value = __v_isShallow ? value : toReactive(value);
+    }
+    get value() {
+      trackRefValue(this);
+      return this._value;
+    }
+    set value(newVal) {
+      const useDirectValue = this.__v_isShallow || isShallow(newVal) || isReadonly(newVal);
+      newVal = useDirectValue ? newVal : toRaw(newVal);
+      if (hasChanged(newVal, this._rawValue)) {
+        this._rawValue = newVal;
+        this._value = useDirectValue ? newVal : toReactive(newVal);
+        triggerRefValue(this, newVal);
+      }
+    }
+  }
+  function triggerRef(ref2) {
+    triggerRefValue(ref2, ref2.value );
+  }
+  function unref(ref2) {
+    return isRef(ref2) ? ref2.value : ref2;
+  }
+  function toValue(source) {
+    return isFunction(source) ? source() : unref(source);
+  }
+  const shallowUnwrapHandlers = {
+    get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)),
+    set: (target, key, value, receiver) => {
+      const oldValue = target[key];
+      if (isRef(oldValue) && !isRef(value)) {
+        oldValue.value = value;
+        return true;
+      } else {
+        return Reflect.set(target, key, value, receiver);
+      }
+    }
+  };
+  function proxyRefs(objectWithRefs) {
+    return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);
+  }
+  class CustomRefImpl {
+    constructor(factory) {
+      this.dep = void 0;
+      this.__v_isRef = true;
+      const { get, set } = factory(
+        () => trackRefValue(this),
+        () => triggerRefValue(this)
+      );
+      this._get = get;
+      this._set = set;
+    }
+    get value() {
+      return this._get();
+    }
+    set value(newVal) {
+      this._set(newVal);
+    }
+  }
+  function customRef(factory) {
+    return new CustomRefImpl(factory);
+  }
+  function toRefs(object) {
+    if (!isProxy(object)) {
+      console.warn(`toRefs() expects a reactive object but received a plain one.`);
+    }
+    const ret = isArray(object) ? new Array(object.length) : {};
+    for (const key in object) {
+      ret[key] = propertyToRef(object, key);
+    }
+    return ret;
+  }
+  class ObjectRefImpl {
+    constructor(_object, _key, _defaultValue) {
+      this._object = _object;
+      this._key = _key;
+      this._defaultValue = _defaultValue;
+      this.__v_isRef = true;
+    }
+    get value() {
+      const val = this._object[this._key];
+      return val === void 0 ? this._defaultValue : val;
+    }
+    set value(newVal) {
+      this._object[this._key] = newVal;
+    }
+    get dep() {
+      return getDepFromReactive(toRaw(this._object), this._key);
+    }
+  }
+  class GetterRefImpl {
+    constructor(_getter) {
+      this._getter = _getter;
+      this.__v_isRef = true;
+      this.__v_isReadonly = true;
+    }
+    get value() {
+      return this._getter();
+    }
+  }
+  function toRef(source, key, defaultValue) {
+    if (isRef(source)) {
+      return source;
+    } else if (isFunction(source)) {
+      return new GetterRefImpl(source);
+    } else if (isObject(source) && arguments.length > 1) {
+      return propertyToRef(source, key, defaultValue);
+    } else {
+      return ref(source);
+    }
+  }
+  function propertyToRef(source, key, defaultValue) {
+    const val = source[key];
+    return isRef(val) ? val : new ObjectRefImpl(source, key, defaultValue);
+  }
+
+  class ComputedRefImpl {
+    constructor(getter, _setter, isReadonly, isSSR) {
+      this._setter = _setter;
+      this.dep = void 0;
+      this.__v_isRef = true;
+      this["__v_isReadonly"] = false;
+      this._dirty = true;
+      this.effect = new ReactiveEffect(getter, () => {
+        if (!this._dirty) {
+          this._dirty = true;
+          triggerRefValue(this);
+        }
+      });
+      this.effect.computed = this;
+      this.effect.active = this._cacheable = !isSSR;
+      this["__v_isReadonly"] = isReadonly;
+    }
+    get value() {
+      const self = toRaw(this);
+      trackRefValue(self);
+      if (self._dirty || !self._cacheable) {
+        self._dirty = false;
+        self._value = self.effect.run();
+      }
+      return self._value;
+    }
+    set value(newValue) {
+      this._setter(newValue);
+    }
+  }
+  function computed$1(getterOrOptions, debugOptions, isSSR = false) {
+    let getter;
+    let setter;
+    const onlyGetter = isFunction(getterOrOptions);
+    if (onlyGetter) {
+      getter = getterOrOptions;
+      setter = () => {
+        console.warn("Write operation failed: computed value is readonly");
+      } ;
+    } else {
+      getter = getterOrOptions.get;
+      setter = getterOrOptions.set;
+    }
+    const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR);
+    if (debugOptions && !isSSR) {
+      cRef.effect.onTrack = debugOptions.onTrack;
+      cRef.effect.onTrigger = debugOptions.onTrigger;
+    }
+    return cRef;
+  }
+
+  const stack = [];
+  function pushWarningContext(vnode) {
+    stack.push(vnode);
+  }
+  function popWarningContext() {
+    stack.pop();
+  }
+  function warn(msg, ...args) {
+    pauseTracking();
+    const instance = stack.length ? stack[stack.length - 1].component : null;
+    const appWarnHandler = instance && instance.appContext.config.warnHandler;
+    const trace = getComponentTrace();
+    if (appWarnHandler) {
+      callWithErrorHandling(
+        appWarnHandler,
+        instance,
+        11,
+        [
+          msg + args.join(""),
+          instance && instance.proxy,
+          trace.map(
+            ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`
+          ).join("\n"),
+          trace
+        ]
+      );
+    } else {
+      const warnArgs = [`[Vue warn]: ${msg}`, ...args];
+      if (trace.length && // avoid spamming console during tests
+      true) {
+        warnArgs.push(`
+`, ...formatTrace(trace));
+      }
+      console.warn(...warnArgs);
+    }
+    resetTracking();
+  }
+  function getComponentTrace() {
+    let currentVNode = stack[stack.length - 1];
+    if (!currentVNode) {
+      return [];
+    }
+    const normalizedStack = [];
+    while (currentVNode) {
+      const last = normalizedStack[0];
+      if (last && last.vnode === currentVNode) {
+        last.recurseCount++;
+      } else {
+        normalizedStack.push({
+          vnode: currentVNode,
+          recurseCount: 0
+        });
+      }
+      const parentInstance = currentVNode.component && currentVNode.component.parent;
+      currentVNode = parentInstance && parentInstance.vnode;
+    }
+    return normalizedStack;
+  }
+  function formatTrace(trace) {
+    const logs = [];
+    trace.forEach((entry, i) => {
+      logs.push(...i === 0 ? [] : [`
+`], ...formatTraceEntry(entry));
+    });
+    return logs;
+  }
+  function formatTraceEntry({ vnode, recurseCount }) {
+    const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;
+    const isRoot = vnode.component ? vnode.component.parent == null : false;
+    const open = ` at <${formatComponentName(
+    vnode.component,
+    vnode.type,
+    isRoot
+  )}`;
+    const close = `>` + postfix;
+    return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close];
+  }
+  function formatProps(props) {
+    const res = [];
+    const keys = Object.keys(props);
+    keys.slice(0, 3).forEach((key) => {
+      res.push(...formatProp(key, props[key]));
+    });
+    if (keys.length > 3) {
+      res.push(` ...`);
+    }
+    return res;
+  }
+  function formatProp(key, value, raw) {
+    if (isString(value)) {
+      value = JSON.stringify(value);
+      return raw ? value : [`${key}=${value}`];
+    } else if (typeof value === "number" || typeof value === "boolean" || value == null) {
+      return raw ? value : [`${key}=${value}`];
+    } else if (isRef(value)) {
+      value = formatProp(key, toRaw(value.value), true);
+      return raw ? value : [`${key}=Ref<`, value, `>`];
+    } else if (isFunction(value)) {
+      return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];
+    } else {
+      value = toRaw(value);
+      return raw ? value : [`${key}=`, value];
+    }
+  }
+  function assertNumber(val, type) {
+    if (val === void 0) {
+      return;
+    } else if (typeof val !== "number") {
+      warn(`${type} is not a valid number - got ${JSON.stringify(val)}.`);
+    } else if (isNaN(val)) {
+      warn(`${type} is NaN - the duration expression might be incorrect.`);
+    }
+  }
+
+  const ErrorTypeStrings = {
+    ["sp"]: "serverPrefetch hook",
+    ["bc"]: "beforeCreate hook",
+    ["c"]: "created hook",
+    ["bm"]: "beforeMount hook",
+    ["m"]: "mounted hook",
+    ["bu"]: "beforeUpdate hook",
+    ["u"]: "updated",
+    ["bum"]: "beforeUnmount hook",
+    ["um"]: "unmounted hook",
+    ["a"]: "activated hook",
+    ["da"]: "deactivated hook",
+    ["ec"]: "errorCaptured hook",
+    ["rtc"]: "renderTracked hook",
+    ["rtg"]: "renderTriggered hook",
+    [0]: "setup function",
+    [1]: "render function",
+    [2]: "watcher getter",
+    [3]: "watcher callback",
+    [4]: "watcher cleanup function",
+    [5]: "native event handler",
+    [6]: "component event handler",
+    [7]: "vnode hook",
+    [8]: "directive hook",
+    [9]: "transition hook",
+    [10]: "app errorHandler",
+    [11]: "app warnHandler",
+    [12]: "ref function",
+    [13]: "async component loader",
+    [14]: "scheduler flush. This is likely a Vue internals bug. Please open an issue at https://new-issue.vuejs.org/?repo=vuejs/core"
+  };
+  function callWithErrorHandling(fn, instance, type, args) {
+    let res;
+    try {
+      res = args ? fn(...args) : fn();
+    } catch (err) {
+      handleError(err, instance, type);
+    }
+    return res;
+  }
+  function callWithAsyncErrorHandling(fn, instance, type, args) {
+    if (isFunction(fn)) {
+      const res = callWithErrorHandling(fn, instance, type, args);
+      if (res && isPromise(res)) {
+        res.catch((err) => {
+          handleError(err, instance, type);
+        });
+      }
+      return res;
+    }
+    const values = [];
+    for (let i = 0; i < fn.length; i++) {
+      values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));
+    }
+    return values;
+  }
+  function handleError(err, instance, type, throwInDev = true) {
+    const contextVNode = instance ? instance.vnode : null;
+    if (instance) {
+      let cur = instance.parent;
+      const exposedInstance = instance.proxy;
+      const errorInfo = ErrorTypeStrings[type] ;
+      while (cur) {
+        const errorCapturedHooks = cur.ec;
+        if (errorCapturedHooks) {
+          for (let i = 0; i < errorCapturedHooks.length; i++) {
+            if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {
+              return;
+            }
+          }
+        }
+        cur = cur.parent;
+      }
+      const appErrorHandler = instance.appContext.config.errorHandler;
+      if (appErrorHandler) {
+        callWithErrorHandling(
+          appErrorHandler,
+          null,
+          10,
+          [err, exposedInstance, errorInfo]
+        );
+        return;
+      }
+    }
+    logError(err, type, contextVNode, throwInDev);
+  }
+  function logError(err, type, contextVNode, throwInDev = true) {
+    {
+      const info = ErrorTypeStrings[type];
+      if (contextVNode) {
+        pushWarningContext(contextVNode);
+      }
+      warn(`Unhandled error${info ? ` during execution of ${info}` : ``}`);
+      if (contextVNode) {
+        popWarningContext();
+      }
+      if (throwInDev) {
+        throw err;
+      } else {
+        console.error(err);
+      }
+    }
+  }
+
+  let isFlushing = false;
+  let isFlushPending = false;
+  const queue = [];
+  let flushIndex = 0;
+  const pendingPostFlushCbs = [];
+  let activePostFlushCbs = null;
+  let postFlushIndex = 0;
+  const resolvedPromise = /* @__PURE__ */ Promise.resolve();
+  let currentFlushPromise = null;
+  const RECURSION_LIMIT = 100;
+  function nextTick(fn) {
+    const p = currentFlushPromise || resolvedPromise;
+    return fn ? p.then(this ? fn.bind(this) : fn) : p;
+  }
+  function findInsertionIndex(id) {
+    let start = flushIndex + 1;
+    let end = queue.length;
+    while (start < end) {
+      const middle = start + end >>> 1;
+      const middleJobId = getId(queue[middle]);
+      middleJobId < id ? start = middle + 1 : end = middle;
+    }
+    return start;
+  }
+  function queueJob(job) {
+    if (!queue.length || !queue.includes(
+      job,
+      isFlushing && job.allowRecurse ? flushIndex + 1 : flushIndex
+    )) {
+      if (job.id == null) {
+        queue.push(job);
+      } else {
+        queue.splice(findInsertionIndex(job.id), 0, job);
+      }
+      queueFlush();
+    }
+  }
+  function queueFlush() {
+    if (!isFlushing && !isFlushPending) {
+      isFlushPending = true;
+      currentFlushPromise = resolvedPromise.then(flushJobs);
+    }
+  }
+  function invalidateJob(job) {
+    const i = queue.indexOf(job);
+    if (i > flushIndex) {
+      queue.splice(i, 1);
+    }
+  }
+  function queuePostFlushCb(cb) {
+    if (!isArray(cb)) {
+      if (!activePostFlushCbs || !activePostFlushCbs.includes(
+        cb,
+        cb.allowRecurse ? postFlushIndex + 1 : postFlushIndex
+      )) {
+        pendingPostFlushCbs.push(cb);
+      }
+    } else {
+      pendingPostFlushCbs.push(...cb);
+    }
+    queueFlush();
+  }
+  function flushPreFlushCbs(seen, i = isFlushing ? flushIndex + 1 : 0) {
+    {
+      seen = seen || /* @__PURE__ */ new Map();
+    }
+    for (; i < queue.length; i++) {
+      const cb = queue[i];
+      if (cb && cb.pre) {
+        if (checkRecursiveUpdates(seen, cb)) {
+          continue;
+        }
+        queue.splice(i, 1);
+        i--;
+        cb();
+      }
+    }
+  }
+  function flushPostFlushCbs(seen) {
+    if (pendingPostFlushCbs.length) {
+      const deduped = [...new Set(pendingPostFlushCbs)];
+      pendingPostFlushCbs.length = 0;
+      if (activePostFlushCbs) {
+        activePostFlushCbs.push(...deduped);
+        return;
+      }
+      activePostFlushCbs = deduped;
+      {
+        seen = seen || /* @__PURE__ */ new Map();
+      }
+      activePostFlushCbs.sort((a, b) => getId(a) - getId(b));
+      for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {
+        if (checkRecursiveUpdates(seen, activePostFlushCbs[postFlushIndex])) {
+          continue;
+        }
+        activePostFlushCbs[postFlushIndex]();
+      }
+      activePostFlushCbs = null;
+      postFlushIndex = 0;
+    }
+  }
+  const getId = (job) => job.id == null ? Infinity : job.id;
+  const comparator = (a, b) => {
+    const diff = getId(a) - getId(b);
+    if (diff === 0) {
+      if (a.pre && !b.pre)
+        return -1;
+      if (b.pre && !a.pre)
+        return 1;
+    }
+    return diff;
+  };
+  function flushJobs(seen) {
+    isFlushPending = false;
+    isFlushing = true;
+    {
+      seen = seen || /* @__PURE__ */ new Map();
+    }
+    queue.sort(comparator);
+    const check = (job) => checkRecursiveUpdates(seen, job) ;
+    try {
+      for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {
+        const job = queue[flushIndex];
+        if (job && job.active !== false) {
+          if (check(job)) {
+            continue;
+          }
+          callWithErrorHandling(job, null, 14);
+        }
+      }
+    } finally {
+      flushIndex = 0;
+      queue.length = 0;
+      flushPostFlushCbs(seen);
+      isFlushing = false;
+      currentFlushPromise = null;
+      if (queue.length || pendingPostFlushCbs.length) {
+        flushJobs(seen);
+      }
+    }
+  }
+  function checkRecursiveUpdates(seen, fn) {
+    if (!seen.has(fn)) {
+      seen.set(fn, 1);
+    } else {
+      const count = seen.get(fn);
+      if (count > RECURSION_LIMIT) {
+        const instance = fn.ownerInstance;
+        const componentName = instance && getComponentName(instance.type);
+        warn(
+          `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`
+        );
+        return true;
+      } else {
+        seen.set(fn, count + 1);
+      }
+    }
+  }
+
+  let isHmrUpdating = false;
+  const hmrDirtyComponents = /* @__PURE__ */ new Set();
+  {
+    getGlobalThis().__VUE_HMR_RUNTIME__ = {
+      createRecord: tryWrap(createRecord),
+      rerender: tryWrap(rerender),
+      reload: tryWrap(reload)
+    };
+  }
+  const map = /* @__PURE__ */ new Map();
+  function registerHMR(instance) {
+    const id = instance.type.__hmrId;
+    let record = map.get(id);
+    if (!record) {
+      createRecord(id, instance.type);
+      record = map.get(id);
+    }
+    record.instances.add(instance);
+  }
+  function unregisterHMR(instance) {
+    map.get(instance.type.__hmrId).instances.delete(instance);
+  }
+  function createRecord(id, initialDef) {
+    if (map.has(id)) {
+      return false;
+    }
+    map.set(id, {
+      initialDef: normalizeClassComponent(initialDef),
+      instances: /* @__PURE__ */ new Set()
+    });
+    return true;
+  }
+  function normalizeClassComponent(component) {
+    return isClassComponent(component) ? component.__vccOpts : component;
+  }
+  function rerender(id, newRender) {
+    const record = map.get(id);
+    if (!record) {
+      return;
+    }
+    record.initialDef.render = newRender;
+    [...record.instances].forEach((instance) => {
+      if (newRender) {
+        instance.render = newRender;
+        normalizeClassComponent(instance.type).render = newRender;
+      }
+      instance.renderCache = [];
+      isHmrUpdating = true;
+      instance.update();
+      isHmrUpdating = false;
+    });
+  }
+  function reload(id, newComp) {
+    const record = map.get(id);
+    if (!record)
+      return;
+    newComp = normalizeClassComponent(newComp);
+    updateComponentDef(record.initialDef, newComp);
+    const instances = [...record.instances];
+    for (const instance of instances) {
+      const oldComp = normalizeClassComponent(instance.type);
+      if (!hmrDirtyComponents.has(oldComp)) {
+        if (oldComp !== record.initialDef) {
+          updateComponentDef(oldComp, newComp);
+        }
+        hmrDirtyComponents.add(oldComp);
+      }
+      instance.appContext.propsCache.delete(instance.type);
+      instance.appContext.emitsCache.delete(instance.type);
+      instance.appContext.optionsCache.delete(instance.type);
+      if (instance.ceReload) {
+        hmrDirtyComponents.add(oldComp);
+        instance.ceReload(newComp.styles);
+        hmrDirtyComponents.delete(oldComp);
+      } else if (instance.parent) {
+        queueJob(instance.parent.update);
+      } else if (instance.appContext.reload) {
+        instance.appContext.reload();
+      } else if (typeof window !== "undefined") {
+        window.location.reload();
+      } else {
+        console.warn(
+          "[HMR] Root or manually mounted instance modified. Full reload required."
+        );
+      }
+    }
+    queuePostFlushCb(() => {
+      for (const instance of instances) {
+        hmrDirtyComponents.delete(
+          normalizeClassComponent(instance.type)
+        );
+      }
+    });
+  }
+  function updateComponentDef(oldComp, newComp) {
+    extend(oldComp, newComp);
+    for (const key in oldComp) {
+      if (key !== "__file" && !(key in newComp)) {
+        delete oldComp[key];
+      }
+    }
+  }
+  function tryWrap(fn) {
+    return (id, arg) => {
+      try {
+        return fn(id, arg);
+      } catch (e) {
+        console.error(e);
+        console.warn(
+          `[HMR] Something went wrong during Vue component hot-reload. Full reload required.`
+        );
+      }
+    };
+  }
+
+  exports.devtools = void 0;
+  let buffer = [];
+  let devtoolsNotInstalled = false;
+  function emit$1(event, ...args) {
+    if (exports.devtools) {
+      exports.devtools.emit(event, ...args);
+    } else if (!devtoolsNotInstalled) {
+      buffer.push({ event, args });
+    }
+  }
+  function setDevtoolsHook(hook, target) {
+    var _a, _b;
+    exports.devtools = hook;
+    if (exports.devtools) {
+      exports.devtools.enabled = true;
+      buffer.forEach(({ event, args }) => exports.devtools.emit(event, ...args));
+      buffer = [];
+    } else if (
+      // handle late devtools injection - only do this if we are in an actual
+      // browser environment to avoid the timer handle stalling test runner exit
+      // (#4815)
+      typeof window !== "undefined" && // some envs mock window but not fully
+      window.HTMLElement && // also exclude jsdom
+      !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes("jsdom"))
+    ) {
+      const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || [];
+      replay.push((newHook) => {
+        setDevtoolsHook(newHook, target);
+      });
+      setTimeout(() => {
+        if (!exports.devtools) {
+          target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null;
+          devtoolsNotInstalled = true;
+          buffer = [];
+        }
+      }, 3e3);
+    } else {
+      devtoolsNotInstalled = true;
+      buffer = [];
+    }
+  }
+  function devtoolsInitApp(app, version) {
+    emit$1("app:init" /* APP_INIT */, app, version, {
+      Fragment,
+      Text,
+      Comment,
+      Static
+    });
+  }
+  function devtoolsUnmountApp(app) {
+    emit$1("app:unmount" /* APP_UNMOUNT */, app);
+  }
+  const devtoolsComponentAdded = /* @__PURE__ */ createDevtoolsComponentHook(
+    "component:added" /* COMPONENT_ADDED */
+  );
+  const devtoolsComponentUpdated = /* @__PURE__ */ createDevtoolsComponentHook("component:updated" /* COMPONENT_UPDATED */);
+  const _devtoolsComponentRemoved = /* @__PURE__ */ createDevtoolsComponentHook(
+    "component:removed" /* COMPONENT_REMOVED */
+  );
+  const devtoolsComponentRemoved = (component) => {
+    if (exports.devtools && typeof exports.devtools.cleanupBuffer === "function" && // remove the component if it wasn't buffered
+    !exports.devtools.cleanupBuffer(component)) {
+      _devtoolsComponentRemoved(component);
+    }
+  };
+  function createDevtoolsComponentHook(hook) {
+    return (component) => {
+      emit$1(
+        hook,
+        component.appContext.app,
+        component.uid,
+        component.parent ? component.parent.uid : void 0,
+        component
+      );
+    };
+  }
+  const devtoolsPerfStart = /* @__PURE__ */ createDevtoolsPerformanceHook(
+    "perf:start" /* PERFORMANCE_START */
+  );
+  const devtoolsPerfEnd = /* @__PURE__ */ createDevtoolsPerformanceHook(
+    "perf:end" /* PERFORMANCE_END */
+  );
+  function createDevtoolsPerformanceHook(hook) {
+    return (component, type, time) => {
+      emit$1(hook, component.appContext.app, component.uid, component, type, time);
+    };
+  }
+  function devtoolsComponentEmit(component, event, params) {
+    emit$1(
+      "component:emit" /* COMPONENT_EMIT */,
+      component.appContext.app,
+      component,
+      event,
+      params
+    );
+  }
+
+  function emit(instance, event, ...rawArgs) {
+    if (instance.isUnmounted)
+      return;
+    const props = instance.vnode.props || EMPTY_OBJ;
+    {
+      const {
+        emitsOptions,
+        propsOptions: [propsOptions]
+      } = instance;
+      if (emitsOptions) {
+        if (!(event in emitsOptions) && true) {
+          if (!propsOptions || !(toHandlerKey(event) in propsOptions)) {
+            warn(
+              `Component emitted event "${event}" but it is neither declared in the emits option nor as an "${toHandlerKey(event)}" prop.`
+            );
+          }
+        } else {
+          const validator = emitsOptions[event];
+          if (isFunction(validator)) {
+            const isValid = validator(...rawArgs);
+            if (!isValid) {
+              warn(
+                `Invalid event arguments: event validation failed for event "${event}".`
+              );
+            }
+          }
+        }
+      }
+    }
+    let args = rawArgs;
+    const isModelListener = event.startsWith("update:");
+    const modelArg = isModelListener && event.slice(7);
+    if (modelArg && modelArg in props) {
+      const modifiersKey = `${modelArg === "modelValue" ? "model" : modelArg}Modifiers`;
+      const { number, trim } = props[modifiersKey] || EMPTY_OBJ;
+      if (trim) {
+        args = rawArgs.map((a) => isString(a) ? a.trim() : a);
+      }
+      if (number) {
+        args = rawArgs.map(looseToNumber);
+      }
+    }
+    {
+      devtoolsComponentEmit(instance, event, args);
+    }
+    {
+      const lowerCaseEvent = event.toLowerCase();
+      if (lowerCaseEvent !== event && props[toHandlerKey(lowerCaseEvent)]) {
+        warn(
+          `Event "${lowerCaseEvent}" is emitted in component ${formatComponentName(
+          instance,
+          instance.type
+        )} but the handler is registered for "${event}". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. You should probably use "${hyphenate(event)}" instead of "${event}".`
+        );
+      }
+    }
+    let handlerName;
+    let handler = props[handlerName = toHandlerKey(event)] || // also try camelCase event handler (#2249)
+    props[handlerName = toHandlerKey(camelize(event))];
+    if (!handler && isModelListener) {
+      handler = props[handlerName = toHandlerKey(hyphenate(event))];
+    }
+    if (handler) {
+      callWithAsyncErrorHandling(
+        handler,
+        instance,
+        6,
+        args
+      );
+    }
+    const onceHandler = props[handlerName + `Once`];
+    if (onceHandler) {
+      if (!instance.emitted) {
+        instance.emitted = {};
+      } else if (instance.emitted[handlerName]) {
+        return;
+      }
+      instance.emitted[handlerName] = true;
+      callWithAsyncErrorHandling(
+        onceHandler,
+        instance,
+        6,
+        args
+      );
+    }
+  }
+  function normalizeEmitsOptions(comp, appContext, asMixin = false) {
+    const cache = appContext.emitsCache;
+    const cached = cache.get(comp);
+    if (cached !== void 0) {
+      return cached;
+    }
+    const raw = comp.emits;
+    let normalized = {};
+    let hasExtends = false;
+    if (!isFunction(comp)) {
+      const extendEmits = (raw2) => {
+        const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true);
+        if (normalizedFromExtend) {
+          hasExtends = true;
+          extend(normalized, normalizedFromExtend);
+        }
+      };
+      if (!asMixin && appContext.mixins.length) {
+        appContext.mixins.forEach(extendEmits);
+      }
+      if (comp.extends) {
+        extendEmits(comp.extends);
+      }
+      if (comp.mixins) {
+        comp.mixins.forEach(extendEmits);
+      }
+    }
+    if (!raw && !hasExtends) {
+      if (isObject(comp)) {
+        cache.set(comp, null);
+      }
+      return null;
+    }
+    if (isArray(raw)) {
+      raw.forEach((key) => normalized[key] = null);
+    } else {
+      extend(normalized, raw);
+    }
+    if (isObject(comp)) {
+      cache.set(comp, normalized);
+    }
+    return normalized;
+  }
+  function isEmitListener(options, key) {
+    if (!options || !isOn(key)) {
+      return false;
+    }
+    key = key.slice(2).replace(/Once$/, "");
+    return hasOwn(options, key[0].toLowerCase() + key.slice(1)) || hasOwn(options, hyphenate(key)) || hasOwn(options, key);
+  }
+
+  let currentRenderingInstance = null;
+  let currentScopeId = null;
+  function setCurrentRenderingInstance(instance) {
+    const prev = currentRenderingInstance;
+    currentRenderingInstance = instance;
+    currentScopeId = instance && instance.type.__scopeId || null;
+    return prev;
+  }
+  function pushScopeId(id) {
+    currentScopeId = id;
+  }
+  function popScopeId() {
+    currentScopeId = null;
+  }
+  const withScopeId = (_id) => withCtx;
+  function withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) {
+    if (!ctx)
+      return fn;
+    if (fn._n) {
+      return fn;
+    }
+    const renderFnWithContext = (...args) => {
+      if (renderFnWithContext._d) {
+        setBlockTracking(-1);
+      }
+      const prevInstance = setCurrentRenderingInstance(ctx);
+      let res;
+      try {
+        res = fn(...args);
+      } finally {
+        setCurrentRenderingInstance(prevInstance);
+        if (renderFnWithContext._d) {
+          setBlockTracking(1);
+        }
+      }
+      {
+        devtoolsComponentUpdated(ctx);
+      }
+      return res;
+    };
+    renderFnWithContext._n = true;
+    renderFnWithContext._c = true;
+    renderFnWithContext._d = true;
+    return renderFnWithContext;
+  }
+
+  let accessedAttrs = false;
+  function markAttrsAccessed() {
+    accessedAttrs = true;
+  }
+  function renderComponentRoot(instance) {
+    const {
+      type: Component,
+      vnode,
+      proxy,
+      withProxy,
+      props,
+      propsOptions: [propsOptions],
+      slots,
+      attrs,
+      emit,
+      render,
+      renderCache,
+      data,
+      setupState,
+      ctx,
+      inheritAttrs
+    } = instance;
+    let result;
+    let fallthroughAttrs;
+    const prev = setCurrentRenderingInstance(instance);
+    {
+      accessedAttrs = false;
+    }
+    try {
+      if (vnode.shapeFlag & 4) {
+        const proxyToUse = withProxy || proxy;
+        result = normalizeVNode(
+          render.call(
+            proxyToUse,
+            proxyToUse,
+            renderCache,
+            props,
+            setupState,
+            data,
+            ctx
+          )
+        );
+        fallthroughAttrs = attrs;
+      } else {
+        const render2 = Component;
+        if (attrs === props) {
+          markAttrsAccessed();
+        }
+        result = normalizeVNode(
+          render2.length > 1 ? render2(
+            props,
+            true ? {
+              get attrs() {
+                markAttrsAccessed();
+                return attrs;
+              },
+              slots,
+              emit
+            } : { attrs, slots, emit }
+          ) : render2(
+            props,
+            null
+            /* we know it doesn't need it */
+          )
+        );
+        fallthroughAttrs = Component.props ? attrs : getFunctionalFallthrough(attrs);
+      }
+    } catch (err) {
+      blockStack.length = 0;
+      handleError(err, instance, 1);
+      result = createVNode(Comment);
+    }
+    let root = result;
+    let setRoot = void 0;
+    if (result.patchFlag > 0 && result.patchFlag & 2048) {
+      [root, setRoot] = getChildRoot(result);
+    }
+    if (fallthroughAttrs && inheritAttrs !== false) {
+      const keys = Object.keys(fallthroughAttrs);
+      const { shapeFlag } = root;
+      if (keys.length) {
+        if (shapeFlag & (1 | 6)) {
+          if (propsOptions && keys.some(isModelListener)) {
+            fallthroughAttrs = filterModelListeners(
+              fallthroughAttrs,
+              propsOptions
+            );
+          }
+          root = cloneVNode(root, fallthroughAttrs);
+        } else if (!accessedAttrs && root.type !== Comment) {
+          const allAttrs = Object.keys(attrs);
+          const eventAttrs = [];
+          const extraAttrs = [];
+          for (let i = 0, l = allAttrs.length; i < l; i++) {
+            const key = allAttrs[i];
+            if (isOn(key)) {
+              if (!isModelListener(key)) {
+                eventAttrs.push(key[2].toLowerCase() + key.slice(3));
+              }
+            } else {
+              extraAttrs.push(key);
+            }
+          }
+          if (extraAttrs.length) {
+            warn(
+              `Extraneous non-props attributes (${extraAttrs.join(", ")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes.`
+            );
+          }
+          if (eventAttrs.length) {
+            warn(
+              `Extraneous non-emits event listeners (${eventAttrs.join(", ")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes. If the listener is intended to be a component custom event listener only, declare it using the "emits" option.`
+            );
+          }
+        }
+      }
+    }
+    if (vnode.dirs) {
+      if (!isElementRoot(root)) {
+        warn(
+          `Runtime directive used on component with non-element root node. The directives will not function as intended.`
+        );
+      }
+      root = cloneVNode(root);
+      root.dirs = root.dirs ? root.dirs.concat(vnode.dirs) : vnode.dirs;
+    }
+    if (vnode.transition) {
+      if (!isElementRoot(root)) {
+        warn(
+          `Component inside <Transition> renders non-element root node that cannot be animated.`
+        );
+      }
+      root.transition = vnode.transition;
+    }
+    if (setRoot) {
+      setRoot(root);
+    } else {
+      result = root;
+    }
+    setCurrentRenderingInstance(prev);
+    return result;
+  }
+  const getChildRoot = (vnode) => {
+    const rawChildren = vnode.children;
+    const dynamicChildren = vnode.dynamicChildren;
+    const childRoot = filterSingleRoot(rawChildren);
+    if (!childRoot) {
+      return [vnode, void 0];
+    }
+    const index = rawChildren.indexOf(childRoot);
+    const dynamicIndex = dynamicChildren ? dynamicChildren.indexOf(childRoot) : -1;
+    const setRoot = (updatedRoot) => {
+      rawChildren[index] = updatedRoot;
+      if (dynamicChildren) {
+        if (dynamicIndex > -1) {
+          dynamicChildren[dynamicIndex] = updatedRoot;
+        } else if (updatedRoot.patchFlag > 0) {
+          vnode.dynamicChildren = [...dynamicChildren, updatedRoot];
+        }
+      }
+    };
+    return [normalizeVNode(childRoot), setRoot];
+  };
+  function filterSingleRoot(children) {
+    let singleRoot;
+    for (let i = 0; i < children.length; i++) {
+      const child = children[i];
+      if (isVNode(child)) {
+        if (child.type !== Comment || child.children === "v-if") {
+          if (singleRoot) {
+            return;
+          } else {
+            singleRoot = child;
+          }
+        }
+      } else {
+        return;
+      }
+    }
+    return singleRoot;
+  }
+  const getFunctionalFallthrough = (attrs) => {
+    let res;
+    for (const key in attrs) {
+      if (key === "class" || key === "style" || isOn(key)) {
+        (res || (res = {}))[key] = attrs[key];
+      }
+    }
+    return res;
+  };
+  const filterModelListeners = (attrs, props) => {
+    const res = {};
+    for (const key in attrs) {
+      if (!isModelListener(key) || !(key.slice(9) in props)) {
+        res[key] = attrs[key];
+      }
+    }
+    return res;
+  };
+  const isElementRoot = (vnode) => {
+    return vnode.shapeFlag & (6 | 1) || vnode.type === Comment;
+  };
+  function shouldUpdateComponent(prevVNode, nextVNode, optimized) {
+    const { props: prevProps, children: prevChildren, component } = prevVNode;
+    const { props: nextProps, children: nextChildren, patchFlag } = nextVNode;
+    const emits = component.emitsOptions;
+    if ((prevChildren || nextChildren) && isHmrUpdating) {
+      return true;
+    }
+    if (nextVNode.dirs || nextVNode.transition) {
+      return true;
+    }
+    if (optimized && patchFlag >= 0) {
+      if (patchFlag & 1024) {
+        return true;
+      }
+      if (patchFlag & 16) {
+        if (!prevProps) {
+          return !!nextProps;
+        }
+        return hasPropsChanged(prevProps, nextProps, emits);
+      } else if (patchFlag & 8) {
+        const dynamicProps = nextVNode.dynamicProps;
+        for (let i = 0; i < dynamicProps.length; i++) {
+          const key = dynamicProps[i];
+          if (nextProps[key] !== prevProps[key] && !isEmitListener(emits, key)) {
+            return true;
+          }
+        }
+      }
+    } else {
+      if (prevChildren || nextChildren) {
+        if (!nextChildren || !nextChildren.$stable) {
+          return true;
+        }
+      }
+      if (prevProps === nextProps) {
+        return false;
+      }
+      if (!prevProps) {
+        return !!nextProps;
+      }
+      if (!nextProps) {
+        return true;
+      }
+      return hasPropsChanged(prevProps, nextProps, emits);
+    }
+    return false;
+  }
+  function hasPropsChanged(prevProps, nextProps, emitsOptions) {
+    const nextKeys = Object.keys(nextProps);
+    if (nextKeys.length !== Object.keys(prevProps).length) {
+      return true;
+    }
+    for (let i = 0; i < nextKeys.length; i++) {
+      const key = nextKeys[i];
+      if (nextProps[key] !== prevProps[key] && !isEmitListener(emitsOptions, key)) {
+        return true;
+      }
+    }
+    return false;
+  }
+  function updateHOCHostEl({ vnode, parent }, el) {
+    while (parent && parent.subTree === vnode) {
+      (vnode = parent.vnode).el = el;
+      parent = parent.parent;
+    }
+  }
+
+  const isSuspense = (type) => type.__isSuspense;
+  const SuspenseImpl = {
+    name: "Suspense",
+    // In order to make Suspense tree-shakable, we need to avoid importing it
+    // directly in the renderer. The renderer checks for the __isSuspense flag
+    // on a vnode's type and calls the `process` method, passing in renderer
+    // internals.
+    __isSuspense: true,
+    process(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, rendererInternals) {
+      if (n1 == null) {
+        mountSuspense(
+          n2,
+          container,
+          anchor,
+          parentComponent,
+          parentSuspense,
+          isSVG,
+          slotScopeIds,
+          optimized,
+          rendererInternals
+        );
+      } else {
+        patchSuspense(
+          n1,
+          n2,
+          container,
+          anchor,
+          parentComponent,
+          isSVG,
+          slotScopeIds,
+          optimized,
+          rendererInternals
+        );
+      }
+    },
+    hydrate: hydrateSuspense,
+    create: createSuspenseBoundary,
+    normalize: normalizeSuspenseChildren
+  };
+  const Suspense = SuspenseImpl ;
+  function triggerEvent(vnode, name) {
+    const eventListener = vnode.props && vnode.props[name];
+    if (isFunction(eventListener)) {
+      eventListener();
+    }
+  }
+  function mountSuspense(vnode, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, rendererInternals) {
+    const {
+      p: patch,
+      o: { createElement }
+    } = rendererInternals;
+    const hiddenContainer = createElement("div");
+    const suspense = vnode.suspense = createSuspenseBoundary(
+      vnode,
+      parentSuspense,
+      parentComponent,
+      container,
+      hiddenContainer,
+      anchor,
+      isSVG,
+      slotScopeIds,
+      optimized,
+      rendererInternals
+    );
+    patch(
+      null,
+      suspense.pendingBranch = vnode.ssContent,
+      hiddenContainer,
+      null,
+      parentComponent,
+      suspense,
+      isSVG,
+      slotScopeIds
+    );
+    if (suspense.deps > 0) {
+      triggerEvent(vnode, "onPending");
+      triggerEvent(vnode, "onFallback");
+      patch(
+        null,
+        vnode.ssFallback,
+        container,
+        anchor,
+        parentComponent,
+        null,
+        // fallback tree will not have suspense context
+        isSVG,
+        slotScopeIds
+      );
+      setActiveBranch(suspense, vnode.ssFallback);
+    } else {
+      suspense.resolve(false, true);
+    }
+  }
+  function patchSuspense(n1, n2, container, anchor, parentComponent, isSVG, slotScopeIds, optimized, { p: patch, um: unmount, o: { createElement } }) {
+    const suspense = n2.suspense = n1.suspense;
+    suspense.vnode = n2;
+    n2.el = n1.el;
+    const newBranch = n2.ssContent;
+    const newFallback = n2.ssFallback;
+    const { activeBranch, pendingBranch, isInFallback, isHydrating } = suspense;
+    if (pendingBranch) {
+      suspense.pendingBranch = newBranch;
+      if (isSameVNodeType(newBranch, pendingBranch)) {
+        patch(
+          pendingBranch,
+          newBranch,
+          suspense.hiddenContainer,
+          null,
+          parentComponent,
+          suspense,
+          isSVG,
+          slotScopeIds,
+          optimized
+        );
+        if (suspense.deps <= 0) {
+          suspense.resolve();
+        } else if (isInFallback) {
+          patch(
+            activeBranch,
+            newFallback,
+            container,
+            anchor,
+            parentComponent,
+            null,
+            // fallback tree will not have suspense context
+            isSVG,
+            slotScopeIds,
+            optimized
+          );
+          setActiveBranch(suspense, newFallback);
+        }
+      } else {
+        suspense.pendingId++;
+        if (isHydrating) {
+          suspense.isHydrating = false;
+          suspense.activeBranch = pendingBranch;
+        } else {
+          unmount(pendingBranch, parentComponent, suspense);
+        }
+        suspense.deps = 0;
+        suspense.effects.length = 0;
+        suspense.hiddenContainer = createElement("div");
+        if (isInFallback) {
+          patch(
+            null,
+            newBranch,
+            suspense.hiddenContainer,
+            null,
+            parentComponent,
+            suspense,
+            isSVG,
+            slotScopeIds,
+            optimized
+          );
+          if (suspense.deps <= 0) {
+            suspense.resolve();
+          } else {
+            patch(
+              activeBranch,
+              newFallback,
+              container,
+              anchor,
+              parentComponent,
+              null,
+              // fallback tree will not have suspense context
+              isSVG,
+              slotScopeIds,
+              optimized
+            );
+            setActiveBranch(suspense, newFallback);
+          }
+        } else if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {
+          patch(
+            activeBranch,
+            newBranch,
+            container,
+            anchor,
+            parentComponent,
+            suspense,
+            isSVG,
+            slotScopeIds,
+            optimized
+          );
+          suspense.resolve(true);
+        } else {
+          patch(
+            null,
+            newBranch,
+            suspense.hiddenContainer,
+            null,
+            parentComponent,
+            suspense,
+            isSVG,
+            slotScopeIds,
+            optimized
+          );
+          if (suspense.deps <= 0) {
+            suspense.resolve();
+          }
+        }
+      }
+    } else {
+      if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {
+        patch(
+          activeBranch,
+          newBranch,
+          container,
+          anchor,
+          parentComponent,
+          suspense,
+          isSVG,
+          slotScopeIds,
+          optimized
+        );
+        setActiveBranch(suspense, newBranch);
+      } else {
+        triggerEvent(n2, "onPending");
+        suspense.pendingBranch = newBranch;
+        suspense.pendingId++;
+        patch(
+          null,
+          newBranch,
+          suspense.hiddenContainer,
+          null,
+          parentComponent,
+          suspense,
+          isSVG,
+          slotScopeIds,
+          optimized
+        );
+        if (suspense.deps <= 0) {
+          suspense.resolve();
+        } else {
+          const { timeout, pendingId } = suspense;
+          if (timeout > 0) {
+            setTimeout(() => {
+              if (suspense.pendingId === pendingId) {
+                suspense.fallback(newFallback);
+              }
+            }, timeout);
+          } else if (timeout === 0) {
+            suspense.fallback(newFallback);
+          }
+        }
+      }
+    }
+  }
+  let hasWarned = false;
+  function createSuspenseBoundary(vnode, parentSuspense, parentComponent, container, hiddenContainer, anchor, isSVG, slotScopeIds, optimized, rendererInternals, isHydrating = false) {
+    if (!hasWarned) {
+      hasWarned = true;
+      console[console.info ? "info" : "log"](
+        `<Suspense> is an experimental feature and its API will likely change.`
+      );
+    }
+    const {
+      p: patch,
+      m: move,
+      um: unmount,
+      n: next,
+      o: { parentNode, remove }
+    } = rendererInternals;
+    let parentSuspenseId;
+    const isSuspensible = isVNodeSuspensible(vnode);
+    if (isSuspensible) {
+      if (parentSuspense == null ? void 0 : parentSuspense.pendingBranch) {
+        parentSuspenseId = parentSuspense.pendingId;
+        parentSuspense.deps++;
+      }
+    }
+    const timeout = vnode.props ? toNumber(vnode.props.timeout) : void 0;
+    {
+      assertNumber(timeout, `Suspense timeout`);
+    }
+    const suspense = {
+      vnode,
+      parent: parentSuspense,
+      parentComponent,
+      isSVG,
+      container,
+      hiddenContainer,
+      anchor,
+      deps: 0,
+      pendingId: 0,
+      timeout: typeof timeout === "number" ? timeout : -1,
+      activeBranch: null,
+      pendingBranch: null,
+      isInFallback: true,
+      isHydrating,
+      isUnmounted: false,
+      effects: [],
+      resolve(resume = false, sync = false) {
+        {
+          if (!resume && !suspense.pendingBranch) {
+            throw new Error(
+              `suspense.resolve() is called without a pending branch.`
+            );
+          }
+          if (suspense.isUnmounted) {
+            throw new Error(
+              `suspense.resolve() is called on an already unmounted suspense boundary.`
+            );
+          }
+        }
+        const {
+          vnode: vnode2,
+          activeBranch,
+          pendingBranch,
+          pendingId,
+          effects,
+          parentComponent: parentComponent2,
+          container: container2
+        } = suspense;
+        if (suspense.isHydrating) {
+          suspense.isHydrating = false;
+        } else if (!resume) {
+          const delayEnter = activeBranch && pendingBranch.transition && pendingBranch.transition.mode === "out-in";
+          if (delayEnter) {
+            activeBranch.transition.afterLeave = () => {
+              if (pendingId === suspense.pendingId) {
+                move(pendingBranch, container2, anchor2, 0);
+              }
+            };
+          }
+          let { anchor: anchor2 } = suspense;
+          if (activeBranch) {
+            anchor2 = next(activeBranch);
+            unmount(activeBranch, parentComponent2, suspense, true);
+          }
+          if (!delayEnter) {
+            move(pendingBranch, container2, anchor2, 0);
+          }
+        }
+        setActiveBranch(suspense, pendingBranch);
+        suspense.pendingBranch = null;
+        suspense.isInFallback = false;
+        let parent = suspense.parent;
+        let hasUnresolvedAncestor = false;
+        while (parent) {
+          if (parent.pendingBranch) {
+            parent.effects.push(...effects);
+            hasUnresolvedAncestor = true;
+            break;
+          }
+          parent = parent.parent;
+        }
+        if (!hasUnresolvedAncestor) {
+          queuePostFlushCb(effects);
+        }
+        suspense.effects = [];
+        if (isSuspensible) {
+          if (parentSuspense && parentSuspense.pendingBranch && parentSuspenseId === parentSuspense.pendingId) {
+            parentSuspense.deps--;
+            if (parentSuspense.deps === 0 && !sync) {
+              parentSuspense.resolve();
+            }
+          }
+        }
+        triggerEvent(vnode2, "onResolve");
+      },
+      fallback(fallbackVNode) {
+        if (!suspense.pendingBranch) {
+          return;
+        }
+        const { vnode: vnode2, activeBranch, parentComponent: parentComponent2, container: container2, isSVG: isSVG2 } = suspense;
+        triggerEvent(vnode2, "onFallback");
+        const anchor2 = next(activeBranch);
+        const mountFallback = () => {
+          if (!suspense.isInFallback) {
+            return;
+          }
+          patch(
+            null,
+            fallbackVNode,
+            container2,
+            anchor2,
+            parentComponent2,
+            null,
+            // fallback tree will not have suspense context
+            isSVG2,
+            slotScopeIds,
+            optimized
+          );
+          setActiveBranch(suspense, fallbackVNode);
+        };
+        const delayEnter = fallbackVNode.transition && fallbackVNode.transition.mode === "out-in";
+        if (delayEnter) {
+          activeBranch.transition.afterLeave = mountFallback;
+        }
+        suspense.isInFallback = true;
+        unmount(
+          activeBranch,
+          parentComponent2,
+          null,
+          // no suspense so unmount hooks fire now
+          true
+          // shouldRemove
+        );
+        if (!delayEnter) {
+          mountFallback();
+        }
+      },
+      move(container2, anchor2, type) {
+        suspense.activeBranch && move(suspense.activeBranch, container2, anchor2, type);
+        suspense.container = container2;
+      },
+      next() {
+        return suspense.activeBranch && next(suspense.activeBranch);
+      },
+      registerDep(instance, setupRenderEffect) {
+        const isInPendingSuspense = !!suspense.pendingBranch;
+        if (isInPendingSuspense) {
+          suspense.deps++;
+        }
+        const hydratedEl = instance.vnode.el;
+        instance.asyncDep.catch((err) => {
+          handleError(err, instance, 0);
+        }).then((asyncSetupResult) => {
+          if (instance.isUnmounted || suspense.isUnmounted || suspense.pendingId !== instance.suspenseId) {
+            return;
+          }
+          instance.asyncResolved = true;
+          const { vnode: vnode2 } = instance;
+          {
+            pushWarningContext(vnode2);
+          }
+          handleSetupResult(instance, asyncSetupResult, false);
+          if (hydratedEl) {
+            vnode2.el = hydratedEl;
+          }
+          const placeholder = !hydratedEl && instance.subTree.el;
+          setupRenderEffect(
+            instance,
+            vnode2,
+            // component may have been moved before resolve.
+            // if this is not a hydration, instance.subTree will be the comment
+            // placeholder.
+            parentNode(hydratedEl || instance.subTree.el),
+            // anchor will not be used if this is hydration, so only need to
+            // consider the comment placeholder case.
+            hydratedEl ? null : next(instance.subTree),
+            suspense,
+            isSVG,
+            optimized
+          );
+          if (placeholder) {
+            remove(placeholder);
+          }
+          updateHOCHostEl(instance, vnode2.el);
+          {
+            popWarningContext();
+          }
+          if (isInPendingSuspense && --suspense.deps === 0) {
+            suspense.resolve();
+          }
+        });
+      },
+      unmount(parentSuspense2, doRemove) {
+        suspense.isUnmounted = true;
+        if (suspense.activeBranch) {
+          unmount(
+            suspense.activeBranch,
+            parentComponent,
+            parentSuspense2,
+            doRemove
+          );
+        }
+        if (suspense.pendingBranch) {
+          unmount(
+            suspense.pendingBranch,
+            parentComponent,
+            parentSuspense2,
+            doRemove
+          );
+        }
+      }
+    };
+    return suspense;
+  }
+  function hydrateSuspense(node, vnode, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, rendererInternals, hydrateNode) {
+    const suspense = vnode.suspense = createSuspenseBoundary(
+      vnode,
+      parentSuspense,
+      parentComponent,
+      node.parentNode,
+      document.createElement("div"),
+      null,
+      isSVG,
+      slotScopeIds,
+      optimized,
+      rendererInternals,
+      true
+      /* hydrating */
+    );
+    const result = hydrateNode(
+      node,
+      suspense.pendingBranch = vnode.ssContent,
+      parentComponent,
+      suspense,
+      slotScopeIds,
+      optimized
+    );
+    if (suspense.deps === 0) {
+      suspense.resolve(false, true);
+    }
+    return result;
+  }
+  function normalizeSuspenseChildren(vnode) {
+    const { shapeFlag, children } = vnode;
+    const isSlotChildren = shapeFlag & 32;
+    vnode.ssContent = normalizeSuspenseSlot(
+      isSlotChildren ? children.default : children
+    );
+    vnode.ssFallback = isSlotChildren ? normalizeSuspenseSlot(children.fallback) : createVNode(Comment);
+  }
+  function normalizeSuspenseSlot(s) {
+    let block;
+    if (isFunction(s)) {
+      const trackBlock = isBlockTreeEnabled && s._c;
+      if (trackBlock) {
+        s._d = false;
+        openBlock();
+      }
+      s = s();
+      if (trackBlock) {
+        s._d = true;
+        block = currentBlock;
+        closeBlock();
+      }
+    }
+    if (isArray(s)) {
+      const singleChild = filterSingleRoot(s);
+      if (!singleChild) {
+        warn(`<Suspense> slots expect a single root node.`);
+      }
+      s = singleChild;
+    }
+    s = normalizeVNode(s);
+    if (block && !s.dynamicChildren) {
+      s.dynamicChildren = block.filter((c) => c !== s);
+    }
+    return s;
+  }
+  function queueEffectWithSuspense(fn, suspense) {
+    if (suspense && suspense.pendingBranch) {
+      if (isArray(fn)) {
+        suspense.effects.push(...fn);
+      } else {
+        suspense.effects.push(fn);
+      }
+    } else {
+      queuePostFlushCb(fn);
+    }
+  }
+  function setActiveBranch(suspense, branch) {
+    suspense.activeBranch = branch;
+    const { vnode, parentComponent } = suspense;
+    const el = vnode.el = branch.el;
+    if (parentComponent && parentComponent.subTree === vnode) {
+      parentComponent.vnode.el = el;
+      updateHOCHostEl(parentComponent, el);
+    }
+  }
+  function isVNodeSuspensible(vnode) {
+    var _a;
+    return ((_a = vnode.props) == null ? void 0 : _a.suspensible) != null && vnode.props.suspensible !== false;
+  }
+
+  function watchEffect(effect, options) {
+    return doWatch(effect, null, options);
+  }
+  function watchPostEffect(effect, options) {
+    return doWatch(
+      effect,
+      null,
+      extend({}, options, { flush: "post" })
+    );
+  }
+  function watchSyncEffect(effect, options) {
+    return doWatch(
+      effect,
+      null,
+      extend({}, options, { flush: "sync" })
+    );
+  }
+  const INITIAL_WATCHER_VALUE = {};
+  function watch(source, cb, options) {
+    if (!isFunction(cb)) {
+      warn(
+        `\`watch(fn, options?)\` signature has been moved to a separate API. Use \`watchEffect(fn, options?)\` instead. \`watch\` now only supports \`watch(source, cb, options?) signature.`
+      );
+    }
+    return doWatch(source, cb, options);
+  }
+  function doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = EMPTY_OBJ) {
+    var _a;
+    if (!cb) {
+      if (immediate !== void 0) {
+        warn(
+          `watch() "immediate" option is only respected when using the watch(source, callback, options?) signature.`
+        );
+      }
+      if (deep !== void 0) {
+        warn(
+          `watch() "deep" option is only respected when using the watch(source, callback, options?) signature.`
+        );
+      }
+    }
+    const warnInvalidSource = (s) => {
+      warn(
+        `Invalid watch source: `,
+        s,
+        `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`
+      );
+    };
+    const instance = getCurrentScope() === ((_a = currentInstance) == null ? void 0 : _a.scope) ? currentInstance : null;
+    let getter;
+    let forceTrigger = false;
+    let isMultiSource = false;
+    if (isRef(source)) {
+      getter = () => source.value;
+      forceTrigger = isShallow(source);
+    } else if (isReactive(source)) {
+      getter = () => source;
+      deep = true;
+    } else if (isArray(source)) {
+      isMultiSource = true;
+      forceTrigger = source.some((s) => isReactive(s) || isShallow(s));
+      getter = () => source.map((s) => {
+        if (isRef(s)) {
+          return s.value;
+        } else if (isReactive(s)) {
+          return traverse(s);
+        } else if (isFunction(s)) {
+          return callWithErrorHandling(s, instance, 2);
+        } else {
+          warnInvalidSource(s);
+        }
+      });
+    } else if (isFunction(source)) {
+      if (cb) {
+        getter = () => callWithErrorHandling(source, instance, 2);
+      } else {
+        getter = () => {
+          if (instance && instance.isUnmounted) {
+            return;
+          }
+          if (cleanup) {
+            cleanup();
+          }
+          return callWithAsyncErrorHandling(
+            source,
+            instance,
+            3,
+            [onCleanup]
+          );
+        };
+      }
+    } else {
+      getter = NOOP;
+      warnInvalidSource(source);
+    }
+    if (cb && deep) {
+      const baseGetter = getter;
+      getter = () => traverse(baseGetter());
+    }
+    let cleanup;
+    let onCleanup = (fn) => {
+      cleanup = effect.onStop = () => {
+        callWithErrorHandling(fn, instance, 4);
+      };
+    };
+    let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;
+    const job = () => {
+      if (!effect.active) {
+        return;
+      }
+      if (cb) {
+        const newValue = effect.run();
+        if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue)) || false) {
+          if (cleanup) {
+            cleanup();
+          }
+          callWithAsyncErrorHandling(cb, instance, 3, [
+            newValue,
+            // pass undefined as the old value when it's changed for the first time
+            oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue,
+            onCleanup
+          ]);
+          oldValue = newValue;
+        }
+      } else {
+        effect.run();
+      }
+    };
+    job.allowRecurse = !!cb;
+    let scheduler;
+    if (flush === "sync") {
+      scheduler = job;
+    } else if (flush === "post") {
+      scheduler = () => queuePostRenderEffect(job, instance && instance.suspense);
+    } else {
+      job.pre = true;
+      if (instance)
+        job.id = instance.uid;
+      scheduler = () => queueJob(job);
+    }
+    const effect = new ReactiveEffect(getter, scheduler);
+    {
+      effect.onTrack = onTrack;
+      effect.onTrigger = onTrigger;
+    }
+    if (cb) {
+      if (immediate) {
+        job();
+      } else {
+        oldValue = effect.run();
+      }
+    } else if (flush === "post") {
+      queuePostRenderEffect(
+        effect.run.bind(effect),
+        instance && instance.suspense
+      );
+    } else {
+      effect.run();
+    }
+    const unwatch = () => {
+      effect.stop();
+      if (instance && instance.scope) {
+        remove(instance.scope.effects, effect);
+      }
+    };
+    return unwatch;
+  }
+  function instanceWatch(source, value, options) {
+    const publicThis = this.proxy;
+    const getter = isString(source) ? source.includes(".") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis);
+    let cb;
+    if (isFunction(value)) {
+      cb = value;
+    } else {
+      cb = value.handler;
+      options = value;
+    }
+    const cur = currentInstance;
+    setCurrentInstance(this);
+    const res = doWatch(getter, cb.bind(publicThis), options);
+    if (cur) {
+      setCurrentInstance(cur);
+    } else {
+      unsetCurrentInstance();
+    }
+    return res;
+  }
+  function createPathGetter(ctx, path) {
+    const segments = path.split(".");
+    return () => {
+      let cur = ctx;
+      for (let i = 0; i < segments.length && cur; i++) {
+        cur = cur[segments[i]];
+      }
+      return cur;
+    };
+  }
+  function traverse(value, seen) {
+    if (!isObject(value) || value["__v_skip"]) {
+      return value;
+    }
+    seen = seen || /* @__PURE__ */ new Set();
+    if (seen.has(value)) {
+      return value;
+    }
+    seen.add(value);
+    if (isRef(value)) {
+      traverse(value.value, seen);
+    } else if (isArray(value)) {
+      for (let i = 0; i < value.length; i++) {
+        traverse(value[i], seen);
+      }
+    } else if (isSet(value) || isMap(value)) {
+      value.forEach((v) => {
+        traverse(v, seen);
+      });
+    } else if (isPlainObject(value)) {
+      for (const key in value) {
+        traverse(value[key], seen);
+      }
+    }
+    return value;
+  }
+
+  function validateDirectiveName(name) {
+    if (isBuiltInDirective(name)) {
+      warn("Do not use built-in directive ids as custom directive id: " + name);
+    }
+  }
+  function withDirectives(vnode, directives) {
+    const internalInstance = currentRenderingInstance;
+    if (internalInstance === null) {
+      warn(`withDirectives can only be used inside render functions.`);
+      return vnode;
+    }
+    const instance = getExposeProxy(internalInstance) || internalInstance.proxy;
+    const bindings = vnode.dirs || (vnode.dirs = []);
+    for (let i = 0; i < directives.length; i++) {
+      let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i];
+      if (dir) {
+        if (isFunction(dir)) {
+          dir = {
+            mounted: dir,
+            updated: dir
+          };
+        }
+        if (dir.deep) {
+          traverse(value);
+        }
+        bindings.push({
+          dir,
+          instance,
+          value,
+          oldValue: void 0,
+          arg,
+          modifiers
+        });
+      }
+    }
+    return vnode;
+  }
+  function invokeDirectiveHook(vnode, prevVNode, instance, name) {
+    const bindings = vnode.dirs;
+    const oldBindings = prevVNode && prevVNode.dirs;
+    for (let i = 0; i < bindings.length; i++) {
+      const binding = bindings[i];
+      if (oldBindings) {
+        binding.oldValue = oldBindings[i].value;
+      }
+      let hook = binding.dir[name];
+      if (hook) {
+        pauseTracking();
+        callWithAsyncErrorHandling(hook, instance, 8, [
+          vnode.el,
+          binding,
+          vnode,
+          prevVNode
+        ]);
+        resetTracking();
+      }
+    }
+  }
+
+  const leaveCbKey = Symbol("_leaveCb");
+  const enterCbKey$1 = Symbol("_enterCb");
+  function useTransitionState() {
+    const state = {
+      isMounted: false,
+      isLeaving: false,
+      isUnmounting: false,
+      leavingVNodes: /* @__PURE__ */ new Map()
+    };
+    onMounted(() => {
+      state.isMounted = true;
+    });
+    onBeforeUnmount(() => {
+      state.isUnmounting = true;
+    });
+    return state;
+  }
+  const TransitionHookValidator = [Function, Array];
+  const BaseTransitionPropsValidators = {
+    mode: String,
+    appear: Boolean,
+    persisted: Boolean,
+    // enter
+    onBeforeEnter: TransitionHookValidator,
+    onEnter: TransitionHookValidator,
+    onAfterEnter: TransitionHookValidator,
+    onEnterCancelled: TransitionHookValidator,
+    // leave
+    onBeforeLeave: TransitionHookValidator,
+    onLeave: TransitionHookValidator,
+    onAfterLeave: TransitionHookValidator,
+    onLeaveCancelled: TransitionHookValidator,
+    // appear
+    onBeforeAppear: TransitionHookValidator,
+    onAppear: TransitionHookValidator,
+    onAfterAppear: TransitionHookValidator,
+    onAppearCancelled: TransitionHookValidator
+  };
+  const BaseTransitionImpl = {
+    name: `BaseTransition`,
+    props: BaseTransitionPropsValidators,
+    setup(props, { slots }) {
+      const instance = getCurrentInstance();
+      const state = useTransitionState();
+      let prevTransitionKey;
+      return () => {
+        const children = slots.default && getTransitionRawChildren(slots.default(), true);
+        if (!children || !children.length) {
+          return;
+        }
+        let child = children[0];
+        if (children.length > 1) {
+          let hasFound = false;
+          for (const c of children) {
+            if (c.type !== Comment) {
+              if (hasFound) {
+                warn(
+                  "<transition> can only be used on a single element or component. Use <transition-group> for lists."
+                );
+                break;
+              }
+              child = c;
+              hasFound = true;
+            }
+          }
+        }
+        const rawProps = toRaw(props);
+        const { mode } = rawProps;
+        if (mode && mode !== "in-out" && mode !== "out-in" && mode !== "default") {
+          warn(`invalid <transition> mode: ${mode}`);
+        }
+        if (state.isLeaving) {
+          return emptyPlaceholder(child);
+        }
+        const innerChild = getKeepAliveChild(child);
+        if (!innerChild) {
+          return emptyPlaceholder(child);
+        }
+        const enterHooks = resolveTransitionHooks(
+          innerChild,
+          rawProps,
+          state,
+          instance
+        );
+        setTransitionHooks(innerChild, enterHooks);
+        const oldChild = instance.subTree;
+        const oldInnerChild = oldChild && getKeepAliveChild(oldChild);
+        let transitionKeyChanged = false;
+        const { getTransitionKey } = innerChild.type;
+        if (getTransitionKey) {
+          const key = getTransitionKey();
+          if (prevTransitionKey === void 0) {
+            prevTransitionKey = key;
+          } else if (key !== prevTransitionKey) {
+            prevTransitionKey = key;
+            transitionKeyChanged = true;
+          }
+        }
+        if (oldInnerChild && oldInnerChild.type !== Comment && (!isSameVNodeType(innerChild, oldInnerChild) || transitionKeyChanged)) {
+          const leavingHooks = resolveTransitionHooks(
+            oldInnerChild,
+            rawProps,
+            state,
+            instance
+          );
+          setTransitionHooks(oldInnerChild, leavingHooks);
+          if (mode === "out-in") {
+            state.isLeaving = true;
+            leavingHooks.afterLeave = () => {
+              state.isLeaving = false;
+              if (instance.update.active !== false) {
+                instance.update();
+              }
+            };
+            return emptyPlaceholder(child);
+          } else if (mode === "in-out" && innerChild.type !== Comment) {
+            leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => {
+              const leavingVNodesCache = getLeavingNodesForType(
+                state,
+                oldInnerChild
+              );
+              leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild;
+              el[leaveCbKey] = () => {
+                earlyRemove();
+                el[leaveCbKey] = void 0;
+                delete enterHooks.delayedLeave;
+              };
+              enterHooks.delayedLeave = delayedLeave;
+            };
+          }
+        }
+        return child;
+      };
+    }
+  };
+  const BaseTransition = BaseTransitionImpl;
+  function getLeavingNodesForType(state, vnode) {
+    const { leavingVNodes } = state;
+    let leavingVNodesCache = leavingVNodes.get(vnode.type);
+    if (!leavingVNodesCache) {
+      leavingVNodesCache = /* @__PURE__ */ Object.create(null);
+      leavingVNodes.set(vnode.type, leavingVNodesCache);
+    }
+    return leavingVNodesCache;
+  }
+  function resolveTransitionHooks(vnode, props, state, instance) {
+    const {
+      appear,
+      mode,
+      persisted = false,
+      onBeforeEnter,
+      onEnter,
+      onAfterEnter,
+      onEnterCancelled,
+      onBeforeLeave,
+      onLeave,
+      onAfterLeave,
+      onLeaveCancelled,
+      onBeforeAppear,
+      onAppear,
+      onAfterAppear,
+      onAppearCancelled
+    } = props;
+    const key = String(vnode.key);
+    const leavingVNodesCache = getLeavingNodesForType(state, vnode);
+    const callHook = (hook, args) => {
+      hook && callWithAsyncErrorHandling(
+        hook,
+        instance,
+        9,
+        args
+      );
+    };
+    const callAsyncHook = (hook, args) => {
+      const done = args[1];
+      callHook(hook, args);
+      if (isArray(hook)) {
+        if (hook.every((hook2) => hook2.length <= 1))
+          done();
+      } else if (hook.length <= 1) {
+        done();
+      }
+    };
+    const hooks = {
+      mode,
+      persisted,
+      beforeEnter(el) {
+        let hook = onBeforeEnter;
+        if (!state.isMounted) {
+          if (appear) {
+            hook = onBeforeAppear || onBeforeEnter;
+          } else {
+            return;
+          }
+        }
+        if (el[leaveCbKey]) {
+          el[leaveCbKey](
+            true
+            /* cancelled */
+          );
+        }
+        const leavingVNode = leavingVNodesCache[key];
+        if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el[leaveCbKey]) {
+          leavingVNode.el[leaveCbKey]();
+        }
+        callHook(hook, [el]);
+      },
+      enter(el) {
+        let hook = onEnter;
+        let afterHook = onAfterEnter;
+        let cancelHook = onEnterCancelled;
+        if (!state.isMounted) {
+          if (appear) {
+            hook = onAppear || onEnter;
+            afterHook = onAfterAppear || onAfterEnter;
+            cancelHook = onAppearCancelled || onEnterCancelled;
+          } else {
+            return;
+          }
+        }
+        let called = false;
+        const done = el[enterCbKey$1] = (cancelled) => {
+          if (called)
+            return;
+          called = true;
+          if (cancelled) {
+            callHook(cancelHook, [el]);
+          } else {
+            callHook(afterHook, [el]);
+          }
+          if (hooks.delayedLeave) {
+            hooks.delayedLeave();
+          }
+          el[enterCbKey$1] = void 0;
+        };
+        if (hook) {
+          callAsyncHook(hook, [el, done]);
+        } else {
+          done();
+        }
+      },
+      leave(el, remove) {
+        const key2 = String(vnode.key);
+        if (el[enterCbKey$1]) {
+          el[enterCbKey$1](
+            true
+            /* cancelled */
+          );
+        }
+        if (state.isUnmounting) {
+          return remove();
+        }
+        callHook(onBeforeLeave, [el]);
+        let called = false;
+        const done = el[leaveCbKey] = (cancelled) => {
+          if (called)
+            return;
+          called = true;
+          remove();
+          if (cancelled) {
+            callHook(onLeaveCancelled, [el]);
+          } else {
+            callHook(onAfterLeave, [el]);
+          }
+          el[leaveCbKey] = void 0;
+          if (leavingVNodesCache[key2] === vnode) {
+            delete leavingVNodesCache[key2];
+          }
+        };
+        leavingVNodesCache[key2] = vnode;
+        if (onLeave) {
+          callAsyncHook(onLeave, [el, done]);
+        } else {
+          done();
+        }
+      },
+      clone(vnode2) {
+        return resolveTransitionHooks(vnode2, props, state, instance);
+      }
+    };
+    return hooks;
+  }
+  function emptyPlaceholder(vnode) {
+    if (isKeepAlive(vnode)) {
+      vnode = cloneVNode(vnode);
+      vnode.children = null;
+      return vnode;
+    }
+  }
+  function getKeepAliveChild(vnode) {
+    return isKeepAlive(vnode) ? vnode.children ? vnode.children[0] : void 0 : vnode;
+  }
+  function setTransitionHooks(vnode, hooks) {
+    if (vnode.shapeFlag & 6 && vnode.component) {
+      setTransitionHooks(vnode.component.subTree, hooks);
+    } else if (vnode.shapeFlag & 128) {
+      vnode.ssContent.transition = hooks.clone(vnode.ssContent);
+      vnode.ssFallback.transition = hooks.clone(vnode.ssFallback);
+    } else {
+      vnode.transition = hooks;
+    }
+  }
+  function getTransitionRawChildren(children, keepComment = false, parentKey) {
+    let ret = [];
+    let keyedFragmentCount = 0;
+    for (let i = 0; i < children.length; i++) {
+      let child = children[i];
+      const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i);
+      if (child.type === Fragment) {
+        if (child.patchFlag & 128)
+          keyedFragmentCount++;
+        ret = ret.concat(
+          getTransitionRawChildren(child.children, keepComment, key)
+        );
+      } else if (keepComment || child.type !== Comment) {
+        ret.push(key != null ? cloneVNode(child, { key }) : child);
+      }
+    }
+    if (keyedFragmentCount > 1) {
+      for (let i = 0; i < ret.length; i++) {
+        ret[i].patchFlag = -2;
+      }
+    }
+    return ret;
+  }
+
+  /*! #__NO_SIDE_EFFECTS__ */
+  // @__NO_SIDE_EFFECTS__
+  function defineComponent(options, extraOptions) {
+    return isFunction(options) ? (
+      // #8326: extend call and options.name access are considered side-effects
+      // by Rollup, so we have to wrap it in a pure-annotated IIFE.
+      /* @__PURE__ */ (() => extend({ name: options.name }, extraOptions, { setup: options }))()
+    ) : options;
+  }
+
+  const isAsyncWrapper = (i) => !!i.type.__asyncLoader;
+  /*! #__NO_SIDE_EFFECTS__ */
+  // @__NO_SIDE_EFFECTS__
+  function defineAsyncComponent(source) {
+    if (isFunction(source)) {
+      source = { loader: source };
+    }
+    const {
+      loader,
+      loadingComponent,
+      errorComponent,
+      delay = 200,
+      timeout,
+      // undefined = never times out
+      suspensible = true,
+      onError: userOnError
+    } = source;
+    let pendingRequest = null;
+    let resolvedComp;
+    let retries = 0;
+    const retry = () => {
+      retries++;
+      pendingRequest = null;
+      return load();
+    };
+    const load = () => {
+      let thisRequest;
+      return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => {
+        err = err instanceof Error ? err : new Error(String(err));
+        if (userOnError) {
+          return new Promise((resolve, reject) => {
+            const userRetry = () => resolve(retry());
+            const userFail = () => reject(err);
+            userOnError(err, userRetry, userFail, retries + 1);
+          });
+        } else {
+          throw err;
+        }
+      }).then((comp) => {
+        if (thisRequest !== pendingRequest && pendingRequest) {
+          return pendingRequest;
+        }
+        if (!comp) {
+          warn(
+            `Async component loader resolved to undefined. If you are using retry(), make sure to return its return value.`
+          );
+        }
+        if (comp && (comp.__esModule || comp[Symbol.toStringTag] === "Module")) {
+          comp = comp.default;
+        }
+        if (comp && !isObject(comp) && !isFunction(comp)) {
+          throw new Error(`Invalid async component load result: ${comp}`);
+        }
+        resolvedComp = comp;
+        return comp;
+      }));
+    };
+    return defineComponent({
+      name: "AsyncComponentWrapper",
+      __asyncLoader: load,
+      get __asyncResolved() {
+        return resolvedComp;
+      },
+      setup() {
+        const instance = currentInstance;
+        if (resolvedComp) {
+          return () => createInnerComp(resolvedComp, instance);
+        }
+        const onError = (err) => {
+          pendingRequest = null;
+          handleError(
+            err,
+            instance,
+            13,
+            !errorComponent
+            /* do not throw in dev if user provided error component */
+          );
+        };
+        if (suspensible && instance.suspense || false) {
+          return load().then((comp) => {
+            return () => createInnerComp(comp, instance);
+          }).catch((err) => {
+            onError(err);
+            return () => errorComponent ? createVNode(errorComponent, {
+              error: err
+            }) : null;
+          });
+        }
+        const loaded = ref(false);
+        const error = ref();
+        const delayed = ref(!!delay);
+        if (delay) {
+          setTimeout(() => {
+            delayed.value = false;
+          }, delay);
+        }
+        if (timeout != null) {
+          setTimeout(() => {
+            if (!loaded.value && !error.value) {
+              const err = new Error(
+                `Async component timed out after ${timeout}ms.`
+              );
+              onError(err);
+              error.value = err;
+            }
+          }, timeout);
+        }
+        load().then(() => {
+          loaded.value = true;
+          if (instance.parent && isKeepAlive(instance.parent.vnode)) {
+            queueJob(instance.parent.update);
+          }
+        }).catch((err) => {
+          onError(err);
+          error.value = err;
+        });
+        return () => {
+          if (loaded.value && resolvedComp) {
+            return createInnerComp(resolvedComp, instance);
+          } else if (error.value && errorComponent) {
+            return createVNode(errorComponent, {
+              error: error.value
+            });
+          } else if (loadingComponent && !delayed.value) {
+            return createVNode(loadingComponent);
+          }
+        };
+      }
+    });
+  }
+  function createInnerComp(comp, parent) {
+    const { ref: ref2, props, children, ce } = parent.vnode;
+    const vnode = createVNode(comp, props, children);
+    vnode.ref = ref2;
+    vnode.ce = ce;
+    delete parent.vnode.ce;
+    return vnode;
+  }
+
+  const isKeepAlive = (vnode) => vnode.type.__isKeepAlive;
+  const KeepAliveImpl = {
+    name: `KeepAlive`,
+    // Marker for special handling inside the renderer. We are not using a ===
+    // check directly on KeepAlive in the renderer, because importing it directly
+    // would prevent it from being tree-shaken.
+    __isKeepAlive: true,
+    props: {
+      include: [String, RegExp, Array],
+      exclude: [String, RegExp, Array],
+      max: [String, Number]
+    },
+    setup(props, { slots }) {
+      const instance = getCurrentInstance();
+      const sharedContext = instance.ctx;
+      const cache = /* @__PURE__ */ new Map();
+      const keys = /* @__PURE__ */ new Set();
+      let current = null;
+      {
+        instance.__v_cache = cache;
+      }
+      const parentSuspense = instance.suspense;
+      const {
+        renderer: {
+          p: patch,
+          m: move,
+          um: _unmount,
+          o: { createElement }
+        }
+      } = sharedContext;
+      const storageContainer = createElement("div");
+      sharedContext.activate = (vnode, container, anchor, isSVG, optimized) => {
+        const instance2 = vnode.component;
+        move(vnode, container, anchor, 0, parentSuspense);
+        patch(
+          instance2.vnode,
+          vnode,
+          container,
+          anchor,
+          instance2,
+          parentSuspense,
+          isSVG,
+          vnode.slotScopeIds,
+          optimized
+        );
+        queuePostRenderEffect(() => {
+          instance2.isDeactivated = false;
+          if (instance2.a) {
+            invokeArrayFns(instance2.a);
+          }
+          const vnodeHook = vnode.props && vnode.props.onVnodeMounted;
+          if (vnodeHook) {
+            invokeVNodeHook(vnodeHook, instance2.parent, vnode);
+          }
+        }, parentSuspense);
+        {
+          devtoolsComponentAdded(instance2);
+        }
+      };
+      sharedContext.deactivate = (vnode) => {
+        const instance2 = vnode.component;
+        move(vnode, storageContainer, null, 1, parentSuspense);
+        queuePostRenderEffect(() => {
+          if (instance2.da) {
+            invokeArrayFns(instance2.da);
+          }
+          const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted;
+          if (vnodeHook) {
+            invokeVNodeHook(vnodeHook, instance2.parent, vnode);
+          }
+          instance2.isDeactivated = true;
+        }, parentSuspense);
+        {
+          devtoolsComponentAdded(instance2);
+        }
+      };
+      function unmount(vnode) {
+        resetShapeFlag(vnode);
+        _unmount(vnode, instance, parentSuspense, true);
+      }
+      function pruneCache(filter) {
+        cache.forEach((vnode, key) => {
+          const name = getComponentName(vnode.type);
+          if (name && (!filter || !filter(name))) {
+            pruneCacheEntry(key);
+          }
+        });
+      }
+      function pruneCacheEntry(key) {
+        const cached = cache.get(key);
+        if (!current || !isSameVNodeType(cached, current)) {
+          unmount(cached);
+        } else if (current) {
+          resetShapeFlag(current);
+        }
+        cache.delete(key);
+        keys.delete(key);
+      }
+      watch(
+        () => [props.include, props.exclude],
+        ([include, exclude]) => {
+          include && pruneCache((name) => matches(include, name));
+          exclude && pruneCache((name) => !matches(exclude, name));
+        },
+        // prune post-render after `current` has been updated
+        { flush: "post", deep: true }
+      );
+      let pendingCacheKey = null;
+      const cacheSubtree = () => {
+        if (pendingCacheKey != null) {
+          cache.set(pendingCacheKey, getInnerChild(instance.subTree));
+        }
+      };
+      onMounted(cacheSubtree);
+      onUpdated(cacheSubtree);
+      onBeforeUnmount(() => {
+        cache.forEach((cached) => {
+          const { subTree, suspense } = instance;
+          const vnode = getInnerChild(subTree);
+          if (cached.type === vnode.type && cached.key === vnode.key) {
+            resetShapeFlag(vnode);
+            const da = vnode.component.da;
+            da && queuePostRenderEffect(da, suspense);
+            return;
+          }
+          unmount(cached);
+        });
+      });
+      return () => {
+        pendingCacheKey = null;
+        if (!slots.default) {
+          return null;
+        }
+        const children = slots.default();
+        const rawVNode = children[0];
+        if (children.length > 1) {
+          {
+            warn(`KeepAlive should contain exactly one component child.`);
+          }
+          current = null;
+          return children;
+        } else if (!isVNode(rawVNode) || !(rawVNode.shapeFlag & 4) && !(rawVNode.shapeFlag & 128)) {
+          current = null;
+          return rawVNode;
+        }
+        let vnode = getInnerChild(rawVNode);
+        const comp = vnode.type;
+        const name = getComponentName(
+          isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : comp
+        );
+        const { include, exclude, max } = props;
+        if (include && (!name || !matches(include, name)) || exclude && name && matches(exclude, name)) {
+          current = vnode;
+          return rawVNode;
+        }
+        const key = vnode.key == null ? comp : vnode.key;
+        const cachedVNode = cache.get(key);
+        if (vnode.el) {
+          vnode = cloneVNode(vnode);
+          if (rawVNode.shapeFlag & 128) {
+            rawVNode.ssContent = vnode;
+          }
+        }
+        pendingCacheKey = key;
+        if (cachedVNode) {
+          vnode.el = cachedVNode.el;
+          vnode.component = cachedVNode.component;
+          if (vnode.transition) {
+            setTransitionHooks(vnode, vnode.transition);
+          }
+          vnode.shapeFlag |= 512;
+          keys.delete(key);
+          keys.add(key);
+        } else {
+          keys.add(key);
+          if (max && keys.size > parseInt(max, 10)) {
+            pruneCacheEntry(keys.values().next().value);
+          }
+        }
+        vnode.shapeFlag |= 256;
+        current = vnode;
+        return isSuspense(rawVNode.type) ? rawVNode : vnode;
+      };
+    }
+  };
+  const KeepAlive = KeepAliveImpl;
+  function matches(pattern, name) {
+    if (isArray(pattern)) {
+      return pattern.some((p) => matches(p, name));
+    } else if (isString(pattern)) {
+      return pattern.split(",").includes(name);
+    } else if (isRegExp(pattern)) {
+      return pattern.test(name);
+    }
+    return false;
+  }
+  function onActivated(hook, target) {
+    registerKeepAliveHook(hook, "a", target);
+  }
+  function onDeactivated(hook, target) {
+    registerKeepAliveHook(hook, "da", target);
+  }
+  function registerKeepAliveHook(hook, type, target = currentInstance) {
+    const wrappedHook = hook.__wdc || (hook.__wdc = () => {
+      let current = target;
+      while (current) {
+        if (current.isDeactivated) {
+          return;
+        }
+        current = current.parent;
+      }
+      return hook();
+    });
+    injectHook(type, wrappedHook, target);
+    if (target) {
+      let current = target.parent;
+      while (current && current.parent) {
+        if (isKeepAlive(current.parent.vnode)) {
+          injectToKeepAliveRoot(wrappedHook, type, target, current);
+        }
+        current = current.parent;
+      }
+    }
+  }
+  function injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {
+    const injected = injectHook(
+      type,
+      hook,
+      keepAliveRoot,
+      true
+      /* prepend */
+    );
+    onUnmounted(() => {
+      remove(keepAliveRoot[type], injected);
+    }, target);
+  }
+  function resetShapeFlag(vnode) {
+    vnode.shapeFlag &= ~256;
+    vnode.shapeFlag &= ~512;
+  }
+  function getInnerChild(vnode) {
+    return vnode.shapeFlag & 128 ? vnode.ssContent : vnode;
+  }
+
+  function injectHook(type, hook, target = currentInstance, prepend = false) {
+    if (target) {
+      const hooks = target[type] || (target[type] = []);
+      const wrappedHook = hook.__weh || (hook.__weh = (...args) => {
+        if (target.isUnmounted) {
+          return;
+        }
+        pauseTracking();
+        setCurrentInstance(target);
+        const res = callWithAsyncErrorHandling(hook, target, type, args);
+        unsetCurrentInstance();
+        resetTracking();
+        return res;
+      });
+      if (prepend) {
+        hooks.unshift(wrappedHook);
+      } else {
+        hooks.push(wrappedHook);
+      }
+      return wrappedHook;
+    } else {
+      const apiName = toHandlerKey(ErrorTypeStrings[type].replace(/ hook$/, ""));
+      warn(
+        `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup().` + (` If you are using async setup(), make sure to register lifecycle hooks before the first await statement.` )
+      );
+    }
+  }
+  const createHook = (lifecycle) => (hook, target = currentInstance) => (
+    // post-create lifecycle registrations are noops during SSR (except for serverPrefetch)
+    (!isInSSRComponentSetup || lifecycle === "sp") && injectHook(lifecycle, (...args) => hook(...args), target)
+  );
+  const onBeforeMount = createHook("bm");
+  const onMounted = createHook("m");
+  const onBeforeUpdate = createHook("bu");
+  const onUpdated = createHook("u");
+  const onBeforeUnmount = createHook("bum");
+  const onUnmounted = createHook("um");
+  const onServerPrefetch = createHook("sp");
+  const onRenderTriggered = createHook(
+    "rtg"
+  );
+  const onRenderTracked = createHook(
+    "rtc"
+  );
+  function onErrorCaptured(hook, target = currentInstance) {
+    injectHook("ec", hook, target);
+  }
+
+  const COMPONENTS = "components";
+  const DIRECTIVES = "directives";
+  function resolveComponent(name, maybeSelfReference) {
+    return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name;
+  }
+  const NULL_DYNAMIC_COMPONENT = Symbol.for("v-ndc");
+  function resolveDynamicComponent(component) {
+    if (isString(component)) {
+      return resolveAsset(COMPONENTS, component, false) || component;
+    } else {
+      return component || NULL_DYNAMIC_COMPONENT;
+    }
+  }
+  function resolveDirective(name) {
+    return resolveAsset(DIRECTIVES, name);
+  }
+  function resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) {
+    const instance = currentRenderingInstance || currentInstance;
+    if (instance) {
+      const Component = instance.type;
+      if (type === COMPONENTS) {
+        const selfName = getComponentName(
+          Component,
+          false
+          /* do not include inferred name to avoid breaking existing code */
+        );
+        if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) {
+          return Component;
+        }
+      }
+      const res = (
+        // local registration
+        // check instance[type] first which is resolved for options API
+        resolve(instance[type] || Component[type], name) || // global registration
+        resolve(instance.appContext[type], name)
+      );
+      if (!res && maybeSelfReference) {
+        return Component;
+      }
+      if (warnMissing && !res) {
+        const extra = type === COMPONENTS ? `
+If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``;
+        warn(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`);
+      }
+      return res;
+    } else {
+      warn(
+        `resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().`
+      );
+    }
+  }
+  function resolve(registry, name) {
+    return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]);
+  }
+
+  function renderList(source, renderItem, cache, index) {
+    let ret;
+    const cached = cache && cache[index];
+    if (isArray(source) || isString(source)) {
+      ret = new Array(source.length);
+      for (let i = 0, l = source.length; i < l; i++) {
+        ret[i] = renderItem(source[i], i, void 0, cached && cached[i]);
+      }
+    } else if (typeof source === "number") {
+      if (!Number.isInteger(source)) {
+        warn(`The v-for range expect an integer value but got ${source}.`);
+      }
+      ret = new Array(source);
+      for (let i = 0; i < source; i++) {
+        ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]);
+      }
+    } else if (isObject(source)) {
+      if (source[Symbol.iterator]) {
+        ret = Array.from(
+          source,
+          (item, i) => renderItem(item, i, void 0, cached && cached[i])
+        );
+      } else {
+        const keys = Object.keys(source);
+        ret = new Array(keys.length);
+        for (let i = 0, l = keys.length; i < l; i++) {
+          const key = keys[i];
+          ret[i] = renderItem(source[key], key, i, cached && cached[i]);
+        }
+      }
+    } else {
+      ret = [];
+    }
+    if (cache) {
+      cache[index] = ret;
+    }
+    return ret;
+  }
+
+  function createSlots(slots, dynamicSlots) {
+    for (let i = 0; i < dynamicSlots.length; i++) {
+      const slot = dynamicSlots[i];
+      if (isArray(slot)) {
+        for (let j = 0; j < slot.length; j++) {
+          slots[slot[j].name] = slot[j].fn;
+        }
+      } else if (slot) {
+        slots[slot.name] = slot.key ? (...args) => {
+          const res = slot.fn(...args);
+          if (res)
+            res.key = slot.key;
+          return res;
+        } : slot.fn;
+      }
+    }
+    return slots;
+  }
+
+  function renderSlot(slots, name, props = {}, fallback, noSlotted) {
+    if (currentRenderingInstance.isCE || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.isCE) {
+      if (name !== "default")
+        props.name = name;
+      return createVNode("slot", props, fallback && fallback());
+    }
+    let slot = slots[name];
+    if (slot && slot.length > 1) {
+      warn(
+        `SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template.`
+      );
+      slot = () => [];
+    }
+    if (slot && slot._c) {
+      slot._d = false;
+    }
+    openBlock();
+    const validSlotContent = slot && ensureValidVNode(slot(props));
+    const rendered = createBlock(
+      Fragment,
+      {
+        key: props.key || // slot content array of a dynamic conditional slot may have a branch
+        // key attached in the `createSlots` helper, respect that
+        validSlotContent && validSlotContent.key || `_${name}`
+      },
+      validSlotContent || (fallback ? fallback() : []),
+      validSlotContent && slots._ === 1 ? 64 : -2
+    );
+    if (!noSlotted && rendered.scopeId) {
+      rendered.slotScopeIds = [rendered.scopeId + "-s"];
+    }
+    if (slot && slot._c) {
+      slot._d = true;
+    }
+    return rendered;
+  }
+  function ensureValidVNode(vnodes) {
+    return vnodes.some((child) => {
+      if (!isVNode(child))
+        return true;
+      if (child.type === Comment)
+        return false;
+      if (child.type === Fragment && !ensureValidVNode(child.children))
+        return false;
+      return true;
+    }) ? vnodes : null;
+  }
+
+  function toHandlers(obj, preserveCaseIfNecessary) {
+    const ret = {};
+    if (!isObject(obj)) {
+      warn(`v-on with no argument expects an object value.`);
+      return ret;
+    }
+    for (const key in obj) {
+      ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key];
+    }
+    return ret;
+  }
+
+  const getPublicInstance = (i) => {
+    if (!i)
+      return null;
+    if (isStatefulComponent(i))
+      return getExposeProxy(i) || i.proxy;
+    return getPublicInstance(i.parent);
+  };
+  const publicPropertiesMap = (
+    // Move PURE marker to new line to workaround compiler discarding it
+    // due to type annotation
+    /* @__PURE__ */ extend(/* @__PURE__ */ Object.create(null), {
+      $: (i) => i,
+      $el: (i) => i.vnode.el,
+      $data: (i) => i.data,
+      $props: (i) => shallowReadonly(i.props) ,
+      $attrs: (i) => shallowReadonly(i.attrs) ,
+      $slots: (i) => shallowReadonly(i.slots) ,
+      $refs: (i) => shallowReadonly(i.refs) ,
+      $parent: (i) => getPublicInstance(i.parent),
+      $root: (i) => getPublicInstance(i.root),
+      $emit: (i) => i.emit,
+      $options: (i) => resolveMergedOptions(i) ,
+      $forceUpdate: (i) => i.f || (i.f = () => queueJob(i.update)),
+      $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)),
+      $watch: (i) => instanceWatch.bind(i)
+    })
+  );
+  const isReservedPrefix = (key) => key === "_" || key === "$";
+  const hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key);
+  const PublicInstanceProxyHandlers = {
+    get({ _: instance }, key) {
+      const { ctx, setupState, data, props, accessCache, type, appContext } = instance;
+      if (key === "__isVue") {
+        return true;
+      }
+      let normalizedProps;
+      if (key[0] !== "$") {
+        const n = accessCache[key];
+        if (n !== void 0) {
+          switch (n) {
+            case 1 /* SETUP */:
+              return setupState[key];
+            case 2 /* DATA */:
+              return data[key];
+            case 4 /* CONTEXT */:
+              return ctx[key];
+            case 3 /* PROPS */:
+              return props[key];
+          }
+        } else if (hasSetupBinding(setupState, key)) {
+          accessCache[key] = 1 /* SETUP */;
+          return setupState[key];
+        } else if (data !== EMPTY_OBJ && hasOwn(data, key)) {
+          accessCache[key] = 2 /* DATA */;
+          return data[key];
+        } else if (
+          // only cache other properties when instance has declared (thus stable)
+          // props
+          (normalizedProps = instance.propsOptions[0]) && hasOwn(normalizedProps, key)
+        ) {
+          accessCache[key] = 3 /* PROPS */;
+          return props[key];
+        } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {
+          accessCache[key] = 4 /* CONTEXT */;
+          return ctx[key];
+        } else if (shouldCacheAccess) {
+          accessCache[key] = 0 /* OTHER */;
+        }
+      }
+      const publicGetter = publicPropertiesMap[key];
+      let cssModule, globalProperties;
+      if (publicGetter) {
+        if (key === "$attrs") {
+          track(instance, "get", key);
+          markAttrsAccessed();
+        } else if (key === "$slots") {
+          track(instance, "get", key);
+        }
+        return publicGetter(instance);
+      } else if (
+        // css module (injected by vue-loader)
+        (cssModule = type.__cssModules) && (cssModule = cssModule[key])
+      ) {
+        return cssModule;
+      } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {
+        accessCache[key] = 4 /* CONTEXT */;
+        return ctx[key];
+      } else if (
+        // global properties
+        globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key)
+      ) {
+        {
+          return globalProperties[key];
+        }
+      } else if (currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading
+      // to infinite warning loop
+      key.indexOf("__v") !== 0)) {
+        if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) {
+          warn(
+            `Property ${JSON.stringify(
+            key
+          )} must be accessed via $data because it starts with a reserved character ("$" or "_") and is not proxied on the render context.`
+          );
+        } else if (instance === currentRenderingInstance) {
+          warn(
+            `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.`
+          );
+        }
+      }
+    },
+    set({ _: instance }, key, value) {
+      const { data, setupState, ctx } = instance;
+      if (hasSetupBinding(setupState, key)) {
+        setupState[key] = value;
+        return true;
+      } else if (setupState.__isScriptSetup && hasOwn(setupState, key)) {
+        warn(`Cannot mutate <script setup> binding "${key}" from Options API.`);
+        return false;
+      } else if (data !== EMPTY_OBJ && hasOwn(data, key)) {
+        data[key] = value;
+        return true;
+      } else if (hasOwn(instance.props, key)) {
+        warn(`Attempting to mutate prop "${key}". Props are readonly.`);
+        return false;
+      }
+      if (key[0] === "$" && key.slice(1) in instance) {
+        warn(
+          `Attempting to mutate public property "${key}". Properties starting with $ are reserved and readonly.`
+        );
+        return false;
+      } else {
+        if (key in instance.appContext.config.globalProperties) {
+          Object.defineProperty(ctx, key, {
+            enumerable: true,
+            configurable: true,
+            value
+          });
+        } else {
+          ctx[key] = value;
+        }
+      }
+      return true;
+    },
+    has({
+      _: { data, setupState, accessCache, ctx, appContext, propsOptions }
+    }, key) {
+      let normalizedProps;
+      return !!accessCache[key] || data !== EMPTY_OBJ && hasOwn(data, key) || hasSetupBinding(setupState, key) || (normalizedProps = propsOptions[0]) && hasOwn(normalizedProps, key) || hasOwn(ctx, key) || hasOwn(publicPropertiesMap, key) || hasOwn(appContext.config.globalProperties, key);
+    },
+    defineProperty(target, key, descriptor) {
+      if (descriptor.get != null) {
+        target._.accessCache[key] = 0;
+      } else if (hasOwn(descriptor, "value")) {
+        this.set(target, key, descriptor.value, null);
+      }
+      return Reflect.defineProperty(target, key, descriptor);
+    }
+  };
+  {
+    PublicInstanceProxyHandlers.ownKeys = (target) => {
+      warn(
+        `Avoid app logic that relies on enumerating keys on a component instance. The keys will be empty in production mode to avoid performance overhead.`
+      );
+      return Reflect.ownKeys(target);
+    };
+  }
+  const RuntimeCompiledPublicInstanceProxyHandlers = /* @__PURE__ */ extend(
+    {},
+    PublicInstanceProxyHandlers,
+    {
+      get(target, key) {
+        if (key === Symbol.unscopables) {
+          return;
+        }
+        return PublicInstanceProxyHandlers.get(target, key, target);
+      },
+      has(_, key) {
+        const has = key[0] !== "_" && !isGloballyAllowed(key);
+        if (!has && PublicInstanceProxyHandlers.has(_, key)) {
+          warn(
+            `Property ${JSON.stringify(
+            key
+          )} should not start with _ which is a reserved prefix for Vue internals.`
+          );
+        }
+        return has;
+      }
+    }
+  );
+  function createDevRenderContext(instance) {
+    const target = {};
+    Object.defineProperty(target, `_`, {
+      configurable: true,
+      enumerable: false,
+      get: () => instance
+    });
+    Object.keys(publicPropertiesMap).forEach((key) => {
+      Object.defineProperty(target, key, {
+        configurable: true,
+        enumerable: false,
+        get: () => publicPropertiesMap[key](instance),
+        // intercepted by the proxy so no need for implementation,
+        // but needed to prevent set errors
+        set: NOOP
+      });
+    });
+    return target;
+  }
+  function exposePropsOnRenderContext(instance) {
+    const {
+      ctx,
+      propsOptions: [propsOptions]
+    } = instance;
+    if (propsOptions) {
+      Object.keys(propsOptions).forEach((key) => {
+        Object.defineProperty(ctx, key, {
+          enumerable: true,
+          configurable: true,
+          get: () => instance.props[key],
+          set: NOOP
+        });
+      });
+    }
+  }
+  function exposeSetupStateOnRenderContext(instance) {
+    const { ctx, setupState } = instance;
+    Object.keys(toRaw(setupState)).forEach((key) => {
+      if (!setupState.__isScriptSetup) {
+        if (isReservedPrefix(key[0])) {
+          warn(
+            `setup() return property ${JSON.stringify(
+            key
+          )} should not start with "$" or "_" which are reserved prefixes for Vue internals.`
+          );
+          return;
+        }
+        Object.defineProperty(ctx, key, {
+          enumerable: true,
+          configurable: true,
+          get: () => setupState[key],
+          set: NOOP
+        });
+      }
+    });
+  }
+
+  const warnRuntimeUsage = (method) => warn(
+    `${method}() is a compiler-hint helper that is only usable inside <script setup> of a single file component. Its arguments should be compiled away and passing it at runtime has no effect.`
+  );
+  function defineProps() {
+    {
+      warnRuntimeUsage(`defineProps`);
+    }
+    return null;
+  }
+  function defineEmits() {
+    {
+      warnRuntimeUsage(`defineEmits`);
+    }
+    return null;
+  }
+  function defineExpose(exposed) {
+    {
+      warnRuntimeUsage(`defineExpose`);
+    }
+  }
+  function defineOptions(options) {
+    {
+      warnRuntimeUsage(`defineOptions`);
+    }
+  }
+  function defineSlots() {
+    {
+      warnRuntimeUsage(`defineSlots`);
+    }
+    return null;
+  }
+  function defineModel() {
+    {
+      warnRuntimeUsage("defineModel");
+    }
+  }
+  function withDefaults(props, defaults) {
+    {
+      warnRuntimeUsage(`withDefaults`);
+    }
+    return null;
+  }
+  function useSlots() {
+    return getContext().slots;
+  }
+  function useAttrs() {
+    return getContext().attrs;
+  }
+  function useModel(props, name, options) {
+    const i = getCurrentInstance();
+    if (!i) {
+      warn(`useModel() called without active instance.`);
+      return ref();
+    }
+    if (!i.propsOptions[0][name]) {
+      warn(`useModel() called with prop "${name}" which is not declared.`);
+      return ref();
+    }
+    if (options && options.local) {
+      const proxy = ref(props[name]);
+      watch(
+        () => props[name],
+        (v) => proxy.value = v
+      );
+      watch(proxy, (value) => {
+        if (value !== props[name]) {
+          i.emit(`update:${name}`, value);
+        }
+      });
+      return proxy;
+    } else {
+      return {
+        __v_isRef: true,
+        get value() {
+          return props[name];
+        },
+        set value(value) {
+          i.emit(`update:${name}`, value);
+        }
+      };
+    }
+  }
+  function getContext() {
+    const i = getCurrentInstance();
+    if (!i) {
+      warn(`useContext() called without active instance.`);
+    }
+    return i.setupContext || (i.setupContext = createSetupContext(i));
+  }
+  function normalizePropsOrEmits(props) {
+    return isArray(props) ? props.reduce(
+      (normalized, p) => (normalized[p] = null, normalized),
+      {}
+    ) : props;
+  }
+  function mergeDefaults(raw, defaults) {
+    const props = normalizePropsOrEmits(raw);
+    for (const key in defaults) {
+      if (key.startsWith("__skip"))
+        continue;
+      let opt = props[key];
+      if (opt) {
+        if (isArray(opt) || isFunction(opt)) {
+          opt = props[key] = { type: opt, default: defaults[key] };
+        } else {
+          opt.default = defaults[key];
+        }
+      } else if (opt === null) {
+        opt = props[key] = { default: defaults[key] };
+      } else {
+        warn(`props default key "${key}" has no corresponding declaration.`);
+      }
+      if (opt && defaults[`__skip_${key}`]) {
+        opt.skipFactory = true;
+      }
+    }
+    return props;
+  }
+  function mergeModels(a, b) {
+    if (!a || !b)
+      return a || b;
+    if (isArray(a) && isArray(b))
+      return a.concat(b);
+    return extend({}, normalizePropsOrEmits(a), normalizePropsOrEmits(b));
+  }
+  function createPropsRestProxy(props, excludedKeys) {
+    const ret = {};
+    for (const key in props) {
+      if (!excludedKeys.includes(key)) {
+        Object.defineProperty(ret, key, {
+          enumerable: true,
+          get: () => props[key]
+        });
+      }
+    }
+    return ret;
+  }
+  function withAsyncContext(getAwaitable) {
+    const ctx = getCurrentInstance();
+    if (!ctx) {
+      warn(
+        `withAsyncContext called without active current instance. This is likely a bug.`
+      );
+    }
+    let awaitable = getAwaitable();
+    unsetCurrentInstance();
+    if (isPromise(awaitable)) {
+      awaitable = awaitable.catch((e) => {
+        setCurrentInstance(ctx);
+        throw e;
+      });
+    }
+    return [awaitable, () => setCurrentInstance(ctx)];
+  }
+
+  function createDuplicateChecker() {
+    const cache = /* @__PURE__ */ Object.create(null);
+    return (type, key) => {
+      if (cache[key]) {
+        warn(`${type} property "${key}" is already defined in ${cache[key]}.`);
+      } else {
+        cache[key] = type;
+      }
+    };
+  }
+  let shouldCacheAccess = true;
+  function applyOptions(instance) {
+    const options = resolveMergedOptions(instance);
+    const publicThis = instance.proxy;
+    const ctx = instance.ctx;
+    shouldCacheAccess = false;
+    if (options.beforeCreate) {
+      callHook$1(options.beforeCreate, instance, "bc");
+    }
+    const {
+      // state
+      data: dataOptions,
+      computed: computedOptions,
+      methods,
+      watch: watchOptions,
+      provide: provideOptions,
+      inject: injectOptions,
+      // lifecycle
+      created,
+      beforeMount,
+      mounted,
+      beforeUpdate,
+      updated,
+      activated,
+      deactivated,
+      beforeDestroy,
+      beforeUnmount,
+      destroyed,
+      unmounted,
+      render,
+      renderTracked,
+      renderTriggered,
+      errorCaptured,
+      serverPrefetch,
+      // public API
+      expose,
+      inheritAttrs,
+      // assets
+      components,
+      directives,
+      filters
+    } = options;
+    const checkDuplicateProperties = createDuplicateChecker() ;
+    {
+      const [propsOptions] = instance.propsOptions;
+      if (propsOptions) {
+        for (const key in propsOptions) {
+          checkDuplicateProperties("Props" /* PROPS */, key);
+        }
+      }
+    }
+    if (injectOptions) {
+      resolveInjections(injectOptions, ctx, checkDuplicateProperties);
+    }
+    if (methods) {
+      for (const key in methods) {
+        const methodHandler = methods[key];
+        if (isFunction(methodHandler)) {
+          {
+            Object.defineProperty(ctx, key, {
+              value: methodHandler.bind(publicThis),
+              configurable: true,
+              enumerable: true,
+              writable: true
+            });
+          }
+          {
+            checkDuplicateProperties("Methods" /* METHODS */, key);
+          }
+        } else {
+          warn(
+            `Method "${key}" has type "${typeof methodHandler}" in the component definition. Did you reference the function correctly?`
+          );
+        }
+      }
+    }
+    if (dataOptions) {
+      if (!isFunction(dataOptions)) {
+        warn(
+          `The data option must be a function. Plain object usage is no longer supported.`
+        );
+      }
+      const data = dataOptions.call(publicThis, publicThis);
+      if (isPromise(data)) {
+        warn(
+          `data() returned a Promise - note data() cannot be async; If you intend to perform data fetching before component renders, use async setup() + <Suspense>.`
+        );
+      }
+      if (!isObject(data)) {
+        warn(`data() should return an object.`);
+      } else {
+        instance.data = reactive(data);
+        {
+          for (const key in data) {
+            checkDuplicateProperties("Data" /* DATA */, key);
+            if (!isReservedPrefix(key[0])) {
+              Object.defineProperty(ctx, key, {
+                configurable: true,
+                enumerable: true,
+                get: () => data[key],
+                set: NOOP
+              });
+            }
+          }
+        }
+      }
+    }
+    shouldCacheAccess = true;
+    if (computedOptions) {
+      for (const key in computedOptions) {
+        const opt = computedOptions[key];
+        const get = isFunction(opt) ? opt.bind(publicThis, publicThis) : isFunction(opt.get) ? opt.get.bind(publicThis, publicThis) : NOOP;
+        if (get === NOOP) {
+          warn(`Computed property "${key}" has no getter.`);
+        }
+        const set = !isFunction(opt) && isFunction(opt.set) ? opt.set.bind(publicThis) : () => {
+          warn(
+            `Write operation failed: computed property "${key}" is readonly.`
+          );
+        } ;
+        const c = computed({
+          get,
+          set
+        });
+        Object.defineProperty(ctx, key, {
+          enumerable: true,
+          configurable: true,
+          get: () => c.value,
+          set: (v) => c.value = v
+        });
+        {
+          checkDuplicateProperties("Computed" /* COMPUTED */, key);
+        }
+      }
+    }
+    if (watchOptions) {
+      for (const key in watchOptions) {
+        createWatcher(watchOptions[key], ctx, publicThis, key);
+      }
+    }
+    if (provideOptions) {
+      const provides = isFunction(provideOptions) ? provideOptions.call(publicThis) : provideOptions;
+      Reflect.ownKeys(provides).forEach((key) => {
+        provide(key, provides[key]);
+      });
+    }
+    if (created) {
+      callHook$1(created, instance, "c");
+    }
+    function registerLifecycleHook(register, hook) {
+      if (isArray(hook)) {
+        hook.forEach((_hook) => register(_hook.bind(publicThis)));
+      } else if (hook) {
+        register(hook.bind(publicThis));
+      }
+    }
+    registerLifecycleHook(onBeforeMount, beforeMount);
+    registerLifecycleHook(onMounted, mounted);
+    registerLifecycleHook(onBeforeUpdate, beforeUpdate);
+    registerLifecycleHook(onUpdated, updated);
+    registerLifecycleHook(onActivated, activated);
+    registerLifecycleHook(onDeactivated, deactivated);
+    registerLifecycleHook(onErrorCaptured, errorCaptured);
+    registerLifecycleHook(onRenderTracked, renderTracked);
+    registerLifecycleHook(onRenderTriggered, renderTriggered);
+    registerLifecycleHook(onBeforeUnmount, beforeUnmount);
+    registerLifecycleHook(onUnmounted, unmounted);
+    registerLifecycleHook(onServerPrefetch, serverPrefetch);
+    if (isArray(expose)) {
+      if (expose.length) {
+        const exposed = instance.exposed || (instance.exposed = {});
+        expose.forEach((key) => {
+          Object.defineProperty(exposed, key, {
+            get: () => publicThis[key],
+            set: (val) => publicThis[key] = val
+          });
+        });
+      } else if (!instance.exposed) {
+        instance.exposed = {};
+      }
+    }
+    if (render && instance.render === NOOP) {
+      instance.render = render;
+    }
+    if (inheritAttrs != null) {
+      instance.inheritAttrs = inheritAttrs;
+    }
+    if (components)
+      instance.components = components;
+    if (directives)
+      instance.directives = directives;
+  }
+  function resolveInjections(injectOptions, ctx, checkDuplicateProperties = NOOP) {
+    if (isArray(injectOptions)) {
+      injectOptions = normalizeInject(injectOptions);
+    }
+    for (const key in injectOptions) {
+      const opt = injectOptions[key];
+      let injected;
+      if (isObject(opt)) {
+        if ("default" in opt) {
+          injected = inject(
+            opt.from || key,
+            opt.default,
+            true
+            /* treat default function as factory */
+          );
+        } else {
+          injected = inject(opt.from || key);
+        }
+      } else {
+        injected = inject(opt);
+      }
+      if (isRef(injected)) {
+        Object.defineProperty(ctx, key, {
+          enumerable: true,
+          configurable: true,
+          get: () => injected.value,
+          set: (v) => injected.value = v
+        });
+      } else {
+        ctx[key] = injected;
+      }
+      {
+        checkDuplicateProperties("Inject" /* INJECT */, key);
+      }
+    }
+  }
+  function callHook$1(hook, instance, type) {
+    callWithAsyncErrorHandling(
+      isArray(hook) ? hook.map((h) => h.bind(instance.proxy)) : hook.bind(instance.proxy),
+      instance,
+      type
+    );
+  }
+  function createWatcher(raw, ctx, publicThis, key) {
+    const getter = key.includes(".") ? createPathGetter(publicThis, key) : () => publicThis[key];
+    if (isString(raw)) {
+      const handler = ctx[raw];
+      if (isFunction(handler)) {
+        watch(getter, handler);
+      } else {
+        warn(`Invalid watch handler specified by key "${raw}"`, handler);
+      }
+    } else if (isFunction(raw)) {
+      watch(getter, raw.bind(publicThis));
+    } else if (isObject(raw)) {
+      if (isArray(raw)) {
+        raw.forEach((r) => createWatcher(r, ctx, publicThis, key));
+      } else {
+        const handler = isFunction(raw.handler) ? raw.handler.bind(publicThis) : ctx[raw.handler];
+        if (isFunction(handler)) {
+          watch(getter, handler, raw);
+        } else {
+          warn(`Invalid watch handler specified by key "${raw.handler}"`, handler);
+        }
+      }
+    } else {
+      warn(`Invalid watch option: "${key}"`, raw);
+    }
+  }
+  function resolveMergedOptions(instance) {
+    const base = instance.type;
+    const { mixins, extends: extendsOptions } = base;
+    const {
+      mixins: globalMixins,
+      optionsCache: cache,
+      config: { optionMergeStrategies }
+    } = instance.appContext;
+    const cached = cache.get(base);
+    let resolved;
+    if (cached) {
+      resolved = cached;
+    } else if (!globalMixins.length && !mixins && !extendsOptions) {
+      {
+        resolved = base;
+      }
+    } else {
+      resolved = {};
+      if (globalMixins.length) {
+        globalMixins.forEach(
+          (m) => mergeOptions(resolved, m, optionMergeStrategies, true)
+        );
+      }
+      mergeOptions(resolved, base, optionMergeStrategies);
+    }
+    if (isObject(base)) {
+      cache.set(base, resolved);
+    }
+    return resolved;
+  }
+  function mergeOptions(to, from, strats, asMixin = false) {
+    const { mixins, extends: extendsOptions } = from;
+    if (extendsOptions) {
+      mergeOptions(to, extendsOptions, strats, true);
+    }
+    if (mixins) {
+      mixins.forEach(
+        (m) => mergeOptions(to, m, strats, true)
+      );
+    }
+    for (const key in from) {
+      if (asMixin && key === "expose") {
+        warn(
+          `"expose" option is ignored when declared in mixins or extends. It should only be declared in the base component itself.`
+        );
+      } else {
+        const strat = internalOptionMergeStrats[key] || strats && strats[key];
+        to[key] = strat ? strat(to[key], from[key]) : from[key];
+      }
+    }
+    return to;
+  }
+  const internalOptionMergeStrats = {
+    data: mergeDataFn,
+    props: mergeEmitsOrPropsOptions,
+    emits: mergeEmitsOrPropsOptions,
+    // objects
+    methods: mergeObjectOptions,
+    computed: mergeObjectOptions,
+    // lifecycle
+    beforeCreate: mergeAsArray$1,
+    created: mergeAsArray$1,
+    beforeMount: mergeAsArray$1,
+    mounted: mergeAsArray$1,
+    beforeUpdate: mergeAsArray$1,
+    updated: mergeAsArray$1,
+    beforeDestroy: mergeAsArray$1,
+    beforeUnmount: mergeAsArray$1,
+    destroyed: mergeAsArray$1,
+    unmounted: mergeAsArray$1,
+    activated: mergeAsArray$1,
+    deactivated: mergeAsArray$1,
+    errorCaptured: mergeAsArray$1,
+    serverPrefetch: mergeAsArray$1,
+    // assets
+    components: mergeObjectOptions,
+    directives: mergeObjectOptions,
+    // watch
+    watch: mergeWatchOptions,
+    // provide / inject
+    provide: mergeDataFn,
+    inject: mergeInject
+  };
+  function mergeDataFn(to, from) {
+    if (!from) {
+      return to;
+    }
+    if (!to) {
+      return from;
+    }
+    return function mergedDataFn() {
+      return (extend)(
+        isFunction(to) ? to.call(this, this) : to,
+        isFunction(from) ? from.call(this, this) : from
+      );
+    };
+  }
+  function mergeInject(to, from) {
+    return mergeObjectOptions(normalizeInject(to), normalizeInject(from));
+  }
+  function normalizeInject(raw) {
+    if (isArray(raw)) {
+      const res = {};
+      for (let i = 0; i < raw.length; i++) {
+        res[raw[i]] = raw[i];
+      }
+      return res;
+    }
+    return raw;
+  }
+  function mergeAsArray$1(to, from) {
+    return to ? [...new Set([].concat(to, from))] : from;
+  }
+  function mergeObjectOptions(to, from) {
+    return to ? extend(/* @__PURE__ */ Object.create(null), to, from) : from;
+  }
+  function mergeEmitsOrPropsOptions(to, from) {
+    if (to) {
+      if (isArray(to) && isArray(from)) {
+        return [.../* @__PURE__ */ new Set([...to, ...from])];
+      }
+      return extend(
+        /* @__PURE__ */ Object.create(null),
+        normalizePropsOrEmits(to),
+        normalizePropsOrEmits(from != null ? from : {})
+      );
+    } else {
+      return from;
+    }
+  }
+  function mergeWatchOptions(to, from) {
+    if (!to)
+      return from;
+    if (!from)
+      return to;
+    const merged = extend(/* @__PURE__ */ Object.create(null), to);
+    for (const key in from) {
+      merged[key] = mergeAsArray$1(to[key], from[key]);
+    }
+    return merged;
+  }
+
+  function createAppContext() {
+    return {
+      app: null,
+      config: {
+        isNativeTag: NO,
+        performance: false,
+        globalProperties: {},
+        optionMergeStrategies: {},
+        errorHandler: void 0,
+        warnHandler: void 0,
+        compilerOptions: {}
+      },
+      mixins: [],
+      components: {},
+      directives: {},
+      provides: /* @__PURE__ */ Object.create(null),
+      optionsCache: /* @__PURE__ */ new WeakMap(),
+      propsCache: /* @__PURE__ */ new WeakMap(),
+      emitsCache: /* @__PURE__ */ new WeakMap()
+    };
+  }
+  let uid$1 = 0;
+  function createAppAPI(render, hydrate) {
+    return function createApp(rootComponent, rootProps = null) {
+      if (!isFunction(rootComponent)) {
+        rootComponent = extend({}, rootComponent);
+      }
+      if (rootProps != null && !isObject(rootProps)) {
+        warn(`root props passed to app.mount() must be an object.`);
+        rootProps = null;
+      }
+      const context = createAppContext();
+      {
+        Object.defineProperty(context.config, "unwrapInjectedRef", {
+          get() {
+            return true;
+          },
+          set() {
+            warn(
+              `app.config.unwrapInjectedRef has been deprecated. 3.3 now always unwraps injected refs in Options API.`
+            );
+          }
+        });
+      }
+      const installedPlugins = /* @__PURE__ */ new WeakSet();
+      let isMounted = false;
+      const app = context.app = {
+        _uid: uid$1++,
+        _component: rootComponent,
+        _props: rootProps,
+        _container: null,
+        _context: context,
+        _instance: null,
+        version,
+        get config() {
+          return context.config;
+        },
+        set config(v) {
+          {
+            warn(
+              `app.config cannot be replaced. Modify individual options instead.`
+            );
+          }
+        },
+        use(plugin, ...options) {
+          if (installedPlugins.has(plugin)) {
+            warn(`Plugin has already been applied to target app.`);
+          } else if (plugin && isFunction(plugin.install)) {
+            installedPlugins.add(plugin);
+            plugin.install(app, ...options);
+          } else if (isFunction(plugin)) {
+            installedPlugins.add(plugin);
+            plugin(app, ...options);
+          } else {
+            warn(
+              `A plugin must either be a function or an object with an "install" function.`
+            );
+          }
+          return app;
+        },
+        mixin(mixin) {
+          {
+            if (!context.mixins.includes(mixin)) {
+              context.mixins.push(mixin);
+            } else {
+              warn(
+                "Mixin has already been applied to target app" + (mixin.name ? `: ${mixin.name}` : "")
+              );
+            }
+          }
+          return app;
+        },
+        component(name, component) {
+          {
+            validateComponentName(name, context.config);
+          }
+          if (!component) {
+            return context.components[name];
+          }
+          if (context.components[name]) {
+            warn(`Component "${name}" has already been registered in target app.`);
+          }
+          context.components[name] = component;
+          return app;
+        },
+        directive(name, directive) {
+          {
+            validateDirectiveName(name);
+          }
+          if (!directive) {
+            return context.directives[name];
+          }
+          if (context.directives[name]) {
+            warn(`Directive "${name}" has already been registered in target app.`);
+          }
+          context.directives[name] = directive;
+          return app;
+        },
+        mount(rootContainer, isHydrate, isSVG) {
+          if (!isMounted) {
+            if (rootContainer.__vue_app__) {
+              warn(
+                `There is already an app instance mounted on the host container.
+ If you want to mount another app on the same host container, you need to unmount the previous app by calling \`app.unmount()\` first.`
+              );
+            }
+            const vnode = createVNode(rootComponent, rootProps);
+            vnode.appContext = context;
+            {
+              context.reload = () => {
+                render(cloneVNode(vnode), rootContainer, isSVG);
+              };
+            }
+            if (isHydrate && hydrate) {
+              hydrate(vnode, rootContainer);
+            } else {
+              render(vnode, rootContainer, isSVG);
+            }
+            isMounted = true;
+            app._container = rootContainer;
+            rootContainer.__vue_app__ = app;
+            {
+              app._instance = vnode.component;
+              devtoolsInitApp(app, version);
+            }
+            return getExposeProxy(vnode.component) || vnode.component.proxy;
+          } else {
+            warn(
+              `App has already been mounted.
+If you want to remount the same app, move your app creation logic into a factory function and create fresh app instances for each mount - e.g. \`const createMyApp = () => createApp(App)\``
+            );
+          }
+        },
+        unmount() {
+          if (isMounted) {
+            render(null, app._container);
+            {
+              app._instance = null;
+              devtoolsUnmountApp(app);
+            }
+            delete app._container.__vue_app__;
+          } else {
+            warn(`Cannot unmount an app that is not mounted.`);
+          }
+        },
+        provide(key, value) {
+          if (key in context.provides) {
+            warn(
+              `App already provides property with key "${String(key)}". It will be overwritten with the new value.`
+            );
+          }
+          context.provides[key] = value;
+          return app;
+        },
+        runWithContext(fn) {
+          currentApp = app;
+          try {
+            return fn();
+          } finally {
+            currentApp = null;
+          }
+        }
+      };
+      return app;
+    };
+  }
+  let currentApp = null;
+
+  function provide(key, value) {
+    if (!currentInstance) {
+      {
+        warn(`provide() can only be used inside setup().`);
+      }
+    } else {
+      let provides = currentInstance.provides;
+      const parentProvides = currentInstance.parent && currentInstance.parent.provides;
+      if (parentProvides === provides) {
+        provides = currentInstance.provides = Object.create(parentProvides);
+      }
+      provides[key] = value;
+    }
+  }
+  function inject(key, defaultValue, treatDefaultAsFactory = false) {
+    const instance = currentInstance || currentRenderingInstance;
+    if (instance || currentApp) {
+      const provides = instance ? instance.parent == null ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : currentApp._context.provides;
+      if (provides && key in provides) {
+        return provides[key];
+      } else if (arguments.length > 1) {
+        return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue;
+      } else {
+        warn(`injection "${String(key)}" not found.`);
+      }
+    } else {
+      warn(`inject() can only be used inside setup() or functional components.`);
+    }
+  }
+  function hasInjectionContext() {
+    return !!(currentInstance || currentRenderingInstance || currentApp);
+  }
+
+  function initProps(instance, rawProps, isStateful, isSSR = false) {
+    const props = {};
+    const attrs = {};
+    def(attrs, InternalObjectKey, 1);
+    instance.propsDefaults = /* @__PURE__ */ Object.create(null);
+    setFullProps(instance, rawProps, props, attrs);
+    for (const key in instance.propsOptions[0]) {
+      if (!(key in props)) {
+        props[key] = void 0;
+      }
+    }
+    {
+      validateProps(rawProps || {}, props, instance);
+    }
+    if (isStateful) {
+      instance.props = isSSR ? props : shallowReactive(props);
+    } else {
+      if (!instance.type.props) {
+        instance.props = attrs;
+      } else {
+        instance.props = props;
+      }
+    }
+    instance.attrs = attrs;
+  }
+  function isInHmrContext(instance) {
+    while (instance) {
+      if (instance.type.__hmrId)
+        return true;
+      instance = instance.parent;
+    }
+  }
+  function updateProps(instance, rawProps, rawPrevProps, optimized) {
+    const {
+      props,
+      attrs,
+      vnode: { patchFlag }
+    } = instance;
+    const rawCurrentProps = toRaw(props);
+    const [options] = instance.propsOptions;
+    let hasAttrsChanged = false;
+    if (
+      // always force full diff in dev
+      // - #1942 if hmr is enabled with sfc component
+      // - vite#872 non-sfc component used by sfc component
+      !isInHmrContext(instance) && (optimized || patchFlag > 0) && !(patchFlag & 16)
+    ) {
+      if (patchFlag & 8) {
+        const propsToUpdate = instance.vnode.dynamicProps;
+        for (let i = 0; i < propsToUpdate.length; i++) {
+          let key = propsToUpdate[i];
+          if (isEmitListener(instance.emitsOptions, key)) {
+            continue;
+          }
+          const value = rawProps[key];
+          if (options) {
+            if (hasOwn(attrs, key)) {
+              if (value !== attrs[key]) {
+                attrs[key] = value;
+                hasAttrsChanged = true;
+              }
+            } else {
+              const camelizedKey = camelize(key);
+              props[camelizedKey] = resolvePropValue(
+                options,
+                rawCurrentProps,
+                camelizedKey,
+                value,
+                instance,
+                false
+                /* isAbsent */
+              );
+            }
+          } else {
+            if (value !== attrs[key]) {
+              attrs[key] = value;
+              hasAttrsChanged = true;
+            }
+          }
+        }
+      }
+    } else {
+      if (setFullProps(instance, rawProps, props, attrs)) {
+        hasAttrsChanged = true;
+      }
+      let kebabKey;
+      for (const key in rawCurrentProps) {
+        if (!rawProps || // for camelCase
+        !hasOwn(rawProps, key) && // it's possible the original props was passed in as kebab-case
+        // and converted to camelCase (#955)
+        ((kebabKey = hyphenate(key)) === key || !hasOwn(rawProps, kebabKey))) {
+          if (options) {
+            if (rawPrevProps && // for camelCase
+            (rawPrevProps[key] !== void 0 || // for kebab-case
+            rawPrevProps[kebabKey] !== void 0)) {
+              props[key] = resolvePropValue(
+                options,
+                rawCurrentProps,
+                key,
+                void 0,
+                instance,
+                true
+                /* isAbsent */
+              );
+            }
+          } else {
+            delete props[key];
+          }
+        }
+      }
+      if (attrs !== rawCurrentProps) {
+        for (const key in attrs) {
+          if (!rawProps || !hasOwn(rawProps, key) && true) {
+            delete attrs[key];
+            hasAttrsChanged = true;
+          }
+        }
+      }
+    }
+    if (hasAttrsChanged) {
+      trigger(instance, "set", "$attrs");
+    }
+    {
+      validateProps(rawProps || {}, props, instance);
+    }
+  }
+  function setFullProps(instance, rawProps, props, attrs) {
+    const [options, needCastKeys] = instance.propsOptions;
+    let hasAttrsChanged = false;
+    let rawCastValues;
+    if (rawProps) {
+      for (let key in rawProps) {
+        if (isReservedProp(key)) {
+          continue;
+        }
+        const value = rawProps[key];
+        let camelKey;
+        if (options && hasOwn(options, camelKey = camelize(key))) {
+          if (!needCastKeys || !needCastKeys.includes(camelKey)) {
+            props[camelKey] = value;
+          } else {
+            (rawCastValues || (rawCastValues = {}))[camelKey] = value;
+          }
+        } else if (!isEmitListener(instance.emitsOptions, key)) {
+          if (!(key in attrs) || value !== attrs[key]) {
+            attrs[key] = value;
+            hasAttrsChanged = true;
+          }
+        }
+      }
+    }
+    if (needCastKeys) {
+      const rawCurrentProps = toRaw(props);
+      const castValues = rawCastValues || EMPTY_OBJ;
+      for (let i = 0; i < needCastKeys.length; i++) {
+        const key = needCastKeys[i];
+        props[key] = resolvePropValue(
+          options,
+          rawCurrentProps,
+          key,
+          castValues[key],
+          instance,
+          !hasOwn(castValues, key)
+        );
+      }
+    }
+    return hasAttrsChanged;
+  }
+  function resolvePropValue(options, props, key, value, instance, isAbsent) {
+    const opt = options[key];
+    if (opt != null) {
+      const hasDefault = hasOwn(opt, "default");
+      if (hasDefault && value === void 0) {
+        const defaultValue = opt.default;
+        if (opt.type !== Function && !opt.skipFactory && isFunction(defaultValue)) {
+          const { propsDefaults } = instance;
+          if (key in propsDefaults) {
+            value = propsDefaults[key];
+          } else {
+            setCurrentInstance(instance);
+            value = propsDefaults[key] = defaultValue.call(
+              null,
+              props
+            );
+            unsetCurrentInstance();
+          }
+        } else {
+          value = defaultValue;
+        }
+      }
+      if (opt[0 /* shouldCast */]) {
+        if (isAbsent && !hasDefault) {
+          value = false;
+        } else if (opt[1 /* shouldCastTrue */] && (value === "" || value === hyphenate(key))) {
+          value = true;
+        }
+      }
+    }
+    return value;
+  }
+  function normalizePropsOptions(comp, appContext, asMixin = false) {
+    const cache = appContext.propsCache;
+    const cached = cache.get(comp);
+    if (cached) {
+      return cached;
+    }
+    const raw = comp.props;
+    const normalized = {};
+    const needCastKeys = [];
+    let hasExtends = false;
+    if (!isFunction(comp)) {
+      const extendProps = (raw2) => {
+        hasExtends = true;
+        const [props, keys] = normalizePropsOptions(raw2, appContext, true);
+        extend(normalized, props);
+        if (keys)
+          needCastKeys.push(...keys);
+      };
+      if (!asMixin && appContext.mixins.length) {
+        appContext.mixins.forEach(extendProps);
+      }
+      if (comp.extends) {
+        extendProps(comp.extends);
+      }
+      if (comp.mixins) {
+        comp.mixins.forEach(extendProps);
+      }
+    }
+    if (!raw && !hasExtends) {
+      if (isObject(comp)) {
+        cache.set(comp, EMPTY_ARR);
+      }
+      return EMPTY_ARR;
+    }
+    if (isArray(raw)) {
+      for (let i = 0; i < raw.length; i++) {
+        if (!isString(raw[i])) {
+          warn(`props must be strings when using array syntax.`, raw[i]);
+        }
+        const normalizedKey = camelize(raw[i]);
+        if (validatePropName(normalizedKey)) {
+          normalized[normalizedKey] = EMPTY_OBJ;
+        }
+      }
+    } else if (raw) {
+      if (!isObject(raw)) {
+        warn(`invalid props options`, raw);
+      }
+      for (const key in raw) {
+        const normalizedKey = camelize(key);
+        if (validatePropName(normalizedKey)) {
+          const opt = raw[key];
+          const prop = normalized[normalizedKey] = isArray(opt) || isFunction(opt) ? { type: opt } : extend({}, opt);
+          if (prop) {
+            const booleanIndex = getTypeIndex(Boolean, prop.type);
+            const stringIndex = getTypeIndex(String, prop.type);
+            prop[0 /* shouldCast */] = booleanIndex > -1;
+            prop[1 /* shouldCastTrue */] = stringIndex < 0 || booleanIndex < stringIndex;
+            if (booleanIndex > -1 || hasOwn(prop, "default")) {
+              needCastKeys.push(normalizedKey);
+            }
+          }
+        }
+      }
+    }
+    const res = [normalized, needCastKeys];
+    if (isObject(comp)) {
+      cache.set(comp, res);
+    }
+    return res;
+  }
+  function validatePropName(key) {
+    if (key[0] !== "$") {
+      return true;
+    } else {
+      warn(`Invalid prop name: "${key}" is a reserved property.`);
+    }
+    return false;
+  }
+  function getType(ctor) {
+    const match = ctor && ctor.toString().match(/^\s*(function|class) (\w+)/);
+    return match ? match[2] : ctor === null ? "null" : "";
+  }
+  function isSameType(a, b) {
+    return getType(a) === getType(b);
+  }
+  function getTypeIndex(type, expectedTypes) {
+    if (isArray(expectedTypes)) {
+      return expectedTypes.findIndex((t) => isSameType(t, type));
+    } else if (isFunction(expectedTypes)) {
+      return isSameType(expectedTypes, type) ? 0 : -1;
+    }
+    return -1;
+  }
+  function validateProps(rawProps, props, instance) {
+    const resolvedValues = toRaw(props);
+    const options = instance.propsOptions[0];
+    for (const key in options) {
+      let opt = options[key];
+      if (opt == null)
+        continue;
+      validateProp(
+        key,
+        resolvedValues[key],
+        opt,
+        !hasOwn(rawProps, key) && !hasOwn(rawProps, hyphenate(key))
+      );
+    }
+  }
+  function validateProp(name, value, prop, isAbsent) {
+    const { type, required, validator, skipCheck } = prop;
+    if (required && isAbsent) {
+      warn('Missing required prop: "' + name + '"');
+      return;
+    }
+    if (value == null && !required) {
+      return;
+    }
+    if (type != null && type !== true && !skipCheck) {
+      let isValid = false;
+      const types = isArray(type) ? type : [type];
+      const expectedTypes = [];
+      for (let i = 0; i < types.length && !isValid; i++) {
+        const { valid, expectedType } = assertType(value, types[i]);
+        expectedTypes.push(expectedType || "");
+        isValid = valid;
+      }
+      if (!isValid) {
+        warn(getInvalidTypeMessage(name, value, expectedTypes));
+        return;
+      }
+    }
+    if (validator && !validator(value)) {
+      warn('Invalid prop: custom validator check failed for prop "' + name + '".');
+    }
+  }
+  const isSimpleType = /* @__PURE__ */ makeMap(
+    "String,Number,Boolean,Function,Symbol,BigInt"
+  );
+  function assertType(value, type) {
+    let valid;
+    const expectedType = getType(type);
+    if (isSimpleType(expectedType)) {
+      const t = typeof value;
+      valid = t === expectedType.toLowerCase();
+      if (!valid && t === "object") {
+        valid = value instanceof type;
+      }
+    } else if (expectedType === "Object") {
+      valid = isObject(value);
+    } else if (expectedType === "Array") {
+      valid = isArray(value);
+    } else if (expectedType === "null") {
+      valid = value === null;
+    } else {
+      valid = value instanceof type;
+    }
+    return {
+      valid,
+      expectedType
+    };
+  }
+  function getInvalidTypeMessage(name, value, expectedTypes) {
+    let message = `Invalid prop: type check failed for prop "${name}". Expected ${expectedTypes.map(capitalize).join(" | ")}`;
+    const expectedType = expectedTypes[0];
+    const receivedType = toRawType(value);
+    const expectedValue = styleValue(value, expectedType);
+    const receivedValue = styleValue(value, receivedType);
+    if (expectedTypes.length === 1 && isExplicable(expectedType) && !isBoolean(expectedType, receivedType)) {
+      message += ` with value ${expectedValue}`;
+    }
+    message += `, got ${receivedType} `;
+    if (isExplicable(receivedType)) {
+      message += `with value ${receivedValue}.`;
+    }
+    return message;
+  }
+  function styleValue(value, type) {
+    if (type === "String") {
+      return `"${value}"`;
+    } else if (type === "Number") {
+      return `${Number(value)}`;
+    } else {
+      return `${value}`;
+    }
+  }
+  function isExplicable(type) {
+    const explicitTypes = ["string", "number", "boolean"];
+    return explicitTypes.some((elem) => type.toLowerCase() === elem);
+  }
+  function isBoolean(...args) {
+    return args.some((elem) => elem.toLowerCase() === "boolean");
+  }
+
+  const isInternalKey = (key) => key[0] === "_" || key === "$stable";
+  const normalizeSlotValue = (value) => isArray(value) ? value.map(normalizeVNode) : [normalizeVNode(value)];
+  const normalizeSlot = (key, rawSlot, ctx) => {
+    if (rawSlot._n) {
+      return rawSlot;
+    }
+    const normalized = withCtx((...args) => {
+      if (currentInstance) {
+        warn(
+          `Slot "${key}" invoked outside of the render function: this will not track dependencies used in the slot. Invoke the slot function inside the render function instead.`
+        );
+      }
+      return normalizeSlotValue(rawSlot(...args));
+    }, ctx);
+    normalized._c = false;
+    return normalized;
+  };
+  const normalizeObjectSlots = (rawSlots, slots, instance) => {
+    const ctx = rawSlots._ctx;
+    for (const key in rawSlots) {
+      if (isInternalKey(key))
+        continue;
+      const value = rawSlots[key];
+      if (isFunction(value)) {
+        slots[key] = normalizeSlot(key, value, ctx);
+      } else if (value != null) {
+        {
+          warn(
+            `Non-function value encountered for slot "${key}". Prefer function slots for better performance.`
+          );
+        }
+        const normalized = normalizeSlotValue(value);
+        slots[key] = () => normalized;
+      }
+    }
+  };
+  const normalizeVNodeSlots = (instance, children) => {
+    if (!isKeepAlive(instance.vnode) && true) {
+      warn(
+        `Non-function value encountered for default slot. Prefer function slots for better performance.`
+      );
+    }
+    const normalized = normalizeSlotValue(children);
+    instance.slots.default = () => normalized;
+  };
+  const initSlots = (instance, children) => {
+    if (instance.vnode.shapeFlag & 32) {
+      const type = children._;
+      if (type) {
+        instance.slots = toRaw(children);
+        def(children, "_", type);
+      } else {
+        normalizeObjectSlots(
+          children,
+          instance.slots = {});
+      }
+    } else {
+      instance.slots = {};
+      if (children) {
+        normalizeVNodeSlots(instance, children);
+      }
+    }
+    def(instance.slots, InternalObjectKey, 1);
+  };
+  const updateSlots = (instance, children, optimized) => {
+    const { vnode, slots } = instance;
+    let needDeletionCheck = true;
+    let deletionComparisonTarget = EMPTY_OBJ;
+    if (vnode.shapeFlag & 32) {
+      const type = children._;
+      if (type) {
+        if (isHmrUpdating) {
+          extend(slots, children);
+          trigger(instance, "set", "$slots");
+        } else if (optimized && type === 1) {
+          needDeletionCheck = false;
+        } else {
+          extend(slots, children);
+          if (!optimized && type === 1) {
+            delete slots._;
+          }
+        }
+      } else {
+        needDeletionCheck = !children.$stable;
+        normalizeObjectSlots(children, slots);
+      }
+      deletionComparisonTarget = children;
+    } else if (children) {
+      normalizeVNodeSlots(instance, children);
+      deletionComparisonTarget = { default: 1 };
+    }
+    if (needDeletionCheck) {
+      for (const key in slots) {
+        if (!isInternalKey(key) && deletionComparisonTarget[key] == null) {
+          delete slots[key];
+        }
+      }
+    }
+  };
+
+  function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) {
+    if (isArray(rawRef)) {
+      rawRef.forEach(
+        (r, i) => setRef(
+          r,
+          oldRawRef && (isArray(oldRawRef) ? oldRawRef[i] : oldRawRef),
+          parentSuspense,
+          vnode,
+          isUnmount
+        )
+      );
+      return;
+    }
+    if (isAsyncWrapper(vnode) && !isUnmount) {
+      return;
+    }
+    const refValue = vnode.shapeFlag & 4 ? getExposeProxy(vnode.component) || vnode.component.proxy : vnode.el;
+    const value = isUnmount ? null : refValue;
+    const { i: owner, r: ref } = rawRef;
+    if (!owner) {
+      warn(
+        `Missing ref owner context. ref cannot be used on hoisted vnodes. A vnode with ref must be created inside the render function.`
+      );
+      return;
+    }
+    const oldRef = oldRawRef && oldRawRef.r;
+    const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs;
+    const setupState = owner.setupState;
+    if (oldRef != null && oldRef !== ref) {
+      if (isString(oldRef)) {
+        refs[oldRef] = null;
+        if (hasOwn(setupState, oldRef)) {
+          setupState[oldRef] = null;
+        }
+      } else if (isRef(oldRef)) {
+        oldRef.value = null;
+      }
+    }
+    if (isFunction(ref)) {
+      callWithErrorHandling(ref, owner, 12, [value, refs]);
+    } else {
+      const _isString = isString(ref);
+      const _isRef = isRef(ref);
+      if (_isString || _isRef) {
+        const doSet = () => {
+          if (rawRef.f) {
+            const existing = _isString ? hasOwn(setupState, ref) ? setupState[ref] : refs[ref] : ref.value;
+            if (isUnmount) {
+              isArray(existing) && remove(existing, refValue);
+            } else {
+              if (!isArray(existing)) {
+                if (_isString) {
+                  refs[ref] = [refValue];
+                  if (hasOwn(setupState, ref)) {
+                    setupState[ref] = refs[ref];
+                  }
+                } else {
+                  ref.value = [refValue];
+                  if (rawRef.k)
+                    refs[rawRef.k] = ref.value;
+                }
+              } else if (!existing.includes(refValue)) {
+                existing.push(refValue);
+              }
+            }
+          } else if (_isString) {
+            refs[ref] = value;
+            if (hasOwn(setupState, ref)) {
+              setupState[ref] = value;
+            }
+          } else if (_isRef) {
+            ref.value = value;
+            if (rawRef.k)
+              refs[rawRef.k] = value;
+          } else {
+            warn("Invalid template ref type:", ref, `(${typeof ref})`);
+          }
+        };
+        if (value) {
+          doSet.id = -1;
+          queuePostRenderEffect(doSet, parentSuspense);
+        } else {
+          doSet();
+        }
+      } else {
+        warn("Invalid template ref type:", ref, `(${typeof ref})`);
+      }
+    }
+  }
+
+  let hasMismatch = false;
+  const isSVGContainer = (container) => /svg/.test(container.namespaceURI) && container.tagName !== "foreignObject";
+  const isComment = (node) => node.nodeType === 8 /* COMMENT */;
+  function createHydrationFunctions(rendererInternals) {
+    const {
+      mt: mountComponent,
+      p: patch,
+      o: {
+        patchProp,
+        createText,
+        nextSibling,
+        parentNode,
+        remove,
+        insert,
+        createComment
+      }
+    } = rendererInternals;
+    const hydrate = (vnode, container) => {
+      if (!container.hasChildNodes()) {
+        warn(
+          `Attempting to hydrate existing markup but container is empty. Performing full mount instead.`
+        );
+        patch(null, vnode, container);
+        flushPostFlushCbs();
+        container._vnode = vnode;
+        return;
+      }
+      hasMismatch = false;
+      hydrateNode(container.firstChild, vnode, null, null, null);
+      flushPostFlushCbs();
+      container._vnode = vnode;
+      if (hasMismatch && true) {
+        console.error(`Hydration completed but contains mismatches.`);
+      }
+    };
+    const hydrateNode = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized = false) => {
+      const isFragmentStart = isComment(node) && node.data === "[";
+      const onMismatch = () => handleMismatch(
+        node,
+        vnode,
+        parentComponent,
+        parentSuspense,
+        slotScopeIds,
+        isFragmentStart
+      );
+      const { type, ref, shapeFlag, patchFlag } = vnode;
+      let domType = node.nodeType;
+      vnode.el = node;
+      if (patchFlag === -2) {
+        optimized = false;
+        vnode.dynamicChildren = null;
+      }
+      let nextNode = null;
+      switch (type) {
+        case Text:
+          if (domType !== 3 /* TEXT */) {
+            if (vnode.children === "") {
+              insert(vnode.el = createText(""), parentNode(node), node);
+              nextNode = node;
+            } else {
+              nextNode = onMismatch();
+            }
+          } else {
+            if (node.data !== vnode.children) {
+              hasMismatch = true;
+              warn(
+                `Hydration text mismatch:
+- Server rendered: ${JSON.stringify(
+                node.data
+              )}
+- Client rendered: ${JSON.stringify(vnode.children)}`
+              );
+              node.data = vnode.children;
+            }
+            nextNode = nextSibling(node);
+          }
+          break;
+        case Comment:
+          if (domType !== 8 /* COMMENT */ || isFragmentStart) {
+            nextNode = onMismatch();
+          } else {
+            nextNode = nextSibling(node);
+          }
+          break;
+        case Static:
+          if (isFragmentStart) {
+            node = nextSibling(node);
+            domType = node.nodeType;
+          }
+          if (domType === 1 /* ELEMENT */ || domType === 3 /* TEXT */) {
+            nextNode = node;
+            const needToAdoptContent = !vnode.children.length;
+            for (let i = 0; i < vnode.staticCount; i++) {
+              if (needToAdoptContent)
+                vnode.children += nextNode.nodeType === 1 /* ELEMENT */ ? nextNode.outerHTML : nextNode.data;
+              if (i === vnode.staticCount - 1) {
+                vnode.anchor = nextNode;
+              }
+              nextNode = nextSibling(nextNode);
+            }
+            return isFragmentStart ? nextSibling(nextNode) : nextNode;
+          } else {
+            onMismatch();
+          }
+          break;
+        case Fragment:
+          if (!isFragmentStart) {
+            nextNode = onMismatch();
+          } else {
+            nextNode = hydrateFragment(
+              node,
+              vnode,
+              parentComponent,
+              parentSuspense,
+              slotScopeIds,
+              optimized
+            );
+          }
+          break;
+        default:
+          if (shapeFlag & 1) {
+            if (domType !== 1 /* ELEMENT */ || vnode.type.toLowerCase() !== node.tagName.toLowerCase()) {
+              nextNode = onMismatch();
+            } else {
+              nextNode = hydrateElement(
+                node,
+                vnode,
+                parentComponent,
+                parentSuspense,
+                slotScopeIds,
+                optimized
+              );
+            }
+          } else if (shapeFlag & 6) {
+            vnode.slotScopeIds = slotScopeIds;
+            const container = parentNode(node);
+            mountComponent(
+              vnode,
+              container,
+              null,
+              parentComponent,
+              parentSuspense,
+              isSVGContainer(container),
+              optimized
+            );
+            nextNode = isFragmentStart ? locateClosingAsyncAnchor(node) : nextSibling(node);
+            if (nextNode && isComment(nextNode) && nextNode.data === "teleport end") {
+              nextNode = nextSibling(nextNode);
+            }
+            if (isAsyncWrapper(vnode)) {
+              let subTree;
+              if (isFragmentStart) {
+                subTree = createVNode(Fragment);
+                subTree.anchor = nextNode ? nextNode.previousSibling : container.lastChild;
+              } else {
+                subTree = node.nodeType === 3 ? createTextVNode("") : createVNode("div");
+              }
+              subTree.el = node;
+              vnode.component.subTree = subTree;
+            }
+          } else if (shapeFlag & 64) {
+            if (domType !== 8 /* COMMENT */) {
+              nextNode = onMismatch();
+            } else {
+              nextNode = vnode.type.hydrate(
+                node,
+                vnode,
+                parentComponent,
+                parentSuspense,
+                slotScopeIds,
+                optimized,
+                rendererInternals,
+                hydrateChildren
+              );
+            }
+          } else if (shapeFlag & 128) {
+            nextNode = vnode.type.hydrate(
+              node,
+              vnode,
+              parentComponent,
+              parentSuspense,
+              isSVGContainer(parentNode(node)),
+              slotScopeIds,
+              optimized,
+              rendererInternals,
+              hydrateNode
+            );
+          } else {
+            warn("Invalid HostVNode type:", type, `(${typeof type})`);
+          }
+      }
+      if (ref != null) {
+        setRef(ref, null, parentSuspense, vnode);
+      }
+      return nextNode;
+    };
+    const hydrateElement = (el, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {
+      optimized = optimized || !!vnode.dynamicChildren;
+      const { type, props, patchFlag, shapeFlag, dirs } = vnode;
+      const forcePatchValue = type === "input" && dirs || type === "option";
+      {
+        if (dirs) {
+          invokeDirectiveHook(vnode, null, parentComponent, "created");
+        }
+        if (props) {
+          if (forcePatchValue || !optimized || patchFlag & (16 | 32)) {
+            for (const key in props) {
+              if (forcePatchValue && key.endsWith("value") || isOn(key) && !isReservedProp(key)) {
+                patchProp(
+                  el,
+                  key,
+                  null,
+                  props[key],
+                  false,
+                  void 0,
+                  parentComponent
+                );
+              }
+            }
+          } else if (props.onClick) {
+            patchProp(
+              el,
+              "onClick",
+              null,
+              props.onClick,
+              false,
+              void 0,
+              parentComponent
+            );
+          }
+        }
+        let vnodeHooks;
+        if (vnodeHooks = props && props.onVnodeBeforeMount) {
+          invokeVNodeHook(vnodeHooks, parentComponent, vnode);
+        }
+        if (dirs) {
+          invokeDirectiveHook(vnode, null, parentComponent, "beforeMount");
+        }
+        if ((vnodeHooks = props && props.onVnodeMounted) || dirs) {
+          queueEffectWithSuspense(() => {
+            vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode);
+            dirs && invokeDirectiveHook(vnode, null, parentComponent, "mounted");
+          }, parentSuspense);
+        }
+        if (shapeFlag & 16 && // skip if element has innerHTML / textContent
+        !(props && (props.innerHTML || props.textContent))) {
+          let next = hydrateChildren(
+            el.firstChild,
+            vnode,
+            el,
+            parentComponent,
+            parentSuspense,
+            slotScopeIds,
+            optimized
+          );
+          let hasWarned = false;
+          while (next) {
+            hasMismatch = true;
+            if (!hasWarned) {
+              warn(
+                `Hydration children mismatch in <${vnode.type}>: server rendered element contains more child nodes than client vdom.`
+              );
+              hasWarned = true;
+            }
+            const cur = next;
+            next = next.nextSibling;
+            remove(cur);
+          }
+        } else if (shapeFlag & 8) {
+          if (el.textContent !== vnode.children) {
+            hasMismatch = true;
+            warn(
+              `Hydration text content mismatch in <${vnode.type}>:
+- Server rendered: ${el.textContent}
+- Client rendered: ${vnode.children}`
+            );
+            el.textContent = vnode.children;
+          }
+        }
+      }
+      return el.nextSibling;
+    };
+    const hydrateChildren = (node, parentVNode, container, parentComponent, parentSuspense, slotScopeIds, optimized) => {
+      optimized = optimized || !!parentVNode.dynamicChildren;
+      const children = parentVNode.children;
+      const l = children.length;
+      let hasWarned = false;
+      for (let i = 0; i < l; i++) {
+        const vnode = optimized ? children[i] : children[i] = normalizeVNode(children[i]);
+        if (node) {
+          node = hydrateNode(
+            node,
+            vnode,
+            parentComponent,
+            parentSuspense,
+            slotScopeIds,
+            optimized
+          );
+        } else if (vnode.type === Text && !vnode.children) {
+          continue;
+        } else {
+          hasMismatch = true;
+          if (!hasWarned) {
+            warn(
+              `Hydration children mismatch in <${container.tagName.toLowerCase()}>: server rendered element contains fewer child nodes than client vdom.`
+            );
+            hasWarned = true;
+          }
+          patch(
+            null,
+            vnode,
+            container,
+            null,
+            parentComponent,
+            parentSuspense,
+            isSVGContainer(container),
+            slotScopeIds
+          );
+        }
+      }
+      return node;
+    };
+    const hydrateFragment = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {
+      const { slotScopeIds: fragmentSlotScopeIds } = vnode;
+      if (fragmentSlotScopeIds) {
+        slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;
+      }
+      const container = parentNode(node);
+      const next = hydrateChildren(
+        nextSibling(node),
+        vnode,
+        container,
+        parentComponent,
+        parentSuspense,
+        slotScopeIds,
+        optimized
+      );
+      if (next && isComment(next) && next.data === "]") {
+        return nextSibling(vnode.anchor = next);
+      } else {
+        hasMismatch = true;
+        insert(vnode.anchor = createComment(`]`), container, next);
+        return next;
+      }
+    };
+    const handleMismatch = (node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragment) => {
+      hasMismatch = true;
+      warn(
+        `Hydration node mismatch:
+- Client vnode:`,
+        vnode.type,
+        `
+- Server rendered DOM:`,
+        node,
+        node.nodeType === 3 /* TEXT */ ? `(text)` : isComment(node) && node.data === "[" ? `(start of fragment)` : ``
+      );
+      vnode.el = null;
+      if (isFragment) {
+        const end = locateClosingAsyncAnchor(node);
+        while (true) {
+          const next2 = nextSibling(node);
+          if (next2 && next2 !== end) {
+            remove(next2);
+          } else {
+            break;
+          }
+        }
+      }
+      const next = nextSibling(node);
+      const container = parentNode(node);
+      remove(node);
+      patch(
+        null,
+        vnode,
+        container,
+        next,
+        parentComponent,
+        parentSuspense,
+        isSVGContainer(container),
+        slotScopeIds
+      );
+      return next;
+    };
+    const locateClosingAsyncAnchor = (node) => {
+      let match = 0;
+      while (node) {
+        node = nextSibling(node);
+        if (node && isComment(node)) {
+          if (node.data === "[")
+            match++;
+          if (node.data === "]") {
+            if (match === 0) {
+              return nextSibling(node);
+            } else {
+              match--;
+            }
+          }
+        }
+      }
+      return node;
+    };
+    return [hydrate, hydrateNode];
+  }
+
+  let supported;
+  let perf;
+  function startMeasure(instance, type) {
+    if (instance.appContext.config.performance && isSupported()) {
+      perf.mark(`vue-${type}-${instance.uid}`);
+    }
+    {
+      devtoolsPerfStart(instance, type, isSupported() ? perf.now() : Date.now());
+    }
+  }
+  function endMeasure(instance, type) {
+    if (instance.appContext.config.performance && isSupported()) {
+      const startTag = `vue-${type}-${instance.uid}`;
+      const endTag = startTag + `:end`;
+      perf.mark(endTag);
+      perf.measure(
+        `<${formatComponentName(instance, instance.type)}> ${type}`,
+        startTag,
+        endTag
+      );
+      perf.clearMarks(startTag);
+      perf.clearMarks(endTag);
+    }
+    {
+      devtoolsPerfEnd(instance, type, isSupported() ? perf.now() : Date.now());
+    }
+  }
+  function isSupported() {
+    if (supported !== void 0) {
+      return supported;
+    }
+    if (typeof window !== "undefined" && window.performance) {
+      supported = true;
+      perf = window.performance;
+    } else {
+      supported = false;
+    }
+    return supported;
+  }
+
+  const queuePostRenderEffect = queueEffectWithSuspense ;
+  function createRenderer(options) {
+    return baseCreateRenderer(options);
+  }
+  function createHydrationRenderer(options) {
+    return baseCreateRenderer(options, createHydrationFunctions);
+  }
+  function baseCreateRenderer(options, createHydrationFns) {
+    const target = getGlobalThis();
+    target.__VUE__ = true;
+    {
+      setDevtoolsHook(target.__VUE_DEVTOOLS_GLOBAL_HOOK__, target);
+    }
+    const {
+      insert: hostInsert,
+      remove: hostRemove,
+      patchProp: hostPatchProp,
+      createElement: hostCreateElement,
+      createText: hostCreateText,
+      createComment: hostCreateComment,
+      setText: hostSetText,
+      setElementText: hostSetElementText,
+      parentNode: hostParentNode,
+      nextSibling: hostNextSibling,
+      setScopeId: hostSetScopeId = NOOP,
+      insertStaticContent: hostInsertStaticContent
+    } = options;
+    const patch = (n1, n2, container, anchor = null, parentComponent = null, parentSuspense = null, isSVG = false, slotScopeIds = null, optimized = isHmrUpdating ? false : !!n2.dynamicChildren) => {
+      if (n1 === n2) {
+        return;
+      }
+      if (n1 && !isSameVNodeType(n1, n2)) {
+        anchor = getNextHostNode(n1);
+        unmount(n1, parentComponent, parentSuspense, true);
+        n1 = null;
+      }
+      if (n2.patchFlag === -2) {
+        optimized = false;
+        n2.dynamicChildren = null;
+      }
+      const { type, ref, shapeFlag } = n2;
+      switch (type) {
+        case Text:
+          processText(n1, n2, container, anchor);
+          break;
+        case Comment:
+          processCommentNode(n1, n2, container, anchor);
+          break;
+        case Static:
+          if (n1 == null) {
+            mountStaticNode(n2, container, anchor, isSVG);
+          } else {
+            patchStaticNode(n1, n2, container, isSVG);
+          }
+          break;
+        case Fragment:
+          processFragment(
+            n1,
+            n2,
+            container,
+            anchor,
+            parentComponent,
+            parentSuspense,
+            isSVG,
+            slotScopeIds,
+            optimized
+          );
+          break;
+        default:
+          if (shapeFlag & 1) {
+            processElement(
+              n1,
+              n2,
+              container,
+              anchor,
+              parentComponent,
+              parentSuspense,
+              isSVG,
+              slotScopeIds,
+              optimized
+            );
+          } else if (shapeFlag & 6) {
+            processComponent(
+              n1,
+              n2,
+              container,
+              anchor,
+              parentComponent,
+              parentSuspense,
+              isSVG,
+              slotScopeIds,
+              optimized
+            );
+          } else if (shapeFlag & 64) {
+            type.process(
+              n1,
+              n2,
+              container,
+              anchor,
+              parentComponent,
+              parentSuspense,
+              isSVG,
+              slotScopeIds,
+              optimized,
+              internals
+            );
+          } else if (shapeFlag & 128) {
+            type.process(
+              n1,
+              n2,
+              container,
+              anchor,
+              parentComponent,
+              parentSuspense,
+              isSVG,
+              slotScopeIds,
+              optimized,
+              internals
+            );
+          } else {
+            warn("Invalid VNode type:", type, `(${typeof type})`);
+          }
+      }
+      if (ref != null && parentComponent) {
+        setRef(ref, n1 && n1.ref, parentSuspense, n2 || n1, !n2);
+      }
+    };
+    const processText = (n1, n2, container, anchor) => {
+      if (n1 == null) {
+        hostInsert(
+          n2.el = hostCreateText(n2.children),
+          container,
+          anchor
+        );
+      } else {
+        const el = n2.el = n1.el;
+        if (n2.children !== n1.children) {
+          hostSetText(el, n2.children);
+        }
+      }
+    };
+    const processCommentNode = (n1, n2, container, anchor) => {
+      if (n1 == null) {
+        hostInsert(
+          n2.el = hostCreateComment(n2.children || ""),
+          container,
+          anchor
+        );
+      } else {
+        n2.el = n1.el;
+      }
+    };
+    const mountStaticNode = (n2, container, anchor, isSVG) => {
+      [n2.el, n2.anchor] = hostInsertStaticContent(
+        n2.children,
+        container,
+        anchor,
+        isSVG,
+        n2.el,
+        n2.anchor
+      );
+    };
+    const patchStaticNode = (n1, n2, container, isSVG) => {
+      if (n2.children !== n1.children) {
+        const anchor = hostNextSibling(n1.anchor);
+        removeStaticNode(n1);
+        [n2.el, n2.anchor] = hostInsertStaticContent(
+          n2.children,
+          container,
+          anchor,
+          isSVG
+        );
+      } else {
+        n2.el = n1.el;
+        n2.anchor = n1.anchor;
+      }
+    };
+    const moveStaticNode = ({ el, anchor }, container, nextSibling) => {
+      let next;
+      while (el && el !== anchor) {
+        next = hostNextSibling(el);
+        hostInsert(el, container, nextSibling);
+        el = next;
+      }
+      hostInsert(anchor, container, nextSibling);
+    };
+    const removeStaticNode = ({ el, anchor }) => {
+      let next;
+      while (el && el !== anchor) {
+        next = hostNextSibling(el);
+        hostRemove(el);
+        el = next;
+      }
+      hostRemove(anchor);
+    };
+    const processElement = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {
+      isSVG = isSVG || n2.type === "svg";
+      if (n1 == null) {
+        mountElement(
+          n2,
+          container,
+          anchor,
+          parentComponent,
+          parentSuspense,
+          isSVG,
+          slotScopeIds,
+          optimized
+        );
+      } else {
+        patchElement(
+          n1,
+          n2,
+          parentComponent,
+          parentSuspense,
+          isSVG,
+          slotScopeIds,
+          optimized
+        );
+      }
+    };
+    const mountElement = (vnode, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {
+      let el;
+      let vnodeHook;
+      const { type, props, shapeFlag, transition, dirs } = vnode;
+      el = vnode.el = hostCreateElement(
+        vnode.type,
+        isSVG,
+        props && props.is,
+        props
+      );
+      if (shapeFlag & 8) {
+        hostSetElementText(el, vnode.children);
+      } else if (shapeFlag & 16) {
+        mountChildren(
+          vnode.children,
+          el,
+          null,
+          parentComponent,
+          parentSuspense,
+          isSVG && type !== "foreignObject",
+          slotScopeIds,
+          optimized
+        );
+      }
+      if (dirs) {
+        invokeDirectiveHook(vnode, null, parentComponent, "created");
+      }
+      setScopeId(el, vnode, vnode.scopeId, slotScopeIds, parentComponent);
+      if (props) {
+        for (const key in props) {
+          if (key !== "value" && !isReservedProp(key)) {
+            hostPatchProp(
+              el,
+              key,
+              null,
+              props[key],
+              isSVG,
+              vnode.children,
+              parentComponent,
+              parentSuspense,
+              unmountChildren
+            );
+          }
+        }
+        if ("value" in props) {
+          hostPatchProp(el, "value", null, props.value);
+        }
+        if (vnodeHook = props.onVnodeBeforeMount) {
+          invokeVNodeHook(vnodeHook, parentComponent, vnode);
+        }
+      }
+      {
+        Object.defineProperty(el, "__vnode", {
+          value: vnode,
+          enumerable: false
+        });
+        Object.defineProperty(el, "__vueParentComponent", {
+          value: parentComponent,
+          enumerable: false
+        });
+      }
+      if (dirs) {
+        invokeDirectiveHook(vnode, null, parentComponent, "beforeMount");
+      }
+      const needCallTransitionHooks = (!parentSuspense || parentSuspense && !parentSuspense.pendingBranch) && transition && !transition.persisted;
+      if (needCallTransitionHooks) {
+        transition.beforeEnter(el);
+      }
+      hostInsert(el, container, anchor);
+      if ((vnodeHook = props && props.onVnodeMounted) || needCallTransitionHooks || dirs) {
+        queuePostRenderEffect(() => {
+          vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);
+          needCallTransitionHooks && transition.enter(el);
+          dirs && invokeDirectiveHook(vnode, null, parentComponent, "mounted");
+        }, parentSuspense);
+      }
+    };
+    const setScopeId = (el, vnode, scopeId, slotScopeIds, parentComponent) => {
+      if (scopeId) {
+        hostSetScopeId(el, scopeId);
+      }
+      if (slotScopeIds) {
+        for (let i = 0; i < slotScopeIds.length; i++) {
+          hostSetScopeId(el, slotScopeIds[i]);
+        }
+      }
+      if (parentComponent) {
+        let subTree = parentComponent.subTree;
+        if (subTree.patchFlag > 0 && subTree.patchFlag & 2048) {
+          subTree = filterSingleRoot(subTree.children) || subTree;
+        }
+        if (vnode === subTree) {
+          const parentVNode = parentComponent.vnode;
+          setScopeId(
+            el,
+            parentVNode,
+            parentVNode.scopeId,
+            parentVNode.slotScopeIds,
+            parentComponent.parent
+          );
+        }
+      }
+    };
+    const mountChildren = (children, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, start = 0) => {
+      for (let i = start; i < children.length; i++) {
+        const child = children[i] = optimized ? cloneIfMounted(children[i]) : normalizeVNode(children[i]);
+        patch(
+          null,
+          child,
+          container,
+          anchor,
+          parentComponent,
+          parentSuspense,
+          isSVG,
+          slotScopeIds,
+          optimized
+        );
+      }
+    };
+    const patchElement = (n1, n2, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {
+      const el = n2.el = n1.el;
+      let { patchFlag, dynamicChildren, dirs } = n2;
+      patchFlag |= n1.patchFlag & 16;
+      const oldProps = n1.props || EMPTY_OBJ;
+      const newProps = n2.props || EMPTY_OBJ;
+      let vnodeHook;
+      parentComponent && toggleRecurse(parentComponent, false);
+      if (vnodeHook = newProps.onVnodeBeforeUpdate) {
+        invokeVNodeHook(vnodeHook, parentComponent, n2, n1);
+      }
+      if (dirs) {
+        invokeDirectiveHook(n2, n1, parentComponent, "beforeUpdate");
+      }
+      parentComponent && toggleRecurse(parentComponent, true);
+      if (isHmrUpdating) {
+        patchFlag = 0;
+        optimized = false;
+        dynamicChildren = null;
+      }
+      const areChildrenSVG = isSVG && n2.type !== "foreignObject";
+      if (dynamicChildren) {
+        patchBlockChildren(
+          n1.dynamicChildren,
+          dynamicChildren,
+          el,
+          parentComponent,
+          parentSuspense,
+          areChildrenSVG,
+          slotScopeIds
+        );
+        {
+          traverseStaticChildren(n1, n2);
+        }
+      } else if (!optimized) {
+        patchChildren(
+          n1,
+          n2,
+          el,
+          null,
+          parentComponent,
+          parentSuspense,
+          areChildrenSVG,
+          slotScopeIds,
+          false
+        );
+      }
+      if (patchFlag > 0) {
+        if (patchFlag & 16) {
+          patchProps(
+            el,
+            n2,
+            oldProps,
+            newProps,
+            parentComponent,
+            parentSuspense,
+            isSVG
+          );
+        } else {
+          if (patchFlag & 2) {
+            if (oldProps.class !== newProps.class) {
+              hostPatchProp(el, "class", null, newProps.class, isSVG);
+            }
+          }
+          if (patchFlag & 4) {
+            hostPatchProp(el, "style", oldProps.style, newProps.style, isSVG);
+          }
+          if (patchFlag & 8) {
+            const propsToUpdate = n2.dynamicProps;
+            for (let i = 0; i < propsToUpdate.length; i++) {
+              const key = propsToUpdate[i];
+              const prev = oldProps[key];
+              const next = newProps[key];
+              if (next !== prev || key === "value") {
+                hostPatchProp(
+                  el,
+                  key,
+                  prev,
+                  next,
+                  isSVG,
+                  n1.children,
+                  parentComponent,
+                  parentSuspense,
+                  unmountChildren
+                );
+              }
+            }
+          }
+        }
+        if (patchFlag & 1) {
+          if (n1.children !== n2.children) {
+            hostSetElementText(el, n2.children);
+          }
+        }
+      } else if (!optimized && dynamicChildren == null) {
+        patchProps(
+          el,
+          n2,
+          oldProps,
+          newProps,
+          parentComponent,
+          parentSuspense,
+          isSVG
+        );
+      }
+      if ((vnodeHook = newProps.onVnodeUpdated) || dirs) {
+        queuePostRenderEffect(() => {
+          vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, n2, n1);
+          dirs && invokeDirectiveHook(n2, n1, parentComponent, "updated");
+        }, parentSuspense);
+      }
+    };
+    const patchBlockChildren = (oldChildren, newChildren, fallbackContainer, parentComponent, parentSuspense, isSVG, slotScopeIds) => {
+      for (let i = 0; i < newChildren.length; i++) {
+        const oldVNode = oldChildren[i];
+        const newVNode = newChildren[i];
+        const container = (
+          // oldVNode may be an errored async setup() component inside Suspense
+          // which will not have a mounted element
+          oldVNode.el && // - In the case of a Fragment, we need to provide the actual parent
+          // of the Fragment itself so it can move its children.
+          (oldVNode.type === Fragment || // - In the case of different nodes, there is going to be a replacement
+          // which also requires the correct parent container
+          !isSameVNodeType(oldVNode, newVNode) || // - In the case of a component, it could contain anything.
+          oldVNode.shapeFlag & (6 | 64)) ? hostParentNode(oldVNode.el) : (
+            // In other cases, the parent container is not actually used so we
+            // just pass the block element here to avoid a DOM parentNode call.
+            fallbackContainer
+          )
+        );
+        patch(
+          oldVNode,
+          newVNode,
+          container,
+          null,
+          parentComponent,
+          parentSuspense,
+          isSVG,
+          slotScopeIds,
+          true
+        );
+      }
+    };
+    const patchProps = (el, vnode, oldProps, newProps, parentComponent, parentSuspense, isSVG) => {
+      if (oldProps !== newProps) {
+        if (oldProps !== EMPTY_OBJ) {
+          for (const key in oldProps) {
+            if (!isReservedProp(key) && !(key in newProps)) {
+              hostPatchProp(
+                el,
+                key,
+                oldProps[key],
+                null,
+                isSVG,
+                vnode.children,
+                parentComponent,
+                parentSuspense,
+                unmountChildren
+              );
+            }
+          }
+        }
+        for (const key in newProps) {
+          if (isReservedProp(key))
+            continue;
+          const next = newProps[key];
+          const prev = oldProps[key];
+          if (next !== prev && key !== "value") {
+            hostPatchProp(
+              el,
+              key,
+              prev,
+              next,
+              isSVG,
+              vnode.children,
+              parentComponent,
+              parentSuspense,
+              unmountChildren
+            );
+          }
+        }
+        if ("value" in newProps) {
+          hostPatchProp(el, "value", oldProps.value, newProps.value);
+        }
+      }
+    };
+    const processFragment = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {
+      const fragmentStartAnchor = n2.el = n1 ? n1.el : hostCreateText("");
+      const fragmentEndAnchor = n2.anchor = n1 ? n1.anchor : hostCreateText("");
+      let { patchFlag, dynamicChildren, slotScopeIds: fragmentSlotScopeIds } = n2;
+      if (
+        // #5523 dev root fragment may inherit directives
+        isHmrUpdating || patchFlag & 2048
+      ) {
+        patchFlag = 0;
+        optimized = false;
+        dynamicChildren = null;
+      }
+      if (fragmentSlotScopeIds) {
+        slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;
+      }
+      if (n1 == null) {
+        hostInsert(fragmentStartAnchor, container, anchor);
+        hostInsert(fragmentEndAnchor, container, anchor);
+        mountChildren(
+          n2.children,
+          container,
+          fragmentEndAnchor,
+          parentComponent,
+          parentSuspense,
+          isSVG,
+          slotScopeIds,
+          optimized
+        );
+      } else {
+        if (patchFlag > 0 && patchFlag & 64 && dynamicChildren && // #2715 the previous fragment could've been a BAILed one as a result
+        // of renderSlot() with no valid children
+        n1.dynamicChildren) {
+          patchBlockChildren(
+            n1.dynamicChildren,
+            dynamicChildren,
+            container,
+            parentComponent,
+            parentSuspense,
+            isSVG,
+            slotScopeIds
+          );
+          {
+            traverseStaticChildren(n1, n2);
+          }
+        } else {
+          patchChildren(
+            n1,
+            n2,
+            container,
+            fragmentEndAnchor,
+            parentComponent,
+            parentSuspense,
+            isSVG,
+            slotScopeIds,
+            optimized
+          );
+        }
+      }
+    };
+    const processComponent = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {
+      n2.slotScopeIds = slotScopeIds;
+      if (n1 == null) {
+        if (n2.shapeFlag & 512) {
+          parentComponent.ctx.activate(
+            n2,
+            container,
+            anchor,
+            isSVG,
+            optimized
+          );
+        } else {
+          mountComponent(
+            n2,
+            container,
+            anchor,
+            parentComponent,
+            parentSuspense,
+            isSVG,
+            optimized
+          );
+        }
+      } else {
+        updateComponent(n1, n2, optimized);
+      }
+    };
+    const mountComponent = (initialVNode, container, anchor, parentComponent, parentSuspense, isSVG, optimized) => {
+      const instance = (initialVNode.component = createComponentInstance(
+        initialVNode,
+        parentComponent,
+        parentSuspense
+      ));
+      if (instance.type.__hmrId) {
+        registerHMR(instance);
+      }
+      {
+        pushWarningContext(initialVNode);
+        startMeasure(instance, `mount`);
+      }
+      if (isKeepAlive(initialVNode)) {
+        instance.ctx.renderer = internals;
+      }
+      {
+        {
+          startMeasure(instance, `init`);
+        }
+        setupComponent(instance);
+        {
+          endMeasure(instance, `init`);
+        }
+      }
+      if (instance.asyncDep) {
+        parentSuspense && parentSuspense.registerDep(instance, setupRenderEffect);
+        if (!initialVNode.el) {
+          const placeholder = instance.subTree = createVNode(Comment);
+          processCommentNode(null, placeholder, container, anchor);
+        }
+        return;
+      }
+      setupRenderEffect(
+        instance,
+        initialVNode,
+        container,
+        anchor,
+        parentSuspense,
+        isSVG,
+        optimized
+      );
+      {
+        popWarningContext();
+        endMeasure(instance, `mount`);
+      }
+    };
+    const updateComponent = (n1, n2, optimized) => {
+      const instance = n2.component = n1.component;
+      if (shouldUpdateComponent(n1, n2, optimized)) {
+        if (instance.asyncDep && !instance.asyncResolved) {
+          {
+            pushWarningContext(n2);
+          }
+          updateComponentPreRender(instance, n2, optimized);
+          {
+            popWarningContext();
+          }
+          return;
+        } else {
+          instance.next = n2;
+          invalidateJob(instance.update);
+          instance.update();
+        }
+      } else {
+        n2.el = n1.el;
+        instance.vnode = n2;
+      }
+    };
+    const setupRenderEffect = (instance, initialVNode, container, anchor, parentSuspense, isSVG, optimized) => {
+      const componentUpdateFn = () => {
+        if (!instance.isMounted) {
+          let vnodeHook;
+          const { el, props } = initialVNode;
+          const { bm, m, parent } = instance;
+          const isAsyncWrapperVNode = isAsyncWrapper(initialVNode);
+          toggleRecurse(instance, false);
+          if (bm) {
+            invokeArrayFns(bm);
+          }
+          if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeBeforeMount)) {
+            invokeVNodeHook(vnodeHook, parent, initialVNode);
+          }
+          toggleRecurse(instance, true);
+          if (el && hydrateNode) {
+            const hydrateSubTree = () => {
+              {
+                startMeasure(instance, `render`);
+              }
+              instance.subTree = renderComponentRoot(instance);
+              {
+                endMeasure(instance, `render`);
+              }
+              {
+                startMeasure(instance, `hydrate`);
+              }
+              hydrateNode(
+                el,
+                instance.subTree,
+                instance,
+                parentSuspense,
+                null
+              );
+              {
+                endMeasure(instance, `hydrate`);
+              }
+            };
+            if (isAsyncWrapperVNode) {
+              initialVNode.type.__asyncLoader().then(
+                // note: we are moving the render call into an async callback,
+                // which means it won't track dependencies - but it's ok because
+                // a server-rendered async wrapper is already in resolved state
+                // and it will never need to change.
+                () => !instance.isUnmounted && hydrateSubTree()
+              );
+            } else {
+              hydrateSubTree();
+            }
+          } else {
+            {
+              startMeasure(instance, `render`);
+            }
+            const subTree = instance.subTree = renderComponentRoot(instance);
+            {
+              endMeasure(instance, `render`);
+            }
+            {
+              startMeasure(instance, `patch`);
+            }
+            patch(
+              null,
+              subTree,
+              container,
+              anchor,
+              instance,
+              parentSuspense,
+              isSVG
+            );
+            {
+              endMeasure(instance, `patch`);
+            }
+            initialVNode.el = subTree.el;
+          }
+          if (m) {
+            queuePostRenderEffect(m, parentSuspense);
+          }
+          if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeMounted)) {
+            const scopedInitialVNode = initialVNode;
+            queuePostRenderEffect(
+              () => invokeVNodeHook(vnodeHook, parent, scopedInitialVNode),
+              parentSuspense
+            );
+          }
+          if (initialVNode.shapeFlag & 256 || parent && isAsyncWrapper(parent.vnode) && parent.vnode.shapeFlag & 256) {
+            instance.a && queuePostRenderEffect(instance.a, parentSuspense);
+          }
+          instance.isMounted = true;
+          {
+            devtoolsComponentAdded(instance);
+          }
+          initialVNode = container = anchor = null;
+        } else {
+          let { next, bu, u, parent, vnode } = instance;
+          let originNext = next;
+          let vnodeHook;
+          {
+            pushWarningContext(next || instance.vnode);
+          }
+          toggleRecurse(instance, false);
+          if (next) {
+            next.el = vnode.el;
+            updateComponentPreRender(instance, next, optimized);
+          } else {
+            next = vnode;
+          }
+          if (bu) {
+            invokeArrayFns(bu);
+          }
+          if (vnodeHook = next.props && next.props.onVnodeBeforeUpdate) {
+            invokeVNodeHook(vnodeHook, parent, next, vnode);
+          }
+          toggleRecurse(instance, true);
+          {
+            startMeasure(instance, `render`);
+          }
+          const nextTree = renderComponentRoot(instance);
+          {
+            endMeasure(instance, `render`);
+          }
+          const prevTree = instance.subTree;
+          instance.subTree = nextTree;
+          {
+            startMeasure(instance, `patch`);
+          }
+          patch(
+            prevTree,
+            nextTree,
+            // parent may have changed if it's in a teleport
+            hostParentNode(prevTree.el),
+            // anchor may have changed if it's in a fragment
+            getNextHostNode(prevTree),
+            instance,
+            parentSuspense,
+            isSVG
+          );
+          {
+            endMeasure(instance, `patch`);
+          }
+          next.el = nextTree.el;
+          if (originNext === null) {
+            updateHOCHostEl(instance, nextTree.el);
+          }
+          if (u) {
+            queuePostRenderEffect(u, parentSuspense);
+          }
+          if (vnodeHook = next.props && next.props.onVnodeUpdated) {
+            queuePostRenderEffect(
+              () => invokeVNodeHook(vnodeHook, parent, next, vnode),
+              parentSuspense
+            );
+          }
+          {
+            devtoolsComponentUpdated(instance);
+          }
+          {
+            popWarningContext();
+          }
+        }
+      };
+      const effect = instance.effect = new ReactiveEffect(
+        componentUpdateFn,
+        () => queueJob(update),
+        instance.scope
+        // track it in component's effect scope
+      );
+      const update = instance.update = () => effect.run();
+      update.id = instance.uid;
+      toggleRecurse(instance, true);
+      {
+        effect.onTrack = instance.rtc ? (e) => invokeArrayFns(instance.rtc, e) : void 0;
+        effect.onTrigger = instance.rtg ? (e) => invokeArrayFns(instance.rtg, e) : void 0;
+        update.ownerInstance = instance;
+      }
+      update();
+    };
+    const updateComponentPreRender = (instance, nextVNode, optimized) => {
+      nextVNode.component = instance;
+      const prevProps = instance.vnode.props;
+      instance.vnode = nextVNode;
+      instance.next = null;
+      updateProps(instance, nextVNode.props, prevProps, optimized);
+      updateSlots(instance, nextVNode.children, optimized);
+      pauseTracking();
+      flushPreFlushCbs();
+      resetTracking();
+    };
+    const patchChildren = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized = false) => {
+      const c1 = n1 && n1.children;
+      const prevShapeFlag = n1 ? n1.shapeFlag : 0;
+      const c2 = n2.children;
+      const { patchFlag, shapeFlag } = n2;
+      if (patchFlag > 0) {
+        if (patchFlag & 128) {
+          patchKeyedChildren(
+            c1,
+            c2,
+            container,
+            anchor,
+            parentComponent,
+            parentSuspense,
+            isSVG,
+            slotScopeIds,
+            optimized
+          );
+          return;
+        } else if (patchFlag & 256) {
+          patchUnkeyedChildren(
+            c1,
+            c2,
+            container,
+            anchor,
+            parentComponent,
+            parentSuspense,
+            isSVG,
+            slotScopeIds,
+            optimized
+          );
+          return;
+        }
+      }
+      if (shapeFlag & 8) {
+        if (prevShapeFlag & 16) {
+          unmountChildren(c1, parentComponent, parentSuspense);
+        }
+        if (c2 !== c1) {
+          hostSetElementText(container, c2);
+        }
+      } else {
+        if (prevShapeFlag & 16) {
+          if (shapeFlag & 16) {
+            patchKeyedChildren(
+              c1,
+              c2,
+              container,
+              anchor,
+              parentComponent,
+              parentSuspense,
+              isSVG,
+              slotScopeIds,
+              optimized
+            );
+          } else {
+            unmountChildren(c1, parentComponent, parentSuspense, true);
+          }
+        } else {
+          if (prevShapeFlag & 8) {
+            hostSetElementText(container, "");
+          }
+          if (shapeFlag & 16) {
+            mountChildren(
+              c2,
+              container,
+              anchor,
+              parentComponent,
+              parentSuspense,
+              isSVG,
+              slotScopeIds,
+              optimized
+            );
+          }
+        }
+      }
+    };
+    const patchUnkeyedChildren = (c1, c2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {
+      c1 = c1 || EMPTY_ARR;
+      c2 = c2 || EMPTY_ARR;
+      const oldLength = c1.length;
+      const newLength = c2.length;
+      const commonLength = Math.min(oldLength, newLength);
+      let i;
+      for (i = 0; i < commonLength; i++) {
+        const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);
+        patch(
+          c1[i],
+          nextChild,
+          container,
+          null,
+          parentComponent,
+          parentSuspense,
+          isSVG,
+          slotScopeIds,
+          optimized
+        );
+      }
+      if (oldLength > newLength) {
+        unmountChildren(
+          c1,
+          parentComponent,
+          parentSuspense,
+          true,
+          false,
+          commonLength
+        );
+      } else {
+        mountChildren(
+          c2,
+          container,
+          anchor,
+          parentComponent,
+          parentSuspense,
+          isSVG,
+          slotScopeIds,
+          optimized,
+          commonLength
+        );
+      }
+    };
+    const patchKeyedChildren = (c1, c2, container, parentAnchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {
+      let i = 0;
+      const l2 = c2.length;
+      let e1 = c1.length - 1;
+      let e2 = l2 - 1;
+      while (i <= e1 && i <= e2) {
+        const n1 = c1[i];
+        const n2 = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);
+        if (isSameVNodeType(n1, n2)) {
+          patch(
+            n1,
+            n2,
+            container,
+            null,
+            parentComponent,
+            parentSuspense,
+            isSVG,
+            slotScopeIds,
+            optimized
+          );
+        } else {
+          break;
+        }
+        i++;
+      }
+      while (i <= e1 && i <= e2) {
+        const n1 = c1[e1];
+        const n2 = c2[e2] = optimized ? cloneIfMounted(c2[e2]) : normalizeVNode(c2[e2]);
+        if (isSameVNodeType(n1, n2)) {
+          patch(
+            n1,
+            n2,
+            container,
+            null,
+            parentComponent,
+            parentSuspense,
+            isSVG,
+            slotScopeIds,
+            optimized
+          );
+        } else {
+          break;
+        }
+        e1--;
+        e2--;
+      }
+      if (i > e1) {
+        if (i <= e2) {
+          const nextPos = e2 + 1;
+          const anchor = nextPos < l2 ? c2[nextPos].el : parentAnchor;
+          while (i <= e2) {
+            patch(
+              null,
+              c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]),
+              container,
+              anchor,
+              parentComponent,
+              parentSuspense,
+              isSVG,
+              slotScopeIds,
+              optimized
+            );
+            i++;
+          }
+        }
+      } else if (i > e2) {
+        while (i <= e1) {
+          unmount(c1[i], parentComponent, parentSuspense, true);
+          i++;
+        }
+      } else {
+        const s1 = i;
+        const s2 = i;
+        const keyToNewIndexMap = /* @__PURE__ */ new Map();
+        for (i = s2; i <= e2; i++) {
+          const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);
+          if (nextChild.key != null) {
+            if (keyToNewIndexMap.has(nextChild.key)) {
+              warn(
+                `Duplicate keys found during update:`,
+                JSON.stringify(nextChild.key),
+                `Make sure keys are unique.`
+              );
+            }
+            keyToNewIndexMap.set(nextChild.key, i);
+          }
+        }
+        let j;
+        let patched = 0;
+        const toBePatched = e2 - s2 + 1;
+        let moved = false;
+        let maxNewIndexSoFar = 0;
+        const newIndexToOldIndexMap = new Array(toBePatched);
+        for (i = 0; i < toBePatched; i++)
+          newIndexToOldIndexMap[i] = 0;
+        for (i = s1; i <= e1; i++) {
+          const prevChild = c1[i];
+          if (patched >= toBePatched) {
+            unmount(prevChild, parentComponent, parentSuspense, true);
+            continue;
+          }
+          let newIndex;
+          if (prevChild.key != null) {
+            newIndex = keyToNewIndexMap.get(prevChild.key);
+          } else {
+            for (j = s2; j <= e2; j++) {
+              if (newIndexToOldIndexMap[j - s2] === 0 && isSameVNodeType(prevChild, c2[j])) {
+                newIndex = j;
+                break;
+              }
+            }
+          }
+          if (newIndex === void 0) {
+            unmount(prevChild, parentComponent, parentSuspense, true);
+          } else {
+            newIndexToOldIndexMap[newIndex - s2] = i + 1;
+            if (newIndex >= maxNewIndexSoFar) {
+              maxNewIndexSoFar = newIndex;
+            } else {
+              moved = true;
+            }
+            patch(
+              prevChild,
+              c2[newIndex],
+              container,
+              null,
+              parentComponent,
+              parentSuspense,
+              isSVG,
+              slotScopeIds,
+              optimized
+            );
+            patched++;
+          }
+        }
+        const increasingNewIndexSequence = moved ? getSequence(newIndexToOldIndexMap) : EMPTY_ARR;
+        j = increasingNewIndexSequence.length - 1;
+        for (i = toBePatched - 1; i >= 0; i--) {
+          const nextIndex = s2 + i;
+          const nextChild = c2[nextIndex];
+          const anchor = nextIndex + 1 < l2 ? c2[nextIndex + 1].el : parentAnchor;
+          if (newIndexToOldIndexMap[i] === 0) {
+            patch(
+              null,
+              nextChild,
+              container,
+              anchor,
+              parentComponent,
+              parentSuspense,
+              isSVG,
+              slotScopeIds,
+              optimized
+            );
+          } else if (moved) {
+            if (j < 0 || i !== increasingNewIndexSequence[j]) {
+              move(nextChild, container, anchor, 2);
+            } else {
+              j--;
+            }
+          }
+        }
+      }
+    };
+    const move = (vnode, container, anchor, moveType, parentSuspense = null) => {
+      const { el, type, transition, children, shapeFlag } = vnode;
+      if (shapeFlag & 6) {
+        move(vnode.component.subTree, container, anchor, moveType);
+        return;
+      }
+      if (shapeFlag & 128) {
+        vnode.suspense.move(container, anchor, moveType);
+        return;
+      }
+      if (shapeFlag & 64) {
+        type.move(vnode, container, anchor, internals);
+        return;
+      }
+      if (type === Fragment) {
+        hostInsert(el, container, anchor);
+        for (let i = 0; i < children.length; i++) {
+          move(children[i], container, anchor, moveType);
+        }
+        hostInsert(vnode.anchor, container, anchor);
+        return;
+      }
+      if (type === Static) {
+        moveStaticNode(vnode, container, anchor);
+        return;
+      }
+      const needTransition = moveType !== 2 && shapeFlag & 1 && transition;
+      if (needTransition) {
+        if (moveType === 0) {
+          transition.beforeEnter(el);
+          hostInsert(el, container, anchor);
+          queuePostRenderEffect(() => transition.enter(el), parentSuspense);
+        } else {
+          const { leave, delayLeave, afterLeave } = transition;
+          const remove2 = () => hostInsert(el, container, anchor);
+          const performLeave = () => {
+            leave(el, () => {
+              remove2();
+              afterLeave && afterLeave();
+            });
+          };
+          if (delayLeave) {
+            delayLeave(el, remove2, performLeave);
+          } else {
+            performLeave();
+          }
+        }
+      } else {
+        hostInsert(el, container, anchor);
+      }
+    };
+    const unmount = (vnode, parentComponent, parentSuspense, doRemove = false, optimized = false) => {
+      const {
+        type,
+        props,
+        ref,
+        children,
+        dynamicChildren,
+        shapeFlag,
+        patchFlag,
+        dirs
+      } = vnode;
+      if (ref != null) {
+        setRef(ref, null, parentSuspense, vnode, true);
+      }
+      if (shapeFlag & 256) {
+        parentComponent.ctx.deactivate(vnode);
+        return;
+      }
+      const shouldInvokeDirs = shapeFlag & 1 && dirs;
+      const shouldInvokeVnodeHook = !isAsyncWrapper(vnode);
+      let vnodeHook;
+      if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeBeforeUnmount)) {
+        invokeVNodeHook(vnodeHook, parentComponent, vnode);
+      }
+      if (shapeFlag & 6) {
+        unmountComponent(vnode.component, parentSuspense, doRemove);
+      } else {
+        if (shapeFlag & 128) {
+          vnode.suspense.unmount(parentSuspense, doRemove);
+          return;
+        }
+        if (shouldInvokeDirs) {
+          invokeDirectiveHook(vnode, null, parentComponent, "beforeUnmount");
+        }
+        if (shapeFlag & 64) {
+          vnode.type.remove(
+            vnode,
+            parentComponent,
+            parentSuspense,
+            optimized,
+            internals,
+            doRemove
+          );
+        } else if (dynamicChildren && // #1153: fast path should not be taken for non-stable (v-for) fragments
+        (type !== Fragment || patchFlag > 0 && patchFlag & 64)) {
+          unmountChildren(
+            dynamicChildren,
+            parentComponent,
+            parentSuspense,
+            false,
+            true
+          );
+        } else if (type === Fragment && patchFlag & (128 | 256) || !optimized && shapeFlag & 16) {
+          unmountChildren(children, parentComponent, parentSuspense);
+        }
+        if (doRemove) {
+          remove(vnode);
+        }
+      }
+      if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeUnmounted) || shouldInvokeDirs) {
+        queuePostRenderEffect(() => {
+          vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);
+          shouldInvokeDirs && invokeDirectiveHook(vnode, null, parentComponent, "unmounted");
+        }, parentSuspense);
+      }
+    };
+    const remove = (vnode) => {
+      const { type, el, anchor, transition } = vnode;
+      if (type === Fragment) {
+        if (vnode.patchFlag > 0 && vnode.patchFlag & 2048 && transition && !transition.persisted) {
+          vnode.children.forEach((child) => {
+            if (child.type === Comment) {
+              hostRemove(child.el);
+            } else {
+              remove(child);
+            }
+          });
+        } else {
+          removeFragment(el, anchor);
+        }
+        return;
+      }
+      if (type === Static) {
+        removeStaticNode(vnode);
+        return;
+      }
+      const performRemove = () => {
+        hostRemove(el);
+        if (transition && !transition.persisted && transition.afterLeave) {
+          transition.afterLeave();
+        }
+      };
+      if (vnode.shapeFlag & 1 && transition && !transition.persisted) {
+        const { leave, delayLeave } = transition;
+        const performLeave = () => leave(el, performRemove);
+        if (delayLeave) {
+          delayLeave(vnode.el, performRemove, performLeave);
+        } else {
+          performLeave();
+        }
+      } else {
+        performRemove();
+      }
+    };
+    const removeFragment = (cur, end) => {
+      let next;
+      while (cur !== end) {
+        next = hostNextSibling(cur);
+        hostRemove(cur);
+        cur = next;
+      }
+      hostRemove(end);
+    };
+    const unmountComponent = (instance, parentSuspense, doRemove) => {
+      if (instance.type.__hmrId) {
+        unregisterHMR(instance);
+      }
+      const { bum, scope, update, subTree, um } = instance;
+      if (bum) {
+        invokeArrayFns(bum);
+      }
+      scope.stop();
+      if (update) {
+        update.active = false;
+        unmount(subTree, instance, parentSuspense, doRemove);
+      }
+      if (um) {
+        queuePostRenderEffect(um, parentSuspense);
+      }
+      queuePostRenderEffect(() => {
+        instance.isUnmounted = true;
+      }, parentSuspense);
+      if (parentSuspense && parentSuspense.pendingBranch && !parentSuspense.isUnmounted && instance.asyncDep && !instance.asyncResolved && instance.suspenseId === parentSuspense.pendingId) {
+        parentSuspense.deps--;
+        if (parentSuspense.deps === 0) {
+          parentSuspense.resolve();
+        }
+      }
+      {
+        devtoolsComponentRemoved(instance);
+      }
+    };
+    const unmountChildren = (children, parentComponent, parentSuspense, doRemove = false, optimized = false, start = 0) => {
+      for (let i = start; i < children.length; i++) {
+        unmount(children[i], parentComponent, parentSuspense, doRemove, optimized);
+      }
+    };
+    const getNextHostNode = (vnode) => {
+      if (vnode.shapeFlag & 6) {
+        return getNextHostNode(vnode.component.subTree);
+      }
+      if (vnode.shapeFlag & 128) {
+        return vnode.suspense.next();
+      }
+      return hostNextSibling(vnode.anchor || vnode.el);
+    };
+    const render = (vnode, container, isSVG) => {
+      if (vnode == null) {
+        if (container._vnode) {
+          unmount(container._vnode, null, null, true);
+        }
+      } else {
+        patch(container._vnode || null, vnode, container, null, null, null, isSVG);
+      }
+      flushPreFlushCbs();
+      flushPostFlushCbs();
+      container._vnode = vnode;
+    };
+    const internals = {
+      p: patch,
+      um: unmount,
+      m: move,
+      r: remove,
+      mt: mountComponent,
+      mc: mountChildren,
+      pc: patchChildren,
+      pbc: patchBlockChildren,
+      n: getNextHostNode,
+      o: options
+    };
+    let hydrate;
+    let hydrateNode;
+    if (createHydrationFns) {
+      [hydrate, hydrateNode] = createHydrationFns(
+        internals
+      );
+    }
+    return {
+      render,
+      hydrate,
+      createApp: createAppAPI(render, hydrate)
+    };
+  }
+  function toggleRecurse({ effect, update }, allowed) {
+    effect.allowRecurse = update.allowRecurse = allowed;
+  }
+  function traverseStaticChildren(n1, n2, shallow = false) {
+    const ch1 = n1.children;
+    const ch2 = n2.children;
+    if (isArray(ch1) && isArray(ch2)) {
+      for (let i = 0; i < ch1.length; i++) {
+        const c1 = ch1[i];
+        let c2 = ch2[i];
+        if (c2.shapeFlag & 1 && !c2.dynamicChildren) {
+          if (c2.patchFlag <= 0 || c2.patchFlag === 32) {
+            c2 = ch2[i] = cloneIfMounted(ch2[i]);
+            c2.el = c1.el;
+          }
+          if (!shallow)
+            traverseStaticChildren(c1, c2);
+        }
+        if (c2.type === Text) {
+          c2.el = c1.el;
+        }
+        if (c2.type === Comment && !c2.el) {
+          c2.el = c1.el;
+        }
+      }
+    }
+  }
+  function getSequence(arr) {
+    const p = arr.slice();
+    const result = [0];
+    let i, j, u, v, c;
+    const len = arr.length;
+    for (i = 0; i < len; i++) {
+      const arrI = arr[i];
+      if (arrI !== 0) {
+        j = result[result.length - 1];
+        if (arr[j] < arrI) {
+          p[i] = j;
+          result.push(i);
+          continue;
+        }
+        u = 0;
+        v = result.length - 1;
+        while (u < v) {
+          c = u + v >> 1;
+          if (arr[result[c]] < arrI) {
+            u = c + 1;
+          } else {
+            v = c;
+          }
+        }
+        if (arrI < arr[result[u]]) {
+          if (u > 0) {
+            p[i] = result[u - 1];
+          }
+          result[u] = i;
+        }
+      }
+    }
+    u = result.length;
+    v = result[u - 1];
+    while (u-- > 0) {
+      result[u] = v;
+      v = p[v];
+    }
+    return result;
+  }
+
+  const isTeleport = (type) => type.__isTeleport;
+  const isTeleportDisabled = (props) => props && (props.disabled || props.disabled === "");
+  const isTargetSVG = (target) => typeof SVGElement !== "undefined" && target instanceof SVGElement;
+  const resolveTarget = (props, select) => {
+    const targetSelector = props && props.to;
+    if (isString(targetSelector)) {
+      if (!select) {
+        warn(
+          `Current renderer does not support string target for Teleports. (missing querySelector renderer option)`
+        );
+        return null;
+      } else {
+        const target = select(targetSelector);
+        if (!target) {
+          warn(
+            `Failed to locate Teleport target with selector "${targetSelector}". Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree.`
+          );
+        }
+        return target;
+      }
+    } else {
+      if (!targetSelector && !isTeleportDisabled(props)) {
+        warn(`Invalid Teleport target: ${targetSelector}`);
+      }
+      return targetSelector;
+    }
+  };
+  const TeleportImpl = {
+    __isTeleport: true,
+    process(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, internals) {
+      const {
+        mc: mountChildren,
+        pc: patchChildren,
+        pbc: patchBlockChildren,
+        o: { insert, querySelector, createText, createComment }
+      } = internals;
+      const disabled = isTeleportDisabled(n2.props);
+      let { shapeFlag, children, dynamicChildren } = n2;
+      if (isHmrUpdating) {
+        optimized = false;
+        dynamicChildren = null;
+      }
+      if (n1 == null) {
+        const placeholder = n2.el = createComment("teleport start") ;
+        const mainAnchor = n2.anchor = createComment("teleport end") ;
+        insert(placeholder, container, anchor);
+        insert(mainAnchor, container, anchor);
+        const target = n2.target = resolveTarget(n2.props, querySelector);
+        const targetAnchor = n2.targetAnchor = createText("");
+        if (target) {
+          insert(targetAnchor, target);
+          isSVG = isSVG || isTargetSVG(target);
+        } else if (!disabled) {
+          warn("Invalid Teleport target on mount:", target, `(${typeof target})`);
+        }
+        const mount = (container2, anchor2) => {
+          if (shapeFlag & 16) {
+            mountChildren(
+              children,
+              container2,
+              anchor2,
+              parentComponent,
+              parentSuspense,
+              isSVG,
+              slotScopeIds,
+              optimized
+            );
+          }
+        };
+        if (disabled) {
+          mount(container, mainAnchor);
+        } else if (target) {
+          mount(target, targetAnchor);
+        }
+      } else {
+        n2.el = n1.el;
+        const mainAnchor = n2.anchor = n1.anchor;
+        const target = n2.target = n1.target;
+        const targetAnchor = n2.targetAnchor = n1.targetAnchor;
+        const wasDisabled = isTeleportDisabled(n1.props);
+        const currentContainer = wasDisabled ? container : target;
+        const currentAnchor = wasDisabled ? mainAnchor : targetAnchor;
+        isSVG = isSVG || isTargetSVG(target);
+        if (dynamicChildren) {
+          patchBlockChildren(
+            n1.dynamicChildren,
+            dynamicChildren,
+            currentContainer,
+            parentComponent,
+            parentSuspense,
+            isSVG,
+            slotScopeIds
+          );
+          traverseStaticChildren(n1, n2, true);
+        } else if (!optimized) {
+          patchChildren(
+            n1,
+            n2,
+            currentContainer,
+            currentAnchor,
+            parentComponent,
+            parentSuspense,
+            isSVG,
+            slotScopeIds,
+            false
+          );
+        }
+        if (disabled) {
+          if (!wasDisabled) {
+            moveTeleport(
+              n2,
+              container,
+              mainAnchor,
+              internals,
+              1
+            );
+          } else {
+            if (n2.props && n1.props && n2.props.to !== n1.props.to) {
+              n2.props.to = n1.props.to;
+            }
+          }
+        } else {
+          if ((n2.props && n2.props.to) !== (n1.props && n1.props.to)) {
+            const nextTarget = n2.target = resolveTarget(
+              n2.props,
+              querySelector
+            );
+            if (nextTarget) {
+              moveTeleport(
+                n2,
+                nextTarget,
+                null,
+                internals,
+                0
+              );
+            } else {
+              warn(
+                "Invalid Teleport target on update:",
+                target,
+                `(${typeof target})`
+              );
+            }
+          } else if (wasDisabled) {
+            moveTeleport(
+              n2,
+              target,
+              targetAnchor,
+              internals,
+              1
+            );
+          }
+        }
+      }
+      updateCssVars(n2);
+    },
+    remove(vnode, parentComponent, parentSuspense, optimized, { um: unmount, o: { remove: hostRemove } }, doRemove) {
+      const { shapeFlag, children, anchor, targetAnchor, target, props } = vnode;
+      if (target) {
+        hostRemove(targetAnchor);
+      }
+      doRemove && hostRemove(anchor);
+      if (shapeFlag & 16) {
+        const shouldRemove = doRemove || !isTeleportDisabled(props);
+        for (let i = 0; i < children.length; i++) {
+          const child = children[i];
+          unmount(
+            child,
+            parentComponent,
+            parentSuspense,
+            shouldRemove,
+            !!child.dynamicChildren
+          );
+        }
+      }
+    },
+    move: moveTeleport,
+    hydrate: hydrateTeleport
+  };
+  function moveTeleport(vnode, container, parentAnchor, { o: { insert }, m: move }, moveType = 2) {
+    if (moveType === 0) {
+      insert(vnode.targetAnchor, container, parentAnchor);
+    }
+    const { el, anchor, shapeFlag, children, props } = vnode;
+    const isReorder = moveType === 2;
+    if (isReorder) {
+      insert(el, container, parentAnchor);
+    }
+    if (!isReorder || isTeleportDisabled(props)) {
+      if (shapeFlag & 16) {
+        for (let i = 0; i < children.length; i++) {
+          move(
+            children[i],
+            container,
+            parentAnchor,
+            2
+          );
+        }
+      }
+    }
+    if (isReorder) {
+      insert(anchor, container, parentAnchor);
+    }
+  }
+  function hydrateTeleport(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized, {
+    o: { nextSibling, parentNode, querySelector }
+  }, hydrateChildren) {
+    const target = vnode.target = resolveTarget(
+      vnode.props,
+      querySelector
+    );
+    if (target) {
+      const targetNode = target._lpa || target.firstChild;
+      if (vnode.shapeFlag & 16) {
+        if (isTeleportDisabled(vnode.props)) {
+          vnode.anchor = hydrateChildren(
+            nextSibling(node),
+            vnode,
+            parentNode(node),
+            parentComponent,
+            parentSuspense,
+            slotScopeIds,
+            optimized
+          );
+          vnode.targetAnchor = targetNode;
+        } else {
+          vnode.anchor = nextSibling(node);
+          let targetAnchor = targetNode;
+          while (targetAnchor) {
+            targetAnchor = nextSibling(targetAnchor);
+            if (targetAnchor && targetAnchor.nodeType === 8 && targetAnchor.data === "teleport anchor") {
+              vnode.targetAnchor = targetAnchor;
+              target._lpa = vnode.targetAnchor && nextSibling(vnode.targetAnchor);
+              break;
+            }
+          }
+          hydrateChildren(
+            targetNode,
+            vnode,
+            target,
+            parentComponent,
+            parentSuspense,
+            slotScopeIds,
+            optimized
+          );
+        }
+      }
+      updateCssVars(vnode);
+    }
+    return vnode.anchor && nextSibling(vnode.anchor);
+  }
+  const Teleport = TeleportImpl;
+  function updateCssVars(vnode) {
+    const ctx = vnode.ctx;
+    if (ctx && ctx.ut) {
+      let node = vnode.children[0].el;
+      while (node && node !== vnode.targetAnchor) {
+        if (node.nodeType === 1)
+          node.setAttribute("data-v-owner", ctx.uid);
+        node = node.nextSibling;
+      }
+      ctx.ut();
+    }
+  }
+
+  const Fragment = Symbol.for("v-fgt");
+  const Text = Symbol.for("v-txt");
+  const Comment = Symbol.for("v-cmt");
+  const Static = Symbol.for("v-stc");
+  const blockStack = [];
+  let currentBlock = null;
+  function openBlock(disableTracking = false) {
+    blockStack.push(currentBlock = disableTracking ? null : []);
+  }
+  function closeBlock() {
+    blockStack.pop();
+    currentBlock = blockStack[blockStack.length - 1] || null;
+  }
+  let isBlockTreeEnabled = 1;
+  function setBlockTracking(value) {
+    isBlockTreeEnabled += value;
+  }
+  function setupBlock(vnode) {
+    vnode.dynamicChildren = isBlockTreeEnabled > 0 ? currentBlock || EMPTY_ARR : null;
+    closeBlock();
+    if (isBlockTreeEnabled > 0 && currentBlock) {
+      currentBlock.push(vnode);
+    }
+    return vnode;
+  }
+  function createElementBlock(type, props, children, patchFlag, dynamicProps, shapeFlag) {
+    return setupBlock(
+      createBaseVNode(
+        type,
+        props,
+        children,
+        patchFlag,
+        dynamicProps,
+        shapeFlag,
+        true
+        /* isBlock */
+      )
+    );
+  }
+  function createBlock(type, props, children, patchFlag, dynamicProps) {
+    return setupBlock(
+      createVNode(
+        type,
+        props,
+        children,
+        patchFlag,
+        dynamicProps,
+        true
+        /* isBlock: prevent a block from tracking itself */
+      )
+    );
+  }
+  function isVNode(value) {
+    return value ? value.__v_isVNode === true : false;
+  }
+  function isSameVNodeType(n1, n2) {
+    if (n2.shapeFlag & 6 && hmrDirtyComponents.has(n2.type)) {
+      n1.shapeFlag &= ~256;
+      n2.shapeFlag &= ~512;
+      return false;
+    }
+    return n1.type === n2.type && n1.key === n2.key;
+  }
+  let vnodeArgsTransformer;
+  function transformVNodeArgs(transformer) {
+    vnodeArgsTransformer = transformer;
+  }
+  const createVNodeWithArgsTransform = (...args) => {
+    return _createVNode(
+      ...vnodeArgsTransformer ? vnodeArgsTransformer(args, currentRenderingInstance) : args
+    );
+  };
+  const InternalObjectKey = `__vInternal`;
+  const normalizeKey = ({ key }) => key != null ? key : null;
+  const normalizeRef = ({
+    ref,
+    ref_key,
+    ref_for
+  }) => {
+    if (typeof ref === "number") {
+      ref = "" + ref;
+    }
+    return ref != null ? isString(ref) || isRef(ref) || isFunction(ref) ? { i: currentRenderingInstance, r: ref, k: ref_key, f: !!ref_for } : ref : null;
+  };
+  function createBaseVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, shapeFlag = type === Fragment ? 0 : 1, isBlockNode = false, needFullChildrenNormalization = false) {
+    const vnode = {
+      __v_isVNode: true,
+      __v_skip: true,
+      type,
+      props,
+      key: props && normalizeKey(props),
+      ref: props && normalizeRef(props),
+      scopeId: currentScopeId,
+      slotScopeIds: null,
+      children,
+      component: null,
+      suspense: null,
+      ssContent: null,
+      ssFallback: null,
+      dirs: null,
+      transition: null,
+      el: null,
+      anchor: null,
+      target: null,
+      targetAnchor: null,
+      staticCount: 0,
+      shapeFlag,
+      patchFlag,
+      dynamicProps,
+      dynamicChildren: null,
+      appContext: null,
+      ctx: currentRenderingInstance
+    };
+    if (needFullChildrenNormalization) {
+      normalizeChildren(vnode, children);
+      if (shapeFlag & 128) {
+        type.normalize(vnode);
+      }
+    } else if (children) {
+      vnode.shapeFlag |= isString(children) ? 8 : 16;
+    }
+    if (vnode.key !== vnode.key) {
+      warn(`VNode created with invalid key (NaN). VNode type:`, vnode.type);
+    }
+    if (isBlockTreeEnabled > 0 && // avoid a block node from tracking itself
+    !isBlockNode && // has current parent block
+    currentBlock && // presence of a patch flag indicates this node needs patching on updates.
+    // component nodes also should always be patched, because even if the
+    // component doesn't need to update, it needs to persist the instance on to
+    // the next vnode so that it can be properly unmounted later.
+    (vnode.patchFlag > 0 || shapeFlag & 6) && // the EVENTS flag is only for hydration and if it is the only flag, the
+    // vnode should not be considered dynamic due to handler caching.
+    vnode.patchFlag !== 32) {
+      currentBlock.push(vnode);
+    }
+    return vnode;
+  }
+  const createVNode = createVNodeWithArgsTransform ;
+  function _createVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, isBlockNode = false) {
+    if (!type || type === NULL_DYNAMIC_COMPONENT) {
+      if (!type) {
+        warn(`Invalid vnode type when creating vnode: ${type}.`);
+      }
+      type = Comment;
+    }
+    if (isVNode(type)) {
+      const cloned = cloneVNode(
+        type,
+        props,
+        true
+        /* mergeRef: true */
+      );
+      if (children) {
+        normalizeChildren(cloned, children);
+      }
+      if (isBlockTreeEnabled > 0 && !isBlockNode && currentBlock) {
+        if (cloned.shapeFlag & 6) {
+          currentBlock[currentBlock.indexOf(type)] = cloned;
+        } else {
+          currentBlock.push(cloned);
+        }
+      }
+      cloned.patchFlag |= -2;
+      return cloned;
+    }
+    if (isClassComponent(type)) {
+      type = type.__vccOpts;
+    }
+    if (props) {
+      props = guardReactiveProps(props);
+      let { class: klass, style } = props;
+      if (klass && !isString(klass)) {
+        props.class = normalizeClass(klass);
+      }
+      if (isObject(style)) {
+        if (isProxy(style) && !isArray(style)) {
+          style = extend({}, style);
+        }
+        props.style = normalizeStyle(style);
+      }
+    }
+    const shapeFlag = isString(type) ? 1 : isSuspense(type) ? 128 : isTeleport(type) ? 64 : isObject(type) ? 4 : isFunction(type) ? 2 : 0;
+    if (shapeFlag & 4 && isProxy(type)) {
+      type = toRaw(type);
+      warn(
+        `Vue received a Component which was made a reactive object. This can lead to unnecessary performance overhead, and should be avoided by marking the component with \`markRaw\` or using \`shallowRef\` instead of \`ref\`.`,
+        `
+Component that was made reactive: `,
+        type
+      );
+    }
+    return createBaseVNode(
+      type,
+      props,
+      children,
+      patchFlag,
+      dynamicProps,
+      shapeFlag,
+      isBlockNode,
+      true
+    );
+  }
+  function guardReactiveProps(props) {
+    if (!props)
+      return null;
+    return isProxy(props) || InternalObjectKey in props ? extend({}, props) : props;
+  }
+  function cloneVNode(vnode, extraProps, mergeRef = false) {
+    const { props, ref, patchFlag, children } = vnode;
+    const mergedProps = extraProps ? mergeProps(props || {}, extraProps) : props;
+    const cloned = {
+      __v_isVNode: true,
+      __v_skip: true,
+      type: vnode.type,
+      props: mergedProps,
+      key: mergedProps && normalizeKey(mergedProps),
+      ref: extraProps && extraProps.ref ? (
+        // #2078 in the case of <component :is="vnode" ref="extra"/>
+        // if the vnode itself already has a ref, cloneVNode will need to merge
+        // the refs so the single vnode can be set on multiple refs
+        mergeRef && ref ? isArray(ref) ? ref.concat(normalizeRef(extraProps)) : [ref, normalizeRef(extraProps)] : normalizeRef(extraProps)
+      ) : ref,
+      scopeId: vnode.scopeId,
+      slotScopeIds: vnode.slotScopeIds,
+      children: patchFlag === -1 && isArray(children) ? children.map(deepCloneVNode) : children,
+      target: vnode.target,
+      targetAnchor: vnode.targetAnchor,
+      staticCount: vnode.staticCount,
+      shapeFlag: vnode.shapeFlag,
+      // if the vnode is cloned with extra props, we can no longer assume its
+      // existing patch flag to be reliable and need to add the FULL_PROPS flag.
+      // note: preserve flag for fragments since they use the flag for children
+      // fast paths only.
+      patchFlag: extraProps && vnode.type !== Fragment ? patchFlag === -1 ? 16 : patchFlag | 16 : patchFlag,
+      dynamicProps: vnode.dynamicProps,
+      dynamicChildren: vnode.dynamicChildren,
+      appContext: vnode.appContext,
+      dirs: vnode.dirs,
+      transition: vnode.transition,
+      // These should technically only be non-null on mounted VNodes. However,
+      // they *should* be copied for kept-alive vnodes. So we just always copy
+      // them since them being non-null during a mount doesn't affect the logic as
+      // they will simply be overwritten.
+      component: vnode.component,
+      suspense: vnode.suspense,
+      ssContent: vnode.ssContent && cloneVNode(vnode.ssContent),
+      ssFallback: vnode.ssFallback && cloneVNode(vnode.ssFallback),
+      el: vnode.el,
+      anchor: vnode.anchor,
+      ctx: vnode.ctx,
+      ce: vnode.ce
+    };
+    return cloned;
+  }
+  function deepCloneVNode(vnode) {
+    const cloned = cloneVNode(vnode);
+    if (isArray(vnode.children)) {
+      cloned.children = vnode.children.map(deepCloneVNode);
+    }
+    return cloned;
+  }
+  function createTextVNode(text = " ", flag = 0) {
+    return createVNode(Text, null, text, flag);
+  }
+  function createStaticVNode(content, numberOfNodes) {
+    const vnode = createVNode(Static, null, content);
+    vnode.staticCount = numberOfNodes;
+    return vnode;
+  }
+  function createCommentVNode(text = "", asBlock = false) {
+    return asBlock ? (openBlock(), createBlock(Comment, null, text)) : createVNode(Comment, null, text);
+  }
+  function normalizeVNode(child) {
+    if (child == null || typeof child === "boolean") {
+      return createVNode(Comment);
+    } else if (isArray(child)) {
+      return createVNode(
+        Fragment,
+        null,
+        // #3666, avoid reference pollution when reusing vnode
+        child.slice()
+      );
+    } else if (typeof child === "object") {
+      return cloneIfMounted(child);
+    } else {
+      return createVNode(Text, null, String(child));
+    }
+  }
+  function cloneIfMounted(child) {
+    return child.el === null && child.patchFlag !== -1 || child.memo ? child : cloneVNode(child);
+  }
+  function normalizeChildren(vnode, children) {
+    let type = 0;
+    const { shapeFlag } = vnode;
+    if (children == null) {
+      children = null;
+    } else if (isArray(children)) {
+      type = 16;
+    } else if (typeof children === "object") {
+      if (shapeFlag & (1 | 64)) {
+        const slot = children.default;
+        if (slot) {
+          slot._c && (slot._d = false);
+          normalizeChildren(vnode, slot());
+          slot._c && (slot._d = true);
+        }
+        return;
+      } else {
+        type = 32;
+        const slotFlag = children._;
+        if (!slotFlag && !(InternalObjectKey in children)) {
+          children._ctx = currentRenderingInstance;
+        } else if (slotFlag === 3 && currentRenderingInstance) {
+          if (currentRenderingInstance.slots._ === 1) {
+            children._ = 1;
+          } else {
+            children._ = 2;
+            vnode.patchFlag |= 1024;
+          }
+        }
+      }
+    } else if (isFunction(children)) {
+      children = { default: children, _ctx: currentRenderingInstance };
+      type = 32;
+    } else {
+      children = String(children);
+      if (shapeFlag & 64) {
+        type = 16;
+        children = [createTextVNode(children)];
+      } else {
+        type = 8;
+      }
+    }
+    vnode.children = children;
+    vnode.shapeFlag |= type;
+  }
+  function mergeProps(...args) {
+    const ret = {};
+    for (let i = 0; i < args.length; i++) {
+      const toMerge = args[i];
+      for (const key in toMerge) {
+        if (key === "class") {
+          if (ret.class !== toMerge.class) {
+            ret.class = normalizeClass([ret.class, toMerge.class]);
+          }
+        } else if (key === "style") {
+          ret.style = normalizeStyle([ret.style, toMerge.style]);
+        } else if (isOn(key)) {
+          const existing = ret[key];
+          const incoming = toMerge[key];
+          if (incoming && existing !== incoming && !(isArray(existing) && existing.includes(incoming))) {
+            ret[key] = existing ? [].concat(existing, incoming) : incoming;
+          }
+        } else if (key !== "") {
+          ret[key] = toMerge[key];
+        }
+      }
+    }
+    return ret;
+  }
+  function invokeVNodeHook(hook, instance, vnode, prevVNode = null) {
+    callWithAsyncErrorHandling(hook, instance, 7, [
+      vnode,
+      prevVNode
+    ]);
+  }
+
+  const emptyAppContext = createAppContext();
+  let uid = 0;
+  function createComponentInstance(vnode, parent, suspense) {
+    const type = vnode.type;
+    const appContext = (parent ? parent.appContext : vnode.appContext) || emptyAppContext;
+    const instance = {
+      uid: uid++,
+      vnode,
+      type,
+      parent,
+      appContext,
+      root: null,
+      // to be immediately set
+      next: null,
+      subTree: null,
+      // will be set synchronously right after creation
+      effect: null,
+      update: null,
+      // will be set synchronously right after creation
+      scope: new EffectScope(
+        true
+        /* detached */
+      ),
+      render: null,
+      proxy: null,
+      exposed: null,
+      exposeProxy: null,
+      withProxy: null,
+      provides: parent ? parent.provides : Object.create(appContext.provides),
+      accessCache: null,
+      renderCache: [],
+      // local resolved assets
+      components: null,
+      directives: null,
+      // resolved props and emits options
+      propsOptions: normalizePropsOptions(type, appContext),
+      emitsOptions: normalizeEmitsOptions(type, appContext),
+      // emit
+      emit: null,
+      // to be set immediately
+      emitted: null,
+      // props default value
+      propsDefaults: EMPTY_OBJ,
+      // inheritAttrs
+      inheritAttrs: type.inheritAttrs,
+      // state
+      ctx: EMPTY_OBJ,
+      data: EMPTY_OBJ,
+      props: EMPTY_OBJ,
+      attrs: EMPTY_OBJ,
+      slots: EMPTY_OBJ,
+      refs: EMPTY_OBJ,
+      setupState: EMPTY_OBJ,
+      setupContext: null,
+      attrsProxy: null,
+      slotsProxy: null,
+      // suspense related
+      suspense,
+      suspenseId: suspense ? suspense.pendingId : 0,
+      asyncDep: null,
+      asyncResolved: false,
+      // lifecycle hooks
+      // not using enums here because it results in computed properties
+      isMounted: false,
+      isUnmounted: false,
+      isDeactivated: false,
+      bc: null,
+      c: null,
+      bm: null,
+      m: null,
+      bu: null,
+      u: null,
+      um: null,
+      bum: null,
+      da: null,
+      a: null,
+      rtg: null,
+      rtc: null,
+      ec: null,
+      sp: null
+    };
+    {
+      instance.ctx = createDevRenderContext(instance);
+    }
+    instance.root = parent ? parent.root : instance;
+    instance.emit = emit.bind(null, instance);
+    if (vnode.ce) {
+      vnode.ce(instance);
+    }
+    return instance;
+  }
+  let currentInstance = null;
+  const getCurrentInstance = () => currentInstance || currentRenderingInstance;
+  let internalSetCurrentInstance;
+  {
+    internalSetCurrentInstance = (i) => {
+      currentInstance = i;
+    };
+  }
+  const setCurrentInstance = (instance) => {
+    internalSetCurrentInstance(instance);
+    instance.scope.on();
+  };
+  const unsetCurrentInstance = () => {
+    currentInstance && currentInstance.scope.off();
+    internalSetCurrentInstance(null);
+  };
+  const isBuiltInTag = /* @__PURE__ */ makeMap("slot,component");
+  function validateComponentName(name, config) {
+    const appIsNativeTag = config.isNativeTag || NO;
+    if (isBuiltInTag(name) || appIsNativeTag(name)) {
+      warn(
+        "Do not use built-in or reserved HTML elements as component id: " + name
+      );
+    }
+  }
+  function isStatefulComponent(instance) {
+    return instance.vnode.shapeFlag & 4;
+  }
+  let isInSSRComponentSetup = false;
+  function setupComponent(instance, isSSR = false) {
+    isInSSRComponentSetup = isSSR;
+    const { props, children } = instance.vnode;
+    const isStateful = isStatefulComponent(instance);
+    initProps(instance, props, isStateful, isSSR);
+    initSlots(instance, children);
+    const setupResult = isStateful ? setupStatefulComponent(instance, isSSR) : void 0;
+    isInSSRComponentSetup = false;
+    return setupResult;
+  }
+  function setupStatefulComponent(instance, isSSR) {
+    var _a;
+    const Component = instance.type;
+    {
+      if (Component.name) {
+        validateComponentName(Component.name, instance.appContext.config);
+      }
+      if (Component.components) {
+        const names = Object.keys(Component.components);
+        for (let i = 0; i < names.length; i++) {
+          validateComponentName(names[i], instance.appContext.config);
+        }
+      }
+      if (Component.directives) {
+        const names = Object.keys(Component.directives);
+        for (let i = 0; i < names.length; i++) {
+          validateDirectiveName(names[i]);
+        }
+      }
+      if (Component.compilerOptions && isRuntimeOnly()) {
+        warn(
+          `"compilerOptions" is only supported when using a build of Vue that includes the runtime compiler. Since you are using a runtime-only build, the options should be passed via your build tool config instead.`
+        );
+      }
+    }
+    instance.accessCache = /* @__PURE__ */ Object.create(null);
+    instance.proxy = markRaw(new Proxy(instance.ctx, PublicInstanceProxyHandlers));
+    {
+      exposePropsOnRenderContext(instance);
+    }
+    const { setup } = Component;
+    if (setup) {
+      const setupContext = instance.setupContext = setup.length > 1 ? createSetupContext(instance) : null;
+      setCurrentInstance(instance);
+      pauseTracking();
+      const setupResult = callWithErrorHandling(
+        setup,
+        instance,
+        0,
+        [shallowReadonly(instance.props) , setupContext]
+      );
+      resetTracking();
+      unsetCurrentInstance();
+      if (isPromise(setupResult)) {
+        setupResult.then(unsetCurrentInstance, unsetCurrentInstance);
+        if (isSSR) {
+          return setupResult.then((resolvedResult) => {
+            handleSetupResult(instance, resolvedResult, isSSR);
+          }).catch((e) => {
+            handleError(e, instance, 0);
+          });
+        } else {
+          instance.asyncDep = setupResult;
+          if (!instance.suspense) {
+            const name = (_a = Component.name) != null ? _a : "Anonymous";
+            warn(
+              `Component <${name}>: setup function returned a promise, but no <Suspense> boundary was found in the parent component tree. A component with async setup() must be nested in a <Suspense> in order to be rendered.`
+            );
+          }
+        }
+      } else {
+        handleSetupResult(instance, setupResult, isSSR);
+      }
+    } else {
+      finishComponentSetup(instance, isSSR);
+    }
+  }
+  function handleSetupResult(instance, setupResult, isSSR) {
+    if (isFunction(setupResult)) {
+      {
+        instance.render = setupResult;
+      }
+    } else if (isObject(setupResult)) {
+      if (isVNode(setupResult)) {
+        warn(
+          `setup() should not return VNodes directly - return a render function instead.`
+        );
+      }
+      {
+        instance.devtoolsRawSetupState = setupResult;
+      }
+      instance.setupState = proxyRefs(setupResult);
+      {
+        exposeSetupStateOnRenderContext(instance);
+      }
+    } else if (setupResult !== void 0) {
+      warn(
+        `setup() should return an object. Received: ${setupResult === null ? "null" : typeof setupResult}`
+      );
+    }
+    finishComponentSetup(instance, isSSR);
+  }
+  let compile$1;
+  let installWithProxy;
+  function registerRuntimeCompiler(_compile) {
+    compile$1 = _compile;
+    installWithProxy = (i) => {
+      if (i.render._rc) {
+        i.withProxy = new Proxy(i.ctx, RuntimeCompiledPublicInstanceProxyHandlers);
+      }
+    };
+  }
+  const isRuntimeOnly = () => !compile$1;
+  function finishComponentSetup(instance, isSSR, skipOptions) {
+    const Component = instance.type;
+    if (!instance.render) {
+      if (!isSSR && compile$1 && !Component.render) {
+        const template = Component.template || resolveMergedOptions(instance).template;
+        if (template) {
+          {
+            startMeasure(instance, `compile`);
+          }
+          const { isCustomElement, compilerOptions } = instance.appContext.config;
+          const { delimiters, compilerOptions: componentCompilerOptions } = Component;
+          const finalCompilerOptions = extend(
+            extend(
+              {
+                isCustomElement,
+                delimiters
+              },
+              compilerOptions
+            ),
+            componentCompilerOptions
+          );
+          Component.render = compile$1(template, finalCompilerOptions);
+          {
+            endMeasure(instance, `compile`);
+          }
+        }
+      }
+      instance.render = Component.render || NOOP;
+      if (installWithProxy) {
+        installWithProxy(instance);
+      }
+    }
+    {
+      setCurrentInstance(instance);
+      pauseTracking();
+      try {
+        applyOptions(instance);
+      } finally {
+        resetTracking();
+        unsetCurrentInstance();
+      }
+    }
+    if (!Component.render && instance.render === NOOP && !isSSR) {
+      if (!compile$1 && Component.template) {
+        warn(
+          `Component provided template option but runtime compilation is not supported in this build of Vue.` + (` Use "vue.global.js" instead.` )
+          /* should not happen */
+        );
+      } else {
+        warn(`Component is missing template or render function.`);
+      }
+    }
+  }
+  function getAttrsProxy(instance) {
+    return instance.attrsProxy || (instance.attrsProxy = new Proxy(
+      instance.attrs,
+      {
+        get(target, key) {
+          markAttrsAccessed();
+          track(instance, "get", "$attrs");
+          return target[key];
+        },
+        set() {
+          warn(`setupContext.attrs is readonly.`);
+          return false;
+        },
+        deleteProperty() {
+          warn(`setupContext.attrs is readonly.`);
+          return false;
+        }
+      }
+    ));
+  }
+  function getSlotsProxy(instance) {
+    return instance.slotsProxy || (instance.slotsProxy = new Proxy(instance.slots, {
+      get(target, key) {
+        track(instance, "get", "$slots");
+        return target[key];
+      }
+    }));
+  }
+  function createSetupContext(instance) {
+    const expose = (exposed) => {
+      {
+        if (instance.exposed) {
+          warn(`expose() should be called only once per setup().`);
+        }
+        if (exposed != null) {
+          let exposedType = typeof exposed;
+          if (exposedType === "object") {
+            if (isArray(exposed)) {
+              exposedType = "array";
+            } else if (isRef(exposed)) {
+              exposedType = "ref";
+            }
+          }
+          if (exposedType !== "object") {
+            warn(
+              `expose() should be passed a plain object, received ${exposedType}.`
+            );
+          }
+        }
+      }
+      instance.exposed = exposed || {};
+    };
+    {
+      return Object.freeze({
+        get attrs() {
+          return getAttrsProxy(instance);
+        },
+        get slots() {
+          return getSlotsProxy(instance);
+        },
+        get emit() {
+          return (event, ...args) => instance.emit(event, ...args);
+        },
+        expose
+      });
+    }
+  }
+  function getExposeProxy(instance) {
+    if (instance.exposed) {
+      return instance.exposeProxy || (instance.exposeProxy = new Proxy(proxyRefs(markRaw(instance.exposed)), {
+        get(target, key) {
+          if (key in target) {
+            return target[key];
+          } else if (key in publicPropertiesMap) {
+            return publicPropertiesMap[key](instance);
+          }
+        },
+        has(target, key) {
+          return key in target || key in publicPropertiesMap;
+        }
+      }));
+    }
+  }
+  const classifyRE = /(?:^|[-_])(\w)/g;
+  const classify = (str) => str.replace(classifyRE, (c) => c.toUpperCase()).replace(/[-_]/g, "");
+  function getComponentName(Component, includeInferred = true) {
+    return isFunction(Component) ? Component.displayName || Component.name : Component.name || includeInferred && Component.__name;
+  }
+  function formatComponentName(instance, Component, isRoot = false) {
+    let name = getComponentName(Component);
+    if (!name && Component.__file) {
+      const match = Component.__file.match(/([^/\\]+)\.\w+$/);
+      if (match) {
+        name = match[1];
+      }
+    }
+    if (!name && instance && instance.parent) {
+      const inferFromRegistry = (registry) => {
+        for (const key in registry) {
+          if (registry[key] === Component) {
+            return key;
+          }
+        }
+      };
+      name = inferFromRegistry(
+        instance.components || instance.parent.type.components
+      ) || inferFromRegistry(instance.appContext.components);
+    }
+    return name ? classify(name) : isRoot ? `App` : `Anonymous`;
+  }
+  function isClassComponent(value) {
+    return isFunction(value) && "__vccOpts" in value;
+  }
+
+  const computed = (getterOrOptions, debugOptions) => {
+    return computed$1(getterOrOptions, debugOptions, isInSSRComponentSetup);
+  };
+
+  function h(type, propsOrChildren, children) {
+    const l = arguments.length;
+    if (l === 2) {
+      if (isObject(propsOrChildren) && !isArray(propsOrChildren)) {
+        if (isVNode(propsOrChildren)) {
+          return createVNode(type, null, [propsOrChildren]);
+        }
+        return createVNode(type, propsOrChildren);
+      } else {
+        return createVNode(type, null, propsOrChildren);
+      }
+    } else {
+      if (l > 3) {
+        children = Array.prototype.slice.call(arguments, 2);
+      } else if (l === 3 && isVNode(children)) {
+        children = [children];
+      }
+      return createVNode(type, propsOrChildren, children);
+    }
+  }
+
+  const ssrContextKey = Symbol.for("v-scx");
+  const useSSRContext = () => {
+    {
+      warn(`useSSRContext() is not supported in the global build.`);
+    }
+  };
+
+  function initCustomFormatter() {
+    if (typeof window === "undefined") {
+      return;
+    }
+    const vueStyle = { style: "color:#3ba776" };
+    const numberStyle = { style: "color:#0b1bc9" };
+    const stringStyle = { style: "color:#b62e24" };
+    const keywordStyle = { style: "color:#9d288c" };
+    const formatter = {
+      header(obj) {
+        if (!isObject(obj)) {
+          return null;
+        }
+        if (obj.__isVue) {
+          return ["div", vueStyle, `VueInstance`];
+        } else if (isRef(obj)) {
+          return [
+            "div",
+            {},
+            ["span", vueStyle, genRefFlag(obj)],
+            "<",
+            formatValue(obj.value),
+            `>`
+          ];
+        } else if (isReactive(obj)) {
+          return [
+            "div",
+            {},
+            ["span", vueStyle, isShallow(obj) ? "ShallowReactive" : "Reactive"],
+            "<",
+            formatValue(obj),
+            `>${isReadonly(obj) ? ` (readonly)` : ``}`
+          ];
+        } else if (isReadonly(obj)) {
+          return [
+            "div",
+            {},
+            ["span", vueStyle, isShallow(obj) ? "ShallowReadonly" : "Readonly"],
+            "<",
+            formatValue(obj),
+            ">"
+          ];
+        }
+        return null;
+      },
+      hasBody(obj) {
+        return obj && obj.__isVue;
+      },
+      body(obj) {
+        if (obj && obj.__isVue) {
+          return [
+            "div",
+            {},
+            ...formatInstance(obj.$)
+          ];
+        }
+      }
+    };
+    function formatInstance(instance) {
+      const blocks = [];
+      if (instance.type.props && instance.props) {
+        blocks.push(createInstanceBlock("props", toRaw(instance.props)));
+      }
+      if (instance.setupState !== EMPTY_OBJ) {
+        blocks.push(createInstanceBlock("setup", instance.setupState));
+      }
+      if (instance.data !== EMPTY_OBJ) {
+        blocks.push(createInstanceBlock("data", toRaw(instance.data)));
+      }
+      const computed = extractKeys(instance, "computed");
+      if (computed) {
+        blocks.push(createInstanceBlock("computed", computed));
+      }
+      const injected = extractKeys(instance, "inject");
+      if (injected) {
+        blocks.push(createInstanceBlock("injected", injected));
+      }
+      blocks.push([
+        "div",
+        {},
+        [
+          "span",
+          {
+            style: keywordStyle.style + ";opacity:0.66"
+          },
+          "$ (internal): "
+        ],
+        ["object", { object: instance }]
+      ]);
+      return blocks;
+    }
+    function createInstanceBlock(type, target) {
+      target = extend({}, target);
+      if (!Object.keys(target).length) {
+        return ["span", {}];
+      }
+      return [
+        "div",
+        { style: "line-height:1.25em;margin-bottom:0.6em" },
+        [
+          "div",
+          {
+            style: "color:#476582"
+          },
+          type
+        ],
+        [
+          "div",
+          {
+            style: "padding-left:1.25em"
+          },
+          ...Object.keys(target).map((key) => {
+            return [
+              "div",
+              {},
+              ["span", keywordStyle, key + ": "],
+              formatValue(target[key], false)
+            ];
+          })
+        ]
+      ];
+    }
+    function formatValue(v, asRaw = true) {
+      if (typeof v === "number") {
+        return ["span", numberStyle, v];
+      } else if (typeof v === "string") {
+        return ["span", stringStyle, JSON.stringify(v)];
+      } else if (typeof v === "boolean") {
+        return ["span", keywordStyle, v];
+      } else if (isObject(v)) {
+        return ["object", { object: asRaw ? toRaw(v) : v }];
+      } else {
+        return ["span", stringStyle, String(v)];
+      }
+    }
+    function extractKeys(instance, type) {
+      const Comp = instance.type;
+      if (isFunction(Comp)) {
+        return;
+      }
+      const extracted = {};
+      for (const key in instance.ctx) {
+        if (isKeyOfType(Comp, key, type)) {
+          extracted[key] = instance.ctx[key];
+        }
+      }
+      return extracted;
+    }
+    function isKeyOfType(Comp, key, type) {
+      const opts = Comp[type];
+      if (isArray(opts) && opts.includes(key) || isObject(opts) && key in opts) {
+        return true;
+      }
+      if (Comp.extends && isKeyOfType(Comp.extends, key, type)) {
+        return true;
+      }
+      if (Comp.mixins && Comp.mixins.some((m) => isKeyOfType(m, key, type))) {
+        return true;
+      }
+    }
+    function genRefFlag(v) {
+      if (isShallow(v)) {
+        return `ShallowRef`;
+      }
+      if (v.effect) {
+        return `ComputedRef`;
+      }
+      return `Ref`;
+    }
+    if (window.devtoolsFormatters) {
+      window.devtoolsFormatters.push(formatter);
+    } else {
+      window.devtoolsFormatters = [formatter];
+    }
+  }
+
+  function withMemo(memo, render, cache, index) {
+    const cached = cache[index];
+    if (cached && isMemoSame(cached, memo)) {
+      return cached;
+    }
+    const ret = render();
+    ret.memo = memo.slice();
+    return cache[index] = ret;
+  }
+  function isMemoSame(cached, memo) {
+    const prev = cached.memo;
+    if (prev.length != memo.length) {
+      return false;
+    }
+    for (let i = 0; i < prev.length; i++) {
+      if (hasChanged(prev[i], memo[i])) {
+        return false;
+      }
+    }
+    if (isBlockTreeEnabled > 0 && currentBlock) {
+      currentBlock.push(cached);
+    }
+    return true;
+  }
+
+  const version = "3.3.6";
+  const ssrUtils = null;
+  const resolveFilter = null;
+  const compatUtils = null;
+
+  const svgNS = "http://www.w3.org/2000/svg";
+  const doc = typeof document !== "undefined" ? document : null;
+  const templateContainer = doc && /* @__PURE__ */ doc.createElement("template");
+  const nodeOps = {
+    insert: (child, parent, anchor) => {
+      parent.insertBefore(child, anchor || null);
+    },
+    remove: (child) => {
+      const parent = child.parentNode;
+      if (parent) {
+        parent.removeChild(child);
+      }
+    },
+    createElement: (tag, isSVG, is, props) => {
+      const el = isSVG ? doc.createElementNS(svgNS, tag) : doc.createElement(tag, is ? { is } : void 0);
+      if (tag === "select" && props && props.multiple != null) {
+        el.setAttribute("multiple", props.multiple);
+      }
+      return el;
+    },
+    createText: (text) => doc.createTextNode(text),
+    createComment: (text) => doc.createComment(text),
+    setText: (node, text) => {
+      node.nodeValue = text;
+    },
+    setElementText: (el, text) => {
+      el.textContent = text;
+    },
+    parentNode: (node) => node.parentNode,
+    nextSibling: (node) => node.nextSibling,
+    querySelector: (selector) => doc.querySelector(selector),
+    setScopeId(el, id) {
+      el.setAttribute(id, "");
+    },
+    // __UNSAFE__
+    // Reason: innerHTML.
+    // Static content here can only come from compiled templates.
+    // As long as the user only uses trusted templates, this is safe.
+    insertStaticContent(content, parent, anchor, isSVG, start, end) {
+      const before = anchor ? anchor.previousSibling : parent.lastChild;
+      if (start && (start === end || start.nextSibling)) {
+        while (true) {
+          parent.insertBefore(start.cloneNode(true), anchor);
+          if (start === end || !(start = start.nextSibling))
+            break;
+        }
+      } else {
+        templateContainer.innerHTML = isSVG ? `<svg>${content}</svg>` : content;
+        const template = templateContainer.content;
+        if (isSVG) {
+          const wrapper = template.firstChild;
+          while (wrapper.firstChild) {
+            template.appendChild(wrapper.firstChild);
+          }
+          template.removeChild(wrapper);
+        }
+        parent.insertBefore(template, anchor);
+      }
+      return [
+        // first
+        before ? before.nextSibling : parent.firstChild,
+        // last
+        anchor ? anchor.previousSibling : parent.lastChild
+      ];
+    }
+  };
+
+  const TRANSITION$1 = "transition";
+  const ANIMATION = "animation";
+  const vtcKey = Symbol("_vtc");
+  const Transition = (props, { slots }) => h(BaseTransition, resolveTransitionProps(props), slots);
+  Transition.displayName = "Transition";
+  const DOMTransitionPropsValidators = {
+    name: String,
+    type: String,
+    css: {
+      type: Boolean,
+      default: true
+    },
+    duration: [String, Number, Object],
+    enterFromClass: String,
+    enterActiveClass: String,
+    enterToClass: String,
+    appearFromClass: String,
+    appearActiveClass: String,
+    appearToClass: String,
+    leaveFromClass: String,
+    leaveActiveClass: String,
+    leaveToClass: String
+  };
+  const TransitionPropsValidators = Transition.props = /* @__PURE__ */ extend(
+    {},
+    BaseTransitionPropsValidators,
+    DOMTransitionPropsValidators
+  );
+  const callHook = (hook, args = []) => {
+    if (isArray(hook)) {
+      hook.forEach((h2) => h2(...args));
+    } else if (hook) {
+      hook(...args);
+    }
+  };
+  const hasExplicitCallback = (hook) => {
+    return hook ? isArray(hook) ? hook.some((h2) => h2.length > 1) : hook.length > 1 : false;
+  };
+  function resolveTransitionProps(rawProps) {
+    const baseProps = {};
+    for (const key in rawProps) {
+      if (!(key in DOMTransitionPropsValidators)) {
+        baseProps[key] = rawProps[key];
+      }
+    }
+    if (rawProps.css === false) {
+      return baseProps;
+    }
+    const {
+      name = "v",
+      type,
+      duration,
+      enterFromClass = `${name}-enter-from`,
+      enterActiveClass = `${name}-enter-active`,
+      enterToClass = `${name}-enter-to`,
+      appearFromClass = enterFromClass,
+      appearActiveClass = enterActiveClass,
+      appearToClass = enterToClass,
+      leaveFromClass = `${name}-leave-from`,
+      leaveActiveClass = `${name}-leave-active`,
+      leaveToClass = `${name}-leave-to`
+    } = rawProps;
+    const durations = normalizeDuration(duration);
+    const enterDuration = durations && durations[0];
+    const leaveDuration = durations && durations[1];
+    const {
+      onBeforeEnter,
+      onEnter,
+      onEnterCancelled,
+      onLeave,
+      onLeaveCancelled,
+      onBeforeAppear = onBeforeEnter,
+      onAppear = onEnter,
+      onAppearCancelled = onEnterCancelled
+    } = baseProps;
+    const finishEnter = (el, isAppear, done) => {
+      removeTransitionClass(el, isAppear ? appearToClass : enterToClass);
+      removeTransitionClass(el, isAppear ? appearActiveClass : enterActiveClass);
+      done && done();
+    };
+    const finishLeave = (el, done) => {
+      el._isLeaving = false;
+      removeTransitionClass(el, leaveFromClass);
+      removeTransitionClass(el, leaveToClass);
+      removeTransitionClass(el, leaveActiveClass);
+      done && done();
+    };
+    const makeEnterHook = (isAppear) => {
+      return (el, done) => {
+        const hook = isAppear ? onAppear : onEnter;
+        const resolve = () => finishEnter(el, isAppear, done);
+        callHook(hook, [el, resolve]);
+        nextFrame(() => {
+          removeTransitionClass(el, isAppear ? appearFromClass : enterFromClass);
+          addTransitionClass(el, isAppear ? appearToClass : enterToClass);
+          if (!hasExplicitCallback(hook)) {
+            whenTransitionEnds(el, type, enterDuration, resolve);
+          }
+        });
+      };
+    };
+    return extend(baseProps, {
+      onBeforeEnter(el) {
+        callHook(onBeforeEnter, [el]);
+        addTransitionClass(el, enterFromClass);
+        addTransitionClass(el, enterActiveClass);
+      },
+      onBeforeAppear(el) {
+        callHook(onBeforeAppear, [el]);
+        addTransitionClass(el, appearFromClass);
+        addTransitionClass(el, appearActiveClass);
+      },
+      onEnter: makeEnterHook(false),
+      onAppear: makeEnterHook(true),
+      onLeave(el, done) {
+        el._isLeaving = true;
+        const resolve = () => finishLeave(el, done);
+        addTransitionClass(el, leaveFromClass);
+        forceReflow();
+        addTransitionClass(el, leaveActiveClass);
+        nextFrame(() => {
+          if (!el._isLeaving) {
+            return;
+          }
+          removeTransitionClass(el, leaveFromClass);
+          addTransitionClass(el, leaveToClass);
+          if (!hasExplicitCallback(onLeave)) {
+            whenTransitionEnds(el, type, leaveDuration, resolve);
+          }
+        });
+        callHook(onLeave, [el, resolve]);
+      },
+      onEnterCancelled(el) {
+        finishEnter(el, false);
+        callHook(onEnterCancelled, [el]);
+      },
+      onAppearCancelled(el) {
+        finishEnter(el, true);
+        callHook(onAppearCancelled, [el]);
+      },
+      onLeaveCancelled(el) {
+        finishLeave(el);
+        callHook(onLeaveCancelled, [el]);
+      }
+    });
+  }
+  function normalizeDuration(duration) {
+    if (duration == null) {
+      return null;
+    } else if (isObject(duration)) {
+      return [NumberOf(duration.enter), NumberOf(duration.leave)];
+    } else {
+      const n = NumberOf(duration);
+      return [n, n];
+    }
+  }
+  function NumberOf(val) {
+    const res = toNumber(val);
+    {
+      assertNumber(res, "<transition> explicit duration");
+    }
+    return res;
+  }
+  function addTransitionClass(el, cls) {
+    cls.split(/\s+/).forEach((c) => c && el.classList.add(c));
+    (el[vtcKey] || (el[vtcKey] = /* @__PURE__ */ new Set())).add(cls);
+  }
+  function removeTransitionClass(el, cls) {
+    cls.split(/\s+/).forEach((c) => c && el.classList.remove(c));
+    const _vtc = el[vtcKey];
+    if (_vtc) {
+      _vtc.delete(cls);
+      if (!_vtc.size) {
+        el[vtcKey] = void 0;
+      }
+    }
+  }
+  function nextFrame(cb) {
+    requestAnimationFrame(() => {
+      requestAnimationFrame(cb);
+    });
+  }
+  let endId = 0;
+  function whenTransitionEnds(el, expectedType, explicitTimeout, resolve) {
+    const id = el._endId = ++endId;
+    const resolveIfNotStale = () => {
+      if (id === el._endId) {
+        resolve();
+      }
+    };
+    if (explicitTimeout) {
+      return setTimeout(resolveIfNotStale, explicitTimeout);
+    }
+    const { type, timeout, propCount } = getTransitionInfo(el, expectedType);
+    if (!type) {
+      return resolve();
+    }
+    const endEvent = type + "end";
+    let ended = 0;
+    const end = () => {
+      el.removeEventListener(endEvent, onEnd);
+      resolveIfNotStale();
+    };
+    const onEnd = (e) => {
+      if (e.target === el && ++ended >= propCount) {
+        end();
+      }
+    };
+    setTimeout(() => {
+      if (ended < propCount) {
+        end();
+      }
+    }, timeout + 1);
+    el.addEventListener(endEvent, onEnd);
+  }
+  function getTransitionInfo(el, expectedType) {
+    const styles = window.getComputedStyle(el);
+    const getStyleProperties = (key) => (styles[key] || "").split(", ");
+    const transitionDelays = getStyleProperties(`${TRANSITION$1}Delay`);
+    const transitionDurations = getStyleProperties(`${TRANSITION$1}Duration`);
+    const transitionTimeout = getTimeout(transitionDelays, transitionDurations);
+    const animationDelays = getStyleProperties(`${ANIMATION}Delay`);
+    const animationDurations = getStyleProperties(`${ANIMATION}Duration`);
+    const animationTimeout = getTimeout(animationDelays, animationDurations);
+    let type = null;
+    let timeout = 0;
+    let propCount = 0;
+    if (expectedType === TRANSITION$1) {
+      if (transitionTimeout > 0) {
+        type = TRANSITION$1;
+        timeout = transitionTimeout;
+        propCount = transitionDurations.length;
+      }
+    } else if (expectedType === ANIMATION) {
+      if (animationTimeout > 0) {
+        type = ANIMATION;
+        timeout = animationTimeout;
+        propCount = animationDurations.length;
+      }
+    } else {
+      timeout = Math.max(transitionTimeout, animationTimeout);
+      type = timeout > 0 ? transitionTimeout > animationTimeout ? TRANSITION$1 : ANIMATION : null;
+      propCount = type ? type === TRANSITION$1 ? transitionDurations.length : animationDurations.length : 0;
+    }
+    const hasTransform = type === TRANSITION$1 && /\b(transform|all)(,|$)/.test(
+      getStyleProperties(`${TRANSITION$1}Property`).toString()
+    );
+    return {
+      type,
+      timeout,
+      propCount,
+      hasTransform
+    };
+  }
+  function getTimeout(delays, durations) {
+    while (delays.length < durations.length) {
+      delays = delays.concat(delays);
+    }
+    return Math.max(...durations.map((d, i) => toMs(d) + toMs(delays[i])));
+  }
+  function toMs(s) {
+    if (s === "auto")
+      return 0;
+    return Number(s.slice(0, -1).replace(",", ".")) * 1e3;
+  }
+  function forceReflow() {
+    return document.body.offsetHeight;
+  }
+
+  function patchClass(el, value, isSVG) {
+    const transitionClasses = el[vtcKey];
+    if (transitionClasses) {
+      value = (value ? [value, ...transitionClasses] : [...transitionClasses]).join(" ");
+    }
+    if (value == null) {
+      el.removeAttribute("class");
+    } else if (isSVG) {
+      el.setAttribute("class", value);
+    } else {
+      el.className = value;
+    }
+  }
+
+  const vShowOldKey = Symbol("_vod");
+  const vShow = {
+    beforeMount(el, { value }, { transition }) {
+      el[vShowOldKey] = el.style.display === "none" ? "" : el.style.display;
+      if (transition && value) {
+        transition.beforeEnter(el);
+      } else {
+        setDisplay(el, value);
+      }
+    },
+    mounted(el, { value }, { transition }) {
+      if (transition && value) {
+        transition.enter(el);
+      }
+    },
+    updated(el, { value, oldValue }, { transition }) {
+      if (!value === !oldValue)
+        return;
+      if (transition) {
+        if (value) {
+          transition.beforeEnter(el);
+          setDisplay(el, true);
+          transition.enter(el);
+        } else {
+          transition.leave(el, () => {
+            setDisplay(el, false);
+          });
+        }
+      } else {
+        setDisplay(el, value);
+      }
+    },
+    beforeUnmount(el, { value }) {
+      setDisplay(el, value);
+    }
+  };
+  function setDisplay(el, value) {
+    el.style.display = value ? el[vShowOldKey] : "none";
+  }
+
+  function patchStyle(el, prev, next) {
+    const style = el.style;
+    const isCssString = isString(next);
+    if (next && !isCssString) {
+      if (prev && !isString(prev)) {
+        for (const key in prev) {
+          if (next[key] == null) {
+            setStyle(style, key, "");
+          }
+        }
+      }
+      for (const key in next) {
+        setStyle(style, key, next[key]);
+      }
+    } else {
+      const currentDisplay = style.display;
+      if (isCssString) {
+        if (prev !== next) {
+          style.cssText = next;
+        }
+      } else if (prev) {
+        el.removeAttribute("style");
+      }
+      if (vShowOldKey in el) {
+        style.display = currentDisplay;
+      }
+    }
+  }
+  const semicolonRE = /[^\\];\s*$/;
+  const importantRE = /\s*!important$/;
+  function setStyle(style, name, val) {
+    if (isArray(val)) {
+      val.forEach((v) => setStyle(style, name, v));
+    } else {
+      if (val == null)
+        val = "";
+      {
+        if (semicolonRE.test(val)) {
+          warn(
+            `Unexpected semicolon at the end of '${name}' style value: '${val}'`
+          );
+        }
+      }
+      if (name.startsWith("--")) {
+        style.setProperty(name, val);
+      } else {
+        const prefixed = autoPrefix(style, name);
+        if (importantRE.test(val)) {
+          style.setProperty(
+            hyphenate(prefixed),
+            val.replace(importantRE, ""),
+            "important"
+          );
+        } else {
+          style[prefixed] = val;
+        }
+      }
+    }
+  }
+  const prefixes = ["Webkit", "Moz", "ms"];
+  const prefixCache = {};
+  function autoPrefix(style, rawName) {
+    const cached = prefixCache[rawName];
+    if (cached) {
+      return cached;
+    }
+    let name = camelize(rawName);
+    if (name !== "filter" && name in style) {
+      return prefixCache[rawName] = name;
+    }
+    name = capitalize(name);
+    for (let i = 0; i < prefixes.length; i++) {
+      const prefixed = prefixes[i] + name;
+      if (prefixed in style) {
+        return prefixCache[rawName] = prefixed;
+      }
+    }
+    return rawName;
+  }
+
+  const xlinkNS = "http://www.w3.org/1999/xlink";
+  function patchAttr(el, key, value, isSVG, instance) {
+    if (isSVG && key.startsWith("xlink:")) {
+      if (value == null) {
+        el.removeAttributeNS(xlinkNS, key.slice(6, key.length));
+      } else {
+        el.setAttributeNS(xlinkNS, key, value);
+      }
+    } else {
+      const isBoolean = isSpecialBooleanAttr(key);
+      if (value == null || isBoolean && !includeBooleanAttr(value)) {
+        el.removeAttribute(key);
+      } else {
+        el.setAttribute(key, isBoolean ? "" : value);
+      }
+    }
+  }
+
+  function patchDOMProp(el, key, value, prevChildren, parentComponent, parentSuspense, unmountChildren) {
+    if (key === "innerHTML" || key === "textContent") {
+      if (prevChildren) {
+        unmountChildren(prevChildren, parentComponent, parentSuspense);
+      }
+      el[key] = value == null ? "" : value;
+      return;
+    }
+    const tag = el.tagName;
+    if (key === "value" && tag !== "PROGRESS" && // custom elements may use _value internally
+    !tag.includes("-")) {
+      el._value = value;
+      const oldValue = tag === "OPTION" ? el.getAttribute("value") : el.value;
+      const newValue = value == null ? "" : value;
+      if (oldValue !== newValue) {
+        el.value = newValue;
+      }
+      if (value == null) {
+        el.removeAttribute(key);
+      }
+      return;
+    }
+    let needRemove = false;
+    if (value === "" || value == null) {
+      const type = typeof el[key];
+      if (type === "boolean") {
+        value = includeBooleanAttr(value);
+      } else if (value == null && type === "string") {
+        value = "";
+        needRemove = true;
+      } else if (type === "number") {
+        value = 0;
+        needRemove = true;
+      }
+    }
+    try {
+      el[key] = value;
+    } catch (e) {
+      if (!needRemove) {
+        warn(
+          `Failed setting prop "${key}" on <${tag.toLowerCase()}>: value ${value} is invalid.`,
+          e
+        );
+      }
+    }
+    needRemove && el.removeAttribute(key);
+  }
+
+  function addEventListener(el, event, handler, options) {
+    el.addEventListener(event, handler, options);
+  }
+  function removeEventListener(el, event, handler, options) {
+    el.removeEventListener(event, handler, options);
+  }
+  const veiKey = Symbol("_vei");
+  function patchEvent(el, rawName, prevValue, nextValue, instance = null) {
+    const invokers = el[veiKey] || (el[veiKey] = {});
+    const existingInvoker = invokers[rawName];
+    if (nextValue && existingInvoker) {
+      existingInvoker.value = nextValue;
+    } else {
+      const [name, options] = parseName(rawName);
+      if (nextValue) {
+        const invoker = invokers[rawName] = createInvoker(nextValue, instance);
+        addEventListener(el, name, invoker, options);
+      } else if (existingInvoker) {
+        removeEventListener(el, name, existingInvoker, options);
+        invokers[rawName] = void 0;
+      }
+    }
+  }
+  const optionsModifierRE = /(?:Once|Passive|Capture)$/;
+  function parseName(name) {
+    let options;
+    if (optionsModifierRE.test(name)) {
+      options = {};
+      let m;
+      while (m = name.match(optionsModifierRE)) {
+        name = name.slice(0, name.length - m[0].length);
+        options[m[0].toLowerCase()] = true;
+      }
+    }
+    const event = name[2] === ":" ? name.slice(3) : hyphenate(name.slice(2));
+    return [event, options];
+  }
+  let cachedNow = 0;
+  const p = /* @__PURE__ */ Promise.resolve();
+  const getNow = () => cachedNow || (p.then(() => cachedNow = 0), cachedNow = Date.now());
+  function createInvoker(initialValue, instance) {
+    const invoker = (e) => {
+      if (!e._vts) {
+        e._vts = Date.now();
+      } else if (e._vts <= invoker.attached) {
+        return;
+      }
+      callWithAsyncErrorHandling(
+        patchStopImmediatePropagation(e, invoker.value),
+        instance,
+        5,
+        [e]
+      );
+    };
+    invoker.value = initialValue;
+    invoker.attached = getNow();
+    return invoker;
+  }
+  function patchStopImmediatePropagation(e, value) {
+    if (isArray(value)) {
+      const originalStop = e.stopImmediatePropagation;
+      e.stopImmediatePropagation = () => {
+        originalStop.call(e);
+        e._stopped = true;
+      };
+      return value.map((fn) => (e2) => !e2._stopped && fn && fn(e2));
+    } else {
+      return value;
+    }
+  }
+
+  const nativeOnRE = /^on[a-z]/;
+  const patchProp = (el, key, prevValue, nextValue, isSVG = false, prevChildren, parentComponent, parentSuspense, unmountChildren) => {
+    if (key === "class") {
+      patchClass(el, nextValue, isSVG);
+    } else if (key === "style") {
+      patchStyle(el, prevValue, nextValue);
+    } else if (isOn(key)) {
+      if (!isModelListener(key)) {
+        patchEvent(el, key, prevValue, nextValue, parentComponent);
+      }
+    } else if (key[0] === "." ? (key = key.slice(1), true) : key[0] === "^" ? (key = key.slice(1), false) : shouldSetAsProp(el, key, nextValue, isSVG)) {
+      patchDOMProp(
+        el,
+        key,
+        nextValue,
+        prevChildren,
+        parentComponent,
+        parentSuspense,
+        unmountChildren
+      );
+    } else {
+      if (key === "true-value") {
+        el._trueValue = nextValue;
+      } else if (key === "false-value") {
+        el._falseValue = nextValue;
+      }
+      patchAttr(el, key, nextValue, isSVG);
+    }
+  };
+  function shouldSetAsProp(el, key, value, isSVG) {
+    if (isSVG) {
+      if (key === "innerHTML" || key === "textContent") {
+        return true;
+      }
+      if (key in el && nativeOnRE.test(key) && isFunction(value)) {
+        return true;
+      }
+      return false;
+    }
+    if (key === "spellcheck" || key === "draggable" || key === "translate") {
+      return false;
+    }
+    if (key === "form") {
+      return false;
+    }
+    if (key === "list" && el.tagName === "INPUT") {
+      return false;
+    }
+    if (key === "type" && el.tagName === "TEXTAREA") {
+      return false;
+    }
+    if (nativeOnRE.test(key) && isString(value)) {
+      return false;
+    }
+    return key in el;
+  }
+
+  /*! #__NO_SIDE_EFFECTS__ */
+  // @__NO_SIDE_EFFECTS__
+  function defineCustomElement(options, hydrate2) {
+    const Comp = defineComponent(options);
+    class VueCustomElement extends VueElement {
+      constructor(initialProps) {
+        super(Comp, initialProps, hydrate2);
+      }
+    }
+    VueCustomElement.def = Comp;
+    return VueCustomElement;
+  }
+  /*! #__NO_SIDE_EFFECTS__ */
+  const defineSSRCustomElement = /* @__NO_SIDE_EFFECTS__ */ (options) => {
+    return /* @__PURE__ */ defineCustomElement(options, hydrate);
+  };
+  const BaseClass = typeof HTMLElement !== "undefined" ? HTMLElement : class {
+  };
+  class VueElement extends BaseClass {
+    constructor(_def, _props = {}, hydrate2) {
+      super();
+      this._def = _def;
+      this._props = _props;
+      /**
+       * @internal
+       */
+      this._instance = null;
+      this._connected = false;
+      this._resolved = false;
+      this._numberProps = null;
+      this._ob = null;
+      if (this.shadowRoot && hydrate2) {
+        hydrate2(this._createVNode(), this.shadowRoot);
+      } else {
+        if (this.shadowRoot) {
+          warn(
+            `Custom element has pre-rendered declarative shadow root but is not defined as hydratable. Use \`defineSSRCustomElement\`.`
+          );
+        }
+        this.attachShadow({ mode: "open" });
+        if (!this._def.__asyncLoader) {
+          this._resolveProps(this._def);
+        }
+      }
+    }
+    connectedCallback() {
+      this._connected = true;
+      if (!this._instance) {
+        if (this._resolved) {
+          this._update();
+        } else {
+          this._resolveDef();
+        }
+      }
+    }
+    disconnectedCallback() {
+      this._connected = false;
+      if (this._ob) {
+        this._ob.disconnect();
+        this._ob = null;
+      }
+      nextTick(() => {
+        if (!this._connected) {
+          render(null, this.shadowRoot);
+          this._instance = null;
+        }
+      });
+    }
+    /**
+     * resolve inner component definition (handle possible async component)
+     */
+    _resolveDef() {
+      this._resolved = true;
+      for (let i = 0; i < this.attributes.length; i++) {
+        this._setAttr(this.attributes[i].name);
+      }
+      this._ob = new MutationObserver((mutations) => {
+        for (const m of mutations) {
+          this._setAttr(m.attributeName);
+        }
+      });
+      this._ob.observe(this, { attributes: true });
+      const resolve = (def, isAsync = false) => {
+        const { props, styles } = def;
+        let numberProps;
+        if (props && !isArray(props)) {
+          for (const key in props) {
+            const opt = props[key];
+            if (opt === Number || opt && opt.type === Number) {
+              if (key in this._props) {
+                this._props[key] = toNumber(this._props[key]);
+              }
+              (numberProps || (numberProps = /* @__PURE__ */ Object.create(null)))[camelize(key)] = true;
+            }
+          }
+        }
+        this._numberProps = numberProps;
+        if (isAsync) {
+          this._resolveProps(def);
+        }
+        this._applyStyles(styles);
+        this._update();
+      };
+      const asyncDef = this._def.__asyncLoader;
+      if (asyncDef) {
+        asyncDef().then((def) => resolve(def, true));
+      } else {
+        resolve(this._def);
+      }
+    }
+    _resolveProps(def) {
+      const { props } = def;
+      const declaredPropKeys = isArray(props) ? props : Object.keys(props || {});
+      for (const key of Object.keys(this)) {
+        if (key[0] !== "_" && declaredPropKeys.includes(key)) {
+          this._setProp(key, this[key], true, false);
+        }
+      }
+      for (const key of declaredPropKeys.map(camelize)) {
+        Object.defineProperty(this, key, {
+          get() {
+            return this._getProp(key);
+          },
+          set(val) {
+            this._setProp(key, val);
+          }
+        });
+      }
+    }
+    _setAttr(key) {
+      let value = this.getAttribute(key);
+      const camelKey = camelize(key);
+      if (this._numberProps && this._numberProps[camelKey]) {
+        value = toNumber(value);
+      }
+      this._setProp(camelKey, value, false);
+    }
+    /**
+     * @internal
+     */
+    _getProp(key) {
+      return this._props[key];
+    }
+    /**
+     * @internal
+     */
+    _setProp(key, val, shouldReflect = true, shouldUpdate = true) {
+      if (val !== this._props[key]) {
+        this._props[key] = val;
+        if (shouldUpdate && this._instance) {
+          this._update();
+        }
+        if (shouldReflect) {
+          if (val === true) {
+            this.setAttribute(hyphenate(key), "");
+          } else if (typeof val === "string" || typeof val === "number") {
+            this.setAttribute(hyphenate(key), val + "");
+          } else if (!val) {
+            this.removeAttribute(hyphenate(key));
+          }
+        }
+      }
+    }
+    _update() {
+      render(this._createVNode(), this.shadowRoot);
+    }
+    _createVNode() {
+      const vnode = createVNode(this._def, extend({}, this._props));
+      if (!this._instance) {
+        vnode.ce = (instance) => {
+          this._instance = instance;
+          instance.isCE = true;
+          {
+            instance.ceReload = (newStyles) => {
+              if (this._styles) {
+                this._styles.forEach((s) => this.shadowRoot.removeChild(s));
+                this._styles.length = 0;
+              }
+              this._applyStyles(newStyles);
+              this._instance = null;
+              this._update();
+            };
+          }
+          const dispatch = (event, args) => {
+            this.dispatchEvent(
+              new CustomEvent(event, {
+                detail: args
+              })
+            );
+          };
+          instance.emit = (event, ...args) => {
+            dispatch(event, args);
+            if (hyphenate(event) !== event) {
+              dispatch(hyphenate(event), args);
+            }
+          };
+          let parent = this;
+          while (parent = parent && (parent.parentNode || parent.host)) {
+            if (parent instanceof VueElement) {
+              instance.parent = parent._instance;
+              instance.provides = parent._instance.provides;
+              break;
+            }
+          }
+        };
+      }
+      return vnode;
+    }
+    _applyStyles(styles) {
+      if (styles) {
+        styles.forEach((css) => {
+          const s = document.createElement("style");
+          s.textContent = css;
+          this.shadowRoot.appendChild(s);
+          {
+            (this._styles || (this._styles = [])).push(s);
+          }
+        });
+      }
+    }
+  }
+
+  function useCssModule(name = "$style") {
+    {
+      {
+        warn(`useCssModule() is not supported in the global build.`);
+      }
+      return EMPTY_OBJ;
+    }
+  }
+
+  function useCssVars(getter) {
+    const instance = getCurrentInstance();
+    if (!instance) {
+      warn(`useCssVars is called without current active component instance.`);
+      return;
+    }
+    const updateTeleports = instance.ut = (vars = getter(instance.proxy)) => {
+      Array.from(
+        document.querySelectorAll(`[data-v-owner="${instance.uid}"]`)
+      ).forEach((node) => setVarsOnNode(node, vars));
+    };
+    const setVars = () => {
+      const vars = getter(instance.proxy);
+      setVarsOnVNode(instance.subTree, vars);
+      updateTeleports(vars);
+    };
+    watchPostEffect(setVars);
+    onMounted(() => {
+      const ob = new MutationObserver(setVars);
+      ob.observe(instance.subTree.el.parentNode, { childList: true });
+      onUnmounted(() => ob.disconnect());
+    });
+  }
+  function setVarsOnVNode(vnode, vars) {
+    if (vnode.shapeFlag & 128) {
+      const suspense = vnode.suspense;
+      vnode = suspense.activeBranch;
+      if (suspense.pendingBranch && !suspense.isHydrating) {
+        suspense.effects.push(() => {
+          setVarsOnVNode(suspense.activeBranch, vars);
+        });
+      }
+    }
+    while (vnode.component) {
+      vnode = vnode.component.subTree;
+    }
+    if (vnode.shapeFlag & 1 && vnode.el) {
+      setVarsOnNode(vnode.el, vars);
+    } else if (vnode.type === Fragment) {
+      vnode.children.forEach((c) => setVarsOnVNode(c, vars));
+    } else if (vnode.type === Static) {
+      let { el, anchor } = vnode;
+      while (el) {
+        setVarsOnNode(el, vars);
+        if (el === anchor)
+          break;
+        el = el.nextSibling;
+      }
+    }
+  }
+  function setVarsOnNode(el, vars) {
+    if (el.nodeType === 1) {
+      const style = el.style;
+      for (const key in vars) {
+        style.setProperty(`--${key}`, vars[key]);
+      }
+    }
+  }
+
+  const positionMap = /* @__PURE__ */ new WeakMap();
+  const newPositionMap = /* @__PURE__ */ new WeakMap();
+  const moveCbKey = Symbol("_moveCb");
+  const enterCbKey = Symbol("_enterCb");
+  const TransitionGroupImpl = {
+    name: "TransitionGroup",
+    props: /* @__PURE__ */ extend({}, TransitionPropsValidators, {
+      tag: String,
+      moveClass: String
+    }),
+    setup(props, { slots }) {
+      const instance = getCurrentInstance();
+      const state = useTransitionState();
+      let prevChildren;
+      let children;
+      onUpdated(() => {
+        if (!prevChildren.length) {
+          return;
+        }
+        const moveClass = props.moveClass || `${props.name || "v"}-move`;
+        if (!hasCSSTransform(
+          prevChildren[0].el,
+          instance.vnode.el,
+          moveClass
+        )) {
+          return;
+        }
+        prevChildren.forEach(callPendingCbs);
+        prevChildren.forEach(recordPosition);
+        const movedChildren = prevChildren.filter(applyTranslation);
+        forceReflow();
+        movedChildren.forEach((c) => {
+          const el = c.el;
+          const style = el.style;
+          addTransitionClass(el, moveClass);
+          style.transform = style.webkitTransform = style.transitionDuration = "";
+          const cb = el[moveCbKey] = (e) => {
+            if (e && e.target !== el) {
+              return;
+            }
+            if (!e || /transform$/.test(e.propertyName)) {
+              el.removeEventListener("transitionend", cb);
+              el[moveCbKey] = null;
+              removeTransitionClass(el, moveClass);
+            }
+          };
+          el.addEventListener("transitionend", cb);
+        });
+      });
+      return () => {
+        const rawProps = toRaw(props);
+        const cssTransitionProps = resolveTransitionProps(rawProps);
+        let tag = rawProps.tag || Fragment;
+        prevChildren = children;
+        children = slots.default ? getTransitionRawChildren(slots.default()) : [];
+        for (let i = 0; i < children.length; i++) {
+          const child = children[i];
+          if (child.key != null) {
+            setTransitionHooks(
+              child,
+              resolveTransitionHooks(child, cssTransitionProps, state, instance)
+            );
+          } else {
+            warn(`<TransitionGroup> children must be keyed.`);
+          }
+        }
+        if (prevChildren) {
+          for (let i = 0; i < prevChildren.length; i++) {
+            const child = prevChildren[i];
+            setTransitionHooks(
+              child,
+              resolveTransitionHooks(child, cssTransitionProps, state, instance)
+            );
+            positionMap.set(child, child.el.getBoundingClientRect());
+          }
+        }
+        return createVNode(tag, null, children);
+      };
+    }
+  };
+  const removeMode = (props) => delete props.mode;
+  /* @__PURE__ */ removeMode(TransitionGroupImpl.props);
+  const TransitionGroup = TransitionGroupImpl;
+  function callPendingCbs(c) {
+    const el = c.el;
+    if (el[moveCbKey]) {
+      el[moveCbKey]();
+    }
+    if (el[enterCbKey]) {
+      el[enterCbKey]();
+    }
+  }
+  function recordPosition(c) {
+    newPositionMap.set(c, c.el.getBoundingClientRect());
+  }
+  function applyTranslation(c) {
+    const oldPos = positionMap.get(c);
+    const newPos = newPositionMap.get(c);
+    const dx = oldPos.left - newPos.left;
+    const dy = oldPos.top - newPos.top;
+    if (dx || dy) {
+      const s = c.el.style;
+      s.transform = s.webkitTransform = `translate(${dx}px,${dy}px)`;
+      s.transitionDuration = "0s";
+      return c;
+    }
+  }
+  function hasCSSTransform(el, root, moveClass) {
+    const clone = el.cloneNode();
+    const _vtc = el[vtcKey];
+    if (_vtc) {
+      _vtc.forEach((cls) => {
+        cls.split(/\s+/).forEach((c) => c && clone.classList.remove(c));
+      });
+    }
+    moveClass.split(/\s+/).forEach((c) => c && clone.classList.add(c));
+    clone.style.display = "none";
+    const container = root.nodeType === 1 ? root : root.parentNode;
+    container.appendChild(clone);
+    const { hasTransform } = getTransitionInfo(clone);
+    container.removeChild(clone);
+    return hasTransform;
+  }
+
+  const getModelAssigner = (vnode) => {
+    const fn = vnode.props["onUpdate:modelValue"] || false;
+    return isArray(fn) ? (value) => invokeArrayFns(fn, value) : fn;
+  };
+  function onCompositionStart(e) {
+    e.target.composing = true;
+  }
+  function onCompositionEnd(e) {
+    const target = e.target;
+    if (target.composing) {
+      target.composing = false;
+      target.dispatchEvent(new Event("input"));
+    }
+  }
+  const assignKey = Symbol("_assign");
+  const vModelText = {
+    created(el, { modifiers: { lazy, trim, number } }, vnode) {
+      el[assignKey] = getModelAssigner(vnode);
+      const castToNumber = number || vnode.props && vnode.props.type === "number";
+      addEventListener(el, lazy ? "change" : "input", (e) => {
+        if (e.target.composing)
+          return;
+        let domValue = el.value;
+        if (trim) {
+          domValue = domValue.trim();
+        }
+        if (castToNumber) {
+          domValue = looseToNumber(domValue);
+        }
+        el[assignKey](domValue);
+      });
+      if (trim) {
+        addEventListener(el, "change", () => {
+          el.value = el.value.trim();
+        });
+      }
+      if (!lazy) {
+        addEventListener(el, "compositionstart", onCompositionStart);
+        addEventListener(el, "compositionend", onCompositionEnd);
+        addEventListener(el, "change", onCompositionEnd);
+      }
+    },
+    // set value on mounted so it's after min/max for type="range"
+    mounted(el, { value }) {
+      el.value = value == null ? "" : value;
+    },
+    beforeUpdate(el, { value, modifiers: { lazy, trim, number } }, vnode) {
+      el[assignKey] = getModelAssigner(vnode);
+      if (el.composing)
+        return;
+      if (document.activeElement === el && el.type !== "range") {
+        if (lazy) {
+          return;
+        }
+        if (trim && el.value.trim() === value) {
+          return;
+        }
+        if ((number || el.type === "number") && looseToNumber(el.value) === value) {
+          return;
+        }
+      }
+      const newValue = value == null ? "" : value;
+      if (el.value !== newValue) {
+        el.value = newValue;
+      }
+    }
+  };
+  const vModelCheckbox = {
+    // #4096 array checkboxes need to be deep traversed
+    deep: true,
+    created(el, _, vnode) {
+      el[assignKey] = getModelAssigner(vnode);
+      addEventListener(el, "change", () => {
+        const modelValue = el._modelValue;
+        const elementValue = getValue(el);
+        const checked = el.checked;
+        const assign = el[assignKey];
+        if (isArray(modelValue)) {
+          const index = looseIndexOf(modelValue, elementValue);
+          const found = index !== -1;
+          if (checked && !found) {
+            assign(modelValue.concat(elementValue));
+          } else if (!checked && found) {
+            const filtered = [...modelValue];
+            filtered.splice(index, 1);
+            assign(filtered);
+          }
+        } else if (isSet(modelValue)) {
+          const cloned = new Set(modelValue);
+          if (checked) {
+            cloned.add(elementValue);
+          } else {
+            cloned.delete(elementValue);
+          }
+          assign(cloned);
+        } else {
+          assign(getCheckboxValue(el, checked));
+        }
+      });
+    },
+    // set initial checked on mount to wait for true-value/false-value
+    mounted: setChecked,
+    beforeUpdate(el, binding, vnode) {
+      el[assignKey] = getModelAssigner(vnode);
+      setChecked(el, binding, vnode);
+    }
+  };
+  function setChecked(el, { value, oldValue }, vnode) {
+    el._modelValue = value;
+    if (isArray(value)) {
+      el.checked = looseIndexOf(value, vnode.props.value) > -1;
+    } else if (isSet(value)) {
+      el.checked = value.has(vnode.props.value);
+    } else if (value !== oldValue) {
+      el.checked = looseEqual(value, getCheckboxValue(el, true));
+    }
+  }
+  const vModelRadio = {
+    created(el, { value }, vnode) {
+      el.checked = looseEqual(value, vnode.props.value);
+      el[assignKey] = getModelAssigner(vnode);
+      addEventListener(el, "change", () => {
+        el[assignKey](getValue(el));
+      });
+    },
+    beforeUpdate(el, { value, oldValue }, vnode) {
+      el[assignKey] = getModelAssigner(vnode);
+      if (value !== oldValue) {
+        el.checked = looseEqual(value, vnode.props.value);
+      }
+    }
+  };
+  const vModelSelect = {
+    // <select multiple> value need to be deep traversed
+    deep: true,
+    created(el, { value, modifiers: { number } }, vnode) {
+      const isSetModel = isSet(value);
+      addEventListener(el, "change", () => {
+        const selectedVal = Array.prototype.filter.call(el.options, (o) => o.selected).map(
+          (o) => number ? looseToNumber(getValue(o)) : getValue(o)
+        );
+        el[assignKey](
+          el.multiple ? isSetModel ? new Set(selectedVal) : selectedVal : selectedVal[0]
+        );
+      });
+      el[assignKey] = getModelAssigner(vnode);
+    },
+    // set value in mounted & updated because <select> relies on its children
+    // <option>s.
+    mounted(el, { value }) {
+      setSelected(el, value);
+    },
+    beforeUpdate(el, _binding, vnode) {
+      el[assignKey] = getModelAssigner(vnode);
+    },
+    updated(el, { value }) {
+      setSelected(el, value);
+    }
+  };
+  function setSelected(el, value) {
+    const isMultiple = el.multiple;
+    if (isMultiple && !isArray(value) && !isSet(value)) {
+      warn(
+        `<select multiple v-model> expects an Array or Set value for its binding, but got ${Object.prototype.toString.call(value).slice(8, -1)}.`
+      );
+      return;
+    }
+    for (let i = 0, l = el.options.length; i < l; i++) {
+      const option = el.options[i];
+      const optionValue = getValue(option);
+      if (isMultiple) {
+        if (isArray(value)) {
+          option.selected = looseIndexOf(value, optionValue) > -1;
+        } else {
+          option.selected = value.has(optionValue);
+        }
+      } else {
+        if (looseEqual(getValue(option), value)) {
+          if (el.selectedIndex !== i)
+            el.selectedIndex = i;
+          return;
+        }
+      }
+    }
+    if (!isMultiple && el.selectedIndex !== -1) {
+      el.selectedIndex = -1;
+    }
+  }
+  function getValue(el) {
+    return "_value" in el ? el._value : el.value;
+  }
+  function getCheckboxValue(el, checked) {
+    const key = checked ? "_trueValue" : "_falseValue";
+    return key in el ? el[key] : checked;
+  }
+  const vModelDynamic = {
+    created(el, binding, vnode) {
+      callModelHook(el, binding, vnode, null, "created");
+    },
+    mounted(el, binding, vnode) {
+      callModelHook(el, binding, vnode, null, "mounted");
+    },
+    beforeUpdate(el, binding, vnode, prevVNode) {
+      callModelHook(el, binding, vnode, prevVNode, "beforeUpdate");
+    },
+    updated(el, binding, vnode, prevVNode) {
+      callModelHook(el, binding, vnode, prevVNode, "updated");
+    }
+  };
+  function resolveDynamicModel(tagName, type) {
+    switch (tagName) {
+      case "SELECT":
+        return vModelSelect;
+      case "TEXTAREA":
+        return vModelText;
+      default:
+        switch (type) {
+          case "checkbox":
+            return vModelCheckbox;
+          case "radio":
+            return vModelRadio;
+          default:
+            return vModelText;
+        }
+    }
+  }
+  function callModelHook(el, binding, vnode, prevVNode, hook) {
+    const modelToUse = resolveDynamicModel(
+      el.tagName,
+      vnode.props && vnode.props.type
+    );
+    const fn = modelToUse[hook];
+    fn && fn(el, binding, vnode, prevVNode);
+  }
+
+  const systemModifiers = ["ctrl", "shift", "alt", "meta"];
+  const modifierGuards = {
+    stop: (e) => e.stopPropagation(),
+    prevent: (e) => e.preventDefault(),
+    self: (e) => e.target !== e.currentTarget,
+    ctrl: (e) => !e.ctrlKey,
+    shift: (e) => !e.shiftKey,
+    alt: (e) => !e.altKey,
+    meta: (e) => !e.metaKey,
+    left: (e) => "button" in e && e.button !== 0,
+    middle: (e) => "button" in e && e.button !== 1,
+    right: (e) => "button" in e && e.button !== 2,
+    exact: (e, modifiers) => systemModifiers.some((m) => e[`${m}Key`] && !modifiers.includes(m))
+  };
+  const withModifiers = (fn, modifiers) => {
+    return (event, ...args) => {
+      for (let i = 0; i < modifiers.length; i++) {
+        const guard = modifierGuards[modifiers[i]];
+        if (guard && guard(event, modifiers))
+          return;
+      }
+      return fn(event, ...args);
+    };
+  };
+  const keyNames = {
+    esc: "escape",
+    space: " ",
+    up: "arrow-up",
+    left: "arrow-left",
+    right: "arrow-right",
+    down: "arrow-down",
+    delete: "backspace"
+  };
+  const withKeys = (fn, modifiers) => {
+    return (event) => {
+      if (!("key" in event)) {
+        return;
+      }
+      const eventKey = hyphenate(event.key);
+      if (modifiers.some((k) => k === eventKey || keyNames[k] === eventKey)) {
+        return fn(event);
+      }
+    };
+  };
+
+  const rendererOptions = /* @__PURE__ */ extend({ patchProp }, nodeOps);
+  let renderer;
+  let enabledHydration = false;
+  function ensureRenderer() {
+    return renderer || (renderer = createRenderer(rendererOptions));
+  }
+  function ensureHydrationRenderer() {
+    renderer = enabledHydration ? renderer : createHydrationRenderer(rendererOptions);
+    enabledHydration = true;
+    return renderer;
+  }
+  const render = (...args) => {
+    ensureRenderer().render(...args);
+  };
+  const hydrate = (...args) => {
+    ensureHydrationRenderer().hydrate(...args);
+  };
+  const createApp = (...args) => {
+    const app = ensureRenderer().createApp(...args);
+    {
+      injectNativeTagCheck(app);
+      injectCompilerOptionsCheck(app);
+    }
+    const { mount } = app;
+    app.mount = (containerOrSelector) => {
+      const container = normalizeContainer(containerOrSelector);
+      if (!container)
+        return;
+      const component = app._component;
+      if (!isFunction(component) && !component.render && !component.template) {
+        component.template = container.innerHTML;
+      }
+      container.innerHTML = "";
+      const proxy = mount(container, false, container instanceof SVGElement);
+      if (container instanceof Element) {
+        container.removeAttribute("v-cloak");
+        container.setAttribute("data-v-app", "");
+      }
+      return proxy;
+    };
+    return app;
+  };
+  const createSSRApp = (...args) => {
+    const app = ensureHydrationRenderer().createApp(...args);
+    {
+      injectNativeTagCheck(app);
+      injectCompilerOptionsCheck(app);
+    }
+    const { mount } = app;
+    app.mount = (containerOrSelector) => {
+      const container = normalizeContainer(containerOrSelector);
+      if (container) {
+        return mount(container, true, container instanceof SVGElement);
+      }
+    };
+    return app;
+  };
+  function injectNativeTagCheck(app) {
+    Object.defineProperty(app.config, "isNativeTag", {
+      value: (tag) => isHTMLTag(tag) || isSVGTag(tag),
+      writable: false
+    });
+  }
+  function injectCompilerOptionsCheck(app) {
+    if (isRuntimeOnly()) {
+      const isCustomElement = app.config.isCustomElement;
+      Object.defineProperty(app.config, "isCustomElement", {
+        get() {
+          return isCustomElement;
+        },
+        set() {
+          warn(
+            `The \`isCustomElement\` config option is deprecated. Use \`compilerOptions.isCustomElement\` instead.`
+          );
+        }
+      });
+      const compilerOptions = app.config.compilerOptions;
+      const msg = `The \`compilerOptions\` config option is only respected when using a build of Vue.js that includes the runtime compiler (aka "full build"). Since you are using the runtime-only build, \`compilerOptions\` must be passed to \`@vue/compiler-dom\` in the build setup instead.
+- For vue-loader: pass it via vue-loader's \`compilerOptions\` loader option.
+- For vue-cli: see https://cli.vuejs.org/guide/webpack.html#modifying-options-of-a-loader
+- For vite: pass it via @vitejs/plugin-vue options. See https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue#example-for-passing-options-to-vuecompiler-sfc`;
+      Object.defineProperty(app.config, "compilerOptions", {
+        get() {
+          warn(msg);
+          return compilerOptions;
+        },
+        set() {
+          warn(msg);
+        }
+      });
+    }
+  }
+  function normalizeContainer(container) {
+    if (isString(container)) {
+      const res = document.querySelector(container);
+      if (!res) {
+        warn(
+          `Failed to mount app: mount target selector "${container}" returned null.`
+        );
+      }
+      return res;
+    }
+    if (window.ShadowRoot && container instanceof window.ShadowRoot && container.mode === "closed") {
+      warn(
+        `mounting on a ShadowRoot with \`{mode: "closed"}\` may lead to unpredictable bugs`
+      );
+    }
+    return container;
+  }
+  const initDirectivesForSSR = NOOP;
+
+  function initDev() {
+    {
+      {
+        console.info(
+          `You are running a development build of Vue.
+Make sure to use the production build (*.prod.js) when deploying for production.`
+        );
+      }
+      initCustomFormatter();
+    }
+  }
+
+  function defaultOnError(error) {
+    throw error;
+  }
+  function defaultOnWarn(msg) {
+    console.warn(`[Vue warn] ${msg.message}`);
+  }
+  function createCompilerError(code, loc, messages, additionalMessage) {
+    const msg = (messages || errorMessages)[code] + (additionalMessage || ``) ;
+    const error = new SyntaxError(String(msg));
+    error.code = code;
+    error.loc = loc;
+    return error;
+  }
+  const errorMessages = {
+    // parse errors
+    [0]: "Illegal comment.",
+    [1]: "CDATA section is allowed only in XML context.",
+    [2]: "Duplicate attribute.",
+    [3]: "End tag cannot have attributes.",
+    [4]: "Illegal '/' in tags.",
+    [5]: "Unexpected EOF in tag.",
+    [6]: "Unexpected EOF in CDATA section.",
+    [7]: "Unexpected EOF in comment.",
+    [8]: "Unexpected EOF in script.",
+    [9]: "Unexpected EOF in tag.",
+    [10]: "Incorrectly closed comment.",
+    [11]: "Incorrectly opened comment.",
+    [12]: "Illegal tag name. Use '&lt;' to print '<'.",
+    [13]: "Attribute value was expected.",
+    [14]: "End tag name was expected.",
+    [15]: "Whitespace was expected.",
+    [16]: "Unexpected '<!--' in comment.",
+    [17]: `Attribute name cannot contain U+0022 ("), U+0027 ('), and U+003C (<).`,
+    [18]: "Unquoted attribute value cannot contain U+0022 (\"), U+0027 ('), U+003C (<), U+003D (=), and U+0060 (`).",
+    [19]: "Attribute name cannot start with '='.",
+    [21]: "'<?' is allowed only in XML context.",
+    [20]: `Unexpected null character.`,
+    [22]: "Illegal '/' in tags.",
+    // Vue-specific parse errors
+    [23]: "Invalid end tag.",
+    [24]: "Element is missing end tag.",
+    [25]: "Interpolation end sign was not found.",
+    [27]: "End bracket for dynamic directive argument was not found. Note that dynamic directive argument cannot contain spaces.",
+    [26]: "Legal directive name was expected.",
+    // transform errors
+    [28]: `v-if/v-else-if is missing expression.`,
+    [29]: `v-if/else branches must use unique keys.`,
+    [30]: `v-else/v-else-if has no adjacent v-if or v-else-if.`,
+    [31]: `v-for is missing expression.`,
+    [32]: `v-for has invalid expression.`,
+    [33]: `<template v-for> key should be placed on the <template> tag.`,
+    [34]: `v-bind is missing expression.`,
+    [35]: `v-on is missing expression.`,
+    [36]: `Unexpected custom directive on <slot> outlet.`,
+    [37]: `Mixed v-slot usage on both the component and nested <template>. When there are multiple named slots, all slots should use <template> syntax to avoid scope ambiguity.`,
+    [38]: `Duplicate slot names found. `,
+    [39]: `Extraneous children found when component already has explicitly named default slot. These children will be ignored.`,
+    [40]: `v-slot can only be used on components or <template> tags.`,
+    [41]: `v-model is missing expression.`,
+    [42]: `v-model value must be a valid JavaScript member expression.`,
+    [43]: `v-model cannot be used on v-for or v-slot scope variables because they are not writable.`,
+    [44]: `v-model cannot be used on a prop, because local prop bindings are not writable.
+Use a v-bind binding combined with a v-on listener that emits update:x event instead.`,
+    [45]: `Error parsing JavaScript expression: `,
+    [46]: `<KeepAlive> expects exactly one child component.`,
+    // generic errors
+    [47]: `"prefixIdentifiers" option is not supported in this build of compiler.`,
+    [48]: `ES module mode is not supported in this build of compiler.`,
+    [49]: `"cacheHandlers" option is only supported when the "prefixIdentifiers" option is enabled.`,
+    [50]: `"scopeId" option is only supported in module mode.`,
+    // deprecations
+    [51]: `@vnode-* hooks in templates are deprecated. Use the vue: prefix instead. For example, @vnode-mounted should be changed to @vue:mounted. @vnode-* hooks support will be removed in 3.4.`,
+    [52]: `v-is="component-name" has been deprecated. Use is="vue:component-name" instead. v-is support will be removed in 3.4.`,
+    // just to fulfill types
+    [53]: ``
+  };
+
+  const FRAGMENT = Symbol(`Fragment` );
+  const TELEPORT = Symbol(`Teleport` );
+  const SUSPENSE = Symbol(`Suspense` );
+  const KEEP_ALIVE = Symbol(`KeepAlive` );
+  const BASE_TRANSITION = Symbol(`BaseTransition` );
+  const OPEN_BLOCK = Symbol(`openBlock` );
+  const CREATE_BLOCK = Symbol(`createBlock` );
+  const CREATE_ELEMENT_BLOCK = Symbol(`createElementBlock` );
+  const CREATE_VNODE = Symbol(`createVNode` );
+  const CREATE_ELEMENT_VNODE = Symbol(`createElementVNode` );
+  const CREATE_COMMENT = Symbol(`createCommentVNode` );
+  const CREATE_TEXT = Symbol(`createTextVNode` );
+  const CREATE_STATIC = Symbol(`createStaticVNode` );
+  const RESOLVE_COMPONENT = Symbol(`resolveComponent` );
+  const RESOLVE_DYNAMIC_COMPONENT = Symbol(
+    `resolveDynamicComponent`
+  );
+  const RESOLVE_DIRECTIVE = Symbol(`resolveDirective` );
+  const RESOLVE_FILTER = Symbol(`resolveFilter` );
+  const WITH_DIRECTIVES = Symbol(`withDirectives` );
+  const RENDER_LIST = Symbol(`renderList` );
+  const RENDER_SLOT = Symbol(`renderSlot` );
+  const CREATE_SLOTS = Symbol(`createSlots` );
+  const TO_DISPLAY_STRING = Symbol(`toDisplayString` );
+  const MERGE_PROPS = Symbol(`mergeProps` );
+  const NORMALIZE_CLASS = Symbol(`normalizeClass` );
+  const NORMALIZE_STYLE = Symbol(`normalizeStyle` );
+  const NORMALIZE_PROPS = Symbol(`normalizeProps` );
+  const GUARD_REACTIVE_PROPS = Symbol(`guardReactiveProps` );
+  const TO_HANDLERS = Symbol(`toHandlers` );
+  const CAMELIZE = Symbol(`camelize` );
+  const CAPITALIZE = Symbol(`capitalize` );
+  const TO_HANDLER_KEY = Symbol(`toHandlerKey` );
+  const SET_BLOCK_TRACKING = Symbol(`setBlockTracking` );
+  const PUSH_SCOPE_ID = Symbol(`pushScopeId` );
+  const POP_SCOPE_ID = Symbol(`popScopeId` );
+  const WITH_CTX = Symbol(`withCtx` );
+  const UNREF = Symbol(`unref` );
+  const IS_REF = Symbol(`isRef` );
+  const WITH_MEMO = Symbol(`withMemo` );
+  const IS_MEMO_SAME = Symbol(`isMemoSame` );
+  const helperNameMap = {
+    [FRAGMENT]: `Fragment`,
+    [TELEPORT]: `Teleport`,
+    [SUSPENSE]: `Suspense`,
+    [KEEP_ALIVE]: `KeepAlive`,
+    [BASE_TRANSITION]: `BaseTransition`,
+    [OPEN_BLOCK]: `openBlock`,
+    [CREATE_BLOCK]: `createBlock`,
+    [CREATE_ELEMENT_BLOCK]: `createElementBlock`,
+    [CREATE_VNODE]: `createVNode`,
+    [CREATE_ELEMENT_VNODE]: `createElementVNode`,
+    [CREATE_COMMENT]: `createCommentVNode`,
+    [CREATE_TEXT]: `createTextVNode`,
+    [CREATE_STATIC]: `createStaticVNode`,
+    [RESOLVE_COMPONENT]: `resolveComponent`,
+    [RESOLVE_DYNAMIC_COMPONENT]: `resolveDynamicComponent`,
+    [RESOLVE_DIRECTIVE]: `resolveDirective`,
+    [RESOLVE_FILTER]: `resolveFilter`,
+    [WITH_DIRECTIVES]: `withDirectives`,
+    [RENDER_LIST]: `renderList`,
+    [RENDER_SLOT]: `renderSlot`,
+    [CREATE_SLOTS]: `createSlots`,
+    [TO_DISPLAY_STRING]: `toDisplayString`,
+    [MERGE_PROPS]: `mergeProps`,
+    [NORMALIZE_CLASS]: `normalizeClass`,
+    [NORMALIZE_STYLE]: `normalizeStyle`,
+    [NORMALIZE_PROPS]: `normalizeProps`,
+    [GUARD_REACTIVE_PROPS]: `guardReactiveProps`,
+    [TO_HANDLERS]: `toHandlers`,
+    [CAMELIZE]: `camelize`,
+    [CAPITALIZE]: `capitalize`,
+    [TO_HANDLER_KEY]: `toHandlerKey`,
+    [SET_BLOCK_TRACKING]: `setBlockTracking`,
+    [PUSH_SCOPE_ID]: `pushScopeId`,
+    [POP_SCOPE_ID]: `popScopeId`,
+    [WITH_CTX]: `withCtx`,
+    [UNREF]: `unref`,
+    [IS_REF]: `isRef`,
+    [WITH_MEMO]: `withMemo`,
+    [IS_MEMO_SAME]: `isMemoSame`
+  };
+  function registerRuntimeHelpers(helpers) {
+    Object.getOwnPropertySymbols(helpers).forEach((s) => {
+      helperNameMap[s] = helpers[s];
+    });
+  }
+
+  const locStub = {
+    source: "",
+    start: { line: 1, column: 1, offset: 0 },
+    end: { line: 1, column: 1, offset: 0 }
+  };
+  function createRoot(children, loc = locStub) {
+    return {
+      type: 0,
+      children,
+      helpers: /* @__PURE__ */ new Set(),
+      components: [],
+      directives: [],
+      hoists: [],
+      imports: [],
+      cached: 0,
+      temps: 0,
+      codegenNode: void 0,
+      loc
+    };
+  }
+  function createVNodeCall(context, tag, props, children, patchFlag, dynamicProps, directives, isBlock = false, disableTracking = false, isComponent = false, loc = locStub) {
+    if (context) {
+      if (isBlock) {
+        context.helper(OPEN_BLOCK);
+        context.helper(getVNodeBlockHelper(context.inSSR, isComponent));
+      } else {
+        context.helper(getVNodeHelper(context.inSSR, isComponent));
+      }
+      if (directives) {
+        context.helper(WITH_DIRECTIVES);
+      }
+    }
+    return {
+      type: 13,
+      tag,
+      props,
+      children,
+      patchFlag,
+      dynamicProps,
+      directives,
+      isBlock,
+      disableTracking,
+      isComponent,
+      loc
+    };
+  }
+  function createArrayExpression(elements, loc = locStub) {
+    return {
+      type: 17,
+      loc,
+      elements
+    };
+  }
+  function createObjectExpression(properties, loc = locStub) {
+    return {
+      type: 15,
+      loc,
+      properties
+    };
+  }
+  function createObjectProperty(key, value) {
+    return {
+      type: 16,
+      loc: locStub,
+      key: isString(key) ? createSimpleExpression(key, true) : key,
+      value
+    };
+  }
+  function createSimpleExpression(content, isStatic = false, loc = locStub, constType = 0) {
+    return {
+      type: 4,
+      loc,
+      content,
+      isStatic,
+      constType: isStatic ? 3 : constType
+    };
+  }
+  function createCompoundExpression(children, loc = locStub) {
+    return {
+      type: 8,
+      loc,
+      children
+    };
+  }
+  function createCallExpression(callee, args = [], loc = locStub) {
+    return {
+      type: 14,
+      loc,
+      callee,
+      arguments: args
+    };
+  }
+  function createFunctionExpression(params, returns = void 0, newline = false, isSlot = false, loc = locStub) {
+    return {
+      type: 18,
+      params,
+      returns,
+      newline,
+      isSlot,
+      loc
+    };
+  }
+  function createConditionalExpression(test, consequent, alternate, newline = true) {
+    return {
+      type: 19,
+      test,
+      consequent,
+      alternate,
+      newline,
+      loc: locStub
+    };
+  }
+  function createCacheExpression(index, value, isVNode = false) {
+    return {
+      type: 20,
+      index,
+      value,
+      isVNode,
+      loc: locStub
+    };
+  }
+  function createBlockStatement(body) {
+    return {
+      type: 21,
+      body,
+      loc: locStub
+    };
+  }
+  function getVNodeHelper(ssr, isComponent) {
+    return ssr || isComponent ? CREATE_VNODE : CREATE_ELEMENT_VNODE;
+  }
+  function getVNodeBlockHelper(ssr, isComponent) {
+    return ssr || isComponent ? CREATE_BLOCK : CREATE_ELEMENT_BLOCK;
+  }
+  function convertToBlock(node, { helper, removeHelper, inSSR }) {
+    if (!node.isBlock) {
+      node.isBlock = true;
+      removeHelper(getVNodeHelper(inSSR, node.isComponent));
+      helper(OPEN_BLOCK);
+      helper(getVNodeBlockHelper(inSSR, node.isComponent));
+    }
+  }
+
+  const isStaticExp = (p) => p.type === 4 && p.isStatic;
+  const isBuiltInType = (tag, expected) => tag === expected || tag === hyphenate(expected);
+  function isCoreComponent(tag) {
+    if (isBuiltInType(tag, "Teleport")) {
+      return TELEPORT;
+    } else if (isBuiltInType(tag, "Suspense")) {
+      return SUSPENSE;
+    } else if (isBuiltInType(tag, "KeepAlive")) {
+      return KEEP_ALIVE;
+    } else if (isBuiltInType(tag, "BaseTransition")) {
+      return BASE_TRANSITION;
+    }
+  }
+  const nonIdentifierRE = /^\d|[^\$\w]/;
+  const isSimpleIdentifier = (name) => !nonIdentifierRE.test(name);
+  const validFirstIdentCharRE = /[A-Za-z_$\xA0-\uFFFF]/;
+  const validIdentCharRE = /[\.\?\w$\xA0-\uFFFF]/;
+  const whitespaceRE = /\s+[.[]\s*|\s*[.[]\s+/g;
+  const isMemberExpressionBrowser = (path) => {
+    path = path.trim().replace(whitespaceRE, (s) => s.trim());
+    let state = 0 /* inMemberExp */;
+    let stateStack = [];
+    let currentOpenBracketCount = 0;
+    let currentOpenParensCount = 0;
+    let currentStringType = null;
+    for (let i = 0; i < path.length; i++) {
+      const char = path.charAt(i);
+      switch (state) {
+        case 0 /* inMemberExp */:
+          if (char === "[") {
+            stateStack.push(state);
+            state = 1 /* inBrackets */;
+            currentOpenBracketCount++;
+          } else if (char === "(") {
+            stateStack.push(state);
+            state = 2 /* inParens */;
+            currentOpenParensCount++;
+          } else if (!(i === 0 ? validFirstIdentCharRE : validIdentCharRE).test(char)) {
+            return false;
+          }
+          break;
+        case 1 /* inBrackets */:
+          if (char === `'` || char === `"` || char === "`") {
+            stateStack.push(state);
+            state = 3 /* inString */;
+            currentStringType = char;
+          } else if (char === `[`) {
+            currentOpenBracketCount++;
+          } else if (char === `]`) {
+            if (!--currentOpenBracketCount) {
+              state = stateStack.pop();
+            }
+          }
+          break;
+        case 2 /* inParens */:
+          if (char === `'` || char === `"` || char === "`") {
+            stateStack.push(state);
+            state = 3 /* inString */;
+            currentStringType = char;
+          } else if (char === `(`) {
+            currentOpenParensCount++;
+          } else if (char === `)`) {
+            if (i === path.length - 1) {
+              return false;
+            }
+            if (!--currentOpenParensCount) {
+              state = stateStack.pop();
+            }
+          }
+          break;
+        case 3 /* inString */:
+          if (char === currentStringType) {
+            state = stateStack.pop();
+            currentStringType = null;
+          }
+          break;
+      }
+    }
+    return !currentOpenBracketCount && !currentOpenParensCount;
+  };
+  const isMemberExpression = isMemberExpressionBrowser ;
+  function getInnerRange(loc, offset, length) {
+    const source = loc.source.slice(offset, offset + length);
+    const newLoc = {
+      source,
+      start: advancePositionWithClone(loc.start, loc.source, offset),
+      end: loc.end
+    };
+    if (length != null) {
+      newLoc.end = advancePositionWithClone(
+        loc.start,
+        loc.source,
+        offset + length
+      );
+    }
+    return newLoc;
+  }
+  function advancePositionWithClone(pos, source, numberOfCharacters = source.length) {
+    return advancePositionWithMutation(
+      extend({}, pos),
+      source,
+      numberOfCharacters
+    );
+  }
+  function advancePositionWithMutation(pos, source, numberOfCharacters = source.length) {
+    let linesCount = 0;
+    let lastNewLinePos = -1;
+    for (let i = 0; i < numberOfCharacters; i++) {
+      if (source.charCodeAt(i) === 10) {
+        linesCount++;
+        lastNewLinePos = i;
+      }
+    }
+    pos.offset += numberOfCharacters;
+    pos.line += linesCount;
+    pos.column = lastNewLinePos === -1 ? pos.column + numberOfCharacters : numberOfCharacters - lastNewLinePos;
+    return pos;
+  }
+  function assert(condition, msg) {
+    if (!condition) {
+      throw new Error(msg || `unexpected compiler condition`);
+    }
+  }
+  function findDir(node, name, allowEmpty = false) {
+    for (let i = 0; i < node.props.length; i++) {
+      const p = node.props[i];
+      if (p.type === 7 && (allowEmpty || p.exp) && (isString(name) ? p.name === name : name.test(p.name))) {
+        return p;
+      }
+    }
+  }
+  function findProp(node, name, dynamicOnly = false, allowEmpty = false) {
+    for (let i = 0; i < node.props.length; i++) {
+      const p = node.props[i];
+      if (p.type === 6) {
+        if (dynamicOnly)
+          continue;
+        if (p.name === name && (p.value || allowEmpty)) {
+          return p;
+        }
+      } else if (p.name === "bind" && (p.exp || allowEmpty) && isStaticArgOf(p.arg, name)) {
+        return p;
+      }
+    }
+  }
+  function isStaticArgOf(arg, name) {
+    return !!(arg && isStaticExp(arg) && arg.content === name);
+  }
+  function hasDynamicKeyVBind(node) {
+    return node.props.some(
+      (p) => p.type === 7 && p.name === "bind" && (!p.arg || // v-bind="obj"
+      p.arg.type !== 4 || // v-bind:[_ctx.foo]
+      !p.arg.isStatic)
+      // v-bind:[foo]
+    );
+  }
+  function isText$1(node) {
+    return node.type === 5 || node.type === 2;
+  }
+  function isVSlot(p) {
+    return p.type === 7 && p.name === "slot";
+  }
+  function isTemplateNode(node) {
+    return node.type === 1 && node.tagType === 3;
+  }
+  function isSlotOutlet(node) {
+    return node.type === 1 && node.tagType === 2;
+  }
+  const propsHelperSet = /* @__PURE__ */ new Set([NORMALIZE_PROPS, GUARD_REACTIVE_PROPS]);
+  function getUnnormalizedProps(props, callPath = []) {
+    if (props && !isString(props) && props.type === 14) {
+      const callee = props.callee;
+      if (!isString(callee) && propsHelperSet.has(callee)) {
+        return getUnnormalizedProps(
+          props.arguments[0],
+          callPath.concat(props)
+        );
+      }
+    }
+    return [props, callPath];
+  }
+  function injectProp(node, prop, context) {
+    let propsWithInjection;
+    let props = node.type === 13 ? node.props : node.arguments[2];
+    let callPath = [];
+    let parentCall;
+    if (props && !isString(props) && props.type === 14) {
+      const ret = getUnnormalizedProps(props);
+      props = ret[0];
+      callPath = ret[1];
+      parentCall = callPath[callPath.length - 1];
+    }
+    if (props == null || isString(props)) {
+      propsWithInjection = createObjectExpression([prop]);
+    } else if (props.type === 14) {
+      const first = props.arguments[0];
+      if (!isString(first) && first.type === 15) {
+        if (!hasProp(prop, first)) {
+          first.properties.unshift(prop);
+        }
+      } else {
+        if (props.callee === TO_HANDLERS) {
+          propsWithInjection = createCallExpression(context.helper(MERGE_PROPS), [
+            createObjectExpression([prop]),
+            props
+          ]);
+        } else {
+          props.arguments.unshift(createObjectExpression([prop]));
+        }
+      }
+      !propsWithInjection && (propsWithInjection = props);
+    } else if (props.type === 15) {
+      if (!hasProp(prop, props)) {
+        props.properties.unshift(prop);
+      }
+      propsWithInjection = props;
+    } else {
+      propsWithInjection = createCallExpression(context.helper(MERGE_PROPS), [
+        createObjectExpression([prop]),
+        props
+      ]);
+      if (parentCall && parentCall.callee === GUARD_REACTIVE_PROPS) {
+        parentCall = callPath[callPath.length - 2];
+      }
+    }
+    if (node.type === 13) {
+      if (parentCall) {
+        parentCall.arguments[0] = propsWithInjection;
+      } else {
+        node.props = propsWithInjection;
+      }
+    } else {
+      if (parentCall) {
+        parentCall.arguments[0] = propsWithInjection;
+      } else {
+        node.arguments[2] = propsWithInjection;
+      }
+    }
+  }
+  function hasProp(prop, props) {
+    let result = false;
+    if (prop.key.type === 4) {
+      const propKeyName = prop.key.content;
+      result = props.properties.some(
+        (p) => p.key.type === 4 && p.key.content === propKeyName
+      );
+    }
+    return result;
+  }
+  function toValidAssetId(name, type) {
+    return `_${type}_${name.replace(/[^\w]/g, (searchValue, replaceValue) => {
+    return searchValue === "-" ? "_" : name.charCodeAt(replaceValue).toString();
+  })}`;
+  }
+  function getMemoedVNodeCall(node) {
+    if (node.type === 14 && node.callee === WITH_MEMO) {
+      return node.arguments[1].returns;
+    } else {
+      return node;
+    }
+  }
+
+  const decodeRE = /&(gt|lt|amp|apos|quot);/g;
+  const decodeMap = {
+    gt: ">",
+    lt: "<",
+    amp: "&",
+    apos: "'",
+    quot: '"'
+  };
+  const defaultParserOptions = {
+    delimiters: [`{{`, `}}`],
+    getNamespace: () => 0,
+    getTextMode: () => 0,
+    isVoidTag: NO,
+    isPreTag: NO,
+    isCustomElement: NO,
+    decodeEntities: (rawText) => rawText.replace(decodeRE, (_, p1) => decodeMap[p1]),
+    onError: defaultOnError,
+    onWarn: defaultOnWarn,
+    comments: true
+  };
+  function baseParse(content, options = {}) {
+    const context = createParserContext(content, options);
+    const start = getCursor(context);
+    return createRoot(
+      parseChildren(context, 0, []),
+      getSelection(context, start)
+    );
+  }
+  function createParserContext(content, rawOptions) {
+    const options = extend({}, defaultParserOptions);
+    let key;
+    for (key in rawOptions) {
+      options[key] = rawOptions[key] === void 0 ? defaultParserOptions[key] : rawOptions[key];
+    }
+    return {
+      options,
+      column: 1,
+      line: 1,
+      offset: 0,
+      originalSource: content,
+      source: content,
+      inPre: false,
+      inVPre: false,
+      onWarn: options.onWarn
+    };
+  }
+  function parseChildren(context, mode, ancestors) {
+    const parent = last(ancestors);
+    const ns = parent ? parent.ns : 0;
+    const nodes = [];
+    while (!isEnd(context, mode, ancestors)) {
+      const s = context.source;
+      let node = void 0;
+      if (mode === 0 || mode === 1) {
+        if (!context.inVPre && startsWith(s, context.options.delimiters[0])) {
+          node = parseInterpolation(context, mode);
+        } else if (mode === 0 && s[0] === "<") {
+          if (s.length === 1) {
+            emitError(context, 5, 1);
+          } else if (s[1] === "!") {
+            if (startsWith(s, "<!--")) {
+              node = parseComment(context);
+            } else if (startsWith(s, "<!DOCTYPE")) {
+              node = parseBogusComment(context);
+            } else if (startsWith(s, "<![CDATA[")) {
+              if (ns !== 0) {
+                node = parseCDATA(context, ancestors);
+              } else {
+                emitError(context, 1);
+                node = parseBogusComment(context);
+              }
+            } else {
+              emitError(context, 11);
+              node = parseBogusComment(context);
+            }
+          } else if (s[1] === "/") {
+            if (s.length === 2) {
+              emitError(context, 5, 2);
+            } else if (s[2] === ">") {
+              emitError(context, 14, 2);
+              advanceBy(context, 3);
+              continue;
+            } else if (/[a-z]/i.test(s[2])) {
+              emitError(context, 23);
+              parseTag(context, 1 /* End */, parent);
+              continue;
+            } else {
+              emitError(
+                context,
+                12,
+                2
+              );
+              node = parseBogusComment(context);
+            }
+          } else if (/[a-z]/i.test(s[1])) {
+            node = parseElement(context, ancestors);
+          } else if (s[1] === "?") {
+            emitError(
+              context,
+              21,
+              1
+            );
+            node = parseBogusComment(context);
+          } else {
+            emitError(context, 12, 1);
+          }
+        }
+      }
+      if (!node) {
+        node = parseText(context, mode);
+      }
+      if (isArray(node)) {
+        for (let i = 0; i < node.length; i++) {
+          pushNode(nodes, node[i]);
+        }
+      } else {
+        pushNode(nodes, node);
+      }
+    }
+    let removedWhitespace = false;
+    if (mode !== 2 && mode !== 1) {
+      const shouldCondense = context.options.whitespace !== "preserve";
+      for (let i = 0; i < nodes.length; i++) {
+        const node = nodes[i];
+        if (node.type === 2) {
+          if (!context.inPre) {
+            if (!/[^\t\r\n\f ]/.test(node.content)) {
+              const prev = nodes[i - 1];
+              const next = nodes[i + 1];
+              if (!prev || !next || shouldCondense && (prev.type === 3 && next.type === 3 || prev.type === 3 && next.type === 1 || prev.type === 1 && next.type === 3 || prev.type === 1 && next.type === 1 && /[\r\n]/.test(node.content))) {
+                removedWhitespace = true;
+                nodes[i] = null;
+              } else {
+                node.content = " ";
+              }
+            } else if (shouldCondense) {
+              node.content = node.content.replace(/[\t\r\n\f ]+/g, " ");
+            }
+          } else {
+            node.content = node.content.replace(/\r\n/g, "\n");
+          }
+        } else if (node.type === 3 && !context.options.comments) {
+          removedWhitespace = true;
+          nodes[i] = null;
+        }
+      }
+      if (context.inPre && parent && context.options.isPreTag(parent.tag)) {
+        const first = nodes[0];
+        if (first && first.type === 2) {
+          first.content = first.content.replace(/^\r?\n/, "");
+        }
+      }
+    }
+    return removedWhitespace ? nodes.filter(Boolean) : nodes;
+  }
+  function pushNode(nodes, node) {
+    if (node.type === 2) {
+      const prev = last(nodes);
+      if (prev && prev.type === 2 && prev.loc.end.offset === node.loc.start.offset) {
+        prev.content += node.content;
+        prev.loc.end = node.loc.end;
+        prev.loc.source += node.loc.source;
+        return;
+      }
+    }
+    nodes.push(node);
+  }
+  function parseCDATA(context, ancestors) {
+    advanceBy(context, 9);
+    const nodes = parseChildren(context, 3, ancestors);
+    if (context.source.length === 0) {
+      emitError(context, 6);
+    } else {
+      advanceBy(context, 3);
+    }
+    return nodes;
+  }
+  function parseComment(context) {
+    const start = getCursor(context);
+    let content;
+    const match = /--(\!)?>/.exec(context.source);
+    if (!match) {
+      content = context.source.slice(4);
+      advanceBy(context, context.source.length);
+      emitError(context, 7);
+    } else {
+      if (match.index <= 3) {
+        emitError(context, 0);
+      }
+      if (match[1]) {
+        emitError(context, 10);
+      }
+      content = context.source.slice(4, match.index);
+      const s = context.source.slice(0, match.index);
+      let prevIndex = 1, nestedIndex = 0;
+      while ((nestedIndex = s.indexOf("<!--", prevIndex)) !== -1) {
+        advanceBy(context, nestedIndex - prevIndex + 1);
+        if (nestedIndex + 4 < s.length) {
+          emitError(context, 16);
+        }
+        prevIndex = nestedIndex + 1;
+      }
+      advanceBy(context, match.index + match[0].length - prevIndex + 1);
+    }
+    return {
+      type: 3,
+      content,
+      loc: getSelection(context, start)
+    };
+  }
+  function parseBogusComment(context) {
+    const start = getCursor(context);
+    const contentStart = context.source[1] === "?" ? 1 : 2;
+    let content;
+    const closeIndex = context.source.indexOf(">");
+    if (closeIndex === -1) {
+      content = context.source.slice(contentStart);
+      advanceBy(context, context.source.length);
+    } else {
+      content = context.source.slice(contentStart, closeIndex);
+      advanceBy(context, closeIndex + 1);
+    }
+    return {
+      type: 3,
+      content,
+      loc: getSelection(context, start)
+    };
+  }
+  function parseElement(context, ancestors) {
+    const wasInPre = context.inPre;
+    const wasInVPre = context.inVPre;
+    const parent = last(ancestors);
+    const element = parseTag(context, 0 /* Start */, parent);
+    const isPreBoundary = context.inPre && !wasInPre;
+    const isVPreBoundary = context.inVPre && !wasInVPre;
+    if (element.isSelfClosing || context.options.isVoidTag(element.tag)) {
+      if (isPreBoundary) {
+        context.inPre = false;
+      }
+      if (isVPreBoundary) {
+        context.inVPre = false;
+      }
+      return element;
+    }
+    ancestors.push(element);
+    const mode = context.options.getTextMode(element, parent);
+    const children = parseChildren(context, mode, ancestors);
+    ancestors.pop();
+    element.children = children;
+    if (startsWithEndTagOpen(context.source, element.tag)) {
+      parseTag(context, 1 /* End */, parent);
+    } else {
+      emitError(context, 24, 0, element.loc.start);
+      if (context.source.length === 0 && element.tag.toLowerCase() === "script") {
+        const first = children[0];
+        if (first && startsWith(first.loc.source, "<!--")) {
+          emitError(context, 8);
+        }
+      }
+    }
+    element.loc = getSelection(context, element.loc.start);
+    if (isPreBoundary) {
+      context.inPre = false;
+    }
+    if (isVPreBoundary) {
+      context.inVPre = false;
+    }
+    return element;
+  }
+  const isSpecialTemplateDirective = /* @__PURE__ */ makeMap(
+    `if,else,else-if,for,slot`
+  );
+  function parseTag(context, type, parent) {
+    const start = getCursor(context);
+    const match = /^<\/?([a-z][^\t\r\n\f />]*)/i.exec(context.source);
+    const tag = match[1];
+    const ns = context.options.getNamespace(tag, parent);
+    advanceBy(context, match[0].length);
+    advanceSpaces(context);
+    const cursor = getCursor(context);
+    const currentSource = context.source;
+    if (context.options.isPreTag(tag)) {
+      context.inPre = true;
+    }
+    let props = parseAttributes(context, type);
+    if (type === 0 /* Start */ && !context.inVPre && props.some((p) => p.type === 7 && p.name === "pre")) {
+      context.inVPre = true;
+      extend(context, cursor);
+      context.source = currentSource;
+      props = parseAttributes(context, type).filter((p) => p.name !== "v-pre");
+    }
+    let isSelfClosing = false;
+    if (context.source.length === 0) {
+      emitError(context, 9);
+    } else {
+      isSelfClosing = startsWith(context.source, "/>");
+      if (type === 1 /* End */ && isSelfClosing) {
+        emitError(context, 4);
+      }
+      advanceBy(context, isSelfClosing ? 2 : 1);
+    }
+    if (type === 1 /* End */) {
+      return;
+    }
+    let tagType = 0;
+    if (!context.inVPre) {
+      if (tag === "slot") {
+        tagType = 2;
+      } else if (tag === "template") {
+        if (props.some(
+          (p) => p.type === 7 && isSpecialTemplateDirective(p.name)
+        )) {
+          tagType = 3;
+        }
+      } else if (isComponent(tag, props, context)) {
+        tagType = 1;
+      }
+    }
+    return {
+      type: 1,
+      ns,
+      tag,
+      tagType,
+      props,
+      isSelfClosing,
+      children: [],
+      loc: getSelection(context, start),
+      codegenNode: void 0
+      // to be created during transform phase
+    };
+  }
+  function isComponent(tag, props, context) {
+    const options = context.options;
+    if (options.isCustomElement(tag)) {
+      return false;
+    }
+    if (tag === "component" || /^[A-Z]/.test(tag) || isCoreComponent(tag) || options.isBuiltInComponent && options.isBuiltInComponent(tag) || options.isNativeTag && !options.isNativeTag(tag)) {
+      return true;
+    }
+    for (let i = 0; i < props.length; i++) {
+      const p = props[i];
+      if (p.type === 6) {
+        if (p.name === "is" && p.value) {
+          if (p.value.content.startsWith("vue:")) {
+            return true;
+          }
+        }
+      } else {
+        if (p.name === "is") {
+          return true;
+        } else if (
+          // :is on plain element - only treat as component in compat mode
+          p.name === "bind" && isStaticArgOf(p.arg, "is") && false
+        ) {
+          return true;
+        }
+      }
+    }
+  }
+  function parseAttributes(context, type) {
+    const props = [];
+    const attributeNames = /* @__PURE__ */ new Set();
+    while (context.source.length > 0 && !startsWith(context.source, ">") && !startsWith(context.source, "/>")) {
+      if (startsWith(context.source, "/")) {
+        emitError(context, 22);
+        advanceBy(context, 1);
+        advanceSpaces(context);
+        continue;
+      }
+      if (type === 1 /* End */) {
+        emitError(context, 3);
+      }
+      const attr = parseAttribute(context, attributeNames);
+      if (attr.type === 6 && attr.value && attr.name === "class") {
+        attr.value.content = attr.value.content.replace(/\s+/g, " ").trim();
+      }
+      if (type === 0 /* Start */) {
+        props.push(attr);
+      }
+      if (/^[^\t\r\n\f />]/.test(context.source)) {
+        emitError(context, 15);
+      }
+      advanceSpaces(context);
+    }
+    return props;
+  }
+  function parseAttribute(context, nameSet) {
+    var _a;
+    const start = getCursor(context);
+    const match = /^[^\t\r\n\f />][^\t\r\n\f />=]*/.exec(context.source);
+    const name = match[0];
+    if (nameSet.has(name)) {
+      emitError(context, 2);
+    }
+    nameSet.add(name);
+    if (name[0] === "=") {
+      emitError(context, 19);
+    }
+    {
+      const pattern = /["'<]/g;
+      let m;
+      while (m = pattern.exec(name)) {
+        emitError(
+          context,
+          17,
+          m.index
+        );
+      }
+    }
+    advanceBy(context, name.length);
+    let value = void 0;
+    if (/^[\t\r\n\f ]*=/.test(context.source)) {
+      advanceSpaces(context);
+      advanceBy(context, 1);
+      advanceSpaces(context);
+      value = parseAttributeValue(context);
+      if (!value) {
+        emitError(context, 13);
+      }
+    }
+    const loc = getSelection(context, start);
+    if (!context.inVPre && /^(v-[A-Za-z0-9-]|:|\.|@|#)/.test(name)) {
+      const match2 = /(?:^v-([a-z0-9-]+))?(?:(?::|^\.|^@|^#)(\[[^\]]+\]|[^\.]+))?(.+)?$/i.exec(
+        name
+      );
+      let isPropShorthand = startsWith(name, ".");
+      let dirName = match2[1] || (isPropShorthand || startsWith(name, ":") ? "bind" : startsWith(name, "@") ? "on" : "slot");
+      let arg;
+      if (match2[2]) {
+        const isSlot = dirName === "slot";
+        const startOffset = name.lastIndexOf(
+          match2[2],
+          name.length - (((_a = match2[3]) == null ? void 0 : _a.length) || 0)
+        );
+        const loc2 = getSelection(
+          context,
+          getNewPosition(context, start, startOffset),
+          getNewPosition(
+            context,
+            start,
+            startOffset + match2[2].length + (isSlot && match2[3] || "").length
+          )
+        );
+        let content = match2[2];
+        let isStatic = true;
+        if (content.startsWith("[")) {
+          isStatic = false;
+          if (!content.endsWith("]")) {
+            emitError(
+              context,
+              27
+            );
+            content = content.slice(1);
+          } else {
+            content = content.slice(1, content.length - 1);
+          }
+        } else if (isSlot) {
+          content += match2[3] || "";
+        }
+        arg = {
+          type: 4,
+          content,
+          isStatic,
+          constType: isStatic ? 3 : 0,
+          loc: loc2
+        };
+      }
+      if (value && value.isQuoted) {
+        const valueLoc = value.loc;
+        valueLoc.start.offset++;
+        valueLoc.start.column++;
+        valueLoc.end = advancePositionWithClone(valueLoc.start, value.content);
+        valueLoc.source = valueLoc.source.slice(1, -1);
+      }
+      const modifiers = match2[3] ? match2[3].slice(1).split(".") : [];
+      if (isPropShorthand)
+        modifiers.push("prop");
+      return {
+        type: 7,
+        name: dirName,
+        exp: value && {
+          type: 4,
+          content: value.content,
+          isStatic: false,
+          // Treat as non-constant by default. This can be potentially set to
+          // other values by `transformExpression` to make it eligible for hoisting.
+          constType: 0,
+          loc: value.loc
+        },
+        arg,
+        modifiers,
+        loc
+      };
+    }
+    if (!context.inVPre && startsWith(name, "v-")) {
+      emitError(context, 26);
+    }
+    return {
+      type: 6,
+      name,
+      value: value && {
+        type: 2,
+        content: value.content,
+        loc: value.loc
+      },
+      loc
+    };
+  }
+  function parseAttributeValue(context) {
+    const start = getCursor(context);
+    let content;
+    const quote = context.source[0];
+    const isQuoted = quote === `"` || quote === `'`;
+    if (isQuoted) {
+      advanceBy(context, 1);
+      const endIndex = context.source.indexOf(quote);
+      if (endIndex === -1) {
+        content = parseTextData(
+          context,
+          context.source.length,
+          4
+        );
+      } else {
+        content = parseTextData(context, endIndex, 4);
+        advanceBy(context, 1);
+      }
+    } else {
+      const match = /^[^\t\r\n\f >]+/.exec(context.source);
+      if (!match) {
+        return void 0;
+      }
+      const unexpectedChars = /["'<=`]/g;
+      let m;
+      while (m = unexpectedChars.exec(match[0])) {
+        emitError(
+          context,
+          18,
+          m.index
+        );
+      }
+      content = parseTextData(context, match[0].length, 4);
+    }
+    return { content, isQuoted, loc: getSelection(context, start) };
+  }
+  function parseInterpolation(context, mode) {
+    const [open, close] = context.options.delimiters;
+    const closeIndex = context.source.indexOf(close, open.length);
+    if (closeIndex === -1) {
+      emitError(context, 25);
+      return void 0;
+    }
+    const start = getCursor(context);
+    advanceBy(context, open.length);
+    const innerStart = getCursor(context);
+    const innerEnd = getCursor(context);
+    const rawContentLength = closeIndex - open.length;
+    const rawContent = context.source.slice(0, rawContentLength);
+    const preTrimContent = parseTextData(context, rawContentLength, mode);
+    const content = preTrimContent.trim();
+    const startOffset = preTrimContent.indexOf(content);
+    if (startOffset > 0) {
+      advancePositionWithMutation(innerStart, rawContent, startOffset);
+    }
+    const endOffset = rawContentLength - (preTrimContent.length - content.length - startOffset);
+    advancePositionWithMutation(innerEnd, rawContent, endOffset);
+    advanceBy(context, close.length);
+    return {
+      type: 5,
+      content: {
+        type: 4,
+        isStatic: false,
+        // Set `isConstant` to false by default and will decide in transformExpression
+        constType: 0,
+        content,
+        loc: getSelection(context, innerStart, innerEnd)
+      },
+      loc: getSelection(context, start)
+    };
+  }
+  function parseText(context, mode) {
+    const endTokens = mode === 3 ? ["]]>"] : ["<", context.options.delimiters[0]];
+    let endIndex = context.source.length;
+    for (let i = 0; i < endTokens.length; i++) {
+      const index = context.source.indexOf(endTokens[i], 1);
+      if (index !== -1 && endIndex > index) {
+        endIndex = index;
+      }
+    }
+    const start = getCursor(context);
+    const content = parseTextData(context, endIndex, mode);
+    return {
+      type: 2,
+      content,
+      loc: getSelection(context, start)
+    };
+  }
+  function parseTextData(context, length, mode) {
+    const rawText = context.source.slice(0, length);
+    advanceBy(context, length);
+    if (mode === 2 || mode === 3 || !rawText.includes("&")) {
+      return rawText;
+    } else {
+      return context.options.decodeEntities(
+        rawText,
+        mode === 4
+      );
+    }
+  }
+  function getCursor(context) {
+    const { column, line, offset } = context;
+    return { column, line, offset };
+  }
+  function getSelection(context, start, end) {
+    end = end || getCursor(context);
+    return {
+      start,
+      end,
+      source: context.originalSource.slice(start.offset, end.offset)
+    };
+  }
+  function last(xs) {
+    return xs[xs.length - 1];
+  }
+  function startsWith(source, searchString) {
+    return source.startsWith(searchString);
+  }
+  function advanceBy(context, numberOfCharacters) {
+    const { source } = context;
+    advancePositionWithMutation(context, source, numberOfCharacters);
+    context.source = source.slice(numberOfCharacters);
+  }
+  function advanceSpaces(context) {
+    const match = /^[\t\r\n\f ]+/.exec(context.source);
+    if (match) {
+      advanceBy(context, match[0].length);
+    }
+  }
+  function getNewPosition(context, start, numberOfCharacters) {
+    return advancePositionWithClone(
+      start,
+      context.originalSource.slice(start.offset, numberOfCharacters),
+      numberOfCharacters
+    );
+  }
+  function emitError(context, code, offset, loc = getCursor(context)) {
+    if (offset) {
+      loc.offset += offset;
+      loc.column += offset;
+    }
+    context.options.onError(
+      createCompilerError(code, {
+        start: loc,
+        end: loc,
+        source: ""
+      })
+    );
+  }
+  function isEnd(context, mode, ancestors) {
+    const s = context.source;
+    switch (mode) {
+      case 0:
+        if (startsWith(s, "</")) {
+          for (let i = ancestors.length - 1; i >= 0; --i) {
+            if (startsWithEndTagOpen(s, ancestors[i].tag)) {
+              return true;
+            }
+          }
+        }
+        break;
+      case 1:
+      case 2: {
+        const parent = last(ancestors);
+        if (parent && startsWithEndTagOpen(s, parent.tag)) {
+          return true;
+        }
+        break;
+      }
+      case 3:
+        if (startsWith(s, "]]>")) {
+          return true;
+        }
+        break;
+    }
+    return !s;
+  }
+  function startsWithEndTagOpen(source, tag) {
+    return startsWith(source, "</") && source.slice(2, 2 + tag.length).toLowerCase() === tag.toLowerCase() && /[\t\r\n\f />]/.test(source[2 + tag.length] || ">");
+  }
+
+  function hoistStatic(root, context) {
+    walk(
+      root,
+      context,
+      // Root node is unfortunately non-hoistable due to potential parent
+      // fallthrough attributes.
+      isSingleElementRoot(root, root.children[0])
+    );
+  }
+  function isSingleElementRoot(root, child) {
+    const { children } = root;
+    return children.length === 1 && child.type === 1 && !isSlotOutlet(child);
+  }
+  function walk(node, context, doNotHoistNode = false) {
+    const { children } = node;
+    const originalCount = children.length;
+    let hoistedCount = 0;
+    for (let i = 0; i < children.length; i++) {
+      const child = children[i];
+      if (child.type === 1 && child.tagType === 0) {
+        const constantType = doNotHoistNode ? 0 : getConstantType(child, context);
+        if (constantType > 0) {
+          if (constantType >= 2) {
+            child.codegenNode.patchFlag = -1 + (` /* HOISTED */` );
+            child.codegenNode = context.hoist(child.codegenNode);
+            hoistedCount++;
+            continue;
+          }
+        } else {
+          const codegenNode = child.codegenNode;
+          if (codegenNode.type === 13) {
+            const flag = getPatchFlag(codegenNode);
+            if ((!flag || flag === 512 || flag === 1) && getGeneratedPropsConstantType(child, context) >= 2) {
+              const props = getNodeProps(child);
+              if (props) {
+                codegenNode.props = context.hoist(props);
+              }
+            }
+            if (codegenNode.dynamicProps) {
+              codegenNode.dynamicProps = context.hoist(codegenNode.dynamicProps);
+            }
+          }
+        }
+      }
+      if (child.type === 1) {
+        const isComponent = child.tagType === 1;
+        if (isComponent) {
+          context.scopes.vSlot++;
+        }
+        walk(child, context);
+        if (isComponent) {
+          context.scopes.vSlot--;
+        }
+      } else if (child.type === 11) {
+        walk(child, context, child.children.length === 1);
+      } else if (child.type === 9) {
+        for (let i2 = 0; i2 < child.branches.length; i2++) {
+          walk(
+            child.branches[i2],
+            context,
+            child.branches[i2].children.length === 1
+          );
+        }
+      }
+    }
+    if (hoistedCount && context.transformHoist) {
+      context.transformHoist(children, context, node);
+    }
+    if (hoistedCount && hoistedCount === originalCount && node.type === 1 && node.tagType === 0 && node.codegenNode && node.codegenNode.type === 13 && isArray(node.codegenNode.children)) {
+      node.codegenNode.children = context.hoist(
+        createArrayExpression(node.codegenNode.children)
+      );
+    }
+  }
+  function getConstantType(node, context) {
+    const { constantCache } = context;
+    switch (node.type) {
+      case 1:
+        if (node.tagType !== 0) {
+          return 0;
+        }
+        const cached = constantCache.get(node);
+        if (cached !== void 0) {
+          return cached;
+        }
+        const codegenNode = node.codegenNode;
+        if (codegenNode.type !== 13) {
+          return 0;
+        }
+        if (codegenNode.isBlock && node.tag !== "svg" && node.tag !== "foreignObject") {
+          return 0;
+        }
+        const flag = getPatchFlag(codegenNode);
+        if (!flag) {
+          let returnType2 = 3;
+          const generatedPropsType = getGeneratedPropsConstantType(node, context);
+          if (generatedPropsType === 0) {
+            constantCache.set(node, 0);
+            return 0;
+          }
+          if (generatedPropsType < returnType2) {
+            returnType2 = generatedPropsType;
+          }
+          for (let i = 0; i < node.children.length; i++) {
+            const childType = getConstantType(node.children[i], context);
+            if (childType === 0) {
+              constantCache.set(node, 0);
+              return 0;
+            }
+            if (childType < returnType2) {
+              returnType2 = childType;
+            }
+          }
+          if (returnType2 > 1) {
+            for (let i = 0; i < node.props.length; i++) {
+              const p = node.props[i];
+              if (p.type === 7 && p.name === "bind" && p.exp) {
+                const expType = getConstantType(p.exp, context);
+                if (expType === 0) {
+                  constantCache.set(node, 0);
+                  return 0;
+                }
+                if (expType < returnType2) {
+                  returnType2 = expType;
+                }
+              }
+            }
+          }
+          if (codegenNode.isBlock) {
+            for (let i = 0; i < node.props.length; i++) {
+              const p = node.props[i];
+              if (p.type === 7) {
+                constantCache.set(node, 0);
+                return 0;
+              }
+            }
+            context.removeHelper(OPEN_BLOCK);
+            context.removeHelper(
+              getVNodeBlockHelper(context.inSSR, codegenNode.isComponent)
+            );
+            codegenNode.isBlock = false;
+            context.helper(getVNodeHelper(context.inSSR, codegenNode.isComponent));
+          }
+          constantCache.set(node, returnType2);
+          return returnType2;
+        } else {
+          constantCache.set(node, 0);
+          return 0;
+        }
+      case 2:
+      case 3:
+        return 3;
+      case 9:
+      case 11:
+      case 10:
+        return 0;
+      case 5:
+      case 12:
+        return getConstantType(node.content, context);
+      case 4:
+        return node.constType;
+      case 8:
+        let returnType = 3;
+        for (let i = 0; i < node.children.length; i++) {
+          const child = node.children[i];
+          if (isString(child) || isSymbol(child)) {
+            continue;
+          }
+          const childType = getConstantType(child, context);
+          if (childType === 0) {
+            return 0;
+          } else if (childType < returnType) {
+            returnType = childType;
+          }
+        }
+        return returnType;
+      default:
+        return 0;
+    }
+  }
+  const allowHoistedHelperSet = /* @__PURE__ */ new Set([
+    NORMALIZE_CLASS,
+    NORMALIZE_STYLE,
+    NORMALIZE_PROPS,
+    GUARD_REACTIVE_PROPS
+  ]);
+  function getConstantTypeOfHelperCall(value, context) {
+    if (value.type === 14 && !isString(value.callee) && allowHoistedHelperSet.has(value.callee)) {
+      const arg = value.arguments[0];
+      if (arg.type === 4) {
+        return getConstantType(arg, context);
+      } else if (arg.type === 14) {
+        return getConstantTypeOfHelperCall(arg, context);
+      }
+    }
+    return 0;
+  }
+  function getGeneratedPropsConstantType(node, context) {
+    let returnType = 3;
+    const props = getNodeProps(node);
+    if (props && props.type === 15) {
+      const { properties } = props;
+      for (let i = 0; i < properties.length; i++) {
+        const { key, value } = properties[i];
+        const keyType = getConstantType(key, context);
+        if (keyType === 0) {
+          return keyType;
+        }
+        if (keyType < returnType) {
+          returnType = keyType;
+        }
+        let valueType;
+        if (value.type === 4) {
+          valueType = getConstantType(value, context);
+        } else if (value.type === 14) {
+          valueType = getConstantTypeOfHelperCall(value, context);
+        } else {
+          valueType = 0;
+        }
+        if (valueType === 0) {
+          return valueType;
+        }
+        if (valueType < returnType) {
+          returnType = valueType;
+        }
+      }
+    }
+    return returnType;
+  }
+  function getNodeProps(node) {
+    const codegenNode = node.codegenNode;
+    if (codegenNode.type === 13) {
+      return codegenNode.props;
+    }
+  }
+  function getPatchFlag(node) {
+    const flag = node.patchFlag;
+    return flag ? parseInt(flag, 10) : void 0;
+  }
+
+  function createTransformContext(root, {
+    filename = "",
+    prefixIdentifiers = false,
+    hoistStatic: hoistStatic2 = false,
+    cacheHandlers = false,
+    nodeTransforms = [],
+    directiveTransforms = {},
+    transformHoist = null,
+    isBuiltInComponent = NOOP,
+    isCustomElement = NOOP,
+    expressionPlugins = [],
+    scopeId = null,
+    slotted = true,
+    ssr = false,
+    inSSR = false,
+    ssrCssVars = ``,
+    bindingMetadata = EMPTY_OBJ,
+    inline = false,
+    isTS = false,
+    onError = defaultOnError,
+    onWarn = defaultOnWarn,
+    compatConfig
+  }) {
+    const nameMatch = filename.replace(/\?.*$/, "").match(/([^/\\]+)\.\w+$/);
+    const context = {
+      // options
+      selfName: nameMatch && capitalize(camelize(nameMatch[1])),
+      prefixIdentifiers,
+      hoistStatic: hoistStatic2,
+      cacheHandlers,
+      nodeTransforms,
+      directiveTransforms,
+      transformHoist,
+      isBuiltInComponent,
+      isCustomElement,
+      expressionPlugins,
+      scopeId,
+      slotted,
+      ssr,
+      inSSR,
+      ssrCssVars,
+      bindingMetadata,
+      inline,
+      isTS,
+      onError,
+      onWarn,
+      compatConfig,
+      // state
+      root,
+      helpers: /* @__PURE__ */ new Map(),
+      components: /* @__PURE__ */ new Set(),
+      directives: /* @__PURE__ */ new Set(),
+      hoists: [],
+      imports: [],
+      constantCache: /* @__PURE__ */ new WeakMap(),
+      temps: 0,
+      cached: 0,
+      identifiers: /* @__PURE__ */ Object.create(null),
+      scopes: {
+        vFor: 0,
+        vSlot: 0,
+        vPre: 0,
+        vOnce: 0
+      },
+      parent: null,
+      currentNode: root,
+      childIndex: 0,
+      inVOnce: false,
+      // methods
+      helper(name) {
+        const count = context.helpers.get(name) || 0;
+        context.helpers.set(name, count + 1);
+        return name;
+      },
+      removeHelper(name) {
+        const count = context.helpers.get(name);
+        if (count) {
+          const currentCount = count - 1;
+          if (!currentCount) {
+            context.helpers.delete(name);
+          } else {
+            context.helpers.set(name, currentCount);
+          }
+        }
+      },
+      helperString(name) {
+        return `_${helperNameMap[context.helper(name)]}`;
+      },
+      replaceNode(node) {
+        {
+          if (!context.currentNode) {
+            throw new Error(`Node being replaced is already removed.`);
+          }
+          if (!context.parent) {
+            throw new Error(`Cannot replace root node.`);
+          }
+        }
+        context.parent.children[context.childIndex] = context.currentNode = node;
+      },
+      removeNode(node) {
+        if (!context.parent) {
+          throw new Error(`Cannot remove root node.`);
+        }
+        const list = context.parent.children;
+        const removalIndex = node ? list.indexOf(node) : context.currentNode ? context.childIndex : -1;
+        if (removalIndex < 0) {
+          throw new Error(`node being removed is not a child of current parent`);
+        }
+        if (!node || node === context.currentNode) {
+          context.currentNode = null;
+          context.onNodeRemoved();
+        } else {
+          if (context.childIndex > removalIndex) {
+            context.childIndex--;
+            context.onNodeRemoved();
+          }
+        }
+        context.parent.children.splice(removalIndex, 1);
+      },
+      onNodeRemoved: () => {
+      },
+      addIdentifiers(exp) {
+      },
+      removeIdentifiers(exp) {
+      },
+      hoist(exp) {
+        if (isString(exp))
+          exp = createSimpleExpression(exp);
+        context.hoists.push(exp);
+        const identifier = createSimpleExpression(
+          `_hoisted_${context.hoists.length}`,
+          false,
+          exp.loc,
+          2
+        );
+        identifier.hoisted = exp;
+        return identifier;
+      },
+      cache(exp, isVNode = false) {
+        return createCacheExpression(context.cached++, exp, isVNode);
+      }
+    };
+    return context;
+  }
+  function transform(root, options) {
+    const context = createTransformContext(root, options);
+    traverseNode(root, context);
+    if (options.hoistStatic) {
+      hoistStatic(root, context);
+    }
+    if (!options.ssr) {
+      createRootCodegen(root, context);
+    }
+    root.helpers = /* @__PURE__ */ new Set([...context.helpers.keys()]);
+    root.components = [...context.components];
+    root.directives = [...context.directives];
+    root.imports = context.imports;
+    root.hoists = context.hoists;
+    root.temps = context.temps;
+    root.cached = context.cached;
+  }
+  function createRootCodegen(root, context) {
+    const { helper } = context;
+    const { children } = root;
+    if (children.length === 1) {
+      const child = children[0];
+      if (isSingleElementRoot(root, child) && child.codegenNode) {
+        const codegenNode = child.codegenNode;
+        if (codegenNode.type === 13) {
+          convertToBlock(codegenNode, context);
+        }
+        root.codegenNode = codegenNode;
+      } else {
+        root.codegenNode = child;
+      }
+    } else if (children.length > 1) {
+      let patchFlag = 64;
+      let patchFlagText = PatchFlagNames[64];
+      if (children.filter((c) => c.type !== 3).length === 1) {
+        patchFlag |= 2048;
+        patchFlagText += `, ${PatchFlagNames[2048]}`;
+      }
+      root.codegenNode = createVNodeCall(
+        context,
+        helper(FRAGMENT),
+        void 0,
+        root.children,
+        patchFlag + (` /* ${patchFlagText} */` ),
+        void 0,
+        void 0,
+        true,
+        void 0,
+        false
+        /* isComponent */
+      );
+    } else ;
+  }
+  function traverseChildren(parent, context) {
+    let i = 0;
+    const nodeRemoved = () => {
+      i--;
+    };
+    for (; i < parent.children.length; i++) {
+      const child = parent.children[i];
+      if (isString(child))
+        continue;
+      context.parent = parent;
+      context.childIndex = i;
+      context.onNodeRemoved = nodeRemoved;
+      traverseNode(child, context);
+    }
+  }
+  function traverseNode(node, context) {
+    context.currentNode = node;
+    const { nodeTransforms } = context;
+    const exitFns = [];
+    for (let i2 = 0; i2 < nodeTransforms.length; i2++) {
+      const onExit = nodeTransforms[i2](node, context);
+      if (onExit) {
+        if (isArray(onExit)) {
+          exitFns.push(...onExit);
+        } else {
+          exitFns.push(onExit);
+        }
+      }
+      if (!context.currentNode) {
+        return;
+      } else {
+        node = context.currentNode;
+      }
+    }
+    switch (node.type) {
+      case 3:
+        if (!context.ssr) {
+          context.helper(CREATE_COMMENT);
+        }
+        break;
+      case 5:
+        if (!context.ssr) {
+          context.helper(TO_DISPLAY_STRING);
+        }
+        break;
+      case 9:
+        for (let i2 = 0; i2 < node.branches.length; i2++) {
+          traverseNode(node.branches[i2], context);
+        }
+        break;
+      case 10:
+      case 11:
+      case 1:
+      case 0:
+        traverseChildren(node, context);
+        break;
+    }
+    context.currentNode = node;
+    let i = exitFns.length;
+    while (i--) {
+      exitFns[i]();
+    }
+  }
+  function createStructuralDirectiveTransform(name, fn) {
+    const matches = isString(name) ? (n) => n === name : (n) => name.test(n);
+    return (node, context) => {
+      if (node.type === 1) {
+        const { props } = node;
+        if (node.tagType === 3 && props.some(isVSlot)) {
+          return;
+        }
+        const exitFns = [];
+        for (let i = 0; i < props.length; i++) {
+          const prop = props[i];
+          if (prop.type === 7 && matches(prop.name)) {
+            props.splice(i, 1);
+            i--;
+            const onExit = fn(node, prop, context);
+            if (onExit)
+              exitFns.push(onExit);
+          }
+        }
+        return exitFns;
+      }
+    };
+  }
+
+  const PURE_ANNOTATION = `/*#__PURE__*/`;
+  const aliasHelper = (s) => `${helperNameMap[s]}: _${helperNameMap[s]}`;
+  function createCodegenContext(ast, {
+    mode = "function",
+    prefixIdentifiers = mode === "module",
+    sourceMap = false,
+    filename = `template.vue.html`,
+    scopeId = null,
+    optimizeImports = false,
+    runtimeGlobalName = `Vue`,
+    runtimeModuleName = `vue`,
+    ssrRuntimeModuleName = "vue/server-renderer",
+    ssr = false,
+    isTS = false,
+    inSSR = false
+  }) {
+    const context = {
+      mode,
+      prefixIdentifiers,
+      sourceMap,
+      filename,
+      scopeId,
+      optimizeImports,
+      runtimeGlobalName,
+      runtimeModuleName,
+      ssrRuntimeModuleName,
+      ssr,
+      isTS,
+      inSSR,
+      source: ast.loc.source,
+      code: ``,
+      column: 1,
+      line: 1,
+      offset: 0,
+      indentLevel: 0,
+      pure: false,
+      map: void 0,
+      helper(key) {
+        return `_${helperNameMap[key]}`;
+      },
+      push(code, node) {
+        context.code += code;
+      },
+      indent() {
+        newline(++context.indentLevel);
+      },
+      deindent(withoutNewLine = false) {
+        if (withoutNewLine) {
+          --context.indentLevel;
+        } else {
+          newline(--context.indentLevel);
+        }
+      },
+      newline() {
+        newline(context.indentLevel);
+      }
+    };
+    function newline(n) {
+      context.push("\n" + `  `.repeat(n));
+    }
+    return context;
+  }
+  function generate(ast, options = {}) {
+    const context = createCodegenContext(ast, options);
+    if (options.onContextCreated)
+      options.onContextCreated(context);
+    const {
+      mode,
+      push,
+      prefixIdentifiers,
+      indent,
+      deindent,
+      newline,
+      scopeId,
+      ssr
+    } = context;
+    const helpers = Array.from(ast.helpers);
+    const hasHelpers = helpers.length > 0;
+    const useWithBlock = !prefixIdentifiers && mode !== "module";
+    const isSetupInlined = false;
+    const preambleContext = isSetupInlined ? createCodegenContext(ast, options) : context;
+    {
+      genFunctionPreamble(ast, preambleContext);
+    }
+    const functionName = ssr ? `ssrRender` : `render`;
+    const args = ssr ? ["_ctx", "_push", "_parent", "_attrs"] : ["_ctx", "_cache"];
+    const signature = args.join(", ");
+    {
+      push(`function ${functionName}(${signature}) {`);
+    }
+    indent();
+    if (useWithBlock) {
+      push(`with (_ctx) {`);
+      indent();
+      if (hasHelpers) {
+        push(`const { ${helpers.map(aliasHelper).join(", ")} } = _Vue`);
+        push(`
+`);
+        newline();
+      }
+    }
+    if (ast.components.length) {
+      genAssets(ast.components, "component", context);
+      if (ast.directives.length || ast.temps > 0) {
+        newline();
+      }
+    }
+    if (ast.directives.length) {
+      genAssets(ast.directives, "directive", context);
+      if (ast.temps > 0) {
+        newline();
+      }
+    }
+    if (ast.temps > 0) {
+      push(`let `);
+      for (let i = 0; i < ast.temps; i++) {
+        push(`${i > 0 ? `, ` : ``}_temp${i}`);
+      }
+    }
+    if (ast.components.length || ast.directives.length || ast.temps) {
+      push(`
+`);
+      newline();
+    }
+    if (!ssr) {
+      push(`return `);
+    }
+    if (ast.codegenNode) {
+      genNode(ast.codegenNode, context);
+    } else {
+      push(`null`);
+    }
+    if (useWithBlock) {
+      deindent();
+      push(`}`);
+    }
+    deindent();
+    push(`}`);
+    return {
+      ast,
+      code: context.code,
+      preamble: isSetupInlined ? preambleContext.code : ``,
+      // SourceMapGenerator does have toJSON() method but it's not in the types
+      map: context.map ? context.map.toJSON() : void 0
+    };
+  }
+  function genFunctionPreamble(ast, context) {
+    const {
+      ssr,
+      prefixIdentifiers,
+      push,
+      newline,
+      runtimeModuleName,
+      runtimeGlobalName,
+      ssrRuntimeModuleName
+    } = context;
+    const VueBinding = runtimeGlobalName;
+    const helpers = Array.from(ast.helpers);
+    if (helpers.length > 0) {
+      {
+        push(`const _Vue = ${VueBinding}
+`);
+        if (ast.hoists.length) {
+          const staticHelpers = [
+            CREATE_VNODE,
+            CREATE_ELEMENT_VNODE,
+            CREATE_COMMENT,
+            CREATE_TEXT,
+            CREATE_STATIC
+          ].filter((helper) => helpers.includes(helper)).map(aliasHelper).join(", ");
+          push(`const { ${staticHelpers} } = _Vue
+`);
+        }
+      }
+    }
+    genHoists(ast.hoists, context);
+    newline();
+    push(`return `);
+  }
+  function genAssets(assets, type, { helper, push, newline, isTS }) {
+    const resolver = helper(
+      type === "component" ? RESOLVE_COMPONENT : RESOLVE_DIRECTIVE
+    );
+    for (let i = 0; i < assets.length; i++) {
+      let id = assets[i];
+      const maybeSelfReference = id.endsWith("__self");
+      if (maybeSelfReference) {
+        id = id.slice(0, -6);
+      }
+      push(
+        `const ${toValidAssetId(id, type)} = ${resolver}(${JSON.stringify(id)}${maybeSelfReference ? `, true` : ``})${isTS ? `!` : ``}`
+      );
+      if (i < assets.length - 1) {
+        newline();
+      }
+    }
+  }
+  function genHoists(hoists, context) {
+    if (!hoists.length) {
+      return;
+    }
+    context.pure = true;
+    const { push, newline, helper, scopeId, mode } = context;
+    newline();
+    for (let i = 0; i < hoists.length; i++) {
+      const exp = hoists[i];
+      if (exp) {
+        push(
+          `const _hoisted_${i + 1} = ${``}`
+        );
+        genNode(exp, context);
+        newline();
+      }
+    }
+    context.pure = false;
+  }
+  function isText(n) {
+    return isString(n) || n.type === 4 || n.type === 2 || n.type === 5 || n.type === 8;
+  }
+  function genNodeListAsArray(nodes, context) {
+    const multilines = nodes.length > 3 || nodes.some((n) => isArray(n) || !isText(n));
+    context.push(`[`);
+    multilines && context.indent();
+    genNodeList(nodes, context, multilines);
+    multilines && context.deindent();
+    context.push(`]`);
+  }
+  function genNodeList(nodes, context, multilines = false, comma = true) {
+    const { push, newline } = context;
+    for (let i = 0; i < nodes.length; i++) {
+      const node = nodes[i];
+      if (isString(node)) {
+        push(node);
+      } else if (isArray(node)) {
+        genNodeListAsArray(node, context);
+      } else {
+        genNode(node, context);
+      }
+      if (i < nodes.length - 1) {
+        if (multilines) {
+          comma && push(",");
+          newline();
+        } else {
+          comma && push(", ");
+        }
+      }
+    }
+  }
+  function genNode(node, context) {
+    if (isString(node)) {
+      context.push(node);
+      return;
+    }
+    if (isSymbol(node)) {
+      context.push(context.helper(node));
+      return;
+    }
+    switch (node.type) {
+      case 1:
+      case 9:
+      case 11:
+        assert(
+          node.codegenNode != null,
+          `Codegen node is missing for element/if/for node. Apply appropriate transforms first.`
+        );
+        genNode(node.codegenNode, context);
+        break;
+      case 2:
+        genText(node, context);
+        break;
+      case 4:
+        genExpression(node, context);
+        break;
+      case 5:
+        genInterpolation(node, context);
+        break;
+      case 12:
+        genNode(node.codegenNode, context);
+        break;
+      case 8:
+        genCompoundExpression(node, context);
+        break;
+      case 3:
+        genComment(node, context);
+        break;
+      case 13:
+        genVNodeCall(node, context);
+        break;
+      case 14:
+        genCallExpression(node, context);
+        break;
+      case 15:
+        genObjectExpression(node, context);
+        break;
+      case 17:
+        genArrayExpression(node, context);
+        break;
+      case 18:
+        genFunctionExpression(node, context);
+        break;
+      case 19:
+        genConditionalExpression(node, context);
+        break;
+      case 20:
+        genCacheExpression(node, context);
+        break;
+      case 21:
+        genNodeList(node.body, context, true, false);
+        break;
+      case 22:
+        break;
+      case 23:
+        break;
+      case 24:
+        break;
+      case 25:
+        break;
+      case 26:
+        break;
+      case 10:
+        break;
+      default:
+        {
+          assert(false, `unhandled codegen node type: ${node.type}`);
+          const exhaustiveCheck = node;
+          return exhaustiveCheck;
+        }
+    }
+  }
+  function genText(node, context) {
+    context.push(JSON.stringify(node.content), node);
+  }
+  function genExpression(node, context) {
+    const { content, isStatic } = node;
+    context.push(isStatic ? JSON.stringify(content) : content, node);
+  }
+  function genInterpolation(node, context) {
+    const { push, helper, pure } = context;
+    if (pure)
+      push(PURE_ANNOTATION);
+    push(`${helper(TO_DISPLAY_STRING)}(`);
+    genNode(node.content, context);
+    push(`)`);
+  }
+  function genCompoundExpression(node, context) {
+    for (let i = 0; i < node.children.length; i++) {
+      const child = node.children[i];
+      if (isString(child)) {
+        context.push(child);
+      } else {
+        genNode(child, context);
+      }
+    }
+  }
+  function genExpressionAsPropertyKey(node, context) {
+    const { push } = context;
+    if (node.type === 8) {
+      push(`[`);
+      genCompoundExpression(node, context);
+      push(`]`);
+    } else if (node.isStatic) {
+      const text = isSimpleIdentifier(node.content) ? node.content : JSON.stringify(node.content);
+      push(text, node);
+    } else {
+      push(`[${node.content}]`, node);
+    }
+  }
+  function genComment(node, context) {
+    const { push, helper, pure } = context;
+    if (pure) {
+      push(PURE_ANNOTATION);
+    }
+    push(`${helper(CREATE_COMMENT)}(${JSON.stringify(node.content)})`, node);
+  }
+  function genVNodeCall(node, context) {
+    const { push, helper, pure } = context;
+    const {
+      tag,
+      props,
+      children,
+      patchFlag,
+      dynamicProps,
+      directives,
+      isBlock,
+      disableTracking,
+      isComponent
+    } = node;
+    if (directives) {
+      push(helper(WITH_DIRECTIVES) + `(`);
+    }
+    if (isBlock) {
+      push(`(${helper(OPEN_BLOCK)}(${disableTracking ? `true` : ``}), `);
+    }
+    if (pure) {
+      push(PURE_ANNOTATION);
+    }
+    const callHelper = isBlock ? getVNodeBlockHelper(context.inSSR, isComponent) : getVNodeHelper(context.inSSR, isComponent);
+    push(helper(callHelper) + `(`, node);
+    genNodeList(
+      genNullableArgs([tag, props, children, patchFlag, dynamicProps]),
+      context
+    );
+    push(`)`);
+    if (isBlock) {
+      push(`)`);
+    }
+    if (directives) {
+      push(`, `);
+      genNode(directives, context);
+      push(`)`);
+    }
+  }
+  function genNullableArgs(args) {
+    let i = args.length;
+    while (i--) {
+      if (args[i] != null)
+        break;
+    }
+    return args.slice(0, i + 1).map((arg) => arg || `null`);
+  }
+  function genCallExpression(node, context) {
+    const { push, helper, pure } = context;
+    const callee = isString(node.callee) ? node.callee : helper(node.callee);
+    if (pure) {
+      push(PURE_ANNOTATION);
+    }
+    push(callee + `(`, node);
+    genNodeList(node.arguments, context);
+    push(`)`);
+  }
+  function genObjectExpression(node, context) {
+    const { push, indent, deindent, newline } = context;
+    const { properties } = node;
+    if (!properties.length) {
+      push(`{}`, node);
+      return;
+    }
+    const multilines = properties.length > 1 || properties.some((p) => p.value.type !== 4);
+    push(multilines ? `{` : `{ `);
+    multilines && indent();
+    for (let i = 0; i < properties.length; i++) {
+      const { key, value } = properties[i];
+      genExpressionAsPropertyKey(key, context);
+      push(`: `);
+      genNode(value, context);
+      if (i < properties.length - 1) {
+        push(`,`);
+        newline();
+      }
+    }
+    multilines && deindent();
+    push(multilines ? `}` : ` }`);
+  }
+  function genArrayExpression(node, context) {
+    genNodeListAsArray(node.elements, context);
+  }
+  function genFunctionExpression(node, context) {
+    const { push, indent, deindent } = context;
+    const { params, returns, body, newline, isSlot } = node;
+    if (isSlot) {
+      push(`_${helperNameMap[WITH_CTX]}(`);
+    }
+    push(`(`, node);
+    if (isArray(params)) {
+      genNodeList(params, context);
+    } else if (params) {
+      genNode(params, context);
+    }
+    push(`) => `);
+    if (newline || body) {
+      push(`{`);
+      indent();
+    }
+    if (returns) {
+      if (newline) {
+        push(`return `);
+      }
+      if (isArray(returns)) {
+        genNodeListAsArray(returns, context);
+      } else {
+        genNode(returns, context);
+      }
+    } else if (body) {
+      genNode(body, context);
+    }
+    if (newline || body) {
+      deindent();
+      push(`}`);
+    }
+    if (isSlot) {
+      push(`)`);
+    }
+  }
+  function genConditionalExpression(node, context) {
+    const { test, consequent, alternate, newline: needNewline } = node;
+    const { push, indent, deindent, newline } = context;
+    if (test.type === 4) {
+      const needsParens = !isSimpleIdentifier(test.content);
+      needsParens && push(`(`);
+      genExpression(test, context);
+      needsParens && push(`)`);
+    } else {
+      push(`(`);
+      genNode(test, context);
+      push(`)`);
+    }
+    needNewline && indent();
+    context.indentLevel++;
+    needNewline || push(` `);
+    push(`? `);
+    genNode(consequent, context);
+    context.indentLevel--;
+    needNewline && newline();
+    needNewline || push(` `);
+    push(`: `);
+    const isNested = alternate.type === 19;
+    if (!isNested) {
+      context.indentLevel++;
+    }
+    genNode(alternate, context);
+    if (!isNested) {
+      context.indentLevel--;
+    }
+    needNewline && deindent(
+      true
+      /* without newline */
+    );
+  }
+  function genCacheExpression(node, context) {
+    const { push, helper, indent, deindent, newline } = context;
+    push(`_cache[${node.index}] || (`);
+    if (node.isVNode) {
+      indent();
+      push(`${helper(SET_BLOCK_TRACKING)}(-1),`);
+      newline();
+    }
+    push(`_cache[${node.index}] = `);
+    genNode(node.value, context);
+    if (node.isVNode) {
+      push(`,`);
+      newline();
+      push(`${helper(SET_BLOCK_TRACKING)}(1),`);
+      newline();
+      push(`_cache[${node.index}]`);
+      deindent();
+    }
+    push(`)`);
+  }
+
+  const prohibitedKeywordRE = new RegExp(
+    "\\b" + "arguments,await,break,case,catch,class,const,continue,debugger,default,delete,do,else,export,extends,finally,for,function,if,import,let,new,return,super,switch,throw,try,var,void,while,with,yield".split(",").join("\\b|\\b") + "\\b"
+  );
+  const stripStringRE = /'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"|`(?:[^`\\]|\\.)*\$\{|\}(?:[^`\\]|\\.)*`|`(?:[^`\\]|\\.)*`/g;
+  function validateBrowserExpression(node, context, asParams = false, asRawStatements = false) {
+    const exp = node.content;
+    if (!exp.trim()) {
+      return;
+    }
+    try {
+      new Function(
+        asRawStatements ? ` ${exp} ` : `return ${asParams ? `(${exp}) => {}` : `(${exp})`}`
+      );
+    } catch (e) {
+      let message = e.message;
+      const keywordMatch = exp.replace(stripStringRE, "").match(prohibitedKeywordRE);
+      if (keywordMatch) {
+        message = `avoid using JavaScript keyword as property name: "${keywordMatch[0]}"`;
+      }
+      context.onError(
+        createCompilerError(
+          45,
+          node.loc,
+          void 0,
+          message
+        )
+      );
+    }
+  }
+
+  const transformExpression = (node, context) => {
+    if (node.type === 5) {
+      node.content = processExpression(
+        node.content,
+        context
+      );
+    } else if (node.type === 1) {
+      for (let i = 0; i < node.props.length; i++) {
+        const dir = node.props[i];
+        if (dir.type === 7 && dir.name !== "for") {
+          const exp = dir.exp;
+          const arg = dir.arg;
+          if (exp && exp.type === 4 && !(dir.name === "on" && arg)) {
+            dir.exp = processExpression(
+              exp,
+              context,
+              // slot args must be processed as function params
+              dir.name === "slot"
+            );
+          }
+          if (arg && arg.type === 4 && !arg.isStatic) {
+            dir.arg = processExpression(arg, context);
+          }
+        }
+      }
+    }
+  };
+  function processExpression(node, context, asParams = false, asRawStatements = false, localVars = Object.create(context.identifiers)) {
+    {
+      {
+        validateBrowserExpression(node, context, asParams, asRawStatements);
+      }
+      return node;
+    }
+  }
+
+  const transformIf = createStructuralDirectiveTransform(
+    /^(if|else|else-if)$/,
+    (node, dir, context) => {
+      return processIf(node, dir, context, (ifNode, branch, isRoot) => {
+        const siblings = context.parent.children;
+        let i = siblings.indexOf(ifNode);
+        let key = 0;
+        while (i-- >= 0) {
+          const sibling = siblings[i];
+          if (sibling && sibling.type === 9) {
+            key += sibling.branches.length;
+          }
+        }
+        return () => {
+          if (isRoot) {
+            ifNode.codegenNode = createCodegenNodeForBranch(
+              branch,
+              key,
+              context
+            );
+          } else {
+            const parentCondition = getParentCondition(ifNode.codegenNode);
+            parentCondition.alternate = createCodegenNodeForBranch(
+              branch,
+              key + ifNode.branches.length - 1,
+              context
+            );
+          }
+        };
+      });
+    }
+  );
+  function processIf(node, dir, context, processCodegen) {
+    if (dir.name !== "else" && (!dir.exp || !dir.exp.content.trim())) {
+      const loc = dir.exp ? dir.exp.loc : node.loc;
+      context.onError(
+        createCompilerError(28, dir.loc)
+      );
+      dir.exp = createSimpleExpression(`true`, false, loc);
+    }
+    if (dir.exp) {
+      validateBrowserExpression(dir.exp, context);
+    }
+    if (dir.name === "if") {
+      const branch = createIfBranch(node, dir);
+      const ifNode = {
+        type: 9,
+        loc: node.loc,
+        branches: [branch]
+      };
+      context.replaceNode(ifNode);
+      if (processCodegen) {
+        return processCodegen(ifNode, branch, true);
+      }
+    } else {
+      const siblings = context.parent.children;
+      const comments = [];
+      let i = siblings.indexOf(node);
+      while (i-- >= -1) {
+        const sibling = siblings[i];
+        if (sibling && sibling.type === 3) {
+          context.removeNode(sibling);
+          comments.unshift(sibling);
+          continue;
+        }
+        if (sibling && sibling.type === 2 && !sibling.content.trim().length) {
+          context.removeNode(sibling);
+          continue;
+        }
+        if (sibling && sibling.type === 9) {
+          if (dir.name === "else-if" && sibling.branches[sibling.branches.length - 1].condition === void 0) {
+            context.onError(
+              createCompilerError(30, node.loc)
+            );
+          }
+          context.removeNode();
+          const branch = createIfBranch(node, dir);
+          if (comments.length && // #3619 ignore comments if the v-if is direct child of <transition>
+          !(context.parent && context.parent.type === 1 && isBuiltInType(context.parent.tag, "transition"))) {
+            branch.children = [...comments, ...branch.children];
+          }
+          {
+            const key = branch.userKey;
+            if (key) {
+              sibling.branches.forEach(({ userKey }) => {
+                if (isSameKey(userKey, key)) {
+                  context.onError(
+                    createCompilerError(
+                      29,
+                      branch.userKey.loc
+                    )
+                  );
+                }
+              });
+            }
+          }
+          sibling.branches.push(branch);
+          const onExit = processCodegen && processCodegen(sibling, branch, false);
+          traverseNode(branch, context);
+          if (onExit)
+            onExit();
+          context.currentNode = null;
+        } else {
+          context.onError(
+            createCompilerError(30, node.loc)
+          );
+        }
+        break;
+      }
+    }
+  }
+  function createIfBranch(node, dir) {
+    const isTemplateIf = node.tagType === 3;
+    return {
+      type: 10,
+      loc: node.loc,
+      condition: dir.name === "else" ? void 0 : dir.exp,
+      children: isTemplateIf && !findDir(node, "for") ? node.children : [node],
+      userKey: findProp(node, `key`),
+      isTemplateIf
+    };
+  }
+  function createCodegenNodeForBranch(branch, keyIndex, context) {
+    if (branch.condition) {
+      return createConditionalExpression(
+        branch.condition,
+        createChildrenCodegenNode(branch, keyIndex, context),
+        // make sure to pass in asBlock: true so that the comment node call
+        // closes the current block.
+        createCallExpression(context.helper(CREATE_COMMENT), [
+          '"v-if"' ,
+          "true"
+        ])
+      );
+    } else {
+      return createChildrenCodegenNode(branch, keyIndex, context);
+    }
+  }
+  function createChildrenCodegenNode(branch, keyIndex, context) {
+    const { helper } = context;
+    const keyProperty = createObjectProperty(
+      `key`,
+      createSimpleExpression(
+        `${keyIndex}`,
+        false,
+        locStub,
+        2
+      )
+    );
+    const { children } = branch;
+    const firstChild = children[0];
+    const needFragmentWrapper = children.length !== 1 || firstChild.type !== 1;
+    if (needFragmentWrapper) {
+      if (children.length === 1 && firstChild.type === 11) {
+        const vnodeCall = firstChild.codegenNode;
+        injectProp(vnodeCall, keyProperty, context);
+        return vnodeCall;
+      } else {
+        let patchFlag = 64;
+        let patchFlagText = PatchFlagNames[64];
+        if (!branch.isTemplateIf && children.filter((c) => c.type !== 3).length === 1) {
+          patchFlag |= 2048;
+          patchFlagText += `, ${PatchFlagNames[2048]}`;
+        }
+        return createVNodeCall(
+          context,
+          helper(FRAGMENT),
+          createObjectExpression([keyProperty]),
+          children,
+          patchFlag + (` /* ${patchFlagText} */` ),
+          void 0,
+          void 0,
+          true,
+          false,
+          false,
+          branch.loc
+        );
+      }
+    } else {
+      const ret = firstChild.codegenNode;
+      const vnodeCall = getMemoedVNodeCall(ret);
+      if (vnodeCall.type === 13) {
+        convertToBlock(vnodeCall, context);
+      }
+      injectProp(vnodeCall, keyProperty, context);
+      return ret;
+    }
+  }
+  function isSameKey(a, b) {
+    if (!a || a.type !== b.type) {
+      return false;
+    }
+    if (a.type === 6) {
+      if (a.value.content !== b.value.content) {
+        return false;
+      }
+    } else {
+      const exp = a.exp;
+      const branchExp = b.exp;
+      if (exp.type !== branchExp.type) {
+        return false;
+      }
+      if (exp.type !== 4 || exp.isStatic !== branchExp.isStatic || exp.content !== branchExp.content) {
+        return false;
+      }
+    }
+    return true;
+  }
+  function getParentCondition(node) {
+    while (true) {
+      if (node.type === 19) {
+        if (node.alternate.type === 19) {
+          node = node.alternate;
+        } else {
+          return node;
+        }
+      } else if (node.type === 20) {
+        node = node.value;
+      }
+    }
+  }
+
+  const transformFor = createStructuralDirectiveTransform(
+    "for",
+    (node, dir, context) => {
+      const { helper, removeHelper } = context;
+      return processFor(node, dir, context, (forNode) => {
+        const renderExp = createCallExpression(helper(RENDER_LIST), [
+          forNode.source
+        ]);
+        const isTemplate = isTemplateNode(node);
+        const memo = findDir(node, "memo");
+        const keyProp = findProp(node, `key`);
+        const keyExp = keyProp && (keyProp.type === 6 ? createSimpleExpression(keyProp.value.content, true) : keyProp.exp);
+        const keyProperty = keyProp ? createObjectProperty(`key`, keyExp) : null;
+        const isStableFragment = forNode.source.type === 4 && forNode.source.constType > 0;
+        const fragmentFlag = isStableFragment ? 64 : keyProp ? 128 : 256;
+        forNode.codegenNode = createVNodeCall(
+          context,
+          helper(FRAGMENT),
+          void 0,
+          renderExp,
+          fragmentFlag + (` /* ${PatchFlagNames[fragmentFlag]} */` ),
+          void 0,
+          void 0,
+          true,
+          !isStableFragment,
+          false,
+          node.loc
+        );
+        return () => {
+          let childBlock;
+          const { children } = forNode;
+          if (isTemplate) {
+            node.children.some((c) => {
+              if (c.type === 1) {
+                const key = findProp(c, "key");
+                if (key) {
+                  context.onError(
+                    createCompilerError(
+                      33,
+                      key.loc
+                    )
+                  );
+                  return true;
+                }
+              }
+            });
+          }
+          const needFragmentWrapper = children.length !== 1 || children[0].type !== 1;
+          const slotOutlet = isSlotOutlet(node) ? node : isTemplate && node.children.length === 1 && isSlotOutlet(node.children[0]) ? node.children[0] : null;
+          if (slotOutlet) {
+            childBlock = slotOutlet.codegenNode;
+            if (isTemplate && keyProperty) {
+              injectProp(childBlock, keyProperty, context);
+            }
+          } else if (needFragmentWrapper) {
+            childBlock = createVNodeCall(
+              context,
+              helper(FRAGMENT),
+              keyProperty ? createObjectExpression([keyProperty]) : void 0,
+              node.children,
+              64 + (` /* ${PatchFlagNames[64]} */` ),
+              void 0,
+              void 0,
+              true,
+              void 0,
+              false
+              /* isComponent */
+            );
+          } else {
+            childBlock = children[0].codegenNode;
+            if (isTemplate && keyProperty) {
+              injectProp(childBlock, keyProperty, context);
+            }
+            if (childBlock.isBlock !== !isStableFragment) {
+              if (childBlock.isBlock) {
+                removeHelper(OPEN_BLOCK);
+                removeHelper(
+                  getVNodeBlockHelper(context.inSSR, childBlock.isComponent)
+                );
+              } else {
+                removeHelper(
+                  getVNodeHelper(context.inSSR, childBlock.isComponent)
+                );
+              }
+            }
+            childBlock.isBlock = !isStableFragment;
+            if (childBlock.isBlock) {
+              helper(OPEN_BLOCK);
+              helper(getVNodeBlockHelper(context.inSSR, childBlock.isComponent));
+            } else {
+              helper(getVNodeHelper(context.inSSR, childBlock.isComponent));
+            }
+          }
+          if (memo) {
+            const loop = createFunctionExpression(
+              createForLoopParams(forNode.parseResult, [
+                createSimpleExpression(`_cached`)
+              ])
+            );
+            loop.body = createBlockStatement([
+              createCompoundExpression([`const _memo = (`, memo.exp, `)`]),
+              createCompoundExpression([
+                `if (_cached`,
+                ...keyExp ? [` && _cached.key === `, keyExp] : [],
+                ` && ${context.helperString(
+                IS_MEMO_SAME
+              )}(_cached, _memo)) return _cached`
+              ]),
+              createCompoundExpression([`const _item = `, childBlock]),
+              createSimpleExpression(`_item.memo = _memo`),
+              createSimpleExpression(`return _item`)
+            ]);
+            renderExp.arguments.push(
+              loop,
+              createSimpleExpression(`_cache`),
+              createSimpleExpression(String(context.cached++))
+            );
+          } else {
+            renderExp.arguments.push(
+              createFunctionExpression(
+                createForLoopParams(forNode.parseResult),
+                childBlock,
+                true
+                /* force newline */
+              )
+            );
+          }
+        };
+      });
+    }
+  );
+  function processFor(node, dir, context, processCodegen) {
+    if (!dir.exp) {
+      context.onError(
+        createCompilerError(31, dir.loc)
+      );
+      return;
+    }
+    const parseResult = parseForExpression(
+      // can only be simple expression because vFor transform is applied
+      // before expression transform.
+      dir.exp,
+      context
+    );
+    if (!parseResult) {
+      context.onError(
+        createCompilerError(32, dir.loc)
+      );
+      return;
+    }
+    const { addIdentifiers, removeIdentifiers, scopes } = context;
+    const { source, value, key, index } = parseResult;
+    const forNode = {
+      type: 11,
+      loc: dir.loc,
+      source,
+      valueAlias: value,
+      keyAlias: key,
+      objectIndexAlias: index,
+      parseResult,
+      children: isTemplateNode(node) ? node.children : [node]
+    };
+    context.replaceNode(forNode);
+    scopes.vFor++;
+    const onExit = processCodegen && processCodegen(forNode);
+    return () => {
+      scopes.vFor--;
+      if (onExit)
+        onExit();
+    };
+  }
+  const forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/;
+  const forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/;
+  const stripParensRE = /^\(|\)$/g;
+  function parseForExpression(input, context) {
+    const loc = input.loc;
+    const exp = input.content;
+    const inMatch = exp.match(forAliasRE);
+    if (!inMatch)
+      return;
+    const [, LHS, RHS] = inMatch;
+    const result = {
+      source: createAliasExpression(
+        loc,
+        RHS.trim(),
+        exp.indexOf(RHS, LHS.length)
+      ),
+      value: void 0,
+      key: void 0,
+      index: void 0
+    };
+    {
+      validateBrowserExpression(result.source, context);
+    }
+    let valueContent = LHS.trim().replace(stripParensRE, "").trim();
+    const trimmedOffset = LHS.indexOf(valueContent);
+    const iteratorMatch = valueContent.match(forIteratorRE);
+    if (iteratorMatch) {
+      valueContent = valueContent.replace(forIteratorRE, "").trim();
+      const keyContent = iteratorMatch[1].trim();
+      let keyOffset;
+      if (keyContent) {
+        keyOffset = exp.indexOf(keyContent, trimmedOffset + valueContent.length);
+        result.key = createAliasExpression(loc, keyContent, keyOffset);
+        {
+          validateBrowserExpression(
+            result.key,
+            context,
+            true
+          );
+        }
+      }
+      if (iteratorMatch[2]) {
+        const indexContent = iteratorMatch[2].trim();
+        if (indexContent) {
+          result.index = createAliasExpression(
+            loc,
+            indexContent,
+            exp.indexOf(
+              indexContent,
+              result.key ? keyOffset + keyContent.length : trimmedOffset + valueContent.length
+            )
+          );
+          {
+            validateBrowserExpression(
+              result.index,
+              context,
+              true
+            );
+          }
+        }
+      }
+    }
+    if (valueContent) {
+      result.value = createAliasExpression(loc, valueContent, trimmedOffset);
+      {
+        validateBrowserExpression(
+          result.value,
+          context,
+          true
+        );
+      }
+    }
+    return result;
+  }
+  function createAliasExpression(range, content, offset) {
+    return createSimpleExpression(
+      content,
+      false,
+      getInnerRange(range, offset, content.length)
+    );
+  }
+  function createForLoopParams({ value, key, index }, memoArgs = []) {
+    return createParamsList([value, key, index, ...memoArgs]);
+  }
+  function createParamsList(args) {
+    let i = args.length;
+    while (i--) {
+      if (args[i])
+        break;
+    }
+    return args.slice(0, i + 1).map((arg, i2) => arg || createSimpleExpression(`_`.repeat(i2 + 1), false));
+  }
+
+  const defaultFallback = createSimpleExpression(`undefined`, false);
+  const trackSlotScopes = (node, context) => {
+    if (node.type === 1 && (node.tagType === 1 || node.tagType === 3)) {
+      const vSlot = findDir(node, "slot");
+      if (vSlot) {
+        vSlot.exp;
+        context.scopes.vSlot++;
+        return () => {
+          context.scopes.vSlot--;
+        };
+      }
+    }
+  };
+  const buildClientSlotFn = (props, children, loc) => createFunctionExpression(
+    props,
+    children,
+    false,
+    true,
+    children.length ? children[0].loc : loc
+  );
+  function buildSlots(node, context, buildSlotFn = buildClientSlotFn) {
+    context.helper(WITH_CTX);
+    const { children, loc } = node;
+    const slotsProperties = [];
+    const dynamicSlots = [];
+    let hasDynamicSlots = context.scopes.vSlot > 0 || context.scopes.vFor > 0;
+    const onComponentSlot = findDir(node, "slot", true);
+    if (onComponentSlot) {
+      const { arg, exp } = onComponentSlot;
+      if (arg && !isStaticExp(arg)) {
+        hasDynamicSlots = true;
+      }
+      slotsProperties.push(
+        createObjectProperty(
+          arg || createSimpleExpression("default", true),
+          buildSlotFn(exp, children, loc)
+        )
+      );
+    }
+    let hasTemplateSlots = false;
+    let hasNamedDefaultSlot = false;
+    const implicitDefaultChildren = [];
+    const seenSlotNames = /* @__PURE__ */ new Set();
+    let conditionalBranchIndex = 0;
+    for (let i = 0; i < children.length; i++) {
+      const slotElement = children[i];
+      let slotDir;
+      if (!isTemplateNode(slotElement) || !(slotDir = findDir(slotElement, "slot", true))) {
+        if (slotElement.type !== 3) {
+          implicitDefaultChildren.push(slotElement);
+        }
+        continue;
+      }
+      if (onComponentSlot) {
+        context.onError(
+          createCompilerError(37, slotDir.loc)
+        );
+        break;
+      }
+      hasTemplateSlots = true;
+      const { children: slotChildren, loc: slotLoc } = slotElement;
+      const {
+        arg: slotName = createSimpleExpression(`default`, true),
+        exp: slotProps,
+        loc: dirLoc
+      } = slotDir;
+      let staticSlotName;
+      if (isStaticExp(slotName)) {
+        staticSlotName = slotName ? slotName.content : `default`;
+      } else {
+        hasDynamicSlots = true;
+      }
+      const slotFunction = buildSlotFn(slotProps, slotChildren, slotLoc);
+      let vIf;
+      let vElse;
+      let vFor;
+      if (vIf = findDir(slotElement, "if")) {
+        hasDynamicSlots = true;
+        dynamicSlots.push(
+          createConditionalExpression(
+            vIf.exp,
+            buildDynamicSlot(slotName, slotFunction, conditionalBranchIndex++),
+            defaultFallback
+          )
+        );
+      } else if (vElse = findDir(
+        slotElement,
+        /^else(-if)?$/,
+        true
+        /* allowEmpty */
+      )) {
+        let j = i;
+        let prev;
+        while (j--) {
+          prev = children[j];
+          if (prev.type !== 3) {
+            break;
+          }
+        }
+        if (prev && isTemplateNode(prev) && findDir(prev, "if")) {
+          children.splice(i, 1);
+          i--;
+          let conditional = dynamicSlots[dynamicSlots.length - 1];
+          while (conditional.alternate.type === 19) {
+            conditional = conditional.alternate;
+          }
+          conditional.alternate = vElse.exp ? createConditionalExpression(
+            vElse.exp,
+            buildDynamicSlot(
+              slotName,
+              slotFunction,
+              conditionalBranchIndex++
+            ),
+            defaultFallback
+          ) : buildDynamicSlot(slotName, slotFunction, conditionalBranchIndex++);
+        } else {
+          context.onError(
+            createCompilerError(30, vElse.loc)
+          );
+        }
+      } else if (vFor = findDir(slotElement, "for")) {
+        hasDynamicSlots = true;
+        const parseResult = vFor.parseResult || parseForExpression(vFor.exp, context);
+        if (parseResult) {
+          dynamicSlots.push(
+            createCallExpression(context.helper(RENDER_LIST), [
+              parseResult.source,
+              createFunctionExpression(
+                createForLoopParams(parseResult),
+                buildDynamicSlot(slotName, slotFunction),
+                true
+                /* force newline */
+              )
+            ])
+          );
+        } else {
+          context.onError(
+            createCompilerError(32, vFor.loc)
+          );
+        }
+      } else {
+        if (staticSlotName) {
+          if (seenSlotNames.has(staticSlotName)) {
+            context.onError(
+              createCompilerError(
+                38,
+                dirLoc
+              )
+            );
+            continue;
+          }
+          seenSlotNames.add(staticSlotName);
+          if (staticSlotName === "default") {
+            hasNamedDefaultSlot = true;
+          }
+        }
+        slotsProperties.push(createObjectProperty(slotName, slotFunction));
+      }
+    }
+    if (!onComponentSlot) {
+      const buildDefaultSlotProperty = (props, children2) => {
+        const fn = buildSlotFn(props, children2, loc);
+        return createObjectProperty(`default`, fn);
+      };
+      if (!hasTemplateSlots) {
+        slotsProperties.push(buildDefaultSlotProperty(void 0, children));
+      } else if (implicitDefaultChildren.length && // #3766
+      // with whitespace: 'preserve', whitespaces between slots will end up in
+      // implicitDefaultChildren. Ignore if all implicit children are whitespaces.
+      implicitDefaultChildren.some((node2) => isNonWhitespaceContent(node2))) {
+        if (hasNamedDefaultSlot) {
+          context.onError(
+            createCompilerError(
+              39,
+              implicitDefaultChildren[0].loc
+            )
+          );
+        } else {
+          slotsProperties.push(
+            buildDefaultSlotProperty(void 0, implicitDefaultChildren)
+          );
+        }
+      }
+    }
+    const slotFlag = hasDynamicSlots ? 2 : hasForwardedSlots(node.children) ? 3 : 1;
+    let slots = createObjectExpression(
+      slotsProperties.concat(
+        createObjectProperty(
+          `_`,
+          // 2 = compiled but dynamic = can skip normalization, but must run diff
+          // 1 = compiled and static = can skip normalization AND diff as optimized
+          createSimpleExpression(
+            slotFlag + (` /* ${slotFlagsText[slotFlag]} */` ),
+            false
+          )
+        )
+      ),
+      loc
+    );
+    if (dynamicSlots.length) {
+      slots = createCallExpression(context.helper(CREATE_SLOTS), [
+        slots,
+        createArrayExpression(dynamicSlots)
+      ]);
+    }
+    return {
+      slots,
+      hasDynamicSlots
+    };
+  }
+  function buildDynamicSlot(name, fn, index) {
+    const props = [
+      createObjectProperty(`name`, name),
+      createObjectProperty(`fn`, fn)
+    ];
+    if (index != null) {
+      props.push(
+        createObjectProperty(`key`, createSimpleExpression(String(index), true))
+      );
+    }
+    return createObjectExpression(props);
+  }
+  function hasForwardedSlots(children) {
+    for (let i = 0; i < children.length; i++) {
+      const child = children[i];
+      switch (child.type) {
+        case 1:
+          if (child.tagType === 2 || hasForwardedSlots(child.children)) {
+            return true;
+          }
+          break;
+        case 9:
+          if (hasForwardedSlots(child.branches))
+            return true;
+          break;
+        case 10:
+        case 11:
+          if (hasForwardedSlots(child.children))
+            return true;
+          break;
+      }
+    }
+    return false;
+  }
+  function isNonWhitespaceContent(node) {
+    if (node.type !== 2 && node.type !== 12)
+      return true;
+    return node.type === 2 ? !!node.content.trim() : isNonWhitespaceContent(node.content);
+  }
+
+  const directiveImportMap = /* @__PURE__ */ new WeakMap();
+  const transformElement = (node, context) => {
+    return function postTransformElement() {
+      node = context.currentNode;
+      if (!(node.type === 1 && (node.tagType === 0 || node.tagType === 1))) {
+        return;
+      }
+      const { tag, props } = node;
+      const isComponent = node.tagType === 1;
+      let vnodeTag = isComponent ? resolveComponentType(node, context) : `"${tag}"`;
+      const isDynamicComponent = isObject(vnodeTag) && vnodeTag.callee === RESOLVE_DYNAMIC_COMPONENT;
+      let vnodeProps;
+      let vnodeChildren;
+      let vnodePatchFlag;
+      let patchFlag = 0;
+      let vnodeDynamicProps;
+      let dynamicPropNames;
+      let vnodeDirectives;
+      let shouldUseBlock = (
+        // dynamic component may resolve to plain elements
+        isDynamicComponent || vnodeTag === TELEPORT || vnodeTag === SUSPENSE || !isComponent && // <svg> and <foreignObject> must be forced into blocks so that block
+        // updates inside get proper isSVG flag at runtime. (#639, #643)
+        // This is technically web-specific, but splitting the logic out of core
+        // leads to too much unnecessary complexity.
+        (tag === "svg" || tag === "foreignObject")
+      );
+      if (props.length > 0) {
+        const propsBuildResult = buildProps(
+          node,
+          context,
+          void 0,
+          isComponent,
+          isDynamicComponent
+        );
+        vnodeProps = propsBuildResult.props;
+        patchFlag = propsBuildResult.patchFlag;
+        dynamicPropNames = propsBuildResult.dynamicPropNames;
+        const directives = propsBuildResult.directives;
+        vnodeDirectives = directives && directives.length ? createArrayExpression(
+          directives.map((dir) => buildDirectiveArgs(dir, context))
+        ) : void 0;
+        if (propsBuildResult.shouldUseBlock) {
+          shouldUseBlock = true;
+        }
+      }
+      if (node.children.length > 0) {
+        if (vnodeTag === KEEP_ALIVE) {
+          shouldUseBlock = true;
+          patchFlag |= 1024;
+          if (node.children.length > 1) {
+            context.onError(
+              createCompilerError(46, {
+                start: node.children[0].loc.start,
+                end: node.children[node.children.length - 1].loc.end,
+                source: ""
+              })
+            );
+          }
+        }
+        const shouldBuildAsSlots = isComponent && // Teleport is not a real component and has dedicated runtime handling
+        vnodeTag !== TELEPORT && // explained above.
+        vnodeTag !== KEEP_ALIVE;
+        if (shouldBuildAsSlots) {
+          const { slots, hasDynamicSlots } = buildSlots(node, context);
+          vnodeChildren = slots;
+          if (hasDynamicSlots) {
+            patchFlag |= 1024;
+          }
+        } else if (node.children.length === 1 && vnodeTag !== TELEPORT) {
+          const child = node.children[0];
+          const type = child.type;
+          const hasDynamicTextChild = type === 5 || type === 8;
+          if (hasDynamicTextChild && getConstantType(child, context) === 0) {
+            patchFlag |= 1;
+          }
+          if (hasDynamicTextChild || type === 2) {
+            vnodeChildren = child;
+          } else {
+            vnodeChildren = node.children;
+          }
+        } else {
+          vnodeChildren = node.children;
+        }
+      }
+      if (patchFlag !== 0) {
+        {
+          if (patchFlag < 0) {
+            vnodePatchFlag = patchFlag + ` /* ${PatchFlagNames[patchFlag]} */`;
+          } else {
+            const flagNames = Object.keys(PatchFlagNames).map(Number).filter((n) => n > 0 && patchFlag & n).map((n) => PatchFlagNames[n]).join(`, `);
+            vnodePatchFlag = patchFlag + ` /* ${flagNames} */`;
+          }
+        }
+        if (dynamicPropNames && dynamicPropNames.length) {
+          vnodeDynamicProps = stringifyDynamicPropNames(dynamicPropNames);
+        }
+      }
+      node.codegenNode = createVNodeCall(
+        context,
+        vnodeTag,
+        vnodeProps,
+        vnodeChildren,
+        vnodePatchFlag,
+        vnodeDynamicProps,
+        vnodeDirectives,
+        !!shouldUseBlock,
+        false,
+        isComponent,
+        node.loc
+      );
+    };
+  };
+  function resolveComponentType(node, context, ssr = false) {
+    let { tag } = node;
+    const isExplicitDynamic = isComponentTag(tag);
+    const isProp = findProp(node, "is");
+    if (isProp) {
+      if (isExplicitDynamic || false) {
+        const exp = isProp.type === 6 ? isProp.value && createSimpleExpression(isProp.value.content, true) : isProp.exp;
+        if (exp) {
+          return createCallExpression(context.helper(RESOLVE_DYNAMIC_COMPONENT), [
+            exp
+          ]);
+        }
+      } else if (isProp.type === 6 && isProp.value.content.startsWith("vue:")) {
+        tag = isProp.value.content.slice(4);
+      }
+    }
+    const isDir = !isExplicitDynamic && findDir(node, "is");
+    if (isDir && isDir.exp) {
+      {
+        context.onWarn(
+          createCompilerError(52, isDir.loc)
+        );
+      }
+      return createCallExpression(context.helper(RESOLVE_DYNAMIC_COMPONENT), [
+        isDir.exp
+      ]);
+    }
+    const builtIn = isCoreComponent(tag) || context.isBuiltInComponent(tag);
+    if (builtIn) {
+      if (!ssr)
+        context.helper(builtIn);
+      return builtIn;
+    }
+    context.helper(RESOLVE_COMPONENT);
+    context.components.add(tag);
+    return toValidAssetId(tag, `component`);
+  }
+  function buildProps(node, context, props = node.props, isComponent, isDynamicComponent, ssr = false) {
+    const { tag, loc: elementLoc, children } = node;
+    let properties = [];
+    const mergeArgs = [];
+    const runtimeDirectives = [];
+    const hasChildren = children.length > 0;
+    let shouldUseBlock = false;
+    let patchFlag = 0;
+    let hasRef = false;
+    let hasClassBinding = false;
+    let hasStyleBinding = false;
+    let hasHydrationEventBinding = false;
+    let hasDynamicKeys = false;
+    let hasVnodeHook = false;
+    const dynamicPropNames = [];
+    const pushMergeArg = (arg) => {
+      if (properties.length) {
+        mergeArgs.push(
+          createObjectExpression(dedupeProperties(properties), elementLoc)
+        );
+        properties = [];
+      }
+      if (arg)
+        mergeArgs.push(arg);
+    };
+    const analyzePatchFlag = ({ key, value }) => {
+      if (isStaticExp(key)) {
+        const name = key.content;
+        const isEventHandler = isOn(name);
+        if (isEventHandler && (!isComponent || isDynamicComponent) && // omit the flag for click handlers because hydration gives click
+        // dedicated fast path.
+        name.toLowerCase() !== "onclick" && // omit v-model handlers
+        name !== "onUpdate:modelValue" && // omit onVnodeXXX hooks
+        !isReservedProp(name)) {
+          hasHydrationEventBinding = true;
+        }
+        if (isEventHandler && isReservedProp(name)) {
+          hasVnodeHook = true;
+        }
+        if (value.type === 20 || (value.type === 4 || value.type === 8) && getConstantType(value, context) > 0) {
+          return;
+        }
+        if (name === "ref") {
+          hasRef = true;
+        } else if (name === "class") {
+          hasClassBinding = true;
+        } else if (name === "style") {
+          hasStyleBinding = true;
+        } else if (name !== "key" && !dynamicPropNames.includes(name)) {
+          dynamicPropNames.push(name);
+        }
+        if (isComponent && (name === "class" || name === "style") && !dynamicPropNames.includes(name)) {
+          dynamicPropNames.push(name);
+        }
+      } else {
+        hasDynamicKeys = true;
+      }
+    };
+    for (let i = 0; i < props.length; i++) {
+      const prop = props[i];
+      if (prop.type === 6) {
+        const { loc, name, value } = prop;
+        let isStatic = true;
+        if (name === "ref") {
+          hasRef = true;
+          if (context.scopes.vFor > 0) {
+            properties.push(
+              createObjectProperty(
+                createSimpleExpression("ref_for", true),
+                createSimpleExpression("true")
+              )
+            );
+          }
+        }
+        if (name === "is" && (isComponentTag(tag) || value && value.content.startsWith("vue:") || false)) {
+          continue;
+        }
+        properties.push(
+          createObjectProperty(
+            createSimpleExpression(
+              name,
+              true,
+              getInnerRange(loc, 0, name.length)
+            ),
+            createSimpleExpression(
+              value ? value.content : "",
+              isStatic,
+              value ? value.loc : loc
+            )
+          )
+        );
+      } else {
+        const { name, arg, exp, loc } = prop;
+        const isVBind = name === "bind";
+        const isVOn = name === "on";
+        if (name === "slot") {
+          if (!isComponent) {
+            context.onError(
+              createCompilerError(40, loc)
+            );
+          }
+          continue;
+        }
+        if (name === "once" || name === "memo") {
+          continue;
+        }
+        if (name === "is" || isVBind && isStaticArgOf(arg, "is") && (isComponentTag(tag) || false)) {
+          continue;
+        }
+        if (isVOn && ssr) {
+          continue;
+        }
+        if (
+          // #938: elements with dynamic keys should be forced into blocks
+          isVBind && isStaticArgOf(arg, "key") || // inline before-update hooks need to force block so that it is invoked
+          // before children
+          isVOn && hasChildren && isStaticArgOf(arg, "vue:before-update")
+        ) {
+          shouldUseBlock = true;
+        }
+        if (isVBind && isStaticArgOf(arg, "ref") && context.scopes.vFor > 0) {
+          properties.push(
+            createObjectProperty(
+              createSimpleExpression("ref_for", true),
+              createSimpleExpression("true")
+            )
+          );
+        }
+        if (!arg && (isVBind || isVOn)) {
+          hasDynamicKeys = true;
+          if (exp) {
+            if (isVBind) {
+              pushMergeArg();
+              mergeArgs.push(exp);
+            } else {
+              pushMergeArg({
+                type: 14,
+                loc,
+                callee: context.helper(TO_HANDLERS),
+                arguments: isComponent ? [exp] : [exp, `true`]
+              });
+            }
+          } else {
+            context.onError(
+              createCompilerError(
+                isVBind ? 34 : 35,
+                loc
+              )
+            );
+          }
+          continue;
+        }
+        const directiveTransform = context.directiveTransforms[name];
+        if (directiveTransform) {
+          const { props: props2, needRuntime } = directiveTransform(prop, node, context);
+          !ssr && props2.forEach(analyzePatchFlag);
+          if (isVOn && arg && !isStaticExp(arg)) {
+            pushMergeArg(createObjectExpression(props2, elementLoc));
+          } else {
+            properties.push(...props2);
+          }
+          if (needRuntime) {
+            runtimeDirectives.push(prop);
+            if (isSymbol(needRuntime)) {
+              directiveImportMap.set(prop, needRuntime);
+            }
+          }
+        } else if (!isBuiltInDirective(name)) {
+          runtimeDirectives.push(prop);
+          if (hasChildren) {
+            shouldUseBlock = true;
+          }
+        }
+      }
+    }
+    let propsExpression = void 0;
+    if (mergeArgs.length) {
+      pushMergeArg();
+      if (mergeArgs.length > 1) {
+        propsExpression = createCallExpression(
+          context.helper(MERGE_PROPS),
+          mergeArgs,
+          elementLoc
+        );
+      } else {
+        propsExpression = mergeArgs[0];
+      }
+    } else if (properties.length) {
+      propsExpression = createObjectExpression(
+        dedupeProperties(properties),
+        elementLoc
+      );
+    }
+    if (hasDynamicKeys) {
+      patchFlag |= 16;
+    } else {
+      if (hasClassBinding && !isComponent) {
+        patchFlag |= 2;
+      }
+      if (hasStyleBinding && !isComponent) {
+        patchFlag |= 4;
+      }
+      if (dynamicPropNames.length) {
+        patchFlag |= 8;
+      }
+      if (hasHydrationEventBinding) {
+        patchFlag |= 32;
+      }
+    }
+    if (!shouldUseBlock && (patchFlag === 0 || patchFlag === 32) && (hasRef || hasVnodeHook || runtimeDirectives.length > 0)) {
+      patchFlag |= 512;
+    }
+    if (!context.inSSR && propsExpression) {
+      switch (propsExpression.type) {
+        case 15:
+          let classKeyIndex = -1;
+          let styleKeyIndex = -1;
+          let hasDynamicKey = false;
+          for (let i = 0; i < propsExpression.properties.length; i++) {
+            const key = propsExpression.properties[i].key;
+            if (isStaticExp(key)) {
+              if (key.content === "class") {
+                classKeyIndex = i;
+              } else if (key.content === "style") {
+                styleKeyIndex = i;
+              }
+            } else if (!key.isHandlerKey) {
+              hasDynamicKey = true;
+            }
+          }
+          const classProp = propsExpression.properties[classKeyIndex];
+          const styleProp = propsExpression.properties[styleKeyIndex];
+          if (!hasDynamicKey) {
+            if (classProp && !isStaticExp(classProp.value)) {
+              classProp.value = createCallExpression(
+                context.helper(NORMALIZE_CLASS),
+                [classProp.value]
+              );
+            }
+            if (styleProp && // the static style is compiled into an object,
+            // so use `hasStyleBinding` to ensure that it is a dynamic style binding
+            (hasStyleBinding || styleProp.value.type === 4 && styleProp.value.content.trim()[0] === `[` || // v-bind:style and style both exist,
+            // v-bind:style with static literal object
+            styleProp.value.type === 17)) {
+              styleProp.value = createCallExpression(
+                context.helper(NORMALIZE_STYLE),
+                [styleProp.value]
+              );
+            }
+          } else {
+            propsExpression = createCallExpression(
+              context.helper(NORMALIZE_PROPS),
+              [propsExpression]
+            );
+          }
+          break;
+        case 14:
+          break;
+        default:
+          propsExpression = createCallExpression(
+            context.helper(NORMALIZE_PROPS),
+            [
+              createCallExpression(context.helper(GUARD_REACTIVE_PROPS), [
+                propsExpression
+              ])
+            ]
+          );
+          break;
+      }
+    }
+    return {
+      props: propsExpression,
+      directives: runtimeDirectives,
+      patchFlag,
+      dynamicPropNames,
+      shouldUseBlock
+    };
+  }
+  function dedupeProperties(properties) {
+    const knownProps = /* @__PURE__ */ new Map();
+    const deduped = [];
+    for (let i = 0; i < properties.length; i++) {
+      const prop = properties[i];
+      if (prop.key.type === 8 || !prop.key.isStatic) {
+        deduped.push(prop);
+        continue;
+      }
+      const name = prop.key.content;
+      const existing = knownProps.get(name);
+      if (existing) {
+        if (name === "style" || name === "class" || isOn(name)) {
+          mergeAsArray(existing, prop);
+        }
+      } else {
+        knownProps.set(name, prop);
+        deduped.push(prop);
+      }
+    }
+    return deduped;
+  }
+  function mergeAsArray(existing, incoming) {
+    if (existing.value.type === 17) {
+      existing.value.elements.push(incoming.value);
+    } else {
+      existing.value = createArrayExpression(
+        [existing.value, incoming.value],
+        existing.loc
+      );
+    }
+  }
+  function buildDirectiveArgs(dir, context) {
+    const dirArgs = [];
+    const runtime = directiveImportMap.get(dir);
+    if (runtime) {
+      dirArgs.push(context.helperString(runtime));
+    } else {
+      {
+        context.helper(RESOLVE_DIRECTIVE);
+        context.directives.add(dir.name);
+        dirArgs.push(toValidAssetId(dir.name, `directive`));
+      }
+    }
+    const { loc } = dir;
+    if (dir.exp)
+      dirArgs.push(dir.exp);
+    if (dir.arg) {
+      if (!dir.exp) {
+        dirArgs.push(`void 0`);
+      }
+      dirArgs.push(dir.arg);
+    }
+    if (Object.keys(dir.modifiers).length) {
+      if (!dir.arg) {
+        if (!dir.exp) {
+          dirArgs.push(`void 0`);
+        }
+        dirArgs.push(`void 0`);
+      }
+      const trueExpression = createSimpleExpression(`true`, false, loc);
+      dirArgs.push(
+        createObjectExpression(
+          dir.modifiers.map(
+            (modifier) => createObjectProperty(modifier, trueExpression)
+          ),
+          loc
+        )
+      );
+    }
+    return createArrayExpression(dirArgs, dir.loc);
+  }
+  function stringifyDynamicPropNames(props) {
+    let propsNamesString = `[`;
+    for (let i = 0, l = props.length; i < l; i++) {
+      propsNamesString += JSON.stringify(props[i]);
+      if (i < l - 1)
+        propsNamesString += ", ";
+    }
+    return propsNamesString + `]`;
+  }
+  function isComponentTag(tag) {
+    return tag === "component" || tag === "Component";
+  }
+
+  const transformSlotOutlet = (node, context) => {
+    if (isSlotOutlet(node)) {
+      const { children, loc } = node;
+      const { slotName, slotProps } = processSlotOutlet(node, context);
+      const slotArgs = [
+        context.prefixIdentifiers ? `_ctx.$slots` : `$slots`,
+        slotName,
+        "{}",
+        "undefined",
+        "true"
+      ];
+      let expectedLen = 2;
+      if (slotProps) {
+        slotArgs[2] = slotProps;
+        expectedLen = 3;
+      }
+      if (children.length) {
+        slotArgs[3] = createFunctionExpression([], children, false, false, loc);
+        expectedLen = 4;
+      }
+      if (context.scopeId && !context.slotted) {
+        expectedLen = 5;
+      }
+      slotArgs.splice(expectedLen);
+      node.codegenNode = createCallExpression(
+        context.helper(RENDER_SLOT),
+        slotArgs,
+        loc
+      );
+    }
+  };
+  function processSlotOutlet(node, context) {
+    let slotName = `"default"`;
+    let slotProps = void 0;
+    const nonNameProps = [];
+    for (let i = 0; i < node.props.length; i++) {
+      const p = node.props[i];
+      if (p.type === 6) {
+        if (p.value) {
+          if (p.name === "name") {
+            slotName = JSON.stringify(p.value.content);
+          } else {
+            p.name = camelize(p.name);
+            nonNameProps.push(p);
+          }
+        }
+      } else {
+        if (p.name === "bind" && isStaticArgOf(p.arg, "name")) {
+          if (p.exp)
+            slotName = p.exp;
+        } else {
+          if (p.name === "bind" && p.arg && isStaticExp(p.arg)) {
+            p.arg.content = camelize(p.arg.content);
+          }
+          nonNameProps.push(p);
+        }
+      }
+    }
+    if (nonNameProps.length > 0) {
+      const { props, directives } = buildProps(
+        node,
+        context,
+        nonNameProps,
+        false,
+        false
+      );
+      slotProps = props;
+      if (directives.length) {
+        context.onError(
+          createCompilerError(
+            36,
+            directives[0].loc
+          )
+        );
+      }
+    }
+    return {
+      slotName,
+      slotProps
+    };
+  }
+
+  const fnExpRE = /^\s*([\w$_]+|(async\s*)?\([^)]*?\))\s*(:[^=]+)?=>|^\s*(async\s+)?function(?:\s+[\w$]+)?\s*\(/;
+  const transformOn$1 = (dir, node, context, augmentor) => {
+    const { loc, modifiers, arg } = dir;
+    if (!dir.exp && !modifiers.length) {
+      context.onError(createCompilerError(35, loc));
+    }
+    let eventName;
+    if (arg.type === 4) {
+      if (arg.isStatic) {
+        let rawName = arg.content;
+        if (rawName.startsWith("vnode")) {
+          context.onWarn(
+            createCompilerError(51, arg.loc)
+          );
+        }
+        if (rawName.startsWith("vue:")) {
+          rawName = `vnode-${rawName.slice(4)}`;
+        }
+        const eventString = node.tagType !== 0 || rawName.startsWith("vnode") || !/[A-Z]/.test(rawName) ? (
+          // for non-element and vnode lifecycle event listeners, auto convert
+          // it to camelCase. See issue #2249
+          toHandlerKey(camelize(rawName))
+        ) : (
+          // preserve case for plain element listeners that have uppercase
+          // letters, as these may be custom elements' custom events
+          `on:${rawName}`
+        );
+        eventName = createSimpleExpression(eventString, true, arg.loc);
+      } else {
+        eventName = createCompoundExpression([
+          `${context.helperString(TO_HANDLER_KEY)}(`,
+          arg,
+          `)`
+        ]);
+      }
+    } else {
+      eventName = arg;
+      eventName.children.unshift(`${context.helperString(TO_HANDLER_KEY)}(`);
+      eventName.children.push(`)`);
+    }
+    let exp = dir.exp;
+    if (exp && !exp.content.trim()) {
+      exp = void 0;
+    }
+    let shouldCache = context.cacheHandlers && !exp && !context.inVOnce;
+    if (exp) {
+      const isMemberExp = isMemberExpression(exp.content);
+      const isInlineStatement = !(isMemberExp || fnExpRE.test(exp.content));
+      const hasMultipleStatements = exp.content.includes(`;`);
+      {
+        validateBrowserExpression(
+          exp,
+          context,
+          false,
+          hasMultipleStatements
+        );
+      }
+      if (isInlineStatement || shouldCache && isMemberExp) {
+        exp = createCompoundExpression([
+          `${isInlineStatement ? `$event` : `${``}(...args)`} => ${hasMultipleStatements ? `{` : `(`}`,
+          exp,
+          hasMultipleStatements ? `}` : `)`
+        ]);
+      }
+    }
+    let ret = {
+      props: [
+        createObjectProperty(
+          eventName,
+          exp || createSimpleExpression(`() => {}`, false, loc)
+        )
+      ]
+    };
+    if (augmentor) {
+      ret = augmentor(ret);
+    }
+    if (shouldCache) {
+      ret.props[0].value = context.cache(ret.props[0].value);
+    }
+    ret.props.forEach((p) => p.key.isHandlerKey = true);
+    return ret;
+  };
+
+  const transformBind = (dir, _node, context) => {
+    const { exp, modifiers, loc } = dir;
+    const arg = dir.arg;
+    if (arg.type !== 4) {
+      arg.children.unshift(`(`);
+      arg.children.push(`) || ""`);
+    } else if (!arg.isStatic) {
+      arg.content = `${arg.content} || ""`;
+    }
+    if (modifiers.includes("camel")) {
+      if (arg.type === 4) {
+        if (arg.isStatic) {
+          arg.content = camelize(arg.content);
+        } else {
+          arg.content = `${context.helperString(CAMELIZE)}(${arg.content})`;
+        }
+      } else {
+        arg.children.unshift(`${context.helperString(CAMELIZE)}(`);
+        arg.children.push(`)`);
+      }
+    }
+    if (!context.inSSR) {
+      if (modifiers.includes("prop")) {
+        injectPrefix(arg, ".");
+      }
+      if (modifiers.includes("attr")) {
+        injectPrefix(arg, "^");
+      }
+    }
+    if (!exp || exp.type === 4 && !exp.content.trim()) {
+      context.onError(createCompilerError(34, loc));
+      return {
+        props: [createObjectProperty(arg, createSimpleExpression("", true, loc))]
+      };
+    }
+    return {
+      props: [createObjectProperty(arg, exp)]
+    };
+  };
+  const injectPrefix = (arg, prefix) => {
+    if (arg.type === 4) {
+      if (arg.isStatic) {
+        arg.content = prefix + arg.content;
+      } else {
+        arg.content = `\`${prefix}\${${arg.content}}\``;
+      }
+    } else {
+      arg.children.unshift(`'${prefix}' + (`);
+      arg.children.push(`)`);
+    }
+  };
+
+  const transformText = (node, context) => {
+    if (node.type === 0 || node.type === 1 || node.type === 11 || node.type === 10) {
+      return () => {
+        const children = node.children;
+        let currentContainer = void 0;
+        let hasText = false;
+        for (let i = 0; i < children.length; i++) {
+          const child = children[i];
+          if (isText$1(child)) {
+            hasText = true;
+            for (let j = i + 1; j < children.length; j++) {
+              const next = children[j];
+              if (isText$1(next)) {
+                if (!currentContainer) {
+                  currentContainer = children[i] = createCompoundExpression(
+                    [child],
+                    child.loc
+                  );
+                }
+                currentContainer.children.push(` + `, next);
+                children.splice(j, 1);
+                j--;
+              } else {
+                currentContainer = void 0;
+                break;
+              }
+            }
+          }
+        }
+        if (!hasText || // if this is a plain element with a single text child, leave it
+        // as-is since the runtime has dedicated fast path for this by directly
+        // setting textContent of the element.
+        // for component root it's always normalized anyway.
+        children.length === 1 && (node.type === 0 || node.type === 1 && node.tagType === 0 && // #3756
+        // custom directives can potentially add DOM elements arbitrarily,
+        // we need to avoid setting textContent of the element at runtime
+        // to avoid accidentally overwriting the DOM elements added
+        // by the user through custom directives.
+        !node.props.find(
+          (p) => p.type === 7 && !context.directiveTransforms[p.name]
+        ) && // in compat mode, <template> tags with no special directives
+        // will be rendered as a fragment so its children must be
+        // converted into vnodes.
+        true)) {
+          return;
+        }
+        for (let i = 0; i < children.length; i++) {
+          const child = children[i];
+          if (isText$1(child) || child.type === 8) {
+            const callArgs = [];
+            if (child.type !== 2 || child.content !== " ") {
+              callArgs.push(child);
+            }
+            if (!context.ssr && getConstantType(child, context) === 0) {
+              callArgs.push(
+                1 + (` /* ${PatchFlagNames[1]} */` )
+              );
+            }
+            children[i] = {
+              type: 12,
+              content: child,
+              loc: child.loc,
+              codegenNode: createCallExpression(
+                context.helper(CREATE_TEXT),
+                callArgs
+              )
+            };
+          }
+        }
+      };
+    }
+  };
+
+  const seen$1 = /* @__PURE__ */ new WeakSet();
+  const transformOnce = (node, context) => {
+    if (node.type === 1 && findDir(node, "once", true)) {
+      if (seen$1.has(node) || context.inVOnce || context.inSSR) {
+        return;
+      }
+      seen$1.add(node);
+      context.inVOnce = true;
+      context.helper(SET_BLOCK_TRACKING);
+      return () => {
+        context.inVOnce = false;
+        const cur = context.currentNode;
+        if (cur.codegenNode) {
+          cur.codegenNode = context.cache(
+            cur.codegenNode,
+            true
+            /* isVNode */
+          );
+        }
+      };
+    }
+  };
+
+  const transformModel$1 = (dir, node, context) => {
+    const { exp, arg } = dir;
+    if (!exp) {
+      context.onError(
+        createCompilerError(41, dir.loc)
+      );
+      return createTransformProps();
+    }
+    const rawExp = exp.loc.source;
+    const expString = exp.type === 4 ? exp.content : rawExp;
+    const bindingType = context.bindingMetadata[rawExp];
+    if (bindingType === "props" || bindingType === "props-aliased") {
+      context.onError(createCompilerError(44, exp.loc));
+      return createTransformProps();
+    }
+    const maybeRef = false;
+    if (!expString.trim() || !isMemberExpression(expString) && !maybeRef) {
+      context.onError(
+        createCompilerError(42, exp.loc)
+      );
+      return createTransformProps();
+    }
+    const propName = arg ? arg : createSimpleExpression("modelValue", true);
+    const eventName = arg ? isStaticExp(arg) ? `onUpdate:${camelize(arg.content)}` : createCompoundExpression(['"onUpdate:" + ', arg]) : `onUpdate:modelValue`;
+    let assignmentExp;
+    const eventArg = context.isTS ? `($event: any)` : `$event`;
+    {
+      assignmentExp = createCompoundExpression([
+        `${eventArg} => ((`,
+        exp,
+        `) = $event)`
+      ]);
+    }
+    const props = [
+      // modelValue: foo
+      createObjectProperty(propName, dir.exp),
+      // "onUpdate:modelValue": $event => (foo = $event)
+      createObjectProperty(eventName, assignmentExp)
+    ];
+    if (dir.modifiers.length && node.tagType === 1) {
+      const modifiers = dir.modifiers.map((m) => (isSimpleIdentifier(m) ? m : JSON.stringify(m)) + `: true`).join(`, `);
+      const modifiersKey = arg ? isStaticExp(arg) ? `${arg.content}Modifiers` : createCompoundExpression([arg, ' + "Modifiers"']) : `modelModifiers`;
+      props.push(
+        createObjectProperty(
+          modifiersKey,
+          createSimpleExpression(
+            `{ ${modifiers} }`,
+            false,
+            dir.loc,
+            2
+          )
+        )
+      );
+    }
+    return createTransformProps(props);
+  };
+  function createTransformProps(props = []) {
+    return { props };
+  }
+
+  const seen = /* @__PURE__ */ new WeakSet();
+  const transformMemo = (node, context) => {
+    if (node.type === 1) {
+      const dir = findDir(node, "memo");
+      if (!dir || seen.has(node)) {
+        return;
+      }
+      seen.add(node);
+      return () => {
+        const codegenNode = node.codegenNode || context.currentNode.codegenNode;
+        if (codegenNode && codegenNode.type === 13) {
+          if (node.tagType !== 1) {
+            convertToBlock(codegenNode, context);
+          }
+          node.codegenNode = createCallExpression(context.helper(WITH_MEMO), [
+            dir.exp,
+            createFunctionExpression(void 0, codegenNode),
+            `_cache`,
+            String(context.cached++)
+          ]);
+        }
+      };
+    }
+  };
+
+  function getBaseTransformPreset(prefixIdentifiers) {
+    return [
+      [
+        transformOnce,
+        transformIf,
+        transformMemo,
+        transformFor,
+        ...[],
+        ...[transformExpression] ,
+        transformSlotOutlet,
+        transformElement,
+        trackSlotScopes,
+        transformText
+      ],
+      {
+        on: transformOn$1,
+        bind: transformBind,
+        model: transformModel$1
+      }
+    ];
+  }
+  function baseCompile(template, options = {}) {
+    const onError = options.onError || defaultOnError;
+    const isModuleMode = options.mode === "module";
+    {
+      if (options.prefixIdentifiers === true) {
+        onError(createCompilerError(47));
+      } else if (isModuleMode) {
+        onError(createCompilerError(48));
+      }
+    }
+    const prefixIdentifiers = false;
+    if (options.cacheHandlers) {
+      onError(createCompilerError(49));
+    }
+    if (options.scopeId && !isModuleMode) {
+      onError(createCompilerError(50));
+    }
+    const ast = isString(template) ? baseParse(template, options) : template;
+    const [nodeTransforms, directiveTransforms] = getBaseTransformPreset();
+    transform(
+      ast,
+      extend({}, options, {
+        prefixIdentifiers,
+        nodeTransforms: [
+          ...nodeTransforms,
+          ...options.nodeTransforms || []
+          // user transforms
+        ],
+        directiveTransforms: extend(
+          {},
+          directiveTransforms,
+          options.directiveTransforms || {}
+          // user transforms
+        )
+      })
+    );
+    return generate(
+      ast,
+      extend({}, options, {
+        prefixIdentifiers
+      })
+    );
+  }
+
+  const noopDirectiveTransform = () => ({ props: [] });
+
+  const V_MODEL_RADIO = Symbol(`vModelRadio` );
+  const V_MODEL_CHECKBOX = Symbol(`vModelCheckbox` );
+  const V_MODEL_TEXT = Symbol(`vModelText` );
+  const V_MODEL_SELECT = Symbol(`vModelSelect` );
+  const V_MODEL_DYNAMIC = Symbol(`vModelDynamic` );
+  const V_ON_WITH_MODIFIERS = Symbol(`vOnModifiersGuard` );
+  const V_ON_WITH_KEYS = Symbol(`vOnKeysGuard` );
+  const V_SHOW = Symbol(`vShow` );
+  const TRANSITION = Symbol(`Transition` );
+  const TRANSITION_GROUP = Symbol(`TransitionGroup` );
+  registerRuntimeHelpers({
+    [V_MODEL_RADIO]: `vModelRadio`,
+    [V_MODEL_CHECKBOX]: `vModelCheckbox`,
+    [V_MODEL_TEXT]: `vModelText`,
+    [V_MODEL_SELECT]: `vModelSelect`,
+    [V_MODEL_DYNAMIC]: `vModelDynamic`,
+    [V_ON_WITH_MODIFIERS]: `withModifiers`,
+    [V_ON_WITH_KEYS]: `withKeys`,
+    [V_SHOW]: `vShow`,
+    [TRANSITION]: `Transition`,
+    [TRANSITION_GROUP]: `TransitionGroup`
+  });
+
+  let decoder;
+  function decodeHtmlBrowser(raw, asAttr = false) {
+    if (!decoder) {
+      decoder = document.createElement("div");
+    }
+    if (asAttr) {
+      decoder.innerHTML = `<div foo="${raw.replace(/"/g, "&quot;")}">`;
+      return decoder.children[0].getAttribute("foo");
+    } else {
+      decoder.innerHTML = raw;
+      return decoder.textContent;
+    }
+  }
+
+  const isRawTextContainer = /* @__PURE__ */ makeMap(
+    "style,iframe,script,noscript",
+    true
+  );
+  const parserOptions = {
+    isVoidTag,
+    isNativeTag: (tag) => isHTMLTag(tag) || isSVGTag(tag),
+    isPreTag: (tag) => tag === "pre",
+    decodeEntities: decodeHtmlBrowser ,
+    isBuiltInComponent: (tag) => {
+      if (isBuiltInType(tag, `Transition`)) {
+        return TRANSITION;
+      } else if (isBuiltInType(tag, `TransitionGroup`)) {
+        return TRANSITION_GROUP;
+      }
+    },
+    // https://html.spec.whatwg.org/multipage/parsing.html#tree-construction-dispatcher
+    getNamespace(tag, parent) {
+      let ns = parent ? parent.ns : 0;
+      if (parent && ns === 2) {
+        if (parent.tag === "annotation-xml") {
+          if (tag === "svg") {
+            return 1;
+          }
+          if (parent.props.some(
+            (a) => a.type === 6 && a.name === "encoding" && a.value != null && (a.value.content === "text/html" || a.value.content === "application/xhtml+xml")
+          )) {
+            ns = 0;
+          }
+        } else if (/^m(?:[ions]|text)$/.test(parent.tag) && tag !== "mglyph" && tag !== "malignmark") {
+          ns = 0;
+        }
+      } else if (parent && ns === 1) {
+        if (parent.tag === "foreignObject" || parent.tag === "desc" || parent.tag === "title") {
+          ns = 0;
+        }
+      }
+      if (ns === 0) {
+        if (tag === "svg") {
+          return 1;
+        }
+        if (tag === "math") {
+          return 2;
+        }
+      }
+      return ns;
+    },
+    // https://html.spec.whatwg.org/multipage/parsing.html#parsing-html-fragments
+    getTextMode({ tag, ns }) {
+      if (ns === 0) {
+        if (tag === "textarea" || tag === "title") {
+          return 1;
+        }
+        if (isRawTextContainer(tag)) {
+          return 2;
+        }
+      }
+      return 0;
+    }
+  };
+
+  const transformStyle = (node) => {
+    if (node.type === 1) {
+      node.props.forEach((p, i) => {
+        if (p.type === 6 && p.name === "style" && p.value) {
+          node.props[i] = {
+            type: 7,
+            name: `bind`,
+            arg: createSimpleExpression(`style`, true, p.loc),
+            exp: parseInlineCSS(p.value.content, p.loc),
+            modifiers: [],
+            loc: p.loc
+          };
+        }
+      });
+    }
+  };
+  const parseInlineCSS = (cssText, loc) => {
+    const normalized = parseStringStyle(cssText);
+    return createSimpleExpression(
+      JSON.stringify(normalized),
+      false,
+      loc,
+      3
+    );
+  };
+
+  function createDOMCompilerError(code, loc) {
+    return createCompilerError(
+      code,
+      loc,
+      DOMErrorMessages
+    );
+  }
+  const DOMErrorMessages = {
+    [53]: `v-html is missing expression.`,
+    [54]: `v-html will override element children.`,
+    [55]: `v-text is missing expression.`,
+    [56]: `v-text will override element children.`,
+    [57]: `v-model can only be used on <input>, <textarea> and <select> elements.`,
+    [58]: `v-model argument is not supported on plain elements.`,
+    [59]: `v-model cannot be used on file inputs since they are read-only. Use a v-on:change listener instead.`,
+    [60]: `Unnecessary value binding used alongside v-model. It will interfere with v-model's behavior.`,
+    [61]: `v-show is missing expression.`,
+    [62]: `<Transition> expects exactly one child element or component.`,
+    [63]: `Tags with side effect (<script> and <style>) are ignored in client component templates.`
+  };
+
+  const transformVHtml = (dir, node, context) => {
+    const { exp, loc } = dir;
+    if (!exp) {
+      context.onError(
+        createDOMCompilerError(53, loc)
+      );
+    }
+    if (node.children.length) {
+      context.onError(
+        createDOMCompilerError(54, loc)
+      );
+      node.children.length = 0;
+    }
+    return {
+      props: [
+        createObjectProperty(
+          createSimpleExpression(`innerHTML`, true, loc),
+          exp || createSimpleExpression("", true)
+        )
+      ]
+    };
+  };
+
+  const transformVText = (dir, node, context) => {
+    const { exp, loc } = dir;
+    if (!exp) {
+      context.onError(
+        createDOMCompilerError(55, loc)
+      );
+    }
+    if (node.children.length) {
+      context.onError(
+        createDOMCompilerError(56, loc)
+      );
+      node.children.length = 0;
+    }
+    return {
+      props: [
+        createObjectProperty(
+          createSimpleExpression(`textContent`, true),
+          exp ? getConstantType(exp, context) > 0 ? exp : createCallExpression(
+            context.helperString(TO_DISPLAY_STRING),
+            [exp],
+            loc
+          ) : createSimpleExpression("", true)
+        )
+      ]
+    };
+  };
+
+  const transformModel = (dir, node, context) => {
+    const baseResult = transformModel$1(dir, node, context);
+    if (!baseResult.props.length || node.tagType === 1) {
+      return baseResult;
+    }
+    if (dir.arg) {
+      context.onError(
+        createDOMCompilerError(
+          58,
+          dir.arg.loc
+        )
+      );
+    }
+    function checkDuplicatedValue() {
+      const value = findProp(node, "value");
+      if (value) {
+        context.onError(
+          createDOMCompilerError(
+            60,
+            value.loc
+          )
+        );
+      }
+    }
+    const { tag } = node;
+    const isCustomElement = context.isCustomElement(tag);
+    if (tag === "input" || tag === "textarea" || tag === "select" || isCustomElement) {
+      let directiveToUse = V_MODEL_TEXT;
+      let isInvalidType = false;
+      if (tag === "input" || isCustomElement) {
+        const type = findProp(node, `type`);
+        if (type) {
+          if (type.type === 7) {
+            directiveToUse = V_MODEL_DYNAMIC;
+          } else if (type.value) {
+            switch (type.value.content) {
+              case "radio":
+                directiveToUse = V_MODEL_RADIO;
+                break;
+              case "checkbox":
+                directiveToUse = V_MODEL_CHECKBOX;
+                break;
+              case "file":
+                isInvalidType = true;
+                context.onError(
+                  createDOMCompilerError(
+                    59,
+                    dir.loc
+                  )
+                );
+                break;
+              default:
+                checkDuplicatedValue();
+                break;
+            }
+          }
+        } else if (hasDynamicKeyVBind(node)) {
+          directiveToUse = V_MODEL_DYNAMIC;
+        } else {
+          checkDuplicatedValue();
+        }
+      } else if (tag === "select") {
+        directiveToUse = V_MODEL_SELECT;
+      } else {
+        checkDuplicatedValue();
+      }
+      if (!isInvalidType) {
+        baseResult.needRuntime = context.helper(directiveToUse);
+      }
+    } else {
+      context.onError(
+        createDOMCompilerError(
+          57,
+          dir.loc
+        )
+      );
+    }
+    baseResult.props = baseResult.props.filter(
+      (p) => !(p.key.type === 4 && p.key.content === "modelValue")
+    );
+    return baseResult;
+  };
+
+  const isEventOptionModifier = /* @__PURE__ */ makeMap(`passive,once,capture`);
+  const isNonKeyModifier = /* @__PURE__ */ makeMap(
+    // event propagation management
+    `stop,prevent,self,ctrl,shift,alt,meta,exact,middle`
+  );
+  const maybeKeyModifier = /* @__PURE__ */ makeMap("left,right");
+  const isKeyboardEvent = /* @__PURE__ */ makeMap(
+    `onkeyup,onkeydown,onkeypress`,
+    true
+  );
+  const resolveModifiers = (key, modifiers, context, loc) => {
+    const keyModifiers = [];
+    const nonKeyModifiers = [];
+    const eventOptionModifiers = [];
+    for (let i = 0; i < modifiers.length; i++) {
+      const modifier = modifiers[i];
+      if (isEventOptionModifier(modifier)) {
+        eventOptionModifiers.push(modifier);
+      } else {
+        if (maybeKeyModifier(modifier)) {
+          if (isStaticExp(key)) {
+            if (isKeyboardEvent(key.content)) {
+              keyModifiers.push(modifier);
+            } else {
+              nonKeyModifiers.push(modifier);
+            }
+          } else {
+            keyModifiers.push(modifier);
+            nonKeyModifiers.push(modifier);
+          }
+        } else {
+          if (isNonKeyModifier(modifier)) {
+            nonKeyModifiers.push(modifier);
+          } else {
+            keyModifiers.push(modifier);
+          }
+        }
+      }
+    }
+    return {
+      keyModifiers,
+      nonKeyModifiers,
+      eventOptionModifiers
+    };
+  };
+  const transformClick = (key, event) => {
+    const isStaticClick = isStaticExp(key) && key.content.toLowerCase() === "onclick";
+    return isStaticClick ? createSimpleExpression(event, true) : key.type !== 4 ? createCompoundExpression([
+      `(`,
+      key,
+      `) === "onClick" ? "${event}" : (`,
+      key,
+      `)`
+    ]) : key;
+  };
+  const transformOn = (dir, node, context) => {
+    return transformOn$1(dir, node, context, (baseResult) => {
+      const { modifiers } = dir;
+      if (!modifiers.length)
+        return baseResult;
+      let { key, value: handlerExp } = baseResult.props[0];
+      const { keyModifiers, nonKeyModifiers, eventOptionModifiers } = resolveModifiers(key, modifiers, context, dir.loc);
+      if (nonKeyModifiers.includes("right")) {
+        key = transformClick(key, `onContextmenu`);
+      }
+      if (nonKeyModifiers.includes("middle")) {
+        key = transformClick(key, `onMouseup`);
+      }
+      if (nonKeyModifiers.length) {
+        handlerExp = createCallExpression(context.helper(V_ON_WITH_MODIFIERS), [
+          handlerExp,
+          JSON.stringify(nonKeyModifiers)
+        ]);
+      }
+      if (keyModifiers.length && // if event name is dynamic, always wrap with keys guard
+      (!isStaticExp(key) || isKeyboardEvent(key.content))) {
+        handlerExp = createCallExpression(context.helper(V_ON_WITH_KEYS), [
+          handlerExp,
+          JSON.stringify(keyModifiers)
+        ]);
+      }
+      if (eventOptionModifiers.length) {
+        const modifierPostfix = eventOptionModifiers.map(capitalize).join("");
+        key = isStaticExp(key) ? createSimpleExpression(`${key.content}${modifierPostfix}`, true) : createCompoundExpression([`(`, key, `) + "${modifierPostfix}"`]);
+      }
+      return {
+        props: [createObjectProperty(key, handlerExp)]
+      };
+    });
+  };
+
+  const transformShow = (dir, node, context) => {
+    const { exp, loc } = dir;
+    if (!exp) {
+      context.onError(
+        createDOMCompilerError(61, loc)
+      );
+    }
+    return {
+      props: [],
+      needRuntime: context.helper(V_SHOW)
+    };
+  };
+
+  const transformTransition = (node, context) => {
+    if (node.type === 1 && node.tagType === 1) {
+      const component = context.isBuiltInComponent(node.tag);
+      if (component === TRANSITION) {
+        return () => {
+          if (!node.children.length) {
+            return;
+          }
+          if (hasMultipleChildren(node)) {
+            context.onError(
+              createDOMCompilerError(
+                62,
+                {
+                  start: node.children[0].loc.start,
+                  end: node.children[node.children.length - 1].loc.end,
+                  source: ""
+                }
+              )
+            );
+          }
+          const child = node.children[0];
+          if (child.type === 1) {
+            for (const p of child.props) {
+              if (p.type === 7 && p.name === "show") {
+                node.props.push({
+                  type: 6,
+                  name: "persisted",
+                  value: void 0,
+                  loc: node.loc
+                });
+              }
+            }
+          }
+        };
+      }
+    }
+  };
+  function hasMultipleChildren(node) {
+    const children = node.children = node.children.filter(
+      (c) => c.type !== 3 && !(c.type === 2 && !c.content.trim())
+    );
+    const child = children[0];
+    return children.length !== 1 || child.type === 11 || child.type === 9 && child.branches.some(hasMultipleChildren);
+  }
+
+  const ignoreSideEffectTags = (node, context) => {
+    if (node.type === 1 && node.tagType === 0 && (node.tag === "script" || node.tag === "style")) {
+      context.onError(
+        createDOMCompilerError(
+          63,
+          node.loc
+        )
+      );
+      context.removeNode();
+    }
+  };
+
+  const DOMNodeTransforms = [
+    transformStyle,
+    ...[transformTransition]
+  ];
+  const DOMDirectiveTransforms = {
+    cloak: noopDirectiveTransform,
+    html: transformVHtml,
+    text: transformVText,
+    model: transformModel,
+    // override compiler-core
+    on: transformOn,
+    // override compiler-core
+    show: transformShow
+  };
+  function compile(template, options = {}) {
+    return baseCompile(
+      template,
+      extend({}, parserOptions, options, {
+        nodeTransforms: [
+          // ignore <script> and <tag>
+          // this is not put inside DOMNodeTransforms because that list is used
+          // by compiler-ssr to generate vnode fallback branches
+          ignoreSideEffectTags,
+          ...DOMNodeTransforms,
+          ...options.nodeTransforms || []
+        ],
+        directiveTransforms: extend(
+          {},
+          DOMDirectiveTransforms,
+          options.directiveTransforms || {}
+        ),
+        transformHoist: null
+      })
+    );
+  }
+
+  {
+    initDev();
+  }
+  const compileCache = /* @__PURE__ */ Object.create(null);
+  function compileToFunction(template, options) {
+    if (!isString(template)) {
+      if (template.nodeType) {
+        template = template.innerHTML;
+      } else {
+        warn(`invalid template option: `, template);
+        return NOOP;
+      }
+    }
+    const key = template;
+    const cached = compileCache[key];
+    if (cached) {
+      return cached;
+    }
+    if (template[0] === "#") {
+      const el = document.querySelector(template);
+      if (!el) {
+        warn(`Template element not found or is empty: ${template}`);
+      }
+      template = el ? el.innerHTML : ``;
+    }
+    const opts = extend(
+      {
+        hoistStatic: true,
+        onError: onError ,
+        onWarn: (e) => onError(e, true)
+      },
+      options
+    );
+    if (!opts.isCustomElement && typeof customElements !== "undefined") {
+      opts.isCustomElement = (tag) => !!customElements.get(tag);
+    }
+    const { code } = compile(template, opts);
+    function onError(err, asWarning = false) {
+      const message = asWarning ? err.message : `Template compilation error: ${err.message}`;
+      const codeFrame = err.loc && generateCodeFrame(
+        template,
+        err.loc.start.offset,
+        err.loc.end.offset
+      );
+      warn(codeFrame ? `${message}
+${codeFrame}` : message);
+    }
+    const render = new Function(code)() ;
+    render._rc = true;
+    return compileCache[key] = render;
+  }
+  registerRuntimeCompiler(compileToFunction);
+
+  exports.BaseTransition = BaseTransition;
+  exports.BaseTransitionPropsValidators = BaseTransitionPropsValidators;
+  exports.Comment = Comment;
+  exports.EffectScope = EffectScope;
+  exports.Fragment = Fragment;
+  exports.KeepAlive = KeepAlive;
+  exports.ReactiveEffect = ReactiveEffect;
+  exports.Static = Static;
+  exports.Suspense = Suspense;
+  exports.Teleport = Teleport;
+  exports.Text = Text;
+  exports.Transition = Transition;
+  exports.TransitionGroup = TransitionGroup;
+  exports.VueElement = VueElement;
+  exports.assertNumber = assertNumber;
+  exports.callWithAsyncErrorHandling = callWithAsyncErrorHandling;
+  exports.callWithErrorHandling = callWithErrorHandling;
+  exports.camelize = camelize;
+  exports.capitalize = capitalize;
+  exports.cloneVNode = cloneVNode;
+  exports.compatUtils = compatUtils;
+  exports.compile = compileToFunction;
+  exports.computed = computed;
+  exports.createApp = createApp;
+  exports.createBlock = createBlock;
+  exports.createCommentVNode = createCommentVNode;
+  exports.createElementBlock = createElementBlock;
+  exports.createElementVNode = createBaseVNode;
+  exports.createHydrationRenderer = createHydrationRenderer;
+  exports.createPropsRestProxy = createPropsRestProxy;
+  exports.createRenderer = createRenderer;
+  exports.createSSRApp = createSSRApp;
+  exports.createSlots = createSlots;
+  exports.createStaticVNode = createStaticVNode;
+  exports.createTextVNode = createTextVNode;
+  exports.createVNode = createVNode;
+  exports.customRef = customRef;
+  exports.defineAsyncComponent = defineAsyncComponent;
+  exports.defineComponent = defineComponent;
+  exports.defineCustomElement = defineCustomElement;
+  exports.defineEmits = defineEmits;
+  exports.defineExpose = defineExpose;
+  exports.defineModel = defineModel;
+  exports.defineOptions = defineOptions;
+  exports.defineProps = defineProps;
+  exports.defineSSRCustomElement = defineSSRCustomElement;
+  exports.defineSlots = defineSlots;
+  exports.effect = effect;
+  exports.effectScope = effectScope;
+  exports.getCurrentInstance = getCurrentInstance;
+  exports.getCurrentScope = getCurrentScope;
+  exports.getTransitionRawChildren = getTransitionRawChildren;
+  exports.guardReactiveProps = guardReactiveProps;
+  exports.h = h;
+  exports.handleError = handleError;
+  exports.hasInjectionContext = hasInjectionContext;
+  exports.hydrate = hydrate;
+  exports.initCustomFormatter = initCustomFormatter;
+  exports.initDirectivesForSSR = initDirectivesForSSR;
+  exports.inject = inject;
+  exports.isMemoSame = isMemoSame;
+  exports.isProxy = isProxy;
+  exports.isReactive = isReactive;
+  exports.isReadonly = isReadonly;
+  exports.isRef = isRef;
+  exports.isRuntimeOnly = isRuntimeOnly;
+  exports.isShallow = isShallow;
+  exports.isVNode = isVNode;
+  exports.markRaw = markRaw;
+  exports.mergeDefaults = mergeDefaults;
+  exports.mergeModels = mergeModels;
+  exports.mergeProps = mergeProps;
+  exports.nextTick = nextTick;
+  exports.normalizeClass = normalizeClass;
+  exports.normalizeProps = normalizeProps;
+  exports.normalizeStyle = normalizeStyle;
+  exports.onActivated = onActivated;
+  exports.onBeforeMount = onBeforeMount;
+  exports.onBeforeUnmount = onBeforeUnmount;
+  exports.onBeforeUpdate = onBeforeUpdate;
+  exports.onDeactivated = onDeactivated;
+  exports.onErrorCaptured = onErrorCaptured;
+  exports.onMounted = onMounted;
+  exports.onRenderTracked = onRenderTracked;
+  exports.onRenderTriggered = onRenderTriggered;
+  exports.onScopeDispose = onScopeDispose;
+  exports.onServerPrefetch = onServerPrefetch;
+  exports.onUnmounted = onUnmounted;
+  exports.onUpdated = onUpdated;
+  exports.openBlock = openBlock;
+  exports.popScopeId = popScopeId;
+  exports.provide = provide;
+  exports.proxyRefs = proxyRefs;
+  exports.pushScopeId = pushScopeId;
+  exports.queuePostFlushCb = queuePostFlushCb;
+  exports.reactive = reactive;
+  exports.readonly = readonly;
+  exports.ref = ref;
+  exports.registerRuntimeCompiler = registerRuntimeCompiler;
+  exports.render = render;
+  exports.renderList = renderList;
+  exports.renderSlot = renderSlot;
+  exports.resolveComponent = resolveComponent;
+  exports.resolveDirective = resolveDirective;
+  exports.resolveDynamicComponent = resolveDynamicComponent;
+  exports.resolveFilter = resolveFilter;
+  exports.resolveTransitionHooks = resolveTransitionHooks;
+  exports.setBlockTracking = setBlockTracking;
+  exports.setDevtoolsHook = setDevtoolsHook;
+  exports.setTransitionHooks = setTransitionHooks;
+  exports.shallowReactive = shallowReactive;
+  exports.shallowReadonly = shallowReadonly;
+  exports.shallowRef = shallowRef;
+  exports.ssrContextKey = ssrContextKey;
+  exports.ssrUtils = ssrUtils;
+  exports.stop = stop;
+  exports.toDisplayString = toDisplayString;
+  exports.toHandlerKey = toHandlerKey;
+  exports.toHandlers = toHandlers;
+  exports.toRaw = toRaw;
+  exports.toRef = toRef;
+  exports.toRefs = toRefs;
+  exports.toValue = toValue;
+  exports.transformVNodeArgs = transformVNodeArgs;
+  exports.triggerRef = triggerRef;
+  exports.unref = unref;
+  exports.useAttrs = useAttrs;
+  exports.useCssModule = useCssModule;
+  exports.useCssVars = useCssVars;
+  exports.useModel = useModel;
+  exports.useSSRContext = useSSRContext;
+  exports.useSlots = useSlots;
+  exports.useTransitionState = useTransitionState;
+  exports.vModelCheckbox = vModelCheckbox;
+  exports.vModelDynamic = vModelDynamic;
+  exports.vModelRadio = vModelRadio;
+  exports.vModelSelect = vModelSelect;
+  exports.vModelText = vModelText;
+  exports.vShow = vShow;
+  exports.version = version;
+  exports.warn = warn;
+  exports.watch = watch;
+  exports.watchEffect = watchEffect;
+  exports.watchPostEffect = watchPostEffect;
+  exports.watchSyncEffect = watchSyncEffect;
+  exports.withAsyncContext = withAsyncContext;
+  exports.withCtx = withCtx;
+  exports.withDefaults = withDefaults;
+  exports.withDirectives = withDirectives;
+  exports.withKeys = withKeys;
+  exports.withMemo = withMemo;
+  exports.withModifiers = withModifiers;
+  exports.withScopeId = withScopeId;
+
+  return exports;
+
+})({});
Index: /mods/mod_ticket/assets/js/wpsg_modul.js
===================================================================
--- /mods/mod_ticket/assets/js/wpsg_modul.js	(revision 8427)
+++ /mods/mod_ticket/assets/js/wpsg_modul.js	(revision 8427)
@@ -0,0 +1,222 @@
+const ticket_settings_edit = (wpsgSettings, admin_url, init_data) => {
+
+	import(`${wpsgSettings.baseUrl}mods/mod_ticket/assets/js/vue.esm-browser.js`).then((module) => {
+
+		 const { ref, createApp, onMounted } = module;
+
+		createApp({
+			setup() {
+
+				const data = ref(init_data);
+				const template = ref(undefined);
+				const loading = ref(false);
+				const file_upload = ref(undefined);
+
+				const xhr = (action, param, callback_ok) => {
+
+					param['action'] = action;
+
+					const request = new XMLHttpRequest();
+
+					request.open('POST', admin_url + '?action=wpsg_ticket', true);
+					request.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
+
+					request.onreadystatechange = () => {
+
+						if (request.readyState === 4 && request.status === 200) {
+
+							callback_ok(JSON.parse(request.responseText));
+
+						}
+
+					};
+
+					request.send(JSON.stringify(param));
+
+				};
+
+				const uploadBg = (event) => {
+
+					const upload_file = file_upload.value.files[0];
+
+					const reader = new FileReader();
+
+					reader.onload = function(event) {
+
+						const base64Data = event.target.result.split(',')[1];
+
+						const file = {
+						  fileData: base64Data,
+						  fileType: upload_file.type,
+						  fileName: upload_file.name
+						};
+
+						loading.value = true;
+
+						xhr('uploadBg', {
+							template: template.value,
+							file: file
+						}, (response) => {
+
+							file_upload.value.value = '';
+
+							for (let i in data.value.arTemplates) {
+
+								if (data.value.arTemplates[i].id == response.template.id) {
+
+									data.value.arTemplates[i] = response.template;
+									template.value = data.value.arTemplates[i];
+
+								}
+
+							}
+
+							loading.value = false;
+
+						});
+
+					};
+
+					reader.readAsDataURL(upload_file);
+
+				};
+
+				const addTemplate = () => {
+
+					const template_name = window.prompt(data.value.label.newTemplate, '');
+
+					if (template_name === '') { alert(data.value.label.error_noTemplateName); return; }
+
+					loading.value = true;
+
+					xhr('addTemplate', {
+						template_name: template_name
+					}, (response) => {
+
+						loading.value = false;
+						data.value.arTemplates.push(response.template);
+						template.value = response.template;
+
+					});
+
+				};
+
+				const removeTemplate = () => {
+
+				}
+
+				const setDefaultTemplate = () => {
+
+				}
+
+				const copyTemplate = () => {
+
+					if (!confirm(data.value.label.copyTemplateConfirm)) return false;
+
+					let new_template = JSON.parse(JSON.stringify(template.value));
+
+					new_template.id = 0;
+					new_template.template_name += ' (Kopie)';
+
+					data.value.arTemplates.push(new_template);
+					template.value = new_template;
+
+				};
+
+				const addField = (field_index) => {
+
+					template.value.config.arField.splice(field_index, 0,  {
+						id: 0, x: 0, y:0, align:'L', color:'000000', alpha:'1', angle:'0', fontsize:22, opaque:100,
+						text: '', font: 'times.php'
+					})
+
+				}
+
+				const removeField = (field_index) => {
+
+					if (!confirm(data.value.label.removeFieldConfirm)) return;
+
+					template.value.config.arField.splice(field_index, 1);
+
+				}
+
+				onMounted(() => {
+
+					const el_select_modul_activ = document.getElementById('aktiv');
+					const el_wpsg_ticket_modul = document.getElementById('wpsg_ticket_modul');
+
+					el_select_modul_activ.addEventListener('change', event => {
+
+						if (event.target.value === '1') {
+
+							el_wpsg_ticket_modul.style.display = 'block';
+
+						} else {
+
+							el_wpsg_ticket_modul.style.display = 'none';
+
+						}
+
+					});
+
+					document.querySelector('p.submit input[type="submit"]').addEventListener('click', (event) => {
+
+						if (el_select_modul_activ.value === '0') return;
+
+						event.preventDefault();
+
+						loading.value = true;
+
+						const wpsg_mod_ticket_orderstate_send = [];
+						const selectElement_send = document.getElementById('wpsg_mod_ticket_orderstate_send');
+
+						for (let i = 0; i < selectElement_send.options.length; i++) {
+
+							if (selectElement_send.options[i].selected) {
+
+								wpsg_mod_ticket_orderstate_send.push(selectElement_send.options[i].value);
+
+							}
+
+						}
+
+						const wpsg_mod_ticket_orderstate_active = [];
+						const selectElement_active = document.getElementById('wpsg_mod_ticket_orderstate_active');
+
+						for (let i = 0; i < selectElement_active.options.length; i++) {
+
+							if (selectElement_active.options[i].selected) {
+
+								wpsg_mod_ticket_orderstate_active.push(selectElement_active.options[i].value);
+
+							}
+
+						}
+
+						xhr('saveSettings', {
+							'wpsg_mod_ticket_orderstate_send': wpsg_mod_ticket_orderstate_send,
+							'wpsg_mod_ticket_orderstate_active': wpsg_mod_ticket_orderstate_active,
+							'arTemplates': data.value.arTemplates
+						}, (response) => {
+
+							loading.value = false;
+
+						});
+
+					})
+
+				});
+
+				return {
+					data, template, loading, file_upload,
+					addTemplate, uploadBg, removeTemplate, setDefaultTemplate, addField, removeField, copyTemplate
+				}
+
+			}
+		}).mount('#wpsg_ticket_modul');
+
+	});
+
+}
+
+export { ticket_settings_edit as ticket_settings_edit }
Index: /mods/mod_ticket/assets/js/wpsg_order_view.js
===================================================================
--- /mods/mod_ticket/assets/js/wpsg_order_view.js	(revision 8427)
+++ /mods/mod_ticket/assets/js/wpsg_order_view.js	(revision 8427)
@@ -0,0 +1,17 @@
+export async function order_view(wpsgSettings, settings) {
+
+	const { ref, createApp, onMounted } = await import(`${wpsgSettings.baseUrl}mods/mod_ticket/assets/js/vue.esm-browser.js`);
+
+	createApp({
+		setup() {
+
+			const data = ref(settings.data);
+
+			return {
+				data
+			};
+
+		}
+	}).mount('#order_view_app');
+
+}
Index: /mods/mod_ticket/assets/js/wpsg_qrscanner.js
===================================================================
--- /mods/mod_ticket/assets/js/wpsg_qrscanner.js	(revision 8427)
+++ /mods/mod_ticket/assets/js/wpsg_qrscanner.js	(revision 8427)
@@ -0,0 +1,175 @@
+const wpsg_ticket_qrScanner = async (wpsgSettings, data) => {
+
+	const { ref, createApp, onMounted } = await import(`${wpsgSettings.baseUrl}mods/mod_ticket/assets/js/vue.esm-browser.js`);
+
+	createApp({
+		setup() {
+
+			let last_scan = undefined;
+			let html5QrcodeScanner;
+
+			const ticket_dialog = ref(undefined);
+
+			const xhr = (action, param, callback_ok) => {
+
+				param['action'] = action;
+
+				const request = new XMLHttpRequest();
+
+				request.open('POST', data.admin_url + '?action=wpsg_ticket', true);
+				request.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
+
+				request.onreadystatechange = () => {
+
+					if (request.readyState === 4 && request.status === 200) {
+
+						callback_ok(JSON.parse(request.responseText));
+
+					}
+
+				};
+
+				request.send(JSON.stringify(param));
+
+			};
+
+			const revokeBooking = (ticket_booking_id, hide_dialog) => {
+
+				ticket_dialog.value.loading = true;
+
+				if (hide_dialog === undefined) hide_dialog = true;
+
+				xhr('revokeBooking', {
+					booking_id: ticket_booking_id
+				}, (response) => {
+
+					if (hide_dialog) hideDialg();
+					else {
+
+						ticket_dialog.value = response.ticket_booking;
+
+					}
+
+				});
+
+			};
+
+			const hideDialg = () => {
+
+				html5QrcodeScanner.resume();
+
+				last_scan = undefined;
+				ticket_dialog.value = undefined;
+
+			};
+			const showTicket = (ticket_booking_id) => {
+
+				ticket_dialog.value.loading = true;
+
+				xhr('getTicketBooking', {
+					'ticket_booking_id': ticket_booking_id,
+					'log': true
+				}, (response) => {
+
+					if (response.found === true) {
+
+						ticket_dialog.value = response;
+
+					} else ticket_dialog.value.loading = false;
+
+				});
+
+			}
+			const showDialog = (data) => {
+
+				html5QrcodeScanner.pause();
+
+				ticket_dialog.value = data;
+
+			};
+			const en_de_date_time = (value) => {
+
+				const dateObject = new Date(value);
+
+				const day = ('0' + dateObject.getDate()).slice(-2);
+				const month = ('0' + (dateObject.getMonth() + 1)).slice(-2);
+				const year = dateObject.getFullYear();
+				const hours = ('0' + dateObject.getHours()).slice(-2);
+				const minutes = ('0' + dateObject.getMinutes()).slice(-2);
+
+    			const germanDateFormat = `${day}.${month}.${year} ${hours}:${minutes}`;
+
+    			return germanDateFormat;
+
+			};
+
+			onMounted(() => {
+
+				document.getElementById('qr_scanner_app').style.display = 'block';
+
+				const onScanSuccess = (decodedText, decodedResult) => {
+
+					if (decodedText === last_scan) return;
+
+					last_scan = decodedText;
+
+					try {
+
+						const arCode = decodedText.split('|');
+
+						if (arCode.length === 3) {
+
+							const order_product_id = parseInt(arCode[0]);
+							const amount_index = parseInt(arCode[1]);
+							const hash = arCode[2];
+
+							if (order_product_id > 0 && amount_index >= 0) {
+
+								xhr('decodeTicket', {
+									'order_product_id': order_product_id,
+									'amount_index': amount_index,
+									'log': true,
+									'hash': hash
+								}, (response) => {
+
+									if (response.found === true) {
+
+										showDialog(response);
+
+									} // else last_scan = undefined;
+
+								});
+
+							}
+
+						}
+
+					} catch (error) {
+
+						console.error(error);
+
+					}
+
+				};
+				const onScanFailure = (error) => { };
+
+				html5QrcodeScanner = new Html5QrcodeScanner(
+				  "reader",
+				  { fps: 10, qrbox: { width: 350, height: 350 } },
+				  /* verbose */ false);
+
+				html5QrcodeScanner.render(onScanSuccess, onScanFailure);
+
+			});
+
+			return {
+				ticket_dialog,
+				hideDialg, showDialog, en_de_date_time, revokeBooking, showTicket
+			};
+
+		}
+	}).mount('#qr_scanner_app');
+
+};
+
+export { wpsg_ticket_qrScanner as wpsg_ticket_qrScanner }
Index: /mods/mod_ticket/assets/js/wpsg_ticket.js
===================================================================
--- /mods/mod_ticket/assets/js/wpsg_ticket.js	(revision 8427)
+++ /mods/mod_ticket/assets/js/wpsg_ticket.js	(revision 8427)
@@ -0,0 +1,347 @@
+const product_addedit_content = async (wpsgSettings, product_id, admin_url) => {
+
+	const { ref, createApp, onMounted, watch } = await import(`${wpsgSettings.baseUrl}mods/mod_ticket/assets/js/vue.esm-browser.js`);
+	const { default: VanillaCalendar } = await import(`${wpsgSettings.baseUrl}mods/mod_ticket/assets/vanilla-calendar/vanilla-calendar.min.m.js`);
+
+	createApp({
+		setup() {
+
+			const dialog_add = ref(undefined);
+			const serial = ref(undefined);
+			const mounted = ref(false);
+			const loading = ref(false);
+			const data = ref({
+				pager: {
+					page: undefined,
+					per_page: 25,
+					pages: undefined,
+					count: undefined
+				},
+				filter: {
+					hideInactive: true,
+					autoticket_id: 0,
+					product_id: product_id
+				},
+				items: []
+			});
+			const data_serial = ref({
+				pager: {
+					page: undefined,
+					per_page: 1,
+					pages: undefined,
+					count: undefined
+				},
+				filter: {
+					product_id: product_id
+				},
+				items: []
+			});
+			const tab = ref(2);
+			const ref_calendar = ref(undefined);
+			const calendar = ref(undefined);
+			const cal_loading = ref(false);
+			const arOccupancy = ref(undefined);
+			const day_selected = ref(undefined);
+
+			const closeDialog = () => {
+
+				dialog_add.value = undefined;
+
+			}
+			const addEvent = () => {
+
+				dialog_add.value = {
+					from_date: '0000-00-00',
+					from_time: '00:00',
+					to_date: '0000-00-00',
+					to_time: '00:00',
+					slots: 1
+				};
+
+			}
+			const setWeekDay = (event, i) => {
+
+				if (!serial.value.days.includes(i)) serial.value.days.push(i);
+				else {
+
+					const index = serial.value.days.indexOf(i);
+					serial.value.days.splice(index, 1);
+
+				}
+
+			};
+			const addSerialevent = () => {
+
+				serial.value = {
+					id: 0,
+					from_date: null,
+					to_date: null,
+					days_future: 30,
+					days: [0,1,2,3,4],
+					event_data: {
+						from_time: '00:00',
+						to_time: '00:00',
+						slots: 1
+					}
+				}
+
+			}
+
+			const closeSerialDialog = () => {
+
+				serial.value = undefined;
+
+			}
+
+			const submitSerial = () => {
+
+				xhr('save_tickets', {
+					'serial': serial.value
+				}, (response) => {
+
+					serial.value = undefined;
+					load();
+
+				});
+
+			}
+
+			const xhr = (action, param, callback_ok) => {
+
+				param['action'] = action;
+				param['product_id'] = product_id;
+
+				const request = new XMLHttpRequest();
+
+				request.open('POST', admin_url + '?action=wpsg_ticket', true);
+				request.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
+
+				request.onreadystatechange = () => {
+
+					if (request.readyState === 4 && request.status === 200) {
+
+						callback_ok(JSON.parse(request.responseText));
+
+					}
+
+				};
+
+				request.send(JSON.stringify(param));
+
+			};
+
+			const changeTerminState = (ticket) => {
+
+				loading.value = true;
+
+				xhr('changeState', {
+					ticket_id: ticket.id
+				}, (response) => {
+
+					reload();
+
+				});
+
+			};
+
+			const editTicket = (ticket) => {
+
+				serial.value = {
+					id: ticket.id,
+					label: ticket.label,
+					label_short: ticket.label_short,
+					from_date: ticket.autoticket.from_date,
+					to_date: ticket.autoticket.to_date,
+					days_future: ticket.autoticket.days_future,
+					days: ticket.autoticket.days,
+					event_data: ticket.autoticket.event_data
+				}
+			};
+
+			const deleteTicket = (ticket) => {
+
+				if (!confirm('Sind Sie sich sicher?')) return;
+
+				loading.value = true;
+
+				xhr('deleteTicket', {
+					ticket_id: ticket.id
+				}, (response) => {
+
+					reload();
+
+				});
+
+			};
+
+			const reload = () => {
+
+				const load_page = data.value.pager.page;
+
+				data.value.pager.page = 0;
+				goPage(load_page);
+
+			}
+
+			const goSerialPage = (page) => {
+				
+				if (page < 1 || page > data_serial.value.pager.pages) page = 1;
+				if (page === data_serial.value.pager.page) return false;
+
+				data_serial.value.pager.page = page;
+
+				load();
+
+			}
+			
+			const goPage = (page) => {
+
+				if (page < 1 || page > data.value.pager.pages) page = 1;
+				if (page === data.value.pager.page) return false;
+
+				data.value.pager.page = page;
+
+				load();
+
+			}
+
+			const load = () => {
+
+				loading.value = true;
+
+				xhr('getTicket', {
+					'filter': data.value.filter,
+					'pager': data.value.pager,
+					'pager_serial': data_serial.value.pager,
+					'filter_serial': data_serial.value.filter
+				}, (response) => {
+
+					data.value.items = response.items;
+					data.value.pager = response.pager;
+
+					data_serial.value.items = response.items_serial;
+					data_serial.value.pager = response.pager_serial;
+
+					loading.value = false;
+
+				});
+
+			}
+
+			const dialog_submit = (event) => {
+
+				event.preventDefault();
+
+				const data = dialog_add.value;
+
+				if (
+					(data.from_time === '00:00' && data.to_time !== '00:00') ||
+					(data.from_time !== '00:00' && data.to_time === '00:00')
+				) {
+
+					alert('Bitte keine Zeit oder beide Zeiten angeben.');
+
+					return;
+
+				}
+
+				dialog_add.value = undefined;
+				loading.value = true;
+
+				xhr('add_tickets', {
+					'product_id': product_id,
+					'data': data
+				}, (response) => {
+
+					reload();
+
+				});
+
+			};
+
+			const display_autoTermin = (autotermin_id) => {
+
+				tab.value = 1;
+				data.value.filter.autoticket_id = autotermin_id;
+				load();
+
+			}
+
+			onMounted(() => {
+
+				mounted.value = true;
+
+				goPage(1);
+
+			});
+
+			watch(ref_calendar, (newValue, oldValue) => {
+
+				if (newValue !== null) {
+
+					cal_loading.value = true;
+
+					xhr('loadOccupancy', { }, (response) => {
+
+						arOccupancy.value = response.arOccupancy;
+
+						let popups = {};
+
+						Object.keys(response.arOccupancy).forEach(k => {
+
+							if (response.arOccupancy[k] !== null) {
+
+								popups[k] = {
+									modifier: ((response.arOccupancy[k].slots === response.arOccupancy[k].slots_used) ? 'full' : '')
+								}
+
+							}
+
+						});
+
+						calendar.value = new VanillaCalendar(ref_calendar.value, {
+							'popups': popups,
+							'settings': {
+								'visibility': {
+									'theme': 'light',
+								},
+								'lang': 'de',
+								'range': {
+									'disableAllDays': true,
+									'enabled': Object.keys(response.arOccupancy)
+								},
+								'selection': {
+									'day': 'single'
+								}
+							},
+							actions: {
+								clickDay(e, dates) {
+
+									if (dates.length === 1) day_selected.value = dates[0];
+									else day_selected.value = undefined;
+
+								}
+							},
+						});
+
+						calendar.value.init();
+
+						cal_loading.value = false;
+
+					});
+
+				}
+
+			});
+
+			return {
+				dialog_add, mounted, loading, data, data_serial, tab, ref_calendar, cal_loading, arOccupancy, day_selected, serial,
+				addEvent, closeDialog, dialog_submit, goPage, changeTerminState, editTicket, deleteTicket, reload, addSerialevent, submitSerial, closeSerialDialog, setWeekDay, goSerialPage, load, display_autoTermin
+			};
+
+		}
+	}).mount('#wpsg_ticket_product');
+
+};
+
+export { product_addedit_content as product_addedit_content }
Index: /mods/mod_ticket/assets/js/wpsg_ticket_frontend.js
===================================================================
--- /mods/mod_ticket/assets/js/wpsg_ticket_frontend.js	(revision 8427)
+++ /mods/mod_ticket/assets/js/wpsg_ticket_frontend.js	(revision 8427)
@@ -0,0 +1,252 @@
+document.addEventListener("DOMContentLoaded", function() {
+
+	for (let el_ticket_product of document.querySelectorAll('.wpsg_ticket_product')) {
+
+		const { createApp, ref, onMounted, watch, computed, nextTick } = Vue;
+
+		const json_data = JSON.parse(atob(el_ticket_product.getElementsByClassName('json_data')[0].innerHTML));
+
+		createApp({
+			setup() {
+
+				const data = ref(json_data);
+				const mounted = ref(false);
+				const ticket = ref(undefined);
+				const ref_calendar = ref(undefined);
+				const day_selected = ref(undefined);
+				const loading = ref(false);
+				const layer_msg = ref(undefined);
+
+				const serializeFormToJSON = (formData) => {
+
+					const form_data = {};
+
+					for (let [key, value] of formData.entries()) {
+
+						let parts = key.split(/[\[\]]+/).filter(part => part);
+
+						let currentLevel = form_data;
+
+						for (let i = 0; i < parts.length; i++) {
+
+							let part = parts[i];
+
+							if (i === parts.length - 1) currentLevel[part] = value;
+							else {
+
+								if (!currentLevel[part]) currentLevel[part] = {};
+
+								currentLevel = currentLevel[part];
+
+							}
+
+						}
+
+					}
+
+					return form_data;
+
+				};
+				const ff = (number) => {
+
+					return parseFloat(number).toFixed(2).replace('.', ',');
+
+				};
+				const setVari = (var_id, vari_id) => {
+
+					console.log(var_id, vari_id);
+
+					loading.value = true;
+
+					xhr('setVari', {
+						'product_key': data.value.product_key,
+						'var_id': var_id,
+						'vari_id': vari_id
+					}, (response) => {
+
+						data.value.price = response.price;
+						data.value.product_key = response.product_key;
+						data.value.vp_info = response.vp_info;
+
+						nextTick(() => {
+
+							loading.value = false;
+
+						});
+
+					})
+
+				};
+				const xhr = (action, param, callback_ok) => {
+
+					param['action'] = action;
+					param['product_id'] = data.value.product_id;
+
+					const request = new XMLHttpRequest();
+
+					request.open('POST', data.value.ajax_url + '?action=wpsg_ticket_frontend', true);
+					request.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
+
+					request.onreadystatechange = () => {
+
+						if (request.readyState === 4 && request.status === 200) {
+
+							callback_ok(JSON.parse(request.responseText));
+
+						}
+
+					};
+
+					request.send(JSON.stringify(param));
+
+				};
+				const showDoneLayer = (msg) => {
+
+					layer_msg.value = msg;
+
+				};
+
+				function markEvent(element) {
+
+					element.style.backgroundColor = 'red';
+					element.dataset.marked = true;
+
+				}
+
+				onMounted(() => {
+
+					mounted.value = true;
+
+					nextTick(() => {
+
+						const container = ref_calendar.value;
+						let shadow = container.attachShadow({ mode: 'open' });
+
+						const appContainer = document.createElement('div');
+						shadow.appendChild(appContainer);
+
+						const calendar_css_link = document.getElementById('wpsg_ticket-calendar-css');
+
+						if (calendar_css_link) {
+
+							const link = document.createElement('link');
+							link.rel = 'stylesheet';
+							link.href = calendar_css_link.getAttribute('href');
+							shadow.appendChild(link);
+
+						}
+
+						let event_select_id = 0;
+
+						let calendar = new FullCalendar.Calendar(appContainer, {
+							locale: 'de',
+							height: 'auto',
+							timeZone: 'Europe/Berlin',
+							events: data.value.ajax_url + '?action=wpsg_ticket_frontend&ticket_action=getEvents&product_id=' + data.value.product_id,
+							initialView: 'dayGridMonth',
+							themeSystem: 'standard',
+							selectable: true,
+							headerToolbar: {
+								left: 'prev,next,today',
+								center: 'title',
+								right: 'dayGridMonth,timeGridWeek,timeGridDay'
+							},
+							eventContent: function(arg) {
+
+								let span = document.createElement('span'); span.classList.add('wpsg_event'); span.setAttribute('data-event_id', arg.event.id);
+								let span2 = document.createElement('span'); span2.classList.add('wpsg_event_free_slots');
+
+								if (arg.event.id === event_select_id) span.classList.add('selected');
+
+								span.innerHTML = arg.event.title; span.setAttribute('title', arg.event.title);
+								span2.innerHTML = arg.event.extendedProps['free_slots'] + ' frei';
+
+								span.appendChild(span2);
+
+								return { domNodes: [ span ] }
+
+							},
+							eventClick: (arg) => {
+
+								loading.value = true;
+
+								event_select_id = arg.event.id;
+
+								for (let el of shadow.querySelectorAll('.wpsg_event')) {
+
+									if (parseInt(el.getAttribute('data-event_id')) !== parseInt(arg.event.id)) el.classList.remove('selected');
+									else el.classList.add('selected');
+
+								}
+
+								xhr('getTicket', {
+									ticket_id: arg.event.id
+								}, (response) => {
+
+									ticket.value = response.ticket;
+									loading.value = false;
+
+								});
+
+							}
+						});
+
+						calendar.render();
+
+						if (typeof refreshFsLightbox === 'function') refreshFsLightbox();
+
+					});
+
+				});
+
+				const computedButtonClass = computed(() => { return ''; })
+				const computedButtonText = computed(() => { return 'In den Warenkorb'; })
+
+				const form = document.getElementById('wpsg_produktform_' + data.value.template_index);
+
+				form.addEventListener('submit', (event) => {
+
+					event.preventDefault(); event.stopPropagation();
+
+					if (loading.value === true) return;
+
+					loading.value = true;
+
+					const formData = new FormData(el_ticket_product.parentNode);
+					const form_data = serializeFormToJSON(formData);
+
+					xhr('addProductToBasket', {
+						'ticket': ticket.value,
+						'product_id': data.value.product_id,
+						'form_data': form_data
+					}, (response) => {
+
+						loading.value = false;
+
+						if (response.alert) {
+							alert(response.alert);
+						}
+						if (response.showDoneLayer) {
+							showDoneLayer(response.showDoneLayer);
+						}
+						if (response.redirect) {
+							window.location.href = response.redirect;
+						}
+
+					});
+
+				});
+
+				return {
+					computedButtonText, computedButtonClass,
+					setVari, ff,
+					data, mounted, day_selected, loading, layer_msg, ticket,
+					ref_calendar
+				}
+
+			}
+		}).mount(el_ticket_product);
+
+	}
+
+});
Index: /mods/mod_ticket/assets/vanilla-calendar/demo.html
===================================================================
--- /mods/mod_ticket/assets/vanilla-calendar/demo.html	(revision 8427)
+++ /mods/mod_ticket/assets/vanilla-calendar/demo.html	(revision 8427)
@@ -0,0 +1,20 @@
+<html>e'
+  <head>
+    <!-- Plugin CSS -->
+    <link href="./vanilla-calendar.min.css" rel="stylesheet">
+    <link href="./themes/light.min.css" rel="stylesheet">
+    <link href="./themes/dark.min.css" rel="stylesheet">
+    <!-- Plugin JS -->
+    <script src="./vanilla-calendar.min.js" defer></script>
+  </head>
+  <body>
+    <div id="calendar"></div>
+
+    <script>
+      document.addEventListener('DOMContentLoaded', () => {
+        const calendar = new VanillaCalendar('#calendar');
+        calendar.init();
+      });
+    </script>
+  </body>
+</html>
Index: /mods/mod_ticket/assets/vanilla-calendar/index.global.min.js
===================================================================
--- /mods/mod_ticket/assets/vanilla-calendar/index.global.min.js	(revision 8427)
+++ /mods/mod_ticket/assets/vanilla-calendar/index.global.min.js	(revision 8427)
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Standard Bundle v6.1.11
+Docs & License: https://fullcalendar.io/docs/initialize-globals
+(c) 2023 Adam Shaw
+*/
+var FullCalendar=function(e){"use strict";var t,n,r,i,s,o,a,l,c,d={},u=[],h=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function f(e,t){for(var n in t)e[n]=t[n];return e}function g(e){var t=e.parentNode;t&&t.removeChild(e)}function p(e,n,r){var i,s,o,a={};for(o in n)"key"==o?i=n[o]:"ref"==o?s=n[o]:a[o]=n[o];if(arguments.length>2&&(a.children=arguments.length>3?t.call(arguments,2):r),"function"==typeof e&&null!=e.defaultProps)for(o in e.defaultProps)void 0===a[o]&&(a[o]=e.defaultProps[o]);return m(e,a,i,s,null)}function m(e,t,i,s,o){var a={type:e,props:t,key:i,ref:s,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==o?++r:o};return null==o&&null!=n.vnode&&n.vnode(a),a}function v(){return{current:null}}function y(e){return e.children}function b(e,t,n){"-"===t[0]?e.setProperty(t,null==n?"":n):e[t]=null==n?"":"number"!=typeof n||h.test(t)?n:n+"px"}function E(e,t,n,r,i){var s;e:if("style"===t)if("string"==typeof n)e.style.cssText=n;else{if("string"==typeof r&&(e.style.cssText=r=""),r)for(t in r)n&&t in n||b(e.style,t,"");if(n)for(t in n)r&&n[t]===r[t]||b(e.style,t,n[t])}else if("o"===t[0]&&"n"===t[1])s=t!==(t=t.replace(/Capture$/,"")),t=t.toLowerCase()in e?t.toLowerCase().slice(2):t.slice(2),e.l||(e.l={}),e.l[t+s]=n,n?r||e.addEventListener(t,s?A:S,s):e.removeEventListener(t,s?A:S,s);else if("dangerouslySetInnerHTML"!==t){if(i)t=t.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if("width"!==t&&"height"!==t&&"href"!==t&&"list"!==t&&"form"!==t&&"tabIndex"!==t&&"download"!==t&&t in e)try{e[t]=null==n?"":n;break e}catch(e){}"function"==typeof n||(null==n||!1===n&&-1==t.indexOf("-")?e.removeAttribute(t):e.setAttribute(t,n))}}function S(e){s=!0;try{return this.l[e.type+!1](n.event?n.event(e):e)}finally{s=!1}}function A(e){s=!0;try{return this.l[e.type+!0](n.event?n.event(e):e)}finally{s=!1}}function D(e,t){this.props=e,this.context=t}function w(e,t){if(null==t)return e.__?w(e.__,e.__.__k.indexOf(e)+1):null;for(var n;t<e.__k.length;t++)if(null!=(n=e.__k[t])&&null!=n.__e)return n.__e;return"function"==typeof e.type?w(e):null}function C(e){var t,n;if(null!=(e=e.__)&&null!=e.__c){for(e.__e=e.__c.base=null,t=0;t<e.__k.length;t++)if(null!=(n=e.__k[t])&&null!=n.__e){e.__e=e.__c.base=n.__e;break}return C(e)}}function R(e){s?setTimeout(e):l(e)}function x(e){(!e.__d&&(e.__d=!0)&&o.push(e)&&!_.__r++||a!==n.debounceRendering)&&((a=n.debounceRendering)||R)(_)}function _(){var e,t,n,r,i,s,a,l;for(o.sort((function(e,t){return e.__v.__b-t.__v.__b}));e=o.shift();)e.__d&&(t=o.length,r=void 0,i=void 0,a=(s=(n=e).__v).__e,(l=n.__P)&&(r=[],(i=f({},s)).__v=s.__v+1,N(l,s,i,n.__n,void 0!==l.ownerSVGElement,null!=s.__h?[a]:null,r,null==a?w(s):a,s.__h),P(r,s),s.__e!=a&&C(s)),o.length>t&&o.sort((function(e,t){return e.__v.__b-t.__v.__b})));_.__r=0}function T(e,t,n,r,i,s,o,a,l,c){var h,f,g,p,v,b,E,S=r&&r.__k||u,A=S.length;for(n.__k=[],h=0;h<t.length;h++)if(null!=(p=n.__k[h]=null==(p=t[h])||"boolean"==typeof p?null:"string"==typeof p||"number"==typeof p||"bigint"==typeof p?m(null,p,null,null,p):Array.isArray(p)?m(y,{children:p},null,null,null):p.__b>0?m(p.type,p.props,p.key,p.ref?p.ref:null,p.__v):p)){if(p.__=n,p.__b=n.__b+1,null===(g=S[h])||g&&p.key==g.key&&p.type===g.type)S[h]=void 0;else for(f=0;f<A;f++){if((g=S[f])&&p.key==g.key&&p.type===g.type){S[f]=void 0;break}g=null}N(e,p,g=g||d,i,s,o,a,l,c),v=p.__e,(f=p.ref)&&g.ref!=f&&(E||(E=[]),g.ref&&E.push(g.ref,null,p),E.push(f,p.__c||v,p)),null!=v?(null==b&&(b=v),"function"==typeof p.type&&p.__k===g.__k?p.__d=l=k(p,l,e):l=I(e,p,g,S,v,l),"function"==typeof n.type&&(n.__d=l)):l&&g.__e==l&&l.parentNode!=e&&(l=w(g))}for(n.__e=b,h=A;h--;)null!=S[h]&&("function"==typeof n.type&&null!=S[h].__e&&S[h].__e==n.__d&&(n.__d=O(r).nextSibling),j(S[h],S[h]));if(E)for(h=0;h<E.length;h++)B(E[h],E[++h],E[++h])}function k(e,t,n){for(var r,i=e.__k,s=0;i&&s<i.length;s++)(r=i[s])&&(r.__=e,t="function"==typeof r.type?k(r,t,n):I(n,r,r,i,r.__e,t));return t}function M(e,t){return t=t||[],null==e||"boolean"==typeof e||(Array.isArray(e)?e.some((function(e){M(e,t)})):t.push(e)),t}function I(e,t,n,r,i,s){var o,a,l;if(void 0!==t.__d)o=t.__d,t.__d=void 0;else if(null==n||i!=s||null==i.parentNode)e:if(null==s||s.parentNode!==e)e.appendChild(i),o=null;else{for(a=s,l=0;(a=a.nextSibling)&&l<r.length;l+=1)if(a==i)break e;e.insertBefore(i,s),o=s}return void 0!==o?o:i.nextSibling}function O(e){var t,n,r;if(null==e.type||"string"==typeof e.type)return e.__e;if(e.__k)for(t=e.__k.length-1;t>=0;t--)if((n=e.__k[t])&&(r=O(n)))return r;return null}function N(e,t,r,i,s,o,a,l,c){var d,u,h,g,p,m,v,b,E,S,A,w,C,R,x,_=t.type;if(void 0!==t.constructor)return null;null!=r.__h&&(c=r.__h,l=t.__e=r.__e,t.__h=null,o=[l]),(d=n.__b)&&d(t);try{e:if("function"==typeof _){if(b=t.props,E=(d=_.contextType)&&i[d.__c],S=d?E?E.props.value:d.__:i,r.__c?v=(u=t.__c=r.__c).__=u.__E:("prototype"in _&&_.prototype.render?t.__c=u=new _(b,S):(t.__c=u=new D(b,S),u.constructor=_,u.render=z),E&&E.sub(u),u.props=b,u.state||(u.state={}),u.context=S,u.__n=i,h=u.__d=!0,u.__h=[],u._sb=[]),null==u.__s&&(u.__s=u.state),null!=_.getDerivedStateFromProps&&(u.__s==u.state&&(u.__s=f({},u.__s)),f(u.__s,_.getDerivedStateFromProps(b,u.__s))),g=u.props,p=u.state,u.__v=t,h)null==_.getDerivedStateFromProps&&null!=u.componentWillMount&&u.componentWillMount(),null!=u.componentDidMount&&u.__h.push(u.componentDidMount);else{if(null==_.getDerivedStateFromProps&&b!==g&&null!=u.componentWillReceiveProps&&u.componentWillReceiveProps(b,S),!u.__e&&null!=u.shouldComponentUpdate&&!1===u.shouldComponentUpdate(b,u.__s,S)||t.__v===r.__v){for(t.__v!==r.__v&&(u.props=b,u.state=u.__s,u.__d=!1),t.__e=r.__e,t.__k=r.__k,t.__k.forEach((function(e){e&&(e.__=t)})),A=0;A<u._sb.length;A++)u.__h.push(u._sb[A]);u._sb=[],u.__h.length&&a.push(u);break e}null!=u.componentWillUpdate&&u.componentWillUpdate(b,u.__s,S),null!=u.componentDidUpdate&&u.__h.push((function(){u.componentDidUpdate(g,p,m)}))}if(u.context=S,u.props=b,u.__P=e,w=n.__r,C=0,"prototype"in _&&_.prototype.render){for(u.state=u.__s,u.__d=!1,w&&w(t),d=u.render(u.props,u.state,u.context),R=0;R<u._sb.length;R++)u.__h.push(u._sb[R]);u._sb=[]}else do{u.__d=!1,w&&w(t),d=u.render(u.props,u.state,u.context),u.state=u.__s}while(u.__d&&++C<25);u.state=u.__s,null!=u.getChildContext&&(i=f(f({},i),u.getChildContext())),h||null==u.getSnapshotBeforeUpdate||(m=u.getSnapshotBeforeUpdate(g,p)),x=null!=d&&d.type===y&&null==d.key?d.props.children:d,T(e,Array.isArray(x)?x:[x],t,r,i,s,o,a,l,c),u.base=t.__e,t.__h=null,u.__h.length&&a.push(u),v&&(u.__E=u.__=null),u.__e=!1}else null==o&&t.__v===r.__v?(t.__k=r.__k,t.__e=r.__e):t.__e=H(r.__e,t,r,i,s,o,a,c);(d=n.diffed)&&d(t)}catch(e){t.__v=null,(c||null!=o)&&(t.__e=l,t.__h=!!c,o[o.indexOf(l)]=null),n.__e(e,t,r)}}function P(e,t){n.__c&&n.__c(t,e),e.some((function(t){try{e=t.__h,t.__h=[],e.some((function(e){e.call(t)}))}catch(e){n.__e(e,t.__v)}}))}function H(e,n,r,i,s,o,a,l){var c,u,h,f=r.props,p=n.props,m=n.type,v=0;if("svg"===m&&(s=!0),null!=o)for(;v<o.length;v++)if((c=o[v])&&"setAttribute"in c==!!m&&(m?c.localName===m:3===c.nodeType)){e=c,o[v]=null;break}if(null==e){if(null===m)return document.createTextNode(p);e=s?document.createElementNS("http://www.w3.org/2000/svg",m):document.createElement(m,p.is&&p),o=null,l=!1}if(null===m)f===p||l&&e.data===p||(e.data=p);else{if(o=o&&t.call(e.childNodes),u=(f=r.props||d).dangerouslySetInnerHTML,h=p.dangerouslySetInnerHTML,!l){if(null!=o)for(f={},v=0;v<e.attributes.length;v++)f[e.attributes[v].name]=e.attributes[v].value;(h||u)&&(h&&(u&&h.__html==u.__html||h.__html===e.innerHTML)||(e.innerHTML=h&&h.__html||""))}if(function(e,t,n,r,i){var s;for(s in n)"children"===s||"key"===s||s in t||E(e,s,null,n[s],r);for(s in t)i&&"function"!=typeof t[s]||"children"===s||"key"===s||"value"===s||"checked"===s||n[s]===t[s]||E(e,s,t[s],n[s],r)}(e,p,f,s,l),h)n.__k=[];else if(v=n.props.children,T(e,Array.isArray(v)?v:[v],n,r,i,s&&"foreignObject"!==m,o,a,o?o[0]:r.__k&&w(r,0),l),null!=o)for(v=o.length;v--;)null!=o[v]&&g(o[v]);l||("value"in p&&void 0!==(v=p.value)&&(v!==e.value||"progress"===m&&!v||"option"===m&&v!==f.value)&&E(e,"value",v,f.value,!1),"checked"in p&&void 0!==(v=p.checked)&&v!==e.checked&&E(e,"checked",v,f.checked,!1))}return e}function B(e,t,r){try{"function"==typeof e?e(t):e.current=t}catch(e){n.__e(e,r)}}function j(e,t,r){var i,s;if(n.unmount&&n.unmount(e),(i=e.ref)&&(i.current&&i.current!==e.__e||B(i,null,t)),null!=(i=e.__c)){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(e){n.__e(e,t)}i.base=i.__P=null,e.__c=void 0}if(i=e.__k)for(s=0;s<i.length;s++)i[s]&&j(i[s],t,r||"function"!=typeof e.type);r||null==e.__e||g(e.__e),e.__=e.__e=e.__d=void 0}function z(e,t,n){return this.constructor(e,n)}function U(e,r,i){var s,o,a;n.__&&n.__(e,r),o=(s="function"==typeof i)?null:i&&i.__k||r.__k,a=[],N(r,e=(!s&&i||r).__k=p(y,null,[e]),o||d,d,void 0!==r.ownerSVGElement,!s&&i?[i]:o?null:r.firstChild?t.call(r.childNodes):null,a,!s&&i?i:o?o.__e:r.firstChild,s),P(a,e)}t=u.slice,n={__e:function(e,t,n,r){for(var i,s,o;t=t.__;)if((i=t.__c)&&!i.__)try{if((s=i.constructor)&&null!=s.getDerivedStateFromError&&(i.setState(s.getDerivedStateFromError(e)),o=i.__d),null!=i.componentDidCatch&&(i.componentDidCatch(e,r||{}),o=i.__d),o)return i.__E=i}catch(t){e=t}throw e}},r=0,i=function(e){return null!=e&&void 0===e.constructor},s=!1,D.prototype.setState=function(e,t){var n;n=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=f({},this.state),"function"==typeof e&&(e=e(f({},n),this.props)),e&&f(n,e),null!=e&&this.__v&&(t&&this._sb.push(t),x(this))},D.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),x(this))},D.prototype.render=y,o=[],l="function"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,_.__r=0,c=0;var W,L,F,V=[],G=[],Q=n.__b,q=n.__r,Y=n.diffed,Z=n.__c,X=n.unmount;function $(){for(var e;e=V.shift();)if(e.__P&&e.__H)try{e.__H.__h.forEach(ee),e.__H.__h.forEach(te),e.__H.__h=[]}catch(t){e.__H.__h=[],n.__e(t,e.__v)}}n.__b=function(e){W=null,Q&&Q(e)},n.__r=function(e){q&&q(e);var t=(W=e.__c).__H;t&&(L===W?(t.__h=[],W.__h=[],t.__.forEach((function(e){e.__N&&(e.__=e.__N),e.__V=G,e.__N=e.i=void 0}))):(t.__h.forEach(ee),t.__h.forEach(te),t.__h=[])),L=W},n.diffed=function(e){Y&&Y(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(1!==V.push(t)&&F===n.requestAnimationFrame||((F=n.requestAnimationFrame)||K)($)),t.__H.__.forEach((function(e){e.i&&(e.__H=e.i),e.__V!==G&&(e.__=e.__V),e.i=void 0,e.__V=G}))),L=W=null},n.__c=function(e,t){t.some((function(e){try{e.__h.forEach(ee),e.__h=e.__h.filter((function(e){return!e.__||te(e)}))}catch(r){t.some((function(e){e.__h&&(e.__h=[])})),t=[],n.__e(r,e.__v)}})),Z&&Z(e,t)},n.unmount=function(e){X&&X(e);var t,r=e.__c;r&&r.__H&&(r.__H.__.forEach((function(e){try{ee(e)}catch(e){t=e}})),r.__H=void 0,t&&n.__e(t,r.__v))};var J="function"==typeof requestAnimationFrame;function K(e){var t,n=function(){clearTimeout(r),J&&cancelAnimationFrame(t),setTimeout(e)},r=setTimeout(n,100);J&&(t=requestAnimationFrame(n))}function ee(e){var t=W,n=e.__c;"function"==typeof n&&(e.__c=void 0,n()),W=t}function te(e){var t=W;e.__c=e.__(),W=t}function ne(e,t){for(var n in e)if("__source"!==n&&!(n in t))return!0;for(var r in t)if("__source"!==r&&e[r]!==t[r])return!0;return!1}function re(e){this.props=e}(re.prototype=new D).isPureReactComponent=!0,re.prototype.shouldComponentUpdate=function(e,t){return ne(this.props,e)||ne(this.state,t)};var ie=n.__b;n.__b=function(e){e.type&&e.type.__f&&e.ref&&(e.props.ref=e.ref,e.ref=null),ie&&ie(e)};var se=n.__e;n.__e=function(e,t,n,r){if(e.then)for(var i,s=t;s=s.__;)if((i=s.__c)&&i.__c)return null==t.__e&&(t.__e=n.__e,t.__k=n.__k),i.__c(e,t);se(e,t,n,r)};var oe=n.unmount;function ae(){this.__u=0,this.t=null,this.__b=null}function le(e){var t=e.__.__c;return t&&t.__a&&t.__a(e)}function ce(){this.u=null,this.o=null}n.unmount=function(e){var t=e.__c;t&&t.__R&&t.__R(),t&&!0===e.__h&&(e.type=null),oe&&oe(e)},(ae.prototype=new D).__c=function(e,t){var n=t.__c,r=this;null==r.t&&(r.t=[]),r.t.push(n);var i=le(r.__v),s=!1,o=function(){s||(s=!0,n.__R=null,i?i(a):a())};n.__R=o;var a=function(){if(!--r.__u){if(r.state.__a){var e=r.state.__a;r.__v.__k[0]=function e(t,n,r){return t&&(t.__v=null,t.__k=t.__k&&t.__k.map((function(t){return e(t,n,r)})),t.__c&&t.__c.__P===n&&(t.__e&&r.insertBefore(t.__e,t.__d),t.__c.__e=!0,t.__c.__P=r)),t}(e,e.__c.__P,e.__c.__O)}var t;for(r.setState({__a:r.__b=null});t=r.t.pop();)t.forceUpdate()}},l=!0===t.__h;r.__u++||l||r.setState({__a:r.__b=r.__v.__k[0]}),e.then(o,o)},ae.prototype.componentWillUnmount=function(){this.t=[]},ae.prototype.render=function(e,t){if(this.__b){if(this.__v.__k){var n=document.createElement("div"),r=this.__v.__k[0].__c;this.__v.__k[0]=function e(t,n,r){return t&&(t.__c&&t.__c.__H&&(t.__c.__H.__.forEach((function(e){"function"==typeof e.__c&&e.__c()})),t.__c.__H=null),null!=(t=function(e,t){for(var n in t)e[n]=t[n];return e}({},t)).__c&&(t.__c.__P===r&&(t.__c.__P=n),t.__c=null),t.__k=t.__k&&t.__k.map((function(t){return e(t,n,r)}))),t}(this.__b,n,r.__O=r.__P)}this.__b=null}var i=t.__a&&p(y,null,e.fallback);return i&&(i.__h=null),[p(y,null,t.__a?null:e.children),i]};var de=function(e,t,n){if(++n[1]===n[0]&&e.o.delete(t),e.props.revealOrder&&("t"!==e.props.revealOrder[0]||!e.o.size))for(n=e.u;n;){for(;n.length>3;)n.pop()();if(n[1]<n[0])break;e.u=n=n[2]}};function ue(e){return this.getChildContext=function(){return e.context},e.children}function he(e){var t=this,n=e.i;t.componentWillUnmount=function(){U(null,t.l),t.l=null,t.i=null},t.i&&t.i!==n&&t.componentWillUnmount(),e.__v?(t.l||(t.i=n,t.l={nodeType:1,parentNode:n,childNodes:[],appendChild:function(e){this.childNodes.push(e),t.i.appendChild(e)},insertBefore:function(e,n){this.childNodes.push(e),t.i.appendChild(e)},removeChild:function(e){this.childNodes.splice(this.childNodes.indexOf(e)>>>1,1),t.i.removeChild(e)}}),U(p(ue,{context:t.context},e.__v),t.l)):t.l&&t.componentWillUnmount()}function fe(e,t){var n=p(he,{__v:e,i:t});return n.containerInfo=t,n}(ce.prototype=new D).__a=function(e){var t=this,n=le(t.__v),r=t.o.get(e);return r[0]++,function(i){var s=function(){t.props.revealOrder?(r.push(i),de(t,e,r)):i()};n?n(s):s()}},ce.prototype.render=function(e){this.u=null,this.o=new Map;var t=M(e.children);e.revealOrder&&"b"===e.revealOrder[0]&&t.reverse();for(var n=t.length;n--;)this.o.set(t[n],this.u=[1,0,this.u]);return e.children},ce.prototype.componentDidUpdate=ce.prototype.componentDidMount=function(){var e=this;this.o.forEach((function(t,n){de(e,n,t)}))};var ge="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,pe=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,me="undefined"!=typeof document,ve=function(e){return("undefined"!=typeof Symbol&&"symbol"==typeof Symbol()?/fil|che|rad/i:/fil|che|ra/i).test(e)};D.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach((function(e){Object.defineProperty(D.prototype,e,{configurable:!0,get:function(){return this["UNSAFE_"+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})}));var ye=n.event;function be(){}function Ee(){return this.cancelBubble}function Se(){return this.defaultPrevented}n.event=function(e){return ye&&(e=ye(e)),e.persist=be,e.isPropagationStopped=Ee,e.isDefaultPrevented=Se,e.nativeEvent=e};var Ae={configurable:!0,get:function(){return this.class}},De=n.vnode;n.vnode=function(e){var t=e.type,n=e.props,r=n;if("string"==typeof t){var i=-1===t.indexOf("-");for(var s in r={},n){var o=n[s];me&&"children"===s&&"noscript"===t||"value"===s&&"defaultValue"in n&&null==o||("defaultValue"===s&&"value"in n&&null==n.value?s="value":"download"===s&&!0===o?o="":/ondoubleclick/i.test(s)?s="ondblclick":/^onchange(textarea|input)/i.test(s+t)&&!ve(n.type)?s="oninput":/^onfocus$/i.test(s)?s="onfocusin":/^onblur$/i.test(s)?s="onfocusout":/^on(Ani|Tra|Tou|BeforeInp|Compo)/.test(s)?s=s.toLowerCase():i&&pe.test(s)?s=s.replace(/[A-Z0-9]/g,"-$&").toLowerCase():null===o&&(o=void 0),/^oninput$/i.test(s)&&(s=s.toLowerCase(),r[s]&&(s="oninputCapture")),r[s]=o)}"select"==t&&r.multiple&&Array.isArray(r.value)&&(r.value=M(n.children).forEach((function(e){e.props.selected=-1!=r.value.indexOf(e.props.value)}))),"select"==t&&null!=r.defaultValue&&(r.value=M(n.children).forEach((function(e){e.props.selected=r.multiple?-1!=r.defaultValue.indexOf(e.props.value):r.defaultValue==e.props.value}))),e.props=r,n.class!=n.className&&(Ae.enumerable="className"in n,null!=n.className&&(r.class=n.className),Object.defineProperty(r,"className",Ae))}e.$$typeof=ge,De&&De(e)};var we=n.__r;n.__r=function(e){we&&we(e),e.__c};const Ce=[],Re=new Map;function xe(e){Ce.push(e),Re.forEach(t=>{Te(t,e)})}function _e(e){let t=Re.get(e);if(!t||!t.isConnected){if(t=e.querySelector("style[data-fullcalendar]"),!t){t=document.createElement("style"),t.setAttribute("data-fullcalendar","");const n=function(){void 0===ke&&(ke=function(){const e=document.querySelector('meta[name="csp-nonce"]');if(e&&e.hasAttribute("content"))return e.getAttribute("content");const t=document.querySelector("script[nonce]");if(t)return t.nonce||"";return""}());return ke}();n&&(t.nonce=n);const r=e===document?document.head:e,i=e===document?r.querySelector("script,link[rel=stylesheet],link[as=style],style"):r.firstChild;r.insertBefore(t,i)}Re.set(e,t),function(e){for(const t of Ce)Te(e,t)}(t)}}function Te(e,t){const{sheet:n}=e,r=n.cssRules.length;t.split("}").forEach((e,t)=>{(e=e.trim())&&n.insertRule(e+"}",r+t)})}let ke;"undefined"!=typeof document&&_e(document);xe(':root{--fc-small-font-size:.85em;--fc-page-bg-color:#fff;--fc-neutral-bg-color:hsla(0,0%,82%,.3);--fc-neutral-text-color:grey;--fc-border-color:#ddd;--fc-button-text-color:#fff;--fc-button-bg-color:#2c3e50;--fc-button-border-color:#2c3e50;--fc-button-hover-bg-color:#1e2b37;--fc-button-hover-border-color:#1a252f;--fc-button-active-bg-color:#1a252f;--fc-button-active-border-color:#151e27;--fc-event-bg-color:#3788d8;--fc-event-border-color:#3788d8;--fc-event-text-color:#fff;--fc-event-selected-overlay-color:rgba(0,0,0,.25);--fc-more-link-bg-color:#d0d0d0;--fc-more-link-text-color:inherit;--fc-event-resizer-thickness:8px;--fc-event-resizer-dot-total-width:8px;--fc-event-resizer-dot-border-width:1px;--fc-non-business-color:hsla(0,0%,84%,.3);--fc-bg-event-color:#8fdf82;--fc-bg-event-opacity:0.3;--fc-highlight-color:rgba(188,232,241,.3);--fc-today-bg-color:rgba(255,220,40,.15);--fc-now-indicator-color:red}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc{display:flex;flex-direction:column;font-size:1em}.fc,.fc *,.fc :after,.fc :before{box-sizing:border-box}.fc table{border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{padding:0;vertical-align:top}.fc a[data-navlink]{cursor:pointer}.fc a[data-navlink]:hover{text-decoration:underline}.fc-direction-ltr{direction:ltr;text-align:left}.fc-direction-rtl{direction:rtl;text-align:right}.fc-theme-standard td,.fc-theme-standard th{border:1px solid var(--fc-border-color)}.fc-liquid-hack td,.fc-liquid-hack th{position:relative}@font-face{font-family:fcicons;font-style:normal;font-weight:400;src:url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") format("truetype")}.fc-icon{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;font-family:fcicons!important;font-style:normal;font-variant:normal;font-weight:400;height:1em;line-height:1;text-align:center;text-transform:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:1em}.fc-icon-chevron-left:before{content:"\\e900"}.fc-icon-chevron-right:before{content:"\\e901"}.fc-icon-chevrons-left:before{content:"\\e902"}.fc-icon-chevrons-right:before{content:"\\e903"}.fc-icon-minus-square:before{content:"\\e904"}.fc-icon-plus-square:before{content:"\\e905"}.fc-icon-x:before{content:"\\e906"}.fc .fc-button{border-radius:0;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible;text-transform:none}.fc .fc-button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.fc .fc-button{-webkit-appearance:button}.fc .fc-button:not(:disabled){cursor:pointer}.fc .fc-button{background-color:transparent;border:1px solid transparent;border-radius:.25em;display:inline-block;font-size:1em;font-weight:400;line-height:1.5;padding:.4em .65em;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle}.fc .fc-button:hover{text-decoration:none}.fc .fc-button:focus{box-shadow:0 0 0 .2rem rgba(44,62,80,.25);outline:0}.fc .fc-button:disabled{opacity:.65}.fc .fc-button-primary{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:hover{background-color:var(--fc-button-hover-bg-color);border-color:var(--fc-button-hover-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:disabled{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button-primary:not(:disabled).fc-button-active,.fc .fc-button-primary:not(:disabled):active{background-color:var(--fc-button-active-bg-color);border-color:var(--fc-button-active-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:not(:disabled).fc-button-active:focus,.fc .fc-button-primary:not(:disabled):active:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button .fc-icon{font-size:1.5em;vertical-align:middle}.fc .fc-button-group{display:inline-flex;position:relative;vertical-align:middle}.fc .fc-button-group>.fc-button{flex:1 1 auto;position:relative}.fc .fc-button-group>.fc-button.fc-button-active,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:hover{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-1px}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-bottom-left-radius:0;border-top-left-radius:0}.fc .fc-toolbar{align-items:center;display:flex;justify-content:space-between}.fc .fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.75em;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-scroller-harness{direction:ltr;overflow:hidden;position:relative}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid var(--fc-border-color)}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{table-layout:fixed;width:100%}.fc .fc-scrollgrid table{border-left-style:hidden;border-right-style:hidden;border-top-style:hidden}.fc .fc-scrollgrid{border-bottom-width:0;border-collapse:separate;border-right-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section,.fc .fc-scrollgrid-section table,.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-left-width:0;border-top-width:0}.fc .fc-scrollgrid-section-footer>*,.fc .fc-scrollgrid-section-header>*{border-bottom-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:var(--fc-page-bg-color);position:sticky;z-index:3}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-view-harness-active>.fc-view{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-bg-event,.fc .fc-highlight,.fc .fc-non-business{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-non-business{background:var(--fc-non-business-color)}.fc .fc-bg-event{background:var(--fc-bg-event-color);opacity:var(--fc-bg-event-opacity)}.fc .fc-bg-event .fc-event-title{font-size:var(--fc-small-font-size);font-style:italic;margin:.5em}.fc .fc-highlight{background:var(--fc-highlight-color)}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:var(--fc-neutral-bg-color)}a.fc-event,a.fc-event:hover{text-decoration:none}.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event-selected .fc-event-resizer,.fc-event:hover .fc-event-resizer{display:block}.fc-event-selected .fc-event-resizer{background:var(--fc-page-bg-color);border-color:inherit;border-radius:calc(var(--fc-event-resizer-dot-total-width)/2);border-style:solid;border-width:var(--fc-event-resizer-dot-border-width);height:var(--fc-event-resizer-dot-total-width);width:var(--fc-event-resizer-dot-total-width)}.fc-event-selected .fc-event-resizer:before{bottom:-20px;content:"";left:-20px;position:absolute;right:-20px;top:-20px}.fc-event-selected,.fc-event:focus{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before,.fc-event:focus:before{bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:3}.fc-event-selected:after,.fc-event:focus:after{background:var(--fc-event-selected-overlay-color);bottom:-1px;content:"";left:-1px;position:absolute;right:-1px;top:-1px;z-index:1}.fc-h-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-h-event .fc-event-main{color:var(--fc-event-text-color)}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;left:0;max-width:100%;overflow:hidden;right:0;vertical-align:top}.fc-h-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-bottom-left-radius:0;border-left-width:0;border-top-left-radius:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-bottom-right-radius:0;border-right-width:0;border-top-right-radius:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{bottom:0;top:0;width:var(--fc-event-resizer-thickness)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start{cursor:e-resize;right:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-h-event.fc-event-selected .fc-event-resizer{margin-top:calc(var(--fc-event-resizer-dot-total-width)*-.5);top:50%}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end{left:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start{right:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc .fc-popover{box-shadow:0 2px 6px rgba(0,0,0,.15);position:absolute;z-index:9999}.fc .fc-popover-header{align-items:center;display:flex;flex-direction:row;justify-content:space-between;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;font-size:1.1em;opacity:.65}.fc-theme-standard .fc-popover{background:var(--fc-page-bg-color);border:1px solid var(--fc-border-color)}.fc-theme-standard .fc-popover-header{background:var(--fc-neutral-bg-color)}');class Me{constructor(e){this.drainedOption=e,this.isRunning=!1,this.isDirty=!1,this.pauseDepths={},this.timeoutId=0}request(e){this.isDirty=!0,this.isPaused()||(this.clearTimeout(),null==e?this.tryDrain():this.timeoutId=setTimeout(this.tryDrain.bind(this),e))}pause(e=""){let{pauseDepths:t}=this;t[e]=(t[e]||0)+1,this.clearTimeout()}resume(e="",t){let{pauseDepths:n}=this;if(e in n){if(t)delete n[e];else{n[e]-=1,n[e]<=0&&delete n[e]}this.tryDrain()}}isPaused(){return Object.keys(this.pauseDepths).length}tryDrain(){if(!this.isRunning&&!this.isPaused()){for(this.isRunning=!0;this.isDirty;)this.isDirty=!1,this.drained();this.isRunning=!1}}clear(){this.clearTimeout(),this.isDirty=!1,this.pauseDepths={}}clearTimeout(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=0)}drained(){this.drainedOption&&this.drainedOption()}}function Ie(e){e.parentNode&&e.parentNode.removeChild(e)}function Oe(e,t){if(e.closest)return e.closest(t);if(!document.documentElement.contains(e))return null;do{if(Ne(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}function Ne(e,t){return(e.matches||e.matchesSelector||e.msMatchesSelector).call(e,t)}function Pe(e,t){let n=e instanceof HTMLElement?[e]:e,r=[];for(let e=0;e<n.length;e+=1){let i=n[e].querySelectorAll(t);for(let e=0;e<i.length;e+=1)r.push(i[e])}return r}const He=/(top|left|right|bottom|width|height)$/i;function Be(e,t){for(let n in t)je(e,n,t[n])}function je(e,t,n){null==n?e.style[t]="":"number"==typeof n&&He.test(t)?e.style[t]=n+"px":e.style[t]=n}function ze(e){var t,n;return null!==(n=null===(t=e.composedPath)||void 0===t?void 0:t.call(e)[0])&&void 0!==n?n:e.target}let Ue=0;function We(){return Ue+=1,"fc-dom-"+Ue}function Le(e){e.preventDefault()}function Fe(e,t,n,r){let i=function(e,t){return n=>{let r=Oe(n.target,e);r&&t.call(r,n,r)}}(n,r);return e.addEventListener(t,i),()=>{e.removeEventListener(t,i)}}const Ve=["webkitTransitionEnd","otransitionend","oTransitionEnd","msTransitionEnd","transitionend"];function Ge(e,t){let n=r=>{t(r),Ve.forEach(t=>{e.removeEventListener(t,n)})};Ve.forEach(t=>{e.addEventListener(t,n)})}function Qe(e){return Object.assign({onClick:e},qe(e))}function qe(e){return{tabIndex:0,onKeyDown(t){"Enter"!==t.key&&" "!==t.key||(e(t),t.preventDefault())}}}let Ye=0;function Ze(){return Ye+=1,String(Ye)}function Xe(){document.body.classList.add("fc-not-allowed")}function $e(){document.body.classList.remove("fc-not-allowed")}function Je(e){e.style.userSelect="none",e.style.webkitUserSelect="none",e.addEventListener("selectstart",Le)}function Ke(e){e.style.userSelect="",e.style.webkitUserSelect="",e.removeEventListener("selectstart",Le)}function et(e){e.addEventListener("contextmenu",Le)}function tt(e){e.removeEventListener("contextmenu",Le)}function nt(e){let t,n,r=[],i=[];for("string"==typeof e?i=e.split(/\s*,\s*/):"function"==typeof e?i=[e]:Array.isArray(e)&&(i=e),t=0;t<i.length;t+=1)n=i[t],"string"==typeof n?r.push("-"===n.charAt(0)?{field:n.substring(1),order:-1}:{field:n,order:1}):"function"==typeof n&&r.push({func:n});return r}function rt(e,t,n){let r,i;for(r=0;r<n.length;r+=1)if(i=it(e,t,n[r]),i)return i;return 0}function it(e,t,n){return n.func?n.func(e,t):st(e[n.field],t[n.field])*(n.order||1)}function st(e,t){return e||t?null==t?-1:null==e?1:"string"==typeof e||"string"==typeof t?String(e).localeCompare(String(t)):e-t:0}function ot(e,t){let n=String(e);return"000".substr(0,t-n.length)+n}function at(e,t,n){return"function"==typeof e?e(...t):"string"==typeof e?t.reduce((e,t,n)=>e.replace("$"+n,t||""),e):n}function lt(e,t){return e-t}function ct(e){return e%1==0}function dt(e){let t=e.querySelector(".fc-scrollgrid-shrink-frame"),n=e.querySelector(".fc-scrollgrid-shrink-cushion");if(!t)throw new Error("needs fc-scrollgrid-shrink-frame className");if(!n)throw new Error("needs fc-scrollgrid-shrink-cushion className");return e.getBoundingClientRect().width-t.getBoundingClientRect().width+n.getBoundingClientRect().width}const ut=["years","months","days","milliseconds"],ht=/^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;function ft(e,t){return"string"==typeof e?function(e){let t=ht.exec(e);if(t){let e=t[1]?-1:1;return{years:0,months:0,days:e*(t[2]?parseInt(t[2],10):0),milliseconds:e*(60*(t[3]?parseInt(t[3],10):0)*60*1e3+60*(t[4]?parseInt(t[4],10):0)*1e3+1e3*(t[5]?parseInt(t[5],10):0)+(t[6]?parseInt(t[6],10):0))}}return null}(e):"object"==typeof e&&e?gt(e):"number"==typeof e?gt({[t||"milliseconds"]:e}):null}function gt(e){let t={years:e.years||e.year||0,months:e.months||e.month||0,days:e.days||e.day||0,milliseconds:60*(e.hours||e.hour||0)*60*1e3+60*(e.minutes||e.minute||0)*1e3+1e3*(e.seconds||e.second||0)+(e.milliseconds||e.millisecond||e.ms||0)},n=e.weeks||e.week;return n&&(t.days+=7*n,t.specifiedWeeks=!0),t}function pt(e,t){return{years:e.years+t.years,months:e.months+t.months,days:e.days+t.days,milliseconds:e.milliseconds+t.milliseconds}}function mt(e,t){return{years:e.years*t,months:e.months*t,days:e.days*t,milliseconds:e.milliseconds*t}}function vt(e){return yt(e)/864e5}function yt(e){return 31536e6*e.years+2592e6*e.months+864e5*e.days+e.milliseconds}function bt(e,t){let n=null;for(let r=0;r<ut.length;r+=1){let i=ut[r];if(t[i]){let r=e[i]/t[i];if(!ct(r)||null!==n&&n!==r)return null;n=r}else if(e[i])return null}return n}function Et(e){let t=e.milliseconds;if(t){if(t%1e3!=0)return{unit:"millisecond",value:t};if(t%6e4!=0)return{unit:"second",value:t/1e3};if(t%36e5!=0)return{unit:"minute",value:t/6e4};if(t)return{unit:"hour",value:t/36e5}}return e.days?e.specifiedWeeks&&e.days%7==0?{unit:"week",value:e.days/7}:{unit:"day",value:e.days}:e.months?{unit:"month",value:e.months}:e.years?{unit:"year",value:e.years}:{unit:"millisecond",value:0}}function St(e,t,n){if(e===t)return!0;let r,i=e.length;if(i!==t.length)return!1;for(r=0;r<i;r+=1)if(!(n?n(e[r],t[r]):e[r]===t[r]))return!1;return!0}const At=["sun","mon","tue","wed","thu","fri","sat"];function Dt(e,t){let n=Ht(e);return n[2]+=7*t,Bt(n)}function wt(e,t){let n=Ht(e);return n[2]+=t,Bt(n)}function Ct(e,t){let n=Ht(e);return n[6]+=t,Bt(n)}function Rt(e,t){return xt(e,t)/7}function xt(e,t){return(t.valueOf()-e.valueOf())/864e5}function _t(e,t){let n=Mt(e),r=Mt(t);return{years:0,months:0,days:Math.round(xt(n,r)),milliseconds:t.valueOf()-r.valueOf()-(e.valueOf()-n.valueOf())}}function Tt(e,t){let n=kt(e,t);return null!==n&&n%7==0?n/7:null}function kt(e,t){return zt(e)===zt(t)?Math.round(xt(e,t)):null}function Mt(e){return Bt([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()])}function It(e,t,n,r){let i=Bt([t,0,1+Ot(t,n,r)]),s=Mt(e),o=Math.round(xt(i,s));return Math.floor(o/7)+1}function Ot(e,t,n){let r=7+t-n;return-((7+Bt([e,0,r]).getUTCDay()-t)%7)+r-1}function Nt(e){return[e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()]}function Pt(e){return new Date(e[0],e[1]||0,null==e[2]?1:e[2],e[3]||0,e[4]||0,e[5]||0)}function Ht(e){return[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()]}function Bt(e){return 1===e.length&&(e=e.concat([0])),new Date(Date.UTC(...e))}function jt(e){return!isNaN(e.valueOf())}function zt(e){return 1e3*e.getUTCHours()*60*60+1e3*e.getUTCMinutes()*60+1e3*e.getUTCSeconds()+e.getUTCMilliseconds()}function Ut(e,t,n=!1){let r=e.toISOString();return r=r.replace(".000",""),n&&(r=r.replace("T00:00:00Z","")),r.length>10&&(null==t?r=r.replace("Z",""):0!==t&&(r=r.replace("Z",Vt(t,!0)))),r}function Wt(e){return e.toISOString().replace(/T.*$/,"")}function Lt(e){return e.toISOString().match(/^\d{4}-\d{2}/)[0]}function Ft(e){return ot(e.getUTCHours(),2)+":"+ot(e.getUTCMinutes(),2)+":"+ot(e.getUTCSeconds(),2)}function Vt(e,t=!1){let n=e<0?"-":"+",r=Math.abs(e),i=Math.floor(r/60),s=Math.round(r%60);return t?`${n+ot(i,2)}:${ot(s,2)}`:`GMT${n}${i}${s?":"+ot(s,2):""}`}function Gt(e,t,n){let r,i;return function(...s){if(r){if(!St(r,s)){n&&n(i);let r=e.apply(this,s);t&&t(r,i)||(i=r)}}else i=e.apply(this,s);return r=s,i}}function Qt(e,t,n){let r,i;return s=>{if(r){if(!Cn(r,s)){n&&n(i);let r=e.call(this,s);t&&t(r,i)||(i=r)}}else i=e.call(this,s);return r=s,i}}const qt={week:3,separator:0,omitZeroMinute:0,meridiem:0,omitCommas:0},Yt={timeZoneName:7,era:6,year:5,month:4,day:2,weekday:2,hour:1,minute:1,second:1},Zt=/\s*([ap])\.?m\.?/i,Xt=/,/g,$t=/\s+/g,Jt=/\u200e/g,Kt=/UTC|GMT/;class en{constructor(e){let t={},n={},r=0;for(let i in e)i in qt?(n[i]=e[i],r=Math.max(qt[i],r)):(t[i]=e[i],i in Yt&&(r=Math.max(Yt[i],r)));this.standardDateProps=t,this.extendedSettings=n,this.severity=r,this.buildFormattingFunc=Gt(tn)}format(e,t){return this.buildFormattingFunc(this.standardDateProps,this.extendedSettings,t)(e)}formatRange(e,t,n,r){let{standardDateProps:i,extendedSettings:s}=this,o=function(e,t,n){if(n.getMarkerYear(e)!==n.getMarkerYear(t))return 5;if(n.getMarkerMonth(e)!==n.getMarkerMonth(t))return 4;if(n.getMarkerDay(e)!==n.getMarkerDay(t))return 2;if(zt(e)!==zt(t))return 1;return 0}(e.marker,t.marker,n.calendarSystem);if(!o)return this.format(e,n);let a=o;!(a>1)||"numeric"!==i.year&&"2-digit"!==i.year||"numeric"!==i.month&&"2-digit"!==i.month||"numeric"!==i.day&&"2-digit"!==i.day||(a=1);let l=this.format(e,n),c=this.format(t,n);if(l===c)return l;let d=tn(function(e,t){let n={};for(let r in e)(!(r in Yt)||Yt[r]<=t)&&(n[r]=e[r]);return n}(i,a),s,n),u=d(e),h=d(t),f=function(e,t,n,r){let i=0;for(;i<e.length;){let s=e.indexOf(t,i);if(-1===s)break;let o=e.substr(0,s);i=s+t.length;let a=e.substr(i),l=0;for(;l<n.length;){let e=n.indexOf(r,l);if(-1===e)break;let t=n.substr(0,e);l=e+r.length;let i=n.substr(l);if(o===t&&a===i)return{before:o,after:a}}}return null}(l,u,c,h),g=s.separator||r||n.defaultSeparator||"";return f?f.before+u+g+h+f.after:l+g+c}getLargestUnit(){switch(this.severity){case 7:case 6:case 5:return"year";case 4:return"month";case 3:return"week";case 2:return"day";default:return"time"}}}function tn(e,t,n){let r=Object.keys(e).length;return 1===r&&"short"===e.timeZoneName?e=>Vt(e.timeZoneOffset):0===r&&t.week?e=>function(e,t,n,r,i){let s=[];"long"===i?s.push(n):"short"!==i&&"narrow"!==i||s.push(t);"long"!==i&&"short"!==i||s.push(" ");s.push(r.simpleNumberFormat.format(e)),"rtl"===r.options.direction&&s.reverse();return s.join("")}(n.computeWeekNumber(e.marker),n.weekText,n.weekTextLong,n.locale,t.week):function(e,t,n){e=Object.assign({},e),t=Object.assign({},t),function(e,t){e.timeZoneName&&(e.hour||(e.hour="2-digit"),e.minute||(e.minute="2-digit"));"long"===e.timeZoneName&&(e.timeZoneName="short");t.omitZeroMinute&&(e.second||e.millisecond)&&delete t.omitZeroMinute}(e,t),e.timeZone="UTC";let r,i=new Intl.DateTimeFormat(n.locale.codes,e);if(t.omitZeroMinute){let t=Object.assign({},e);delete t.minute,r=new Intl.DateTimeFormat(n.locale.codes,t)}return s=>{let o,{marker:a}=s;return o=r&&!a.getUTCMinutes()?r:i,function(e,t,n,r,i){e=e.replace(Jt,""),"short"===n.timeZoneName&&(e=function(e,t){let n=!1;e=e.replace(Kt,()=>(n=!0,t)),n||(e+=" "+t);return e}(e,"UTC"===i.timeZone||null==t.timeZoneOffset?"UTC":Vt(t.timeZoneOffset)));r.omitCommas&&(e=e.replace(Xt,"").trim());r.omitZeroMinute&&(e=e.replace(":00",""));!1===r.meridiem?e=e.replace(Zt,"").trim():"narrow"===r.meridiem?e=e.replace(Zt,(e,t)=>t.toLocaleLowerCase()):"short"===r.meridiem?e=e.replace(Zt,(e,t)=>t.toLocaleLowerCase()+"m"):"lowercase"===r.meridiem&&(e=e.replace(Zt,e=>e.toLocaleLowerCase()));return e=(e=e.replace($t," ")).trim()}(o.format(a),s,e,t,n)}}(e,t,n)}function nn(e,t){let n=t.markerToArray(e.marker);return{marker:e.marker,timeZoneOffset:e.timeZoneOffset,array:n,year:n[0],month:n[1],day:n[2],hour:n[3],minute:n[4],second:n[5],millisecond:n[6]}}function rn(e,t,n,r){let i=nn(e,n.calendarSystem);return{date:i,start:i,end:t?nn(t,n.calendarSystem):null,timeZone:n.timeZone,localeCodes:n.locale.codes,defaultSeparator:r||n.defaultSeparator}}class sn{constructor(e){this.cmdStr=e}format(e,t,n){return t.cmdFormatter(this.cmdStr,rn(e,null,t,n))}formatRange(e,t,n,r){return n.cmdFormatter(this.cmdStr,rn(e,t,n,r))}}class on{constructor(e){this.func=e}format(e,t,n){return this.func(rn(e,null,t,n))}formatRange(e,t,n,r){return this.func(rn(e,t,n,r))}}function an(e){return"object"==typeof e&&e?new en(e):"string"==typeof e?new sn(e):"function"==typeof e?new on(e):null}const ln={navLinkDayClick:yn,navLinkWeekClick:yn,duration:ft,bootstrapFontAwesome:yn,buttonIcons:yn,customButtons:yn,defaultAllDayEventDuration:ft,defaultTimedEventDuration:ft,nextDayThreshold:ft,scrollTime:ft,scrollTimeReset:Boolean,slotMinTime:ft,slotMaxTime:ft,dayPopoverFormat:an,slotDuration:ft,snapDuration:ft,headerToolbar:yn,footerToolbar:yn,defaultRangeSeparator:String,titleRangeSeparator:String,forceEventDuration:Boolean,dayHeaders:Boolean,dayHeaderFormat:an,dayHeaderClassNames:yn,dayHeaderContent:yn,dayHeaderDidMount:yn,dayHeaderWillUnmount:yn,dayCellClassNames:yn,dayCellContent:yn,dayCellDidMount:yn,dayCellWillUnmount:yn,initialView:String,aspectRatio:Number,weekends:Boolean,weekNumberCalculation:yn,weekNumbers:Boolean,weekNumberClassNames:yn,weekNumberContent:yn,weekNumberDidMount:yn,weekNumberWillUnmount:yn,editable:Boolean,viewClassNames:yn,viewDidMount:yn,viewWillUnmount:yn,nowIndicator:Boolean,nowIndicatorClassNames:yn,nowIndicatorContent:yn,nowIndicatorDidMount:yn,nowIndicatorWillUnmount:yn,showNonCurrentDates:Boolean,lazyFetching:Boolean,startParam:String,endParam:String,timeZoneParam:String,timeZone:String,locales:yn,locale:yn,themeSystem:String,dragRevertDuration:Number,dragScroll:Boolean,allDayMaintainDuration:Boolean,unselectAuto:Boolean,dropAccept:yn,eventOrder:nt,eventOrderStrict:Boolean,handleWindowResize:Boolean,windowResizeDelay:Number,longPressDelay:Number,eventDragMinDistance:Number,expandRows:Boolean,height:yn,contentHeight:yn,direction:String,weekNumberFormat:an,eventResizableFromStart:Boolean,displayEventTime:Boolean,displayEventEnd:Boolean,weekText:String,weekTextLong:String,progressiveEventRendering:Boolean,businessHours:yn,initialDate:yn,now:yn,eventDataTransform:yn,stickyHeaderDates:yn,stickyFooterScrollbar:yn,viewHeight:yn,defaultAllDay:Boolean,eventSourceFailure:yn,eventSourceSuccess:yn,eventDisplay:String,eventStartEditable:Boolean,eventDurationEditable:Boolean,eventOverlap:yn,eventConstraint:yn,eventAllow:yn,eventBackgroundColor:String,eventBorderColor:String,eventTextColor:String,eventColor:String,eventClassNames:yn,eventContent:yn,eventDidMount:yn,eventWillUnmount:yn,selectConstraint:yn,selectOverlap:yn,selectAllow:yn,droppable:Boolean,unselectCancel:String,slotLabelFormat:yn,slotLaneClassNames:yn,slotLaneContent:yn,slotLaneDidMount:yn,slotLaneWillUnmount:yn,slotLabelClassNames:yn,slotLabelContent:yn,slotLabelDidMount:yn,slotLabelWillUnmount:yn,dayMaxEvents:yn,dayMaxEventRows:yn,dayMinWidth:Number,slotLabelInterval:ft,allDayText:String,allDayClassNames:yn,allDayContent:yn,allDayDidMount:yn,allDayWillUnmount:yn,slotMinWidth:Number,navLinks:Boolean,eventTimeFormat:an,rerenderDelay:Number,moreLinkText:yn,moreLinkHint:yn,selectMinDistance:Number,selectable:Boolean,selectLongPressDelay:Number,eventLongPressDelay:Number,selectMirror:Boolean,eventMaxStack:Number,eventMinHeight:Number,eventMinWidth:Number,eventShortHeight:Number,slotEventOverlap:Boolean,plugins:yn,firstDay:Number,dayCount:Number,dateAlignment:String,dateIncrement:ft,hiddenDays:yn,fixedWeekCount:Boolean,validRange:yn,visibleRange:yn,titleFormat:yn,eventInteractive:Boolean,noEventsText:String,viewHint:yn,navLinkHint:yn,closeHint:String,timeHint:String,eventHint:String,moreLinkClick:yn,moreLinkClassNames:yn,moreLinkContent:yn,moreLinkDidMount:yn,moreLinkWillUnmount:yn,monthStartFormat:an,handleCustomRendering:yn,customRenderingMetaMap:yn,customRenderingReplaces:Boolean},cn={eventDisplay:"auto",defaultRangeSeparator:" - ",titleRangeSeparator:" â ",defaultTimedEventDuration:"01:00:00",defaultAllDayEventDuration:{day:1},forceEventDuration:!1,nextDayThreshold:"00:00:00",dayHeaders:!0,initialView:"",aspectRatio:1.35,headerToolbar:{start:"title",center:"",end:"today prev,next"},weekends:!0,weekNumbers:!1,weekNumberCalculation:"local",editable:!1,nowIndicator:!1,scrollTime:"06:00:00",scrollTimeReset:!0,slotMinTime:"00:00:00",slotMaxTime:"24:00:00",showNonCurrentDates:!0,lazyFetching:!0,startParam:"start",endParam:"end",timeZoneParam:"timeZone",timeZone:"local",locales:[],locale:"",themeSystem:"standard",dragRevertDuration:500,dragScroll:!0,allDayMaintainDuration:!1,unselectAuto:!0,dropAccept:"*",eventOrder:"start,-duration,allDay,title",dayPopoverFormat:{month:"long",day:"numeric",year:"numeric"},handleWindowResize:!0,windowResizeDelay:100,longPressDelay:1e3,eventDragMinDistance:5,expandRows:!1,navLinks:!1,selectable:!1,eventMinHeight:15,eventMinWidth:30,eventShortHeight:30,monthStartFormat:{month:"long",day:"numeric"}},dn={datesSet:yn,eventsSet:yn,eventAdd:yn,eventChange:yn,eventRemove:yn,windowResize:yn,eventClick:yn,eventMouseEnter:yn,eventMouseLeave:yn,select:yn,unselect:yn,loading:yn,_unmount:yn,_beforeprint:yn,_afterprint:yn,_noEventDrop:yn,_noEventResize:yn,_resize:yn,_scrollRequest:yn},un={buttonText:yn,buttonHints:yn,views:yn,plugins:yn,initialEvents:yn,events:yn,eventSources:yn},hn={headerToolbar:fn,footerToolbar:fn,buttonText:fn,buttonHints:fn,buttonIcons:fn,dateIncrement:fn,plugins:gn,events:gn,eventSources:gn,resources:gn};function fn(e,t){return"object"==typeof e&&"object"==typeof t&&e&&t?Cn(e,t):e===t}function gn(e,t){return Array.isArray(e)&&Array.isArray(t)?St(e,t):e===t}const pn={type:String,component:yn,buttonText:String,buttonTextKey:String,dateProfileGeneratorClass:yn,usesMinMaxTime:Boolean,classNames:yn,content:yn,didMount:yn,willUnmount:yn};function mn(e){return En(e,hn)}function vn(e,t){let n={},r={};for(let r in t)r in e&&(n[r]=t[r](e[r]));for(let n in e)n in t||(r[n]=e[n]);return{refined:n,extra:r}}function yn(e){return e}const{hasOwnProperty:bn}=Object.prototype;function En(e,t){let n={};if(t)for(let r in t)if(t[r]===fn){let t=[];for(let i=e.length-1;i>=0;i-=1){let s=e[i][r];if("object"==typeof s&&s)t.unshift(s);else if(void 0!==s){n[r]=s;break}}t.length&&(n[r]=En(t))}for(let t=e.length-1;t>=0;t-=1){let r=e[t];for(let e in r)e in n||(n[e]=r[e])}return n}function Sn(e,t){let n={};for(let r in e)t(e[r],r)&&(n[r]=e[r]);return n}function An(e,t){let n={};for(let r in e)n[r]=t(e[r],r);return n}function Dn(e){let t={};for(let n of e)t[n]=!0;return t}function wn(e){let t=[];for(let n in e)t.push(e[n]);return t}function Cn(e,t){if(e===t)return!0;for(let n in e)if(bn.call(e,n)&&!(n in t))return!1;for(let n in t)if(bn.call(t,n)&&e[n]!==t[n])return!1;return!0}const Rn=/^on[A-Z]/;function xn(e,t){let n=[];for(let r in e)bn.call(e,r)&&(r in t||n.push(r));for(let r in t)bn.call(t,r)&&e[r]!==t[r]&&n.push(r);return n}function _n(e,t,n={}){if(e===t)return!0;for(let r in t)if(!(r in e)||!Tn(e[r],t[r],n[r]))return!1;for(let n in e)if(!(n in t))return!1;return!0}function Tn(e,t,n){return e===t||!0===n||!!n&&n(e,t)}function kn(e,t=0,n,r=1){let i=[];null==n&&(n=Object.keys(e).length);for(let s=t;s<n;s+=r){let t=e[s];void 0!==t&&i.push(t)}return i}let Mn={};var In,On;In="gregory",On=class{getMarkerYear(e){return e.getUTCFullYear()}getMarkerMonth(e){return e.getUTCMonth()}getMarkerDay(e){return e.getUTCDate()}arrayToMarker(e){return Bt(e)}markerToArray(e){return Ht(e)}},Mn[In]=On;const Nn=/^\s*(\d{4})(-?(\d{2})(-?(\d{2})([T ](\d{2}):?(\d{2})(:?(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/;function Pn(e){let t=Nn.exec(e);if(t){let e=new Date(Date.UTC(Number(t[1]),t[3]?Number(t[3])-1:0,Number(t[5]||1),Number(t[7]||0),Number(t[8]||0),Number(t[10]||0),t[12]?1e3*Number("0."+t[12]):0));if(jt(e)){let n=null;return t[13]&&(n=("-"===t[15]?-1:1)*(60*Number(t[16]||0)+Number(t[18]||0))),{marker:e,isTimeUnspecified:!t[6],timeZoneOffset:n}}}return null}class Hn{constructor(e){let t=this.timeZone=e.timeZone,n="local"!==t&&"UTC"!==t;e.namedTimeZoneImpl&&n&&(this.namedTimeZoneImpl=new e.namedTimeZoneImpl(t)),this.canComputeOffset=Boolean(!n||this.namedTimeZoneImpl),this.calendarSystem=function(e){return new Mn[e]}(e.calendarSystem),this.locale=e.locale,this.weekDow=e.locale.week.dow,this.weekDoy=e.locale.week.doy,"ISO"===e.weekNumberCalculation&&(this.weekDow=1,this.weekDoy=4),"number"==typeof e.firstDay&&(this.weekDow=e.firstDay),"function"==typeof e.weekNumberCalculation&&(this.weekNumberFunc=e.weekNumberCalculation),this.weekText=null!=e.weekText?e.weekText:e.locale.options.weekText,this.weekTextLong=(null!=e.weekTextLong?e.weekTextLong:e.locale.options.weekTextLong)||this.weekText,this.cmdFormatter=e.cmdFormatter,this.defaultSeparator=e.defaultSeparator}createMarker(e){let t=this.createMarkerMeta(e);return null===t?null:t.marker}createNowMarker(){return this.canComputeOffset?this.timestampToMarker((new Date).valueOf()):Bt(Nt(new Date))}createMarkerMeta(e){if("string"==typeof e)return this.parse(e);let t=null;return"number"==typeof e?t=this.timestampToMarker(e):e instanceof Date?(e=e.valueOf(),isNaN(e)||(t=this.timestampToMarker(e))):Array.isArray(e)&&(t=Bt(e)),null!==t&&jt(t)?{marker:t,isTimeUnspecified:!1,forcedTzo:null}:null}parse(e){let t=Pn(e);if(null===t)return null;let{marker:n}=t,r=null;return null!==t.timeZoneOffset&&(this.canComputeOffset?n=this.timestampToMarker(n.valueOf()-60*t.timeZoneOffset*1e3):r=t.timeZoneOffset),{marker:n,isTimeUnspecified:t.isTimeUnspecified,forcedTzo:r}}getYear(e){return this.calendarSystem.getMarkerYear(e)}getMonth(e){return this.calendarSystem.getMarkerMonth(e)}getDay(e){return this.calendarSystem.getMarkerDay(e)}add(e,t){let n=this.calendarSystem.markerToArray(e);return n[0]+=t.years,n[1]+=t.months,n[2]+=t.days,n[6]+=t.milliseconds,this.calendarSystem.arrayToMarker(n)}subtract(e,t){let n=this.calendarSystem.markerToArray(e);return n[0]-=t.years,n[1]-=t.months,n[2]-=t.days,n[6]-=t.milliseconds,this.calendarSystem.arrayToMarker(n)}addYears(e,t){let n=this.calendarSystem.markerToArray(e);return n[0]+=t,this.calendarSystem.arrayToMarker(n)}addMonths(e,t){let n=this.calendarSystem.markerToArray(e);return n[1]+=t,this.calendarSystem.arrayToMarker(n)}diffWholeYears(e,t){let{calendarSystem:n}=this;return zt(e)===zt(t)&&n.getMarkerDay(e)===n.getMarkerDay(t)&&n.getMarkerMonth(e)===n.getMarkerMonth(t)?n.getMarkerYear(t)-n.getMarkerYear(e):null}diffWholeMonths(e,t){let{calendarSystem:n}=this;return zt(e)===zt(t)&&n.getMarkerDay(e)===n.getMarkerDay(t)?n.getMarkerMonth(t)-n.getMarkerMonth(e)+12*(n.getMarkerYear(t)-n.getMarkerYear(e)):null}greatestWholeUnit(e,t){let n=this.diffWholeYears(e,t);return null!==n?{unit:"year",value:n}:(n=this.diffWholeMonths(e,t),null!==n?{unit:"month",value:n}:(n=Tt(e,t),null!==n?{unit:"week",value:n}:(n=kt(e,t),null!==n?{unit:"day",value:n}:(n=function(e,t){return(t.valueOf()-e.valueOf())/36e5}(e,t),ct(n)?{unit:"hour",value:n}:(n=function(e,t){return(t.valueOf()-e.valueOf())/6e4}(e,t),ct(n)?{unit:"minute",value:n}:(n=function(e,t){return(t.valueOf()-e.valueOf())/1e3}(e,t),ct(n)?{unit:"second",value:n}:{unit:"millisecond",value:t.valueOf()-e.valueOf()}))))))}countDurationsBetween(e,t,n){let r;return n.years&&(r=this.diffWholeYears(e,t),null!==r)?r/(vt(n)/365):n.months&&(r=this.diffWholeMonths(e,t),null!==r)?r/function(e){return vt(e)/30}(n):n.days&&(r=kt(e,t),null!==r)?r/vt(n):(t.valueOf()-e.valueOf())/yt(n)}startOf(e,t){return"year"===t?this.startOfYear(e):"month"===t?this.startOfMonth(e):"week"===t?this.startOfWeek(e):"day"===t?Mt(e):"hour"===t?function(e){return Bt([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours()])}(e):"minute"===t?function(e){return Bt([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes()])}(e):"second"===t?function(e){return Bt([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds()])}(e):null}startOfYear(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e)])}startOfMonth(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e),this.calendarSystem.getMarkerMonth(e)])}startOfWeek(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e),this.calendarSystem.getMarkerMonth(e),e.getUTCDate()-(e.getUTCDay()-this.weekDow+7)%7])}computeWeekNumber(e){return this.weekNumberFunc?this.weekNumberFunc(this.toDate(e)):function(e,t,n){let r=e.getUTCFullYear(),i=It(e,r,t,n);if(i<1)return It(e,r-1,t,n);let s=It(e,r+1,t,n);return s>=1?Math.min(i,s):i}(e,this.weekDow,this.weekDoy)}format(e,t,n={}){return t.format({marker:e,timeZoneOffset:null!=n.forcedTzo?n.forcedTzo:this.offsetForMarker(e)},this)}formatRange(e,t,n,r={}){return r.isEndExclusive&&(t=Ct(t,-1)),n.formatRange({marker:e,timeZoneOffset:null!=r.forcedStartTzo?r.forcedStartTzo:this.offsetForMarker(e)},{marker:t,timeZoneOffset:null!=r.forcedEndTzo?r.forcedEndTzo:this.offsetForMarker(t)},this,r.defaultSeparator)}formatIso(e,t={}){let n=null;return t.omitTimeZoneOffset||(n=null!=t.forcedTzo?t.forcedTzo:this.offsetForMarker(e)),Ut(e,n,t.omitTime)}timestampToMarker(e){return"local"===this.timeZone?Bt(Nt(new Date(e))):"UTC"!==this.timeZone&&this.namedTimeZoneImpl?Bt(this.namedTimeZoneImpl.timestampToArray(e)):new Date(e)}offsetForMarker(e){return"local"===this.timeZone?-Pt(Ht(e)).getTimezoneOffset():"UTC"===this.timeZone?0:this.namedTimeZoneImpl?this.namedTimeZoneImpl.offsetForArray(Ht(e)):null}toDate(e,t){return"local"===this.timeZone?Pt(Ht(e)):"UTC"===this.timeZone?new Date(e.valueOf()):this.namedTimeZoneImpl?new Date(e.valueOf()-1e3*this.namedTimeZoneImpl.offsetForArray(Ht(e))*60):new Date(e.valueOf()-(t||0))}}class Bn{constructor(e){this.iconOverrideOption&&this.setIconOverride(e[this.iconOverrideOption])}setIconOverride(e){let t,n;if("object"==typeof e&&e){for(n in t=Object.assign({},this.iconClasses),e)t[n]=this.applyIconOverridePrefix(e[n]);this.iconClasses=t}else!1===e&&(this.iconClasses={})}applyIconOverridePrefix(e){let t=this.iconOverridePrefix;return t&&0!==e.indexOf(t)&&(e=t+e),e}getClass(e){return this.classes[e]||""}getIconClass(e,t){let n;return n=t&&this.rtlIconClasses&&this.rtlIconClasses[e]||this.iconClasses[e],n?`${this.baseIconClass} ${n}`:""}getCustomButtonIconClass(e){let t;return this.iconOverrideCustomButtonOption&&(t=e[this.iconOverrideCustomButtonOption],t)?`${this.baseIconClass} ${this.applyIconOverridePrefix(t)}`:""}}function jn(e){e();let t=n.debounceRendering,r=[];for(n.debounceRendering=function(e){r.push(e)},U(p(zn,{}),document.createElement("div"));r.length;)r.shift()();n.debounceRendering=t}Bn.prototype.classes={},Bn.prototype.iconClasses={},Bn.prototype.baseIconClass="",Bn.prototype.iconOverridePrefix="";class zn extends D{render(){return p("div",{})}componentDidMount(){this.setState({})}}function Un(e){let t=function(e,t){var n={__c:t="__cC"+c++,__:e,Consumer:function(e,t){return e.children(t)},Provider:function(e){var n,r;return this.getChildContext||(n=[],(r={})[t]=this,this.getChildContext=function(){return r},this.shouldComponentUpdate=function(e){this.props.value!==e.value&&n.some((function(e){e.__e=!0,x(e)}))},this.sub=function(e){n.push(e);var t=e.componentWillUnmount;e.componentWillUnmount=function(){n.splice(n.indexOf(e),1),t&&t.call(e)}}),e.children}};return n.Provider.__=n.Consumer.contextType=n}(e),n=t.Provider;return t.Provider=function(){let e=!this.getChildContext,t=n.apply(this,arguments);if(e){let e=[];this.shouldComponentUpdate=t=>{this.props.value!==t.value&&e.forEach(e=>{e.context=t.value,e.forceUpdate()})},this.sub=t=>{e.push(t);let n=t.componentWillUnmount;t.componentWillUnmount=()=>{e.splice(e.indexOf(t),1),n&&n.call(t)}}}return t},t}class Wn{constructor(e,t,n,r){this.execFunc=e,this.emitter=t,this.scrollTime=n,this.scrollTimeReset=r,this.handleScrollRequest=e=>{this.queuedRequest=Object.assign({},this.queuedRequest||{},e),this.drain()},t.on("_scrollRequest",this.handleScrollRequest),this.fireInitialScroll()}detach(){this.emitter.off("_scrollRequest",this.handleScrollRequest)}update(e){e&&this.scrollTimeReset?this.fireInitialScroll():this.drain()}fireInitialScroll(){this.handleScrollRequest({time:this.scrollTime})}drain(){this.queuedRequest&&this.execFunc(this.queuedRequest)&&(this.queuedRequest=null)}}const Ln=Un({});function Fn(e,t,n,r,i,s,o,a,l,c,d,u,h){return{dateEnv:i,options:n,pluginHooks:o,emitter:c,dispatch:a,getCurrentData:l,calendarApi:d,viewSpec:e,viewApi:t,dateProfileGenerator:r,theme:s,isRtl:"rtl"===n.direction,addResizeHandler(e){c.on("_resize",e)},removeResizeHandler(e){c.off("_resize",e)},createScrollResponder:e=>new Wn(e,c,ft(n.scrollTime),n.scrollTimeReset),registerInteractiveComponent:u,unregisterInteractiveComponent:h}}class Vn extends D{shouldComponentUpdate(e,t){return this.debug&&console.log(xn(e,this.props),xn(t,this.state)),!_n(this.props,e,this.propEquality)||!_n(this.state,t,this.stateEquality)}safeSetState(e){_n(this.state,Object.assign(Object.assign({},this.state),e),this.stateEquality)||this.setState(e)}}Vn.addPropsEquality=function(e){let t=Object.create(this.prototype.propEquality);Object.assign(t,e),this.prototype.propEquality=t},Vn.addStateEquality=function(e){let t=Object.create(this.prototype.stateEquality);Object.assign(t,e),this.prototype.stateEquality=t},Vn.contextType=Ln,Vn.prototype.propEquality={},Vn.prototype.stateEquality={};class Gn extends Vn{}function Qn(e,t){"function"==typeof e?e(t):e&&(e.current=t)}Gn.contextType=Ln;class qn extends Gn{constructor(){super(...arguments),this.id=Ze(),this.queuedDomNodes=[],this.currentDomNodes=[],this.handleEl=e=>{const{options:t}=this.context,{generatorName:n}=this.props;t.customRenderingReplaces&&Yn(n,t)||this.updateElRef(e)},this.updateElRef=e=>{this.props.elRef&&Qn(this.props.elRef,e)}}render(){const{props:e,context:t}=this,{options:n}=t,{customGenerator:r,defaultGenerator:s,renderProps:o}=e,a=Zn(e,[],this.handleEl);let l,c,d=!1,u=[];if(null!=r){const e="function"==typeof r?r(o,p):r;if(!0===e)d=!0;else{const t=e&&"object"==typeof e;t&&"html"in e?a.dangerouslySetInnerHTML={__html:e.html}:t&&"domNodes"in e?u=Array.prototype.slice.call(e.domNodes):(t?i(e):"function"!=typeof e)?l=e:c=e}}else d=!Yn(e.generatorName,n);return d&&s&&(l=s(o)),this.queuedDomNodes=u,this.currentGeneratorMeta=c,p(e.elTag,a,l)}componentDidMount(){this.applyQueueudDomNodes(),this.triggerCustomRendering(!0)}componentDidUpdate(){this.applyQueueudDomNodes(),this.triggerCustomRendering(!0)}componentWillUnmount(){this.triggerCustomRendering(!1)}triggerCustomRendering(e){var t;const{props:n,context:r}=this,{handleCustomRendering:i,customRenderingMetaMap:s}=r.options;if(i){const r=null!==(t=this.currentGeneratorMeta)&&void 0!==t?t:null==s?void 0:s[n.generatorName];r&&i(Object.assign(Object.assign({id:this.id,isActive:e,containerEl:this.base,reportNewContainerEl:this.updateElRef,generatorMeta:r},n),{elClasses:(n.elClasses||[]).filter(Xn)}))}}applyQueueudDomNodes(){const{queuedDomNodes:e,currentDomNodes:t}=this,n=this.base;if(!St(e,t)){t.forEach(Ie);for(let t of e)n.appendChild(t);this.currentDomNodes=e}}}function Yn(e,t){var n;return Boolean(t.handleCustomRendering&&e&&(null===(n=t.customRenderingMetaMap)||void 0===n?void 0:n[e]))}function Zn(e,t,n){const r=Object.assign(Object.assign({},e.elAttrs),{ref:n});return(e.elClasses||t)&&(r.className=(e.elClasses||[]).concat(t||[]).concat(r.className||[]).filter(Boolean).join(" ")),e.elStyle&&(r.style=e.elStyle),r}function Xn(e){return Boolean(e)}qn.addPropsEquality({elClasses:St,elStyle:Cn,elAttrs:function(e,t){const n=xn(e,t);for(let e of n)if(!Rn.test(e))return!1;return!0},renderProps:Cn});const $n=Un(0);class Jn extends D{constructor(){super(...arguments),this.InnerContent=Kn.bind(void 0,this),this.handleEl=e=>{this.el=e,this.props.elRef&&(Qn(this.props.elRef,e),e&&this.didMountMisfire&&this.componentDidMount())}}render(){const{props:e}=this,t=function(e,t){const n="function"==typeof e?e(t):e||[];return"string"==typeof n?[n]:n}(e.classNameGenerator,e.renderProps);if(e.children){const n=Zn(e,t,this.handleEl),r=e.children(this.InnerContent,e.renderProps,n);return e.elTag?p(e.elTag,n,r):r}return p(qn,Object.assign(Object.assign({},e),{elRef:this.handleEl,elTag:e.elTag||"div",elClasses:(e.elClasses||[]).concat(t),renderId:this.context}))}componentDidMount(){var e,t;this.el?null===(t=(e=this.props).didMount)||void 0===t||t.call(e,Object.assign(Object.assign({},this.props.renderProps),{el:this.el})):this.didMountMisfire=!0}componentWillUnmount(){var e,t;null===(t=(e=this.props).willUnmount)||void 0===t||t.call(e,Object.assign(Object.assign({},this.props.renderProps),{el:this.el}))}}function Kn(e,t){const n=e.props;return p(qn,Object.assign({renderProps:n.renderProps,generatorName:n.generatorName,customGenerator:n.customGenerator,defaultGenerator:n.defaultGenerator,renderId:e.context},t))}Jn.contextType=$n;class er extends Gn{render(){let{props:e,context:t}=this,{options:n}=t,r={view:t.viewApi};return p(Jn,Object.assign({},e,{elTag:e.elTag||"div",elClasses:[...tr(e.viewSpec),...e.elClasses||[]],renderProps:r,classNameGenerator:n.viewClassNames,generatorName:void 0,didMount:n.viewDidMount,willUnmount:n.viewWillUnmount}),()=>e.children)}}function tr(e){return[`fc-${e.type}-view`,"fc-view"]}function nr(e,t){let n,r,i=[],{start:s}=t;for(e.sort(rr),n=0;n<e.length;n+=1)r=e[n],r.start>s&&i.push({start:s,end:r.start}),r.end>s&&(s=r.end);return s<t.end&&i.push({start:s,end:t.end}),i}function rr(e,t){return e.start.valueOf()-t.start.valueOf()}function ir(e,t){let{start:n,end:r}=e,i=null;return null!==t.start&&(n=null===n?t.start:new Date(Math.max(n.valueOf(),t.start.valueOf()))),null!=t.end&&(r=null===r?t.end:new Date(Math.min(r.valueOf(),t.end.valueOf()))),(null===n||null===r||n<r)&&(i={start:n,end:r}),i}function sr(e,t){return(null===e.start?null:e.start.valueOf())===(null===t.start?null:t.start.valueOf())&&(null===e.end?null:e.end.valueOf())===(null===t.end?null:t.end.valueOf())}function or(e,t){return(null===e.end||null===t.start||e.end>t.start)&&(null===e.start||null===t.end||e.start<t.end)}function ar(e,t){return(null===e.start||null!==t.start&&t.start>=e.start)&&(null===e.end||null!==t.end&&t.end<=e.end)}function lr(e,t){return(null===e.start||t>=e.start)&&(null===e.end||t<e.end)}function cr(e){let t=Math.floor(xt(e.start,e.end))||1,n=Mt(e.start);return{start:n,end:wt(n,t)}}function dr(e,t=ft(0)){let n=null,r=null;if(e.end){r=Mt(e.end);let n=e.end.valueOf()-r.valueOf();n&&n>=yt(t)&&(r=wt(r,1))}return e.start&&(n=Mt(e.start),r&&r<=n&&(r=wt(n,1))),{start:n,end:r}}function ur(e){let t=dr(e);return xt(t.start,t.end)>1}function hr(e,t,n,r){return"year"===r?ft(n.diffWholeYears(e,t),"year"):"month"===r?ft(n.diffWholeMonths(e,t),"month"):_t(e,t)}function fr(e,t){return"function"==typeof e&&(e=e()),null==e?t.createNowMarker():t.createMarker(e)}class gr{constructor(e){this.props=e,this.nowDate=fr(e.nowInput,e.dateEnv),this.initHiddenDays()}buildPrev(e,t,n){let{dateEnv:r}=this.props,i=r.subtract(r.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(i,-1,n)}buildNext(e,t,n){let{dateEnv:r}=this.props,i=r.add(r.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(i,1,n)}build(e,t,n=!0){let r,i,s,o,a,l,{props:c}=this;var d,u;return r=this.buildValidRange(),r=this.trimHiddenDays(r),n&&(d=e,e=null!=(u=r).start&&d<u.start?u.start:null!=u.end&&d>=u.end?new Date(u.end.valueOf()-1):d),i=this.buildCurrentRangeInfo(e,t),s=/^(year|month|week|day)$/.test(i.unit),o=this.buildRenderRange(this.trimHiddenDays(i.range),i.unit,s),o=this.trimHiddenDays(o),a=o,c.showNonCurrentDates||(a=ir(a,i.range)),a=this.adjustActiveRange(a),a=ir(a,r),l=or(i.range,r),lr(o,e)||(e=o.start),{currentDate:e,validRange:r,currentRange:i.range,currentRangeUnit:i.unit,isRangeAllDay:s,activeRange:a,renderRange:o,slotMinTime:c.slotMinTime,slotMaxTime:c.slotMaxTime,isValid:l,dateIncrement:this.buildDateIncrement(i.duration)}}buildValidRange(){let e=this.props.validRangeInput,t="function"==typeof e?e.call(this.props.calendarApi,this.nowDate):e;return this.refineRange(t)||{start:null,end:null}}buildCurrentRangeInfo(e,t){let n,{props:r}=this,i=null,s=null,o=null;return r.duration?(i=r.duration,s=r.durationUnit,o=this.buildRangeFromDuration(e,t,i,s)):(n=this.props.dayCount)?(s="day",o=this.buildRangeFromDayCount(e,t,n)):(o=this.buildCustomVisibleRange(e))?s=r.dateEnv.greatestWholeUnit(o.start,o.end).unit:(i=this.getFallbackDuration(),s=Et(i).unit,o=this.buildRangeFromDuration(e,t,i,s)),{duration:i,unit:s,range:o}}getFallbackDuration(){return ft({day:1})}adjustActiveRange(e){let{dateEnv:t,usesMinMaxTime:n,slotMinTime:r,slotMaxTime:i}=this.props,{start:s,end:o}=e;return n&&(vt(r)<0&&(s=Mt(s),s=t.add(s,r)),vt(i)>1&&(o=Mt(o),o=wt(o,-1),o=t.add(o,i))),{start:s,end:o}}buildRangeFromDuration(e,t,n,r){let i,s,o,{dateEnv:a,dateAlignment:l}=this.props;if(!l){let{dateIncrement:e}=this.props;l=e&&yt(e)<yt(n)?Et(e).unit:r}function c(){i=a.startOf(e,l),s=a.add(i,n),o={start:i,end:s}}return vt(n)<=1&&this.isHiddenDay(i)&&(i=this.skipHiddenDays(i,t),i=Mt(i)),c(),this.trimHiddenDays(o)||(e=this.skipHiddenDays(e,t),c()),o}buildRangeFromDayCount(e,t,n){let r,{dateEnv:i,dateAlignment:s}=this.props,o=0,a=e;s&&(a=i.startOf(a,s)),a=Mt(a),a=this.skipHiddenDays(a,t),r=a;do{r=wt(r,1),this.isHiddenDay(r)||(o+=1)}while(o<n);return{start:a,end:r}}buildCustomVisibleRange(e){let{props:t}=this,n=t.visibleRangeInput,r="function"==typeof n?n.call(t.calendarApi,t.dateEnv.toDate(e)):n,i=this.refineRange(r);return!i||null!=i.start&&null!=i.end?i:null}buildRenderRange(e,t,n){return e}buildDateIncrement(e){let t,{dateIncrement:n}=this.props;return n||((t=this.props.dateAlignment)?ft(1,t):e||ft({days:1}))}refineRange(e){if(e){let t=function(e,t){let n=null,r=null;return e.start&&(n=t.createMarker(e.start)),e.end&&(r=t.createMarker(e.end)),n||r?n&&r&&r<n?null:{start:n,end:r}:null}(e,this.props.dateEnv);return t&&(t=dr(t)),t}return null}initHiddenDays(){let e,t=this.props.hiddenDays||[],n=[],r=0;for(!1===this.props.weekends&&t.push(0,6),e=0;e<7;e+=1)(n[e]=-1!==t.indexOf(e))||(r+=1);if(!r)throw new Error("invalid hiddenDays");this.isHiddenDayHash=n}trimHiddenDays(e){let{start:t,end:n}=e;return t&&(t=this.skipHiddenDays(t)),n&&(n=this.skipHiddenDays(n,-1,!0)),null==t||null==n||t<n?{start:t,end:n}:null}isHiddenDay(e){return e instanceof Date&&(e=e.getUTCDay()),this.isHiddenDayHash[e]}skipHiddenDays(e,t=1,n=!1){for(;this.isHiddenDayHash[(e.getUTCDay()+(n?t:0)+7)%7];)e=wt(e,t);return e}}function pr(e,t,n,r){return{instanceId:Ze(),defId:e,range:t,forcedStartTzo:null==n?null:n,forcedEndTzo:null==r?null:r}}function mr(e,t,n){let{dateEnv:r,pluginHooks:i,options:s}=n,{defs:o,instances:a}=e;a=Sn(a,e=>!o[e.defId].recurringDef);for(let e in o){let n=o[e];if(n.recurringDef){let{duration:o}=n.recurringDef;o||(o=n.allDay?s.defaultAllDayEventDuration:s.defaultTimedEventDuration);let l=vr(n,o,t,r,i.recurringTypes);for(let t of l){let n=pr(e,{start:t,end:r.add(t,o)});a[n.instanceId]=n}}}return{defs:o,instances:a}}function vr(e,t,n,r,i){let s=i[e.recurringDef.typeId].expand(e.recurringDef.typeData,{start:r.subtract(n.start,t),end:n.end},r);return e.allDay&&(s=s.map(Mt)),s}const yr={id:String,groupId:String,title:String,url:String,interactive:Boolean},br={start:yn,end:yn,date:yn,allDay:Boolean},Er=Object.assign(Object.assign(Object.assign({},yr),br),{extendedProps:yn});function Sr(e,t,n,r,i=Dr(n),s,o){let{refined:a,extra:l}=Ar(e,n,i),c=function(e,t){let n=null;e&&(n=e.defaultAllDay);null==n&&(n=t.options.defaultAllDay);return n}(t,n),d=function(e,t,n,r){for(let i=0;i<r.length;i+=1){let s=r[i].parse(e,n);if(s){let{allDay:n}=e;return null==n&&(n=t,null==n&&(n=s.allDayGuess,null==n&&(n=!1))),{allDay:n,duration:s.duration,typeData:s.typeData,typeId:i}}}return null}(a,c,n.dateEnv,n.pluginHooks.recurringTypes);if(d){let e=wr(a,l,t?t.sourceId:"",d.allDay,Boolean(d.duration),n,s);return e.recurringDef={typeId:d.typeId,typeData:d.typeData,duration:d.duration},{def:e,instance:null}}let u=function(e,t,n,r){let i,s,{allDay:o}=e,a=null,l=!1,c=null,d=null!=e.start?e.start:e.date;if(i=n.dateEnv.createMarkerMeta(d),i)a=i.marker;else if(!r)return null;null!=e.end&&(s=n.dateEnv.createMarkerMeta(e.end));null==o&&(o=null!=t?t:(!i||i.isTimeUnspecified)&&(!s||s.isTimeUnspecified));o&&a&&(a=Mt(a));s&&(c=s.marker,o&&(c=Mt(c)),a&&c<=a&&(c=null));c?l=!0:r||(l=n.options.forceEventDuration||!1,c=n.dateEnv.add(a,o?n.options.defaultAllDayEventDuration:n.options.defaultTimedEventDuration));return{allDay:o,hasEnd:l,range:{start:a,end:c},forcedStartTzo:i?i.forcedTzo:null,forcedEndTzo:s?s.forcedTzo:null}}(a,c,n,r);if(u){let e=wr(a,l,t?t.sourceId:"",u.allDay,u.hasEnd,n,s),r=pr(e.defId,u.range,u.forcedStartTzo,u.forcedEndTzo);return o&&e.publicId&&o[e.publicId]&&(r.instanceId=o[e.publicId]),{def:e,instance:r}}return null}function Ar(e,t,n=Dr(t)){return vn(e,n)}function Dr(e){return Object.assign(Object.assign(Object.assign({},Ir),Er),e.pluginHooks.eventRefiners)}function wr(e,t,n,r,i,s,o){let a={title:e.title||"",groupId:e.groupId||"",publicId:e.id||"",url:e.url||"",recurringDef:null,defId:(o&&e.id?o[e.id]:"")||Ze(),sourceId:n,allDay:r,hasEnd:i,interactive:e.interactive,ui:Nr(e,s),extendedProps:Object.assign(Object.assign({},e.extendedProps||{}),t)};for(let t of s.pluginHooks.eventDefMemberAdders)Object.assign(a,t(e));return Object.freeze(a.ui.classNames),Object.freeze(a.extendedProps),a}function Cr(e,t,n,r,i,s){let o={defs:{},instances:{}},a=Dr(n);for(let l of e){let e=Sr(l,t,n,r,a,i,s);e&&Rr(e,o)}return o}function Rr(e,t={defs:{},instances:{}}){return t.defs[e.def.defId]=e.def,e.instance&&(t.instances[e.instance.instanceId]=e.instance),t}function xr(e,t){let n=e.instances[t];if(n){let t=e.defs[n.defId],r=kr(e,e=>{return n=t,r=e,Boolean(n.groupId&&n.groupId===r.groupId);var n,r});return r.defs[t.defId]=t,r.instances[n.instanceId]=n,r}return{defs:{},instances:{}}}function _r(){return{defs:{},instances:{}}}function Tr(e,t){return{defs:Object.assign(Object.assign({},e.defs),t.defs),instances:Object.assign(Object.assign({},e.instances),t.instances)}}function kr(e,t){let n=Sn(e.defs,t),r=Sn(e.instances,e=>n[e.defId]);return{defs:n,instances:r}}function Mr(e){return Array.isArray(e)?e:"string"==typeof e?e.split(/\s+/):[]}const Ir={display:String,editable:Boolean,startEditable:Boolean,durationEditable:Boolean,constraint:yn,overlap:yn,allow:yn,className:Mr,classNames:Mr,color:String,backgroundColor:String,borderColor:String,textColor:String},Or={display:null,startEditable:null,durationEditable:null,constraints:[],overlap:null,allows:[],backgroundColor:"",borderColor:"",textColor:"",classNames:[]};function Nr(e,t){let n=function(e,t){return Array.isArray(e)?Cr(e,null,t,!0):"object"==typeof e&&e?Cr([e],null,t,!0):null!=e?String(e):null}(e.constraint,t);return{display:e.display||null,startEditable:null!=e.startEditable?e.startEditable:e.editable,durationEditable:null!=e.durationEditable?e.durationEditable:e.editable,constraints:null!=n?[n]:[],overlap:null!=e.overlap?e.overlap:null,allows:null!=e.allow?[e.allow]:[],backgroundColor:e.backgroundColor||e.color||"",borderColor:e.borderColor||e.color||"",textColor:e.textColor||"",classNames:(e.className||[]).concat(e.classNames||[])}}function Pr(e){return e.reduce(Hr,Or)}function Hr(e,t){return{display:null!=t.display?t.display:e.display,startEditable:null!=t.startEditable?t.startEditable:e.startEditable,durationEditable:null!=t.durationEditable?t.durationEditable:e.durationEditable,constraints:e.constraints.concat(t.constraints),overlap:"boolean"==typeof t.overlap?t.overlap:e.overlap,allows:e.allows.concat(t.allows),backgroundColor:t.backgroundColor||e.backgroundColor,borderColor:t.borderColor||e.borderColor,textColor:t.textColor||e.textColor,classNames:e.classNames.concat(t.classNames)}}const Br={id:String,defaultAllDay:Boolean,url:String,format:String,events:yn,eventDataTransform:yn,success:yn,failure:yn};function jr(e,t,n=zr(t)){let r;if("string"==typeof e?r={url:e}:"function"==typeof e||Array.isArray(e)?r={events:e}:"object"==typeof e&&e&&(r=e),r){let{refined:i,extra:s}=vn(r,n),o=function(e,t){let n=t.pluginHooks.eventSourceDefs;for(let t=n.length-1;t>=0;t-=1){let r=n[t].parseMeta(e);if(r)return{sourceDefId:t,meta:r}}return null}(i,t);if(o)return{_raw:e,isFetching:!1,latestFetchId:"",fetchRange:null,defaultAllDay:i.defaultAllDay,eventDataTransform:i.eventDataTransform,success:i.success,failure:i.failure,publicId:i.id||"",sourceId:Ze(),sourceDefId:o.sourceDefId,meta:o.meta,ui:Nr(i,t),extendedProps:s}}return null}function zr(e){return Object.assign(Object.assign(Object.assign({},Ir),Br),e.pluginHooks.eventSourceRefiners)}function Ur(e,t,n,r,i){switch(t.type){case"RECEIVE_EVENTS":return function(e,t,n,r,i,s){if(t&&n===t.latestFetchId){let n=Cr(Wr(i,t,s),t,s);return r&&(n=mr(n,r,s)),Tr(Vr(e,t.sourceId),n)}return e}(e,n[t.sourceId],t.fetchId,t.fetchRange,t.rawEvents,i);case"RESET_RAW_EVENTS":return function(e,t,n,r,i){const{defIdMap:s,instanceIdMap:o}=function(e){const{defs:t,instances:n}=e,r={},i={};for(let e in t){const n=t[e],{publicId:i}=n;i&&(r[i]=e)}for(let e in n){const r=n[e],s=t[r.defId],{publicId:o}=s;o&&(i[o]=e)}return{defIdMap:r,instanceIdMap:i}}(e);return mr(Cr(Wr(n,t,i),t,i,!1,s,o),r,i)}(e,n[t.sourceId],t.rawEvents,r.activeRange,i);case"ADD_EVENTS":return function(e,t,n,r){n&&(t=mr(t,n,r));return Tr(e,t)}(e,t.eventStore,r?r.activeRange:null,i);case"RESET_EVENTS":return t.eventStore;case"MERGE_EVENTS":return Tr(e,t.eventStore);case"PREV":case"NEXT":case"CHANGE_DATE":case"CHANGE_VIEW_TYPE":return r?mr(e,r.activeRange,i):e;case"REMOVE_EVENTS":return function(e,t){let{defs:n,instances:r}=e,i={},s={};for(let e in n)t.defs[e]||(i[e]=n[e]);for(let e in r)!t.instances[e]&&i[r[e].defId]&&(s[e]=r[e]);return{defs:i,instances:s}}(e,t.eventStore);case"REMOVE_EVENT_SOURCE":return Vr(e,t.sourceId);case"REMOVE_ALL_EVENT_SOURCES":return kr(e,e=>!e.sourceId);case"REMOVE_ALL_EVENTS":return{defs:{},instances:{}};default:return e}}function Wr(e,t,n){let r=n.options.eventDataTransform,i=t?t.eventDataTransform:null;return i&&(e=Lr(e,i)),r&&(e=Lr(e,r)),e}function Lr(e,t){let n;if(t){n=[];for(let r of e){let e=t(r);e?n.push(e):null==e&&n.push(r)}}else n=e;return n}function Fr(e,t,n){let{defs:r}=e,i=An(e.instances,e=>r[e.defId].allDay?e:Object.assign(Object.assign({},e),{range:{start:n.createMarker(t.toDate(e.range.start,e.forcedStartTzo)),end:n.createMarker(t.toDate(e.range.end,e.forcedEndTzo))},forcedStartTzo:n.canComputeOffset?null:e.forcedStartTzo,forcedEndTzo:n.canComputeOffset?null:e.forcedEndTzo}));return{defs:r,instances:i}}function Vr(e,t){return kr(e,e=>e.sourceId!==t)}class Gr{constructor(){this.handlers={},this.thisContext=null}setThisContext(e){this.thisContext=e}setOptions(e){this.options=e}on(e,t){!function(e,t,n){(e[t]||(e[t]=[])).push(n)}(this.handlers,e,t)}off(e,t){!function(e,t,n){n?e[t]&&(e[t]=e[t].filter(e=>e!==n)):delete e[t]}(this.handlers,e,t)}trigger(e,...t){let n=this.handlers[e]||[],r=this.options&&this.options[e],i=[].concat(r||[],n);for(let e of i)e.apply(this.thisContext,t)}hasHandlers(e){return Boolean(this.handlers[e]&&this.handlers[e].length||this.options&&this.options[e])}}const Qr={startTime:"09:00",endTime:"17:00",daysOfWeek:[1,2,3,4,5],display:"inverse-background",classNames:"fc-non-business",groupId:"_businessHours"};function qr(e,t){return Cr(function(e){let t;t=!0===e?[{}]:Array.isArray(e)?e.filter(e=>e.daysOfWeek):"object"==typeof e&&e?[e]:[];return t=t.map(e=>Object.assign(Object.assign({},Qr),e)),t}(e),null,t)}function Yr(e,t,n){n.emitter.trigger("select",Object.assign(Object.assign({},Zr(e,n)),{jsEvent:t?t.origEvent:null,view:n.viewApi||n.calendarApi.view}))}function Zr(e,t){let n={};for(let r of t.pluginHooks.dateSpanTransforms)Object.assign(n,r(e,t));var r,i;return Object.assign(n,(r=e,i=t.dateEnv,Object.assign(Object.assign({},wi(r.range,i,r.allDay)),{allDay:r.allDay}))),n}function Xr(e,t,n){let{dateEnv:r,options:i}=n,s=t;return e?(s=Mt(s),s=r.add(s,i.defaultAllDayEventDuration)):s=r.add(s,i.defaultTimedEventDuration),s}function $r(e,t,n,r){let i=li(e.defs,t),s={defs:{},instances:{}};for(let t in e.defs){let o=e.defs[t];s.defs[t]=Jr(o,i[t],n,r)}for(let t in e.instances){let o=e.instances[t],a=s.defs[o.defId];s.instances[t]=Kr(o,a,i[o.defId],n,r)}return s}function Jr(e,t,n,r){let i=n.standardProps||{};null==i.hasEnd&&t.durationEditable&&(n.startDelta||n.endDelta)&&(i.hasEnd=!0);let s=Object.assign(Object.assign(Object.assign({},e),i),{ui:Object.assign(Object.assign({},e.ui),i.ui)});n.extendedProps&&(s.extendedProps=Object.assign(Object.assign({},s.extendedProps),n.extendedProps));for(let e of r.pluginHooks.eventDefMutationAppliers)e(s,n,r);return!s.hasEnd&&r.options.forceEventDuration&&(s.hasEnd=!0),s}function Kr(e,t,n,r,i){let{dateEnv:s}=i,o=r.standardProps&&!0===r.standardProps.allDay,a=r.standardProps&&!1===r.standardProps.hasEnd,l=Object.assign({},e);return o&&(l.range=cr(l.range)),r.datesDelta&&n.startEditable&&(l.range={start:s.add(l.range.start,r.datesDelta),end:s.add(l.range.end,r.datesDelta)}),r.startDelta&&n.durationEditable&&(l.range={start:s.add(l.range.start,r.startDelta),end:l.range.end}),r.endDelta&&n.durationEditable&&(l.range={start:l.range.start,end:s.add(l.range.end,r.endDelta)}),a&&(l.range={start:l.range.start,end:Xr(t.allDay,l.range.start,i)}),t.allDay&&(l.range={start:Mt(l.range.start),end:Mt(l.range.end)}),l.range.end<l.range.start&&(l.range.end=Xr(t.allDay,l.range.start,i)),l}class ei{constructor(e,t){this.context=e,this.internalEventSource=t}remove(){this.context.dispatch({type:"REMOVE_EVENT_SOURCE",sourceId:this.internalEventSource.sourceId})}refetch(){this.context.dispatch({type:"FETCH_EVENT_SOURCES",sourceIds:[this.internalEventSource.sourceId],isRefetch:!0})}get id(){return this.internalEventSource.publicId}get url(){return this.internalEventSource.meta.url}get format(){return this.internalEventSource.meta.format}}class ti{constructor(e,t,n){this._context=e,this._def=t,this._instance=n||null}setProp(e,t){if(e in br)console.warn("Could not set date-related prop 'name'. Use one of the date-related methods instead.");else if("id"===e)t=yr[e](t),this.mutate({standardProps:{publicId:t}});else if(e in yr)t=yr[e](t),this.mutate({standardProps:{[e]:t}});else if(e in Ir){let n=Ir[e](t);n="color"===e?{backgroundColor:t,borderColor:t}:"editable"===e?{startEditable:t,durationEditable:t}:{[e]:t},this.mutate({standardProps:{ui:n}})}else console.warn(`Could not set prop '${e}'. Use setExtendedProp instead.`)}setExtendedProp(e,t){this.mutate({extendedProps:{[e]:t}})}setStart(e,t={}){let{dateEnv:n}=this._context,r=n.createMarker(e);if(r&&this._instance){let e=hr(this._instance.range.start,r,n,t.granularity);t.maintainDuration?this.mutate({datesDelta:e}):this.mutate({startDelta:e})}}setEnd(e,t={}){let n,{dateEnv:r}=this._context;if((null==e||(n=r.createMarker(e),n))&&this._instance)if(n){let e=hr(this._instance.range.end,n,r,t.granularity);this.mutate({endDelta:e})}else this.mutate({standardProps:{hasEnd:!1}})}setDates(e,t,n={}){let r,{dateEnv:i}=this._context,s={allDay:n.allDay},o=i.createMarker(e);var a,l;if(o&&((null==t||(r=i.createMarker(t),r))&&this._instance)){let e=this._instance.range;!0===n.allDay&&(e=cr(e));let t=hr(e.start,o,i,n.granularity);if(r){let o=hr(e.end,r,i,n.granularity);l=o,(a=t).years===l.years&&a.months===l.months&&a.days===l.days&&a.milliseconds===l.milliseconds?this.mutate({datesDelta:t,standardProps:s}):this.mutate({startDelta:t,endDelta:o,standardProps:s})}else s.hasEnd=!1,this.mutate({datesDelta:t,standardProps:s})}}moveStart(e){let t=ft(e);t&&this.mutate({startDelta:t})}moveEnd(e){let t=ft(e);t&&this.mutate({endDelta:t})}moveDates(e){let t=ft(e);t&&this.mutate({datesDelta:t})}setAllDay(e,t={}){let n={allDay:e},{maintainDuration:r}=t;null==r&&(r=this._context.options.allDayMaintainDuration),this._def.allDay!==e&&(n.hasEnd=r),this.mutate({standardProps:n})}formatRange(e){let{dateEnv:t}=this._context,n=this._instance,r=an(e);return this._def.hasEnd?t.formatRange(n.range.start,n.range.end,r,{forcedStartTzo:n.forcedStartTzo,forcedEndTzo:n.forcedEndTzo}):t.format(n.range.start,r,{forcedTzo:n.forcedStartTzo})}mutate(e){let t=this._instance;if(t){let n=this._def,r=this._context,{eventStore:i}=r.getCurrentData(),s=xr(i,t.instanceId);s=$r(s,{"":{display:"",startEditable:!0,durationEditable:!0,constraints:[],overlap:null,allows:[],backgroundColor:"",borderColor:"",textColor:"",classNames:[]}},e,r);let o=new ti(r,n,t);this._def=s.defs[n.defId],this._instance=s.instances[t.instanceId],r.dispatch({type:"MERGE_EVENTS",eventStore:s}),r.emitter.trigger("eventChange",{oldEvent:o,event:this,relatedEvents:ri(s,r,t),revert(){r.dispatch({type:"RESET_EVENTS",eventStore:i})}})}}remove(){let e=this._context,t=ni(this);e.dispatch({type:"REMOVE_EVENTS",eventStore:t}),e.emitter.trigger("eventRemove",{event:this,relatedEvents:[],revert(){e.dispatch({type:"MERGE_EVENTS",eventStore:t})}})}get source(){let{sourceId:e}=this._def;return e?new ei(this._context,this._context.getCurrentData().eventSources[e]):null}get start(){return this._instance?this._context.dateEnv.toDate(this._instance.range.start):null}get end(){return this._instance&&this._def.hasEnd?this._context.dateEnv.toDate(this._instance.range.end):null}get startStr(){let e=this._instance;return e?this._context.dateEnv.formatIso(e.range.start,{omitTime:this._def.allDay,forcedTzo:e.forcedStartTzo}):""}get endStr(){let e=this._instance;return e&&this._def.hasEnd?this._context.dateEnv.formatIso(e.range.end,{omitTime:this._def.allDay,forcedTzo:e.forcedEndTzo}):""}get id(){return this._def.publicId}get groupId(){return this._def.groupId}get allDay(){return this._def.allDay}get title(){return this._def.title}get url(){return this._def.url}get display(){return this._def.ui.display||"auto"}get startEditable(){return this._def.ui.startEditable}get durationEditable(){return this._def.ui.durationEditable}get constraint(){return this._def.ui.constraints[0]||null}get overlap(){return this._def.ui.overlap}get allow(){return this._def.ui.allows[0]||null}get backgroundColor(){return this._def.ui.backgroundColor}get borderColor(){return this._def.ui.borderColor}get textColor(){return this._def.ui.textColor}get classNames(){return this._def.ui.classNames}get extendedProps(){return this._def.extendedProps}toPlainObject(e={}){let t=this._def,{ui:n}=t,{startStr:r,endStr:i}=this,s={allDay:t.allDay};return t.title&&(s.title=t.title),r&&(s.start=r),i&&(s.end=i),t.publicId&&(s.id=t.publicId),t.groupId&&(s.groupId=t.groupId),t.url&&(s.url=t.url),n.display&&"auto"!==n.display&&(s.display=n.display),e.collapseColor&&n.backgroundColor&&n.backgroundColor===n.borderColor?s.color=n.backgroundColor:(n.backgroundColor&&(s.backgroundColor=n.backgroundColor),n.borderColor&&(s.borderColor=n.borderColor)),n.textColor&&(s.textColor=n.textColor),n.classNames.length&&(s.classNames=n.classNames),Object.keys(t.extendedProps).length&&(e.collapseExtendedProps?Object.assign(s,t.extendedProps):s.extendedProps=t.extendedProps),s}toJSON(){return this.toPlainObject()}}function ni(e){let t=e._def,n=e._instance;return{defs:{[t.defId]:t},instances:n?{[n.instanceId]:n}:{}}}function ri(e,t,n){let{defs:r,instances:i}=e,s=[],o=n?n.instanceId:"";for(let e in i){let n=i[e],a=r[n.defId];n.instanceId!==o&&s.push(new ti(t,a,n))}return s}function ii(e,t,n,r){let i={},s={},o={},a=[],l=[],c=li(e.defs,t);for(let t in e.defs){let n=e.defs[t];"inverse-background"===c[n.defId].display&&(n.groupId?(i[n.groupId]=[],o[n.groupId]||(o[n.groupId]=n)):s[t]=[])}for(let t in e.instances){let o=e.instances[t],d=e.defs[o.defId],u=c[d.defId],h=o.range,f=!d.allDay&&r?dr(h,r):h,g=ir(f,n);g&&("inverse-background"===u.display?d.groupId?i[d.groupId].push(g):s[o.defId].push(g):"none"!==u.display&&("background"===u.display?a:l).push({def:d,ui:u,instance:o,range:g,isStart:f.start&&f.start.valueOf()===g.start.valueOf(),isEnd:f.end&&f.end.valueOf()===g.end.valueOf()}))}for(let e in i){let t=nr(i[e],n);for(let n of t){let t=o[e],r=c[t.defId];a.push({def:t,ui:r,instance:null,range:n,isStart:!1,isEnd:!1})}}for(let t in s){let r=nr(s[t],n);for(let n of r)a.push({def:e.defs[t],ui:c[t],instance:null,range:n,isStart:!1,isEnd:!1})}return{bg:a,fg:l}}function si(e){return"background"===e.ui.display||"inverse-background"===e.ui.display}function oi(e,t){e.fcSeg=t}function ai(e){return e.fcSeg||e.parentNode.fcSeg||null}function li(e,t){return An(e,e=>ci(e,t))}function ci(e,t){let n=[];return t[""]&&n.push(t[""]),t[e.defId]&&n.push(t[e.defId]),n.push(e.ui),Pr(n)}function di(e,t){let n=e.map(ui);return n.sort((e,n)=>rt(e,n,t)),n.map(e=>e._seg)}function ui(e){let{eventRange:t}=e,n=t.def,r=t.instance?t.instance.range:t.range,i=r.start?r.start.valueOf():0,s=r.end?r.end.valueOf():0;return Object.assign(Object.assign(Object.assign({},n.extendedProps),n),{id:n.publicId,start:i,end:s,duration:s-i,allDay:Number(n.allDay),_seg:e})}function hi(e,t){let{pluginHooks:n}=t,r=n.isDraggableTransformers,{def:i,ui:s}=e.eventRange,o=s.startEditable;for(let e of r)o=e(o,i,s,t);return o}function fi(e,t){return e.isStart&&e.eventRange.ui.durationEditable&&t.options.eventResizableFromStart}function gi(e,t){return e.isEnd&&e.eventRange.ui.durationEditable}function pi(e,t,n,r,i,s,o){let{dateEnv:a,options:l}=n,{displayEventTime:c,displayEventEnd:d}=l,u=e.eventRange.def,h=e.eventRange.instance;null==c&&(c=!1!==r),null==d&&(d=!1!==i);let f=h.range.start,g=h.range.end,p=s||e.start||e.eventRange.range.start,m=o||e.end||e.eventRange.range.end,v=Mt(f).valueOf()===Mt(p).valueOf(),y=Mt(Ct(g,-1)).valueOf()===Mt(Ct(m,-1)).valueOf();return c&&!u.allDay&&(v||y)?(p=v?f:p,m=y?g:m,d&&u.hasEnd?a.formatRange(p,m,t,{forcedStartTzo:s?null:h.forcedStartTzo,forcedEndTzo:o?null:h.forcedEndTzo}):a.format(p,t,{forcedTzo:s?null:h.forcedStartTzo})):""}function mi(e,t,n){let r=e.eventRange.range;return{isPast:r.end<=(n||t.start),isFuture:r.start>=(n||t.end),isToday:t&&lr(t,r.start)}}function vi(e){let t=["fc-event"];return e.isMirror&&t.push("fc-event-mirror"),e.isDraggable&&t.push("fc-event-draggable"),(e.isStartResizable||e.isEndResizable)&&t.push("fc-event-resizable"),e.isDragging&&t.push("fc-event-dragging"),e.isResizing&&t.push("fc-event-resizing"),e.isSelected&&t.push("fc-event-selected"),e.isStart&&t.push("fc-event-start"),e.isEnd&&t.push("fc-event-end"),e.isPast&&t.push("fc-event-past"),e.isToday&&t.push("fc-event-today"),e.isFuture&&t.push("fc-event-future"),t}function yi(e){return e.instance?e.instance.instanceId:`${e.def.defId}:${e.range.start.toISOString()}`}function bi(e,t){let{def:n,instance:r}=e.eventRange,{url:i}=n;if(i)return{href:i};let{emitter:s,options:o}=t,{eventInteractive:a}=o;return null==a&&(a=n.interactive,null==a&&(a=Boolean(s.hasHandlers("eventClick")))),a?qe(e=>{s.trigger("eventClick",{el:e.target,event:new ti(t,n,r),jsEvent:e,view:t.viewApi})}):{}}const Ei={start:yn,end:yn,allDay:Boolean};function Si(e,t,n){let r=function(e,t){let{refined:n,extra:r}=vn(e,Ei),i=n.start?t.createMarkerMeta(n.start):null,s=n.end?t.createMarkerMeta(n.end):null,{allDay:o}=n;null==o&&(o=i&&i.isTimeUnspecified&&(!s||s.isTimeUnspecified));return Object.assign({range:{start:i?i.marker:null,end:s?s.marker:null},allDay:o},r)}(e,t),{range:i}=r;if(!i.start)return null;if(!i.end){if(null==n)return null;i.end=t.add(i.start,n)}return r}function Ai(e,t){return sr(e.range,t.range)&&e.allDay===t.allDay&&function(e,t){for(let n in t)if("range"!==n&&"allDay"!==n&&e[n]!==t[n])return!1;for(let n in e)if(!(n in t))return!1;return!0}(e,t)}function Di(e,t,n){return Object.assign(Object.assign({},wi(e,t,n)),{timeZone:t.timeZone})}function wi(e,t,n){return{start:t.toDate(e.start),end:t.toDate(e.end),startStr:t.formatIso(e.start,{omitTime:n}),endStr:t.formatIso(e.end,{omitTime:n})}}function Ci(e,t,n){let r=!1,i=function(e){r||(r=!0,t(e))},s=function(e){r||(r=!0,n(e))},o=e(i,s);o&&"function"==typeof o.then&&o.then(i,s)}class Ri extends Error{constructor(e,t){super(e),this.response=t}}function xi(e,t,n){const r={method:e=e.toUpperCase()};return"GET"===e?t+=(-1===t.indexOf("?")?"?":"&")+new URLSearchParams(n):(r.body=new URLSearchParams(n),r.headers={"Content-Type":"application/x-www-form-urlencoded"}),fetch(t,r).then(e=>{if(e.ok)return e.json().then(t=>[t,e],()=>{throw new Ri("Failure parsing JSON",e)});throw new Ri("Request failed",e)})}let _i;function Ti(){return null==_i&&(_i=function(){if("undefined"==typeof document)return!0;let e=document.createElement("div");e.style.position="absolute",e.style.top="0px",e.style.left="0px",e.innerHTML="<table><tr><td><div></div></td></tr></table>",e.querySelector("table").style.height="100px",e.querySelector("div").style.height="100%",document.body.appendChild(e);let t=e.querySelector("div").offsetHeight>0;return document.body.removeChild(e),t}()),_i}class ki extends Gn{constructor(){super(...arguments),this.state={forPrint:!1},this.handleBeforePrint=()=>{jn(()=>{this.setState({forPrint:!0})})},this.handleAfterPrint=()=>{jn(()=>{this.setState({forPrint:!1})})}}render(){let{props:e}=this,{options:t}=e,{forPrint:n}=this.state,r=n||"auto"===t.height||"auto"===t.contentHeight,i=r||null==t.height?"":t.height,s=["fc",n?"fc-media-print":"fc-media-screen","fc-direction-"+t.direction,e.theme.getClass("root")];return Ti()||s.push("fc-liquid-hack"),e.children(s,i,r,n)}componentDidMount(){let{emitter:e}=this.props;e.on("_beforeprint",this.handleBeforePrint),e.on("_afterprint",this.handleAfterPrint)}componentWillUnmount(){let{emitter:e}=this.props;e.off("_beforeprint",this.handleBeforePrint),e.off("_afterprint",this.handleAfterPrint)}}class Mi{constructor(e){this.component=e.component,this.isHitComboAllowed=e.isHitComboAllowed||null}destroy(){}}function Ii(e){return{[e.component.uid]:e}}const Oi={};class Ni{getCurrentData(){return this.currentDataManager.getCurrentData()}dispatch(e){this.currentDataManager.dispatch(e)}get view(){return this.getCurrentData().viewApi}batchRendering(e){e()}updateSize(){this.trigger("_resize",!0)}setOption(e,t){this.dispatch({type:"SET_OPTION",optionName:e,rawOptionValue:t})}getOption(e){return this.currentDataManager.currentCalendarOptionsInput[e]}getAvailableLocaleCodes(){return Object.keys(this.getCurrentData().availableRawLocales)}on(e,t){let{currentDataManager:n}=this;n.currentCalendarOptionsRefiners[e]?n.emitter.on(e,t):console.warn(`Unknown listener name '${e}'`)}off(e,t){this.currentDataManager.emitter.off(e,t)}trigger(e,...t){this.currentDataManager.emitter.trigger(e,...t)}changeView(e,t){this.batchRendering(()=>{if(this.unselect(),t)if(t.start&&t.end)this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e}),this.dispatch({type:"SET_OPTION",optionName:"visibleRange",rawOptionValue:t});else{let{dateEnv:n}=this.getCurrentData();this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e,dateMarker:n.createMarker(t)})}else this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e})})}zoomTo(e,t){let n;t=t||"day",n=this.getCurrentData().viewSpecs[t]||this.getUnitViewSpec(t),this.unselect(),n?this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:n.type,dateMarker:e}):this.dispatch({type:"CHANGE_DATE",dateMarker:e})}getUnitViewSpec(e){let t,n,{viewSpecs:r,toolbarConfig:i}=this.getCurrentData(),s=[].concat(i.header?i.header.viewsWithButtons:[],i.footer?i.footer.viewsWithButtons:[]);for(let e in r)s.push(e);for(t=0;t<s.length;t+=1)if(n=r[s[t]],n&&n.singleUnit===e)return n;return null}prev(){this.unselect(),this.dispatch({type:"PREV"})}next(){this.unselect(),this.dispatch({type:"NEXT"})}prevYear(){let e=this.getCurrentData();this.unselect(),this.dispatch({type:"CHANGE_DATE",dateMarker:e.dateEnv.addYears(e.currentDate,-1)})}nextYear(){let e=this.getCurrentData();this.unselect(),this.dispatch({type:"CHANGE_DATE",dateMarker:e.dateEnv.addYears(e.currentDate,1)})}today(){let e=this.getCurrentData();this.unselect(),this.dispatch({type:"CHANGE_DATE",dateMarker:fr(e.calendarOptions.now,e.dateEnv)})}gotoDate(e){let t=this.getCurrentData();this.unselect(),this.dispatch({type:"CHANGE_DATE",dateMarker:t.dateEnv.createMarker(e)})}incrementDate(e){let t=this.getCurrentData(),n=ft(e);n&&(this.unselect(),this.dispatch({type:"CHANGE_DATE",dateMarker:t.dateEnv.add(t.currentDate,n)}))}getDate(){let e=this.getCurrentData();return e.dateEnv.toDate(e.currentDate)}formatDate(e,t){let{dateEnv:n}=this.getCurrentData();return n.format(n.createMarker(e),an(t))}formatRange(e,t,n){let{dateEnv:r}=this.getCurrentData();return r.formatRange(r.createMarker(e),r.createMarker(t),an(n),n)}formatIso(e,t){let{dateEnv:n}=this.getCurrentData();return n.formatIso(n.createMarker(e),{omitTime:t})}select(e,t){let n;n=null==t?null!=e.start?e:{start:e,end:null}:{start:e,end:t};let r=this.getCurrentData(),i=Si(n,r.dateEnv,ft({days:1}));i&&(this.dispatch({type:"SELECT_DATES",selection:i}),Yr(i,null,r))}unselect(e){let t=this.getCurrentData();t.dateSelection&&(this.dispatch({type:"UNSELECT_DATES"}),function(e,t){t.emitter.trigger("unselect",{jsEvent:e?e.origEvent:null,view:t.viewApi||t.calendarApi.view})}(e,t))}addEvent(e,t){if(e instanceof ti){let t=e._def,n=e._instance;return this.getCurrentData().eventStore.defs[t.defId]||(this.dispatch({type:"ADD_EVENTS",eventStore:Rr({def:t,instance:n})}),this.triggerEventAdd(e)),e}let n,r=this.getCurrentData();if(t instanceof ei)n=t.internalEventSource;else if("boolean"==typeof t)t&&([n]=wn(r.eventSources));else if(null!=t){let e=this.getEventSourceById(t);if(!e)return console.warn(`Could not find an event source with ID "${t}"`),null;n=e.internalEventSource}let i=Sr(e,n,r,!1);if(i){let e=new ti(r,i.def,i.def.recurringDef?null:i.instance);return this.dispatch({type:"ADD_EVENTS",eventStore:Rr(i)}),this.triggerEventAdd(e),e}return null}triggerEventAdd(e){let{emitter:t}=this.getCurrentData();t.trigger("eventAdd",{event:e,relatedEvents:[],revert:()=>{this.dispatch({type:"REMOVE_EVENTS",eventStore:ni(e)})}})}getEventById(e){let t=this.getCurrentData(),{defs:n,instances:r}=t.eventStore;e=String(e);for(let i in n){let s=n[i];if(s.publicId===e){if(s.recurringDef)return new ti(t,s,null);for(let e in r){let n=r[e];if(n.defId===s.defId)return new ti(t,s,n)}}}return null}getEvents(){let e=this.getCurrentData();return ri(e.eventStore,e)}removeAllEvents(){this.dispatch({type:"REMOVE_ALL_EVENTS"})}getEventSources(){let e=this.getCurrentData(),t=e.eventSources,n=[];for(let r in t)n.push(new ei(e,t[r]));return n}getEventSourceById(e){let t=this.getCurrentData(),n=t.eventSources;e=String(e);for(let r in n)if(n[r].publicId===e)return new ei(t,n[r]);return null}addEventSource(e){let t=this.getCurrentData();if(e instanceof ei)return t.eventSources[e.internalEventSource.sourceId]||this.dispatch({type:"ADD_EVENT_SOURCES",sources:[e.internalEventSource]}),e;let n=jr(e,t);return n?(this.dispatch({type:"ADD_EVENT_SOURCES",sources:[n]}),new ei(t,n)):null}removeAllEventSources(){this.dispatch({type:"REMOVE_ALL_EVENT_SOURCES"})}refetchEvents(){this.dispatch({type:"FETCH_EVENT_SOURCES",isRefetch:!0})}scrollToTime(e){let t=ft(e);t&&this.trigger("_scrollRequest",{time:t})}}function Pi(e,t){return e.left>=t.left&&e.left<t.right&&e.top>=t.top&&e.top<t.bottom}function Hi(e,t){let n={left:Math.max(e.left,t.left),right:Math.min(e.right,t.right),top:Math.max(e.top,t.top),bottom:Math.min(e.bottom,t.bottom)};return n.left<n.right&&n.top<n.bottom&&n}function Bi(e,t){return{left:Math.min(Math.max(e.left,t.left),t.right),top:Math.min(Math.max(e.top,t.top),t.bottom)}}function ji(e){return{left:(e.left+e.right)/2,top:(e.top+e.bottom)/2}}function zi(e,t){return{left:e.left-t.left,top:e.top-t.top}}const Ui={defs:{},instances:{}};class Wi{constructor(){this.getKeysForEventDefs=Gt(this._getKeysForEventDefs),this.splitDateSelection=Gt(this._splitDateSpan),this.splitEventStore=Gt(this._splitEventStore),this.splitIndividualUi=Gt(this._splitIndividualUi),this.splitEventDrag=Gt(this._splitInteraction),this.splitEventResize=Gt(this._splitInteraction),this.eventUiBuilders={}}splitProps(e){let t=this.getKeyInfo(e),n=this.getKeysForEventDefs(e.eventStore),r=this.splitDateSelection(e.dateSelection),i=this.splitIndividualUi(e.eventUiBases,n),s=this.splitEventStore(e.eventStore,n),o=this.splitEventDrag(e.eventDrag),a=this.splitEventResize(e.eventResize),l={};this.eventUiBuilders=An(t,(e,t)=>this.eventUiBuilders[t]||Gt(Li));for(let n in t){let c=t[n],d=s[n]||Ui,u=this.eventUiBuilders[n];l[n]={businessHours:c.businessHours||e.businessHours,dateSelection:r[n]||null,eventStore:d,eventUiBases:u(e.eventUiBases[""],c.ui,i[n]),eventSelection:d.instances[e.eventSelection]?e.eventSelection:"",eventDrag:o[n]||null,eventResize:a[n]||null}}return l}_splitDateSpan(e){let t={};if(e){let n=this.getKeysForDateSpan(e);for(let r of n)t[r]=e}return t}_getKeysForEventDefs(e){return An(e.defs,e=>this.getKeysForEventDef(e))}_splitEventStore(e,t){let{defs:n,instances:r}=e,i={};for(let e in n)for(let r of t[e])i[r]||(i[r]={defs:{},instances:{}}),i[r].defs[e]=n[e];for(let e in r){let n=r[e];for(let r of t[n.defId])i[r]&&(i[r].instances[e]=n)}return i}_splitIndividualUi(e,t){let n={};for(let r in e)if(r)for(let i of t[r])n[i]||(n[i]={}),n[i][r]=e[r];return n}_splitInteraction(e){let t={};if(e){let n=this._splitEventStore(e.affectedEvents,this._getKeysForEventDefs(e.affectedEvents)),r=this._getKeysForEventDefs(e.mutatedEvents),i=this._splitEventStore(e.mutatedEvents,r),s=r=>{t[r]||(t[r]={affectedEvents:n[r]||Ui,mutatedEvents:i[r]||Ui,isEvent:e.isEvent})};for(let e in n)s(e);for(let e in i)s(e)}return t}}function Li(e,t,n){let r=[];e&&r.push(e),t&&r.push(t);let i={"":Pr(r)};return n&&Object.assign(i,n),i}function Fi(e,t,n,r){return{dow:e.getUTCDay(),isDisabled:Boolean(r&&!lr(r.activeRange,e)),isOther:Boolean(r&&!lr(r.currentRange,e)),isToday:Boolean(t&&lr(t,e)),isPast:Boolean(n?e<n:!!t&&e<t.start),isFuture:Boolean(n?e>n:!!t&&e>=t.end)}}function Vi(e,t){let n=["fc-day","fc-day-"+At[e.dow]];return e.isDisabled?n.push("fc-day-disabled"):(e.isToday&&(n.push("fc-day-today"),n.push(t.getClass("today"))),e.isPast&&n.push("fc-day-past"),e.isFuture&&n.push("fc-day-future"),e.isOther&&n.push("fc-day-other")),n}const Gi=an({year:"numeric",month:"long",day:"numeric"}),Qi=an({week:"long"});function qi(e,t,n="day",r=!0){const{dateEnv:i,options:s,calendarApi:o}=e;let a=i.format(t,"week"===n?Qi:Gi);if(s.navLinks){let e=i.toDate(t);const l=e=>{let r="day"===n?s.navLinkDayClick:"week"===n?s.navLinkWeekClick:null;"function"==typeof r?r.call(o,i.toDate(t),e):("string"==typeof r&&(n=r),o.zoomTo(t,n))};return Object.assign({title:at(s.navLinkHint,[a,e],a),"data-navlink":""},r?Qe(l):{onClick:l})}return{"aria-label":a}}let Yi,Zi=null;function Xi(){return null===Zi&&(Zi=function(){let e=document.createElement("div");Be(e,{position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}),e.innerHTML="<div></div>",document.body.appendChild(e);let t=e.firstChild.getBoundingClientRect().left>e.getBoundingClientRect().left;return Ie(e),t}()),Zi}function $i(){return Yi||(Yi=function(){let e=document.createElement("div");e.style.overflow="scroll",e.style.position="absolute",e.style.top="-9999px",e.style.left="-9999px",document.body.appendChild(e);let t=Ji(e);return document.body.removeChild(e),t}()),Yi}function Ji(e){return{x:e.offsetHeight-e.clientHeight,y:e.offsetWidth-e.clientWidth}}function Ki(e,t=!1){let n=window.getComputedStyle(e),r=parseInt(n.borderLeftWidth,10)||0,i=parseInt(n.borderRightWidth,10)||0,s=parseInt(n.borderTopWidth,10)||0,o=parseInt(n.borderBottomWidth,10)||0,a=Ji(e),l=a.y-r-i,c={borderLeft:r,borderRight:i,borderTop:s,borderBottom:o,scrollbarBottom:a.x-s-o,scrollbarLeft:0,scrollbarRight:0};return Xi()&&"rtl"===n.direction?c.scrollbarLeft=l:c.scrollbarRight=l,t&&(c.paddingLeft=parseInt(n.paddingLeft,10)||0,c.paddingRight=parseInt(n.paddingRight,10)||0,c.paddingTop=parseInt(n.paddingTop,10)||0,c.paddingBottom=parseInt(n.paddingBottom,10)||0),c}function es(e,t=!1,n){let r=n?e.getBoundingClientRect():ts(e),i=Ki(e,t),s={left:r.left+i.borderLeft+i.scrollbarLeft,right:r.right-i.borderRight-i.scrollbarRight,top:r.top+i.borderTop,bottom:r.bottom-i.borderBottom-i.scrollbarBottom};return t&&(s.left+=i.paddingLeft,s.right-=i.paddingRight,s.top+=i.paddingTop,s.bottom-=i.paddingBottom),s}function ts(e){let t=e.getBoundingClientRect();return{left:t.left+window.pageXOffset,top:t.top+window.pageYOffset,right:t.right+window.pageXOffset,bottom:t.bottom+window.pageYOffset}}function ns(e){let t=[];for(;e instanceof HTMLElement;){let n=window.getComputedStyle(e);if("fixed"===n.position)break;/(auto|scroll)/.test(n.overflow+n.overflowY+n.overflowX)&&t.push(e),e=e.parentNode}return t}class rs{constructor(e,t,n,r){this.els=t;let i=this.originClientRect=e.getBoundingClientRect();n&&this.buildElHorizontals(i.left),r&&this.buildElVerticals(i.top)}buildElHorizontals(e){let t=[],n=[];for(let r of this.els){let i=r.getBoundingClientRect();t.push(i.left-e),n.push(i.right-e)}this.lefts=t,this.rights=n}buildElVerticals(e){let t=[],n=[];for(let r of this.els){let i=r.getBoundingClientRect();t.push(i.top-e),n.push(i.bottom-e)}this.tops=t,this.bottoms=n}leftToIndex(e){let t,{lefts:n,rights:r}=this,i=n.length;for(t=0;t<i;t+=1)if(e>=n[t]&&e<r[t])return t}topToIndex(e){let t,{tops:n,bottoms:r}=this,i=n.length;for(t=0;t<i;t+=1)if(e>=n[t]&&e<r[t])return t}getWidth(e){return this.rights[e]-this.lefts[e]}getHeight(e){return this.bottoms[e]-this.tops[e]}similarTo(e){return is(this.tops||[],e.tops||[])&&is(this.bottoms||[],e.bottoms||[])&&is(this.lefts||[],e.lefts||[])&&is(this.rights||[],e.rights||[])}}function is(e,t){const n=e.length;if(n!==t.length)return!1;for(let r=0;r<n;r++)if(Math.round(e[r])!==Math.round(t[r]))return!1;return!0}class ss{getMaxScrollTop(){return this.getScrollHeight()-this.getClientHeight()}getMaxScrollLeft(){return this.getScrollWidth()-this.getClientWidth()}canScrollVertically(){return this.getMaxScrollTop()>0}canScrollHorizontally(){return this.getMaxScrollLeft()>0}canScrollUp(){return this.getScrollTop()>0}canScrollDown(){return this.getScrollTop()<this.getMaxScrollTop()}canScrollLeft(){return this.getScrollLeft()>0}canScrollRight(){return this.getScrollLeft()<this.getMaxScrollLeft()}}class os extends ss{constructor(e){super(),this.el=e}getScrollTop(){return this.el.scrollTop}getScrollLeft(){return this.el.scrollLeft}setScrollTop(e){this.el.scrollTop=e}setScrollLeft(e){this.el.scrollLeft=e}getScrollWidth(){return this.el.scrollWidth}getScrollHeight(){return this.el.scrollHeight}getClientHeight(){return this.el.clientHeight}getClientWidth(){return this.el.clientWidth}}class as extends ss{getScrollTop(){return window.pageYOffset}getScrollLeft(){return window.pageXOffset}setScrollTop(e){window.scroll(window.pageXOffset,e)}setScrollLeft(e){window.scroll(e,window.pageYOffset)}getScrollWidth(){return document.documentElement.scrollWidth}getScrollHeight(){return document.documentElement.scrollHeight}getClientHeight(){return document.documentElement.clientHeight}getClientWidth(){return document.documentElement.clientWidth}}class ls extends Gn{constructor(){super(...arguments),this.uid=Ze()}prepareHits(){}queryHit(e,t,n,r){return null}isValidSegDownEl(e){return!this.props.eventDrag&&!this.props.eventResize&&!Oe(e,".fc-event-mirror")}isValidDateDownEl(e){return!(Oe(e,".fc-event:not(.fc-bg-event)")||Oe(e,".fc-more-link")||Oe(e,"a[data-navlink]")||Oe(e,".fc-popover"))}}class cs{constructor(e=(e=>e.thickness||1)){this.getEntryThickness=e,this.strictOrder=!1,this.allowReslicing=!1,this.maxCoord=-1,this.maxStackCnt=-1,this.levelCoords=[],this.entriesByLevel=[],this.stackCnts={}}addSegs(e){let t=[];for(let n of e)this.insertEntry(n,t);return t}insertEntry(e,t){let n=this.findInsertion(e);this.isInsertionValid(n,e)?this.insertEntryAt(e,n):this.handleInvalidInsertion(n,e,t)}isInsertionValid(e,t){return(-1===this.maxCoord||e.levelCoord+this.getEntryThickness(t)<=this.maxCoord)&&(-1===this.maxStackCnt||e.stackCnt<this.maxStackCnt)}handleInvalidInsertion(e,t,n){if(this.allowReslicing&&e.touchingEntry){const r=Object.assign(Object.assign({},t),{span:fs(t.span,e.touchingEntry.span)});n.push(r),this.splitEntry(t,e.touchingEntry,n)}else n.push(t)}splitEntry(e,t,n){let r=e.span,i=t.span;r.start<i.start&&this.insertEntry({index:e.index,thickness:e.thickness,span:{start:r.start,end:i.start}},n),r.end>i.end&&this.insertEntry({index:e.index,thickness:e.thickness,span:{start:i.end,end:r.end}},n)}insertEntryAt(e,t){let{entriesByLevel:n,levelCoords:r}=this;-1===t.lateral?(gs(r,t.level,t.levelCoord),gs(n,t.level,[e])):gs(n[t.level],t.lateral,e),this.stackCnts[us(e)]=t.stackCnt}findInsertion(e){let{levelCoords:t,entriesByLevel:n,strictOrder:r,stackCnts:i}=this,s=t.length,o=0,a=-1,l=-1,c=null,d=0;for(let u=0;u<s;u+=1){const s=t[u];if(!r&&s>=o+this.getEntryThickness(e))break;let h,f=n[u],g=ps(f,e.span.start,ds),p=g[0]+g[1];for(;(h=f[p])&&h.span.start<e.span.end;){let e=s+this.getEntryThickness(h);e>o&&(o=e,c=h,a=u,l=p),e===o&&(d=Math.max(d,i[us(h)]+1)),p+=1}}let u=0;if(c)for(u=a+1;u<s&&t[u]<o;)u+=1;let h=-1;return u<s&&t[u]===o&&(h=ps(n[u],e.span.end,ds)[0]),{touchingLevel:a,touchingLateral:l,touchingEntry:c,stackCnt:d,levelCoord:o,level:u,lateral:h}}toRects(){let{entriesByLevel:e,levelCoords:t}=this,n=e.length,r=[];for(let i=0;i<n;i+=1){let n=e[i],s=t[i];for(let e of n)r.push(Object.assign(Object.assign({},e),{thickness:this.getEntryThickness(e),levelCoord:s}))}return r}}function ds(e){return e.span.end}function us(e){return e.index+":"+e.span.start}function hs(e){let t=[];for(let i of e){let e=[],s={span:i.span,entries:[i]};for(let i of t)fs(i.span,s.span)?s={entries:i.entries.concat(s.entries),span:(n=i.span,r=s.span,{start:Math.min(n.start,r.start),end:Math.max(n.end,r.end)})}:e.push(i);e.push(s),t=e}var n,r;return t}function fs(e,t){let n=Math.max(e.start,t.start),r=Math.min(e.end,t.end);return n<r?{start:n,end:r}:null}function gs(e,t,n){e.splice(t,0,n)}function ps(e,t,n){let r=0,i=e.length;if(!i||t<n(e[r]))return[0,0];if(t>n(e[i-1]))return[i,0];for(;r<i;){let s=Math.floor(r+(i-r)/2),o=n(e[s]);if(t<o)i=s;else{if(!(t>o))return[s,1];r=s+1}}return[r,0]}class ms{constructor(e,t){this.emitter=new Gr}destroy(){}setMirrorIsVisible(e){}setMirrorNeedsRevert(e){}setAutoScrollEnabled(e){}}const vs={},ys={startTime:ft,duration:ft,create:Boolean,sourceId:String};function bs(e){let{refined:t,extra:n}=vn(e,ys);return{startTime:t.startTime||null,duration:t.duration||null,create:null==t.create||t.create,sourceId:t.sourceId,leftoverProps:n}}function Es(e,t){return an(!e||t>10?{weekday:"short"}:t>1?{weekday:"short",month:"numeric",day:"numeric",omitCommas:!0}:{weekday:"long"})}const Ss="fc-col-header-cell";function As(e){return e.text}class Ds extends Gn{render(){let{dateEnv:e,options:t,theme:n,viewApi:r}=this.context,{props:i}=this,{date:s,dateProfile:o}=i,a=Fi(s,i.todayRange,null,o),l=[Ss].concat(Vi(a,n)),c=e.format(s,i.dayHeaderFormat),d=!a.isDisabled&&i.colCnt>1?qi(this.context,s):{},u=Object.assign(Object.assign(Object.assign({date:e.toDate(s),view:r},i.extraRenderProps),{text:c}),a);return p(Jn,{elTag:"th",elClasses:l,elAttrs:Object.assign({role:"columnheader",colSpan:i.colSpan,"data-date":a.isDisabled?void 0:Wt(s)},i.extraDataAttrs),renderProps:u,generatorName:"dayHeaderContent",customGenerator:t.dayHeaderContent,defaultGenerator:As,classNameGenerator:t.dayHeaderClassNames,didMount:t.dayHeaderDidMount,willUnmount:t.dayHeaderWillUnmount},e=>p("div",{className:"fc-scrollgrid-sync-inner"},!a.isDisabled&&p(e,{elTag:"a",elAttrs:d,elClasses:["fc-col-header-cell-cushion",i.isSticky&&"fc-sticky"]})))}}const ws=an({weekday:"long"});class Cs extends Gn{render(){let{props:e}=this,{dateEnv:t,theme:n,viewApi:r,options:i}=this.context,s=wt(new Date(2592e5),e.dow),o={dow:e.dow,isDisabled:!1,isFuture:!1,isPast:!1,isToday:!1,isOther:!1},a=t.format(s,e.dayHeaderFormat),l=Object.assign(Object.assign(Object.assign(Object.assign({date:s},o),{view:r}),e.extraRenderProps),{text:a});return p(Jn,{elTag:"th",elClasses:[Ss,...Vi(o,n),...e.extraClassNames||[]],elAttrs:Object.assign({role:"columnheader",colSpan:e.colSpan},e.extraDataAttrs),renderProps:l,generatorName:"dayHeaderContent",customGenerator:i.dayHeaderContent,defaultGenerator:As,classNameGenerator:i.dayHeaderClassNames,didMount:i.dayHeaderDidMount,willUnmount:i.dayHeaderWillUnmount},n=>p("div",{className:"fc-scrollgrid-sync-inner"},p(n,{elTag:"a",elClasses:["fc-col-header-cell-cushion",e.isSticky&&"fc-sticky"],elAttrs:{"aria-label":t.format(s,ws)}})))}}class Rs extends D{constructor(e,t){super(e,t),this.initialNowDate=fr(t.options.now,t.dateEnv),this.initialNowQueriedMs=(new Date).valueOf(),this.state=this.computeTiming().currentState}render(){let{props:e,state:t}=this;return e.children(t.nowDate,t.todayRange)}componentDidMount(){this.setTimeout()}componentDidUpdate(e){e.unit!==this.props.unit&&(this.clearTimeout(),this.setTimeout())}componentWillUnmount(){this.clearTimeout()}computeTiming(){let{props:e,context:t}=this,n=Ct(this.initialNowDate,(new Date).valueOf()-this.initialNowQueriedMs),r=t.dateEnv.startOf(n,e.unit),i=t.dateEnv.add(r,ft(1,e.unit)),s=i.valueOf()-n.valueOf();return s=Math.min(864e5,s),{currentState:{nowDate:r,todayRange:xs(r)},nextState:{nowDate:i,todayRange:xs(i)},waitMs:s}}setTimeout(){let{nextState:e,waitMs:t}=this.computeTiming();this.timeoutId=setTimeout(()=>{this.setState(e,()=>{this.setTimeout()})},t)}clearTimeout(){this.timeoutId&&clearTimeout(this.timeoutId)}}function xs(e){let t=Mt(e);return{start:t,end:wt(t,1)}}Rs.contextType=Ln;class _s extends Gn{constructor(){super(...arguments),this.createDayHeaderFormatter=Gt(Ts)}render(){let{context:e}=this,{dates:t,dateProfile:n,datesRepDistinctDays:r,renderIntro:i}=this.props,s=this.createDayHeaderFormatter(e.options.dayHeaderFormat,r,t.length);return p(Rs,{unit:"day"},(e,o)=>p("tr",{role:"row"},i&&i("day"),t.map(e=>r?p(Ds,{key:e.toISOString(),date:e,dateProfile:n,todayRange:o,colCnt:t.length,dayHeaderFormat:s}):p(Cs,{key:e.getUTCDay(),dow:e.getUTCDay(),dayHeaderFormat:s}))))}}function Ts(e,t,n){return e||Es(t,n)}class ks{constructor(e,t){let n=e.start,{end:r}=e,i=[],s=[],o=-1;for(;n<r;)t.isHiddenDay(n)?i.push(o+.5):(o+=1,i.push(o),s.push(n)),n=wt(n,1);this.dates=s,this.indices=i,this.cnt=s.length}sliceRange(e){let t=this.getDateDayIndex(e.start),n=this.getDateDayIndex(wt(e.end,-1)),r=Math.max(0,t),i=Math.min(this.cnt-1,n);return r=Math.ceil(r),i=Math.floor(i),r<=i?{firstIndex:r,lastIndex:i,isStart:t===r,isEnd:n===i}:null}getDateDayIndex(e){let{indices:t}=this,n=Math.floor(xt(this.dates[0],e));return n<0?t[0]-1:n>=t.length?t[t.length-1]+1:t[n]}}class Ms{constructor(e,t){let n,r,i,{dates:s}=e;if(t){for(r=s[0].getUTCDay(),n=1;n<s.length&&s[n].getUTCDay()!==r;n+=1);i=Math.ceil(s.length/n)}else i=1,n=s.length;this.rowCnt=i,this.colCnt=n,this.daySeries=e,this.cells=this.buildCells(),this.headerDates=this.buildHeaderDates()}buildCells(){let e=[];for(let t=0;t<this.rowCnt;t+=1){let n=[];for(let e=0;e<this.colCnt;e+=1)n.push(this.buildCell(t,e));e.push(n)}return e}buildCell(e,t){let n=this.daySeries.dates[e*this.colCnt+t];return{key:n.toISOString(),date:n}}buildHeaderDates(){let e=[];for(let t=0;t<this.colCnt;t+=1)e.push(this.cells[0][t].date);return e}sliceRange(e){let{colCnt:t}=this,n=this.daySeries.sliceRange(e),r=[];if(n){let{firstIndex:e,lastIndex:i}=n,s=e;for(;s<=i;){let o=Math.floor(s/t),a=Math.min((o+1)*t,i+1);r.push({row:o,firstCol:s%t,lastCol:(a-1)%t,isStart:n.isStart&&s===e,isEnd:n.isEnd&&a-1===i}),s=a}}return r}}class Is{constructor(){this.sliceBusinessHours=Gt(this._sliceBusinessHours),this.sliceDateSelection=Gt(this._sliceDateSpan),this.sliceEventStore=Gt(this._sliceEventStore),this.sliceEventDrag=Gt(this._sliceInteraction),this.sliceEventResize=Gt(this._sliceInteraction),this.forceDayIfListItem=!1}sliceProps(e,t,n,r,...i){let{eventUiBases:s}=e,o=this.sliceEventStore(e.eventStore,s,t,n,...i);return{dateSelectionSegs:this.sliceDateSelection(e.dateSelection,t,n,s,r,...i),businessHourSegs:this.sliceBusinessHours(e.businessHours,t,n,r,...i),fgEventSegs:o.fg,bgEventSegs:o.bg,eventDrag:this.sliceEventDrag(e.eventDrag,s,t,n,...i),eventResize:this.sliceEventResize(e.eventResize,s,t,n,...i),eventSelection:e.eventSelection}}sliceNowDate(e,t,n,r,...i){return this._sliceDateSpan({range:{start:e,end:Ct(e,1)},allDay:!1},t,n,{},r,...i)}_sliceBusinessHours(e,t,n,r,...i){return e?this._sliceEventStore(mr(e,Os(t,Boolean(n)),r),{},t,n,...i).bg:[]}_sliceEventStore(e,t,n,r,...i){if(e){let s=ii(e,t,Os(n,Boolean(r)),r);return{bg:this.sliceEventRanges(s.bg,i),fg:this.sliceEventRanges(s.fg,i)}}return{bg:[],fg:[]}}_sliceInteraction(e,t,n,r,...i){if(!e)return null;let s=ii(e.mutatedEvents,t,Os(n,Boolean(r)),r);return{segs:this.sliceEventRanges(s.fg,i),affectedInstances:e.affectedEvents.instances,isEvent:e.isEvent}}_sliceDateSpan(e,t,n,r,i,...s){if(!e)return[];let o=Os(t,Boolean(n)),a=ir(e.range,o);if(a){let t=function(e,t,n){let r=Ar({editable:!1},n),i=wr(r.refined,r.extra,"",e.allDay,!0,n);return{def:i,ui:ci(i,t),instance:pr(i.defId,e.range),range:e.range,isStart:!0,isEnd:!0}}(e=Object.assign(Object.assign({},e),{range:a}),r,i),n=this.sliceRange(e.range,...s);for(let e of n)e.eventRange=t;return n}return[]}sliceEventRanges(e,t){let n=[];for(let r of e)n.push(...this.sliceEventRange(r,t));return n}sliceEventRange(e,t){let n=e.range;this.forceDayIfListItem&&"list-item"===e.ui.display&&(n={start:n.start,end:wt(n.start,1)});let r=this.sliceRange(n,...t);for(let t of r)t.eventRange=e,t.isStart=e.isStart&&t.isStart,t.isEnd=e.isEnd&&t.isEnd;return r}}function Os(e,t){let n=e.activeRange;return t?n:{start:Ct(n.start,e.slotMinTime.milliseconds),end:Ct(n.end,e.slotMaxTime.milliseconds-864e5)}}function Ns(e,t,n){let{instances:r}=e.mutatedEvents;for(let e in r)if(!ar(t.validRange,r[e].range))return!1;return Hs({eventDrag:e},n)}function Ps(e,t,n){return!!ar(t.validRange,e.range)&&Hs({dateSelection:e},n)}function Hs(e,t){let n=t.getCurrentData(),r=Object.assign({businessHours:n.businessHours,dateSelection:"",eventStore:n.eventStore,eventUiBases:n.eventUiBases,eventSelection:"",eventDrag:null,eventResize:null},e);return(t.pluginHooks.isPropsValid||Bs)(r,t)}function Bs(e,t,n={},r){return!(e.eventDrag&&!function(e,t,n,r){let i=t.getCurrentData(),s=e.eventDrag,o=s.mutatedEvents,a=o.defs,l=o.instances,c=li(a,s.isEvent?e.eventUiBases:{"":i.selectionConfig});r&&(c=An(c,r));let d=(g=e.eventStore,p=s.affectedEvents.instances,{defs:g.defs,instances:Sn(g.instances,e=>!p[e.instanceId])}),u=d.defs,h=d.instances,f=li(u,e.eventUiBases);var g,p;for(let r in l){let o=l[r],g=o.range,p=c[o.defId],m=a[o.defId];if(!js(p.constraints,g,d,e.businessHours,t))return!1;let{eventOverlap:v}=t.options,y="function"==typeof v?v:null;for(let e in h){let n=h[e];if(or(g,n.range)){if(!1===f[n.defId].overlap&&s.isEvent)return!1;if(!1===p.overlap)return!1;if(y&&!y(new ti(t,u[n.defId],n),new ti(t,m,o)))return!1}}let b=i.eventStore;for(let e of p.allows){let i,s=Object.assign(Object.assign({},n),{range:o.range,allDay:m.allDay}),a=b.defs[m.defId],l=b.instances[r];if(i=a?new ti(t,a,l):new ti(t,m),!e(Zr(s,t),i))return!1}}return!0}(e,t,n,r))&&!(e.dateSelection&&!function(e,t,n,r){let i=e.eventStore,s=i.defs,o=i.instances,a=e.dateSelection,l=a.range,{selectionConfig:c}=t.getCurrentData();r&&(c=r(c));if(!js(c.constraints,l,i,e.businessHours,t))return!1;let{selectOverlap:d}=t.options,u="function"==typeof d?d:null;for(let e in o){let n=o[e];if(or(l,n.range)){if(!1===c.overlap)return!1;if(u&&!u(new ti(t,s[n.defId],n),null))return!1}}for(let e of c.allows){let r=Object.assign(Object.assign({},n),a);if(!e(Zr(r,t),null))return!1}return!0}(e,t,n,r))}function js(e,t,n,r,i){for(let s of e)if(!Ws(zs(s,t,n,r,i),t))return!1;return!0}function zs(e,t,n,r,i){return"businessHours"===e?Us(mr(r,t,i)):"string"==typeof e?Us(kr(n,t=>t.groupId===e)):"object"==typeof e&&e?Us(mr(e,t,i)):[]}function Us(e){let{instances:t}=e,n=[];for(let e in t)n.push(t[e].range);return n}function Ws(e,t){for(let n of e)if(ar(n,t))return!0;return!1}const Ls=/^(visible|hidden)$/;class Fs extends Gn{constructor(){super(...arguments),this.handleEl=e=>{this.el=e,Qn(this.props.elRef,e)}}render(){let{props:e}=this,{liquid:t,liquidIsAbsolute:n}=e,r=t&&n,i=["fc-scroller"];return t&&(n?i.push("fc-scroller-liquid-absolute"):i.push("fc-scroller-liquid")),p("div",{ref:this.handleEl,className:i.join(" "),style:{overflowX:e.overflowX,overflowY:e.overflowY,left:r&&-(e.overcomeLeft||0)||"",right:r&&-(e.overcomeRight||0)||"",bottom:r&&-(e.overcomeBottom||0)||"",marginLeft:!r&&-(e.overcomeLeft||0)||"",marginRight:!r&&-(e.overcomeRight||0)||"",marginBottom:!r&&-(e.overcomeBottom||0)||"",maxHeight:e.maxHeight||""}},e.children)}needsXScrolling(){if(Ls.test(this.props.overflowX))return!1;let{el:e}=this,t=this.el.getBoundingClientRect().width-this.getYScrollbarWidth(),{children:n}=e;for(let e=0;e<n.length;e+=1){if(n[e].getBoundingClientRect().width>t)return!0}return!1}needsYScrolling(){if(Ls.test(this.props.overflowY))return!1;let{el:e}=this,t=this.el.getBoundingClientRect().height-this.getXScrollbarWidth(),{children:n}=e;for(let e=0;e<n.length;e+=1){if(n[e].getBoundingClientRect().height>t)return!0}return!1}getXScrollbarWidth(){return Ls.test(this.props.overflowX)?0:this.el.offsetHeight-this.el.clientHeight}getYScrollbarWidth(){return Ls.test(this.props.overflowY)?0:this.el.offsetWidth-this.el.clientWidth}}class Vs{constructor(e){this.masterCallback=e,this.currentMap={},this.depths={},this.callbackMap={},this.handleValue=(e,t)=>{let{depths:n,currentMap:r}=this,i=!1,s=!1;null!==e?(i=t in r,r[t]=e,n[t]=(n[t]||0)+1,s=!0):(n[t]-=1,n[t]||(delete r[t],delete this.callbackMap[t],i=!0)),this.masterCallback&&(i&&this.masterCallback(null,String(t)),s&&this.masterCallback(e,String(t)))}}createRef(e){let t=this.callbackMap[e];return t||(t=this.callbackMap[e]=t=>{this.handleValue(t,String(e))}),t}collect(e,t,n){return kn(this.currentMap,e,t,n)}getAll(){return wn(this.currentMap)}}function Gs(e){let t=Pe(e,".fc-scrollgrid-shrink"),n=0;for(let e of t)n=Math.max(n,dt(e));return Math.ceil(n)}function Qs(e,t){return e.liquid&&t.liquid}function qs(e,t){return null!=t.maxHeight||Qs(e,t)}function Ys(e,t,n,r){let{expandRows:i}=n;return"function"==typeof t.content?t.content(n):p("table",{role:"presentation",className:[t.tableClassName,e.syncRowHeights?"fc-scrollgrid-sync-table":""].join(" "),style:{minWidth:n.tableMinWidth,width:n.clientWidth,height:i?n.clientHeight:""}},n.tableColGroupNode,p(r?"thead":"tbody",{role:"presentation"},"function"==typeof t.rowContent?t.rowContent(n):t.rowContent))}function Zs(e,t){return St(e,t,Cn)}function Xs(e,t){let n=[];for(let r of e){let e=r.span||1;for(let i=0;i<e;i+=1)n.push(p("col",{style:{width:"shrink"===r.width?$s(t):r.width||"",minWidth:r.minWidth||""}}))}return p("colgroup",{},...n)}function $s(e){return null==e?4:e}function Js(e){for(let t of e)if("shrink"===t.width)return!0;return!1}function Ks(e,t){let n=["fc-scrollgrid",t.theme.getClass("table")];return e&&n.push("fc-scrollgrid-liquid"),n}function eo(e,t){let n=["fc-scrollgrid-section","fc-scrollgrid-section-"+e.type,e.className];return t&&e.liquid&&null==e.maxHeight&&n.push("fc-scrollgrid-section-liquid"),e.isSticky&&n.push("fc-scrollgrid-section-sticky"),n}function to(e){return p("div",{className:"fc-scrollgrid-sticky-shim",style:{width:e.clientWidth,minWidth:e.tableMinWidth}})}function no(e){let{stickyHeaderDates:t}=e;return null!=t&&"auto"!==t||(t="auto"===e.height||"auto"===e.viewHeight),t}function ro(e){let{stickyFooterScrollbar:t}=e;return null!=t&&"auto"!==t||(t="auto"===e.height||"auto"===e.viewHeight),t}class io extends Gn{constructor(){super(...arguments),this.processCols=Gt(e=>e,Zs),this.renderMicroColGroup=Gt(Xs),this.scrollerRefs=new Vs,this.scrollerElRefs=new Vs(this._handleScrollerEl.bind(this)),this.state={shrinkWidth:null,forceYScrollbars:!1,scrollerClientWidths:{},scrollerClientHeights:{}},this.handleSizing=()=>{this.safeSetState(Object.assign({shrinkWidth:this.computeShrinkWidth()},this.computeScrollerDims()))}}render(){let{props:e,state:t,context:n}=this,r=e.sections||[],i=this.processCols(e.cols),s=this.renderMicroColGroup(i,t.shrinkWidth),o=Ks(e.liquid,n);e.collapsibleWidth&&o.push("fc-scrollgrid-collapsible");let a,l=r.length,c=0,d=[],u=[],h=[];for(;c<l&&"header"===(a=r[c]).type;)d.push(this.renderSection(a,s,!0)),c+=1;for(;c<l&&"body"===(a=r[c]).type;)u.push(this.renderSection(a,s,!1)),c+=1;for(;c<l&&"footer"===(a=r[c]).type;)h.push(this.renderSection(a,s,!0)),c+=1;let f=!Ti();const g={role:"rowgroup"};return p("table",{role:"grid",className:o.join(" "),style:{height:e.height}},Boolean(!f&&d.length)&&p("thead",g,...d),Boolean(!f&&u.length)&&p("tbody",g,...u),Boolean(!f&&h.length)&&p("tfoot",g,...h),f&&p("tbody",g,...d,...u,...h))}renderSection(e,t,n){return"outerContent"in e?p(y,{key:e.key},e.outerContent):p("tr",{key:e.key,role:"presentation",className:eo(e,this.props.liquid).join(" ")},this.renderChunkTd(e,t,e.chunk,n))}renderChunkTd(e,t,n,r){if("outerContent"in n)return n.outerContent;let{props:i}=this,{forceYScrollbars:s,scrollerClientWidths:o,scrollerClientHeights:a}=this.state,l=qs(i,e),c=Qs(i,e),d=i.liquid?s?"scroll":l?"auto":"hidden":"visible",u=e.key,h=Ys(e,n,{tableColGroupNode:t,tableMinWidth:"",clientWidth:i.collapsibleWidth||void 0===o[u]?null:o[u],clientHeight:void 0!==a[u]?a[u]:null,expandRows:e.expandRows,syncRowHeights:!1,rowSyncHeights:[],reportRowHeightChange:()=>{}},r);return p(r?"th":"td",{ref:n.elRef,role:"presentation"},p("div",{className:"fc-scroller-harness"+(c?" fc-scroller-harness-liquid":"")},p(Fs,{ref:this.scrollerRefs.createRef(u),elRef:this.scrollerElRefs.createRef(u),overflowY:d,overflowX:i.liquid?"hidden":"visible",maxHeight:e.maxHeight,liquid:c,liquidIsAbsolute:!0},h)))}_handleScrollerEl(e,t){let n=function(e,t){for(let n of e)if(n.key===t)return n;return null}(this.props.sections,t);n&&Qn(n.chunk.scrollerElRef,e)}componentDidMount(){this.handleSizing(),this.context.addResizeHandler(this.handleSizing)}componentDidUpdate(){this.handleSizing()}componentWillUnmount(){this.context.removeResizeHandler(this.handleSizing)}computeShrinkWidth(){return Js(this.props.cols)?Gs(this.scrollerElRefs.getAll()):0}computeScrollerDims(){let e=$i(),{scrollerRefs:t,scrollerElRefs:n}=this,r=!1,i={},s={};for(let e in t.currentMap){let n=t.currentMap[e];if(n&&n.needsYScrolling()){r=!0;break}}for(let t of this.props.sections){let o=t.key,a=n.currentMap[o];if(a){let t=a.parentNode;i[o]=Math.floor(t.getBoundingClientRect().width-(r?e.y:0)),s[o]=Math.floor(t.getBoundingClientRect().height)}}return{forceYScrollbars:r,scrollerClientWidths:i,scrollerClientHeights:s}}}io.addStateEquality({scrollerClientWidths:Cn,scrollerClientHeights:Cn});class so extends Gn{constructor(){super(...arguments),this.handleEl=e=>{this.el=e,e&&oi(e,this.props.seg)}}render(){const{props:e,context:t}=this,{options:n}=t,{seg:r}=e,{eventRange:i}=r,{ui:s}=i,o={event:new ti(t,i.def,i.instance),view:t.viewApi,timeText:e.timeText,textColor:s.textColor,backgroundColor:s.backgroundColor,borderColor:s.borderColor,isDraggable:!e.disableDragging&&hi(r,t),isStartResizable:!e.disableResizing&&fi(r,t),isEndResizable:!e.disableResizing&&gi(r),isMirror:Boolean(e.isDragging||e.isResizing||e.isDateSelecting),isStart:Boolean(r.isStart),isEnd:Boolean(r.isEnd),isPast:Boolean(e.isPast),isFuture:Boolean(e.isFuture),isToday:Boolean(e.isToday),isSelected:Boolean(e.isSelected),isDragging:Boolean(e.isDragging),isResizing:Boolean(e.isResizing)};return p(Jn,Object.assign({},e,{elRef:this.handleEl,elClasses:[...vi(o),...r.eventRange.ui.classNames,...e.elClasses||[]],renderProps:o,generatorName:"eventContent",customGenerator:n.eventContent,defaultGenerator:e.defaultGenerator,classNameGenerator:n.eventClassNames,didMount:n.eventDidMount,willUnmount:n.eventWillUnmount}))}componentDidUpdate(e){this.el&&this.props.seg!==e.seg&&oi(this.el,this.props.seg)}}class oo extends Gn{render(){let{props:e,context:t}=this,{options:n}=t,{seg:r}=e,{ui:i}=r.eventRange,s=pi(r,n.eventTimeFormat||e.defaultTimeFormat,t,e.defaultDisplayEventTime,e.defaultDisplayEventEnd);return p(so,Object.assign({},e,{elTag:"a",elStyle:{borderColor:i.borderColor,backgroundColor:i.backgroundColor},elAttrs:bi(r,t),defaultGenerator:ao,timeText:s}),(e,t)=>p(y,null,p(e,{elTag:"div",elClasses:["fc-event-main"],elStyle:{color:t.textColor}}),Boolean(t.isStartResizable)&&p("div",{className:"fc-event-resizer fc-event-resizer-start"}),Boolean(t.isEndResizable)&&p("div",{className:"fc-event-resizer fc-event-resizer-end"})))}}function ao(e){return p("div",{className:"fc-event-main-frame"},e.timeText&&p("div",{className:"fc-event-time"},e.timeText),p("div",{className:"fc-event-title-container"},p("div",{className:"fc-event-title fc-sticky"},e.event.title||p(y,null," "))))}const lo=e=>p(Ln.Consumer,null,t=>{let{options:n}=t,r={isAxis:e.isAxis,date:t.dateEnv.toDate(e.date),view:t.viewApi};return p(Jn,Object.assign({},e,{elTag:e.elTag||"div",renderProps:r,generatorName:"nowIndicatorContent",customGenerator:n.nowIndicatorContent,classNameGenerator:n.nowIndicatorClassNames,didMount:n.nowIndicatorDidMount,willUnmount:n.nowIndicatorWillUnmount}))}),co=an({day:"numeric"});class uo extends Gn{constructor(){super(...arguments),this.refineRenderProps=Qt(fo)}render(){let{props:e,context:t}=this,{options:n}=t,r=this.refineRenderProps({date:e.date,dateProfile:e.dateProfile,todayRange:e.todayRange,isMonthStart:e.isMonthStart||!1,showDayNumber:e.showDayNumber,extraRenderProps:e.extraRenderProps,viewApi:t.viewApi,dateEnv:t.dateEnv,monthStartFormat:n.monthStartFormat});return p(Jn,Object.assign({},e,{elClasses:[...Vi(r,t.theme),...e.elClasses||[]],elAttrs:Object.assign(Object.assign({},e.elAttrs),r.isDisabled?{}:{"data-date":Wt(e.date)}),renderProps:r,generatorName:"dayCellContent",customGenerator:n.dayCellContent,defaultGenerator:e.defaultGenerator,classNameGenerator:r.isDisabled?void 0:n.dayCellClassNames,didMount:n.dayCellDidMount,willUnmount:n.dayCellWillUnmount}))}}function ho(e){return Boolean(e.dayCellContent||Yn("dayCellContent",e))}function fo(e){let{date:t,dateEnv:n,dateProfile:r,isMonthStart:i}=e,s=Fi(t,e.todayRange,null,r),o=e.showDayNumber?n.format(t,i?e.monthStartFormat:co):"";return Object.assign(Object.assign(Object.assign({date:n.toDate(t),view:e.viewApi},s),{isMonthStart:i,dayNumberText:o}),e.extraRenderProps)}class go extends Gn{render(){let{props:e}=this,{seg:t}=e;return p(so,{elTag:"div",elClasses:["fc-bg-event"],elStyle:{backgroundColor:t.eventRange.ui.backgroundColor},defaultGenerator:po,seg:t,timeText:"",isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:!1,isPast:e.isPast,isFuture:e.isFuture,isToday:e.isToday,disableDragging:!0,disableResizing:!0})}}function po(e){let{title:t}=e.event;return t&&p("div",{className:"fc-event-title"},e.event.title)}function mo(e){return p("div",{className:"fc-"+e})}const vo=e=>p(Ln.Consumer,null,t=>{let{dateEnv:n,options:r}=t,{date:i}=e,s=r.weekNumberFormat||e.defaultFormat,o={num:n.computeWeekNumber(i),text:n.format(i,s),date:i};return p(Jn,Object.assign({},e,{renderProps:o,generatorName:"weekNumberContent",customGenerator:r.weekNumberContent,defaultGenerator:yo,classNameGenerator:r.weekNumberClassNames,didMount:r.weekNumberDidMount,willUnmount:r.weekNumberWillUnmount}))});function yo(e){return e.text}class bo extends Gn{constructor(){super(...arguments),this.state={titleId:We()},this.handleRootEl=e=>{this.rootEl=e,this.props.elRef&&Qn(this.props.elRef,e)},this.handleDocumentMouseDown=e=>{const t=ze(e);this.rootEl.contains(t)||this.handleCloseClick()},this.handleDocumentKeyDown=e=>{"Escape"===e.key&&this.handleCloseClick()},this.handleCloseClick=()=>{let{onClose:e}=this.props;e&&e()}}render(){let{theme:e,options:t}=this.context,{props:n,state:r}=this,i=["fc-popover",e.getClass("popover")].concat(n.extraClassNames||[]);return fe(p("div",Object.assign({},n.extraAttrs,{id:n.id,className:i.join(" "),"aria-labelledby":r.titleId,ref:this.handleRootEl}),p("div",{className:"fc-popover-header "+e.getClass("popoverHeader")},p("span",{className:"fc-popover-title",id:r.titleId},n.title),p("span",{className:"fc-popover-close "+e.getIconClass("close"),title:t.closeHint,onClick:this.handleCloseClick})),p("div",{className:"fc-popover-body "+e.getClass("popoverContent")},n.children)),n.parentEl)}componentDidMount(){document.addEventListener("mousedown",this.handleDocumentMouseDown),document.addEventListener("keydown",this.handleDocumentKeyDown),this.updateSize()}componentWillUnmount(){document.removeEventListener("mousedown",this.handleDocumentMouseDown),document.removeEventListener("keydown",this.handleDocumentKeyDown)}updateSize(){let{isRtl:e}=this.context,{alignmentEl:t,alignGridTop:n}=this.props,{rootEl:r}=this,i=function(e){let t=ns(e),n=e.getBoundingClientRect();for(let e of t){let t=Hi(n,e.getBoundingClientRect());if(!t)return null;n=t}return n}(t);if(i){let s=r.getBoundingClientRect(),o=n?Oe(t,".fc-scrollgrid").getBoundingClientRect().top:i.top,a=e?i.right-s.width:i.left;o=Math.max(o,10),a=Math.min(a,document.documentElement.clientWidth-10-s.width),a=Math.max(a,10);let l=r.offsetParent.getBoundingClientRect();Be(r,{top:o-l.top,left:a-l.left})}}}class Eo extends ls{constructor(){super(...arguments),this.handleRootEl=e=>{this.rootEl=e,e?this.context.registerInteractiveComponent(this,{el:e,useEventCenter:!1}):this.context.unregisterInteractiveComponent(this)}}render(){let{options:e,dateEnv:t}=this.context,{props:n}=this,{startDate:r,todayRange:i,dateProfile:s}=n,o=t.format(r,e.dayPopoverFormat);return p(uo,{elRef:this.handleRootEl,date:r,dateProfile:s,todayRange:i},(t,r,i)=>p(bo,{elRef:i.ref,id:n.id,title:o,extraClassNames:["fc-more-popover"].concat(i.className||[]),extraAttrs:i,parentEl:n.parentEl,alignmentEl:n.alignmentEl,alignGridTop:n.alignGridTop,onClose:n.onClose},ho(e)&&p(t,{elTag:"div",elClasses:["fc-more-popover-misc"]}),n.children))}queryHit(e,t,n,r){let{rootEl:i,props:s}=this;return e>=0&&e<n&&t>=0&&t<r?{dateProfile:s.dateProfile,dateSpan:Object.assign({allDay:!s.forceTimed,range:{start:s.startDate,end:s.endDate}},s.extraDateSpan),dayEl:i,rect:{left:0,top:0,right:n,bottom:r},layer:1}:null}}class So extends Gn{constructor(){super(...arguments),this.state={isPopoverOpen:!1,popoverId:We()},this.handleLinkEl=e=>{this.linkEl=e,this.props.elRef&&Qn(this.props.elRef,e)},this.handleClick=e=>{let{props:t,context:n}=this,{moreLinkClick:r}=n.options,i=Do(t).start;function s(e){let{def:t,instance:r,range:i}=e.eventRange;return{event:new ti(n,t,r),start:n.dateEnv.toDate(i.start),end:n.dateEnv.toDate(i.end),isStart:e.isStart,isEnd:e.isEnd}}"function"==typeof r&&(r=r({date:i,allDay:Boolean(t.allDayDate),allSegs:t.allSegs.map(s),hiddenSegs:t.hiddenSegs.map(s),jsEvent:e,view:n.viewApi})),r&&"popover"!==r?"string"==typeof r&&n.calendarApi.zoomTo(i,r):this.setState({isPopoverOpen:!0})},this.handlePopoverClose=()=>{this.setState({isPopoverOpen:!1})}}render(){let{props:e,state:t}=this;return p(Ln.Consumer,null,n=>{let{viewApi:r,options:i,calendarApi:s}=n,{moreLinkText:o}=i,{moreCnt:a}=e,l=Do(e),c="function"==typeof o?o.call(s,a):`+${a} ${o}`,d=at(i.moreLinkHint,[a],c),u={num:a,shortText:"+"+a,text:c,view:r};return p(y,null,Boolean(e.moreCnt)&&p(Jn,{elTag:e.elTag||"a",elRef:this.handleLinkEl,elClasses:[...e.elClasses||[],"fc-more-link"],elStyle:e.elStyle,elAttrs:Object.assign(Object.assign(Object.assign({},e.elAttrs),Qe(this.handleClick)),{title:d,"aria-expanded":t.isPopoverOpen,"aria-controls":t.isPopoverOpen?t.popoverId:""}),renderProps:u,generatorName:"moreLinkContent",customGenerator:i.moreLinkContent,defaultGenerator:e.defaultGenerator||Ao,classNameGenerator:i.moreLinkClassNames,didMount:i.moreLinkDidMount,willUnmount:i.moreLinkWillUnmount},e.children),t.isPopoverOpen&&p(Eo,{id:t.popoverId,startDate:l.start,endDate:l.end,dateProfile:e.dateProfile,todayRange:e.todayRange,extraDateSpan:e.extraDateSpan,parentEl:this.parentEl,alignmentEl:e.alignmentElRef?e.alignmentElRef.current:this.linkEl,alignGridTop:e.alignGridTop,forceTimed:e.forceTimed,onClose:this.handlePopoverClose},e.popoverContent()))})}componentDidMount(){this.updateParentEl()}componentDidUpdate(){this.updateParentEl()}updateParentEl(){this.linkEl&&(this.parentEl=Oe(this.linkEl,".fc-view-harness"))}}function Ao(e){return e.text}function Do(e){if(e.allDayDate)return{start:e.allDayDate,end:wt(e.allDayDate,1)};let{hiddenSegs:t}=e;return{start:wo(t),end:(n=t,n.reduce(Ro).eventRange.range.end)};var n}function wo(e){return e.reduce(Co).eventRange.range.start}function Co(e,t){return e.eventRange.range.start<t.eventRange.range.start?e:t}function Ro(e,t){return e.eventRange.range.end>t.eventRange.range.end?e:t}var xo={__proto__:null,BASE_OPTION_DEFAULTS:cn,BaseComponent:Gn,BgEvent:go,CalendarImpl:Ni,CalendarRoot:ki,ContentContainer:Jn,CustomRenderingStore:class extends class{constructor(){this.handlers=[]}set(e){this.currentValue=e;for(let t of this.handlers)t(e)}subscribe(e){this.handlers.push(e),void 0!==this.currentValue&&e(this.currentValue)}}{constructor(){super(...arguments),this.map=new Map}handle(e){const{map:t}=this;let n=!1;e.isActive?(t.set(e.id,e),n=!0):t.has(e.id)&&(t.delete(e.id),n=!0),n&&this.set(t)}},DateComponent:ls,DateEnv:Hn,DateProfileGenerator:gr,DayCellContainer:uo,DayHeader:_s,DaySeriesModel:ks,DayTableModel:Ms,DelayedRunner:Me,ElementDragging:ms,ElementScrollController:os,Emitter:Gr,EventContainer:so,EventImpl:ti,Interaction:Mi,MoreLinkContainer:So,NamedTimeZoneImpl:class{constructor(e){this.timeZoneName=e}},NowIndicatorContainer:lo,NowTimer:Rs,PositionCache:rs,RefMap:Vs,ScrollController:ss,ScrollResponder:Wn,Scroller:Fs,SegHierarchy:cs,SimpleScrollGrid:io,Slicer:Is,Splitter:Wi,StandardEvent:oo,TableDateCell:Ds,TableDowCell:Cs,Theme:Bn,ViewContainer:er,ViewContextType:Ln,WeekNumberContainer:vo,WindowScrollController:as,addDays:wt,addDurations:pt,addMs:Ct,addWeeks:Dt,allowContextMenu:tt,allowSelection:Ke,applyMutationToEventStore:$r,applyStyle:Be,asCleanDays:function(e){return e.years||e.months||e.milliseconds?0:e.days},asRoughMinutes:function(e){return yt(e)/6e4},asRoughMs:yt,asRoughSeconds:function(e){return yt(e)/1e3},binarySearch:ps,buildElAttrs:Zn,buildEntryKey:us,buildEventApis:ri,buildEventRangeKey:yi,buildIsoString:Ut,buildNavLinkAttrs:qi,buildSegTimeText:pi,collectFromHash:kn,combineEventUis:Pr,compareByFieldSpecs:rt,compareNumbers:lt,compareObjs:_n,computeEarliestSegStart:wo,computeEdges:Ki,computeFallbackHeaderFormat:Es,computeInnerRect:es,computeRect:ts,computeShrinkWidth:Gs,computeVisibleDayRange:dr,config:vs,constrainPoint:Bi,createDuration:ft,createEmptyEventStore:_r,createEventInstance:pr,createEventUi:Nr,createFormatter:an,diffDates:hr,diffDayAndTime:_t,diffDays:xt,diffPoints:zi,diffWeeks:Rt,diffWholeDays:kt,diffWholeWeeks:Tt,disableCursor:Xe,elementClosest:Oe,elementMatches:Ne,enableCursor:$e,eventTupleToStore:Rr,filterHash:Sn,findDirectChildren:function(e,t){let n=e instanceof HTMLElement?[e]:e,r=[];for(let e=0;e<n.length;e+=1){let i=n[e].children;for(let e=0;e<i.length;e+=1){let n=i[e];t&&!Ne(n,t)||r.push(n)}}return r},findElements:Pe,flexibleCompare:st,formatDayString:Wt,formatIsoMonthStr:Lt,formatIsoTimeString:Ft,getAllowYScrolling:qs,getCanVGrowWithinCell:Ti,getClippingParents:ns,getDateMeta:Fi,getDayClassNames:Vi,getDefaultEventEnd:Xr,getElSeg:ai,getEntrySpanEnd:ds,getEventTargetViaRoot:ze,getIsRtlScrollbarOnLeft:Xi,getRectCenter:ji,getRelevantEvents:xr,getScrollGridClassNames:Ks,getScrollbarWidths:$i,getSectionClassNames:eo,getSectionHasLiquidHeight:Qs,getSegAnchorAttrs:bi,getSegMeta:mi,getSlotClassNames:function(e,t){let n=["fc-slot","fc-slot-"+At[e.dow]];return e.isDisabled?n.push("fc-slot-disabled"):(e.isToday&&(n.push("fc-slot-today"),n.push(t.getClass("today"))),e.isPast&&n.push("fc-slot-past"),e.isFuture&&n.push("fc-slot-future")),n},getStickyFooterScrollbar:ro,getStickyHeaderDates:no,getUniqueDomId:We,greatestDurationDenominator:Et,groupIntersectingEntries:hs,guid:Ze,hasBgRendering:si,hasCustomDayCellContent:ho,hasShrinkWidth:Js,identity:yn,injectStyles:xe,interactionSettingsStore:Oi,interactionSettingsToStore:Ii,intersectRanges:ir,intersectRects:Hi,intersectSpans:fs,isArraysEqual:St,isColPropsEqual:Zs,isDateSelectionValid:Ps,isDateSpansEqual:Ai,isInt:ct,isInteractionValid:Ns,isMultiDayRange:ur,isPropsEqual:Cn,isPropsValid:Bs,isValidDate:jt,mapHash:An,memoize:Gt,memoizeArraylike:function(e,t,n){let r=[],i=[];return s=>{let o=r.length,a=s.length,l=0;for(;l<o;l+=1)if(s[l]){if(!St(r[l],s[l])){n&&n(i[l]);let r=e.apply(this,s[l]);t&&t(r,i[l])||(i[l]=r)}}else n&&n(i[l]);for(;l<a;l+=1)i[l]=e.apply(this,s[l]);return r=s,i.splice(a),i}},memoizeHashlike:function(e,t,n){let r={},i={};return s=>{let o={};for(let a in s)if(i[a])if(St(r[a],s[a]))o[a]=i[a];else{n&&n(i[a]);let r=e.apply(this,s[a]);o[a]=t&&t(r,i[a])?i[a]:r}else o[a]=e.apply(this,s[a]);return r=s,i=o,o}},memoizeObjArg:Qt,mergeEventStores:Tr,multiplyDuration:mt,padStart:ot,parseBusinessHours:qr,parseClassNames:Mr,parseDragMeta:bs,parseEventDef:wr,parseFieldSpecs:nt,parseMarker:Pn,pointInsideRect:Pi,preventContextMenu:et,preventDefault:Le,preventSelection:Je,rangeContainsMarker:lr,rangeContainsRange:ar,rangesEqual:sr,rangesIntersect:or,refineEventDef:Ar,refineProps:vn,removeElement:Ie,removeExact:function(e,t){let n=0,r=0;for(;r<e.length;)e[r]===t?(e.splice(r,1),n+=1):r+=1;return n},renderChunkContent:Ys,renderFill:mo,renderMicroColGroup:Xs,renderScrollShim:to,requestJson:xi,sanitizeShrinkWidth:$s,setRef:Qn,sliceEventStore:ii,sortEventSegs:di,startOfDay:Mt,translateRect:function(e,t,n){return{left:e.left+t,right:e.right+t,top:e.top+n,bottom:e.bottom+n}},triggerDateSelect:Yr,unpromisify:Ci,whenTransitionDone:Ge,wholeDivideDurations:bt},_o={__proto__:null,createPortal:fe,createContext:Un,flushSync:jn,Component:D,Fragment:y,cloneElement:function(e,n,r){var i,s,o,a=f({},e.props);for(o in n)"key"==o?i=n[o]:"ref"==o?s=n[o]:a[o]=n[o];return arguments.length>2&&(a.children=arguments.length>3?t.call(arguments,2):r),m(e.type,a,i||e.key,s||e.ref,null)},createElement:p,createRef:v,h:p,hydrate:function e(t,n){U(t,n,e)},get isValidElement(){return i},get options(){return n},render:U,toChildArray:M};const To=[],ko={code:"en",week:{dow:0,doy:4},direction:"ltr",buttonText:{prev:"prev",next:"next",prevYear:"prev year",nextYear:"next year",year:"year",today:"today",month:"month",week:"week",day:"day",list:"list"},weekText:"W",weekTextLong:"Week",closeHint:"Close",timeHint:"Time",eventHint:"Event",allDayText:"all-day",moreLinkText:"more",noEventsText:"No events to display"},Mo=Object.assign(Object.assign({},ko),{buttonHints:{prev:"Previous $0",next:"Next $0",today:(e,t)=>"day"===t?"Today":"This "+e},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:e=>`Show ${e} more event${1===e?"":"s"}`});function Io(e){let t=e.length>0?e[0].code:"en",n=To.concat(e),r={en:Mo};for(let e of n)r[e.code]=e;return{map:r,defaultCode:t}}function Oo(e,t){return"object"!=typeof e||Array.isArray(e)?function(e,t){let n=[].concat(e||[]),r=function(e,t){for(let n=0;n<e.length;n+=1){let r=e[n].toLocaleLowerCase().split("-");for(let e=r.length;e>0;e-=1){let n=r.slice(0,e).join("-");if(t[n])return t[n]}}return null}(n,t)||Mo;return No(e,n,r)}(e,t):No(e.code,[e.code],e)}function No(e,t,n){let r=En([ko,n],["buttonText"]);delete r.code;let{week:i}=r;return delete r.week,{codeArg:e,codes:t,week:i,simpleNumberFormat:new Intl.NumberFormat(e),options:r}}function Po(e){return{id:Ze(),name:e.name,premiumReleaseDate:e.premiumReleaseDate?new Date(e.premiumReleaseDate):void 0,deps:e.deps||[],reducers:e.reducers||[],isLoadingFuncs:e.isLoadingFuncs||[],contextInit:[].concat(e.contextInit||[]),eventRefiners:e.eventRefiners||{},eventDefMemberAdders:e.eventDefMemberAdders||[],eventSourceRefiners:e.eventSourceRefiners||{},isDraggableTransformers:e.isDraggableTransformers||[],eventDragMutationMassagers:e.eventDragMutationMassagers||[],eventDefMutationAppliers:e.eventDefMutationAppliers||[],dateSelectionTransformers:e.dateSelectionTransformers||[],datePointTransforms:e.datePointTransforms||[],dateSpanTransforms:e.dateSpanTransforms||[],views:e.views||{},viewPropsTransformers:e.viewPropsTransformers||[],isPropsValid:e.isPropsValid||null,externalDefTransforms:e.externalDefTransforms||[],viewContainerAppends:e.viewContainerAppends||[],eventDropTransformers:e.eventDropTransformers||[],componentInteractions:e.componentInteractions||[],calendarInteractions:e.calendarInteractions||[],themeClasses:e.themeClasses||{},eventSourceDefs:e.eventSourceDefs||[],cmdFormatter:e.cmdFormatter,recurringTypes:e.recurringTypes||[],namedTimeZonedImpl:e.namedTimeZonedImpl,initialView:e.initialView||"",elementDraggingImpl:e.elementDraggingImpl,optionChangeHandlers:e.optionChangeHandlers||{},scrollGridImpl:e.scrollGridImpl||null,listenerRefiners:e.listenerRefiners||{},optionRefiners:e.optionRefiners||{},propSetHandlers:e.propSetHandlers||{}}}function Ho(){let e,t=[],n=[];return(r,i)=>(e&&St(r,t)&&St(i,n)||(e=function(e,t){let n={},r={premiumReleaseDate:void 0,reducers:[],isLoadingFuncs:[],contextInit:[],eventRefiners:{},eventDefMemberAdders:[],eventSourceRefiners:{},isDraggableTransformers:[],eventDragMutationMassagers:[],eventDefMutationAppliers:[],dateSelectionTransformers:[],datePointTransforms:[],dateSpanTransforms:[],views:{},viewPropsTransformers:[],isPropsValid:null,externalDefTransforms:[],viewContainerAppends:[],eventDropTransformers:[],componentInteractions:[],calendarInteractions:[],themeClasses:{},eventSourceDefs:[],cmdFormatter:null,recurringTypes:[],namedTimeZonedImpl:null,initialView:"",elementDraggingImpl:null,optionChangeHandlers:{},scrollGridImpl:null,listenerRefiners:{},optionRefiners:{},propSetHandlers:{}};function i(e){for(let o of e){const e=o.name,a=n[e];void 0===a?(n[e]=o.id,i(o.deps),s=o,r={premiumReleaseDate:Bo((t=r).premiumReleaseDate,s.premiumReleaseDate),reducers:t.reducers.concat(s.reducers),isLoadingFuncs:t.isLoadingFuncs.concat(s.isLoadingFuncs),contextInit:t.contextInit.concat(s.contextInit),eventRefiners:Object.assign(Object.assign({},t.eventRefiners),s.eventRefiners),eventDefMemberAdders:t.eventDefMemberAdders.concat(s.eventDefMemberAdders),eventSourceRefiners:Object.assign(Object.assign({},t.eventSourceRefiners),s.eventSourceRefiners),isDraggableTransformers:t.isDraggableTransformers.concat(s.isDraggableTransformers),eventDragMutationMassagers:t.eventDragMutationMassagers.concat(s.eventDragMutationMassagers),eventDefMutationAppliers:t.eventDefMutationAppliers.concat(s.eventDefMutationAppliers),dateSelectionTransformers:t.dateSelectionTransformers.concat(s.dateSelectionTransformers),datePointTransforms:t.datePointTransforms.concat(s.datePointTransforms),dateSpanTransforms:t.dateSpanTransforms.concat(s.dateSpanTransforms),views:Object.assign(Object.assign({},t.views),s.views),viewPropsTransformers:t.viewPropsTransformers.concat(s.viewPropsTransformers),isPropsValid:s.isPropsValid||t.isPropsValid,externalDefTransforms:t.externalDefTransforms.concat(s.externalDefTransforms),viewContainerAppends:t.viewContainerAppends.concat(s.viewContainerAppends),eventDropTransformers:t.eventDropTransformers.concat(s.eventDropTransformers),calendarInteractions:t.calendarInteractions.concat(s.calendarInteractions),componentInteractions:t.componentInteractions.concat(s.componentInteractions),themeClasses:Object.assign(Object.assign({},t.themeClasses),s.themeClasses),eventSourceDefs:t.eventSourceDefs.concat(s.eventSourceDefs),cmdFormatter:s.cmdFormatter||t.cmdFormatter,recurringTypes:t.recurringTypes.concat(s.recurringTypes),namedTimeZonedImpl:s.namedTimeZonedImpl||t.namedTimeZonedImpl,initialView:t.initialView||s.initialView,elementDraggingImpl:t.elementDraggingImpl||s.elementDraggingImpl,optionChangeHandlers:Object.assign(Object.assign({},t.optionChangeHandlers),s.optionChangeHandlers),scrollGridImpl:s.scrollGridImpl||t.scrollGridImpl,listenerRefiners:Object.assign(Object.assign({},t.listenerRefiners),s.listenerRefiners),optionRefiners:Object.assign(Object.assign({},t.optionRefiners),s.optionRefiners),propSetHandlers:Object.assign(Object.assign({},t.propSetHandlers),s.propSetHandlers)}):a!==o.id&&console.warn(`Duplicate plugin '${e}'`)}var t,s}return e&&i(e),i(t),r}(r,i)),t=r,n=i,e)}function Bo(e,t){return void 0===e?t:void 0===t?e:new Date(Math.max(e.valueOf(),t.valueOf()))}class jo extends Bn{}function zo(e,t,n,r){if(t[e])return t[e];let i=function(e,t,n,r){let i=n[e],s=r[e],o=e=>i&&null!==i[e]?i[e]:s&&null!==s[e]?s[e]:null,a=o("component"),l=o("superType"),c=null;if(l){if(l===e)throw new Error("Can't have a custom view type that references itself");c=zo(l,t,n,r)}!a&&c&&(a=c.component);if(!a)return null;return{type:e,component:a,defaults:Object.assign(Object.assign({},c?c.defaults:{}),i?i.rawOptions:{}),overrides:Object.assign(Object.assign({},c?c.overrides:{}),s?s.rawOptions:{})}}(e,t,n,r);return i&&(t[e]=i),i}function Uo(e){return An(e,Wo)}function Wo(e){let t="function"==typeof e?{component:e}:e,{component:n}=t;return t.content?n=Lo(t):!n||n.prototype instanceof Gn||(n=Lo(Object.assign(Object.assign({},t),{content:n}))),{superType:t.type,component:n,rawOptions:t}}function Lo(e){return t=>p(Ln.Consumer,null,n=>p(Jn,{elTag:"div",elClasses:tr(n.viewSpec),renderProps:Object.assign(Object.assign({},t),{nextDayThreshold:n.options.nextDayThreshold}),generatorName:void 0,customGenerator:e.content,classNameGenerator:e.classNames,didMount:e.didMount,willUnmount:e.willUnmount}))}function Fo(e,t,n,r){let i=Uo(e),s=Uo(t.views);return An(function(e,t){let n,r={};for(n in e)zo(n,r,e,t);for(n in t)zo(n,r,e,t);return r}(i,s),e=>function(e,t,n,r,i){let s=e.overrides.duration||e.defaults.duration||r.duration||n.duration,o=null,a="",l="",c={};if(s&&(o=function(e){let t=JSON.stringify(e),n=Vo[t];void 0===n&&(n=ft(e),Vo[t]=n);return n}(s),o)){let e=Et(o);a=e.unit,1===e.value&&(l=a,c=t[a]?t[a].rawOptions:{})}let d=t=>{let n=t.buttonText||{},r=e.defaults.buttonTextKey;return null!=r&&null!=n[r]?n[r]:null!=n[e.type]?n[e.type]:null!=n[l]?n[l]:null},u=t=>{let n=t.buttonHints||{},r=e.defaults.buttonTextKey;return null!=r&&null!=n[r]?n[r]:null!=n[e.type]?n[e.type]:null!=n[l]?n[l]:null};return{type:e.type,component:e.component,duration:o,durationUnit:a,singleUnit:l,optionDefaults:e.defaults,optionOverrides:Object.assign(Object.assign({},c),e.overrides),buttonTextOverride:d(r)||d(n)||e.overrides.buttonText,buttonTextDefault:d(i)||e.defaults.buttonText||d(cn)||e.type,buttonTitleOverride:u(r)||u(n)||e.overrides.buttonHint,buttonTitleDefault:u(i)||e.defaults.buttonHint||u(cn)}}(e,s,t,n,r))}jo.prototype.classes={root:"fc-theme-standard",tableCellShaded:"fc-cell-shaded",buttonGroup:"fc-button-group",button:"fc-button fc-button-primary",buttonActive:"fc-button-active"},jo.prototype.baseIconClass="fc-icon",jo.prototype.iconClasses={close:"fc-icon-x",prev:"fc-icon-chevron-left",next:"fc-icon-chevron-right",prevYear:"fc-icon-chevrons-left",nextYear:"fc-icon-chevrons-right"},jo.prototype.rtlIconClasses={prev:"fc-icon-chevron-right",next:"fc-icon-chevron-left",prevYear:"fc-icon-chevrons-right",nextYear:"fc-icon-chevrons-left"},jo.prototype.iconOverrideOption="buttonIcons",jo.prototype.iconOverrideCustomButtonOption="icon",jo.prototype.iconOverridePrefix="fc-icon-";let Vo={};function Go(e,t,n){let r=t?t.activeRange:null;return Yo({},function(e,t){let n=zr(t),r=[].concat(e.eventSources||[]),i=[];e.initialEvents&&r.unshift(e.initialEvents);e.events&&r.unshift(e.events);for(let e of r){let r=jr(e,t,n);r&&i.push(r)}return i}(e,n),r,n)}function Qo(e,t,n,r){let i=n?n.activeRange:null;switch(t.type){case"ADD_EVENT_SOURCES":return Yo(e,t.sources,i,r);case"REMOVE_EVENT_SOURCE":return s=e,o=t.sourceId,Sn(s,e=>e.sourceId!==o);case"PREV":case"NEXT":case"CHANGE_DATE":case"CHANGE_VIEW_TYPE":return n?Zo(e,i,r):e;case"FETCH_EVENT_SOURCES":return Xo(e,t.sourceIds?Dn(t.sourceIds):Jo(e,r),i,t.isRefetch||!1,r);case"RECEIVE_EVENTS":case"RECEIVE_EVENT_ERROR":return function(e,t,n,r){let i=e[t];if(i&&n===i.latestFetchId)return Object.assign(Object.assign({},e),{[t]:Object.assign(Object.assign({},i),{isFetching:!1,fetchRange:r})});return e}(e,t.sourceId,t.fetchId,t.fetchRange);case"REMOVE_ALL_EVENT_SOURCES":return{};default:return e}var s,o}function qo(e){for(let t in e)if(e[t].isFetching)return!0;return!1}function Yo(e,t,n,r){let i={};for(let e of t)i[e.sourceId]=e;return n&&(i=Zo(i,n,r)),Object.assign(Object.assign({},e),i)}function Zo(e,t,n){return Xo(e,Sn(e,e=>function(e,t,n){if(!Ko(e,n))return!e.latestFetchId;return!n.options.lazyFetching||!e.fetchRange||e.isFetching||t.start<e.fetchRange.start||t.end>e.fetchRange.end}(e,t,n)),t,!1,n)}function Xo(e,t,n,r,i){let s={};for(let o in e){let a=e[o];t[o]?s[o]=$o(a,n,r,i):s[o]=a}return s}function $o(e,t,n,r){let{options:i,calendarApi:s}=r,o=r.pluginHooks.eventSourceDefs[e.sourceDefId],a=Ze();return o.fetch({eventSource:e,range:t,isRefetch:n,context:r},n=>{let{rawEvents:o}=n;i.eventSourceSuccess&&(o=i.eventSourceSuccess.call(s,o,n.response)||o),e.success&&(o=e.success.call(s,o,n.response)||o),r.dispatch({type:"RECEIVE_EVENTS",sourceId:e.sourceId,fetchId:a,fetchRange:t,rawEvents:o})},n=>{let o=!1;i.eventSourceFailure&&(i.eventSourceFailure.call(s,n),o=!0),e.failure&&(e.failure(n),o=!0),o||console.warn(n.message,n),r.dispatch({type:"RECEIVE_EVENT_ERROR",sourceId:e.sourceId,fetchId:a,fetchRange:t,error:n})}),Object.assign(Object.assign({},e),{isFetching:!0,latestFetchId:a})}function Jo(e,t){return Sn(e,e=>Ko(e,t))}function Ko(e,t){return!t.pluginHooks.eventSourceDefs[e.sourceDefId].ignoreRange}function ea(e,t){switch(t.type){case"UNSELECT_DATES":return null;case"SELECT_DATES":return t.selection;default:return e}}function ta(e,t){switch(t.type){case"UNSELECT_EVENT":return"";case"SELECT_EVENT":return t.eventInstanceId;default:return e}}function na(e,t){let n;switch(t.type){case"UNSET_EVENT_DRAG":return null;case"SET_EVENT_DRAG":return n=t.state,{affectedEvents:n.affectedEvents,mutatedEvents:n.mutatedEvents,isEvent:n.isEvent};default:return e}}function ra(e,t){let n;switch(t.type){case"UNSET_EVENT_RESIZE":return null;case"SET_EVENT_RESIZE":return n=t.state,{affectedEvents:n.affectedEvents,mutatedEvents:n.mutatedEvents,isEvent:n.isEvent};default:return e}}function ia(e,t,n,r,i){return{header:e.headerToolbar?sa(e.headerToolbar,e,t,n,r,i):null,footer:e.footerToolbar?sa(e.footerToolbar,e,t,n,r,i):null}}function sa(e,t,n,r,i,s){let o={},a=[],l=!1;for(let c in e){let d=oa(e[c],t,n,r,i,s);o[c]=d.widgets,a.push(...d.viewsWithButtons),l=l||d.hasTitle}return{sectionWidgets:o,viewsWithButtons:a,hasTitle:l}}function oa(e,t,n,r,i,s){let o="rtl"===t.direction,a=t.customButtons||{},l=n.buttonText||{},c=t.buttonText||{},d=n.buttonHints||{},u=t.buttonHints||{},h=e?e.split(" "):[],f=[],g=!1;return{widgets:h.map(e=>e.split(",").map(e=>{if("title"===e)return g=!0,{buttonName:e};let n,h,p,m,v,y;if(n=a[e])p=e=>{n.click&&n.click.call(e.target,e,e.target)},(m=r.getCustomButtonIconClass(n))||(m=r.getIconClass(e,o))||(v=n.text),y=n.hint||n.text;else if(h=i[e]){f.push(e),p=()=>{s.changeView(e)},(v=h.buttonTextOverride)||(m=r.getIconClass(e,o))||(v=h.buttonTextDefault);let n=h.buttonTextOverride||h.buttonTextDefault;y=at(h.buttonTitleOverride||h.buttonTitleDefault||t.viewHint,[n,e],n)}else if(s[e])if(p=()=>{s[e]()},(v=l[e])||(m=r.getIconClass(e,o))||(v=c[e]),"prevYear"===e||"nextYear"===e){let t="prevYear"===e?"prev":"next";y=at(d[t]||u[t],[c.year||"year","year"],c[e])}else y=t=>at(d[e]||u[e],[c[t]||t,t],c[e]);return{buttonName:e,buttonClick:p,buttonIcon:m,buttonText:v,buttonHint:y}})),viewsWithButtons:f,hasTitle:g}}class aa{constructor(e,t,n){this.type=e,this.getCurrentData=t,this.dateEnv=n}get calendar(){return this.getCurrentData().calendarApi}get title(){return this.getCurrentData().viewTitle}get activeStart(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.start)}get activeEnd(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.end)}get currentStart(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.start)}get currentEnd(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.end)}getOption(e){return this.getCurrentData().options[e]}}function la(e,t){let n=wn(t.getCurrentData().eventSources);if(1===n.length&&1===e.length&&Array.isArray(n[0]._raw)&&Array.isArray(e[0]))return void t.dispatch({type:"RESET_RAW_EVENTS",sourceId:n[0].sourceId,rawEvents:e[0]});let r=[];for(let t of e){let e=!1;for(let r=0;r<n.length;r+=1)if(n[r]._raw===t){n.splice(r,1),e=!0;break}e||r.push(t)}for(let e of n)t.dispatch({type:"REMOVE_EVENT_SOURCE",sourceId:e.sourceId});for(let e of r)t.calendarApi.addEventSource(e)}const ca=[Po({name:"array-event-source",eventSourceDefs:[{ignoreRange:!0,parseMeta:e=>Array.isArray(e.events)?e.events:null,fetch(e,t){t({rawEvents:e.eventSource.meta})}}]}),Po({name:"func-event-source",eventSourceDefs:[{parseMeta:e=>"function"==typeof e.events?e.events:null,fetch(e,t,n){const{dateEnv:r}=e.context;Ci(e.eventSource.meta.bind(null,Di(e.range,r)),e=>t({rawEvents:e}),n)}}]}),Po({name:"json-event-source",eventSourceRefiners:{method:String,extraParams:yn,startParam:String,endParam:String,timeZoneParam:String},eventSourceDefs:[{parseMeta:e=>!e.url||"json"!==e.format&&e.format?null:{url:e.url,format:"json",method:(e.method||"GET").toUpperCase(),extraParams:e.extraParams,startParam:e.startParam,endParam:e.endParam,timeZoneParam:e.timeZoneParam},fetch(e,t,n){const{meta:r}=e.eventSource,i=function(e,t,n){let r,i,s,o,{dateEnv:a,options:l}=n,c={};r=e.startParam,null==r&&(r=l.startParam);i=e.endParam,null==i&&(i=l.endParam);s=e.timeZoneParam,null==s&&(s=l.timeZoneParam);o="function"==typeof e.extraParams?e.extraParams():e.extraParams||{};Object.assign(c,o),c[r]=a.formatIso(t.start),c[i]=a.formatIso(t.end),"local"!==a.timeZone&&(c[s]=a.timeZone);return c}(r,e.range,e.context);xi(r.method,r.url,i).then(([e,n])=>{t({rawEvents:e,response:n})},n)}}]}),Po({name:"simple-recurring-event",recurringTypes:[{parse(e,t){if(e.daysOfWeek||e.startTime||e.endTime||e.startRecur||e.endRecur){let i,s={daysOfWeek:e.daysOfWeek||null,startTime:e.startTime||null,endTime:e.endTime||null,startRecur:e.startRecur?t.createMarker(e.startRecur):null,endRecur:e.endRecur?t.createMarker(e.endRecur):null};return e.duration&&(i=e.duration),!i&&e.startTime&&e.endTime&&(n=e.endTime,r=e.startTime,i={years:n.years-r.years,months:n.months-r.months,days:n.days-r.days,milliseconds:n.milliseconds-r.milliseconds}),{allDayGuess:Boolean(!e.startTime&&!e.endTime),duration:i,typeData:s}}var n,r;return null},expand(e,t,n){let r=ir(t,{start:e.startRecur,end:e.endRecur});return r?function(e,t,n,r){let i=e?Dn(e):null,s=Mt(n.start),o=n.end,a=[];for(;s<o;){let e;i&&!i[s.getUTCDay()]||(e=t?r.add(s,t):s,a.push(e)),s=wt(s,1)}return a}(e.daysOfWeek,e.startTime,r,n):[]}}],eventRefiners:{daysOfWeek:yn,startTime:ft,endTime:ft,duration:ft,startRecur:yn,endRecur:yn}}),Po({name:"change-handler",optionChangeHandlers:{events(e,t){la([e],t)},eventSources:la}}),Po({name:"misc",isLoadingFuncs:[e=>qo(e.eventSources)],propSetHandlers:{dateProfile:function(e,t){t.emitter.trigger("datesSet",Object.assign(Object.assign({},Di(e.activeRange,t.dateEnv)),{view:t.viewApi}))},eventStore:function(e,t){let{emitter:n}=t;n.hasHandlers("eventsSet")&&n.trigger("eventsSet",ri(e,t))}}})];class da{constructor(e,t){this.runTaskOption=e,this.drainedOption=t,this.queue=[],this.delayedRunner=new Me(this.drain.bind(this))}request(e,t){this.queue.push(e),this.delayedRunner.request(t)}pause(e){this.delayedRunner.pause(e)}resume(e,t){this.delayedRunner.resume(e,t)}drain(){let{queue:e}=this;for(;e.length;){let t,n=[];for(;t=e.shift();)this.runTask(t),n.push(t);this.drained(n)}}runTask(e){this.runTaskOption&&this.runTaskOption(e)}drained(e){this.drainedOption&&this.drainedOption(e)}}function ua(e,t,n){let r;return r=/^(year|month)$/.test(e.currentRangeUnit)?e.currentRange:e.activeRange,n.formatRange(r.start,r.end,an(t.titleFormat||function(e){let{currentRangeUnit:t}=e;if("year"===t)return{year:"numeric"};if("month"===t)return{year:"numeric",month:"long"};let n=kt(e.currentRange.start,e.currentRange.end);if(null!==n&&n>1)return{year:"numeric",month:"short",day:"numeric"};return{year:"numeric",month:"long",day:"numeric"}}(e)),{isEndExclusive:e.isRangeAllDay,defaultSeparator:t.titleRangeSeparator})}class ha{constructor(e){this.computeCurrentViewData=Gt(this._computeCurrentViewData),this.organizeRawLocales=Gt(Io),this.buildLocale=Gt(Oo),this.buildPluginHooks=Ho(),this.buildDateEnv=Gt(fa),this.buildTheme=Gt(ga),this.parseToolbars=Gt(ia),this.buildViewSpecs=Gt(Fo),this.buildDateProfileGenerator=Qt(pa),this.buildViewApi=Gt(ma),this.buildViewUiProps=Qt(ba),this.buildEventUiBySource=Gt(va,Cn),this.buildEventUiBases=Gt(ya),this.parseContextBusinessHours=Qt(Sa),this.buildTitle=Gt(ua),this.emitter=new Gr,this.actionRunner=new da(this._handleAction.bind(this),this.updateData.bind(this)),this.currentCalendarOptionsInput={},this.currentCalendarOptionsRefined={},this.currentViewOptionsInput={},this.currentViewOptionsRefined={},this.currentCalendarOptionsRefiners={},this.optionsForRefining=[],this.optionsForHandling=[],this.getCurrentData=()=>this.data,this.dispatch=e=>{this.actionRunner.request(e)},this.props=e,this.actionRunner.pause();let t={},n=this.computeOptionsData(e.optionOverrides,t,e.calendarApi),r=n.calendarOptions.initialView||n.pluginHooks.initialView,i=this.computeCurrentViewData(r,n,e.optionOverrides,t);e.calendarApi.currentDataManager=this,this.emitter.setThisContext(e.calendarApi),this.emitter.setOptions(i.options);let s=function(e,t){let n=e.initialDate;return null!=n?t.createMarker(n):fr(e.now,t)}(n.calendarOptions,n.dateEnv),o=i.dateProfileGenerator.build(s);lr(o.activeRange,s)||(s=o.currentRange.start);let a={dateEnv:n.dateEnv,options:n.calendarOptions,pluginHooks:n.pluginHooks,calendarApi:e.calendarApi,dispatch:this.dispatch,emitter:this.emitter,getCurrentData:this.getCurrentData};for(let e of n.pluginHooks.contextInit)e(a);let l=Go(n.calendarOptions,o,a),c={dynamicOptionOverrides:t,currentViewType:r,currentDate:s,dateProfile:o,businessHours:this.parseContextBusinessHours(a),eventSources:l,eventUiBases:{},eventStore:{defs:{},instances:{}},renderableEventStore:{defs:{},instances:{}},dateSelection:null,eventSelection:"",eventDrag:null,eventResize:null,selectionConfig:this.buildViewUiProps(a).selectionConfig},d=Object.assign(Object.assign({},a),c);for(let e of n.pluginHooks.reducers)Object.assign(c,e(null,null,d));Ea(c,a)&&this.emitter.trigger("loading",!0),this.state=c,this.updateData(),this.actionRunner.resume()}resetOptions(e,t){let{props:n}=this;void 0===t?n.optionOverrides=e:(n.optionOverrides=Object.assign(Object.assign({},n.optionOverrides||{}),e),this.optionsForRefining.push(...t)),(void 0===t||t.length)&&this.actionRunner.request({type:"NOTHING"})}_handleAction(e){let{props:t,state:n,emitter:r}=this,i=function(e,t){switch(t.type){case"SET_OPTION":return Object.assign(Object.assign({},e),{[t.optionName]:t.rawOptionValue});default:return e}}(n.dynamicOptionOverrides,e),s=this.computeOptionsData(t.optionOverrides,i,t.calendarApi),o=function(e,t){switch(t.type){case"CHANGE_VIEW_TYPE":e=t.viewType}return e}(n.currentViewType,e),a=this.computeCurrentViewData(o,s,t.optionOverrides,i);t.calendarApi.currentDataManager=this,r.setThisContext(t.calendarApi),r.setOptions(a.options);let l={dateEnv:s.dateEnv,options:s.calendarOptions,pluginHooks:s.pluginHooks,calendarApi:t.calendarApi,dispatch:this.dispatch,emitter:r,getCurrentData:this.getCurrentData},{currentDate:c,dateProfile:d}=n;this.data&&this.data.dateProfileGenerator!==a.dateProfileGenerator&&(d=a.dateProfileGenerator.build(c)),c=function(e,t){switch(t.type){case"CHANGE_DATE":return t.dateMarker;default:return e}}(c,e),d=function(e,t,n,r){let i;switch(t.type){case"CHANGE_VIEW_TYPE":return r.build(t.dateMarker||n);case"CHANGE_DATE":return r.build(t.dateMarker);case"PREV":if(i=r.buildPrev(e,n),i.isValid)return i;break;case"NEXT":if(i=r.buildNext(e,n),i.isValid)return i}return e}(d,e,c,a.dateProfileGenerator),"PREV"!==e.type&&"NEXT"!==e.type&&lr(d.currentRange,c)||(c=d.currentRange.start);let u=Qo(n.eventSources,e,d,l),h=Ur(n.eventStore,e,u,d,l),f=qo(u)&&!a.options.progressiveEventRendering&&n.renderableEventStore||h,{eventUiSingleBase:g,selectionConfig:p}=this.buildViewUiProps(l),m=this.buildEventUiBySource(u),v={dynamicOptionOverrides:i,currentViewType:o,currentDate:c,dateProfile:d,eventSources:u,eventStore:h,renderableEventStore:f,selectionConfig:p,eventUiBases:this.buildEventUiBases(f.defs,g,m),businessHours:this.parseContextBusinessHours(l),dateSelection:ea(n.dateSelection,e),eventSelection:ta(n.eventSelection,e),eventDrag:na(n.eventDrag,e),eventResize:ra(n.eventResize,e)},y=Object.assign(Object.assign({},l),v);for(let t of s.pluginHooks.reducers)Object.assign(v,t(n,e,y));let b=Ea(n,l),E=Ea(v,l);!b&&E?r.trigger("loading",!0):b&&!E&&r.trigger("loading",!1),this.state=v,t.onAction&&t.onAction(e)}updateData(){let{props:e,state:t}=this,n=this.data,r=this.computeOptionsData(e.optionOverrides,t.dynamicOptionOverrides,e.calendarApi),i=this.computeCurrentViewData(t.currentViewType,r,e.optionOverrides,t.dynamicOptionOverrides),s=this.data=Object.assign(Object.assign(Object.assign({viewTitle:this.buildTitle(t.dateProfile,i.options,r.dateEnv),calendarApi:e.calendarApi,dispatch:this.dispatch,emitter:this.emitter,getCurrentData:this.getCurrentData},r),i),t),o=r.pluginHooks.optionChangeHandlers,a=n&&n.calendarOptions,l=r.calendarOptions;if(a&&a!==l){a.timeZone!==l.timeZone&&(t.eventSources=s.eventSources=function(e,t,n){let r=t?t.activeRange:null;return Xo(e,Jo(e,n),r,!0,n)}(s.eventSources,t.dateProfile,s),t.eventStore=s.eventStore=Fr(s.eventStore,n.dateEnv,s.dateEnv),t.renderableEventStore=s.renderableEventStore=Fr(s.renderableEventStore,n.dateEnv,s.dateEnv));for(let e in o)-1===this.optionsForHandling.indexOf(e)&&a[e]===l[e]||o[e](l[e],s)}this.optionsForHandling=[],e.onData&&e.onData(s)}computeOptionsData(e,t,n){if(!this.optionsForRefining.length&&e===this.stableOptionOverrides&&t===this.stableDynamicOptionOverrides)return this.stableCalendarOptionsData;let{refinedOptions:r,pluginHooks:i,localeDefaults:s,availableLocaleData:o,extra:a}=this.processRawCalendarOptions(e,t);Aa(a);let l=this.buildDateEnv(r.timeZone,r.locale,r.weekNumberCalculation,r.firstDay,r.weekText,i,o,r.defaultRangeSeparator),c=this.buildViewSpecs(i.views,this.stableOptionOverrides,this.stableDynamicOptionOverrides,s),d=this.buildTheme(r,i),u=this.parseToolbars(r,this.stableOptionOverrides,d,c,n);return this.stableCalendarOptionsData={calendarOptions:r,pluginHooks:i,dateEnv:l,viewSpecs:c,theme:d,toolbarConfig:u,localeDefaults:s,availableRawLocales:o.map}}processRawCalendarOptions(e,t){let{locales:n,locale:r}=mn([cn,e,t]),i=this.organizeRawLocales(n),s=i.map,o=this.buildLocale(r||i.defaultCode,s).options,a=this.buildPluginHooks(e.plugins||[],ca),l=this.currentCalendarOptionsRefiners=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},ln),dn),un),a.listenerRefiners),a.optionRefiners),c={},d=mn([cn,o,e,t]),u={},h=this.currentCalendarOptionsInput,f=this.currentCalendarOptionsRefined,g=!1;for(let e in d)-1===this.optionsForRefining.indexOf(e)&&(d[e]===h[e]||hn[e]&&e in h&&hn[e](h[e],d[e]))?u[e]=f[e]:l[e]?(u[e]=l[e](d[e]),g=!0):c[e]=h[e];return g&&(this.currentCalendarOptionsInput=d,this.currentCalendarOptionsRefined=u,this.stableOptionOverrides=e,this.stableDynamicOptionOverrides=t),this.optionsForHandling.push(...this.optionsForRefining),this.optionsForRefining=[],{rawOptions:this.currentCalendarOptionsInput,refinedOptions:this.currentCalendarOptionsRefined,pluginHooks:a,availableLocaleData:i,localeDefaults:o,extra:c}}_computeCurrentViewData(e,t,n,r){let i=t.viewSpecs[e];if(!i)throw new Error(`viewType "${e}" is not available. Please make sure you've loaded all neccessary plugins`);let{refinedOptions:s,extra:o}=this.processRawViewOptions(i,t.pluginHooks,t.localeDefaults,n,r);return Aa(o),{viewSpec:i,options:s,dateProfileGenerator:this.buildDateProfileGenerator({dateProfileGeneratorClass:i.optionDefaults.dateProfileGeneratorClass,duration:i.duration,durationUnit:i.durationUnit,usesMinMaxTime:i.optionDefaults.usesMinMaxTime,dateEnv:t.dateEnv,calendarApi:this.props.calendarApi,slotMinTime:s.slotMinTime,slotMaxTime:s.slotMaxTime,showNonCurrentDates:s.showNonCurrentDates,dayCount:s.dayCount,dateAlignment:s.dateAlignment,dateIncrement:s.dateIncrement,hiddenDays:s.hiddenDays,weekends:s.weekends,nowInput:s.now,validRangeInput:s.validRange,visibleRangeInput:s.visibleRange,fixedWeekCount:s.fixedWeekCount}),viewApi:this.buildViewApi(e,this.getCurrentData,t.dateEnv)}}processRawViewOptions(e,t,n,r,i){let s=mn([cn,e.optionDefaults,n,r,e.optionOverrides,i]),o=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},ln),dn),un),pn),t.listenerRefiners),t.optionRefiners),a={},l=this.currentViewOptionsInput,c=this.currentViewOptionsRefined,d=!1,u={};for(let e in s)s[e]===l[e]||hn[e]&&hn[e](s[e],l[e])?a[e]=c[e]:(s[e]===this.currentCalendarOptionsInput[e]||hn[e]&&hn[e](s[e],this.currentCalendarOptionsInput[e])?e in this.currentCalendarOptionsRefined&&(a[e]=this.currentCalendarOptionsRefined[e]):o[e]?a[e]=o[e](s[e]):u[e]=s[e],d=!0);return d&&(this.currentViewOptionsInput=s,this.currentViewOptionsRefined=a),{rawOptions:this.currentViewOptionsInput,refinedOptions:this.currentViewOptionsRefined,extra:u}}}function fa(e,t,n,r,i,s,o,a){let l=Oo(t||o.defaultCode,o.map);return new Hn({calendarSystem:"gregory",timeZone:e,namedTimeZoneImpl:s.namedTimeZonedImpl,locale:l,weekNumberCalculation:n,firstDay:r,weekText:i,cmdFormatter:s.cmdFormatter,defaultSeparator:a})}function ga(e,t){return new(t.themeClasses[e.themeSystem]||jo)(e)}function pa(e){return new(e.dateProfileGeneratorClass||gr)(e)}function ma(e,t,n){return new aa(e,t,n)}function va(e){return An(e,e=>e.ui)}function ya(e,t,n){let r={"":t};for(let t in e){let i=e[t];i.sourceId&&n[i.sourceId]&&(r[t]=n[i.sourceId])}return r}function ba(e){let{options:t}=e;return{eventUiSingleBase:Nr({display:t.eventDisplay,editable:t.editable,startEditable:t.eventStartEditable,durationEditable:t.eventDurationEditable,constraint:t.eventConstraint,overlap:"boolean"==typeof t.eventOverlap?t.eventOverlap:void 0,allow:t.eventAllow,backgroundColor:t.eventBackgroundColor,borderColor:t.eventBorderColor,textColor:t.eventTextColor,color:t.eventColor},e),selectionConfig:Nr({constraint:t.selectConstraint,overlap:"boolean"==typeof t.selectOverlap?t.selectOverlap:void 0,allow:t.selectAllow},e)}}function Ea(e,t){for(let n of t.pluginHooks.isLoadingFuncs)if(n(e))return!0;return!1}function Sa(e){return qr(e.options.businessHours,e)}function Aa(e,t){for(let n in e)console.warn(`Unknown option '${n}'`+(t?` for view '${t}'`:""))}class Da extends Gn{render(){return p("div",{className:"fc-toolbar-chunk"},...this.props.widgetGroups.map(e=>this.renderWidgetGroup(e)))}renderWidgetGroup(e){let{props:t}=this,{theme:n}=this.context,r=[],i=!0;for(let s of e){let{buttonName:e,buttonClick:o,buttonText:a,buttonIcon:l,buttonHint:c}=s;if("title"===e)i=!1,r.push(p("h2",{className:"fc-toolbar-title",id:t.titleId},t.title));else{let i=e===t.activeButton,s=!t.isTodayEnabled&&"today"===e||!t.isPrevEnabled&&"prev"===e||!t.isNextEnabled&&"next"===e,d=[`fc-${e}-button`,n.getClass("button")];i&&d.push(n.getClass("buttonActive")),r.push(p("button",{type:"button",title:"function"==typeof c?c(t.navUnit):c,disabled:s,"aria-pressed":i,className:d.join(" "),onClick:o},a||(l?p("span",{className:l,role:"img"}):"")))}}if(r.length>1){return p("div",{className:i&&n.getClass("buttonGroup")||""},...r)}return r[0]}}class wa extends Gn{render(){let e,t,{model:n,extraClassName:r}=this.props,i=!1,s=n.sectionWidgets,o=s.center;return s.left?(i=!0,e=s.left):e=s.start,s.right?(i=!0,t=s.right):t=s.end,p("div",{className:[r||"","fc-toolbar",i?"fc-toolbar-ltr":""].join(" ")},this.renderSection("start",e||[]),this.renderSection("center",o||[]),this.renderSection("end",t||[]))}renderSection(e,t){let{props:n}=this;return p(Da,{key:e,widgetGroups:t,title:n.title,navUnit:n.navUnit,activeButton:n.activeButton,isTodayEnabled:n.isTodayEnabled,isPrevEnabled:n.isPrevEnabled,isNextEnabled:n.isNextEnabled,titleId:n.titleId})}}class Ca extends Gn{constructor(){super(...arguments),this.state={availableWidth:null},this.handleEl=e=>{this.el=e,Qn(this.props.elRef,e),this.updateAvailableWidth()},this.handleResize=()=>{this.updateAvailableWidth()}}render(){let{props:e,state:t}=this,{aspectRatio:n}=e,r=["fc-view-harness",n||e.liquid||e.height?"fc-view-harness-active":"fc-view-harness-passive"],i="",s="";return n?null!==t.availableWidth?i=t.availableWidth/n:s=1/n*100+"%":i=e.height||"",p("div",{"aria-labelledby":e.labeledById,ref:this.handleEl,className:r.join(" "),style:{height:i,paddingBottom:s}},e.children)}componentDidMount(){this.context.addResizeHandler(this.handleResize)}componentWillUnmount(){this.context.removeResizeHandler(this.handleResize)}updateAvailableWidth(){this.el&&this.props.aspectRatio&&this.setState({availableWidth:this.el.offsetWidth})}}class Ra extends Mi{constructor(e){super(e),this.handleSegClick=(e,t)=>{let{component:n}=this,{context:r}=n,i=ai(t);if(i&&n.isValidSegDownEl(e.target)){let s=Oe(e.target,".fc-event-forced-url"),o=s?s.querySelector("a[href]").href:"";r.emitter.trigger("eventClick",{el:t,event:new ti(n.context,i.eventRange.def,i.eventRange.instance),jsEvent:e,view:r.viewApi}),o&&!e.defaultPrevented&&(window.location.href=o)}},this.destroy=Fe(e.el,"click",".fc-event",this.handleSegClick)}}class xa extends Mi{constructor(e){super(e),this.handleEventElRemove=e=>{e===this.currentSegEl&&this.handleSegLeave(null,this.currentSegEl)},this.handleSegEnter=(e,t)=>{ai(t)&&(this.currentSegEl=t,this.triggerEvent("eventMouseEnter",e,t))},this.handleSegLeave=(e,t)=>{this.currentSegEl&&(this.currentSegEl=null,this.triggerEvent("eventMouseLeave",e,t))},this.removeHoverListeners=function(e,t,n,r){let i;return Fe(e,"mouseover",t,(e,t)=>{if(t!==i){i=t,n(e,t);let s=e=>{i=null,r(e,t),t.removeEventListener("mouseleave",s)};t.addEventListener("mouseleave",s)}})}(e.el,".fc-event",this.handleSegEnter,this.handleSegLeave)}destroy(){this.removeHoverListeners()}triggerEvent(e,t,n){let{component:r}=this,{context:i}=r,s=ai(n);t&&!r.isValidSegDownEl(t.target)||i.emitter.trigger(e,{el:n,event:new ti(i,s.eventRange.def,s.eventRange.instance),jsEvent:t,view:i.viewApi})}}class _a extends Vn{constructor(){super(...arguments),this.buildViewContext=Gt(Fn),this.buildViewPropTransformers=Gt(ka),this.buildToolbarProps=Gt(Ta),this.headerRef={current:null},this.footerRef={current:null},this.interactionsStore={},this.state={viewLabelId:We()},this.registerInteractiveComponent=(e,t)=>{let n=function(e,t){return{component:e,el:t.el,useEventCenter:null==t.useEventCenter||t.useEventCenter,isHitComboAllowed:t.isHitComboAllowed||null}}(e,t),r=[Ra,xa].concat(this.props.pluginHooks.componentInteractions).map(e=>new e(n));this.interactionsStore[e.uid]=r,Oi[e.uid]=n},this.unregisterInteractiveComponent=e=>{let t=this.interactionsStore[e.uid];if(t){for(let e of t)e.destroy();delete this.interactionsStore[e.uid]}delete Oi[e.uid]},this.resizeRunner=new Me(()=>{this.props.emitter.trigger("_resize",!0),this.props.emitter.trigger("windowResize",{view:this.props.viewApi})}),this.handleWindowResize=e=>{let{options:t}=this.props;t.handleWindowResize&&e.target===window&&this.resizeRunner.request(t.windowResizeDelay)}}render(){let e,{props:t}=this,{toolbarConfig:n,options:r}=t,i=this.buildToolbarProps(t.viewSpec,t.dateProfile,t.dateProfileGenerator,t.currentDate,fr(t.options.now,t.dateEnv),t.viewTitle),s=!1,o="";t.isHeightAuto||t.forPrint?o="":null!=r.height?s=!0:null!=r.contentHeight?o=r.contentHeight:e=Math.max(r.aspectRatio,.5);let a=this.buildViewContext(t.viewSpec,t.viewApi,t.options,t.dateProfileGenerator,t.dateEnv,t.theme,t.pluginHooks,t.dispatch,t.getCurrentData,t.emitter,t.calendarApi,this.registerInteractiveComponent,this.unregisterInteractiveComponent),l=n.header&&n.header.hasTitle?this.state.viewLabelId:void 0;return p(Ln.Provider,{value:a},n.header&&p(wa,Object.assign({ref:this.headerRef,extraClassName:"fc-header-toolbar",model:n.header,titleId:l},i)),p(Ca,{liquid:s,height:o,aspectRatio:e,labeledById:l},this.renderView(t),this.buildAppendContent()),n.footer&&p(wa,Object.assign({ref:this.footerRef,extraClassName:"fc-footer-toolbar",model:n.footer,titleId:""},i)))}componentDidMount(){let{props:e}=this;this.calendarInteractions=e.pluginHooks.calendarInteractions.map(t=>new t(e)),window.addEventListener("resize",this.handleWindowResize);let{propSetHandlers:t}=e.pluginHooks;for(let n in t)t[n](e[n],e)}componentDidUpdate(e){let{props:t}=this,{propSetHandlers:n}=t.pluginHooks;for(let r in n)t[r]!==e[r]&&n[r](t[r],t)}componentWillUnmount(){window.removeEventListener("resize",this.handleWindowResize),this.resizeRunner.clear();for(let e of this.calendarInteractions)e.destroy();this.props.emitter.trigger("_unmount")}buildAppendContent(){let{props:e}=this;return p(y,{},...e.pluginHooks.viewContainerAppends.map(t=>t(e)))}renderView(e){let{pluginHooks:t}=e,{viewSpec:n}=e,r={dateProfile:e.dateProfile,businessHours:e.businessHours,eventStore:e.renderableEventStore,eventUiBases:e.eventUiBases,dateSelection:e.dateSelection,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,isHeightAuto:e.isHeightAuto,forPrint:e.forPrint},i=this.buildViewPropTransformers(t.viewPropsTransformers);for(let t of i)Object.assign(r,t.transform(r,e));return p(n.component,Object.assign({},r))}}function Ta(e,t,n,r,i,s){let o=n.build(i,void 0,!1),a=n.buildPrev(t,r,!1),l=n.buildNext(t,r,!1);return{title:s,activeButton:e.type,navUnit:e.singleUnit,isTodayEnabled:o.isValid&&!lr(t.currentRange,i),isPrevEnabled:a.isValid,isNextEnabled:l.isValid}}function ka(e){return e.map(e=>new e)}function Ma(e){let t=Oo(e.locale||"en",Io([]).map);return new Hn(Object.assign(Object.assign({timeZone:cn.timeZone,calendarSystem:"gregory"},e),{locale:t}))}vs.touchMouseIgnoreWait=500;let Ia=0,Oa=0,Na=!1;class Pa{constructor(e){this.subjectEl=null,this.selector="",this.handleSelector="",this.shouldIgnoreMove=!1,this.shouldWatchScroll=!0,this.isDragging=!1,this.isTouchDragging=!1,this.wasTouchScroll=!1,this.handleMouseDown=e=>{if(!this.shouldIgnoreMouse()&&function(e){return 0===e.button&&!e.ctrlKey}(e)&&this.tryStart(e)){let t=this.createEventFromMouse(e,!0);this.emitter.trigger("pointerdown",t),this.initScrollWatch(t),this.shouldIgnoreMove||document.addEventListener("mousemove",this.handleMouseMove),document.addEventListener("mouseup",this.handleMouseUp)}},this.handleMouseMove=e=>{let t=this.createEventFromMouse(e);this.recordCoords(t),this.emitter.trigger("pointermove",t)},this.handleMouseUp=e=>{document.removeEventListener("mousemove",this.handleMouseMove),document.removeEventListener("mouseup",this.handleMouseUp),this.emitter.trigger("pointerup",this.createEventFromMouse(e)),this.cleanup()},this.handleTouchStart=e=>{if(this.tryStart(e)){this.isTouchDragging=!0;let t=this.createEventFromTouch(e,!0);this.emitter.trigger("pointerdown",t),this.initScrollWatch(t);let n=e.target;this.shouldIgnoreMove||n.addEventListener("touchmove",this.handleTouchMove),n.addEventListener("touchend",this.handleTouchEnd),n.addEventListener("touchcancel",this.handleTouchEnd),window.addEventListener("scroll",this.handleTouchScroll,!0)}},this.handleTouchMove=e=>{let t=this.createEventFromTouch(e);this.recordCoords(t),this.emitter.trigger("pointermove",t)},this.handleTouchEnd=e=>{if(this.isDragging){let t=e.target;t.removeEventListener("touchmove",this.handleTouchMove),t.removeEventListener("touchend",this.handleTouchEnd),t.removeEventListener("touchcancel",this.handleTouchEnd),window.removeEventListener("scroll",this.handleTouchScroll,!0),this.emitter.trigger("pointerup",this.createEventFromTouch(e)),this.cleanup(),this.isTouchDragging=!1,Ia+=1,setTimeout(()=>{Ia-=1},vs.touchMouseIgnoreWait)}},this.handleTouchScroll=()=>{this.wasTouchScroll=!0},this.handleScroll=e=>{if(!this.shouldIgnoreMove){let t=window.pageXOffset-this.prevScrollX+this.prevPageX,n=window.pageYOffset-this.prevScrollY+this.prevPageY;this.emitter.trigger("pointermove",{origEvent:e,isTouch:this.isTouchDragging,subjectEl:this.subjectEl,pageX:t,pageY:n,deltaX:t-this.origPageX,deltaY:n-this.origPageY})}},this.containerEl=e,this.emitter=new Gr,e.addEventListener("mousedown",this.handleMouseDown),e.addEventListener("touchstart",this.handleTouchStart,{passive:!0}),Oa+=1,1===Oa&&window.addEventListener("touchmove",Ha,{passive:!1})}destroy(){this.containerEl.removeEventListener("mousedown",this.handleMouseDown),this.containerEl.removeEventListener("touchstart",this.handleTouchStart,{passive:!0}),Oa-=1,Oa||window.removeEventListener("touchmove",Ha,{passive:!1})}tryStart(e){let t=this.querySubjectEl(e),n=e.target;return!(!t||this.handleSelector&&!Oe(n,this.handleSelector))&&(this.subjectEl=t,this.isDragging=!0,this.wasTouchScroll=!1,!0)}cleanup(){Na=!1,this.isDragging=!1,this.subjectEl=null,this.destroyScrollWatch()}querySubjectEl(e){return this.selector?Oe(e.target,this.selector):this.containerEl}shouldIgnoreMouse(){return Ia||this.isTouchDragging}cancelTouchScroll(){this.isDragging&&(Na=!0)}initScrollWatch(e){this.shouldWatchScroll&&(this.recordCoords(e),window.addEventListener("scroll",this.handleScroll,!0))}recordCoords(e){this.shouldWatchScroll&&(this.prevPageX=e.pageX,this.prevPageY=e.pageY,this.prevScrollX=window.pageXOffset,this.prevScrollY=window.pageYOffset)}destroyScrollWatch(){this.shouldWatchScroll&&window.removeEventListener("scroll",this.handleScroll,!0)}createEventFromMouse(e,t){let n=0,r=0;return t?(this.origPageX=e.pageX,this.origPageY=e.pageY):(n=e.pageX-this.origPageX,r=e.pageY-this.origPageY),{origEvent:e,isTouch:!1,subjectEl:this.subjectEl,pageX:e.pageX,pageY:e.pageY,deltaX:n,deltaY:r}}createEventFromTouch(e,t){let n,r,i=e.touches,s=0,o=0;return i&&i.length?(n=i[0].pageX,r=i[0].pageY):(n=e.pageX,r=e.pageY),t?(this.origPageX=n,this.origPageY=r):(s=n-this.origPageX,o=r-this.origPageY),{origEvent:e,isTouch:!0,subjectEl:this.subjectEl,pageX:n,pageY:r,deltaX:s,deltaY:o}}}function Ha(e){Na&&e.preventDefault()}class Ba{constructor(){this.isVisible=!1,this.sourceEl=null,this.mirrorEl=null,this.sourceElRect=null,this.parentNode=document.body,this.zIndex=9999,this.revertDuration=0}start(e,t,n){this.sourceEl=e,this.sourceElRect=this.sourceEl.getBoundingClientRect(),this.origScreenX=t-window.pageXOffset,this.origScreenY=n-window.pageYOffset,this.deltaX=0,this.deltaY=0,this.updateElPosition()}handleMove(e,t){this.deltaX=e-window.pageXOffset-this.origScreenX,this.deltaY=t-window.pageYOffset-this.origScreenY,this.updateElPosition()}setIsVisible(e){e?this.isVisible||(this.mirrorEl&&(this.mirrorEl.style.display=""),this.isVisible=e,this.updateElPosition()):this.isVisible&&(this.mirrorEl&&(this.mirrorEl.style.display="none"),this.isVisible=e)}stop(e,t){let n=()=>{this.cleanup(),t()};e&&this.mirrorEl&&this.isVisible&&this.revertDuration&&(this.deltaX||this.deltaY)?this.doRevertAnimation(n,this.revertDuration):setTimeout(n,0)}doRevertAnimation(e,t){let n=this.mirrorEl,r=this.sourceEl.getBoundingClientRect();n.style.transition="top "+t+"ms,left "+t+"ms",Be(n,{left:r.left,top:r.top}),Ge(n,()=>{n.style.transition="",e()})}cleanup(){this.mirrorEl&&(Ie(this.mirrorEl),this.mirrorEl=null),this.sourceEl=null}updateElPosition(){this.sourceEl&&this.isVisible&&Be(this.getMirrorEl(),{left:this.sourceElRect.left+this.deltaX,top:this.sourceElRect.top+this.deltaY})}getMirrorEl(){let e=this.sourceElRect,t=this.mirrorEl;return t||(t=this.mirrorEl=this.sourceEl.cloneNode(!0),t.style.userSelect="none",t.style.webkitUserSelect="none",t.classList.add("fc-event-dragging"),Be(t,{position:"fixed",zIndex:this.zIndex,visibility:"",boxSizing:"border-box",width:e.right-e.left,height:e.bottom-e.top,right:"auto",bottom:"auto",margin:0}),this.parentNode.appendChild(t)),t}}class ja extends ss{constructor(e,t){super(),this.handleScroll=()=>{this.scrollTop=this.scrollController.getScrollTop(),this.scrollLeft=this.scrollController.getScrollLeft(),this.handleScrollChange()},this.scrollController=e,this.doesListening=t,this.scrollTop=this.origScrollTop=e.getScrollTop(),this.scrollLeft=this.origScrollLeft=e.getScrollLeft(),this.scrollWidth=e.getScrollWidth(),this.scrollHeight=e.getScrollHeight(),this.clientWidth=e.getClientWidth(),this.clientHeight=e.getClientHeight(),this.clientRect=this.computeClientRect(),this.doesListening&&this.getEventTarget().addEventListener("scroll",this.handleScroll)}destroy(){this.doesListening&&this.getEventTarget().removeEventListener("scroll",this.handleScroll)}getScrollTop(){return this.scrollTop}getScrollLeft(){return this.scrollLeft}setScrollTop(e){this.scrollController.setScrollTop(e),this.doesListening||(this.scrollTop=Math.max(Math.min(e,this.getMaxScrollTop()),0),this.handleScrollChange())}setScrollLeft(e){this.scrollController.setScrollLeft(e),this.doesListening||(this.scrollLeft=Math.max(Math.min(e,this.getMaxScrollLeft()),0),this.handleScrollChange())}getClientWidth(){return this.clientWidth}getClientHeight(){return this.clientHeight}getScrollWidth(){return this.scrollWidth}getScrollHeight(){return this.scrollHeight}handleScrollChange(){}}class za extends ja{constructor(e,t){super(new os(e),t)}getEventTarget(){return this.scrollController.el}computeClientRect(){return es(this.scrollController.el)}}class Ua extends ja{constructor(e){super(new as,e)}getEventTarget(){return window}computeClientRect(){return{left:this.scrollLeft,right:this.scrollLeft+this.clientWidth,top:this.scrollTop,bottom:this.scrollTop+this.clientHeight}}handleScrollChange(){this.clientRect=this.computeClientRect()}}const Wa="function"==typeof performance?performance.now:Date.now;class La{constructor(){this.isEnabled=!0,this.scrollQuery=[window,".fc-scroller"],this.edgeThreshold=50,this.maxVelocity=300,this.pointerScreenX=null,this.pointerScreenY=null,this.isAnimating=!1,this.scrollCaches=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.animate=()=>{if(this.isAnimating){let e=this.computeBestEdge(this.pointerScreenX+window.pageXOffset,this.pointerScreenY+window.pageYOffset);if(e){let t=Wa();this.handleSide(e,(t-this.msSinceRequest)/1e3),this.requestAnimation(t)}else this.isAnimating=!1}}}start(e,t,n){this.isEnabled&&(this.scrollCaches=this.buildCaches(n),this.pointerScreenX=null,this.pointerScreenY=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.handleMove(e,t))}handleMove(e,t){if(this.isEnabled){let n=e-window.pageXOffset,r=t-window.pageYOffset,i=null===this.pointerScreenY?0:r-this.pointerScreenY,s=null===this.pointerScreenX?0:n-this.pointerScreenX;i<0?this.everMovedUp=!0:i>0&&(this.everMovedDown=!0),s<0?this.everMovedLeft=!0:s>0&&(this.everMovedRight=!0),this.pointerScreenX=n,this.pointerScreenY=r,this.isAnimating||(this.isAnimating=!0,this.requestAnimation(Wa()))}}stop(){if(this.isEnabled){this.isAnimating=!1;for(let e of this.scrollCaches)e.destroy();this.scrollCaches=null}}requestAnimation(e){this.msSinceRequest=e,requestAnimationFrame(this.animate)}handleSide(e,t){let{scrollCache:n}=e,{edgeThreshold:r}=this,i=r-e.distance,s=i*i/(r*r)*this.maxVelocity*t,o=1;switch(e.name){case"left":o=-1;case"right":n.setScrollLeft(n.getScrollLeft()+s*o);break;case"top":o=-1;case"bottom":n.setScrollTop(n.getScrollTop()+s*o)}}computeBestEdge(e,t){let{edgeThreshold:n}=this,r=null,i=this.scrollCaches||[];for(let s of i){let i=s.clientRect,o=e-i.left,a=i.right-e,l=t-i.top,c=i.bottom-t;o>=0&&a>=0&&l>=0&&c>=0&&(l<=n&&this.everMovedUp&&s.canScrollUp()&&(!r||r.distance>l)&&(r={scrollCache:s,name:"top",distance:l}),c<=n&&this.everMovedDown&&s.canScrollDown()&&(!r||r.distance>c)&&(r={scrollCache:s,name:"bottom",distance:c}),o<=n&&this.everMovedLeft&&s.canScrollLeft()&&(!r||r.distance>o)&&(r={scrollCache:s,name:"left",distance:o}),a<=n&&this.everMovedRight&&s.canScrollRight()&&(!r||r.distance>a)&&(r={scrollCache:s,name:"right",distance:a}))}return r}buildCaches(e){return this.queryScrollEls(e).map(e=>e===window?new Ua(!1):new za(e,!1))}queryScrollEls(e){let t=[];for(let n of this.scrollQuery)"object"==typeof n?t.push(n):t.push(...Array.prototype.slice.call(e.getRootNode().querySelectorAll(n)));return t}}class Fa extends ms{constructor(e,t){super(e),this.containerEl=e,this.delay=null,this.minDistance=0,this.touchScrollAllowed=!0,this.mirrorNeedsRevert=!1,this.isInteracting=!1,this.isDragging=!1,this.isDelayEnded=!1,this.isDistanceSurpassed=!1,this.delayTimeoutId=null,this.onPointerDown=e=>{this.isDragging||(this.isInteracting=!0,this.isDelayEnded=!1,this.isDistanceSurpassed=!1,Je(document.body),et(document.body),e.isTouch||e.origEvent.preventDefault(),this.emitter.trigger("pointerdown",e),this.isInteracting&&!this.pointer.shouldIgnoreMove&&(this.mirror.setIsVisible(!1),this.mirror.start(e.subjectEl,e.pageX,e.pageY),this.startDelay(e),this.minDistance||this.handleDistanceSurpassed(e)))},this.onPointerMove=e=>{if(this.isInteracting){if(this.emitter.trigger("pointermove",e),!this.isDistanceSurpassed){let t,n=this.minDistance,{deltaX:r,deltaY:i}=e;t=r*r+i*i,t>=n*n&&this.handleDistanceSurpassed(e)}this.isDragging&&("scroll"!==e.origEvent.type&&(this.mirror.handleMove(e.pageX,e.pageY),this.autoScroller.handleMove(e.pageX,e.pageY)),this.emitter.trigger("dragmove",e))}},this.onPointerUp=e=>{this.isInteracting&&(this.isInteracting=!1,Ke(document.body),tt(document.body),this.emitter.trigger("pointerup",e),this.isDragging&&(this.autoScroller.stop(),this.tryStopDrag(e)),this.delayTimeoutId&&(clearTimeout(this.delayTimeoutId),this.delayTimeoutId=null))};let n=this.pointer=new Pa(e);n.emitter.on("pointerdown",this.onPointerDown),n.emitter.on("pointermove",this.onPointerMove),n.emitter.on("pointerup",this.onPointerUp),t&&(n.selector=t),this.mirror=new Ba,this.autoScroller=new La}destroy(){this.pointer.destroy(),this.onPointerUp({})}startDelay(e){"number"==typeof this.delay?this.delayTimeoutId=setTimeout(()=>{this.delayTimeoutId=null,this.handleDelayEnd(e)},this.delay):this.handleDelayEnd(e)}handleDelayEnd(e){this.isDelayEnded=!0,this.tryStartDrag(e)}handleDistanceSurpassed(e){this.isDistanceSurpassed=!0,this.tryStartDrag(e)}tryStartDrag(e){this.isDelayEnded&&this.isDistanceSurpassed&&(this.pointer.wasTouchScroll&&!this.touchScrollAllowed||(this.isDragging=!0,this.mirrorNeedsRevert=!1,this.autoScroller.start(e.pageX,e.pageY,this.containerEl),this.emitter.trigger("dragstart",e),!1===this.touchScrollAllowed&&this.pointer.cancelTouchScroll()))}tryStopDrag(e){this.mirror.stop(this.mirrorNeedsRevert,this.stopDrag.bind(this,e))}stopDrag(e){this.isDragging=!1,this.emitter.trigger("dragend",e)}setIgnoreMove(e){this.pointer.shouldIgnoreMove=e}setMirrorIsVisible(e){this.mirror.setIsVisible(e)}setMirrorNeedsRevert(e){this.mirrorNeedsRevert=e}setAutoScrollEnabled(e){this.autoScroller.isEnabled=e}}class Va{constructor(e){this.origRect=ts(e),this.scrollCaches=ns(e).map(e=>new za(e,!0))}destroy(){for(let e of this.scrollCaches)e.destroy()}computeLeft(){let e=this.origRect.left;for(let t of this.scrollCaches)e+=t.origScrollLeft-t.getScrollLeft();return e}computeTop(){let e=this.origRect.top;for(let t of this.scrollCaches)e+=t.origScrollTop-t.getScrollTop();return e}isWithinClipping(e,t){let n={left:e,top:t};for(let e of this.scrollCaches)if(!Ga(e.getEventTarget())&&!Pi(n,e.clientRect))return!1;return!0}}function Ga(e){let t=e.tagName;return"HTML"===t||"BODY"===t}class Qa{constructor(e,t){this.useSubjectCenter=!1,this.requireInitial=!0,this.initialHit=null,this.movingHit=null,this.finalHit=null,this.handlePointerDown=e=>{let{dragging:t}=this;this.initialHit=null,this.movingHit=null,this.finalHit=null,this.prepareHits(),this.processFirstCoord(e),this.initialHit||!this.requireInitial?(t.setIgnoreMove(!1),this.emitter.trigger("pointerdown",e)):t.setIgnoreMove(!0)},this.handleDragStart=e=>{this.emitter.trigger("dragstart",e),this.handleMove(e,!0)},this.handleDragMove=e=>{this.emitter.trigger("dragmove",e),this.handleMove(e)},this.handlePointerUp=e=>{this.releaseHits(),this.emitter.trigger("pointerup",e)},this.handleDragEnd=e=>{this.movingHit&&this.emitter.trigger("hitupdate",null,!0,e),this.finalHit=this.movingHit,this.movingHit=null,this.emitter.trigger("dragend",e)},this.droppableStore=t,e.emitter.on("pointerdown",this.handlePointerDown),e.emitter.on("dragstart",this.handleDragStart),e.emitter.on("dragmove",this.handleDragMove),e.emitter.on("pointerup",this.handlePointerUp),e.emitter.on("dragend",this.handleDragEnd),this.dragging=e,this.emitter=new Gr}processFirstCoord(e){let t,n={left:e.pageX,top:e.pageY},r=n,i=e.subjectEl;i instanceof HTMLElement&&(t=ts(i),r=Bi(r,t));let s=this.initialHit=this.queryHitForOffset(r.left,r.top);if(s){if(this.useSubjectCenter&&t){let e=Hi(t,s.rect);e&&(r=ji(e))}this.coordAdjust=zi(r,n)}else this.coordAdjust={left:0,top:0}}handleMove(e,t){let n=this.queryHitForOffset(e.pageX+this.coordAdjust.left,e.pageY+this.coordAdjust.top);!t&&qa(this.movingHit,n)||(this.movingHit=n,this.emitter.trigger("hitupdate",n,!1,e))}prepareHits(){this.offsetTrackers=An(this.droppableStore,e=>(e.component.prepareHits(),new Va(e.el)))}releaseHits(){let{offsetTrackers:e}=this;for(let t in e)e[t].destroy();this.offsetTrackers={}}queryHitForOffset(e,t){let{droppableStore:n,offsetTrackers:r}=this,i=null;for(let s in n){let o=n[s].component,a=r[s];if(a&&a.isWithinClipping(e,t)){let n=a.computeLeft(),r=a.computeTop(),l=e-n,c=t-r,{origRect:d}=a,u=d.right-d.left,h=d.bottom-d.top;if(l>=0&&l<u&&c>=0&&c<h){let e=o.queryHit(l,c,u,h);e&&ar(e.dateProfile.activeRange,e.dateSpan.range)&&(!i||e.layer>i.layer)&&(e.componentId=s,e.context=o.context,e.rect.left+=n,e.rect.right+=n,e.rect.top+=r,e.rect.bottom+=r,i=e)}}}return i}}function qa(e,t){return!e&&!t||Boolean(e)===Boolean(t)&&Ai(e.dateSpan,t.dateSpan)}function Ya(e,t){let n={};for(let r of t.pluginHooks.datePointTransforms)Object.assign(n,r(e,t));var r,i;return Object.assign(n,(r=e,{date:(i=t.dateEnv).toDate(r.range.start),dateStr:i.formatIso(r.range.start,{omitTime:r.allDay}),allDay:r.allDay})),n}class Za extends Mi{constructor(e){super(e),this.subjectEl=null,this.subjectSeg=null,this.isDragging=!1,this.eventRange=null,this.relevantEvents=null,this.receivingContext=null,this.validMutation=null,this.mutatedRelevantEvents=null,this.handlePointerDown=e=>{let t=e.origEvent.target,{component:n,dragging:r}=this,{mirror:i}=r,{options:s}=n.context,o=n.context;this.subjectEl=e.subjectEl;let a=this.subjectSeg=ai(e.subjectEl),l=(this.eventRange=a.eventRange).instance.instanceId;this.relevantEvents=xr(o.getCurrentData().eventStore,l),r.minDistance=e.isTouch?0:s.eventDragMinDistance,r.delay=e.isTouch&&l!==n.props.eventSelection?function(e){let{options:t}=e.context,n=t.eventLongPressDelay;null==n&&(n=t.longPressDelay);return n}(n):null,s.fixedMirrorParent?i.parentNode=s.fixedMirrorParent:i.parentNode=Oe(t,".fc"),i.revertDuration=s.dragRevertDuration;let c=n.isValidSegDownEl(t)&&!Oe(t,".fc-event-resizer");r.setIgnoreMove(!c),this.isDragging=c&&e.subjectEl.classList.contains("fc-event-draggable")},this.handleDragStart=e=>{let t=this.component.context,n=this.eventRange,r=n.instance.instanceId;e.isTouch?r!==this.component.props.eventSelection&&t.dispatch({type:"SELECT_EVENT",eventInstanceId:r}):t.dispatch({type:"UNSELECT_EVENT"}),this.isDragging&&(t.calendarApi.unselect(e),t.emitter.trigger("eventDragStart",{el:this.subjectEl,event:new ti(t,n.def,n.instance),jsEvent:e.origEvent,view:t.viewApi}))},this.handleHitUpdate=(e,t)=>{if(!this.isDragging)return;let n=this.relevantEvents,r=this.hitDragging.initialHit,i=this.component.context,s=null,o=null,a=null,l=!1,c={affectedEvents:n,mutatedEvents:{defs:{},instances:{}},isEvent:!0};if(e){s=e.context;let t=s.options;i===s||t.editable&&t.droppable?(o=function(e,t,n){let r=e.dateSpan,i=t.dateSpan,s=r.range.start,o=i.range.start,a={};r.allDay!==i.allDay&&(a.allDay=i.allDay,a.hasEnd=t.context.options.allDayMaintainDuration,i.allDay&&(s=Mt(s)));let l=hr(s,o,e.context.dateEnv,e.componentId===t.componentId?e.largeUnit:null);l.milliseconds&&(a.allDay=!1);let c={datesDelta:l,standardProps:a};for(let r of n)r(c,e,t);return c}(r,e,s.getCurrentData().pluginHooks.eventDragMutationMassagers),o&&(a=$r(n,s.getCurrentData().eventUiBases,o,s),c.mutatedEvents=a,Ns(c,e.dateProfile,s)||(l=!0,o=null,a=null,c.mutatedEvents={defs:{},instances:{}}))):s=null}this.displayDrag(s,c),l?Xe():$e(),t||(i===s&&qa(r,e)&&(o=null),this.dragging.setMirrorNeedsRevert(!o),this.dragging.setMirrorIsVisible(!e||!this.subjectEl.getRootNode().querySelector(".fc-event-mirror")),this.receivingContext=s,this.validMutation=o,this.mutatedRelevantEvents=a)},this.handlePointerUp=()=>{this.isDragging||this.cleanup()},this.handleDragEnd=e=>{if(this.isDragging){let t=this.component.context,n=t.viewApi,{receivingContext:r,validMutation:i}=this,s=this.eventRange.def,o=this.eventRange.instance,a=new ti(t,s,o),l=this.relevantEvents,c=this.mutatedRelevantEvents,{finalHit:d}=this.hitDragging;if(this.clearDrag(),t.emitter.trigger("eventDragStop",{el:this.subjectEl,event:a,jsEvent:e.origEvent,view:n}),i){if(r===t){let r=new ti(t,c.defs[s.defId],o?c.instances[o.instanceId]:null);t.dispatch({type:"MERGE_EVENTS",eventStore:c});let d={oldEvent:a,event:r,relatedEvents:ri(c,t,o),revert(){t.dispatch({type:"MERGE_EVENTS",eventStore:l})}},u={};for(let e of t.getCurrentData().pluginHooks.eventDropTransformers)Object.assign(u,e(i,t));t.emitter.trigger("eventDrop",Object.assign(Object.assign(Object.assign({},d),u),{el:e.subjectEl,delta:i.datesDelta,jsEvent:e.origEvent,view:n})),t.emitter.trigger("eventChange",d)}else if(r){let i={event:a,relatedEvents:ri(l,t,o),revert(){t.dispatch({type:"MERGE_EVENTS",eventStore:l})}};t.emitter.trigger("eventLeave",Object.assign(Object.assign({},i),{draggedEl:e.subjectEl,view:n})),t.dispatch({type:"REMOVE_EVENTS",eventStore:l}),t.emitter.trigger("eventRemove",i);let u=c.defs[s.defId],h=c.instances[o.instanceId],f=new ti(r,u,h);r.dispatch({type:"MERGE_EVENTS",eventStore:c});let g={event:f,relatedEvents:ri(c,r,h),revert(){r.dispatch({type:"REMOVE_EVENTS",eventStore:c})}};r.emitter.trigger("eventAdd",g),e.isTouch&&r.dispatch({type:"SELECT_EVENT",eventInstanceId:o.instanceId}),r.emitter.trigger("drop",Object.assign(Object.assign({},Ya(d.dateSpan,r)),{draggedEl:e.subjectEl,jsEvent:e.origEvent,view:d.context.viewApi})),r.emitter.trigger("eventReceive",Object.assign(Object.assign({},g),{draggedEl:e.subjectEl,view:d.context.viewApi}))}}else t.emitter.trigger("_noEventDrop")}this.cleanup()};let{component:t}=this,{options:n}=t.context,r=this.dragging=new Fa(e.el);r.pointer.selector=Za.SELECTOR,r.touchScrollAllowed=!1,r.autoScroller.isEnabled=n.dragScroll;let i=this.hitDragging=new Qa(this.dragging,Oi);i.useSubjectCenter=e.useEventCenter,i.emitter.on("pointerdown",this.handlePointerDown),i.emitter.on("dragstart",this.handleDragStart),i.emitter.on("hitupdate",this.handleHitUpdate),i.emitter.on("pointerup",this.handlePointerUp),i.emitter.on("dragend",this.handleDragEnd)}destroy(){this.dragging.destroy()}displayDrag(e,t){let n=this.component.context,r=this.receivingContext;r&&r!==e&&(r===n?r.dispatch({type:"SET_EVENT_DRAG",state:{affectedEvents:t.affectedEvents,mutatedEvents:{defs:{},instances:{}},isEvent:!0}}):r.dispatch({type:"UNSET_EVENT_DRAG"})),e&&e.dispatch({type:"SET_EVENT_DRAG",state:t})}clearDrag(){let e=this.component.context,{receivingContext:t}=this;t&&t.dispatch({type:"UNSET_EVENT_DRAG"}),e!==t&&e.dispatch({type:"UNSET_EVENT_DRAG"})}cleanup(){this.subjectSeg=null,this.isDragging=!1,this.eventRange=null,this.relevantEvents=null,this.receivingContext=null,this.validMutation=null,this.mutatedRelevantEvents=null}}Za.SELECTOR=".fc-event-draggable, .fc-event-resizable";const Xa={fixedMirrorParent:yn},$a={dateClick:yn,eventDragStart:yn,eventDragStop:yn,eventDrop:yn,eventResizeStart:yn,eventResizeStop:yn,eventResize:yn,drop:yn,eventReceive:yn,eventLeave:yn};class Ja{constructor(e,t){this.receivingContext=null,this.droppableEvent=null,this.suppliedDragMeta=null,this.dragMeta=null,this.handleDragStart=e=>{this.dragMeta=this.buildDragMeta(e.subjectEl)},this.handleHitUpdate=(e,t,n)=>{let{dragging:r}=this.hitDragging,i=null,s=null,o=!1,a={affectedEvents:{defs:{},instances:{}},mutatedEvents:{defs:{},instances:{}},isEvent:this.dragMeta.create};e&&(i=e.context,this.canDropElOnCalendar(n.subjectEl,i)&&(s=function(e,t,n){let r=Object.assign({},t.leftoverProps);for(let i of n.pluginHooks.externalDefTransforms)Object.assign(r,i(e,t));let{refined:i,extra:s}=Ar(r,n),o=wr(i,s,t.sourceId,e.allDay,n.options.forceEventDuration||Boolean(t.duration),n),a=e.range.start;e.allDay&&t.startTime&&(a=n.dateEnv.add(a,t.startTime));let l=t.duration?n.dateEnv.add(a,t.duration):Xr(e.allDay,a,n),c=pr(o.defId,{start:a,end:l});return{def:o,instance:c}}(e.dateSpan,this.dragMeta,i),a.mutatedEvents=Rr(s),o=!Ns(a,e.dateProfile,i),o&&(a.mutatedEvents={defs:{},instances:{}},s=null))),this.displayDrag(i,a),r.setMirrorIsVisible(t||!s||!document.querySelector(".fc-event-mirror")),o?Xe():$e(),t||(r.setMirrorNeedsRevert(!s),this.receivingContext=i,this.droppableEvent=s)},this.handleDragEnd=e=>{let{receivingContext:t,droppableEvent:n}=this;if(this.clearDrag(),t&&n){let r=this.hitDragging.finalHit,i=r.context.viewApi,s=this.dragMeta;if(t.emitter.trigger("drop",Object.assign(Object.assign({},Ya(r.dateSpan,t)),{draggedEl:e.subjectEl,jsEvent:e.origEvent,view:i})),s.create){let r=Rr(n);t.dispatch({type:"MERGE_EVENTS",eventStore:r}),e.isTouch&&t.dispatch({type:"SELECT_EVENT",eventInstanceId:n.instance.instanceId}),t.emitter.trigger("eventReceive",{event:new ti(t,n.def,n.instance),relatedEvents:[],revert(){t.dispatch({type:"REMOVE_EVENTS",eventStore:r})},draggedEl:e.subjectEl,view:i})}}this.receivingContext=null,this.droppableEvent=null};let n=this.hitDragging=new Qa(e,Oi);n.requireInitial=!1,n.emitter.on("dragstart",this.handleDragStart),n.emitter.on("hitupdate",this.handleHitUpdate),n.emitter.on("dragend",this.handleDragEnd),this.suppliedDragMeta=t}buildDragMeta(e){return"object"==typeof this.suppliedDragMeta?bs(this.suppliedDragMeta):"function"==typeof this.suppliedDragMeta?bs(this.suppliedDragMeta(e)):function(e){let t=function(e,t){let n=vs.dataAttrPrefix,r=(n?n+"-":"")+t;return e.getAttribute("data-"+r)||""}(e,"event");return bs(t?JSON.parse(t):{create:!1})}(e)}displayDrag(e,t){let n=this.receivingContext;n&&n!==e&&n.dispatch({type:"UNSET_EVENT_DRAG"}),e&&e.dispatch({type:"SET_EVENT_DRAG",state:t})}clearDrag(){this.receivingContext&&this.receivingContext.dispatch({type:"UNSET_EVENT_DRAG"})}canDropElOnCalendar(e,t){let n=t.options.dropAccept;return"function"==typeof n?n.call(t.calendarApi,e):"string"!=typeof n||!n||Boolean(Ne(e,n))}}vs.dataAttrPrefix="";class Ka extends ms{constructor(e){super(e),this.shouldIgnoreMove=!1,this.mirrorSelector="",this.currentMirrorEl=null,this.handlePointerDown=e=>{this.emitter.trigger("pointerdown",e),this.shouldIgnoreMove||this.emitter.trigger("dragstart",e)},this.handlePointerMove=e=>{this.shouldIgnoreMove||this.emitter.trigger("dragmove",e)},this.handlePointerUp=e=>{this.emitter.trigger("pointerup",e),this.shouldIgnoreMove||this.emitter.trigger("dragend",e)};let t=this.pointer=new Pa(e);t.emitter.on("pointerdown",this.handlePointerDown),t.emitter.on("pointermove",this.handlePointerMove),t.emitter.on("pointerup",this.handlePointerUp)}destroy(){this.pointer.destroy()}setIgnoreMove(e){this.shouldIgnoreMove=e}setMirrorIsVisible(e){if(e)this.currentMirrorEl&&(this.currentMirrorEl.style.visibility="",this.currentMirrorEl=null);else{let e=this.mirrorSelector?document.querySelector(this.mirrorSelector):null;e&&(this.currentMirrorEl=e,e.style.visibility="hidden")}}}var el=Po({name:"@fullcalendar/interaction",componentInteractions:[class extends Mi{constructor(e){super(e),this.handlePointerDown=e=>{let{dragging:t}=this,n=e.origEvent.target;t.setIgnoreMove(!this.component.isValidDateDownEl(n))},this.handleDragEnd=e=>{let{component:t}=this,{pointer:n}=this.dragging;if(!n.wasTouchScroll){let{initialHit:n,finalHit:r}=this.hitDragging;if(n&&r&&qa(n,r)){let{context:r}=t,i=Object.assign(Object.assign({},Ya(n.dateSpan,r)),{dayEl:n.dayEl,jsEvent:e.origEvent,view:r.viewApi||r.calendarApi.view});r.emitter.trigger("dateClick",i)}}},this.dragging=new Fa(e.el),this.dragging.autoScroller.isEnabled=!1;let t=this.hitDragging=new Qa(this.dragging,Ii(e));t.emitter.on("pointerdown",this.handlePointerDown),t.emitter.on("dragend",this.handleDragEnd)}destroy(){this.dragging.destroy()}},class extends Mi{constructor(e){super(e),this.dragSelection=null,this.handlePointerDown=e=>{let{component:t,dragging:n}=this,{options:r}=t.context,i=r.selectable&&t.isValidDateDownEl(e.origEvent.target);n.setIgnoreMove(!i),n.delay=e.isTouch?function(e){let{options:t}=e.context,n=t.selectLongPressDelay;null==n&&(n=t.longPressDelay);return n}(t):null},this.handleDragStart=e=>{this.component.context.calendarApi.unselect(e)},this.handleHitUpdate=(e,t)=>{let{context:n}=this.component,r=null,i=!1;if(e){let t=this.hitDragging.initialHit;e.componentId===t.componentId&&this.isHitComboAllowed&&!this.isHitComboAllowed(t,e)||(r=function(e,t,n){let r=e.dateSpan,i=t.dateSpan,s=[r.range.start,r.range.end,i.range.start,i.range.end];s.sort(lt);let o={};for(let r of n){let n=r(e,t);if(!1===n)return null;n&&Object.assign(o,n)}return o.range={start:s[0],end:s[3]},o.allDay=r.allDay,o}(t,e,n.pluginHooks.dateSelectionTransformers)),r&&Ps(r,e.dateProfile,n)||(i=!0,r=null)}r?n.dispatch({type:"SELECT_DATES",selection:r}):t||n.dispatch({type:"UNSELECT_DATES"}),i?Xe():$e(),t||(this.dragSelection=r)},this.handlePointerUp=e=>{this.dragSelection&&(Yr(this.dragSelection,e,this.component.context),this.dragSelection=null)};let{component:t}=e,{options:n}=t.context,r=this.dragging=new Fa(e.el);r.touchScrollAllowed=!1,r.minDistance=n.selectMinDistance||0,r.autoScroller.isEnabled=n.dragScroll;let i=this.hitDragging=new Qa(this.dragging,Ii(e));i.emitter.on("pointerdown",this.handlePointerDown),i.emitter.on("dragstart",this.handleDragStart),i.emitter.on("hitupdate",this.handleHitUpdate),i.emitter.on("pointerup",this.handlePointerUp)}destroy(){this.dragging.destroy()}},Za,class extends Mi{constructor(e){super(e),this.draggingSegEl=null,this.draggingSeg=null,this.eventRange=null,this.relevantEvents=null,this.validMutation=null,this.mutatedRelevantEvents=null,this.handlePointerDown=e=>{let{component:t}=this,n=ai(this.querySegEl(e)),r=this.eventRange=n.eventRange;this.dragging.minDistance=t.context.options.eventDragMinDistance,this.dragging.setIgnoreMove(!this.component.isValidSegDownEl(e.origEvent.target)||e.isTouch&&this.component.props.eventSelection!==r.instance.instanceId)},this.handleDragStart=e=>{let{context:t}=this.component,n=this.eventRange;this.relevantEvents=xr(t.getCurrentData().eventStore,this.eventRange.instance.instanceId);let r=this.querySegEl(e);this.draggingSegEl=r,this.draggingSeg=ai(r),t.calendarApi.unselect(),t.emitter.trigger("eventResizeStart",{el:r,event:new ti(t,n.def,n.instance),jsEvent:e.origEvent,view:t.viewApi})},this.handleHitUpdate=(e,t,n)=>{let{context:r}=this.component,i=this.relevantEvents,s=this.hitDragging.initialHit,o=this.eventRange.instance,a=null,l=null,c=!1,d={affectedEvents:i,mutatedEvents:{defs:{},instances:{}},isEvent:!0};if(e){e.componentId===s.componentId&&this.isHitComboAllowed&&!this.isHitComboAllowed(s,e)||(a=function(e,t,n,r){let i=e.context.dateEnv,s=e.dateSpan.range.start,o=t.dateSpan.range.start,a=hr(s,o,i,e.largeUnit);if(n){if(i.add(r.start,a)<r.end)return{startDelta:a}}else if(i.add(r.end,a)>r.start)return{endDelta:a};return null}(s,e,n.subjectEl.classList.contains("fc-event-resizer-start"),o.range))}a&&(l=$r(i,r.getCurrentData().eventUiBases,a,r),d.mutatedEvents=l,Ns(d,e.dateProfile,r)||(c=!0,a=null,l=null,d.mutatedEvents=null)),l?r.dispatch({type:"SET_EVENT_RESIZE",state:d}):r.dispatch({type:"UNSET_EVENT_RESIZE"}),c?Xe():$e(),t||(a&&qa(s,e)&&(a=null),this.validMutation=a,this.mutatedRelevantEvents=l)},this.handleDragEnd=e=>{let{context:t}=this.component,n=this.eventRange.def,r=this.eventRange.instance,i=new ti(t,n,r),s=this.relevantEvents,o=this.mutatedRelevantEvents;if(t.emitter.trigger("eventResizeStop",{el:this.draggingSegEl,event:i,jsEvent:e.origEvent,view:t.viewApi}),this.validMutation){let a=new ti(t,o.defs[n.defId],r?o.instances[r.instanceId]:null);t.dispatch({type:"MERGE_EVENTS",eventStore:o});let l={oldEvent:i,event:a,relatedEvents:ri(o,t,r),revert(){t.dispatch({type:"MERGE_EVENTS",eventStore:s})}};t.emitter.trigger("eventResize",Object.assign(Object.assign({},l),{el:this.draggingSegEl,startDelta:this.validMutation.startDelta||ft(0),endDelta:this.validMutation.endDelta||ft(0),jsEvent:e.origEvent,view:t.viewApi})),t.emitter.trigger("eventChange",l)}else t.emitter.trigger("_noEventResize");this.draggingSeg=null,this.relevantEvents=null,this.validMutation=null};let{component:t}=e,n=this.dragging=new Fa(e.el);n.pointer.selector=".fc-event-resizer",n.touchScrollAllowed=!1,n.autoScroller.isEnabled=t.context.options.dragScroll;let r=this.hitDragging=new Qa(this.dragging,Ii(e));r.emitter.on("pointerdown",this.handlePointerDown),r.emitter.on("dragstart",this.handleDragStart),r.emitter.on("hitupdate",this.handleHitUpdate),r.emitter.on("dragend",this.handleDragEnd)}destroy(){this.dragging.destroy()}querySegEl(e){return Oe(e.subjectEl,".fc-event")}}],calendarInteractions:[class{constructor(e){this.context=e,this.isRecentPointerDateSelect=!1,this.matchesCancel=!1,this.matchesEvent=!1,this.onSelect=e=>{e.jsEvent&&(this.isRecentPointerDateSelect=!0)},this.onDocumentPointerDown=e=>{let t=this.context.options.unselectCancel,n=ze(e.origEvent);this.matchesCancel=!!Oe(n,t),this.matchesEvent=!!Oe(n,Za.SELECTOR)},this.onDocumentPointerUp=e=>{let{context:t}=this,{documentPointer:n}=this,r=t.getCurrentData();if(!n.wasTouchScroll){if(r.dateSelection&&!this.isRecentPointerDateSelect){let n=t.options.unselectAuto;!n||n&&this.matchesCancel||t.calendarApi.unselect(e)}r.eventSelection&&!this.matchesEvent&&t.dispatch({type:"UNSELECT_EVENT"})}this.isRecentPointerDateSelect=!1};let t=this.documentPointer=new Pa(document);t.shouldIgnoreMove=!0,t.shouldWatchScroll=!1,t.emitter.on("pointerdown",this.onDocumentPointerDown),t.emitter.on("pointerup",this.onDocumentPointerUp),e.emitter.on("select",this.onSelect)}destroy(){this.context.emitter.off("select",this.onSelect),this.documentPointer.destroy()}}],elementDraggingImpl:Fa,optionRefiners:Xa,listenerRefiners:$a});class tl extends ls{constructor(){super(...arguments),this.headerElRef={current:null}}renderSimpleLayout(e,t){let{props:n,context:r}=this,i=[],s=no(r.options);return e&&i.push({type:"header",key:"header",isSticky:s,chunk:{elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}}),i.push({type:"body",key:"body",liquid:!0,chunk:{content:t}}),p(er,{elClasses:["fc-daygrid"],viewSpec:r.viewSpec},p(io,{liquid:!n.isHeightAuto&&!n.forPrint,collapsibleWidth:n.forPrint,cols:[],sections:i}))}renderHScrollLayout(e,t,n,r){let i=this.context.pluginHooks.scrollGridImpl;if(!i)throw new Error("No ScrollGrid implementation");let{props:s,context:o}=this,a=!s.forPrint&&no(o.options),l=!s.forPrint&&ro(o.options),c=[];return e&&c.push({type:"header",key:"header",isSticky:a,chunks:[{key:"main",elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}]}),c.push({type:"body",key:"body",liquid:!0,chunks:[{key:"main",content:t}]}),l&&c.push({type:"footer",key:"footer",isSticky:!0,chunks:[{key:"main",content:to}]}),p(er,{elClasses:["fc-daygrid"],viewSpec:o.viewSpec},p(i,{liquid:!s.isHeightAuto&&!s.forPrint,forPrint:s.forPrint,collapsibleWidth:s.forPrint,colGroups:[{cols:[{span:n,minWidth:r}]}],sections:c}))}}function nl(e,t){let n=[];for(let e=0;e<t;e+=1)n[e]=[];for(let t of e)n[t.row].push(t);return n}function rl(e,t){let n=[];for(let e=0;e<t;e+=1)n[e]=[];for(let t of e)n[t.firstCol].push(t);return n}function il(e,t){let n=[];if(e){for(let r=0;r<t;r+=1)n[r]={affectedInstances:e.affectedInstances,isEvent:e.isEvent,segs:[]};for(let t of e.segs)n[t.row].segs.push(t)}else for(let e=0;e<t;e+=1)n[e]=null;return n}const sl=an({hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"narrow"});function ol(e){let{display:t}=e.eventRange.ui;return"list-item"===t||"auto"===t&&!e.eventRange.def.allDay&&e.firstCol===e.lastCol&&e.isStart&&e.isEnd}class al extends Gn{render(){let{props:e}=this;return p(oo,Object.assign({},e,{elClasses:["fc-daygrid-event","fc-daygrid-block-event","fc-h-event"],defaultTimeFormat:sl,defaultDisplayEventEnd:e.defaultDisplayEventEnd,disableResizing:!e.seg.eventRange.def.allDay}))}}class ll extends Gn{render(){let{props:e,context:t}=this,{options:n}=t,{seg:r}=e,i=pi(r,n.eventTimeFormat||sl,t,!0,e.defaultDisplayEventEnd);return p(so,Object.assign({},e,{elTag:"a",elClasses:["fc-daygrid-event","fc-daygrid-dot-event"],elAttrs:bi(e.seg,t),defaultGenerator:cl,timeText:i,isResizing:!1,isDateSelecting:!1}))}}function cl(e){return p(y,null,p("div",{className:"fc-daygrid-event-dot",style:{borderColor:e.borderColor||e.backgroundColor}}),e.timeText&&p("div",{className:"fc-event-time"},e.timeText),p("div",{className:"fc-event-title"},e.event.title||p(y,null," ")))}class dl extends Gn{constructor(){super(...arguments),this.compileSegs=Gt(ul)}render(){let{props:e}=this,{allSegs:t,invisibleSegs:n}=this.compileSegs(e.singlePlacements);return p(So,{elClasses:["fc-daygrid-more-link"],dateProfile:e.dateProfile,todayRange:e.todayRange,allDayDate:e.allDayDate,moreCnt:e.moreCnt,allSegs:t,hiddenSegs:n,alignmentElRef:e.alignmentElRef,alignGridTop:e.alignGridTop,extraDateSpan:e.extraDateSpan,popoverContent:()=>{let n=(e.eventDrag?e.eventDrag.affectedInstances:null)||(e.eventResize?e.eventResize.affectedInstances:null)||{};return p(y,null,t.map(t=>{let r=t.eventRange.instance.instanceId;return p("div",{className:"fc-daygrid-event-harness",key:r,style:{visibility:n[r]?"hidden":""}},ol(t)?p(ll,Object.assign({seg:t,isDragging:!1,isSelected:r===e.eventSelection,defaultDisplayEventEnd:!1},mi(t,e.todayRange))):p(al,Object.assign({seg:t,isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:r===e.eventSelection,defaultDisplayEventEnd:!1},mi(t,e.todayRange))))}))}})}}function ul(e){let t=[],n=[];for(let r of e)t.push(r.seg),r.isVisible||n.push(r.seg);return{allSegs:t,invisibleSegs:n}}const hl=an({week:"narrow"});class fl extends ls{constructor(){super(...arguments),this.rootElRef={current:null},this.state={dayNumberId:We()},this.handleRootEl=e=>{Qn(this.rootElRef,e),Qn(this.props.elRef,e)}}render(){let{context:e,props:t,state:n,rootElRef:r}=this,{options:i,dateEnv:s}=e,{date:o,dateProfile:a}=t;const l=t.showDayNumber&&function(e,t,n){const{start:r,end:i}=t,s=Ct(i,-1),o=n.getYear(r),a=n.getMonth(r),l=n.getYear(s),c=n.getMonth(s);return!(o===l&&a===c)&&Boolean(e.valueOf()===r.valueOf()||1===n.getDay(e)&&e.valueOf()<i.valueOf())}(o,a.currentRange,s);return p(uo,{elTag:"td",elRef:this.handleRootEl,elClasses:["fc-daygrid-day",...t.extraClassNames||[]],elAttrs:Object.assign(Object.assign(Object.assign({},t.extraDataAttrs),t.showDayNumber?{"aria-labelledby":n.dayNumberId}:{}),{role:"gridcell"}),defaultGenerator:gl,date:o,dateProfile:a,todayRange:t.todayRange,showDayNumber:t.showDayNumber,isMonthStart:l,extraRenderProps:t.extraRenderProps},(s,a)=>p("div",{ref:t.innerElRef,className:"fc-daygrid-day-frame fc-scrollgrid-sync-inner",style:{minHeight:t.minHeight}},t.showWeekNumber&&p(vo,{elTag:"a",elClasses:["fc-daygrid-week-number"],elAttrs:qi(e,o,"week"),date:o,defaultFormat:hl}),!a.isDisabled&&(t.showDayNumber||ho(i)||t.forceDayTop)?p("div",{className:"fc-daygrid-day-top"},p(s,{elTag:"a",elClasses:["fc-daygrid-day-number",l&&"fc-daygrid-month-start"],elAttrs:Object.assign(Object.assign({},qi(e,o)),{id:n.dayNumberId})})):t.showDayNumber?p("div",{className:"fc-daygrid-day-top",style:{visibility:"hidden"}},p("a",{className:"fc-daygrid-day-number"}," ")):void 0,p("div",{className:"fc-daygrid-day-events",ref:t.fgContentElRef},t.fgContent,p("div",{className:"fc-daygrid-day-bottom",style:{marginTop:t.moreMarginTop}},p(dl,{allDayDate:o,singlePlacements:t.singlePlacements,moreCnt:t.moreCnt,alignmentElRef:r,alignGridTop:!t.showDayNumber,extraDateSpan:t.extraDateSpan,dateProfile:t.dateProfile,eventSelection:t.eventSelection,eventDrag:t.eventDrag,eventResize:t.eventResize,todayRange:t.todayRange}))),p("div",{className:"fc-daygrid-day-bg"},t.bgContent)))}}function gl(e){return e.dayNumberText||p(y,null," ")}function pl(e){return e.eventRange.instance.instanceId+":"+e.firstCol}function ml(e){return pl(e)+":"+e.lastCol}function vl(e,t,n,r,i,s,o){let a=new bl(t=>{let n=e[t.index].eventRange.instance.instanceId+":"+t.span.start+":"+(t.span.end-1);return i[n]||1});a.allowReslicing=!0,a.strictOrder=r,!0===t||!0===n?(a.maxCoord=s,a.hiddenConsumes=!0):"number"==typeof t?a.maxStackCnt=t:"number"==typeof n&&(a.maxStackCnt=n,a.hiddenConsumes=!0);let l=[],c=[];for(let t=0;t<e.length;t+=1){let n=e[t],r=ml(n);null!=i[r]?l.push({index:t,span:{start:n.firstCol,end:n.lastCol+1}}):c.push(n)}let d=a.addSegs(l),u=a.toRects(),{singleColPlacements:h,multiColPlacements:f,leftoverMargins:g}=function(e,t,n){let r=function(e,t){let n=[];for(let e=0;e<t;e+=1)n.push([]);for(let t of e)for(let e=t.span.start;e<t.span.end;e+=1)n[e].push(t);return n}(e,n.length),i=[],s=[],o=[];for(let e=0;e<n.length;e+=1){let a=r[e],l=[],c=0,d=0;for(let r of a){let i=t[r.index];l.push({seg:yl(i,e,e+1,n),isVisible:!0,isAbsolute:!1,absoluteTop:r.levelCoord,marginTop:r.levelCoord-c}),c=r.levelCoord+r.thickness}let u=[];c=0,d=0;for(let r of a){let i=t[r.index],s=r.span.end-r.span.start>1,o=r.span.start===e;d+=r.levelCoord-c,c=r.levelCoord+r.thickness,s?(d+=r.thickness,o&&u.push({seg:yl(i,r.span.start,r.span.end,n),isVisible:!0,isAbsolute:!0,absoluteTop:r.levelCoord,marginTop:0})):o&&(u.push({seg:yl(i,r.span.start,r.span.end,n),isVisible:!0,isAbsolute:!1,absoluteTop:r.levelCoord,marginTop:d}),d=0)}i.push(l),s.push(u),o.push(d)}return{singleColPlacements:i,multiColPlacements:s,leftoverMargins:o}}(u,e,o),p=[],m=[];for(let e of c){f[e.firstCol].push({seg:e,isVisible:!1,isAbsolute:!0,absoluteTop:0,marginTop:0});for(let t=e.firstCol;t<=e.lastCol;t+=1)h[t].push({seg:yl(e,t,t+1,o),isVisible:!1,isAbsolute:!1,absoluteTop:0,marginTop:0})}for(let e=0;e<o.length;e+=1)p.push(0);for(let t of d){let n=e[t.index],r=t.span;f[r.start].push({seg:yl(n,r.start,r.end,o),isVisible:!1,isAbsolute:!0,absoluteTop:0,marginTop:0});for(let e=r.start;e<r.end;e+=1)p[e]+=1,h[e].push({seg:yl(n,e,e+1,o),isVisible:!1,isAbsolute:!1,absoluteTop:0,marginTop:0})}for(let e=0;e<o.length;e+=1)m.push(g[e]);return{singleColPlacements:h,multiColPlacements:f,moreCnts:p,moreMarginTops:m}}function yl(e,t,n,r){if(e.firstCol===t&&e.lastCol===n-1)return e;let i=e.eventRange,s=i.range,o=ir(s,{start:r[t].date,end:wt(r[n-1].date,1)});return Object.assign(Object.assign({},e),{firstCol:t,lastCol:n-1,eventRange:{def:i.def,ui:Object.assign(Object.assign({},i.ui),{durationEditable:!1}),instance:i.instance,range:o},isStart:e.isStart&&o.start.valueOf()===s.start.valueOf(),isEnd:e.isEnd&&o.end.valueOf()===s.end.valueOf()})}class bl extends cs{constructor(){super(...arguments),this.hiddenConsumes=!1,this.forceHidden={}}addSegs(e){const t=super.addSegs(e),{entriesByLevel:n}=this,r=e=>!this.forceHidden[us(e)];for(let e=0;e<n.length;e+=1)n[e]=n[e].filter(r);return t}handleInvalidInsertion(e,t,n){const{entriesByLevel:r,forceHidden:i}=this,{touchingEntry:s,touchingLevel:o,touchingLateral:a}=e;if(this.hiddenConsumes&&s){const e=us(s);if(!i[e])if(this.allowReslicing){const e=Object.assign(Object.assign({},s),{span:fs(s.span,t.span)});i[us(e)]=!0,r[o][a]=e,n.push(e),this.splitEntry(s,t,n)}else i[e]=!0,n.push(s)}super.handleInvalidInsertion(e,t,n)}}class El extends ls{constructor(){super(...arguments),this.cellElRefs=new Vs,this.frameElRefs=new Vs,this.fgElRefs=new Vs,this.segHarnessRefs=new Vs,this.rootElRef={current:null},this.state={framePositions:null,maxContentHeight:null,segHeights:{}},this.handleResize=e=>{e&&this.updateSizing(!0)}}render(){let{props:e,state:t,context:n}=this,{options:r}=n,i=e.cells.length,s=rl(e.businessHourSegs,i),o=rl(e.bgEventSegs,i),a=rl(this.getHighlightSegs(),i),l=rl(this.getMirrorSegs(),i),{singleColPlacements:c,multiColPlacements:d,moreCnts:u,moreMarginTops:h}=vl(di(e.fgEventSegs,r.eventOrder),e.dayMaxEvents,e.dayMaxEventRows,r.eventOrderStrict,t.segHeights,t.maxContentHeight,e.cells),f=e.eventDrag&&e.eventDrag.affectedInstances||e.eventResize&&e.eventResize.affectedInstances||{};return p("tr",{ref:this.rootElRef,role:"row"},e.renderIntro&&e.renderIntro(),e.cells.map((t,n)=>{let r=this.renderFgSegs(n,e.forPrint?c[n]:d[n],e.todayRange,f),i=this.renderFgSegs(n,function(e,t){if(!e.length)return[];let n=function(e){let t={};for(let n of e)for(let e of n)t[e.seg.eventRange.instance.instanceId]=e.absoluteTop;return t}(t);return e.map(e=>({seg:e,isVisible:!0,isAbsolute:!0,absoluteTop:n[e.eventRange.instance.instanceId],marginTop:0}))}(l[n],d),e.todayRange,{},Boolean(e.eventDrag),Boolean(e.eventResize),!1);return p(fl,{key:t.key,elRef:this.cellElRefs.createRef(t.key),innerElRef:this.frameElRefs.createRef(t.key),dateProfile:e.dateProfile,date:t.date,showDayNumber:e.showDayNumbers,showWeekNumber:e.showWeekNumbers&&0===n,forceDayTop:e.showWeekNumbers,todayRange:e.todayRange,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,extraRenderProps:t.extraRenderProps,extraDataAttrs:t.extraDataAttrs,extraClassNames:t.extraClassNames,extraDateSpan:t.extraDateSpan,moreCnt:u[n],moreMarginTop:h[n],singlePlacements:c[n],fgContentElRef:this.fgElRefs.createRef(t.key),fgContent:p(y,null,p(y,null,r),p(y,null,i)),bgContent:p(y,null,this.renderFillSegs(a[n],"highlight"),this.renderFillSegs(s[n],"non-business"),this.renderFillSegs(o[n],"bg-event")),minHeight:e.cellMinHeight})}))}componentDidMount(){this.updateSizing(!0),this.context.addResizeHandler(this.handleResize)}componentDidUpdate(e,t){let n=this.props;this.updateSizing(!Cn(e,n))}componentWillUnmount(){this.context.removeResizeHandler(this.handleResize)}getHighlightSegs(){let{props:e}=this;return e.eventDrag&&e.eventDrag.segs.length?e.eventDrag.segs:e.eventResize&&e.eventResize.segs.length?e.eventResize.segs:e.dateSelectionSegs}getMirrorSegs(){let{props:e}=this;return e.eventResize&&e.eventResize.segs.length?e.eventResize.segs:[]}renderFgSegs(e,t,n,r,i,s,o){let{context:a}=this,{eventSelection:l}=this.props,{framePositions:c}=this.state,d=1===this.props.cells.length,u=i||s||o,h=[];if(c)for(let e of t){let{seg:t}=e,{instanceId:f}=t.eventRange.instance,g=e.isVisible&&!r[f],m=e.isAbsolute,v="",y="";m&&(a.isRtl?(y=0,v=c.lefts[t.lastCol]-c.lefts[t.firstCol]):(v=0,y=c.rights[t.firstCol]-c.rights[t.lastCol])),h.push(p("div",{className:"fc-daygrid-event-harness"+(m?" fc-daygrid-event-harness-abs":""),key:pl(t),ref:u?null:this.segHarnessRefs.createRef(ml(t)),style:{visibility:g?"":"hidden",marginTop:m?"":e.marginTop,top:m?e.absoluteTop:"",left:v,right:y}},ol(t)?p(ll,Object.assign({seg:t,isDragging:i,isSelected:f===l,defaultDisplayEventEnd:d},mi(t,n))):p(al,Object.assign({seg:t,isDragging:i,isResizing:s,isDateSelecting:o,isSelected:f===l,defaultDisplayEventEnd:d},mi(t,n)))))}return h}renderFillSegs(e,t){let{isRtl:n}=this.context,{todayRange:r}=this.props,{framePositions:i}=this.state,s=[];if(i)for(let o of e){let e=n?{right:0,left:i.lefts[o.lastCol]-i.lefts[o.firstCol]}:{left:0,right:i.rights[o.firstCol]-i.rights[o.lastCol]};s.push(p("div",{key:yi(o.eventRange),className:"fc-daygrid-bg-harness",style:e},"bg-event"===t?p(go,Object.assign({seg:o},mi(o,r))):mo(t)))}return p(y,{},...s)}updateSizing(e){let{props:t,state:n,frameElRefs:r}=this;if(!t.forPrint&&null!==t.clientWidth){if(e){let e=t.cells.map(e=>r.currentMap[e.key]);if(e.length){let t=this.rootElRef.current,r=new rs(t,e,!0,!1);n.framePositions&&n.framePositions.similarTo(r)||this.setState({framePositions:new rs(t,e,!0,!1)})}}const i=this.state.segHeights,s=this.querySegHeights(),o=!0===t.dayMaxEvents||!0===t.dayMaxEventRows;this.safeSetState({segHeights:Object.assign(Object.assign({},i),s),maxContentHeight:o?this.computeMaxContentHeight():null})}}querySegHeights(){let e=this.segHarnessRefs.currentMap,t={};for(let n in e){let r=Math.round(e[n].getBoundingClientRect().height);t[n]=Math.max(t[n]||0,r)}return t}computeMaxContentHeight(){let e=this.props.cells[0].key,t=this.cellElRefs.currentMap[e],n=this.fgElRefs.currentMap[e];return t.getBoundingClientRect().bottom-n.getBoundingClientRect().top}getCellEls(){let e=this.cellElRefs.currentMap;return this.props.cells.map(t=>e[t.key])}}El.addStateEquality({segHeights:Cn});class Sl extends ls{constructor(){super(...arguments),this.splitBusinessHourSegs=Gt(nl),this.splitBgEventSegs=Gt(nl),this.splitFgEventSegs=Gt(nl),this.splitDateSelectionSegs=Gt(nl),this.splitEventDrag=Gt(il),this.splitEventResize=Gt(il),this.rowRefs=new Vs}render(){let{props:e,context:t}=this,n=e.cells.length,r=this.splitBusinessHourSegs(e.businessHourSegs,n),i=this.splitBgEventSegs(e.bgEventSegs,n),s=this.splitFgEventSegs(e.fgEventSegs,n),o=this.splitDateSelectionSegs(e.dateSelectionSegs,n),a=this.splitEventDrag(e.eventDrag,n),l=this.splitEventResize(e.eventResize,n),c=n>=7&&e.clientWidth?e.clientWidth/t.options.aspectRatio/6:null;return p(Rs,{unit:"day"},(t,d)=>p(y,null,e.cells.map((t,u)=>p(El,{ref:this.rowRefs.createRef(u),key:t.length?t[0].date.toISOString():u,showDayNumbers:n>1,showWeekNumbers:e.showWeekNumbers,todayRange:d,dateProfile:e.dateProfile,cells:t,renderIntro:e.renderRowIntro,businessHourSegs:r[u],eventSelection:e.eventSelection,bgEventSegs:i[u].filter(Al),fgEventSegs:s[u],dateSelectionSegs:o[u],eventDrag:a[u],eventResize:l[u],dayMaxEvents:e.dayMaxEvents,dayMaxEventRows:e.dayMaxEventRows,clientWidth:e.clientWidth,clientHeight:e.clientHeight,cellMinHeight:c,forPrint:e.forPrint}))))}componentDidMount(){this.registerInteractiveComponent()}componentDidUpdate(){this.registerInteractiveComponent()}registerInteractiveComponent(){if(!this.rootEl){const e=this.rowRefs.currentMap[0].getCellEls()[0],t=e?e.closest(".fc-daygrid-body"):null;t&&(this.rootEl=t,this.context.registerInteractiveComponent(this,{el:t,isHitComboAllowed:this.props.isHitComboAllowed}))}}componentWillUnmount(){this.rootEl&&(this.context.unregisterInteractiveComponent(this),this.rootEl=null)}prepareHits(){this.rowPositions=new rs(this.rootEl,this.rowRefs.collect().map(e=>e.getCellEls()[0]),!1,!0),this.colPositions=new rs(this.rootEl,this.rowRefs.currentMap[0].getCellEls(),!0,!1)}queryHit(e,t){let{colPositions:n,rowPositions:r}=this,i=n.leftToIndex(e),s=r.topToIndex(t);if(null!=s&&null!=i){let e=this.props.cells[s][i];return{dateProfile:this.props.dateProfile,dateSpan:Object.assign({range:this.getCellRange(s,i),allDay:!0},e.extraDateSpan),dayEl:this.getCellEl(s,i),rect:{left:n.lefts[i],right:n.rights[i],top:r.tops[s],bottom:r.bottoms[s]},layer:0}}return null}getCellEl(e,t){return this.rowRefs.currentMap[e].getCellEls()[t]}getCellRange(e,t){let n=this.props.cells[e][t].date;return{start:n,end:wt(n,1)}}}function Al(e){return e.eventRange.def.allDay}class Dl extends ls{constructor(){super(...arguments),this.elRef={current:null},this.needsScrollReset=!1}render(){let{props:e}=this,{dayMaxEventRows:t,dayMaxEvents:n,expandRows:r}=e,i=!0===n||!0===t;i&&!r&&(i=!1,t=null,n=null);let s=["fc-daygrid-body",i?"fc-daygrid-body-balanced":"fc-daygrid-body-unbalanced",r?"":"fc-daygrid-body-natural"];return p("div",{ref:this.elRef,className:s.join(" "),style:{width:e.clientWidth,minWidth:e.tableMinWidth}},p("table",{role:"presentation",className:"fc-scrollgrid-sync-table",style:{width:e.clientWidth,minWidth:e.tableMinWidth,height:r?e.clientHeight:""}},e.colGroupNode,p("tbody",{role:"presentation"},p(Sl,{dateProfile:e.dateProfile,cells:e.cells,renderRowIntro:e.renderRowIntro,showWeekNumbers:e.showWeekNumbers,clientWidth:e.clientWidth,clientHeight:e.clientHeight,businessHourSegs:e.businessHourSegs,bgEventSegs:e.bgEventSegs,fgEventSegs:e.fgEventSegs,dateSelectionSegs:e.dateSelectionSegs,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,dayMaxEvents:n,dayMaxEventRows:t,forPrint:e.forPrint,isHitComboAllowed:e.isHitComboAllowed}))))}componentDidMount(){this.requestScrollReset()}componentDidUpdate(e){e.dateProfile!==this.props.dateProfile?this.requestScrollReset():this.flushScrollReset()}requestScrollReset(){this.needsScrollReset=!0,this.flushScrollReset()}flushScrollReset(){if(this.needsScrollReset&&this.props.clientWidth){const e=function(e,t){let n;t.currentRangeUnit.match(/year|month/)&&(n=e.querySelector(`[data-date="${Lt(t.currentDate)}-01"]`));n||(n=e.querySelector(`[data-date="${Wt(t.currentDate)}"]`));return n}(this.elRef.current,this.props.dateProfile);if(e){const t=e.closest(".fc-daygrid-body"),n=t.closest(".fc-scroller"),r=e.getBoundingClientRect().top-t.getBoundingClientRect().top;n.scrollTop=r?r+1:0}this.needsScrollReset=!1}}}class wl extends Is{constructor(){super(...arguments),this.forceDayIfListItem=!0}sliceRange(e,t){return t.sliceRange(e)}}class Cl extends ls{constructor(){super(...arguments),this.slicer=new wl,this.tableRef={current:null}}render(){let{props:e,context:t}=this;return p(Dl,Object.assign({ref:this.tableRef},this.slicer.sliceProps(e,e.dateProfile,e.nextDayThreshold,t,e.dayTableModel),{dateProfile:e.dateProfile,cells:e.dayTableModel.cells,colGroupNode:e.colGroupNode,tableMinWidth:e.tableMinWidth,renderRowIntro:e.renderRowIntro,dayMaxEvents:e.dayMaxEvents,dayMaxEventRows:e.dayMaxEventRows,showWeekNumbers:e.showWeekNumbers,expandRows:e.expandRows,headerAlignElRef:e.headerAlignElRef,clientWidth:e.clientWidth,clientHeight:e.clientHeight,forPrint:e.forPrint}))}}function Rl(e,t){let n=new ks(e.renderRange,t);return new Ms(n,/year|month|week/.test(e.currentRangeUnit))}class xl extends gr{buildRenderRange(e,t,n){let r=super.buildRenderRange(e,t,n),{props:i}=this;return _l({currentRange:r,snapToWeek:/^(year|month)$/.test(t),fixedWeekCount:i.fixedWeekCount,dateEnv:i.dateEnv})}}function _l(e){let t,{dateEnv:n,currentRange:r}=e,{start:i,end:s}=r;if(e.snapToWeek&&(i=n.startOfWeek(i),t=n.startOfWeek(s),t.valueOf()!==s.valueOf()&&(s=Dt(t,1))),e.fixedWeekCount){let e=n.startOfWeek(n.startOfMonth(wt(r.end,-1)));s=Dt(s,6-Math.ceil(Rt(e,s)))}return{start:i,end:s}}xe(':root{--fc-daygrid-event-dot-width:8px}.fc-daygrid-day-events:after,.fc-daygrid-day-events:before,.fc-daygrid-day-frame:after,.fc-daygrid-day-frame:before,.fc-daygrid-event-harness:after,.fc-daygrid-event-harness:before{clear:both;content:"";display:table}.fc .fc-daygrid-body{position:relative;z-index:1}.fc .fc-daygrid-day.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-daygrid-day-frame{min-height:100%;position:relative}.fc .fc-daygrid-day-top{display:flex;flex-direction:row-reverse}.fc .fc-day-other .fc-daygrid-day-top{opacity:.3}.fc .fc-daygrid-day-number{padding:4px;position:relative;z-index:4}.fc .fc-daygrid-month-start{font-size:1.1em;font-weight:700}.fc .fc-daygrid-day-events{margin-top:1px}.fc .fc-daygrid-body-balanced .fc-daygrid-day-events{left:0;position:absolute;right:0}.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events{min-height:2em;position:relative}.fc .fc-daygrid-body-natural .fc-daygrid-day-events{margin-bottom:1em}.fc .fc-daygrid-event-harness{position:relative}.fc .fc-daygrid-event-harness-abs{left:0;position:absolute;right:0;top:0}.fc .fc-daygrid-bg-harness{bottom:0;position:absolute;top:0}.fc .fc-daygrid-day-bg .fc-non-business{z-index:1}.fc .fc-daygrid-day-bg .fc-bg-event{z-index:2}.fc .fc-daygrid-day-bg .fc-highlight{z-index:3}.fc .fc-daygrid-event{margin-top:1px;z-index:6}.fc .fc-daygrid-event.fc-event-mirror{z-index:7}.fc .fc-daygrid-day-bottom{font-size:.85em;margin:0 2px}.fc .fc-daygrid-day-bottom:after,.fc .fc-daygrid-day-bottom:before{clear:both;content:"";display:table}.fc .fc-daygrid-more-link{border-radius:3px;cursor:pointer;line-height:1;margin-top:1px;max-width:100%;overflow:hidden;padding:2px;position:relative;white-space:nowrap;z-index:4}.fc .fc-daygrid-more-link:hover{background-color:rgba(0,0,0,.1)}.fc .fc-daygrid-week-number{background-color:var(--fc-neutral-bg-color);color:var(--fc-neutral-text-color);min-width:1.5em;padding:2px;position:absolute;text-align:center;top:0;z-index:5}.fc .fc-more-popover .fc-popover-body{min-width:220px;padding:10px}.fc-direction-ltr .fc-daygrid-event.fc-event-start,.fc-direction-rtl .fc-daygrid-event.fc-event-end{margin-left:2px}.fc-direction-ltr .fc-daygrid-event.fc-event-end,.fc-direction-rtl .fc-daygrid-event.fc-event-start{margin-right:2px}.fc-direction-ltr .fc-daygrid-more-link{float:left}.fc-direction-ltr .fc-daygrid-week-number{border-radius:0 0 3px 0;left:0}.fc-direction-rtl .fc-daygrid-more-link{float:right}.fc-direction-rtl .fc-daygrid-week-number{border-radius:0 0 0 3px;right:0}.fc-liquid-hack .fc-daygrid-day-frame{position:static}.fc-daygrid-event{border-radius:3px;font-size:var(--fc-small-font-size);position:relative;white-space:nowrap}.fc-daygrid-block-event .fc-event-time{font-weight:700}.fc-daygrid-block-event .fc-event-time,.fc-daygrid-block-event .fc-event-title{padding:1px}.fc-daygrid-dot-event{align-items:center;display:flex;padding:2px 0}.fc-daygrid-dot-event .fc-event-title{flex-grow:1;flex-shrink:1;font-weight:700;min-width:0;overflow:hidden}.fc-daygrid-dot-event.fc-event-mirror,.fc-daygrid-dot-event:hover{background:rgba(0,0,0,.1)}.fc-daygrid-dot-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-daygrid-event-dot{border:calc(var(--fc-daygrid-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-daygrid-event-dot-width)/2);box-sizing:content-box;height:0;margin:0 4px;width:0}.fc-direction-ltr .fc-daygrid-event .fc-event-time{margin-right:3px}.fc-direction-rtl .fc-daygrid-event .fc-event-time{margin-left:3px}');var Tl=Po({name:"@fullcalendar/daygrid",initialView:"dayGridMonth",views:{dayGrid:{component:class extends tl{constructor(){super(...arguments),this.buildDayTableModel=Gt(Rl),this.headerRef={current:null},this.tableRef={current:null}}render(){let{options:e,dateProfileGenerator:t}=this.context,{props:n}=this,r=this.buildDayTableModel(n.dateProfile,t),i=e.dayHeaders&&p(_s,{ref:this.headerRef,dateProfile:n.dateProfile,dates:r.headerDates,datesRepDistinctDays:1===r.rowCnt}),s=t=>p(Cl,{ref:this.tableRef,dateProfile:n.dateProfile,dayTableModel:r,businessHours:n.businessHours,dateSelection:n.dateSelection,eventStore:n.eventStore,eventUiBases:n.eventUiBases,eventSelection:n.eventSelection,eventDrag:n.eventDrag,eventResize:n.eventResize,nextDayThreshold:e.nextDayThreshold,colGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,dayMaxEvents:e.dayMaxEvents,dayMaxEventRows:e.dayMaxEventRows,showWeekNumbers:e.weekNumbers,expandRows:!n.isHeightAuto,headerAlignElRef:this.headerElRef,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:n.forPrint});return e.dayMinWidth?this.renderHScrollLayout(i,s,r.colCnt,e.dayMinWidth):this.renderSimpleLayout(i,s)}},dateProfileGeneratorClass:xl},dayGridDay:{type:"dayGrid",duration:{days:1}},dayGridWeek:{type:"dayGrid",duration:{weeks:1}},dayGridMonth:{type:"dayGrid",duration:{months:1},fixedWeekCount:!0},dayGridYear:{type:"dayGrid",duration:{years:1}}}});class kl extends Wi{getKeyInfo(){return{allDay:{},timed:{}}}getKeysForDateSpan(e){return e.allDay?["allDay"]:["timed"]}getKeysForEventDef(e){return e.allDay?si(e)?["timed","allDay"]:["allDay"]:["timed"]}}const Ml=an({hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"short"});function Il(e){let t=["fc-timegrid-slot","fc-timegrid-slot-label",e.isLabeled?"fc-scrollgrid-shrink":"fc-timegrid-slot-minor"];return p(Ln.Consumer,null,n=>{if(!e.isLabeled)return p("td",{className:t.join(" "),"data-time":e.isoTimeStr});let{dateEnv:r,options:i,viewApi:s}=n,o=null==i.slotLabelFormat?Ml:Array.isArray(i.slotLabelFormat)?an(i.slotLabelFormat[0]):an(i.slotLabelFormat),a={level:0,time:e.time,date:r.toDate(e.date),view:s,text:r.format(e.date,o)};return p(Jn,{elTag:"td",elClasses:t,elAttrs:{"data-time":e.isoTimeStr},renderProps:a,generatorName:"slotLabelContent",customGenerator:i.slotLabelContent,defaultGenerator:Ol,classNameGenerator:i.slotLabelClassNames,didMount:i.slotLabelDidMount,willUnmount:i.slotLabelWillUnmount},e=>p("div",{className:"fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame"},p(e,{elTag:"div",elClasses:["fc-timegrid-slot-label-cushion","fc-scrollgrid-shrink-cushion"]})))})}function Ol(e){return e.text}class Nl extends Gn{render(){return this.props.slatMetas.map(e=>p("tr",{key:e.key},p(Il,Object.assign({},e))))}}const Pl=an({week:"short"});class Hl extends ls{constructor(){super(...arguments),this.allDaySplitter=new kl,this.headerElRef={current:null},this.rootElRef={current:null},this.scrollerElRef={current:null},this.state={slatCoords:null},this.handleScrollTopRequest=e=>{let t=this.scrollerElRef.current;t&&(t.scrollTop=e)},this.renderHeadAxis=(e,t="")=>{let{options:n}=this.context,{dateProfile:r}=this.props,i=r.renderRange,s=1===xt(i.start,i.end)?qi(this.context,i.start,"week"):{};return n.weekNumbers&&"day"===e?p(vo,{elTag:"th",elClasses:["fc-timegrid-axis","fc-scrollgrid-shrink"],elAttrs:{"aria-hidden":!0},date:i.start,defaultFormat:Pl},e=>p("div",{className:["fc-timegrid-axis-frame","fc-scrollgrid-shrink-frame","fc-timegrid-axis-frame-liquid"].join(" "),style:{height:t}},p(e,{elTag:"a",elClasses:["fc-timegrid-axis-cushion","fc-scrollgrid-shrink-cushion","fc-scrollgrid-sync-inner"],elAttrs:s}))):p("th",{"aria-hidden":!0,className:"fc-timegrid-axis"},p("div",{className:"fc-timegrid-axis-frame",style:{height:t}}))},this.renderTableRowAxis=e=>{let{options:t,viewApi:n}=this.context,r={text:t.allDayText,view:n};return p(Jn,{elTag:"td",elClasses:["fc-timegrid-axis","fc-scrollgrid-shrink"],elAttrs:{"aria-hidden":!0},renderProps:r,generatorName:"allDayContent",customGenerator:t.allDayContent,defaultGenerator:Bl,classNameGenerator:t.allDayClassNames,didMount:t.allDayDidMount,willUnmount:t.allDayWillUnmount},t=>p("div",{className:["fc-timegrid-axis-frame","fc-scrollgrid-shrink-frame",null==e?" fc-timegrid-axis-frame-liquid":""].join(" "),style:{height:e}},p(t,{elTag:"span",elClasses:["fc-timegrid-axis-cushion","fc-scrollgrid-shrink-cushion","fc-scrollgrid-sync-inner"]})))},this.handleSlatCoords=e=>{this.setState({slatCoords:e})}}renderSimpleLayout(e,t,n){let{context:r,props:i}=this,s=[],o=no(r.options);return e&&s.push({type:"header",key:"header",isSticky:o,chunk:{elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}}),t&&(s.push({type:"body",key:"all-day",chunk:{content:t}}),s.push({type:"body",key:"all-day-divider",outerContent:p("tr",{role:"presentation",className:"fc-scrollgrid-section"},p("td",{className:"fc-timegrid-divider "+r.theme.getClass("tableCellShaded")}))})),s.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(r.options.expandRows),chunk:{scrollerElRef:this.scrollerElRef,content:n}}),p(er,{elRef:this.rootElRef,elClasses:["fc-timegrid"],viewSpec:r.viewSpec},p(io,{liquid:!i.isHeightAuto&&!i.forPrint,collapsibleWidth:i.forPrint,cols:[{width:"shrink"}],sections:s}))}renderHScrollLayout(e,t,n,r,i,s,o){let a=this.context.pluginHooks.scrollGridImpl;if(!a)throw new Error("No ScrollGrid implementation");let{context:l,props:c}=this,d=!c.forPrint&&no(l.options),u=!c.forPrint&&ro(l.options),h=[];e&&h.push({type:"header",key:"header",isSticky:d,syncRowHeights:!0,chunks:[{key:"axis",rowContent:e=>p("tr",{role:"presentation"},this.renderHeadAxis("day",e.rowSyncHeights[0]))},{key:"cols",elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}]}),t&&(h.push({type:"body",key:"all-day",syncRowHeights:!0,chunks:[{key:"axis",rowContent:e=>p("tr",{role:"presentation"},this.renderTableRowAxis(e.rowSyncHeights[0]))},{key:"cols",content:t}]}),h.push({key:"all-day-divider",type:"body",outerContent:p("tr",{role:"presentation",className:"fc-scrollgrid-section"},p("td",{colSpan:2,className:"fc-timegrid-divider "+l.theme.getClass("tableCellShaded")}))}));let f=l.options.nowIndicator;return h.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(l.options.expandRows),chunks:[{key:"axis",content:e=>p("div",{className:"fc-timegrid-axis-chunk"},p("table",{"aria-hidden":!0,style:{height:e.expandRows?e.clientHeight:""}},e.tableColGroupNode,p("tbody",null,p(Nl,{slatMetas:s}))),p("div",{className:"fc-timegrid-now-indicator-container"},p(Rs,{unit:f?"minute":"day"},e=>{let t=f&&o&&o.safeComputeTop(e);return"number"==typeof t?p(lo,{elClasses:["fc-timegrid-now-indicator-arrow"],elStyle:{top:t},isAxis:!0,date:e}):null})))},{key:"cols",scrollerElRef:this.scrollerElRef,content:n}]}),u&&h.push({key:"footer",type:"footer",isSticky:!0,chunks:[{key:"axis",content:to},{key:"cols",content:to}]}),p(er,{elRef:this.rootElRef,elClasses:["fc-timegrid"],viewSpec:l.viewSpec},p(a,{liquid:!c.isHeightAuto&&!c.forPrint,forPrint:c.forPrint,collapsibleWidth:!1,colGroups:[{width:"shrink",cols:[{width:"shrink"}]},{cols:[{span:r,minWidth:i}]}],sections:h}))}getAllDayMaxEventProps(){let{dayMaxEvents:e,dayMaxEventRows:t}=this.context.options;return!0!==e&&!0!==t||(e=void 0,t=5),{dayMaxEvents:e,dayMaxEventRows:t}}}function Bl(e){return e.text}class jl{constructor(e,t,n){this.positions=e,this.dateProfile=t,this.slotDuration=n}safeComputeTop(e){let{dateProfile:t}=this;if(lr(t.currentRange,e)){let n=Mt(e),r=e.valueOf()-n.valueOf();if(r>=yt(t.slotMinTime)&&r<yt(t.slotMaxTime))return this.computeTimeTop(ft(r))}return null}computeDateTop(e,t){return t||(t=Mt(e)),this.computeTimeTop(ft(e.valueOf()-t.valueOf()))}computeTimeTop(e){let t,n,{positions:r,dateProfile:i}=this,s=r.els.length,o=(e.milliseconds-yt(i.slotMinTime))/yt(this.slotDuration);return o=Math.max(0,o),o=Math.min(s,o),t=Math.floor(o),t=Math.min(t,s-1),n=o-t,r.tops[t]+r.getHeight(t)*n}}class zl extends Gn{render(){let{props:e,context:t}=this,{options:n}=t,{slatElRefs:r}=e;return p("tbody",null,e.slatMetas.map((i,s)=>{let o={time:i.time,date:t.dateEnv.toDate(i.date),view:t.viewApi};return p("tr",{key:i.key,ref:r.createRef(i.key)},e.axis&&p(Il,Object.assign({},i)),p(Jn,{elTag:"td",elClasses:["fc-timegrid-slot","fc-timegrid-slot-lane",!i.isLabeled&&"fc-timegrid-slot-minor"],elAttrs:{"data-time":i.isoTimeStr},renderProps:o,generatorName:"slotLaneContent",customGenerator:n.slotLaneContent,classNameGenerator:n.slotLaneClassNames,didMount:n.slotLaneDidMount,willUnmount:n.slotLaneWillUnmount}))}))}}class Ul extends Gn{constructor(){super(...arguments),this.rootElRef={current:null},this.slatElRefs=new Vs}render(){let{props:e,context:t}=this;return p("div",{ref:this.rootElRef,className:"fc-timegrid-slots"},p("table",{"aria-hidden":!0,className:t.theme.getClass("table"),style:{minWidth:e.tableMinWidth,width:e.clientWidth,height:e.minHeight}},e.tableColGroupNode,p(zl,{slatElRefs:this.slatElRefs,axis:e.axis,slatMetas:e.slatMetas})))}componentDidMount(){this.updateSizing()}componentDidUpdate(){this.updateSizing()}componentWillUnmount(){this.props.onCoords&&this.props.onCoords(null)}updateSizing(){let{context:e,props:t}=this;if(t.onCoords&&null!==t.clientWidth){this.rootElRef.current.offsetHeight&&t.onCoords(new jl(new rs(this.rootElRef.current,(n=this.slatElRefs.currentMap,t.slatMetas.map(e=>n[e.key])),!1,!0),this.props.dateProfile,e.options.slotDuration))}var n}}function Wl(e,t){let n,r=[];for(n=0;n<t;n+=1)r.push([]);if(e)for(n=0;n<e.length;n+=1)r[e[n].col].push(e[n]);return r}function Ll(e,t){let n=[];if(e){for(let r=0;r<t;r+=1)n[r]={affectedInstances:e.affectedInstances,isEvent:e.isEvent,segs:[]};for(let t of e.segs)n[t.col].segs.push(t)}else for(let e=0;e<t;e+=1)n[e]=null;return n}class Fl extends Gn{render(){let{props:e}=this;return p(So,{elClasses:["fc-timegrid-more-link"],elStyle:{top:e.top,bottom:e.bottom},allDayDate:null,moreCnt:e.hiddenSegs.length,allSegs:e.hiddenSegs,hiddenSegs:e.hiddenSegs,extraDateSpan:e.extraDateSpan,dateProfile:e.dateProfile,todayRange:e.todayRange,popoverContent:()=>ec(e.hiddenSegs,e),defaultGenerator:Vl,forceTimed:!0},e=>p(e,{elTag:"div",elClasses:["fc-timegrid-more-link-inner","fc-sticky"]}))}}function Vl(e){return e.shortText}function Gl(e,t,n){let r=new cs;null!=t&&(r.strictOrder=t),null!=n&&(r.maxStackCnt=n);let i=hs(r.addSegs(e)),s=function(e){const{entriesByLevel:t}=e,n=Zl((e,t)=>e+":"+t,(r,i)=>{let s=Ql(function(e,t,n){let{levelCoords:r,entriesByLevel:i}=e,s=i[t][n],o=r[t]+s.thickness,a=r.length,l=t;for(;l<a&&r[l]<o;l+=1);for(;l<a;l+=1){let e,t=i[l],n=ps(t,s.span.start,ds),r=n[0]+n[1],o=r;for(;(e=t[o])&&e.span.start<s.span.end;)o+=1;if(r<o)return{level:l,lateralStart:r,lateralEnd:o}}return null}(e,r,i),n),o=t[r][i];return[Object.assign(Object.assign({},o),{nextLevelNodes:s[0]}),o.thickness+s[1]]});return Ql(t.length?{level:0,lateralStart:0,lateralEnd:t[0].length}:null,n)[0]}(r);return s=function(e,t){const n=Zl((e,t,n)=>us(e),(e,r,i)=>{let s,{nextLevelNodes:o,thickness:a}=e,l=a+i,c=a/l,d=[];if(o.length)for(let e of o)if(void 0===s){let t=n(e,r,l);s=t[0],d.push(t[1])}else{let t=n(e,s,0);d.push(t[1])}else s=t;let u=(s-r)*c;return[s-u,Object.assign(Object.assign({},e),{thickness:u,nextLevelNodes:d})]});return e.map(e=>n(e,0,0)[1])}(s,1),{segRects:function(e){let t=[];const n=Zl((e,t,n)=>us(e),(e,n,i)=>{let s=Object.assign(Object.assign({},e),{levelCoord:n,stackDepth:i,stackForward:0});return t.push(s),s.stackForward=r(e.nextLevelNodes,n+e.thickness,i+1)+1});function r(e,t,r){let i=0;for(let s of e)i=Math.max(n(s,t,r),i);return i}return r(e,0,0),t}(s),hiddenGroups:i}}function Ql(e,t){if(!e)return[[],0];let{level:n,lateralStart:r,lateralEnd:i}=e,s=r,o=[];for(;s<i;)o.push(t(n,s)),s+=1;return o.sort(ql),[o.map(Yl),o[0][1]]}function ql(e,t){return t[1]-e[1]}function Yl(e){return e[0]}function Zl(e,t){const n={};return(...r)=>{let i=e(...r);return i in n?n[i]:n[i]=t(...r)}}function Xl(e,t,n=null,r=0){let i=[];if(n)for(let s=0;s<e.length;s+=1){let o=e[s],a=n.computeDateTop(o.start,t),l=Math.max(a+(r||0),n.computeDateTop(o.end,t));i.push({start:Math.round(a),end:Math.round(l)})}return i}const $l=an({hour:"numeric",minute:"2-digit",meridiem:!1});class Jl extends Gn{render(){return p(oo,Object.assign({},this.props,{elClasses:["fc-timegrid-event","fc-v-event",this.props.isShort&&"fc-timegrid-event-short"],defaultTimeFormat:$l}))}}class Kl extends Gn{constructor(){super(...arguments),this.sortEventSegs=Gt(di)}render(){let{props:e,context:t}=this,{options:n}=t,r=n.selectMirror,i=e.eventDrag&&e.eventDrag.segs||e.eventResize&&e.eventResize.segs||r&&e.dateSelectionSegs||[],s=e.eventDrag&&e.eventDrag.affectedInstances||e.eventResize&&e.eventResize.affectedInstances||{},o=this.sortEventSegs(e.fgEventSegs,n.eventOrder);return p(uo,{elTag:"td",elRef:e.elRef,elClasses:["fc-timegrid-col",...e.extraClassNames||[]],elAttrs:Object.assign({role:"gridcell"},e.extraDataAttrs),date:e.date,dateProfile:e.dateProfile,todayRange:e.todayRange,extraRenderProps:e.extraRenderProps},t=>p("div",{className:"fc-timegrid-col-frame"},p("div",{className:"fc-timegrid-col-bg"},this.renderFillSegs(e.businessHourSegs,"non-business"),this.renderFillSegs(e.bgEventSegs,"bg-event"),this.renderFillSegs(e.dateSelectionSegs,"highlight")),p("div",{className:"fc-timegrid-col-events"},this.renderFgSegs(o,s,!1,!1,!1)),p("div",{className:"fc-timegrid-col-events"},this.renderFgSegs(i,{},Boolean(e.eventDrag),Boolean(e.eventResize),Boolean(r),"mirror")),p("div",{className:"fc-timegrid-now-indicator-container"},this.renderNowIndicator(e.nowIndicatorSegs)),ho(n)&&p(t,{elTag:"div",elClasses:["fc-timegrid-col-misc"]})))}renderFgSegs(e,t,n,r,i,s){let{props:o}=this;return o.forPrint?ec(e,o):this.renderPositionedFgSegs(e,t,n,r,i,s)}renderPositionedFgSegs(e,t,n,r,i,s){let{eventMaxStack:o,eventShortHeight:a,eventOrderStrict:l,eventMinHeight:c}=this.context.options,{date:d,slatCoords:u,eventSelection:h,todayRange:f,nowDate:g}=this.props,m=n||r||i,v=Xl(e,d,u,c),{segPlacements:b,hiddenGroups:E}=function(e,t,n,r){let i=[],s=[];for(let n=0;n<e.length;n+=1){let r=t[n];r?i.push({index:n,thickness:1,span:r}):s.push(e[n])}let{segRects:o,hiddenGroups:a}=Gl(i,n,r),l=[];for(let t of o)l.push({seg:e[t.index],rect:t});for(let e of s)l.push({seg:e,rect:null});return{segPlacements:l,hiddenGroups:a}}(e,v,l,o);return p(y,null,this.renderHiddenGroups(E,e),b.map(e=>{let{seg:o,rect:l}=e,c=o.eventRange.instance.instanceId,d=m||Boolean(!t[c]&&l),u=tc(l&&l.span),v=!m&&l?this.computeSegHStyle(l):{left:0,right:0},y=Boolean(l)&&l.stackForward>0,b=Boolean(l)&&l.span.end-l.span.start<a;return p("div",{className:"fc-timegrid-event-harness"+(y?" fc-timegrid-event-harness-inset":""),key:s||c,style:Object.assign(Object.assign({visibility:d?"":"hidden"},u),v)},p(Jl,Object.assign({seg:o,isDragging:n,isResizing:r,isDateSelecting:i,isSelected:c===h,isShort:b},mi(o,f,g))))}))}renderHiddenGroups(e,t){let{extraDateSpan:n,dateProfile:r,todayRange:i,nowDate:s,eventSelection:o,eventDrag:a,eventResize:l}=this.props;return p(y,null,e.map(e=>{let c=tc(e.span),d=(u=e.entries,h=t,u.map(e=>h[e.index]));var u,h;return p(Fl,{key:Ut(wo(d)),hiddenSegs:d,top:c.top,bottom:c.bottom,extraDateSpan:n,dateProfile:r,todayRange:i,nowDate:s,eventSelection:o,eventDrag:a,eventResize:l})}))}renderFillSegs(e,t){let{props:n,context:r}=this,i=Xl(e,n.date,n.slatCoords,r.options.eventMinHeight).map((r,i)=>{let s=e[i];return p("div",{key:yi(s.eventRange),className:"fc-timegrid-bg-harness",style:tc(r)},"bg-event"===t?p(go,Object.assign({seg:s},mi(s,n.todayRange,n.nowDate))):mo(t))});return p(y,null,i)}renderNowIndicator(e){let{slatCoords:t,date:n}=this.props;return t?e.map((e,r)=>p(lo,{key:r,elClasses:["fc-timegrid-now-indicator-line"],elStyle:{top:t.computeDateTop(e.start,n)},isAxis:!1,date:n})):null}computeSegHStyle(e){let t,n,{isRtl:r,options:i}=this.context,s=i.slotEventOverlap,o=e.levelCoord,a=e.levelCoord+e.thickness;s&&(a=Math.min(1,o+2*(a-o))),r?(t=1-a,n=o):(t=o,n=1-a);let l={zIndex:e.stackDepth+1,left:100*t+"%",right:100*n+"%"};return s&&!e.stackForward&&(l[r?"marginLeft":"marginRight"]=20),l}}function ec(e,{todayRange:t,nowDate:n,eventSelection:r,eventDrag:i,eventResize:s}){let o=(i?i.affectedInstances:null)||(s?s.affectedInstances:null)||{};return p(y,null,e.map(e=>{let i=e.eventRange.instance.instanceId;return p("div",{key:i,style:{visibility:o[i]?"hidden":""}},p(Jl,Object.assign({seg:e,isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:i===r,isShort:!1},mi(e,t,n))))}))}function tc(e){return e?{top:e.start,bottom:-e.end}:{top:"",bottom:""}}class nc extends Gn{constructor(){super(...arguments),this.splitFgEventSegs=Gt(Wl),this.splitBgEventSegs=Gt(Wl),this.splitBusinessHourSegs=Gt(Wl),this.splitNowIndicatorSegs=Gt(Wl),this.splitDateSelectionSegs=Gt(Wl),this.splitEventDrag=Gt(Ll),this.splitEventResize=Gt(Ll),this.rootElRef={current:null},this.cellElRefs=new Vs}render(){let{props:e,context:t}=this,n=t.options.nowIndicator&&e.slatCoords&&e.slatCoords.safeComputeTop(e.nowDate),r=e.cells.length,i=this.splitFgEventSegs(e.fgEventSegs,r),s=this.splitBgEventSegs(e.bgEventSegs,r),o=this.splitBusinessHourSegs(e.businessHourSegs,r),a=this.splitNowIndicatorSegs(e.nowIndicatorSegs,r),l=this.splitDateSelectionSegs(e.dateSelectionSegs,r),c=this.splitEventDrag(e.eventDrag,r),d=this.splitEventResize(e.eventResize,r);return p("div",{className:"fc-timegrid-cols",ref:this.rootElRef},p("table",{role:"presentation",style:{minWidth:e.tableMinWidth,width:e.clientWidth}},e.tableColGroupNode,p("tbody",{role:"presentation"},p("tr",{role:"row"},e.axis&&p("td",{"aria-hidden":!0,className:"fc-timegrid-col fc-timegrid-axis"},p("div",{className:"fc-timegrid-col-frame"},p("div",{className:"fc-timegrid-now-indicator-container"},"number"==typeof n&&p(lo,{elClasses:["fc-timegrid-now-indicator-arrow"],elStyle:{top:n},isAxis:!0,date:e.nowDate})))),e.cells.map((t,n)=>p(Kl,{key:t.key,elRef:this.cellElRefs.createRef(t.key),dateProfile:e.dateProfile,date:t.date,nowDate:e.nowDate,todayRange:e.todayRange,extraRenderProps:t.extraRenderProps,extraDataAttrs:t.extraDataAttrs,extraClassNames:t.extraClassNames,extraDateSpan:t.extraDateSpan,fgEventSegs:i[n],bgEventSegs:s[n],businessHourSegs:o[n],nowIndicatorSegs:a[n],dateSelectionSegs:l[n],eventDrag:c[n],eventResize:d[n],slatCoords:e.slatCoords,eventSelection:e.eventSelection,forPrint:e.forPrint}))))))}componentDidMount(){this.updateCoords()}componentDidUpdate(){this.updateCoords()}updateCoords(){let{props:e}=this;var t;e.onColCoords&&null!==e.clientWidth&&e.onColCoords(new rs(this.rootElRef.current,(t=this.cellElRefs.currentMap,e.cells.map(e=>t[e.key])),!0,!1))}}class rc extends ls{constructor(){super(...arguments),this.processSlotOptions=Gt(ic),this.state={slatCoords:null},this.handleRootEl=e=>{e?this.context.registerInteractiveComponent(this,{el:e,isHitComboAllowed:this.props.isHitComboAllowed}):this.context.unregisterInteractiveComponent(this)},this.handleScrollRequest=e=>{let{onScrollTopRequest:t}=this.props,{slatCoords:n}=this.state;if(t&&n){if(e.time){let r=n.computeTimeTop(e.time);r=Math.ceil(r),r&&(r+=1),t(r)}return!0}return!1},this.handleColCoords=e=>{this.colCoords=e},this.handleSlatCoords=e=>{this.setState({slatCoords:e}),this.props.onSlatCoords&&this.props.onSlatCoords(e)}}render(){let{props:e,state:t}=this;return p("div",{className:"fc-timegrid-body",ref:this.handleRootEl,style:{width:e.clientWidth,minWidth:e.tableMinWidth}},p(Ul,{axis:e.axis,dateProfile:e.dateProfile,slatMetas:e.slatMetas,clientWidth:e.clientWidth,minHeight:e.expandRows?e.clientHeight:"",tableMinWidth:e.tableMinWidth,tableColGroupNode:e.axis?e.tableColGroupNode:null,onCoords:this.handleSlatCoords}),p(nc,{cells:e.cells,axis:e.axis,dateProfile:e.dateProfile,businessHourSegs:e.businessHourSegs,bgEventSegs:e.bgEventSegs,fgEventSegs:e.fgEventSegs,dateSelectionSegs:e.dateSelectionSegs,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,todayRange:e.todayRange,nowDate:e.nowDate,nowIndicatorSegs:e.nowIndicatorSegs,clientWidth:e.clientWidth,tableMinWidth:e.tableMinWidth,tableColGroupNode:e.tableColGroupNode,slatCoords:t.slatCoords,onColCoords:this.handleColCoords,forPrint:e.forPrint}))}componentDidMount(){this.scrollResponder=this.context.createScrollResponder(this.handleScrollRequest)}componentDidUpdate(e){this.scrollResponder.update(e.dateProfile!==this.props.dateProfile)}componentWillUnmount(){this.scrollResponder.detach()}queryHit(e,t){let{dateEnv:n,options:r}=this.context,{colCoords:i}=this,{dateProfile:s}=this.props,{slatCoords:o}=this.state,{snapDuration:a,snapsPerSlot:l}=this.processSlotOptions(this.props.slotDuration,r.snapDuration),c=i.leftToIndex(e),d=o.positions.topToIndex(t);if(null!=c&&null!=d){let e=this.props.cells[c],r=o.positions.tops[d],u=o.positions.getHeight(d),h=(t-r)/u,f=d*l+Math.floor(h*l),g=this.props.cells[c].date,p=pt(s.slotMinTime,mt(a,f)),m=n.add(g,p),v=n.add(m,a);return{dateProfile:s,dateSpan:Object.assign({range:{start:m,end:v},allDay:!1},e.extraDateSpan),dayEl:i.els[c],rect:{left:i.lefts[c],right:i.rights[c],top:r,bottom:r+u},layer:0}}return null}}function ic(e,t){let n=t||e,r=bt(e,n);return null===r&&(n=e,r=1),{snapDuration:n,snapsPerSlot:r}}class sc extends Is{sliceRange(e,t){let n=[];for(let r=0;r<t.length;r+=1){let i=ir(e,t[r]);i&&n.push({start:i.start,end:i.end,isStart:i.start.valueOf()===e.start.valueOf(),isEnd:i.end.valueOf()===e.end.valueOf(),col:r})}return n}}class oc extends ls{constructor(){super(...arguments),this.buildDayRanges=Gt(ac),this.slicer=new sc,this.timeColsRef={current:null}}render(){let{props:e,context:t}=this,{dateProfile:n,dayTableModel:r}=e,{nowIndicator:i,nextDayThreshold:s}=t.options,o=this.buildDayRanges(r,n,t.dateEnv);return p(Rs,{unit:i?"minute":"day"},(a,l)=>p(rc,Object.assign({ref:this.timeColsRef},this.slicer.sliceProps(e,n,null,t,o),{forPrint:e.forPrint,axis:e.axis,dateProfile:n,slatMetas:e.slatMetas,slotDuration:e.slotDuration,cells:r.cells[0],tableColGroupNode:e.tableColGroupNode,tableMinWidth:e.tableMinWidth,clientWidth:e.clientWidth,clientHeight:e.clientHeight,expandRows:e.expandRows,nowDate:a,nowIndicatorSegs:i&&this.slicer.sliceNowDate(a,n,s,t,o),todayRange:l,onScrollTopRequest:e.onScrollTopRequest,onSlatCoords:e.onSlatCoords})))}}function ac(e,t,n){let r=[];for(let i of e.headerDates)r.push({start:n.add(i,t.slotMinTime),end:n.add(i,t.slotMaxTime)});return r}const lc=[{hours:1},{minutes:30},{minutes:15},{seconds:30},{seconds:15}];function cc(e,t,n,r,i){let s=new Date(0),o=e,a=ft(0),l=n||function(e){let t,n,r;for(t=lc.length-1;t>=0;t-=1)if(n=ft(lc[t]),r=bt(n,e),null!==r&&r>1)return n;return e}(r),c=[];for(;yt(o)<yt(t);){let e=i.add(s,o),t=null!==bt(a,l);c.push({date:e,time:o,key:e.toISOString(),isoTimeStr:Ft(e),isLabeled:t}),o=pt(o,r),a=pt(a,r)}return c}function dc(e,t){let n=new ks(e.renderRange,t);return new Ms(n,!1)}xe('.fc-v-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-v-event .fc-event-main{color:var(--fc-event-text-color);height:100%}.fc-v-event .fc-event-main-frame{display:flex;flex-direction:column;height:100%}.fc-v-event .fc-event-time{flex-grow:0;flex-shrink:0;max-height:100%;overflow:hidden}.fc-v-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-height:0}.fc-v-event .fc-event-title{bottom:0;max-height:100%;overflow:hidden;top:0}.fc-v-event:not(.fc-event-start){border-top-left-radius:0;border-top-right-radius:0;border-top-width:0}.fc-v-event:not(.fc-event-end){border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-width:0}.fc-v-event.fc-event-selected:before{left:-10px;right:-10px}.fc-v-event .fc-event-resizer-start{cursor:n-resize}.fc-v-event .fc-event-resizer-end{cursor:s-resize}.fc-v-event:not(.fc-event-selected) .fc-event-resizer{height:var(--fc-event-resizer-thickness);left:0;right:0}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start{top:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer{left:50%;margin-left:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-start{top:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc .fc-timegrid .fc-daygrid-body{z-index:2}.fc .fc-timegrid-divider{padding:0 0 2px}.fc .fc-timegrid-body{min-height:100%;position:relative;z-index:1}.fc .fc-timegrid-axis-chunk{position:relative}.fc .fc-timegrid-axis-chunk>table,.fc .fc-timegrid-slots{position:relative;z-index:1}.fc .fc-timegrid-slot{border-bottom:0;height:1.5em}.fc .fc-timegrid-slot:empty:before{content:"\\00a0"}.fc .fc-timegrid-slot-minor{border-top-style:dotted}.fc .fc-timegrid-slot-label-cushion{display:inline-block;white-space:nowrap}.fc .fc-timegrid-slot-label{vertical-align:middle}.fc .fc-timegrid-axis-cushion,.fc .fc-timegrid-slot-label-cushion{padding:0 4px}.fc .fc-timegrid-axis-frame-liquid{height:100%}.fc .fc-timegrid-axis-frame{align-items:center;display:flex;justify-content:flex-end;overflow:hidden}.fc .fc-timegrid-axis-cushion{flex-shrink:0;max-width:60px}.fc-direction-ltr .fc-timegrid-slot-label-frame{text-align:right}.fc-direction-rtl .fc-timegrid-slot-label-frame{text-align:left}.fc-liquid-hack .fc-timegrid-axis-frame-liquid{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-timegrid-col-frame{min-height:100%;position:relative}.fc-media-screen.fc-liquid-hack .fc-timegrid-col-frame{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols{bottom:0;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols>table{height:100%}.fc-media-screen .fc-timegrid-col-bg,.fc-media-screen .fc-timegrid-col-events,.fc-media-screen .fc-timegrid-now-indicator-container{left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col-bg{z-index:2}.fc .fc-timegrid-col-bg .fc-non-business{z-index:1}.fc .fc-timegrid-col-bg .fc-bg-event{z-index:2}.fc .fc-timegrid-col-bg .fc-highlight{z-index:3}.fc .fc-timegrid-bg-harness{left:0;position:absolute;right:0}.fc .fc-timegrid-col-events{z-index:3}.fc .fc-timegrid-now-indicator-container{bottom:0;overflow:hidden}.fc-direction-ltr .fc-timegrid-col-events{margin:0 2.5% 0 2px}.fc-direction-rtl .fc-timegrid-col-events{margin:0 2px 0 2.5%}.fc-timegrid-event-harness{position:absolute}.fc-timegrid-event-harness>.fc-timegrid-event{bottom:0;left:0;position:absolute;right:0;top:0}.fc-timegrid-event-harness-inset .fc-timegrid-event,.fc-timegrid-event.fc-event-mirror,.fc-timegrid-more-link{box-shadow:0 0 0 1px var(--fc-page-bg-color)}.fc-timegrid-event,.fc-timegrid-more-link{border-radius:3px;font-size:var(--fc-small-font-size)}.fc-timegrid-event{margin-bottom:1px}.fc-timegrid-event .fc-event-main{padding:1px 1px 0}.fc-timegrid-event .fc-event-time{font-size:var(--fc-small-font-size);margin-bottom:1px;white-space:nowrap}.fc-timegrid-event-short .fc-event-main-frame{flex-direction:row;overflow:hidden}.fc-timegrid-event-short .fc-event-time:after{content:"\\00a0-\\00a0"}.fc-timegrid-event-short .fc-event-title{font-size:var(--fc-small-font-size)}.fc-timegrid-more-link{background:var(--fc-more-link-bg-color);color:var(--fc-more-link-text-color);cursor:pointer;margin-bottom:1px;position:absolute;z-index:9999}.fc-timegrid-more-link-inner{padding:3px 2px;top:0}.fc-direction-ltr .fc-timegrid-more-link{right:0}.fc-direction-rtl .fc-timegrid-more-link{left:0}.fc .fc-timegrid-now-indicator-line{border-color:var(--fc-now-indicator-color);border-style:solid;border-width:1px 0 0;left:0;position:absolute;right:0;z-index:4}.fc .fc-timegrid-now-indicator-arrow{border-color:var(--fc-now-indicator-color);border-style:solid;margin-top:-5px;position:absolute;z-index:4}.fc-direction-ltr .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 0 5px 6px;left:0}.fc-direction-rtl .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 6px 5px 0;right:0}');var uc=Po({name:"@fullcalendar/timegrid",initialView:"timeGridWeek",optionRefiners:{allDaySlot:Boolean},views:{timeGrid:{component:class extends Hl{constructor(){super(...arguments),this.buildTimeColsModel=Gt(dc),this.buildSlatMetas=Gt(cc)}render(){let{options:e,dateEnv:t,dateProfileGenerator:n}=this.context,{props:r}=this,{dateProfile:i}=r,s=this.buildTimeColsModel(i,n),o=this.allDaySplitter.splitProps(r),a=this.buildSlatMetas(i.slotMinTime,i.slotMaxTime,e.slotLabelInterval,e.slotDuration,t),{dayMinWidth:l}=e,c=!l,d=l,u=e.dayHeaders&&p(_s,{dates:s.headerDates,dateProfile:i,datesRepDistinctDays:!0,renderIntro:c?this.renderHeadAxis:null}),h=!1!==e.allDaySlot&&(t=>p(Cl,Object.assign({},o.allDay,{dateProfile:i,dayTableModel:s,nextDayThreshold:e.nextDayThreshold,tableMinWidth:t.tableMinWidth,colGroupNode:t.tableColGroupNode,renderRowIntro:c?this.renderTableRowAxis:null,showWeekNumbers:!1,expandRows:!1,headerAlignElRef:this.headerElRef,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:r.forPrint},this.getAllDayMaxEventProps()))),f=t=>p(oc,Object.assign({},o.timed,{dayTableModel:s,dateProfile:i,axis:c,slotDuration:e.slotDuration,slatMetas:a,forPrint:r.forPrint,tableColGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,clientWidth:t.clientWidth,clientHeight:t.clientHeight,onSlatCoords:this.handleSlatCoords,expandRows:t.expandRows,onScrollTopRequest:this.handleScrollTopRequest}));return d?this.renderHScrollLayout(u,h,f,s.colCnt,l,a,this.state.slatCoords):this.renderSimpleLayout(u,h,f)}},usesMinMaxTime:!0,allDaySlot:!0,slotDuration:"00:30:00",slotEventOverlap:!0},timeGridDay:{type:"timeGrid",duration:{days:1}},timeGridWeek:{type:"timeGrid",duration:{weeks:1}}}});class hc extends Gn{constructor(){super(...arguments),this.state={textId:We()}}render(){let{theme:e,dateEnv:t,options:n,viewApi:r}=this.context,{cellId:i,dayDate:s,todayRange:o}=this.props,{textId:a}=this.state,l=Fi(s,o),c=n.listDayFormat?t.format(s,n.listDayFormat):"",d=n.listDaySideFormat?t.format(s,n.listDaySideFormat):"",u=Object.assign({date:t.toDate(s),view:r,textId:a,text:c,sideText:d,navLinkAttrs:qi(this.context,s),sideNavLinkAttrs:qi(this.context,s,"day",!1)},l);return p(Jn,{elTag:"tr",elClasses:["fc-list-day",...Vi(l,e)],elAttrs:{"data-date":Wt(s)},renderProps:u,generatorName:"dayHeaderContent",customGenerator:n.dayHeaderContent,defaultGenerator:fc,classNameGenerator:n.dayHeaderClassNames,didMount:n.dayHeaderDidMount,willUnmount:n.dayHeaderWillUnmount},t=>p("th",{scope:"colgroup",colSpan:3,id:i,"aria-labelledby":a},p(t,{elTag:"div",elClasses:["fc-list-day-cushion",e.getClass("tableCellShaded")]})))}}function fc(e){return p(y,null,e.text&&p("a",Object.assign({id:e.textId,className:"fc-list-day-text"},e.navLinkAttrs),e.text),e.sideText&&p("a",Object.assign({"aria-hidden":!0,className:"fc-list-day-side-text"},e.sideNavLinkAttrs),e.sideText))}const gc=an({hour:"numeric",minute:"2-digit",meridiem:"short"});class pc extends Gn{render(){let{props:e,context:t}=this,{options:n}=t,{seg:r,timeHeaderId:i,eventHeaderId:s,dateHeaderId:o}=e,a=n.eventTimeFormat||gc;return p(so,Object.assign({},e,{elTag:"tr",elClasses:["fc-list-event",r.eventRange.def.url&&"fc-event-forced-url"],defaultGenerator:()=>function(e,t){let n=bi(e,t);return p("a",Object.assign({},n),e.eventRange.def.title)}(r,t),seg:r,timeText:"",disableDragging:!0,disableResizing:!0}),(e,n)=>p(y,null,function(e,t,n,r,i){let{options:s}=n;if(!1!==s.displayEventTime){let o,a=e.eventRange.def,l=e.eventRange.instance,c=!1;if(a.allDay?c=!0:ur(e.eventRange.range)?e.isStart?o=pi(e,t,n,null,null,l.range.start,e.end):e.isEnd?o=pi(e,t,n,null,null,e.start,l.range.end):c=!0:o=pi(e,t,n),c){let e={text:n.options.allDayText,view:n.viewApi};return p(Jn,{elTag:"td",elClasses:["fc-list-event-time"],elAttrs:{headers:`${r} ${i}`},renderProps:e,generatorName:"allDayContent",customGenerator:s.allDayContent,defaultGenerator:mc,classNameGenerator:s.allDayClassNames,didMount:s.allDayDidMount,willUnmount:s.allDayWillUnmount})}return p("td",{className:"fc-list-event-time"},o)}return null}(r,a,t,i,o),p("td",{"aria-hidden":!0,className:"fc-list-event-graphic"},p("span",{className:"fc-list-event-dot",style:{borderColor:n.borderColor||n.backgroundColor}})),p(e,{elTag:"td",elClasses:["fc-list-event-title"],elAttrs:{headers:`${s} ${o}`}})))}}function mc(e){return e.text}function vc(e){return e.text}function yc(e){let t=Mt(e.renderRange.start),n=e.renderRange.end,r=[],i=[];for(;t<n;)r.push(t),i.push({start:t,end:wt(t,1)}),t=wt(t,1);return{dayDates:r,dayRanges:i}}xe(':root{--fc-list-event-dot-width:10px;--fc-list-event-hover-bg-color:#f5f5f5}.fc-theme-standard .fc-list{border:1px solid var(--fc-border-color)}.fc .fc-list-empty{align-items:center;background-color:var(--fc-neutral-bg-color);display:flex;height:100%;justify-content:center}.fc .fc-list-empty-cushion{margin:5em 0}.fc .fc-list-table{border-style:hidden;width:100%}.fc .fc-list-table tr>*{border-left:0;border-right:0}.fc .fc-list-sticky .fc-list-day>*{background:var(--fc-page-bg-color);position:sticky;top:0}.fc .fc-list-table thead{left:-10000px;position:absolute}.fc .fc-list-table tbody>tr:first-child th{border-top:0}.fc .fc-list-table th{padding:0}.fc .fc-list-day-cushion,.fc .fc-list-table td{padding:8px 14px}.fc .fc-list-day-cushion:after{clear:both;content:"";display:table}.fc-theme-standard .fc-list-day-cushion{background-color:var(--fc-neutral-bg-color)}.fc-direction-ltr .fc-list-day-text,.fc-direction-rtl .fc-list-day-side-text{float:left}.fc-direction-ltr .fc-list-day-side-text,.fc-direction-rtl .fc-list-day-text{float:right}.fc-direction-ltr .fc-list-table .fc-list-event-graphic{padding-right:0}.fc-direction-rtl .fc-list-table .fc-list-event-graphic{padding-left:0}.fc .fc-list-event.fc-event-forced-url{cursor:pointer}.fc .fc-list-event:hover td{background-color:var(--fc-list-event-hover-bg-color)}.fc .fc-list-event-graphic,.fc .fc-list-event-time{white-space:nowrap;width:1px}.fc .fc-list-event-dot{border:calc(var(--fc-list-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-list-event-dot-width)/2);box-sizing:content-box;display:inline-block;height:0;width:0}.fc .fc-list-event-title a{color:inherit;text-decoration:none}.fc .fc-list-event.fc-event-forced-url:hover a{text-decoration:underline}');function bc(e){return!1===e?null:an(e)}var Ec=Po({name:"@fullcalendar/list",optionRefiners:{listDayFormat:bc,listDaySideFormat:bc,noEventsClassNames:yn,noEventsContent:yn,noEventsDidMount:yn,noEventsWillUnmount:yn},views:{list:{component:class extends ls{constructor(){super(...arguments),this.computeDateVars=Gt(yc),this.eventStoreToSegs=Gt(this._eventStoreToSegs),this.state={timeHeaderId:We(),eventHeaderId:We(),dateHeaderIdRoot:We()},this.setRootEl=e=>{e?this.context.registerInteractiveComponent(this,{el:e}):this.context.unregisterInteractiveComponent(this)}}render(){let{props:e,context:t}=this,{dayDates:n,dayRanges:r}=this.computeDateVars(e.dateProfile),i=this.eventStoreToSegs(e.eventStore,e.eventUiBases,r);return p(er,{elRef:this.setRootEl,elClasses:["fc-list",t.theme.getClass("table"),!1!==t.options.stickyHeaderDates?"fc-list-sticky":""],viewSpec:t.viewSpec},p(Fs,{liquid:!e.isHeightAuto,overflowX:e.isHeightAuto?"visible":"hidden",overflowY:e.isHeightAuto?"visible":"auto"},i.length>0?this.renderSegList(i,n):this.renderEmptyMessage()))}renderEmptyMessage(){let{options:e,viewApi:t}=this.context,n={text:e.noEventsText,view:t};return p(Jn,{elTag:"div",elClasses:["fc-list-empty"],renderProps:n,generatorName:"noEventsContent",customGenerator:e.noEventsContent,defaultGenerator:vc,classNameGenerator:e.noEventsClassNames,didMount:e.noEventsDidMount,willUnmount:e.noEventsWillUnmount},e=>p(e,{elTag:"div",elClasses:["fc-list-empty-cushion"]}))}renderSegList(e,t){let{theme:n,options:r}=this.context,{timeHeaderId:i,eventHeaderId:s,dateHeaderIdRoot:o}=this.state,a=function(e){let t,n,r=[];for(t=0;t<e.length;t+=1)n=e[t],(r[n.dayIndex]||(r[n.dayIndex]=[])).push(n);return r}(e);return p(Rs,{unit:"day"},(e,l)=>{let c=[];for(let n=0;n<a.length;n+=1){let d=a[n];if(d){let a=Wt(t[n]),u=o+"-"+a;c.push(p(hc,{key:a,cellId:u,dayDate:t[n],todayRange:l})),d=di(d,r.eventOrder);for(let t of d)c.push(p(pc,Object.assign({key:a+":"+t.eventRange.instance.instanceId,seg:t,isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:!1,timeHeaderId:i,eventHeaderId:s,dateHeaderId:u},mi(t,l,e))))}}return p("table",{className:"fc-list-table "+n.getClass("table")},p("thead",null,p("tr",null,p("th",{scope:"col",id:i},r.timeHint),p("th",{scope:"col","aria-hidden":!0}),p("th",{scope:"col",id:s},r.eventHint))),p("tbody",null,c))})}_eventStoreToSegs(e,t,n){return this.eventRangesToSegs(ii(e,t,this.props.dateProfile.activeRange,this.context.options.nextDayThreshold).fg,n)}eventRangesToSegs(e,t){let n=[];for(let r of e)n.push(...this.eventRangeToSegs(r,t));return n}eventRangeToSegs(e,t){let n,r,i,{dateEnv:s}=this.context,{nextDayThreshold:o}=this.context.options,a=e.range,l=e.def.allDay,c=[];for(n=0;n<t.length;n+=1)if(r=ir(a,t[n]),r&&(i={component:this,eventRange:e,start:r.start,end:r.end,isStart:e.isStart&&r.start.valueOf()===a.start.valueOf(),isEnd:e.isEnd&&r.end.valueOf()===a.end.valueOf(),dayIndex:n},c.push(i),!i.isEnd&&!l&&n+1<t.length&&a.end<s.add(t[n+1].start,o))){i.end=a.end,i.isEnd=!0;break}return c}},buttonTextKey:"list",listDayFormat:{month:"long",day:"numeric",year:"numeric"}},listDay:{type:"list",duration:{days:1},listDayFormat:{weekday:"long"}},listWeek:{type:"list",duration:{weeks:1},listDayFormat:{weekday:"long"},listDaySideFormat:{month:"long",day:"numeric",year:"numeric"}},listMonth:{type:"list",duration:{month:1},listDaySideFormat:{weekday:"long"}},listYear:{type:"list",duration:{year:1},listDaySideFormat:{weekday:"long"}}}});class Sc extends ls{constructor(){super(...arguments),this.buildDayTableModel=Gt(Rl),this.slicer=new wl,this.state={labelId:We()}}render(){const{props:e,state:t,context:n}=this,{dateProfile:r,forPrint:i}=e,{options:s}=n,o=this.buildDayTableModel(r,n.dateProfileGenerator),a=this.slicer.sliceProps(e,r,s.nextDayThreshold,n,o),l=null!=e.tableWidth?e.tableWidth/s.aspectRatio:null,c=o.cells.length,d=null!=l?l/c:null;return p("div",{ref:e.elRef,"data-date":e.isoDateStr,className:"fc-multimonth-month",style:{width:e.width},role:"grid","aria-labelledby":t.labelId},p("div",{className:"fc-multimonth-header",style:{marginBottom:d},role:"presentation"},p("div",{className:"fc-multimonth-title",id:t.labelId},n.dateEnv.format(e.dateProfile.currentRange.start,e.titleFormat)),p("table",{className:["fc-multimonth-header-table",n.theme.getClass("table")].join(" "),role:"presentation"},p("thead",{role:"rowgroup"},p(_s,{dateProfile:e.dateProfile,dates:o.headerDates,datesRepDistinctDays:!1})))),p("div",{className:["fc-multimonth-daygrid","fc-daygrid","fc-daygrid-body",!i&&"fc-daygrid-body-balanced",i&&"fc-daygrid-body-unbalanced",i&&"fc-daygrid-body-natural"].join(" "),style:{marginTop:-d}},p("table",{className:["fc-multimonth-daygrid-table",n.theme.getClass("table")].join(" "),style:{height:i?"":l},role:"presentation"},p("tbody",{role:"rowgroup"},p(Sl,Object.assign({},a,{dateProfile:r,cells:o.cells,eventSelection:e.eventSelection,dayMaxEvents:!i,dayMaxEventRows:!i,showWeekNumbers:s.weekNumbers,clientWidth:e.clientWidth,clientHeight:e.clientHeight,forPrint:i}))))))}}const Ac=ft(1,"month");function Dc(e,t,n,r,i){const{start:s,end:o}=t.currentRange;let a=s;const l=[];for(;a.valueOf()<o.valueOf();){const s=n.add(a,Ac),o={start:e.skipHiddenDays(a),end:e.skipHiddenDays(s,-1,!0)};let c=_l({currentRange:o,snapToWeek:!0,fixedWeekCount:r,dateEnv:n});c={start:e.skipHiddenDays(c.start),end:e.skipHiddenDays(c.end,-1,!0)};const d=t.activeRange?ir(t.activeRange,i?c:o):null;l.push({currentDate:t.currentDate,isValid:t.isValid,validRange:t.validRange,renderRange:c,activeRange:d,currentRange:o,currentRangeUnit:"month",isRangeAllDay:!0,dateIncrement:t.dateIncrement,slotMinTime:t.slotMaxTime,slotMaxTime:t.slotMinTime}),a=s}return l}const wc=an({year:"numeric",month:"long"}),Cc=an({month:"long"});function Rc(e,t){return e||(t[0].currentRange.start.getUTCFullYear()!==t[t.length-1].currentRange.start.getUTCFullYear()?wc:Cc)}const xc={multiMonthTitleFormat:an,multiMonthMaxColumns:Number,multiMonthMinWidth:Number};xe(".fc .fc-multimonth{border:1px solid var(--fc-border-color);display:flex;flex-wrap:wrap;overflow-x:hidden;overflow-y:auto}.fc .fc-multimonth-title{font-size:1.2em;font-weight:700;padding:1em 0;text-align:center}.fc .fc-multimonth-daygrid{background:var(--fc-page-bg-color)}.fc .fc-multimonth-daygrid-table,.fc .fc-multimonth-header-table{table-layout:fixed;width:100%}.fc .fc-multimonth-daygrid-table{border-top-style:hidden!important}.fc .fc-multimonth-singlecol .fc-multimonth{position:relative}.fc .fc-multimonth-singlecol .fc-multimonth-header{background:var(--fc-page-bg-color);position:relative;top:0;z-index:2}.fc .fc-multimonth-singlecol .fc-multimonth-daygrid{position:relative;z-index:1}.fc .fc-multimonth-singlecol .fc-multimonth-daygrid-table,.fc .fc-multimonth-singlecol .fc-multimonth-header-table{border-left-style:hidden;border-right-style:hidden}.fc .fc-multimonth-singlecol .fc-multimonth-month:last-child .fc-multimonth-daygrid-table{border-bottom-style:hidden}.fc .fc-multimonth-multicol{line-height:1}.fc .fc-multimonth-multicol .fc-multimonth-month{padding:0 1.2em 1.2em}.fc .fc-multimonth-multicol .fc-daygrid-more-link{border:1px solid var(--fc-event-border-color);display:block;float:none;padding:1px}.fc .fc-multimonth-compact{line-height:1}.fc .fc-multimonth-compact .fc-multimonth-daygrid-table,.fc .fc-multimonth-compact .fc-multimonth-header-table{font-size:.9em}.fc-media-screen .fc-multimonth-singlecol .fc-multimonth-header{position:sticky}.fc-media-print .fc-multimonth{overflow:visible}");var _c=Po({name:"@fullcalendar/multimonth",initialView:"multiMonthYear",optionRefiners:xc,views:{multiMonth:{component:class extends ls{constructor(){super(...arguments),this.splitDateProfileByMonth=Gt(Dc),this.buildMonthFormat=Gt(Rc),this.scrollElRef={current:null},this.firstMonthElRef={current:null},this.needsScrollReset=!1,this.handleSizing=e=>{e&&this.updateSize()}}render(){const{context:e,props:t,state:n}=this,{options:r}=e,{clientWidth:i,clientHeight:s}=n,o=n.monthHPadding||0,a=Math.min(null!=i?Math.floor(i/(r.multiMonthMinWidth+o)):1,r.multiMonthMaxColumns)||1,l=100/a+"%",c=null==i?null:i/a-o,d=null!=i&&1===a,u=this.splitDateProfileByMonth(e.dateProfileGenerator,t.dateProfile,e.dateEnv,!d&&r.fixedWeekCount,r.showNonCurrentDates),h=this.buildMonthFormat(r.multiMonthTitleFormat,u),f=["fc-multimonth",d?"fc-multimonth-singlecol":"fc-multimonth-multicol",null!=c&&c<400?"fc-multimonth-compact":""];return p(er,{elRef:this.scrollElRef,elClasses:f,viewSpec:e.viewSpec},u.map((e,n)=>{const r=Lt(e.currentRange.start);return p(Sc,Object.assign({},t,{key:r,isoDateStr:r,elRef:0===n?this.firstMonthElRef:void 0,titleFormat:h,dateProfile:e,width:l,tableWidth:c,clientWidth:i,clientHeight:s}))}))}componentDidMount(){this.updateSize(),this.context.addResizeHandler(this.handleSizing),this.requestScrollReset()}componentDidUpdate(e){Cn(e,this.props)||this.handleSizing(!1),e.dateProfile!==this.props.dateProfile?this.requestScrollReset():this.flushScrollReset()}componentWillUnmount(){this.context.removeResizeHandler(this.handleSizing)}updateSize(){const e=this.scrollElRef.current,t=this.firstMonthElRef.current;e&&this.setState({clientWidth:e.clientWidth,clientHeight:e.clientHeight}),t&&e&&null==this.state.monthHPadding&&this.setState({monthHPadding:e.clientWidth-t.firstChild.offsetWidth})}requestScrollReset(){this.needsScrollReset=!0,this.flushScrollReset()}flushScrollReset(){if(this.needsScrollReset&&null!=this.state.monthHPadding){const{currentDate:e}=this.props.dateProfile,t=this.scrollElRef.current,n=t.querySelector(`[data-date="${Lt(e)}"]`);t.scrollTop=n.getBoundingClientRect().top-this.firstMonthElRef.current.getBoundingClientRect().top,this.needsScrollReset=!1}}shouldComponentUpdate(){return!0}},dateProfileGeneratorClass:xl,multiMonthMinWidth:350,multiMonthMaxColumns:3},multiMonthYear:{type:"multiMonth",duration:{years:1},fixedWeekCount:!0,showNonCurrentDates:!1}}});return ca.push(el,Tl,uc,Ec,_c),e.Calendar=class extends Ni{constructor(e,t={}){super(),this.isRendering=!1,this.isRendered=!1,this.currentClassNames=[],this.customContentRenderId=0,this.handleAction=e=>{switch(e.type){case"SET_EVENT_DRAG":case"SET_EVENT_RESIZE":this.renderRunner.tryDrain()}},this.handleData=e=>{this.currentData=e,this.renderRunner.request(e.calendarOptions.rerenderDelay)},this.handleRenderRequest=()=>{if(this.isRendering){this.isRendered=!0;let{currentData:e}=this;jn(()=>{U(p(ki,{options:e.calendarOptions,theme:e.theme,emitter:e.emitter},(t,n,r,i)=>(this.setClassNames(t),this.setHeight(n),p($n.Provider,{value:this.customContentRenderId},p(_a,Object.assign({isHeightAuto:r,forPrint:i},e))))),this.el)})}else this.isRendered&&(this.isRendered=!1,U(null,this.el),this.setClassNames([]),this.setHeight(""))},function(e){e.isConnected&&e.getRootNode&&_e(e.getRootNode())}(e),this.el=e,this.renderRunner=new Me(this.handleRenderRequest),new ha({optionOverrides:t,calendarApi:this,onAction:this.handleAction,onData:this.handleData})}render(){let e=this.isRendering;e?this.customContentRenderId+=1:this.isRendering=!0,this.renderRunner.request(),e&&this.updateSize()}destroy(){this.isRendering&&(this.isRendering=!1,this.renderRunner.request())}updateSize(){jn(()=>{super.updateSize()})}batchRendering(e){this.renderRunner.pause("batchRendering"),e(),this.renderRunner.resume("batchRendering")}pauseRendering(){this.renderRunner.pause("pauseRendering")}resumeRendering(){this.renderRunner.resume("pauseRendering",!0)}resetOptions(e,t){this.currentDataManager.resetOptions(e,t)}setClassNames(e){if(!St(e,this.currentClassNames)){let{classList:t}=this.el;for(let e of this.currentClassNames)t.remove(e);for(let n of e)t.add(n);this.currentClassNames=e}}setHeight(e){je(this.el,"height",e)}},e.Draggable=class{constructor(e,t={}){this.handlePointerDown=e=>{let{dragging:t}=this,{minDistance:n,longPressDelay:r}=this.settings;t.minDistance=null!=n?n:e.isTouch?0:cn.eventDragMinDistance,t.delay=e.isTouch?null!=r?r:cn.longPressDelay:0},this.handleDragStart=e=>{e.isTouch&&this.dragging.delay&&e.subjectEl.classList.contains("fc-event")&&this.dragging.mirror.getMirrorEl().classList.add("fc-event-selected")},this.settings=t;let n=this.dragging=new Fa(e);n.touchScrollAllowed=!1,null!=t.itemSelector&&(n.pointer.selector=t.itemSelector),null!=t.appendTo&&(n.mirror.parentNode=t.appendTo),n.emitter.on("pointerdown",this.handlePointerDown),n.emitter.on("dragstart",this.handleDragStart),new Ja(n,t.eventData)}destroy(){this.dragging.destroy()}},e.Internal=xo,e.JsonRequestError=Ri,e.Preact=_o,e.ThirdPartyDraggable=class{constructor(e,t){let n=document;e===document||e instanceof Element?(n=e,t=t||{}):t=e||{};let r=this.dragging=new Ka(n);"string"==typeof t.itemSelector?r.pointer.selector=t.itemSelector:n===document&&(r.pointer.selector="[data-event]"),"string"==typeof t.mirrorSelector&&(r.mirrorSelector=t.mirrorSelector),new Ja(r,t.eventData)}destroy(){this.dragging.destroy()}},e.createPlugin=Po,e.formatDate=function(e,t={}){let n=Ma(t),r=an(t),i=n.createMarkerMeta(e);return i?n.format(i.marker,r,{forcedTzo:i.forcedTzo}):""},e.formatRange=function(e,t,n){let r=Ma("object"==typeof n&&n?n:{}),i=an(n),s=r.createMarkerMeta(e),o=r.createMarkerMeta(t);return s&&o?r.formatRange(s.marker,o.marker,i,{forcedStartTzo:s.forcedTzo,forcedEndTzo:o.forcedTzo,isEndExclusive:n.isEndExclusive,defaultSeparator:cn.defaultRangeSeparator}):""},e.globalLocales=To,e.globalPlugins=ca,e.sliceEvents=function(e,t){return ii(e.eventStore,e.eventUiBases,e.dateProfile.activeRange,t?e.nextDayThreshold:null).fg},e.version="6.1.11",Object.defineProperty(e,"__esModule",{value:!0}),e}({});
Index: /mods/mod_ticket/assets/vanilla-calendar/locales-all.global.min.js
===================================================================
--- /mods/mod_ticket/assets/vanilla-calendar/locales-all.global.min.js	(revision 8427)
+++ /mods/mod_ticket/assets/vanilla-calendar/locales-all.global.min.js	(revision 8427)
@@ -0,0 +1,63 @@
+/*!
+FullCalendar Core v6.1.11
+Docs & License: https://fullcalendar.io
+(c) 2023 Adam Shaw
+*/
+!function(e){"use strict";function t(e){return"Tag"===e||"Monat"===e?"r":"Jahr"===e?"s":""}function n(e){return"Tag"===e||"Monat"===e?"r":"Jahr"===e?"s":""}var o=[{code:"af",week:{dow:1,doy:4},buttonText:{prev:"Vorige",next:"Volgende",today:"Vandag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Heeldag",moreLinkText:"Addisionele",noEventsText:"Daar is geen gebeurtenisse nie"},{code:"ar-dz",week:{dow:0,doy:4},direction:"rtl",buttonText:{prev:"Ø§ÙØ³Ø§ØšÙ",next:"Ø§ÙØªØ§ÙÙ",today:"Ø§ÙÙÙÙ
+",year:"Ø³ÙØ©",month:"ØŽÙØ±",week:"Ø£Ø³ØšÙØ¹",day:"ÙÙÙ
+",list:"Ø£Ø¬ÙØ¯Ø©"},weekText:"Ø£Ø³ØšÙØ¹",allDayText:"Ø§ÙÙÙÙ
+ ÙÙÙ",moreLinkText:"Ø£Ø®Ø±Ù",noEventsText:"Ø£Ù Ø£Ø­Ø¯Ø§Ø« ÙØ¹Ø±Ø¶"},{code:"ar-kw",week:{dow:0,doy:12},direction:"rtl",buttonText:{prev:"Ø§ÙØ³Ø§ØšÙ",next:"Ø§ÙØªØ§ÙÙ",today:"Ø§ÙÙÙÙ
+",year:"Ø³ÙØ©",month:"ØŽÙØ±",week:"Ø£Ø³ØšÙØ¹",day:"ÙÙÙ
+",list:"Ø£Ø¬ÙØ¯Ø©"},weekText:"Ø£Ø³ØšÙØ¹",allDayText:"Ø§ÙÙÙÙ
+ ÙÙÙ",moreLinkText:"Ø£Ø®Ø±Ù",noEventsText:"Ø£Ù Ø£Ø­Ø¯Ø§Ø« ÙØ¹Ø±Ø¶"},{code:"ar-ly",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"Ø§ÙØ³Ø§ØšÙ",next:"Ø§ÙØªØ§ÙÙ",today:"Ø§ÙÙÙÙ
+",year:"Ø³ÙØ©",month:"ØŽÙØ±",week:"Ø£Ø³ØšÙØ¹",day:"ÙÙÙ
+",list:"Ø£Ø¬ÙØ¯Ø©"},weekText:"Ø£Ø³ØšÙØ¹",allDayText:"Ø§ÙÙÙÙ
+ ÙÙÙ",moreLinkText:"Ø£Ø®Ø±Ù",noEventsText:"Ø£Ù Ø£Ø­Ø¯Ø§Ø« ÙØ¹Ø±Ø¶"},{code:"ar-ma",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"Ø§ÙØ³Ø§ØšÙ",next:"Ø§ÙØªØ§ÙÙ",today:"Ø§ÙÙÙÙ
+",year:"Ø³ÙØ©",month:"ØŽÙØ±",week:"Ø£Ø³ØšÙØ¹",day:"ÙÙÙ
+",list:"Ø£Ø¬ÙØ¯Ø©"},weekText:"Ø£Ø³ØšÙØ¹",allDayText:"Ø§ÙÙÙÙ
+ ÙÙÙ",moreLinkText:"Ø£Ø®Ø±Ù",noEventsText:"Ø£Ù Ø£Ø­Ø¯Ø§Ø« ÙØ¹Ø±Ø¶"},{code:"ar-sa",week:{dow:0,doy:6},direction:"rtl",buttonText:{prev:"Ø§ÙØ³Ø§ØšÙ",next:"Ø§ÙØªØ§ÙÙ",today:"Ø§ÙÙÙÙ
+",year:"Ø³ÙØ©",month:"ØŽÙØ±",week:"Ø£Ø³ØšÙØ¹",day:"ÙÙÙ
+",list:"Ø£Ø¬ÙØ¯Ø©"},weekText:"Ø£Ø³ØšÙØ¹",allDayText:"Ø§ÙÙÙÙ
+ ÙÙÙ",moreLinkText:"Ø£Ø®Ø±Ù",noEventsText:"Ø£Ù Ø£Ø­Ø¯Ø§Ø« ÙØ¹Ø±Ø¶"},{code:"ar-tn",week:{dow:1,doy:4},direction:"rtl",buttonText:{prev:"Ø§ÙØ³Ø§ØšÙ",next:"Ø§ÙØªØ§ÙÙ",today:"Ø§ÙÙÙÙ
+",year:"Ø³ÙØ©",month:"ØŽÙØ±",week:"Ø£Ø³ØšÙØ¹",day:"ÙÙÙ
+",list:"Ø£Ø¬ÙØ¯Ø©"},weekText:"Ø£Ø³ØšÙØ¹",allDayText:"Ø§ÙÙÙÙ
+ ÙÙÙ",moreLinkText:"Ø£Ø®Ø±Ù",noEventsText:"Ø£Ù Ø£Ø­Ø¯Ø§Ø« ÙØ¹Ø±Ø¶"},{code:"ar",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"Ø§ÙØ³Ø§ØšÙ",next:"Ø§ÙØªØ§ÙÙ",today:"Ø§ÙÙÙÙ
+",year:"Ø³ÙØ©",month:"ØŽÙØ±",week:"Ø£Ø³ØšÙØ¹",day:"ÙÙÙ
+",list:"Ø£Ø¬ÙØ¯Ø©"},weekText:"Ø£Ø³ØšÙØ¹",allDayText:"Ø§ÙÙÙÙ
+ ÙÙÙ",moreLinkText:"Ø£Ø®Ø±Ù",noEventsText:"Ø£Ù Ø£Ø­Ø¯Ø§Ø« ÙØ¹Ø±Ø¶"},{code:"az",week:{dow:1,doy:4},buttonText:{prev:"ÆvvÉl",next:"Sonra",today:"Bu GÃŒn",year:"Il",month:"Ay",week:"HÉftÉ",day:"GÃŒn",list:"GÃŒndÉm"},weekText:"HÉftÉ",allDayText:"BÃŒtÃŒn GÃŒn",moreLinkText:e=>"+ daha Ã§ox "+e,noEventsText:"GÃ¶stÉrmÉk ÃŒÃ§ÃŒn hadisÉ yoxdur"},{code:"bg",week:{dow:1,doy:4},buttonText:{prev:"ÐœÐ°Ð·Ð°ÐŽ",next:"ÐœÐ°Ð¿ÑÐµÐŽ",today:"ÐŽÐœÐµÑ",year:"Ð³ÐŸÐŽÐžÐœÐ°",month:"ÐÐµÑÐµÑ",week:"Ð¡ÐµÐŽÐŒÐžÑÐ°",day:"ÐÐµÐœ",list:"ÐÑÐ°ÑÐžÐº"},allDayText:"ÐŠÑÐ» ÐŽÐµÐœ",moreLinkText:e=>"+ÐŸÑÐµ "+e,noEventsText:"ÐÑÐŒÐ° ÑÑÐ±ÐžÑÐžÑ Ð·Ð° Ð¿ÐŸÐºÐ°Ð·Ð²Ð°ÐœÐµ"},{code:"bn",week:{dow:0,doy:6},buttonText:{prev:"àŠªà§àŠàŠšà§",next:"àŠžàŠŸàŠ®àŠšà§",today:"àŠàŠ",year:"àŠ¬àŠàŠ°",month:"àŠ®àŠŸàŠž",week:"àŠžàŠªà§àŠ€àŠŸàŠ¹",day:"àŠŠàŠ¿àŠš",list:"àŠ€àŠŸàŠ²àŠ¿àŠàŠŸ"},weekText:"àŠžàŠªà§àŠ€àŠŸàŠ¹",allDayText:"àŠžàŠŸàŠ°àŠŸàŠŠàŠ¿àŠš",moreLinkText:e=>"+àŠ
+àŠšà§àŠ¯àŠŸàŠšà§àŠ¯ "+e,noEventsText:"àŠà§àŠšà§ àŠàŠ­à§àŠšà§àŠ àŠšà§àŠ"},{code:"bs",week:{dow:1,doy:7},buttonText:{prev:"ProÅ¡li",next:"SljedeÄi",today:"Danas",year:"Godina",month:"Mjesec",week:"Sedmica",day:"Dan",list:"Raspored"},weekText:"Sed",allDayText:"Cijeli dan",moreLinkText:e=>"+ joÅ¡ "+e,noEventsText:"Nema dogaÄaja za prikazivanje"},{code:"ca",week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"SegÃŒent",today:"Avui",year:"Any",month:"Mes",week:"Setmana",day:"Dia",list:"Agenda"},weekText:"Set",allDayText:"Tot el dia",moreLinkText:"mÃ©s",noEventsText:"No hi ha esdeveniments per mostrar"},{code:"cs",week:{dow:1,doy:4},buttonText:{prev:"DÅÃ­ve",next:"PozdÄji",today:"NynÃ­",year:"Rok",month:"MÄsÃ­c",week:"TÃœden",day:"Den",list:"Agenda"},weekText:"TÃœd",allDayText:"CelÃœ den",moreLinkText:e=>"+dalÅ¡Ã­: "+e,noEventsText:"ÅœÃ¡dnÃ© akce k zobrazenÃ­"},{code:"cy",week:{dow:1,doy:4},buttonText:{prev:"Blaenorol",next:"Nesaf",today:"Heddiw",year:"Blwyddyn",month:"Mis",week:"Wythnos",day:"Dydd",list:"Rhestr"},weekText:"Wythnos",allDayText:"Trwy'r dydd",moreLinkText:"Mwy",noEventsText:"Dim digwyddiadau"},{code:"da",week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"NÃŠste",today:"I dag",year:"Ã
+r",month:"MÃ¥ned",week:"Uge",day:"Dag",list:"Agenda"},weekText:"Uge",allDayText:"Hele dagen",moreLinkText:"flere",noEventsText:"Ingen arrangementer at vise"},{code:"de-at",week:{dow:1,doy:4},buttonText:{prev:"ZurÃŒck",next:"Vor",today:"Heute",year:"Jahr",month:"Monat",week:"Woche",day:"Tag",list:"TerminÃŒbersicht"},weekText:"KW",weekTextLong:"Woche",allDayText:"GanztÃ€gig",moreLinkText:e=>"+ weitere "+e,noEventsText:"Keine Ereignisse anzuzeigen",buttonHints:{prev:e=>`Vorherige${t(e)} ${e}`,next:e=>`NÃ€chste${t(e)} ${e}`,today:e=>"Tag"===e?"Heute":`Diese${t(e)} ${e}`},viewHint:e=>e+("Woche"===e?"n":"Monat"===e?"s":"es")+"ansicht",navLinkHint:"Gehe zu $0",moreLinkHint:e=>"Zeige "+(1===e?"ein weiteres Ereignis":e+" weitere Ereignisse"),closeHint:"SchlieÃen",timeHint:"Uhrzeit",eventHint:"Ereignis"},{code:"de",week:{dow:1,doy:4},buttonText:{prev:"ZurÃŒck",next:"Vor",today:"Heute",year:"Jahr",month:"Monat",week:"Woche",day:"Tag",list:"TerminÃŒbersicht"},weekText:"KW",weekTextLong:"Woche",allDayText:"GanztÃ€gig",moreLinkText:e=>"+ weitere "+e,noEventsText:"Keine Ereignisse anzuzeigen",buttonHints:{prev:e=>`Vorherige${n(e)} ${e}`,next:e=>`NÃ€chste${n(e)} ${e}`,today:e=>"Tag"===e?"Heute":`Diese${n(e)} ${e}`},viewHint:e=>e+("Woche"===e?"n":"Monat"===e?"s":"es")+"ansicht",navLinkHint:"Gehe zu $0",moreLinkHint:e=>"Zeige "+(1===e?"ein weiteres Ereignis":e+" weitere Ereignisse"),closeHint:"SchlieÃen",timeHint:"Uhrzeit",eventHint:"Ereignis"},{code:"el",week:{dow:1,doy:4},buttonText:{prev:"Î ÏÎ¿Î·Î³Î¿ÏÎŒÎµÎœÎ¿Ï",next:"ÎÏÏÎŒÎµÎœÎ¿Ï",today:"Î£Î®ÎŒÎµÏÎ±",year:"ÎÏÎ¿Ï",month:"ÎÎ®ÎœÎ±Ï",week:"ÎÎ²ÎŽÎ¿ÎŒÎ¬ÎŽÎ±",day:"ÎÎŒÎ­ÏÎ±",list:"ÎÏÎ¶Î­ÎœÏÎ±"},weekText:"ÎÎ²ÎŽ",allDayText:"ÎÎ»Î¿Î®ÎŒÎµÏÎ¿",moreLinkText:"ÏÎµÏÎ¹ÏÏÏÏÎµÏÎ±",noEventsText:"ÎÎµÎœ Ï
+ÏÎ¬ÏÏÎ¿Ï
+Îœ Î³ÎµÎ³Î¿ÎœÏÏÎ± ÏÏÎ¿Ï ÎµÎŒÏÎ¬ÎœÎ¹ÏÎ·"},{code:"en-au",week:{dow:1,doy:4},buttonHints:{prev:"Previous $0",next:"Next $0",today:"This $0"},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:e=>`Show ${e} more event${1===e?"":"s"}`},{code:"en-gb",week:{dow:1,doy:4},buttonHints:{prev:"Previous $0",next:"Next $0",today:"This $0"},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:e=>`Show ${e} more event${1===e?"":"s"}`},{code:"en-nz",week:{dow:1,doy:4},buttonHints:{prev:"Previous $0",next:"Next $0",today:"This $0"},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:e=>`Show ${e} more event${1===e?"":"s"}`},{code:"eo",week:{dow:1,doy:4},buttonText:{prev:"AntaÅ­a",next:"Sekva",today:"HodiaÅ­",year:"Jaro",month:"Monato",week:"Semajno",day:"Tago",list:"Tagordo"},weekText:"Sm",allDayText:"Tuta tago",moreLinkText:"pli",noEventsText:"Neniuj eventoj por montri"},{code:"es",week:{dow:0,doy:6},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",year:"AÃ±o",month:"Mes",week:"Semana",day:"DÃ­a",list:"Agenda"},weekText:"Sm",allDayText:"Todo el dÃ­a",moreLinkText:"mÃ¡s",noEventsText:"No hay eventos para mostrar"},{code:"es",week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",year:"AÃ±o",month:"Mes",week:"Semana",day:"DÃ­a",list:"Agenda"},buttonHints:{prev:"$0 antes",next:"$0 siguiente",today:e=>"DÃ­a"===e?"Hoy":("Semana"===e?"Esta":"Este")+" "+e.toLocaleLowerCase()},viewHint:e=>"Vista "+("Semana"===e?"de la":"del")+" "+e.toLocaleLowerCase(),weekText:"Sm",weekTextLong:"Semana",allDayText:"Todo el dÃ­a",moreLinkText:"mÃ¡s",moreLinkHint:e=>`Mostrar ${e} eventos mÃ¡s`,noEventsText:"No hay eventos para mostrar",navLinkHint:"Ir al $0",closeHint:"Cerrar",timeHint:"La hora",eventHint:"Evento"},{code:"et",week:{dow:1,doy:4},buttonText:{prev:"Eelnev",next:"JÃ€rgnev",today:"TÃ€na",year:"Aasta",month:"Kuu",week:"NÃ€dal",day:"PÃ€ev",list:"PÃ€evakord"},weekText:"nÃ€d",allDayText:"Kogu pÃ€ev",moreLinkText:e=>"+ veel "+e,noEventsText:"Kuvamiseks puuduvad sÃŒndmused"},{code:"eu",week:{dow:1,doy:7},buttonText:{prev:"Aur",next:"Hur",today:"Gaur",year:"Urtea",month:"Hilabetea",week:"Astea",day:"Eguna",list:"Agenda"},weekText:"As",allDayText:"Egun osoa",moreLinkText:"gehiago",noEventsText:"Ez dago ekitaldirik erakusteko"},{code:"fa",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"ÙØšÙÛ",next:"ØšØ¹Ø¯Û",today:"Ø§Ù
+Ø±ÙØ²",year:"Ø³Ø§Ù",month:"Ù
+Ø§Ù",week:"ÙÙØªÙ",day:"Ø±ÙØ²",list:"ØšØ±ÙØ§Ù
+Ù"},weekText:"ÙÙ",allDayText:"ØªÙ
+Ø§Ù
+ Ø±ÙØ²",moreLinkText:e=>"ØšÛØŽ Ø§Ø² "+e,noEventsText:"ÙÛÚ Ø±ÙÛØ¯Ø§Ø¯Û ØšÙ ÙÙ
+Ø§ÛØŽ"},{code:"fi",week:{dow:1,doy:4},buttonText:{prev:"Edellinen",next:"Seuraava",today:"TÃ€nÃ€Ã€n",year:"Vuosi",month:"Kuukausi",week:"Viikko",day:"PÃ€ivÃ€",list:"Tapahtumat"},weekText:"Vk",allDayText:"Koko pÃ€ivÃ€",moreLinkText:"lisÃ€Ã€",noEventsText:"Ei nÃ€ytettÃ€viÃ€ tapahtumia"},{code:"fr",buttonText:{prev:"PrÃ©cÃ©dent",next:"Suivant",today:"Aujourd'hui",year:"AnnÃ©e",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekText:"Sem.",allDayText:"Toute la journÃ©e",moreLinkText:"en plus",noEventsText:"Aucun Ã©vÃšnement Ã  afficher"},{code:"fr-ch",week:{dow:1,doy:4},buttonText:{prev:"PrÃ©cÃ©dent",next:"Suivant",today:"Courant",year:"AnnÃ©e",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekText:"Sm",allDayText:"Toute la journÃ©e",moreLinkText:"en plus",noEventsText:"Aucun Ã©vÃšnement Ã  afficher"},{code:"fr",week:{dow:1,doy:4},buttonText:{prev:"PrÃ©cÃ©dent",next:"Suivant",today:"Aujourd'hui",year:"AnnÃ©e",month:"Mois",week:"Semaine",day:"Jour",list:"Planning"},weekText:"Sem.",weekTextLong:"Semaine",allDayText:"Toute la journÃ©e",moreLinkText:"en plus",noEventsText:"Aucun Ã©vÃšnement Ã  afficher"},{code:"gl",week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Seg",today:"Hoxe",year:"Ano",month:"Mes",week:"Semana",day:"DÃ­a",list:"Axenda"},buttonHints:{prev:"$0 antes",next:"$0 seguinte",today:e=>"DÃ­a"===e?"Hoxe":("Semana"===e?"Esta":"Este")+" "+e.toLocaleLowerCase()},viewHint:e=>"Vista "+("Semana"===e?"da":"do")+" "+e.toLocaleLowerCase(),weekText:"Sm",weekTextLong:"Semana",allDayText:"Todo o dÃ­a",moreLinkText:"mÃ¡is",moreLinkHint:e=>`Amosar ${e} eventos mÃ¡is`,noEventsText:"Non hai eventos para amosar",navLinkHint:"Ir ao $0",closeHint:"Pechar",timeHint:"A hora",eventHint:"Evento"},{code:"he",direction:"rtl",buttonText:{prev:"××§×××",next:"×××",today:"××××",year:"×©× ×",month:"××××©",week:"×©×××¢",day:"×××",list:"×¡××š ×××"},allDayText:"×× ××××",moreLinkText:"× ××¡×€××",noEventsText:"××× ×××š××¢×× ×××Š××",weekText:"×©×××¢"},{code:"hi",week:{dow:0,doy:6},buttonText:{prev:"à€ªà€¿à€à€²à€Ÿ",next:"à€
+à€à€²à€Ÿ",today:"à€à€",year:"à€µà€°à¥à€·",month:"à€®à€¹à¥à€šà€Ÿ",week:"à€žà€ªà¥à€€à€Ÿà€¹",day:"à€Šà€¿à€š",list:"à€à€Ÿà€°à¥à€¯à€žà¥à€à¥"},weekText:"à€¹à€«à¥à€€à€Ÿ",allDayText:"à€žà€­à¥ à€Šà€¿à€š",moreLinkText:e=>"+à€
+à€§à€¿à€ "+e,noEventsText:"à€à¥à€ à€à€à€šà€Ÿà€à€ à€à¥ à€ªà¥à€°à€Šà€°à¥à€¶à€¿à€€ à€à€°à€šà¥ à€à¥ à€²à€¿à€"},{code:"hr",week:{dow:1,doy:7},buttonText:{prev:"PrijaÅ¡nji",next:"SljedeÄi",today:"Danas",year:"Godina",month:"Mjesec",week:"Tjedan",day:"Dan",list:"Raspored"},weekText:"Tje",allDayText:"Cijeli dan",moreLinkText:e=>"+ joÅ¡ "+e,noEventsText:"Nema dogaÄaja za prikaz"},{code:"hu",week:{dow:1,doy:4},buttonText:{prev:"vissza",next:"elÅre",today:"ma",year:"Ãv",month:"HÃ³nap",week:"HÃ©t",day:"Nap",list:"Lista"},weekText:"HÃ©t",allDayText:"EgÃ©sz nap",moreLinkText:"tovÃ¡bbi",noEventsText:"Nincs megjelenÃ­thetÅ esemÃ©ny"},{code:"hy-am",week:{dow:1,doy:4},buttonText:{prev:"ÕÕ¡Õ­ÕžÖÕ€",next:"ÕÕ¡Õ»ÕžÖÕ€",today:"Ô±ÕµÕœÖ
+Ö",year:"ÕÕ¡ÖÕ«",month:"Ô±ÕŽÕ«Õœ",week:"ÕÕ¡Õ¢Õ¡Õ©",day:"ÕÖ",list:"ÕÖÕŸÕ¡ ÖÕžÖÖÕ¡Õ¯"},weekText:"ÕÕ¡Õ¢",allDayText:"Ô±ÕŽÕ¢ÕžÕ²Õ» Ö
+Ö",moreLinkText:e=>"+ ÖÕœ "+e,noEventsText:"Ô²Õ¡ÖÕ¡Õ¯Õ¡ÕµÕžÖÕŽ Õ§ Õ«ÖÕ¡Õ€Õ¡ÖÕ±ÕžÖÕ©ÕµÕžÖÕ¶Õš ÖÕžÖÖÕ¡Õ€ÖÕ¥Õ¬ÕžÖ"},{code:"id",week:{dow:1,doy:7},buttonText:{prev:"mundur",next:"maju",today:"hari ini",year:"Tahun",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekText:"Mg",allDayText:"Sehari penuh",moreLinkText:"lebih",noEventsText:"Tidak ada acara untuk ditampilkan"},{code:"is",week:{dow:1,doy:4},buttonText:{prev:"Fyrri",next:"NÃŠsti",today:"Ã dag",year:"Ãr",month:"MÃ¡nuÃ°ur",week:"Vika",day:"Dagur",list:"DagskrÃ¡"},weekText:"Vika",allDayText:"Allan daginn",moreLinkText:"meira",noEventsText:"Engir viÃ°burÃ°ir til aÃ° sÃœna"},{code:"it",week:{dow:1,doy:4},buttonText:{prev:"Prec",next:"Succ",today:"Oggi",year:"Anno",month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},weekText:"Sm",allDayText:"Tutto il giorno",moreLinkText:e=>"+altri "+e,noEventsText:"Non ci sono eventi da visualizzare"},{code:"ja",buttonText:{prev:"å",next:"æ¬¡",today:"ä»æ¥",year:"å¹Ž",month:"æ",week:"é±",day:"æ¥",list:"äºå®ãªã¹ã"},weekText:"é±",allDayText:"çµæ¥",moreLinkText:e=>"ä» "+e+" ä»¶",noEventsText:"è¡šç€ºããäºå®ã¯ãããŸãã"},{code:"ka",week:{dow:1,doy:7},buttonText:{prev:"á¬ááá",next:"ášáááááá",today:"ááŠáá¡",year:"á¬áááá¬ááá",month:"ááá",week:"áááá á",day:"ááŠá",list:"ááŠáá¡ á¬áá¡á ááá"},weekText:"áá",allDayText:"ááááá ááŠá",moreLinkText:e=>"+ ááááá "+e,noEventsText:"áŠáááá¡á«áááááá áá  áá áá¡"},{code:"kk",week:{dow:1,doy:7},buttonText:{prev:"ÐÐ»ÐŽÑÒ£ÒÑ",next:"ÐÐµÐ»ÐµÑÑ",today:"ÐÒ¯Ð³ÑÐœ",year:"ÐÑÐ»",month:"ÐÐ¹",week:"ÐÐ¿ÑÐ°",day:"ÐÒ¯Ðœ",list:"ÐÒ¯Ðœ ÑÓÑÑÑÐ±Ñ"},weekText:"ÐÐµ",allDayText:"ÐÒ¯ÐœÑ Ð±ÐŸÐ¹Ñ",moreLinkText:e=>"+ ÑÐ°ÒÑ "+e,noEventsText:"ÐÓ©ÑÑÐµÑÑ Ò¯ÑÑÐœ ÐŸÒÐžÒÐ°Ð»Ð°Ñ Ð¶ÐŸÒ"},{code:"km",week:{dow:1,doy:4},buttonText:{prev:"áá»á",next:"ááááá¶áá",today:"ááááááá",year:"áááá¶á",month:"áá",week:"ááááá¶á á",day:"áááá",list:"áááááž"},weekText:"ááááá¶á á",allDayText:"áááááœááááá",moreLinkText:"á
+áááŸáááá",noEventsText:"áááá¶ááááá¹áááá·áá¶áááááááŒááááá á¶á"},{code:"ko",buttonText:{prev:"ìŽì ë¬",next:"ë€ìë¬",today:"ì€ë",year:"ë
+ë",month:"ì",week:"ì£Œ",day:"ìŒ",list:"ìŒì ëª©ë¡"},weekText:"ì£Œ",allDayText:"ì¢
+ìŒ",moreLinkText:"ê°",noEventsText:"ìŒì ìŽ ììµëë€"},{code:"ku",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"ÙŸÛØŽØªØ±",next:"Ø¯ÙØ§ØªØ±",today:"ØŠÛÙ
+ÚÙ",year:"Ø³Ø§Úµ",month:"Ù
+Ø§ÙÚ¯",week:"ÙÛÙØªÛ",day:"ÚÛÚ",list:"ØšÛØ±ÙØ§Ù
+Û"},weekText:"ÙÛÙØªÛ",allDayText:"ÙÛÙ
+ÙÙ ÚÛÚÛÚ©Û",moreLinkText:"Ø²ÛØ§ØªØ±",noEventsText:"ÙÛÚ ÚÙÙØ¯Ø§ÙÛÙ ÙÛÛ"},{code:"lb",week:{dow:1,doy:4},buttonText:{prev:"ZrÃ©ck",next:"Weider",today:"Haut",year:"Joer",month:"Mount",week:"Woch",day:"Dag",list:"Terminiwwersiicht"},weekText:"W",allDayText:"Ganzen Dag",moreLinkText:"mÃ©i",noEventsText:"Nee Evenementer ze affichÃ©ieren"},{code:"lt",week:{dow:1,doy:4},buttonText:{prev:"Atgal",next:"Pirmyn",today:"Å iandien",year:"Metai",month:"MÄnuo",week:"SavaitÄ",day:"Diena",list:"DarbotvarkÄ"},weekText:"SAV",allDayText:"VisÄ
+ dienÄ
+",moreLinkText:"daugiau",noEventsText:"NÄra Ä¯vykiÅ³ rodyti"},{code:"lv",week:{dow:1,doy:4},buttonText:{prev:"Iepr.",next:"NÄk.",today:"Å odien",year:"Gads",month:"MÄnesis",week:"NedÄÄŒa",day:"Diena",list:"Dienas kÄrtÄ«ba"},weekText:"Ned.",allDayText:"Visu dienu",moreLinkText:e=>"+vÄl "+e,noEventsText:"Nav notikumu"},{code:"mk",buttonText:{prev:"Ð¿ÑÐµÑÑ
+ÐŸÐŽÐœÐŸ",next:"ÑÐ»ÐµÐŽÐœÐŸ",today:"ÐÐµÐœÐµÑ",year:"Ð³ÐŸÐŽÐžÐœÐ°",month:"ÐÐµÑÐµÑ",week:"ÐÐµÐŽÐµÐ»Ð°",day:"ÐÐµÐœ",list:"ÐÑÐ°ÑÐžÐº"},weekText:"Ð¡ÐµÐŽ",allDayText:"ÐŠÐµÐ» ÐŽÐµÐœ",moreLinkText:e=>"+Ð¿ÐŸÐ²ÐµÑÐµ "+e,noEventsText:"ÐÐµÐŒÐ° ÐœÐ°ÑÑÐ°ÐœÐž Ð·Ð° Ð¿ÑÐžÐºÐ°Ð¶ÑÐ²Ð°ÑÐµ"},{code:"ms",week:{dow:1,doy:7},buttonText:{prev:"Sebelum",next:"Selepas",today:"hari ini",year:"Tahun",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekText:"Mg",allDayText:"Sepanjang hari",moreLinkText:e=>"masih ada "+e+" acara",noEventsText:"Tiada peristiwa untuk dipaparkan"},{code:"nb",week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Neste",today:"I dag",year:"Ã
+r",month:"MÃ¥ned",week:"Uke",day:"Dag",list:"Agenda"},weekText:"Uke",weekTextLong:"Uke",allDayText:"Hele dagen",moreLinkText:"til",noEventsText:"Ingen hendelser Ã¥ vise",buttonHints:{prev:"Forrige $0",next:"Neste $0",today:"NÃ¥vÃŠrende $0"},viewHint:"$0 visning",navLinkHint:"GÃ¥ til $0",moreLinkHint:e=>`Vis ${e} flere hendelse${1===e?"":"r"}`},{code:"ne",week:{dow:7,doy:1},buttonText:{prev:"à€
+à€à€¿à€²à¥à€²à¥",next:"à€
+à€°à¥à€à¥",today:"à€à€",year:"à€µà€°à¥à€·",month:"à€®à€¹à€¿à€šà€Ÿ",week:"à€¹à€ªà¥à€€à€Ÿ",day:"à€Šà€¿à€š",list:"à€žà¥à€à¥"},weekText:"à€¹à€ªà¥à€€à€Ÿ",allDayText:"à€Šà€¿à€šà€­à€°à€¿",moreLinkText:"à€¥à€ª à€²à€¿à€à€",noEventsText:"à€Šà¥à€à€Ÿà€à€šà€à¥ à€²à€Ÿà€à€¿ à€à¥à€šà¥ à€à€à€šà€Ÿà€¹à€°à¥ à€à¥à€šà€šà¥"},{code:"nl",week:{dow:1,doy:4},buttonText:{prev:"Vorige",next:"Volgende",today:"Vandaag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Lijst"},allDayText:"Hele dag",moreLinkText:"extra",noEventsText:"Geen evenementen om te laten zien"},{code:"nn",week:{dow:1,doy:4},buttonText:{prev:"FÃžrre",next:"Neste",today:"I dag",year:"Ã
+r",month:"MÃ¥nad",week:"Veke",day:"Dag",list:"Agenda"},weekText:"Veke",allDayText:"Heile dagen",moreLinkText:"til",noEventsText:"Ingen hendelser Ã¥ vise"},{code:"pl",week:{dow:1,doy:4},buttonText:{prev:"Poprzedni",next:"NastÄpny",today:"DziÅ",year:"Rok",month:"MiesiÄ
+c",week:"TydzieÅ",day:"DzieÅ",list:"Plan dnia"},weekText:"Tydz",allDayText:"CaÅy dzieÅ",moreLinkText:"wiÄcej",noEventsText:"Brak wydarzeÅ do wyÅwietlenia"},{code:"pt-br",buttonText:{prev:"Anterior",next:"PrÃ³ximo",prevYear:"Ano anterior",nextYear:"PrÃ³ximo ano",year:"Ano",today:"Hoje",month:"MÃªs",week:"Semana",day:"Dia",list:"Lista"},buttonHints:{prev:"$0 Anterior",next:"PrÃ³ximo $0",today:e=>"Dia"===e?"Hoje":("Semana"===e?"Esta":"Este")+" "+e.toLocaleLowerCase()},viewHint:e=>"Visualizar "+("Semana"===e?"a":"o")+" "+e.toLocaleLowerCase(),weekText:"Sm",weekTextLong:"Semana",allDayText:"dia inteiro",moreLinkText:e=>"mais +"+e,moreLinkHint:e=>`Mostrar mais ${e} eventos`,noEventsText:"NÃ£o hÃ¡ eventos para mostrar",navLinkHint:"Ir para $0",closeHint:"Fechar",timeHint:"A hora",eventHint:"Evento"},{code:"pt",week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"Seguinte",today:"Hoje",year:"Ano",month:"MÃªs",week:"Semana",day:"Dia",list:"Agenda"},weekText:"Sem",allDayText:"Todo o dia",moreLinkText:"mais",noEventsText:"NÃ£o hÃ¡ eventos para mostrar"},{code:"ro",week:{dow:1,doy:7},buttonText:{prev:"precedentÄ",next:"urmÄtoare",today:"Azi",year:"An",month:"LunÄ",week:"SÄptÄmÃ¢nÄ",day:"Zi",list:"AgendÄ"},weekText:"SÄpt",allDayText:"ToatÄ ziua",moreLinkText:e=>"+alte "+e,noEventsText:"Nu existÄ evenimente de afiÈat"},{code:"ru",week:{dow:1,doy:4},buttonText:{prev:"ÐÑÐµÐŽ",next:"Ð¡Ð»ÐµÐŽ",today:"Ð¡ÐµÐ³ÐŸÐŽÐœÑ",year:"ÐÐŸÐŽ",month:"ÐÐµÑÑÑ",week:"ÐÐµÐŽÐµÐ»Ñ",day:"ÐÐµÐœÑ",list:"ÐÐŸÐ²ÐµÑÑÐºÐ° ÐŽÐœÑ"},weekText:"ÐÐµÐŽ",allDayText:"ÐÐµÑÑ ÐŽÐµÐœÑ",moreLinkText:e=>"+ ÐµÑÑ "+e,noEventsText:"ÐÐµÑ ÑÐŸÐ±ÑÑÐžÐ¹ ÐŽÐ»Ñ ÐŸÑÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ"},{code:"si-lk",week:{dow:1,doy:4},buttonText:{prev:"à¶Žà·à¶»",next:"à¶Žà·à·",today:"à¶
+à¶¯",year:"à¶
+à·à·à¶»à·à¶¯à·",month:"à¶žà·à·à¶º",week:"à·à¶­à·à¶º",day:"à¶¯à·à·",list:"à¶œà·à¶ºà·à·à·à¶­à·à·"},weekText:"à·à¶­à·",allDayText:"à·à·à¶ºà¶œà·",moreLinkText:"à¶­à·à¶­à·",noEventsText:"à¶žà·à¶à·à¶­à· à¶±à·à¶­"},{code:"sk",week:{dow:1,doy:4},buttonText:{prev:"PredchÃ¡dzajÃºci",next:"NasledujÃºci",today:"Dnes",year:"Rok",month:"Mesiac",week:"TÃœÅŸdeÅ",day:"DeÅ",list:"Rozvrh"},weekText:"Ty",allDayText:"CelÃœ deÅ",moreLinkText:e=>"+ÄalÅ¡ie: "+e,noEventsText:"Åœiadne akcie na zobrazenie"},{code:"sl",week:{dow:1,doy:7},buttonText:{prev:"PrejÅ¡nji",next:"Naslednji",today:"Trenutni",year:"Leto",month:"Mesec",week:"Teden",day:"Dan",list:"Dnevni red"},weekText:"Teden",allDayText:"Ves dan",moreLinkText:"veÄ",noEventsText:"Ni dogodkov za prikaz"},{code:"sm",buttonText:{prev:"Talu ai",next:"Mulimuli atu",today:"Aso nei",year:"Tausaga",month:"Masina",week:"Vaiaso",day:"Aso",list:"Faasologa"},weekText:"Vaiaso",allDayText:"Aso atoa",moreLinkText:"sili atu",noEventsText:"Leai ni mea na tutupu"},{code:"sq",week:{dow:1,doy:4},buttonText:{prev:"mbrapa",next:"PÃ«rpara",today:"Sot",year:"Viti",month:"Muaj",week:"JavÃ«",day:"DitÃ«",list:"ListÃ«"},weekText:"Ja",allDayText:"GjithÃ« ditÃ«n",moreLinkText:e=>"+mÃ« tepÃ«r "+e,noEventsText:"Nuk ka evente pÃ«r tÃ« shfaqur"},{code:"sr-cyrl",week:{dow:1,doy:7},buttonText:{prev:"ÐÑÐµÑÑ
+ÐŸÐŽÐœÐ°",next:"ÑÐ»ÐµÐŽÐµÑÐž",today:"ÐÐ°ÐœÐ°Ñ",year:"ÐÐŸÐŽÐžÐœÐ°",month:"ÐÐµÑÐµÑ",week:"ÐÐµÐŽÐµÑÐ°",day:"ÐÐ°Ðœ",list:"ÐÐ»Ð°ÐœÐµÑ"},weekText:"Ð¡ÐµÐŽ",allDayText:"ÐŠÐµÐŸ ÐŽÐ°Ðœ",moreLinkText:e=>"+ ÑÐŸÑ "+e,noEventsText:"ÐÐµÐŒÐ° ÐŽÐŸÐ³Ð°ÑÐ°ÑÐ° Ð·Ð° Ð¿ÑÐžÐºÐ°Ð·"},{code:"sr",week:{dow:1,doy:7},buttonText:{prev:"Prethodna",next:"SledecÌi",today:"Danas",year:"Godina",month:"MÐµsÐµc",week:"NÐµdÐµlja",day:"Dan",list:"PlanÐµr"},weekText:"Sed",allDayText:"CÐµo dan",moreLinkText:e=>"+ joÅ¡ "+e,noEventsText:"NÐµma dogaÄaja za prikaz"},{code:"sv",week:{dow:1,doy:4},buttonText:{prev:"FÃ¶rra",next:"NÃ€sta",today:"Idag",year:"Ã
+r",month:"MÃ¥nad",week:"Vecka",day:"Dag",list:"Program"},buttonHints:{prev:e=>"FÃ¶regÃ¥ende "+e.toLocaleLowerCase(),next:e=>"NÃ€sta "+e.toLocaleLowerCase(),today:e=>("Program"===e?"Detta":"Denna")+" "+e.toLocaleLowerCase()},viewHint:"$0 vy",navLinkHint:"GÃ¥ till $0",moreLinkHint:e=>`Visa ytterligare ${e} hÃ€ndelse${1===e?"":"r"}`,weekText:"v.",weekTextLong:"Vecka",allDayText:"Heldag",moreLinkText:"till",noEventsText:"Inga hÃ€ndelser att visa",closeHint:"StÃ€ng",timeHint:"Klockan",eventHint:"HÃ€ndelse"},{code:"ta-in",week:{dow:1,doy:4},buttonText:{prev:"à®®à¯à®šà¯à®€à¯à®¯",next:"à®
+à®à¯à®€à¯à®€à®€à¯",today:"à®à®©à¯à®±à¯",year:"à®à®£à¯à®à¯",month:"à®®à®Ÿà®€à®®à¯",week:"à®µà®Ÿà®°à®®à¯",day:"à®šà®Ÿà®³à¯",list:"à®€à®¿à®©à®à®°à®¿ à®
+à®à¯à®à®µà®£à¯"},weekText:"à®µà®Ÿà®°à®®à¯",allDayText:"à®šà®Ÿà®³à¯ à®®à¯à®Žà¯à®µà®€à¯à®®à¯",moreLinkText:e=>"+ à®®à¯à®²à¯à®®à¯ "+e,noEventsText:"à®à®Ÿà®£à¯à®ªà®¿à®à¯à® à®šà®¿à®à®Žà¯à®µà¯à®à®³à¯ à®à®²à¯à®²à¯"},{code:"th",week:{dow:1,doy:4},buttonText:{prev:"àžà¹àž­àžàž«àžà¹àž²",next:"àžàž±àžà¹àž",prevYear:"àžàžµàžà¹àž­àžàž«àžà¹àž²",nextYear:"àžàžµàžàž±àžà¹àž",year:"àžàžµ",today:"àž§àž±àžàžàžµà¹",month:"à¹àžàž·àž­àž",week:"àžªàž±àžàžàž²àž«à¹",day:"àž§àž±àž",list:"àžàž³àž«àžàžàžàž²àž£"},weekText:"àžªàž±àžàžàž²àž«à¹",allDayText:"àžàž¥àž­àžàž§àž±àž",moreLinkText:"à¹àžàžŽà¹àž¡à¹àžàžŽàž¡",noEventsText:"à¹àž¡à¹àž¡àžµàžàžŽàžàžàž£àž£àž¡àžàžµà¹àžàž°à¹àžªàžàž"},{code:"tr",week:{dow:1,doy:7},buttonText:{prev:"geri",next:"ileri",today:"bugÃŒn",year:"YÄ±l",month:"Ay",week:"Hafta",day:"GÃŒn",list:"Ajanda"},weekText:"Hf",allDayText:"TÃŒm gÃŒn",moreLinkText:"daha fazla",noEventsText:"GÃ¶sterilecek etkinlik yok"},{code:"ug",buttonText:{prev:"ØŠØ§ÙØ¯ÙÙÙÙ",next:"ÙÛÙÙÙÙÙ",today:"ØšÛÚ¯ÛÙ",year:"ÙÙÙ",month:"ØŠØ§Ù",week:"ÚŸÛÙŸØªÛ",day:"ÙÛÙ",list:"ÙÛÙØªÛØ±ØªÙÙŸ"},allDayText:"ÙŸÛØªÛÙ ÙÛÙ"},{code:"uk",week:{dow:1,doy:7},buttonText:{prev:"ÐÐŸÐ¿ÐµÑÐµÐŽÐœÑÐ¹",next:"ÐŽÐ°Ð»Ñ",today:"Ð¡ÑÐŸÐ³ÐŸÐŽÐœÑ",year:"ÑÑÐº",month:"ÐÑÑÑÑÑ",week:"Ð¢ÐžÐ¶ÐŽÐµÐœÑ",day:"ÐÐµÐœÑ",list:"ÐÐŸÑÑÐŽÐŸÐº ÐŽÐµÐœÐœÐžÐ¹"},weekText:"Ð¢ÐžÐ¶",allDayText:"Ð£Ð²ÐµÑÑ ÐŽÐµÐœÑ",moreLinkText:e=>"+ÑÐµ "+e+"...",noEventsText:"ÐÐµÐŒÐ°Ñ Ð¿ÐŸÐŽÑÐ¹ ÐŽÐ»Ñ Ð²ÑÐŽÐŸÐ±ÑÐ°Ð¶ÐµÐœÐœÑ"},{code:"uz-cy",week:{dow:1,doy:4},buttonText:{prev:"ÐÐ»ÐžÐœ",next:"ÐÐµÐ¹ÐžÐœ",today:"ÐÑÐ³ÑÐœ",month:"ÐÐ¹",week:"Ò²Ð°ÑÑÐ°",day:"ÐÑÐœ",list:"ÐÑÐœ ÑÐ°ÑÑÐžÐ±Ðž"},weekText:"Ò²Ð°ÑÑÐ°",allDayText:"ÐÑÐœ Ð±ÑÐ¹ÐžÑÐ°",moreLinkText:e=>"+ ÑÐœÐ° "+e,noEventsText:"ÐÑÑÑÐ°ÑÐžÑ ÑÑÑÐœ Ð²ÐŸÒÐµÐ°Ð»Ð°Ñ Ð¹ÑÒ"},{code:"uz",week:{dow:1,doy:4},buttonText:{prev:"Oldingi",next:"Keyingi",today:"Bugun",year:"Yil",month:"Oy",week:"Xafta",day:"Kun",list:"Kun tartibi"},allDayText:"Kun bo'yi",moreLinkText:e=>"+ yana "+e,noEventsText:"Ko'rsatish uchun voqealar yo'q"},{code:"vi",week:{dow:1,doy:4},buttonText:{prev:"TrÆ°á»c",next:"Tiáº¿p",today:"HÃŽm nay",year:"NÄm",month:"ThÃ¡ng",week:"TuÃ¢Ìn",day:"NgÃ y",list:"Lá»ch biá»u"},weekText:"Tu",allDayText:"Cáº£ ngÃ y",moreLinkText:e=>"+ thÃªm "+e,noEventsText:"KhÃŽng cÃ³ sá»± kiá»n Äá» hiá»n thá»"},{code:"zh-cn",week:{dow:1,doy:4},buttonText:{prev:"äžæ",next:"äžæ",today:"ä»å€©",year:"å¹Ž",month:"æ",week:"åš",day:"æ¥",list:"æ¥çš"},weekText:"åš",allDayText:"å
+šå€©",moreLinkText:e=>"åŠå€ "+e+" äžª",noEventsText:"æ²¡æäºä»¶æŸç€º"},{code:"zh-tw",buttonText:{prev:"äžå",next:"äžå",today:"ä»å€©",year:"å¹Ž",month:"æ",week:"é±",day:"å€©",list:"æŽ»ååè¡š"},weekText:"é±",allDayText:"æŽå€©",moreLinkText:"é¡¯ç€ºæŽå€",noEventsText:"æ²æä»»äœæŽ»å"}];FullCalendar.globalLocales.push(...o)}();
Index: /mods/mod_ticket/assets/vanilla-calendar/themes/dark.min.css
===================================================================
--- /mods/mod_ticket/assets/vanilla-calendar/themes/dark.min.css	(revision 8427)
+++ /mods/mod_ticket/assets/vanilla-calendar/themes/dark.min.css	(revision 8427)
@@ -0,0 +1,2 @@
+/*! name: @uvarov.frontend/vanilla-calendar | url: https://github.com/uvarov-frontend/vanilla-calendar */
+[data-calendar-theme=dark].vanilla-calendar{--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity))}[data-calendar-theme=dark].vanilla-calendar button:focus-visible{outline-color:#fdba74}[data-calendar-theme=dark] .vanilla-calendar-arrow:before{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}[data-calendar-theme=dark] .vanilla-calendar-arrow:hover:before{--tw-bg-opacity: 1;background-color:rgb(100 116 139 / var(--tw-bg-opacity))}[data-calendar-theme=dark] .vanilla-calendar-header__content,[data-calendar-theme=dark] .vanilla-calendar-month,[data-calendar-theme=dark] .vanilla-calendar-year{color:#fff}[data-calendar-theme=dark] .vanilla-calendar-month:hover,[data-calendar-theme=dark] .vanilla-calendar-year:hover,[data-calendar-theme=dark] .vanilla-calendar-month.vanilla-calendar-month_not-active,[data-calendar-theme=dark] .vanilla-calendar-year.vanilla-calendar-year_not-active{color:#64748b}[data-calendar-theme=dark] .vanilla-calendar-month.vanilla-calendar-month_disabled,[data-calendar-theme=dark] .vanilla-calendar-year.vanilla-calendar-year_disabled{color:#334155;opacity:.8}[data-calendar-theme=dark] .vanilla-calendar-months__month,[data-calendar-theme=dark] .vanilla-calendar-years__year{--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity));color:#fff}[data-calendar-theme=dark] .vanilla-calendar-months__month:hover,[data-calendar-theme=dark] .vanilla-calendar-years__year:hover{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity))}[data-calendar-theme=dark] .vanilla-calendar-months__month.vanilla-calendar-months__month_selected,[data-calendar-theme=dark] .vanilla-calendar-years__year.vanilla-calendar-years__year_selected,[data-calendar-theme=dark] .vanilla-calendar-months__month.vanilla-calendar-months__month_selected:hover,[data-calendar-theme=dark] .vanilla-calendar-years__year.vanilla-calendar-years__year_selected:hover{--tw-bg-opacity: 1;background-color:rgb(100 116 139 / var(--tw-bg-opacity));color:#fff}[data-calendar-theme=dark] .vanilla-calendar-months__month.vanilla-calendar-months__month_disabled,[data-calendar-theme=dark] .vanilla-calendar-years__year.vanilla-calendar-years__year_disabled{color:#334155;opacity:.8}[data-calendar-theme=dark] .vanilla-calendar-months__month.vanilla-calendar-months__month_disabled:hover,[data-calendar-theme=dark] .vanilla-calendar-years__year.vanilla-calendar-years__year_disabled:hover{color:#334155}[data-calendar-theme=dark] .vanilla-calendar-week-numbers__title,[data-calendar-theme=dark] .vanilla-calendar-week-number{color:#fff}[data-calendar-theme=dark] .vanilla-calendar-week-number:hover{color:#cbd5e1}[data-calendar-theme=dark] .vanilla-calendar-week__day{color:#fff}[data-calendar-theme=dark] .vanilla-calendar-week__day_weekend{color:#f43f5e}[data-calendar-theme=dark] .vanilla-calendar-day__btn{--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity));color:#94a3b8}[data-calendar-theme=dark] .vanilla-calendar-day__btn:hover{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity));color:#e2e8f0}[data-calendar-theme=dark] .vanilla-calendar-day__btn_today{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity));color:#06b6d4}[data-calendar-theme=dark] .vanilla-calendar-day__btn_today:hover{color:#06b6d4}[data-calendar-theme=dark] .vanilla-calendar-day__btn_today.vanilla-calendar-day__btn_prev,[data-calendar-theme=dark] .vanilla-calendar-day__btn_today.vanilla-calendar-day__btn_next,[data-calendar-theme=dark] .vanilla-calendar-day__btn_prev,[data-calendar-theme=dark] .vanilla-calendar-day__btn_next{color:#475569}[data-calendar-theme=dark] .vanilla-calendar-day__btn_disabled{color:#334155;opacity:.8}[data-calendar-theme=dark] .vanilla-calendar-day__btn_hover{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity))}[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday{color:#f43f5e}[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend:hover,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday:hover,[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_hover,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_hover{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity));color:#f43f5e}[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_disabled,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_disabled{color:#334155;opacity:.8}[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_today,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_today{color:#f43f5e}[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_today.vanilla-calendar-day__btn_disabled,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_today.vanilla-calendar-day__btn_disabled{color:#334155}[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_prev,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_prev,[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_next,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_next{--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity));color:#475569}[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_prev:hover,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_prev:hover,[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_next:hover,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_next:hover{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity));color:#cbd5e1}[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_hover,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_hover,[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_hover,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_hover{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity))}[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_today,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_today,[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_today,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_today{color:#94a3b8}[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_disabled,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_disabled,[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_disabled,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_disabled{color:#334155;opacity:.8}[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_selected,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_selected,[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_selected:hover,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_selected:hover{--tw-bg-opacity: 1;background-color:rgb(244 63 94 / var(--tw-bg-opacity));color:#fff}[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate,[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate:hover,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate:hover{background-color:rgb(244 63 94 / var(--tw-bg-opacity));--tw-bg-opacity: .8;color:#fff}[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_selected,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_selected,[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_selected,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_selected,[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_selected:hover,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_selected:hover,[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_selected:hover,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_selected:hover{--tw-bg-opacity: 1;background-color:rgb(51 65 85 / var(--tw-bg-opacity));color:#cbd5e1}[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate,[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate,[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate:hover,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate:hover,[data-calendar-theme=dark] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate:hover,[data-calendar-theme=dark] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate:hover{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity));color:#cbd5e1}[data-calendar-theme=dark] .vanilla-calendar-day__btn_selected,[data-calendar-theme=dark] .vanilla-calendar-day__btn_selected:hover{--tw-bg-opacity: 1;background-color:rgb(6 182 212 / var(--tw-bg-opacity));color:#fff}[data-calendar-theme=dark] .vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate,[data-calendar-theme=dark] .vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate:hover{background-color:rgb(6 182 212 / var(--tw-bg-opacity));--tw-bg-opacity: .8;color:#fff}[data-calendar-theme=dark] .vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_prev,[data-calendar-theme=dark] .vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_next,[data-calendar-theme=dark] .vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_prev:hover,[data-calendar-theme=dark] .vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_next:hover{--tw-bg-opacity: 1;background-color:rgb(51 65 85 / var(--tw-bg-opacity));color:#cbd5e1}[data-calendar-theme=dark] .vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_intermediate,[data-calendar-theme=dark] .vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_intermediate,[data-calendar-theme=dark] .vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_intermediate:hover,[data-calendar-theme=dark] .vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_intermediate:hover{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity));color:#cbd5e1}[data-calendar-theme=dark] .vanilla-calendar-day__popup{color:#fff}[data-calendar-theme=dark] .vanilla-calendar-day__popup:before{--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity));--tw-shadow: inset 0 0 0 1px rgb(255 255 255 / .1);--tw-shadow-colored: inset 0 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}[data-calendar-theme=dark] .vanilla-calendar-day__popup:after{border-bottom-color:#334155}[data-calendar-theme=dark] .vanilla-calendar-time{border-color:#1e293b}[data-calendar-theme=dark] .vanilla-calendar-time__hours:after{content:var(--tw-content);color:#fff}[data-calendar-theme=dark] .vanilla-calendar-time__hours input,[data-calendar-theme=dark] .vanilla-calendar-time__minutes input{--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity));color:#fff}[data-calendar-theme=dark] .vanilla-calendar-time__hours input:hover,[data-calendar-theme=dark] .vanilla-calendar-time__minutes input:hover{--tw-bg-opacity: 1;background-color:rgb(51 65 85 / var(--tw-bg-opacity))}[data-calendar-theme=dark] .vanilla-calendar-time__hours input:focus-visible,[data-calendar-theme=dark] .vanilla-calendar-time__minutes input:focus-visible{outline-color:#fdba74}[data-calendar-theme=dark] .vanilla-calendar-time__hours input.vanilla-calendar-is-focus,[data-calendar-theme=dark] .vanilla-calendar-time__minutes input.vanilla-calendar-is-focus{--tw-bg-opacity: 1;background-color:rgb(51 65 85 / var(--tw-bg-opacity))}[data-calendar-theme=dark] .vanilla-calendar-time__keeping{color:#64748b}[data-calendar-theme=dark] .vanilla-calendar-time__keeping:hover{--tw-bg-opacity: 1;background-color:rgb(51 65 85 / var(--tw-bg-opacity));color:#94a3b8}[data-calendar-theme=dark] .vanilla-calendar-time__keeping:focus-visible{outline-color:#fdba74}[data-calendar-theme=dark] .vanilla-calendar-time__range input{--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity))}[data-calendar-theme=dark] .vanilla-calendar-time__range:before,[data-calendar-theme=dark] .vanilla-calendar-time__range:after{--tw-bg-opacity: 1;background-color:rgb(71 85 105 / var(--tw-bg-opacity))}[data-calendar-theme=dark] .vanilla-calendar-time__range:hover input::-webkit-slider-thumb{border-color:#94a3b8}[data-calendar-theme=dark] .vanilla-calendar-time__range:hover input::-moz-range-thumb{border-color:#94a3b8}[data-calendar-theme=dark] .vanilla-calendar-time__range input:focus-visible::-webkit-slider-thumb{border-color:#fdba74}[data-calendar-theme=dark] .vanilla-calendar-time__range input:focus-visible::-moz-range-thumb{border-color:#fdba74}[data-calendar-theme=dark] .vanilla-calendar-time__range input::-webkit-slider-thumb{border-color:#475569;--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity))}[data-calendar-theme=dark] .vanilla-calendar-time__range input::-moz-range-thumb{border-color:#475569;--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity))}[data-calendar-theme=dark] .vanilla-calendar-time__range input::-webkit-slider-runnable-track{--tw-bg-opacity: 1;background-color:rgb(71 85 105 / var(--tw-bg-opacity))}[data-calendar-theme=dark] .vanilla-calendar-time__range input::-moz-range-track{--tw-bg-opacity: 1;background-color:rgb(71 85 105 / var(--tw-bg-opacity))}
Index: /mods/mod_ticket/assets/vanilla-calendar/themes/light.min.css
===================================================================
--- /mods/mod_ticket/assets/vanilla-calendar/themes/light.min.css	(revision 8427)
+++ /mods/mod_ticket/assets/vanilla-calendar/themes/light.min.css	(revision 8427)
@@ -0,0 +1,2 @@
+/*! name: @uvarov.frontend/vanilla-calendar | url: https://github.com/uvarov-frontend/vanilla-calendar */
+[data-calendar-theme=light].vanilla-calendar{ --tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}[data-calendar-theme=light].vanilla-calendar button:focus-visible{outline-color:#fdba74}[data-calendar-theme=light] .vanilla-calendar-arrow:before{--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity))}[data-calendar-theme=light] .vanilla-calendar-arrow:hover:before{--tw-bg-opacity: 1;background-color:rgb(100 116 139 / var(--tw-bg-opacity))}[data-calendar-theme=light] .vanilla-calendar-header__content,[data-calendar-theme=light] .vanilla-calendar-month,[data-calendar-theme=light] .vanilla-calendar-year{color:#0f172a}[data-calendar-theme=light] .vanilla-calendar-month:hover,[data-calendar-theme=light] .vanilla-calendar-year:hover{color:#64748b}[data-calendar-theme=light] .vanilla-calendar-month.vanilla-calendar-month_not-active,[data-calendar-theme=light] .vanilla-calendar-year.vanilla-calendar-year_not-active{color:#94a3b8}[data-calendar-theme=light] .vanilla-calendar-month.vanilla-calendar-month_disabled,[data-calendar-theme=light] .vanilla-calendar-year.vanilla-calendar-year_disabled{color:#cbd5e1}[data-calendar-theme=light] .vanilla-calendar-months__month{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity));color:#64748b}[data-calendar-theme=light] .vanilla-calendar-months__month:hover{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity))}[data-calendar-theme=light] .vanilla-calendar-months__month.vanilla-calendar-months__month_selected,[data-calendar-theme=light] .vanilla-calendar-months__month.vanilla-calendar-months__month_selected:hover{--tw-bg-opacity: 1;background-color:rgb(6 182 212 / var(--tw-bg-opacity));color:#fff}[data-calendar-theme=light] .vanilla-calendar-months__month.vanilla-calendar-months__month_disabled,[data-calendar-theme=light] .vanilla-calendar-months__month.vanilla-calendar-months__month_disabled:hover{color:#cbd5e1}[data-calendar-theme=light] .vanilla-calendar-years__year{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity));color:#64748b}[data-calendar-theme=light] .vanilla-calendar-years__year:hover{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity))}[data-calendar-theme=light] .vanilla-calendar-years__year.vanilla-calendar-years__year_selected,[data-calendar-theme=light] .vanilla-calendar-years__year.vanilla-calendar-years__year_selected:hover{--tw-bg-opacity: 1;background-color:rgb(6 182 212 / var(--tw-bg-opacity));color:#fff}[data-calendar-theme=light] .vanilla-calendar-years__year.vanilla-calendar-years__year_disabled,[data-calendar-theme=light] .vanilla-calendar-years__year.vanilla-calendar-years__year_disabled:hover{color:#cbd5e1}[data-calendar-theme=light] .vanilla-calendar-week-numbers__title,[data-calendar-theme=light] .vanilla-calendar-week-number{color:#64748b}[data-calendar-theme=light] .vanilla-calendar-week-number:hover{color:#475569}[data-calendar-theme=light] .vanilla-calendar-week__day{color:#64748b}[data-calendar-theme=light] .vanilla-calendar-week__day_weekend{color:#f43f5e}[data-calendar-theme=light] .vanilla-calendar-day__btn{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity));color:#0f172a}[data-calendar-theme=light] .vanilla-calendar-day__btn:hover{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity))}[data-calendar-theme=light] .vanilla-calendar-day__btn_today{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity));color:#06b6d4}[data-calendar-theme=light] .vanilla-calendar-day__btn_today:hover{color:#06b6d4}[data-calendar-theme=light] .vanilla-calendar-day__btn_today.vanilla-calendar-day__btn_prev,[data-calendar-theme=light] .vanilla-calendar-day__btn_today.vanilla-calendar-day__btn_next{color:#64748b}[data-calendar-theme=light] .vanilla-calendar-day__btn_prev,[data-calendar-theme=light] .vanilla-calendar-day__btn_next{color:#94a3b8}[data-calendar-theme=light] .vanilla-calendar-day__btn_disabled{color:#cbd5e1}[data-calendar-theme=light] .vanilla-calendar-day__btn_hover{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity))}[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday{color:#f43f5e}[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend:hover,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday:hover,[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_hover,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_hover{--tw-bg-opacity: 1;background-color:rgb(255 241 242 / var(--tw-bg-opacity))}[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_disabled,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_disabled{color:#cbd5e1}[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_today,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_today{color:#f43f5e}[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_today.vanilla-calendar-day__btn_disabled,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_today.vanilla-calendar-day__btn_disabled{color:#cbd5e1}[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_prev,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_prev,[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_next,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_next{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity));color:#94a3b8}[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_prev:hover,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_prev:hover,[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_next:hover,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_next:hover,[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_hover,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_hover,[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_hover,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_hover{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity))}[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_today,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_today,[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_today,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_today{color:#94a3b8}[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_disabled,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_disabled,[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_disabled,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_disabled{color:#cbd5e1}[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_selected,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_selected,[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_selected:hover,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_selected:hover{--tw-bg-opacity: 1;background-color:rgb(244 63 94 / var(--tw-bg-opacity));color:#fff}[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate,[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate:hover,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate:hover{background-color:rgb(244 63 94 / var(--tw-bg-opacity));--tw-bg-opacity: .7;color:#fff}[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_selected,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_selected,[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_selected,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_selected,[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_selected:hover,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_selected:hover,[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_selected:hover,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_selected:hover{--tw-bg-opacity: 1;background-color:rgb(203 213 225 / var(--tw-bg-opacity));color:#64748b}[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate,[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate,[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate:hover,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate:hover,[data-calendar-theme=light] .vanilla-calendar-day__btn_weekend.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate:hover,[data-calendar-theme=light] .vanilla-calendar-day__btn_holiday.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate:hover{--tw-bg-opacity: 1;background-color:rgb(226 232 240 / var(--tw-bg-opacity));color:#64748b}[data-calendar-theme=light] .vanilla-calendar-day__btn_selected,[data-calendar-theme=light] .vanilla-calendar-day__btn_selected:hover{--tw-bg-opacity: 1;background-color:rgb(6 182 212 / var(--tw-bg-opacity));color:#fff}[data-calendar-theme=light] .vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate,[data-calendar-theme=light] .vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_intermediate:hover{background-color:rgb(6 182 212 / var(--tw-bg-opacity));--tw-bg-opacity: .7;color:#fff}[data-calendar-theme=light] .vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_prev,[data-calendar-theme=light] .vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_next,[data-calendar-theme=light] .vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_prev:hover,[data-calendar-theme=light] .vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_next:hover{--tw-bg-opacity: 1;background-color:rgb(203 213 225 / var(--tw-bg-opacity));color:#64748b}[data-calendar-theme=light] .vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_intermediate,[data-calendar-theme=light] .vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_intermediate,[data-calendar-theme=light] .vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_prev.vanilla-calendar-day__btn_intermediate:hover,[data-calendar-theme=light] .vanilla-calendar-day__btn_selected.vanilla-calendar-day__btn_next.vanilla-calendar-day__btn_intermediate:hover{--tw-bg-opacity: 1;background-color:rgb(226 232 240 / var(--tw-bg-opacity));color:#64748b}[data-calendar-theme=light] .vanilla-calendar-day__popup{color:#0f172a}[data-calendar-theme=light] .vanilla-calendar-day__popup:before{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity));--tw-shadow: 0 3px 15px rgba(85, 85, 85, .2);--tw-shadow-colored: 0 3px 15px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}[data-calendar-theme=light] .vanilla-calendar-day__popup:after{border-bottom-color:#fff}[data-calendar-theme=light] .vanilla-calendar-time{border-color:#cbd5e1}[data-calendar-theme=light] .vanilla-calendar-time__hours:after{content:var(--tw-content);color:#0f172a}[data-calendar-theme=light] .vanilla-calendar-time__hours input,[data-calendar-theme=light] .vanilla-calendar-time__minutes input{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity));color:#0f172a}[data-calendar-theme=light] .vanilla-calendar-time__hours input:hover,[data-calendar-theme=light] .vanilla-calendar-time__minutes input:hover{--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity))}[data-calendar-theme=light] .vanilla-calendar-time__hours input:focus-visible,[data-calendar-theme=light] .vanilla-calendar-time__minutes input:focus-visible{outline-color:#fdba74}[data-calendar-theme=light] .vanilla-calendar-time__hours input.vanilla-calendar-is-focus,[data-calendar-theme=light] .vanilla-calendar-time__minutes input.vanilla-calendar-is-focus{--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity))}[data-calendar-theme=light] .vanilla-calendar-time__keeping{color:#64748b}[data-calendar-theme=light] .vanilla-calendar-time__keeping:hover{--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity))}[data-calendar-theme=light] .vanilla-calendar-time__keeping:focus-visible{outline-color:#fdba74}[data-calendar-theme=light] .vanilla-calendar-time__range input{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}[data-calendar-theme=light] .vanilla-calendar-time__range:before,[data-calendar-theme=light] .vanilla-calendar-time__range:after{--tw-bg-opacity: 1;background-color:rgb(203 213 225 / var(--tw-bg-opacity))}[data-calendar-theme=light] .vanilla-calendar-time__range:hover input::-webkit-slider-thumb{border-color:#94a3b8}[data-calendar-theme=light] .vanilla-calendar-time__range:hover input::-moz-range-thumb{border-color:#94a3b8}[data-calendar-theme=light] .vanilla-calendar-time__range input:focus-visible::-webkit-slider-thumb{border-color:#fdba74}[data-calendar-theme=light] .vanilla-calendar-time__range input:focus-visible::-moz-range-thumb{border-color:#fdba74}[data-calendar-theme=light] .vanilla-calendar-time__range input::-webkit-slider-thumb{border-color:#cbd5e1;--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}[data-calendar-theme=light] .vanilla-calendar-time__range input::-moz-range-thumb{border-color:#cbd5e1;--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}[data-calendar-theme=light] .vanilla-calendar-time__range input::-webkit-slider-runnable-track{--tw-bg-opacity: 1;background-color:rgb(203 213 225 / var(--tw-bg-opacity))}[data-calendar-theme=light] .vanilla-calendar-time__range input::-moz-range-track{--tw-bg-opacity: 1;background-color:rgb(203 213 225 / var(--tw-bg-opacity))}
Index: /mods/mod_ticket/assets/vanilla-calendar/vanilla-calendar.min.css
===================================================================
--- /mods/mod_ticket/assets/vanilla-calendar/vanilla-calendar.min.css	(revision 8427)
+++ /mods/mod_ticket/assets/vanilla-calendar/vanilla-calendar.min.css	(revision 8427)
@@ -0,0 +1,4 @@
+/*! name: @uvarov.frontend/vanilla-calendar | url: https://github.com/uvarov-frontend/vanilla-calendar */
+.vanilla-calendar{ all:initial;  }
+.vanilla-calendar * { all:initial;  }
+.vanilla-calendar{position:relative;display:flex;height:-webkit-max-content;height:max-content;min-width:275px;max-width:100%;flex-direction:column;border-radius:.75rem;padding:1rem;opacity:1;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.vanilla-calendar button:focus-visible{border-radius:.5rem;outline-style:solid;outline-width:1px}.vanilla-calendar.vanilla-calendar_multiple .vanilla-calendar-days{flex-grow:0}.vanilla-calendar_hidden{pointer-events:none;opacity:0}.vanilla-calendar_to-input{position:absolute;left:0;bottom:0;margin-top:.25rem}.vanilla-calendar-controls{pointer-events:none;position:absolute;left:0;right:0;top:0;z-index:20;box-sizing:content-box;display:flex;align-items:center;justify-content:space-between;padding-left:1rem;padding-right:1rem;padding-top:1.25rem}.vanilla-calendar-arrow{pointer-events:auto;position:relative;display:block;height:1.5rem;width:1.5rem;cursor:pointer;border-width:0px;background-color:transparent}.vanilla-calendar-arrow:before{position:absolute;inset:0;content:var(--tw-content);content:"";-webkit-mask-image:url('data:image/svg+xml, %3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"%3E%3Cpath d="M12 16c-.3 0-.5-.1-.7-.3l-6-6c-.4-.4-.4-1 0-1.4s1-.4 1.4 0l5.3 5.3 5.3-5.3c.4-.4 1-.4 1.4 0s.4 1 0 1.4l-6 6c-.2.2-.4.3-.7.3z"/%3E%3C/svg%3E');mask-image:url('data:image/svg+xml, %3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"%3E%3Cpath d="M12 16c-.3 0-.5-.1-.7-.3l-6-6c-.4-.4-.4-1 0-1.4s1-.4 1.4 0l5.3 5.3 5.3-5.3c.4-.4 1-.4 1.4 0s.4 1 0 1.4l-6 6c-.2.2-.4.3-.7.3z"/%3E%3C/svg%3E');-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:50% 50%;mask-position:50% 50%}.vanilla-calendar-arrow.vanilla-calendar-arrow_prev:before{-webkit-transform:rotateZ(90deg);transform:rotate(90deg)}.vanilla-calendar-arrow.vanilla-calendar-arrow_next:before{-webkit-transform:rotateZ(-90deg);transform:rotate(-90deg)}.vanilla-calendar-grid{display:grid;flex-grow:1;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:1.75rem}.vanilla-calendar-grid.vanilla-calendar-grid_disabled .vanilla-calendar-column{pointer-events:none;opacity:.3}.vanilla-calendar-grid.vanilla-calendar-grid_disabled .vanilla-calendar-column.vanilla-calendar-column_month,.vanilla-calendar-grid.vanilla-calendar-grid_disabled .vanilla-calendar-column.vanilla-calendar-column_year{pointer-events:auto;opacity:1}.vanilla-calendar-column{display:flex;min-width:-webkit-min-content;min-width:min-content;flex-direction:column}.vanilla-calendar-header{position:relative;margin-bottom:.75rem;display:flex;align-items:center;padding-left:.25rem;padding-right:.25rem}.vanilla-calendar-header__content{display:grid;flex-grow:1;grid-auto-columns:-webkit-max-content;grid-auto-columns:max-content;grid-auto-flow:column;align-items:center;justify-content:center;white-space:pre-wrap;padding-left:1rem;padding-right:1rem}.vanilla-calendar-month,.vanilla-calendar-year{cursor:pointer;border-radius:.25rem;border-width:0px;background-color:transparent;padding:.25rem;font-size:1rem;line-height:1.5rem;font-weight:700}.vanilla-calendar-month.vanilla-calendar-month_disabled,.vanilla-calendar-year.vanilla-calendar-year_disabled{pointer-events:none}.vanilla-calendar-months{display:grid;flex-grow:1;grid-template-columns:repeat(4,minmax(0,1fr));align-items:center;row-gap:1rem;-webkit-column-gap:.5rem;column-gap:.5rem}.vanilla-calendar-years{display:grid;flex-grow:1;grid-template-columns:repeat(5,minmax(0,1fr));align-items:center;row-gap:1rem;-webkit-column-gap:.5rem;column-gap:.5rem}.vanilla-calendar-months_selecting .vanilla-calendar-months__month,.vanilla-calendar-years_selecting .vanilla-calendar-years__year{cursor:pointer}.vanilla-calendar-months_selecting .vanilla-calendar-months__month .vanilla-calendar-months__month_disabled,.vanilla-calendar-years_selecting .vanilla-calendar-years__year .vanilla-calendar-years__year_disabled{cursor:default}.vanilla-calendar-months__month,.vanilla-calendar-years__year{display:flex;height:2.5rem;align-items:center;justify-content:center;word-break:break-all;border-radius:.5rem;border-width:0px;padding:.25rem;text-align:center;font-size:.75rem;line-height:1rem;font-weight:600}.vanilla-calendar-months__month.vanilla-calendar-months__month_disabled,.vanilla-calendar-years__year.vanilla-calendar-years__year_disabled{pointer-events:none}.vanilla-calendar-week-numbers{display:flex;flex-grow:1;flex-direction:column}.vanilla-calendar-week-numbers__title{margin-bottom:.5rem;display:flex;align-items:center;justify-content:center;font-size:.75rem;line-height:1rem;font-weight:700}.vanilla-calendar-week-numbers__content{display:grid;grid-auto-flow:row;align-items:center;justify-items:center;row-gap:.25rem}.vanilla-calendar-week-number{display:flex;height:100%;min-height:1.875rem;width:100%;min-width:1.875rem;cursor:pointer;align-items:center;justify-content:center;font-size:.75rem;line-height:1rem;font-weight:600}.vanilla-calendar-wrapper{display:flex;flex-grow:1}.vanilla-calendar-content{display:flex;flex-grow:1;flex-direction:column}.vanilla-calendar-week{margin-bottom:.5rem;display:grid;grid-template-columns:repeat(7,1fr);justify-items:center}.vanilla-calendar-week__day{display:flex;height:100%;width:100%;min-width:1.875rem;align-items:center;justify-content:center;font-size:.75rem;line-height:1rem;font-weight:700}.vanilla-calendar-days{display:grid;flex-grow:1;grid-template-columns:repeat(7,1fr);align-items:center;justify-items:center;row-gap:.25rem}.vanilla-calendar-days_selecting .vanilla-calendar-day__btn{cursor:pointer}.vanilla-calendar-days_selecting .vanilla-calendar-day__btn_disabled{cursor:default}.vanilla-calendar-day{position:relative;display:flex;height:100%;width:100%;align-items:center;justify-content:center}.vanilla-calendar-day:focus-visible .vanilla-calendar-day__popup,.vanilla-calendar-day:hover .vanilla-calendar-day__popup{pointer-events:auto;opacity:1}.vanilla-calendar-day_selected-first .vanilla-calendar-day__btn_selected{border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.vanilla-calendar-day_selected-last .vanilla-calendar-day__btn_selected{border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.vanilla-calendar-day_selected-intermediate .vanilla-calendar-day__btn_intermediate{border-radius:0}.vanilla-calendar-day__btn{display:flex;height:100%;min-height:1.875rem;width:100%;min-width:1.875rem;cursor:default;align-items:center;justify-content:center;border-radius:.5rem;border-width:0px;font-size:.75rem;line-height:1rem;font-weight:400}.vanilla-calendar-day__btn_today{font-weight:700}.vanilla-calendar-day__btn_disabled{pointer-events:none}.vanilla-calendar-day__popup{-webkit-transform:translateX(-50%);transform:translate(-50%);pointer-events:none;position:absolute;left:50%;top:100%;z-index:20;width:8rem;padding:1rem .75rem .5rem;font-size:.75rem;line-height:1rem;font-weight:400;opacity:0}.vanilla-calendar-day__popup:before{content:var(--tw-content);position:absolute}.vanilla-calendar-day__popup:after{content:var(--tw-content);position:absolute}.vanilla-calendar-day__popup:hover{pointer-events:auto;opacity:1}.vanilla-calendar-day__popup:before{content:"";left:0;bottom:0;z-index:-10;display:block;height:calc(100% - 8px);width:100%;border-radius:.5rem}.vanilla-calendar-day__popup:after{content:"";-webkit-transform:translateX(-50%);transform:translate(-50%);left:50%;top:1px;z-index:-10;display:block;height:0px;width:0px;border-left-width:8px;border-right-width:8px;border-top-width:0px;border-bottom-width:8px;border-style:solid;border-left-color:transparent;border-right-color:transparent;border-top-color:transparent}.vanilla-calendar-time{margin-top:.75rem;display:grid;grid-template-columns:auto 1fr;gap:.75rem;border-top-width:1px;border-bottom-width:0px;border-left-width:0px;border-right-width:0px;border-style:solid;padding-top:.75rem}.vanilla-calendar-time__content{display:grid;grid-auto-flow:column;align-items:center}.vanilla-calendar-time__hours{position:relative;margin-right:.35rem;width:1.75rem}.vanilla-calendar-time__hours:after{position:absolute;right:-5px;top:50%;margin-top:calc(-50% + 1px);display:block;--tw-content: ":";content:var(--tw-content)}.vanilla-calendar-time__minutes{width:1.75rem}.vanilla-calendar-time__hours input,.vanilla-calendar-time__minutes input{position:relative;margin:0;box-sizing:border-box;display:block;width:100%;border-radius:.25rem;border-width:0px;padding:.125rem;text-align:center;font-size:1.125rem;font-weight:600;line-height:1.125rem}.vanilla-calendar-time__hours input:focus-visible,.vanilla-calendar-time__minutes input:focus-visible{outline-style:solid;outline-width:1px}.vanilla-calendar-time__hours input:disabled,.vanilla-calendar-time__minutes input:disabled{cursor:default}.vanilla-calendar-time__hours input:hover:disabled,.vanilla-calendar-time__minutes input:hover:disabled{background-color:transparent}.vanilla-calendar-time__keeping{margin-left:1px;margin-top:.25rem;width:22px;cursor:pointer;border-radius:.25rem;border-width:0px;background-color:transparent;padding:0;font-size:11px}.vanilla-calendar-time__keeping:focus-visible{outline-style:solid;outline-width:1px}.vanilla-calendar-time__keeping:disabled{cursor:default}.vanilla-calendar-time__keeping:hover:disabled{background-color:transparent}.vanilla-calendar-time__ranges{display:grid;grid-auto-flow:row}.vanilla-calendar-time__range{position:relative;z-index:10;font-size:0}.vanilla-calendar-time__range:before{content:var(--tw-content);left:0}.vanilla-calendar-time__range:after{content:var(--tw-content);right:0}.vanilla-calendar-time__range:before,.vanilla-calendar-time__range:after{content:"";-webkit-transform:translateY(-50%);transform:translateY(-50%);pointer-events:none;position:absolute;top:50%;z-index:10;height:.5rem;width:1px}.vanilla-calendar-time__range input{position:relative;margin:0;height:1.25rem;width:100%;cursor:pointer;-webkit-appearance:none;appearance:none;outline-width:0px}.vanilla-calendar-time__range input::-webkit-slider-thumb{position:relative;z-index:20;margin-top:-.5rem;box-sizing:border-box;height:1rem;width:.75rem;cursor:pointer;-webkit-appearance:none;appearance:none;border-radius:.25rem;border-width:1px;border-style:solid;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.vanilla-calendar-time__range input::-moz-range-thumb{position:relative;z-index:20;box-sizing:border-box;height:1rem;width:.75rem;cursor:pointer;border-radius:.25rem;border-width:1px;border-style:solid;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.vanilla-calendar-time__range input::-webkit-slider-runnable-track{margin-top:1px;box-sizing:border-box;height:1px;width:100%;cursor:pointer;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.vanilla-calendar-time__range input::-moz-range-track{margin-top:1px;box-sizing:border-box;height:1px;width:100%;cursor:pointer;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}
Index: /mods/mod_ticket/assets/vanilla-calendar/vanilla-calendar.min.js
===================================================================
--- /mods/mod_ticket/assets/vanilla-calendar/vanilla-calendar.min.js	(revision 8427)
+++ /mods/mod_ticket/assets/vanilla-calendar/vanilla-calendar.min.js	(revision 8427)
@@ -0,0 +1,2 @@
+/*! name: @uvarov.frontend/vanilla-calendar | url: https://github.com/uvarov-frontend/vanilla-calendar */
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).VanillaCalendar=t()}(this,(function(){"use strict";var e=Object.defineProperty,t=Object.getOwnPropertySymbols,s=Object.prototype.hasOwnProperty,l=Object.prototype.propertyIsEnumerable,a=(t,s,l)=>s in t?e(t,s,{enumerable:!0,configurable:!0,writable:!0,value:l}):t[s]=l,n=(e,t,s)=>(a(e,"symbol"!=typeof t?t+"":t,s),s);const i=e=>{const t=e.getFullYear();let s=e.getMonth()+1,l=e.getDate();return s=s<10?`0${s}`:s,l=l<10?`0${l}`:l,`${t}-${s}-${l}`},d=e=>{const t=[];return e.forEach((e=>{e.match(/^(\d{4}-\d{2}-\d{2})$/g)?t.push(e):e.replace(/(\d{4}-\d{2}-\d{2}).*?(\d{4}-\d{2}-\d{2})/g,((e,s,l)=>{const a=new Date(`${s}T00:00:00`),n=new Date(`${l}T00:00:00`),d=new Date(a.getTime());for(;d<=n;d.setDate(d.getDate()+1))t.push(i(d));return e}))})),t},r=e=>{const t=Number(e);let s=String(t);return 0===t?s="12":13===t?s="01":14===t?s="02":15===t?s="03":16===t?s="04":17===t?s="05":18===t?s="06":19===t?s="07":20===t?s="08":21===t?s="09":22===t?s="10":23===t&&(s="11"),s},c=e=>{var t,s;e.rangeMin=e.settings.range.min,e.rangeMax=e.settings.range.max,e.rangeDisabled=e.settings.range.disabled?d([...e.settings.range.disabled]):[],e.rangeEnabled=e.settings.range.enabled?d([...e.settings.range.enabled]):[],e.selectedDates=e.settings.selected.dates?d([...e.settings.selected.dates]):[],e.selectedHolidays=e.settings.selected.holidays?d([...e.settings.selected.holidays]):[],e.settings.range.disablePast&&!e.settings.range.disableAllDays&&new Date(`${e.settings.range.min}T00:00:00`)<e.date.today&&(e.rangeMin=i(e.date.today)),e.settings.range.disableAllDays&&(e.rangeMin=i(e.date.today),e.rangeMax=i(e.date.today),null==(t=e.rangeDisabled)||t.push(i(e.date.today))),e.rangeEnabled&&e.rangeEnabled.sort(((e,t)=>+new Date(e)-+new Date(t))),(null==(s=e.rangeEnabled)?void 0:s[0])&&e.settings.range.disableAllDays&&(e.rangeMin=e.rangeEnabled[0],e.rangeMax=e.rangeEnabled[e.rangeEnabled.length-1]);const l=new Date(`${e.rangeMin}T00:00:00`),a=new Date(`${e.rangeMax}T00:00:00`);l.setDate(l.getDate()-1),a.setDate(a.getDate()+1),e.rangeDisabled.push(i(l)),e.rangeDisabled.push(i(a)),null!==e.settings.selected.month&&e.settings.selected.month>=0&&e.settings.selected.month<12?e.selectedMonth=e.settings.selected.month:e.selectedMonth=e.date.today.getMonth(),null!==e.settings.selected.year&&e.settings.selected.year>=0&&e.settings.selected.year<=9999?e.selectedYear=e.settings.selected.year:e.selectedYear=e.date.today.getFullYear(),e.viewYear=e.selectedYear,e.dateMin=e.settings.visibility.disabled?new Date(`${e.date.min}T00:00:00`):new Date(`${e.rangeMin}T00:00:00`),e.dateMax=e.settings.visibility.disabled?new Date(`${e.date.max}T00:00:00`):new Date(`${e.rangeMax}T00:00:00`);const n=!0===e.settings.selection.time||12===e.settings.selection.time;if(n||24===e.settings.selection.time){if(e.userTime=!1,"string"==typeof e.settings.selected.time){const t=n?/^([0-9]|0[1-9]|1[0-2]):([0-5][0-9])|(AM|PM)/g:/^([0-1]?[0-9]|2[0-3]):([0-5][0-9])/g;e.settings.selected.time.replace(t,((t,s,l,a)=>(s&&l&&(e.userTime=!0,e.selectedHours=s,e.selectedMinutes=l),a&&n?e.selectedKeeping=a:n&&(e.selectedKeeping="AM"),"")))}!e.userTime&&n?(e.selectedHours=r(String(e.date.today.getHours())),e.selectedMinutes=String(e.date.today.getMinutes()),e.selectedKeeping=Number(e.date.today.getHours())>=12?"PM":"AM"):e.userTime||(e.selectedHours=String(e.date.today.getHours()),e.selectedMinutes=String(e.date.today.getMinutes())),e.selectedHours=Number(e.selectedHours)<10?`0${Number(e.selectedHours)}`:`${e.selectedHours}`,e.selectedMinutes=Number(e.selectedMinutes)<10?`0${Number(e.selectedMinutes)}`:`${e.selectedMinutes}`,e.selectedTime=`${e.selectedHours}:${e.selectedMinutes}${e.selectedKeeping?` ${e.selectedKeeping}`:""}`}else e.settings.selection.time&&(e.settings.selection.time=!1,console.error("The value of the time property can be: false, true, 12 or 24."));"multiple"===e.type&&(1===e.months?(console.warn("The value of the Â«monthsÂ» parameter cannot be less than Â«2Â», the minimum available value will be initialized."),e.correctMonths=2):e.months>12?(console.warn("The value of the Â«monthsÂ» parameter cannot be greater than Â«12Â», the maximum available value will be initialized."),e.correctMonths=12):e.correctMonths=e.months)},o=e=>{if(!["default","multiple","year"].includes(e.currentType))return;const t=e.HTMLElement.querySelector(`.${e.CSSClasses.arrowPrev}`),s=e.HTMLElement.querySelector(`.${e.CSSClasses.arrowNext}`);if(!t||!s)return;"default"!==e.currentType&&"multiple"!==e.currentType||(()=>{if(!e.dateMin||!e.dateMax)return;const l=new Date(`${i(new Date(e.selectedYear,e.selectedMonth,1))}T00:00:00`),a=new Date(l.getTime());l.setMonth(l.getMonth()-e.jumpMonths),a.setMonth(a.getMonth()+e.jumpMonths),!e.settings.selection.month||l.getFullYear()<e.dateMin.getFullYear()||l.getFullYear()===e.dateMin.getFullYear()&&l.getMonth()<e.dateMin.getMonth()?t.style.visibility="hidden":t.style.visibility="",!e.settings.selection.month||a.getFullYear()>e.dateMax.getFullYear()||a.getFullYear()===e.dateMax.getFullYear()&&a.getMonth()>e.dateMax.getMonth()?s.style.visibility="hidden":s.style.visibility=""})(),"year"===e.currentType&&e.dateMin&&e.dateMax&&void 0!==e.viewYear&&(e.dateMin.getFullYear()&&e.viewYear-7<=e.dateMin.getFullYear()?t.style.visibility="hidden":t.style.visibility="",e.dateMax.getFullYear()&&e.viewYear+7>=e.dateMax.getFullYear()?s.style.visibility="hidden":s.style.visibility="")},u=(e,t)=>{if(!e)return null;const s=new Date(`${e}T00:00:00`).getDate(),l=new Date(`${e}T00:00:00`).getMonth(),a=new Date(`${e}T00:00:00`).getFullYear(),n=new Date(a,l,s),i=t?n.getDay()||7:n.getDay();n.setDate(n.getDate()+4-i);const d=new Date(n.getFullYear(),0,1);return{year:a,week:Math.ceil(((+n-+d)/864e5+1)/7)}},m=e=>{var t,s;const l=e.HTMLElement.querySelectorAll(`.${e.CSSClasses.days}`),a=e.HTMLElement.querySelectorAll(`.${e.CSSClasses.weekNumbers}`),n=new Date(e.selectedYear,e.selectedMonth,1),d=document.createElement("div"),r=document.createElement("button");d.className=e.CSSClasses.day,r.className=e.CSSClasses.dayBtn,r.type="button",null==(t=e.selectedDates)||t.sort(((e,t)=>+new Date(e)-+new Date(t))),l.forEach(((t,s)=>{const c=new Date(n.setMonth(e.selectedMonth+s)).getMonth(),o=new Date(n.setFullYear(e.selectedYear,e.selectedMonth+s)).getFullYear(),m=new Date(o,c,1),g=new Date(o,c+1,0).getDate();let v=Number(m.getDay());e.settings.iso8601&&(v=Number((0!==m.getDay()?m.getDay():7)-1)),e.settings.selection.day&&["single","multiple","multiple-ranged"].includes(e.settings.selection.day)&&l[s].classList.add(e.CSSClasses.daysSelecting),l[s].innerHTML="";const y=(t,a,n,i,c)=>{var m,g,v,y,h,S,M,p,C;const b=d.cloneNode(!0),D=r.cloneNode(!0);if(c&&D.classList.add(c),D.innerText=t,D.dataset.calendarDay=n,e.settings.visibility.weekNumbers){const t=u(n,e.settings.iso8601);if(!t)return;D.dataset.calendarWeekNumber=`${t.week}`}(null==(m=e.rangeEnabled)?void 0:m[0])&&e.settings.range.disableAllDays&&!(null==(g=e.rangeDisabled)?void 0:g.includes(n))&&(null==(v=e.rangeDisabled)||v.push(n)),(null==(y=e.rangeEnabled)?void 0:y[0])&&(null==(h=e.rangeDisabled)?void 0:h.includes(n))&&(e.rangeDisabled=null==(S=e.rangeDisabled)?void 0:S.filter((t=>{var s;return!(null==(s=e.rangeEnabled)?void 0:s.includes(t))}))),(null==(M=e.settings.range.disableWeekday)?void 0:M.includes(a))&&!(null==(p=e.rangeDisabled)?void 0:p.includes(n))&&(null==(C=e.rangeDisabled)||C.push(n)),((t,s,l,a,n)=>{(e.rangeMin>a||e.rangeMax<a)&&(s.classList.add(e.CSSClasses.dayBtnDisabled),s.tabIndex=-1),!e.settings.visibility.weekend||0!==l&&6!==l||s.classList.add(e.CSSClasses.dayBtnWeekend),Array.isArray(e.selectedHolidays)&&e.selectedHolidays.forEach((t=>{t===a&&s.classList.add(e.CSSClasses.dayBtnHoliday)}));let i=e.date.today.getDate(),d=e.date.today.getMonth()+1;i=i<10?`0${i}`:i,d=d<10?`0${d}`:d;const r=`${e.date.today.getFullYear()}-${d}-${i}`;e.settings.visibility.today&&s.dataset.calendarDay===r&&s.classList.add(e.CSSClasses.dayBtnToday),e.selectedDates&&0===e.selectedDates.indexOf(a)?("multiple-ranged"===e.settings.selection.day&&e.selectedDates.length>1?t.classList.add(e.CSSClasses.daySelectedFirst):t.classList.add(e.CSSClasses.daySelected),s.classList.add(e.CSSClasses.dayBtnSelected)):e.selectedDates&&e.selectedDates[0]&&e.selectedDates.indexOf(a)===e.selectedDates.length-1?(t.classList.add(e.CSSClasses.daySelected),"multiple-ranged"===e.settings.selection.day?t.classList.add(e.CSSClasses.daySelectedLast):t.classList.add(e.CSSClasses.daySelected),s.classList.add(e.CSSClasses.dayBtnSelected)):e.selectedDates&&e.selectedDates.indexOf(a)>0&&"multiple-ranged"===e.settings.selection.day?(t.classList.add(e.CSSClasses.daySelectedIntermediate),s.classList.add(e.CSSClasses.dayBtnSelected),s.classList.add(e.CSSClasses.dayBtnIntermediate)):e.selectedDates&&e.selectedDates.indexOf(a)>0&&(t.classList.add(e.CSSClasses.daySelected),s.classList.add(e.CSSClasses.dayBtnSelected)),Array.isArray(e.rangeDisabled)&&e.rangeDisabled[0]&&e.rangeDisabled.forEach((t=>{t===a&&(s.classList.add(e.CSSClasses.dayBtnDisabled),s.tabIndex=-1)})),!e.settings.selection.month&&n&&(s.classList.add(e.CSSClasses.dayBtnDisabled),s.tabIndex=-1),e.settings.selection.year||new Date(`${a}T00:00:00`).getFullYear()===o||(s.classList.add(e.CSSClasses.dayBtnDisabled),s.tabIndex=-1)})(b,D,a,n,i),i?e.settings.visibility.daysOutside&&b.append(D):b.append(D),l[s].append(b),e.actions.getDays&&e.actions.getDays(Number(t),n,b,D)};(()=>{let t=new Date(o,c,0).getDate()-v,s=o,l=c;0===c?(l=e.locale.months.length,s=o-1):c<10&&(l=`0${c}`);for(let a=0;a<v;a++){t+=1;const a=`${s}-${l}-${t}`,n=new Date(o,c,t-1).getMonth()-1,i=new Date(o,n,t).getDay();y(String(t),i,a,!0,e.CSSClasses.dayBtnPrev)}})(),(()=>{for(let e=1;e<=g;e++){const t=new Date(o,c,e),s=i(t),l=t.getDay();y(String(e),l,s,!1,null)}})(),(()=>{const t=v+g,s=Math.ceil(t/e.locale.weekday.length),l=e.locale.weekday.length*s-t;let a=o,n=String(c+2);c+1===e.locale.months.length?(n="01",a=o+1):c+2<10&&(n=`0${c+2}`);for(let i=1;i<=l;i++){const t=`${a}-${n}-${i<10?`0${i}`:String(i)}`,s=new Date(o,c,i).getMonth()+1,l=new Date(o,s,i).getDay();y(String(i),l,t,!0,e.CSSClasses.dayBtnNext)}})(),((e,t)=>{e.popups&&Object.keys(e.popups).forEach((s=>{var l;const a=t.querySelector(`[data-calendar-day="${s}"]`);if(a){const t=null==(l=e.popups)?void 0:l[s];(null==t?void 0:t.modifier)&&t.modifier.trim().split(" ").forEach((e=>{a.classList.add(e)})),(null==t?void 0:t.html)&&(a.parentNode.innerHTML+=`<div class="${e.CSSClasses.dayPopup}">${t.html}</div>`)}}))})(e,l[s]),((e,t,s,l,a)=>{if(!e.settings.visibility.weekNumbers)return;const n=a.querySelectorAll(`.${e.CSSClasses.day}`);l.innerHTML="";const i=Math.ceil((t+s)/7),d=document.createElement("b");d.className=e.CSSClasses.weekNumbersTitle,d.innerText="#",l.append(d);const r=document.createElement("div");r.className=e.CSSClasses.weekNumbersContent,l.append(r);const c=document.createElement("span");c.className=e.CSSClasses.weekNumber;for(let o=0;o<i;o++){let t=null;t=0===o?n[6].querySelector(`.${e.CSSClasses.dayBtn}`):n[7*o].querySelector(`.${e.CSSClasses.dayBtn}`);const s=u(t.dataset.calendarDay,e.settings.iso8601);if(!s)return;const l=c.cloneNode(!0);l.innerText=`${s.week}`,l.dataset.calendarYearWeek=`${s.year}`,r.append(l)}})(e,v,g,a[s],l[s])})),null==(s=e.rangeDisabled)||s.sort(((e,t)=>+new Date(e)-+new Date(t)))},g=e=>`\n\t<button type="button"\n\t\tclass="${e.CSSClasses.arrow} ${e.CSSClasses.arrowPrev}"\n\t\tdata-calendar-arrow="prev"\n\t\ttitle="Prev">\n\t</button>\n`,v=e=>`\n\t<button type="button"\n\tclass="${e.CSSClasses.arrow} ${e.CSSClasses.arrowNext}"\n\tdata-calendar-arrow="next"\n\ttitle="Next">\n\t</button>\n`,y=e=>`\n\t<button type="button"\n\t\tclass="${e.CSSClasses.month}"\n\t\tdata-calendar-selected-month>\n\t</button>\n`,h=e=>`\n\t<button type="button"\n\t\tclass="${e.CSSClasses.year}"\n\t\tdata-calendar-selected-year>\n\t</button>\n`,S=e=>`\n\t<div class="${e.CSSClasses.week}"></div>\n`,M=e=>`\n\t<div class="${e.CSSClasses.days}"></div>\n`,p=e=>`\n\t<div class="${e.CSSClasses.months}"></div>\n`,C=e=>`\n\t<div class="${e.CSSClasses.years}"></div>\n`,b=e=>e.settings.visibility.weekNumbers?`\n\t<div class="${e.CSSClasses.weekNumbers}"></div>\n`:"",D=e=>e.settings.selection.time?`\n\t<div class="${e.CSSClasses.time}"></div>\n`:"",T=(e,t)=>t.replace(/<#(.*?)\/>/g,((t,s)=>{const l=(e=>{let t=null;switch(e){case"ArrowPrev":t=g;break;case"ArrowNext":t=v;break;case"Month":t=y;break;case"Year":t=h;break;case"Week":t=S;break;case"Days":t=M;break;case"Months":t=p;break;case"Years":t=C;break;case"WeekNumbers":t=b;break;case"ControlTime":t=D}return t})(s.replace(/[\s\n\t]/g,""));return l?l(e):""})).replace(/[\n\t]/g,""),w=(e,t)=>{const s=e.HTMLElement;s.classList.add(e.CSSClasses.calendar);const l=(s,l)=>{if(!t)return;const a=e.HTMLElement.querySelector(`.${e.CSSClasses.controls}`);a&&e.HTMLElement.removeChild(a);e.HTMLElement.querySelector(`.${e.CSSClasses.grid}`).classList.add(e.CSSClasses.gridDisabled);const n=t.closest(`.${e.CSSClasses.column}`);n.classList.add(s),n.innerHTML=T(e,l)};switch(e.currentType){case"default":s.classList.add(e.CSSClasses.calendarDefault),s.classList.remove(e.CSSClasses.calendarMonth),s.classList.remove(e.CSSClasses.calendarYear),s.innerHTML=T(e,e.DOMTemplates.default);break;case"multiple":if(!e.correctMonths)break;s.classList.add(e.CSSClasses.calendarMultiple),s.classList.remove(e.CSSClasses.calendarMonth),s.classList.remove(e.CSSClasses.calendarYear),s.innerHTML=((e,t)=>t.replace(/<#Multiple>(.*?)<#\/Multiple>/g,((t,s)=>{let l="";for(let a=0;a<e.correctMonths;a++)l+=s;return l})).replace(/[\n\t]/g,""))(e,T(e,e.DOMTemplates.multiple));break;case"month":if("multiple"===e.type){l(e.CSSClasses.columnMonth,e.DOMTemplates.month);break}s.classList.remove(e.CSSClasses.calendarDefault),s.classList.add(e.CSSClasses.calendarMonth),s.classList.remove(e.CSSClasses.calendarYear),s.innerHTML=T(e,e.DOMTemplates.month);break;case"year":if("multiple"===e.type){l(e.CSSClasses.columnYear,e.DOMTemplates.year);break}s.classList.remove(e.CSSClasses.calendarDefault),s.classList.remove(e.CSSClasses.calendarMonth),s.classList.add(e.CSSClasses.calendarYear),s.innerHTML=T(e,e.DOMTemplates.year)}},$=e=>{const t=e.HTMLElement.querySelectorAll("[data-calendar-selected-month]");if(!t[0]||void 0===e.selectedMonth)return;const s=new Date(e.selectedYear,e.selectedMonth,1);t.forEach(((l,a)=>{const n=new Date(s.setMonth(e.selectedMonth+a)).getMonth();t[a].dataset.calendarSelectedMonth=String(n),t[a].innerText=e.locale.months[n],!1===e.settings.selection.month||"only-arrows"===e.settings.selection.month?(t[a].tabIndex=-1,t[a].classList.add(e.CSSClasses.monthDisabled)):(t[a].tabIndex=0,t[a].classList.remove(e.CSSClasses.monthDisabled))}))},f=e=>{const t=e.HTMLElement.querySelectorAll("[data-calendar-selected-year]");if(!t||void 0===e.selectedMonth)return;const s=new Date(e.selectedYear,e.selectedMonth,1);t.forEach(((l,a)=>{const n=new Date(s.setFullYear(e.selectedYear,e.selectedMonth+a)).getFullYear();t[a].dataset.calendarSelectedYear=String(n),t[a].innerText=String(n),!1===e.settings.selection.year||"only-arrows"===e.settings.selection.year?(t[a].tabIndex=-1,t[a].classList.add(e.CSSClasses.yearDisabled)):(t[a].tabIndex=0,t[a].classList.remove(e.CSSClasses.yearDisabled))}))},L=(e,t)=>{var s;const l=(null==t?void 0:t.dataset.calendarSelectedMonth)?Number(t.dataset.calendarSelectedMonth):e.selectedMonth,a=null==(s=null==t?void 0:t.closest(`.${e.CSSClasses.column}`))?void 0:s.querySelector(`.${e.CSSClasses.year}`),n=a?Number(a.dataset.calendarSelectedYear):e.selectedYear;e.currentType="month",w(e,t),$(e),f(e);const i=e.HTMLElement.querySelector(`.${e.CSSClasses.months}`);if(!e.dateMin||!e.dateMax||!i)return;e.settings.selection.month&&i.classList.add(e.CSSClasses.monthsSelecting);const d=e.jumpMonths>1?e.locale.months.map(((t,s)=>l-e.jumpMonths*s)).concat(e.locale.months.map(((t,s)=>l+e.jumpMonths*s))).filter((e=>e>=0&&e<=12)):Array.from(Array(12).keys()),r=document.createElement("button");r.type="button",r.className=e.CSSClasses.monthsMonth;const c=()=>{if("multiple"!==e.type)return 0;const t=[...e.HTMLElement.querySelectorAll(`.${e.CSSClasses.column}`)].findIndex((t=>t.classList.contains(`${e.CSSClasses.columnMonth}`)));return t>0?t:0};for(let o=0;o<e.locale.months.length;o++){const t=e.locale.months[o],s=r.cloneNode(!0);o===l&&s.classList.add(e.CSSClasses.monthsMonthSelected),(o<e.dateMin.getMonth()+c()&&n<=e.dateMin.getFullYear()||o>e.dateMax.getMonth()+c()&&n>=e.dateMax.getFullYear()||o!==l&&!d.includes(o))&&(s.classList.add(e.CSSClasses.monthsMonthDisabled),s.tabIndex=-1),s.dataset.calendarMonth=String(o),s.title=`${t}`,s.innerText=`${e.settings.visibility.monthShort?t.substring(0,3):t}`,i.append(s)}},k=e=>({hide(){e.HTMLElement.classList.add(e.CSSClasses.calendarHidden)},show(){e.HTMLElement.classList.remove(e.CSSClasses.calendarHidden)},HTMLInputElement:e.HTMLInputElement,HTMLElement:e.HTMLElement}),H=(e,t)=>{const s=Number(e);let l=String(s);return"AM"===t?12===s&&(l="00"):"PM"===t&&(1===s?l="13":2===s?l="14":3===s?l="15":4===s?l="16":5===s?l="17":6===s?l="18":7===s?l="19":8===s?l="20":9===s?l="21":10===s?l="22":11===s&&(l="23")),l},Y=e=>{const t=e.HTMLElement.querySelector(`.${e.CSSClasses.time}`);if(!t)return;const s=!0===e.settings.selection.time?12:e.settings.selection.time,l="range"===e.settings.selection.controlTime;t.innerHTML=`\n\t<div class="${e.CSSClasses.timeContent}">\n\t\t<label class="${e.CSSClasses.timeHours}">\n\t\t\t<input type="text"\n\t\t\t\tname="hours"\n\t\t\t\tmaxlength="2"\n\t\t\t\tvalue="${e.selectedHours}"\n\t\t\t\t${l?"disabled":""}>\n\t\t</label>\n\t\t<label class="${e.CSSClasses.timeMinutes}">\n\t\t\t<input type="text"\n\t\t\t\tname="minutes"\n\t\t\t\tmaxlength="2"\n\t\t\t\tvalue="${e.selectedMinutes}"\n\t\t\t\t${l?"disabled":""}>\n\t\t</label>\n\t\t${12===s?`\n\t\t<button type="button"\n\t\t\tclass="${e.CSSClasses.timeKeeping}"\n\t\t\t${l?"disabled":""}>${e.selectedKeeping}</button>\n\t\t`:""}\n\t</div>\n\t<div class="${e.CSSClasses.timeRanges}">\n\t\t<label class="${e.CSSClasses.timeRange}">\n\t\t\t<input type="range"\n\t\t\t\tname="hours"\n\t\t\t\tmin="0"\n\t\t\t\tmax="23"\n\t\t\t\tstep="${e.settings.selection.stepHours}"\n\t\t\t\tvalue="${e.selectedKeeping?H(e.selectedHours,e.selectedKeeping):e.selectedHours}">\n\t\t</label>\n\t\t<label class="${e.CSSClasses.timeRange}">\n\t\t\t<input type="range"\n\t\t\t\tname="minutes"\n\t\t\t\tmin="0"\n\t\t\t\tmax="59"\n\t\t\t\tstep="${e.settings.selection.stepMinutes}"\n\t\t\t\tvalue="${e.selectedMinutes}">\n\t\t</label>\n\t</div>`,((e,t)=>{const s=e.HTMLElement.querySelector(`.${e.CSSClasses.timeRange} input[name="hours"]`),l=e.HTMLElement.querySelector(`.${e.CSSClasses.timeRange} input[name="minutes"]`),a=e.HTMLElement.querySelector(`.${e.CSSClasses.timeHours} input[name="hours"]`),n=e.HTMLElement.querySelector(`.${e.CSSClasses.timeMinutes} input[name="minutes"]`),i=e.HTMLElement.querySelector(`.${e.CSSClasses.timeKeeping}`),d=(t,s)=>{t.addEventListener("mouseover",(()=>s.classList.add(e.CSSClasses.isFocus)))},c=(t,s)=>{t.addEventListener("mouseout",(()=>s.classList.remove(e.CSSClasses.isFocus)))},o=(t,s,l)=>{"hours"===l?e.selectedHours=`${s}`:"minutes"===l&&(e.selectedMinutes=`${s}`),e.selectedTime=`${e.selectedHours}:${e.selectedMinutes}${e.selectedKeeping?` ${e.selectedKeeping}`:""}`,e.actions.changeTime&&e.actions.changeTime(t,e.selectedTime,e.selectedHours,e.selectedMinutes,e.selectedKeeping),e.input&&e.HTMLInputElement&&e.actions.changeToInput&&e.actions.changeToInput(t,k(e),e.selectedDates,e.selectedTime,e.selectedHours,e.selectedMinutes,e.selectedKeeping)},u=(t,s,l,a)=>{t.addEventListener("input",(t=>{let n=Number(t.target.value);n=n<10?`0${n}`:`${n}`,"hours"===l&&12===a?Number(t.target.value)<a&&Number(t.target.value)>0?(s.value=n,e.selectedKeeping="AM",i.innerText=e.selectedKeeping,o(t,n,l)):(0===Number(t.target.value)?(e.selectedKeeping="AM",i.innerText="AM"):(e.selectedKeeping="PM",i.innerText="PM"),s.value=r(t.target.value),o(t,r(t.target.value),l)):(s.value=n,o(t,n,l))}))},m=(t,s,l,a)=>{s.addEventListener("change",(s=>{const n=s.target;let d=Number(n.value);d=d<10?`0${d}`:`${d}`,"hours"===l&&12===a?n.value&&Number(n.value)<=a&&Number(n.value)>0?(n.value=d,t.value=H(d,e.selectedKeeping),o(s,d,l)):n.value&&Number(n.value)<24&&(Number(n.value)>a||0===Number(n.value))?(0===Number(n.value)?(e.selectedKeeping="AM",i.innerText="AM"):(e.selectedKeeping="PM",i.innerText="PM"),n.value=r(n.value),t.value=d,o(s,r(n.value),l)):n.value=e.selectedHours:n.value&&Number(n.value)<=a&&Number(n.value)>=0?(n.value=d,t.value=d,o(s,d,l)):"hours"===l?n.value=e.selectedHours:"minutes"===l&&(n.value=e.selectedMinutes)}))};d(s,a),d(l,n),c(s,a),c(l,n),u(s,a,"hours",24===t?23:12),u(l,n,"minutes",0),m(s,a,"hours",24===t?23:12),m(l,n,"minutes",59),i&&i.addEventListener("click",(t=>{i.innerText.includes("AM")?e.selectedKeeping="PM":e.selectedKeeping="AM",s.value=H(e.selectedHours,e.selectedKeeping),o(t,e.selectedHours,"hours"),i.innerText=e.selectedKeeping}))})(e,s)},E=e=>{const t=[...e.locale.weekday];if(!t[0])return;const s=e.HTMLElement.querySelectorAll(`.${e.CSSClasses.week}`),l=document.createElement("b");l.className=e.CSSClasses.weekDay,e.settings.iso8601&&t.push(t.shift()),s.forEach((s=>{s.innerHTML="";for(let a=0;a<t.length;a++){const n=t[a],i=l.cloneNode(!0);e.settings.visibility.weekend&&e.settings.iso8601?5!==a&&6!==a||i.classList.add(e.CSSClasses.weekDayWeekend):e.settings.visibility.weekend&&!e.settings.iso8601&&(0!==a&&6!==a||i.classList.add(e.CSSClasses.weekDayWeekend)),i.innerText=`${n}`,s.append(i)}}))},x=(e,t)=>{if(void 0===e.viewYear||!e.dateMin||!e.dateMax)return;const s=(null==t?void 0:t.dataset.calendarSelectedYear)?Number(null==t?void 0:t.dataset.calendarSelectedYear):e.selectedYear;e.currentType="year",w(e,t),$(e),f(e),o(e);const l=e.HTMLElement.querySelector(`.${e.CSSClasses.years}`);if(!l)return;e.settings.selection.year&&l.classList.add(e.CSSClasses.yearsSelecting);const a=document.createElement("button");a.type="button",a.className=e.CSSClasses.yearsYear;for(let n=e.viewYear-7;n<e.viewYear+8;n++){const t=n,i=a.cloneNode(!0);t===s&&i.classList.add(e.CSSClasses.yearsYearSelected),(t<e.dateMin.getFullYear()+("multiple"!==e.type||e.selectedYear===s?0:1)||t>e.dateMax.getFullYear())&&(i.classList.add(e.CSSClasses.yearsYearDisabled),i.tabIndex=-1),i.dataset.calendarYear=String(t),i.innerText=`${t}`,l.append(i)}},N=["light","dark","system"];let _=!1;const A=(e,t)=>{var s;let l=null;for(let a=0;a<N.length;a++){if("system"===N[a])return;if(null==(s=e.getAttribute(t))?void 0:s.includes(N[a])){l=N[a];break}}return l},F=(e,t)=>{e.HTMLElement&&(N.includes(t)?e.HTMLElement.dataset.calendarTheme=t:console.error("Incorrect name of theme in settings.visibility.theme"))},I=(e,t)=>{if(!t)return void F(e,"light");const s=e=>e.matches?"dark":"light";e.HTMLElement.dataset.calendarTheme=s(t),_||(t.onchange=t=>{"system"===e.settings.visibility.theme&&(e.HTMLElement.dataset.calendarTheme=s(t))},_=!0)},B=(e,t)=>{if(!e.HTMLElement)return;const s=!!e.settings.visibility.themeDetect&&document.querySelector(e.settings.visibility.themeDetect);if(!s)return void I(e,t);const l=e.settings.visibility.themeDetect.replace(/^.*\[(.+)\]/g,((e,t)=>t)),a=s.hasAttribute(l);if(!l||!a)return void I(e,t);const n=A(s,l);n?(F(e,n),((e,t,s)=>{new MutationObserver((l=>{for(let a=0;a<l.length;a++)if(l[a].attributeName===s){const l=A(t,s);l&&F(e,l);break}})).observe(t,{attributes:!0})})(e,s,l)):I(e,t)},q=e=>{const t={default(){E(e),m(e)},multiple(){E(e),m(e)},month(){L(e)},year(){x(e)}};(e=>{if(!e.HTMLElement)return;let t;"not all"!==window.matchMedia("(prefers-color-scheme)").media&&(t=window.matchMedia("(prefers-color-scheme: dark)")),"system"===e.settings.visibility.theme?B(e,t):F(e,e.settings.visibility.theme)})(e),(e=>{if("define"!==e.settings.lang){e.locale.weekday=[];for(let t=0;t<7;t++){let s=new Date(0,0,t).toLocaleString(e.settings.lang,{weekday:"short"});s=`${s.charAt(0).toUpperCase()}${s.substring(1,s.length)}`,s=s.replace(/\./,""),e.locale.weekday.push(s)}e.locale.months=[];for(let t=0;t<12;t++){let s=new Date(0,t).toLocaleString(e.settings.lang,{month:"long"});s=`${s.charAt(0).toUpperCase()}${s.substring(1,s.length)}`,s=s.replace(/\./,""),e.locale.months.push(s)}}})(e),w(e),$(e),f(e),o(e),Y(e),t[e.currentType]()},O=e=>{c(e),q(e)},P=(e,t)=>{if(void 0===e.selectedMonth||void 0===e.selectedYear)return;const s=new Date(`${i(new Date(e.selectedYear,e.selectedMonth,1))}T00:00:00`);switch(t){case"prev":s.setMonth(s.getMonth()-e.jumpMonths);break;case"next":s.setMonth(s.getMonth()+e.jumpMonths)}e.selectedMonth=s.getMonth(),e.selectedYear=s.getFullYear(),$(e),f(e),o(e),m(e)};let K=null;const W=()=>{var e;if(!K)return;const t=null==(e=K.HTMLElement)?void 0:e.querySelectorAll(`.${K.CSSClasses.dayBtnHover}`);t&&t.forEach((e=>e.classList.remove(K.CSSClasses.dayBtnHover)))},j=e=>{var t;if(!K||!K.selectedDates)return;const s=i(e);if(K.rangeDisabled&&K.rangeDisabled.includes(s))return;const l=null==(t=K.HTMLElement)?void 0:t.querySelectorAll(`[data-calendar-day="${s}"]`);null==l||l.forEach((e=>{e.classList.add(K.CSSClasses.dayBtnHover)}))},R=e=>{if(!e.target||!K||!K.selectedDates)return;if(!e.target.closest(`.${K.CSSClasses.days}`))return void W();const t=e.target.dataset.calendarDay;if(!t)return;W();const s=new Date(new Date(`${K.selectedDates[0]}T00:00:00`).getFullYear(),new Date(`${K.selectedDates[0]}T00:00:00`).getMonth(),new Date(`${K.selectedDates[0]}T00:00:00`).getDate()),l=new Date(new Date(`${t}T00:00:00`).getFullYear(),new Date(`${t}T00:00:00`).getMonth(),new Date(`${t}T00:00:00`).getDate());if(l>s)for(let a=s;a<=l;a.setDate(a.getDate()+1))j(a);else for(let a=s;a>=l;a.setDate(a.getDate()-1))j(a)},G=e=>{K&&"Escape"===e.key&&(K.selectedDates=[],K.HTMLElement.removeEventListener("mousemove",R),document.removeEventListener("keydown",G),q(K))},z=e=>{e&&e.selectedDates&&(K=e,e.selectedDates[0]&&e.selectedDates.length<=1?(e.HTMLElement.addEventListener("mousemove",R),document.addEventListener("keydown",G),e.settings.range.disableGaps&&(()=>{var e;if(!K||!(null==(e=K.selectedDates)?void 0:e[0])||!K.rangeDisabled||K.rangeDisabled.length<2)return;const t=new Date(`${K.selectedDates[0]}T00:00:00`);let s=null,l=null;for(let a=0;a<K.rangeDisabled.length;a++){const e=new Date(`${K.rangeDisabled[a]}T00:00:00`);if(!(t>=e)){l=e;break}s=e}s&&(s=new Date(s.setDate(s.getDate()+1)),K.rangeMin=i(s)),l&&(l=new Date(l.setDate(l.getDate()-1)),K.rangeMax=i(l))})()):(e.HTMLElement.removeEventListener("mousemove",R),document.removeEventListener("keydown",G),e.settings.range.disableGaps&&K&&(K.rangeMin=K.settings.range.min,K.rangeMax=K.settings.range.max,K.settings.range.disablePast&&new Date(`${K.settings.range.min}T00:00:00`)<K.date.today&&(K.rangeMin=i(K.date.today)))))},U=(e,t,s,l,a)=>{const n=e.HTMLElement.querySelectorAll(`.${e.CSSClasses.column}`),i=[...n].findIndex((e=>e.classList.contains(t))),d=Number(n[i].querySelector(`.${s}`).getAttribute(a));return"month"===e.currentType&&i>=0?l-i:"year"===e.currentType&&e.selectedYear!==d?l-1:l},V=e=>{e.HTMLElement.addEventListener("click",(t=>{const s=t.target,l=s.closest(`.${e.CSSClasses.arrow}`),a=s.closest(`.${e.CSSClasses.arrowPrev}`),n=s.closest(`.${e.CSSClasses.arrowNext}`),d=s.closest(`.${e.CSSClasses.dayBtn}`),r=s.closest(`.${e.CSSClasses.dayBtnPrev}`),c=s.closest(`.${e.CSSClasses.dayBtnNext}`),o=s.closest(`.${e.CSSClasses.weekNumber}`),u=s.closest(`.${e.CSSClasses.year}`),g=s.closest(`.${e.CSSClasses.yearsYear}`),v=s.closest(`.${e.CSSClasses.month}`),y=s.closest(`.${e.CSSClasses.monthsMonth}`),h=s.closest(`.${e.CSSClasses.grid}`),S=s.closest(`.${e.CSSClasses.column}`);l&&"year"!==e.currentType&&"month"!==e.currentType&&P(e,s.dataset.calendarArrow),l&&e.actions.clickArrow&&e.actions.clickArrow(t,Number(e.selectedYear),Number(e.selectedMonth)),(()=>{if(e.settings.selection.day&&["single","multiple","multiple-ranged"].includes(e.settings.selection.day)&&d){switch(e.settings.selection.day){case"single":e.selectedDates&&d&&d.dataset.calendarDay&&(d.classList.contains(e.CSSClasses.dayBtnSelected)?e.selectedDates.splice(e.selectedDates.indexOf(d.dataset.calendarDay),1):(e.selectedDates=[],e.selectedDates.push(d.dataset.calendarDay)));break;case"multiple":e.selectedDates&&d&&d.dataset.calendarDay&&(d.classList.contains(e.CSSClasses.dayBtnSelected)?e.selectedDates.splice(e.selectedDates.indexOf(d.dataset.calendarDay),1):e.selectedDates.push(d.dataset.calendarDay));break;case"multiple-ranged":(()=>{if(e.selectedDates&&d&&d.dataset.calendarDay){if(e.selectedDates.length<=1&&e.selectedDates[0]&&e.selectedDates[0].includes(d.dataset.calendarDay)?e.selectedDates=[]:(e.selectedDates.length>1&&(e.selectedDates=[]),e.selectedDates.push(d.dataset.calendarDay)),e.selectedDates[1]){const t=new Date(new Date(`${e.selectedDates[0]}T00:00:00`).getFullYear(),new Date(`${e.selectedDates[0]}T00:00:00`).getMonth(),new Date(`${e.selectedDates[0]}T00:00:00`).getDate()),s=new Date(new Date(`${e.selectedDates[1]}T00:00:00`).getFullYear(),new Date(`${e.selectedDates[1]}T00:00:00`).getMonth(),new Date(`${e.selectedDates[1]}T00:00:00`).getDate()),l=t=>{if(!e.selectedDates)return;const s=i(t);e.rangeDisabled&&e.rangeDisabled.includes(s)||e.selectedDates.push(s)};if(e.selectedDates=[],s>t)for(let e=t;e<=s;e.setDate(e.getDate()+1))l(e);else for(let e=t;e>=s;e.setDate(e.getDate()-1))l(e)}z(e)}})()}e.actions.clickDay&&e.actions.clickDay(t,e.selectedDates),e.input&&e.HTMLInputElement&&e.HTMLElement&&e.actions.changeToInput&&e.actions.changeToInput(t,k(e),e.selectedDates,e.selectedTime,e.selectedHours,e.selectedMinutes,e.selectedKeeping),r?P(e,"prev"):c?P(e,"next"):m(e)}})(),(()=>{var s;if(!e.settings.visibility.weekNumbers||!o||!e.actions.clickWeekNumber)return;const l=null==(s=e.HTMLElement)?void 0:s.querySelectorAll("[data-calendar-week-number]");if(!l)return;const a=Number(o.innerText),n=Number(o.dataset.calendarYearWeek),i=[...l].filter((e=>Number(e.dataset.calendarWeekNumber)===a));e.actions.clickWeekNumber(t,a,i,n)})(),(()=>{if(e.settings.selection.year)if(l&&"year"===e.currentType){if(void 0===e.viewYear)return;n?e.viewYear+=15:a&&(e.viewYear-=15),x(e,t.target)}else if("year"!==e.currentType&&u)x(e,t.target);else if("year"===e.currentType&&u)e.currentType=e.type,q(e);else if(g){if(void 0===e.selectedMonth||!e.dateMin||!e.dateMax)return;e.selectedYear="multiple"===e.type?U(e,e.CSSClasses.columnYear,e.CSSClasses.year,Number(g.dataset.calendarYear),"data-calendar-selected-year"):Number(g.dataset.calendarYear),e.currentType=e.type,(e.selectedMonth<e.dateMin.getMonth()&&e.selectedYear<=e.dateMin.getFullYear()||e.selectedYear<e.dateMin.getFullYear())&&(e.selectedMonth=e.dateMin.getMonth(),e.selectedYear=e.dateMin.getFullYear()),(e.selectedMonth>e.dateMax.getMonth()&&e.selectedYear>=e.dateMax.getFullYear()||e.selectedYear>e.dateMax.getFullYear())&&(e.selectedMonth=e.dateMax.getMonth(),e.selectedYear=e.dateMax.getFullYear()),e.actions.clickYear&&e.actions.clickYear(t,e.selectedYear),q(e)}else"multiple"===e.type&&"year"===e.currentType&&h&&!S&&(e.currentType=e.type,q(e))})(),(()=>{if(e.settings.selection.month)if("month"!==e.currentType&&v)L(e,t.target);else if("month"===e.currentType&&v)e.currentType=e.type,q(e);else if(y){if(void 0===e.selectedMonth||!e.dateMin||!e.dateMax)return;if(e.selectedMonth="multiple"===e.type?U(e,e.CSSClasses.columnMonth,e.CSSClasses.month,Number(y.dataset.calendarMonth),"data-calendar-selected-month"):Number(y.dataset.calendarMonth),"multiple"===e.type){const t=y.closest(`.${e.CSSClasses.columnMonth}`).querySelector(`.${e.CSSClasses.year}`);e.selectedYear=Number(t.dataset.calendarSelectedYear),e.selectedMonth<e.dateMin.getMonth()&&e.selectedYear<=e.dateMin.getFullYear()&&(e.selectedMonth=e.dateMin.getMonth()),e.selectedMonth>e.dateMax.getMonth()&&e.selectedYear>=e.dateMax.getFullYear()&&(e.selectedMonth=e.dateMax.getMonth())}e.currentType=e.type,e.actions.clickMonth&&e.actions.clickMonth(t,e.selectedMonth),q(e)}else"multiple"===e.type&&"month"===e.currentType&&h&&!S&&(e.currentType=e.type,q(e))})()}))};let J=null;const Q=(e,t)=>{let s=e.offsetHeight,l=0;for(let a=e;a;a=a.offsetParent)s+=a.offsetTop||0,l+=a.offsetLeft||0;Object.assign(t.style,{left:`${l}px`,top:`${s}px`})},X=e=>{if(!J||e.target.closest(`.${J.CSSClasses.calendar}.${J.CSSClasses.calendarToInput}`))return;document.querySelectorAll(`.${J.CSSClasses.calendar}.${J.CSSClasses.calendarToInput}`).forEach((e=>e.classList.add(J.CSSClasses.calendarHidden))),document.removeEventListener("click",X,{capture:!0})},Z=e=>{e&&(J=e,e.HTMLInputElement=e.HTMLElement,e.HTMLElement=null,e.HTMLInputElement.addEventListener("click",(()=>{e.HTMLElement&&e.HTMLInputElement?(Q(e.HTMLInputElement,e.HTMLElement),e.HTMLElement.classList.remove(e.CSSClasses.calendarHidden)):e.HTMLElement?e.HTMLElement.classList.remove(e.CSSClasses.calendarHidden):(e=>{if(!e.HTMLInputElement)return;const t=document.createElement("div");t.className=`${e.CSSClasses.calendar} ${e.CSSClasses.calendarToInput} ${e.CSSClasses.calendarHidden}`,Q(e.HTMLInputElement,t),e.HTMLElement=t,document.body.append(e.HTMLElement),setTimeout((()=>e.HTMLElement.classList.remove(e.CSSClasses.calendarHidden)),0),O(e),V(e)})(e),document.addEventListener("click",X,{capture:!0})})))},ee=e=>`\n\t<div class="${e.controls}">\n\t\t<#ArrowPrev />\n\t\t<#ArrowNext />\n\t</div>\n\t<div class="${e.grid}">\n\t\t<#Multiple>\n\t\t\t<div class="${e.column}">\n\t\t\t\t<div class="${e.header}">\n\t\t\t\t\t<div class="${e.headerContent}">\n\t\t\t\t\t\t<#Month />\n\t\t\t\t\t\t<#Year />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class="${e.wrapper}">\n\t\t\t\t\t<#WeekNumbers />\n\t\t\t\t\t<div class="${e.content}">\n\t\t\t\t\t\t<#Week />\n\t\t\t\t\t\t<#Days />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t<#/Multiple>\n\t</div>\n\t<#ControlTime />\n`,te=e=>`\n\t<div class="${e.header}">\n\t\t<div class="${e.headerContent}">\n\t\t\t<#Month />\n\t\t\t<#Year />\n\t\t</div>\n\t</div>\n\t<div class="${e.wrapper}">\n\t\t<div class="${e.content}">\n\t\t\t<#Months />\n\t\t</div>\n\t</div>\n`,se=e=>`\n\t<div class="${e.header}">\n\t\t<#ArrowPrev />\n\t\t<div class="${e.headerContent}">\n\t\t\t<#Month />\n\t\t\t<#Year />\n\t\t</div>\n\t\t<#ArrowNext />\n\t</div>\n\t<div class="${e.wrapper}">\n\t\t<div class="${e.content}">\n\t\t\t<#Years />\n\t\t</div>\n\t</div>\n`,le={calendar:"vanilla-calendar",calendarDefault:"vanilla-calendar_default",calendarMultiple:"vanilla-calendar_multiple",calendarMonth:"vanilla-calendar_month",calendarYear:"vanilla-calendar_year",calendarHidden:"vanilla-calendar_hidden",calendarToInput:"vanilla-calendar_to-input",controls:"vanilla-calendar-controls",grid:"vanilla-calendar-grid",gridDisabled:"vanilla-calendar-grid_disabled",column:"vanilla-calendar-column",columnMonth:"vanilla-calendar-column_month",columnYear:"vanilla-calendar-column_year",header:"vanilla-calendar-header",headerContent:"vanilla-calendar-header__content",month:"vanilla-calendar-month",monthDisabled:"vanilla-calendar-month_disabled",year:"vanilla-calendar-year",yearDisabled:"vanilla-calendar-year_disabled",arrow:"vanilla-calendar-arrow",arrowPrev:"vanilla-calendar-arrow_prev",arrowNext:"vanilla-calendar-arrow_next",wrapper:"vanilla-calendar-wrapper",content:"vanilla-calendar-content",week:"vanilla-calendar-week",weekDay:"vanilla-calendar-week__day",weekDayWeekend:"vanilla-calendar-week__day_weekend",days:"vanilla-calendar-days",daysSelecting:"vanilla-calendar-days_selecting",months:"vanilla-calendar-months",monthsSelecting:"vanilla-calendar-months_selecting",monthsMonth:"vanilla-calendar-months__month",monthsMonthSelected:"vanilla-calendar-months__month_selected",monthsMonthDisabled:"vanilla-calendar-months__month_disabled",years:"vanilla-calendar-years",yearsSelecting:"vanilla-calendar-years_selecting",yearsYear:"vanilla-calendar-years__year",yearsYearSelected:"vanilla-calendar-years__year_selected",yearsYearDisabled:"vanilla-calendar-years__year_disabled",time:"vanilla-calendar-time",timeContent:"vanilla-calendar-time__content",timeHours:"vanilla-calendar-time__hours",timeMinutes:"vanilla-calendar-time__minutes",timeKeeping:"vanilla-calendar-time__keeping",timeRanges:"vanilla-calendar-time__ranges",timeRange:"vanilla-calendar-time__range",day:"vanilla-calendar-day",daySelected:"vanilla-calendar-day_selected",daySelectedFirst:"vanilla-calendar-day_selected-first",daySelectedLast:"vanilla-calendar-day_selected-last",daySelectedIntermediate:"vanilla-calendar-day_selected-intermediate",dayPopup:"vanilla-calendar-day__popup",dayBtn:"vanilla-calendar-day__btn",dayBtnPrev:"vanilla-calendar-day__btn_prev",dayBtnNext:"vanilla-calendar-day__btn_next",dayBtnToday:"vanilla-calendar-day__btn_today",dayBtnSelected:"vanilla-calendar-day__btn_selected",dayBtnHover:"vanilla-calendar-day__btn_hover",dayBtnDisabled:"vanilla-calendar-day__btn_disabled",dayBtnIntermediate:"vanilla-calendar-day__btn_intermediate",dayBtnWeekend:"vanilla-calendar-day__btn_weekend",dayBtnHoliday:"vanilla-calendar-day__btn_holiday",weekNumbers:"vanilla-calendar-week-numbers",weekNumbersTitle:"vanilla-calendar-week-numbers__title",weekNumbersContent:"vanilla-calendar-week-numbers__content",weekNumber:"vanilla-calendar-week-number",isFocus:"vanilla-calendar-is-focus"};return class{constructor(e,i){var d,r,o,u,m,g,v,y,h,S,M,p,C,b,D,T,w,$,f,L,k,H,Y,E,x,N,_,A,F,I,B,P,K,W,j,R,G,z,U,J,Q,X,ae,ne,ie,de,re,ce,oe,ue,me,ge,ve,ye,he,Se,Me,pe,Ce,be,De,Te,we,$e,fe,Le,ke,He,Ye,Ee,xe,Ne,_e,Ae,Fe,Ie,Be,qe,Oe,Pe,Ke,We,je,Re,Ge,ze,Ue,Ve,Je,Qe,Xe,Ze,et,tt,st,lt,at,nt,it,dt,rt,ct,ot,ut,mt,gt,vt,yt,ht,St,Mt,pt,Ct,bt,Dt,Tt,wt,$t,ft,Lt,kt,Ht,Yt,Et,xt,Nt,_t,At;(n(this,"HTMLElement"),n(this,"input"),n(this,"type"),n(this,"months"),n(this,"jumpMonths"),n(this,"date"),n(this,"settings"),n(this,"locale"),n(this,"actions"),n(this,"popups"),n(this,"CSSClasses"),n(this,"DOMTemplates"),n(this,"currentType"),n(this,"reset",(()=>O(this))),n(this,"update",(()=>(e=>{var t;let s=null,l=null,a=null;(null==(t=e.settings.selected.dates)?void 0:t[0])||(s=e.settings.selected.dates,e.settings.selected.dates=e.selectedDates),e.settings.selected.month||(l=e.settings.selected.month,e.settings.selected.month=e.selectedMonth),e.settings.selected.year||(a=e.settings.selected.year,e.settings.selected.year=e.selectedYear),c(e),q(e),e.settings.selected.dates=s,e.settings.selected.month=l,e.settings.selected.year=a})(this))),n(this,"init",(()=>{var e;(e=this).HTMLElement&&(e.input?Z(e):(O(e),V(e)))})),this.HTMLElement="string"==typeof e?document.querySelector(e):e,this.HTMLElement)&&(this.input=null!=(d=null==i?void 0:i.input)&&d,this.type=null!=(r=null==i?void 0:i.type)?r:"default",this.months=null!=(o=null==i?void 0:i.months)?o:2,this.jumpMonths=null!=(u=null==i?void 0:i.jumpMonths)?u:1,this.date={min:null!=(g=null==(m=null==i?void 0:i.date)?void 0:m.min)?g:"1970-01-01",max:null!=(y=null==(v=null==i?void 0:i.date)?void 0:v.max)?y:"2470-12-31",today:null!=(S=null==(h=null==i?void 0:i.date)?void 0:h.today)?S:new Date},this.settings={lang:null!=(p=null==(M=null==i?void 0:i.settings)?void 0:M.lang)?p:"en",iso8601:null==(b=null==(C=null==i?void 0:i.settings)?void 0:C.iso8601)||b,range:{min:null!=(w=null==(T=null==(D=null==i?void 0:i.settings)?void 0:D.range)?void 0:T.min)?w:this.date.min,max:null!=(L=null==(f=null==($=null==i?void 0:i.settings)?void 0:$.range)?void 0:f.max)?L:this.date.max,disablePast:null!=(Y=null==(H=null==(k=null==i?void 0:i.settings)?void 0:k.range)?void 0:H.disablePast)&&Y,disableGaps:null!=(N=null==(x=null==(E=null==i?void 0:i.settings)?void 0:E.range)?void 0:x.disableGaps)&&N,disableAllDays:null!=(F=null==(A=null==(_=null==i?void 0:i.settings)?void 0:_.range)?void 0:A.disableAllDays)&&F,disableWeekday:null!=(P=null==(B=null==(I=null==i?void 0:i.settings)?void 0:I.range)?void 0:B.disableWeekday)?P:null,disabled:null!=(j=null==(W=null==(K=null==i?void 0:i.settings)?void 0:K.range)?void 0:W.disabled)?j:null,enabled:null!=(z=null==(G=null==(R=null==i?void 0:i.settings)?void 0:R.range)?void 0:G.enabled)?z:null},selection:{day:null!=(Q=null==(J=null==(U=null==i?void 0:i.settings)?void 0:U.selection)?void 0:J.day)?Q:"single",month:null==(ne=null==(ae=null==(X=null==i?void 0:i.settings)?void 0:X.selection)?void 0:ae.month)||ne,year:null==(re=null==(de=null==(ie=null==i?void 0:i.settings)?void 0:ie.selection)?void 0:de.year)||re,time:null!=(ue=null==(oe=null==(ce=null==i?void 0:i.settings)?void 0:ce.selection)?void 0:oe.time)&&ue,controlTime:null!=(ve=null==(ge=null==(me=null==i?void 0:i.settings)?void 0:me.selection)?void 0:ge.controlTime)?ve:"all",stepHours:null!=(Se=null==(he=null==(ye=null==i?void 0:i.settings)?void 0:ye.selection)?void 0:he.stepHours)?Se:1,stepMinutes:null!=(Ce=null==(pe=null==(Me=null==i?void 0:i.settings)?void 0:Me.selection)?void 0:pe.stepMinutes)?Ce:1},selected:{dates:null!=(Te=null==(De=null==(be=null==i?void 0:i.settings)?void 0:be.selected)?void 0:De.dates)?Te:null,month:null!=(fe=null==($e=null==(we=null==i?void 0:i.settings)?void 0:we.selected)?void 0:$e.month)?fe:null,year:null!=(He=null==(ke=null==(Le=null==i?void 0:i.settings)?void 0:Le.selected)?void 0:ke.year)?He:null,holidays:null!=(xe=null==(Ee=null==(Ye=null==i?void 0:i.settings)?void 0:Ye.selected)?void 0:Ee.holidays)?xe:null,time:null!=(Ae=null==(_e=null==(Ne=null==i?void 0:i.settings)?void 0:Ne.selected)?void 0:_e.time)?Ae:null},visibility:{theme:null!=(Be=null==(Ie=null==(Fe=null==i?void 0:i.settings)?void 0:Fe.visibility)?void 0:Ie.theme)?Be:"system",themeDetect:null!=(Pe=null==(Oe=null==(qe=null==i?void 0:i.settings)?void 0:qe.visibility)?void 0:Oe.themeDetect)?Pe:"html[data-theme]",monthShort:null==(je=null==(We=null==(Ke=null==i?void 0:i.settings)?void 0:Ke.visibility)?void 0:We.monthShort)||je,weekNumbers:null!=(ze=null==(Ge=null==(Re=null==i?void 0:i.settings)?void 0:Re.visibility)?void 0:Ge.weekNumbers)&&ze,weekend:null==(Je=null==(Ve=null==(Ue=null==i?void 0:i.settings)?void 0:Ue.visibility)?void 0:Ve.weekend)||Je,today:null==(Ze=null==(Xe=null==(Qe=null==i?void 0:i.settings)?void 0:Qe.visibility)?void 0:Xe.today)||Ze,disabled:null!=(st=null==(tt=null==(et=null==i?void 0:i.settings)?void 0:et.visibility)?void 0:tt.disabled)&&st,daysOutside:null==(nt=null==(at=null==(lt=null==i?void 0:i.settings)?void 0:lt.visibility)?void 0:at.daysOutside)||nt}},this.locale={months:null!=(dt=null==(it=null==i?void 0:i.locale)?void 0:it.months)?dt:[],weekday:null!=(ct=null==(rt=null==i?void 0:i.locale)?void 0:rt.weekday)?ct:[]},this.actions={clickDay:null!=(ut=null==(ot=null==i?void 0:i.actions)?void 0:ot.clickDay)?ut:null,clickWeekNumber:null!=(gt=null==(mt=null==i?void 0:i.actions)?void 0:mt.clickWeekNumber)?gt:null,clickMonth:null!=(yt=null==(vt=null==i?void 0:i.actions)?void 0:vt.clickMonth)?yt:null,clickYear:null!=(St=null==(ht=null==i?void 0:i.actions)?void 0:ht.clickYear)?St:null,clickArrow:null!=(pt=null==(Mt=null==i?void 0:i.actions)?void 0:Mt.clickArrow)?pt:null,changeTime:null!=(bt=null==(Ct=null==i?void 0:i.actions)?void 0:Ct.changeTime)?bt:null,changeToInput:null!=(Tt=null==(Dt=null==i?void 0:i.actions)?void 0:Dt.changeToInput)?Tt:null,getDays:null!=($t=null==(wt=null==i?void 0:i.actions)?void 0:wt.getDays)?$t:null},this.popups=null!=(ft=null==i?void 0:i.popups)?ft:null,this.CSSClasses=(()=>{const e=((e,n)=>{for(var i in n||(n={}))s.call(n,i)&&a(e,i,n[i]);if(t)for(var i of t(n))l.call(n,i)&&a(e,i,n[i]);return e})({},le);return Object.keys(le).forEach((t=>{var s;(null==(s=null==i?void 0:i.CSSClasses)?void 0:s[t])?e[t]=i.CSSClasses[t]:e[t]=le[t]})),e})(),this.DOMTemplates={default:null!=(kt=null==(Lt=null==i?void 0:i.DOMTemplates)?void 0:Lt.default)?kt:(At=this.CSSClasses,`\n\t<div class="${At.header}">\n\t\t<#ArrowPrev />\n\t\t<div class="${At.headerContent}">\n\t\t\t<#Month />\n\t\t\t<#Year />\n\t\t</div>\n\t\t<#ArrowNext />\n\t</div>\n\t<div class="${At.wrapper}">\n\t\t<#WeekNumbers />\n\t\t<div class="${At.content}">\n\t\t\t<#Week />\n\t\t\t<#Days />\n\t\t</div>\n\t</div>\n\t<#ControlTime />\n`),multiple:null!=(Yt=null==(Ht=null==i?void 0:i.DOMTemplates)?void 0:Ht.multiple)?Yt:ee(this.CSSClasses),month:null!=(xt=null==(Et=null==i?void 0:i.DOMTemplates)?void 0:Et.month)?xt:te(this.CSSClasses),year:null!=(_t=null==(Nt=null==i?void 0:i.DOMTemplates)?void 0:Nt.year)?_t:se(this.CSSClasses)},this.currentType=this.type)}}}));
Index: /mods/mod_ticket/assets/vanilla-calendar/vanilla-calendar.min.m.js
===================================================================
--- /mods/mod_ticket/assets/vanilla-calendar/vanilla-calendar.min.m.js	(revision 8427)
+++ /mods/mod_ticket/assets/vanilla-calendar/vanilla-calendar.min.m.js	(revision 8427)
@@ -0,0 +1,1768 @@
+/*! name: @uvarov.frontend/vanilla-calendar | url: https://github.com/uvarov-frontend/vanilla-calendar */
+var __defProp = Object.defineProperty;
+var __getOwnPropSymbols = Object.getOwnPropertySymbols;
+var __hasOwnProp = Object.prototype.hasOwnProperty;
+var __propIsEnum = Object.prototype.propertyIsEnumerable;
+var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
+var __spreadValues = (a, b) => {
+  for (var prop in b || (b = {}))
+    if (__hasOwnProp.call(b, prop))
+      __defNormalProp(a, prop, b[prop]);
+  if (__getOwnPropSymbols)
+    for (var prop of __getOwnPropSymbols(b)) {
+      if (__propIsEnum.call(b, prop))
+        __defNormalProp(a, prop, b[prop]);
+    }
+  return a;
+};
+var __publicField = (obj, key, value) => {
+  __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
+  return value;
+};
+const generateDate = (date) => {
+  const year = date.getFullYear();
+  let month = date.getMonth() + 1;
+  let day = date.getDate();
+  month = month < 10 ? `0${month}` : month;
+  day = day < 10 ? `0${day}` : day;
+  return `${year}-${month}-${day}`;
+};
+const parserDates = (dates) => {
+  const newDates = [];
+  dates.forEach((date) => {
+    if (date.match(/^(\d{4}-\d{2}-\d{2})$/g)) {
+      newDates.push(date);
+    } else {
+      date.replace(/(\d{4}-\d{2}-\d{2}).*?(\d{4}-\d{2}-\d{2})/g, (_, d1, d2) => {
+        const startDate = /* @__PURE__ */ new Date(`${d1}T00:00:00`);
+        const endDate = /* @__PURE__ */ new Date(`${d2}T00:00:00`);
+        const currentDate = new Date(startDate.getTime());
+        for (currentDate; currentDate <= endDate; currentDate.setDate(currentDate.getDate() + 1)) {
+          newDates.push(generateDate(currentDate));
+        }
+        return _;
+      });
+    }
+  });
+  return newDates;
+};
+const transformTime12 = (hour) => {
+  const oldHour = Number(hour);
+  let newHour = String(oldHour);
+  if (oldHour === 0) {
+    newHour = "12";
+  } else if (oldHour === 13) {
+    newHour = "01";
+  } else if (oldHour === 14) {
+    newHour = "02";
+  } else if (oldHour === 15) {
+    newHour = "03";
+  } else if (oldHour === 16) {
+    newHour = "04";
+  } else if (oldHour === 17) {
+    newHour = "05";
+  } else if (oldHour === 18) {
+    newHour = "06";
+  } else if (oldHour === 19) {
+    newHour = "07";
+  } else if (oldHour === 20) {
+    newHour = "08";
+  } else if (oldHour === 21) {
+    newHour = "09";
+  } else if (oldHour === 22) {
+    newHour = "10";
+  } else if (oldHour === 23) {
+    newHour = "11";
+  }
+  return newHour;
+};
+const setVariablesDates = (self) => {
+  var _a, _b;
+  self.rangeMin = self.settings.range.min;
+  self.rangeMax = self.settings.range.max;
+  self.rangeDisabled = self.settings.range.disabled ? parserDates([...self.settings.range.disabled]) : [];
+  self.rangeEnabled = self.settings.range.enabled ? parserDates([...self.settings.range.enabled]) : [];
+  self.selectedDates = self.settings.selected.dates ? parserDates([...self.settings.selected.dates]) : [];
+  self.selectedHolidays = self.settings.selected.holidays ? parserDates([...self.settings.selected.holidays]) : [];
+  if (self.settings.range.disablePast && !self.settings.range.disableAllDays && /* @__PURE__ */ new Date(`${self.settings.range.min}T00:00:00`) < self.date.today) {
+    self.rangeMin = generateDate(self.date.today);
+  }
+  if (self.settings.range.disableAllDays) {
+    self.rangeMin = generateDate(self.date.today);
+    self.rangeMax = generateDate(self.date.today);
+    (_a = self.rangeDisabled) == null ? void 0 : _a.push(generateDate(self.date.today));
+  }
+  if (self.rangeEnabled)
+    self.rangeEnabled.sort((a, b) => +new Date(a) - +new Date(b));
+  if (((_b = self.rangeEnabled) == null ? void 0 : _b[0]) && self.settings.range.disableAllDays) {
+    self.rangeMin = self.rangeEnabled[0];
+    self.rangeMax = self.rangeEnabled[self.rangeEnabled.length - 1];
+  }
+  const firstDay = /* @__PURE__ */ new Date(`${self.rangeMin}T00:00:00`);
+  const lastDay = /* @__PURE__ */ new Date(`${self.rangeMax}T00:00:00`);
+  firstDay.setDate(firstDay.getDate() - 1);
+  lastDay.setDate(lastDay.getDate() + 1);
+  self.rangeDisabled.push(generateDate(firstDay));
+  self.rangeDisabled.push(generateDate(lastDay));
+  if (self.settings.selected.month !== null && self.settings.selected.month >= 0 && self.settings.selected.month < 12) {
+    self.selectedMonth = self.settings.selected.month;
+  } else {
+    self.selectedMonth = self.date.today.getMonth();
+  }
+  if (self.settings.selected.year !== null && self.settings.selected.year >= 0 && self.settings.selected.year <= 9999) {
+    self.selectedYear = self.settings.selected.year;
+  } else {
+    self.selectedYear = self.date.today.getFullYear();
+  }
+  self.viewYear = self.selectedYear;
+  self.dateMin = self.settings.visibility.disabled ? /* @__PURE__ */ new Date(`${self.date.min}T00:00:00`) : /* @__PURE__ */ new Date(`${self.rangeMin}T00:00:00`);
+  self.dateMax = self.settings.visibility.disabled ? /* @__PURE__ */ new Date(`${self.date.max}T00:00:00`) : /* @__PURE__ */ new Date(`${self.rangeMax}T00:00:00`);
+  const time12 = self.settings.selection.time === true || self.settings.selection.time === 12;
+  if (time12 || self.settings.selection.time === 24) {
+    self.userTime = false;
+    if (typeof self.settings.selected.time === "string") {
+      const regExr = time12 ? /^([0-9]|0[1-9]|1[0-2]):([0-5][0-9])|(AM|PM)/g : /^([0-1]?[0-9]|2[0-3]):([0-5][0-9])/g;
+      self.settings.selected.time.replace(regExr, (_, p1, p2, p3) => {
+        if (p1 && p2) {
+          self.userTime = true;
+          self.selectedHours = p1;
+          self.selectedMinutes = p2;
+        }
+        if (p3 && time12) {
+          self.selectedKeeping = p3;
+        } else if (time12) {
+          self.selectedKeeping = "AM";
+        }
+        return "";
+      });
+    }
+    if (!self.userTime && time12) {
+      self.selectedHours = transformTime12(String(self.date.today.getHours()));
+      self.selectedMinutes = String(self.date.today.getMinutes());
+      self.selectedKeeping = Number(self.date.today.getHours()) >= 12 ? "PM" : "AM";
+    } else if (!self.userTime) {
+      self.selectedHours = String(self.date.today.getHours());
+      self.selectedMinutes = String(self.date.today.getMinutes());
+    }
+    self.selectedHours = Number(self.selectedHours) < 10 ? `0${Number(self.selectedHours)}` : `${self.selectedHours}`;
+    self.selectedMinutes = Number(self.selectedMinutes) < 10 ? `0${Number(self.selectedMinutes)}` : `${self.selectedMinutes}`;
+    self.selectedTime = `${self.selectedHours}:${self.selectedMinutes}${self.selectedKeeping ? ` ${self.selectedKeeping}` : ""}`;
+  } else if (self.settings.selection.time) {
+    self.settings.selection.time = false;
+    console.error("The value of the time property can be: false, true, 12 or 24.");
+  }
+  if (self.type !== "multiple")
+    return;
+  if (self.months === 1) {
+    console.warn("The value of the Â«monthsÂ» parameter cannot be less than Â«2Â», the minimum available value will be initialized.");
+    self.correctMonths = 2;
+  } else if (self.months > 12) {
+    console.warn("The value of the Â«monthsÂ» parameter cannot be greater than Â«12Â», the maximum available value will be initialized.");
+    self.correctMonths = 12;
+  } else {
+    self.correctMonths = self.months;
+  }
+};
+const controlArrows = (self) => {
+  if (!["default", "multiple", "year"].includes(self.currentType))
+    return;
+  const arrowPrev = self.HTMLElement.querySelector(`.${self.CSSClasses.arrowPrev}`);
+  const arrowNext = self.HTMLElement.querySelector(`.${self.CSSClasses.arrowNext}`);
+  if (!arrowPrev || !arrowNext)
+    return;
+  const defaultControl = () => {
+    if (!self.dateMin || !self.dateMax)
+      return;
+    const jumpDateMin = /* @__PURE__ */ new Date(`${generateDate(new Date(self.selectedYear, self.selectedMonth, 1))}T00:00:00`);
+    const jumpDateMax = new Date(jumpDateMin.getTime());
+    jumpDateMin.setMonth(jumpDateMin.getMonth() - self.jumpMonths);
+    jumpDateMax.setMonth(jumpDateMax.getMonth() + self.jumpMonths);
+    if (!self.settings.selection.month || jumpDateMin.getFullYear() < self.dateMin.getFullYear() || jumpDateMin.getFullYear() === self.dateMin.getFullYear() && jumpDateMin.getMonth() < self.dateMin.getMonth()) {
+      arrowPrev.style.visibility = "hidden";
+    } else {
+      arrowPrev.style.visibility = "";
+    }
+    if (!self.settings.selection.month || jumpDateMax.getFullYear() > self.dateMax.getFullYear() || jumpDateMax.getFullYear() === self.dateMax.getFullYear() && jumpDateMax.getMonth() > self.dateMax.getMonth()) {
+      arrowNext.style.visibility = "hidden";
+    } else {
+      arrowNext.style.visibility = "";
+    }
+  };
+  const yearControl = () => {
+    if (!self.dateMin || !self.dateMax || self.viewYear === void 0)
+      return;
+    if (self.dateMin.getFullYear() && self.viewYear - 7 <= self.dateMin.getFullYear()) {
+      arrowPrev.style.visibility = "hidden";
+    } else {
+      arrowPrev.style.visibility = "";
+    }
+    if (self.dateMax.getFullYear() && self.viewYear + 7 >= self.dateMax.getFullYear()) {
+      arrowNext.style.visibility = "hidden";
+    } else {
+      arrowNext.style.visibility = "";
+    }
+  };
+  if (self.currentType === "default" || self.currentType === "multiple")
+    defaultControl();
+  if (self.currentType === "year")
+    yearControl();
+};
+const createPopup = (self, daysEl) => {
+  if (!self.popups)
+    return;
+  Object.keys(self.popups).forEach((date) => {
+    var _a;
+    const dayBtnEl = daysEl.querySelector(`[data-calendar-day="${date}"]`);
+    if (dayBtnEl) {
+      const dayInfo = (_a = self.popups) == null ? void 0 : _a[date];
+      if (dayInfo == null ? void 0 : dayInfo.modifier)
+        dayInfo.modifier.trim().split(" ").forEach((cl) => {
+          dayBtnEl.classList.add(cl);
+        });
+      if (dayInfo == null ? void 0 : dayInfo.html)
+        dayBtnEl.parentNode.innerHTML += `<div class="${self.CSSClasses.dayPopup}">${dayInfo.html}</div>`;
+    }
+  });
+};
+const getWeekNumber = (date, iso8601) => {
+  if (!date)
+    return null;
+  const day = (/* @__PURE__ */ new Date(`${date}T00:00:00`)).getDate();
+  const month = (/* @__PURE__ */ new Date(`${date}T00:00:00`)).getMonth();
+  const year = (/* @__PURE__ */ new Date(`${date}T00:00:00`)).getFullYear();
+  const currentDate = new Date(year, month, day);
+  const dayNum = iso8601 ? currentDate.getDay() || 7 : currentDate.getDay();
+  currentDate.setDate(currentDate.getDate() + 4 - dayNum);
+  const yearStart = new Date(currentDate.getFullYear(), 0, 1);
+  const weekNumber = Math.ceil(((+currentDate - +yearStart) / 864e5 + 1) / 7);
+  return {
+    year,
+    week: weekNumber
+  };
+};
+const createWeekNumbers = (self, firstDayWeek, daysSelectedMonth, weekNumbersEl, daysEl) => {
+  if (!self.settings.visibility.weekNumbers)
+    return;
+  const dayEls = daysEl.querySelectorAll(`.${self.CSSClasses.day}`);
+  weekNumbersEl.innerHTML = "";
+  const countWeek = Math.ceil((firstDayWeek + daysSelectedMonth) / 7);
+  const weekNumbersTitleEl = document.createElement("b");
+  weekNumbersTitleEl.className = self.CSSClasses.weekNumbersTitle;
+  weekNumbersTitleEl.innerText = "#";
+  weekNumbersEl.append(weekNumbersTitleEl);
+  const weekNumbersContentEl = document.createElement("div");
+  weekNumbersContentEl.className = self.CSSClasses.weekNumbersContent;
+  weekNumbersEl.append(weekNumbersContentEl);
+  const templateWeekNumberEl = document.createElement("span");
+  templateWeekNumberEl.className = self.CSSClasses.weekNumber;
+  for (let i = 0; i < countWeek; i++) {
+    let dayBtnEl = null;
+    if (i === 0) {
+      dayBtnEl = dayEls[6].querySelector(`.${self.CSSClasses.dayBtn}`);
+    } else {
+      dayBtnEl = dayEls[i * 7].querySelector(`.${self.CSSClasses.dayBtn}`);
+    }
+    const weekNumber = getWeekNumber(dayBtnEl.dataset.calendarDay, self.settings.iso8601);
+    if (!weekNumber)
+      return;
+    const weekNumberEl = templateWeekNumberEl.cloneNode(true);
+    weekNumberEl.innerText = `${weekNumber.week}`;
+    weekNumberEl.dataset.calendarYearWeek = `${weekNumber.year}`;
+    weekNumbersContentEl.append(weekNumberEl);
+  }
+};
+const createDays = (self) => {
+  var _a, _b;
+  const daysEls = self.HTMLElement.querySelectorAll(`.${self.CSSClasses.days}`);
+  const weekNumbersEls = self.HTMLElement.querySelectorAll(`.${self.CSSClasses.weekNumbers}`);
+  const initDate = new Date(self.selectedYear, self.selectedMonth, 1);
+  const templateDayEl = document.createElement("div");
+  const templateDayBtnEl = document.createElement("button");
+  templateDayEl.className = self.CSSClasses.day;
+  templateDayBtnEl.className = self.CSSClasses.dayBtn;
+  templateDayBtnEl.type = "button";
+  (_a = self.selectedDates) == null ? void 0 : _a.sort((a, b) => +new Date(a) - +new Date(b));
+  daysEls.forEach((_, index) => {
+    const selectedMonth = new Date(initDate.setMonth(self.selectedMonth + index)).getMonth();
+    const selectedYear = new Date(initDate.setFullYear(self.selectedYear, self.selectedMonth + index)).getFullYear();
+    const firstDay = new Date(selectedYear, selectedMonth, 1);
+    const daysSelectedMonth = new Date(selectedYear, selectedMonth + 1, 0).getDate();
+    let firstDayWeek = Number(firstDay.getDay());
+    if (self.settings.iso8601)
+      firstDayWeek = Number((firstDay.getDay() !== 0 ? firstDay.getDay() : 7) - 1);
+    if (self.settings.selection.day && ["single", "multiple", "multiple-ranged"].includes(self.settings.selection.day)) {
+      daysEls[index].classList.add(self.CSSClasses.daysSelecting);
+    }
+    daysEls[index].innerHTML = "";
+    const setDayModifier = (dayEl, dayBtnEl, dayID, date, otherMonth) => {
+      if (self.rangeMin > date || self.rangeMax < date) {
+        dayBtnEl.classList.add(self.CSSClasses.dayBtnDisabled);
+        dayBtnEl.tabIndex = -1;
+      }
+      if (self.settings.visibility.weekend && (dayID === 0 || dayID === 6)) {
+        dayBtnEl.classList.add(self.CSSClasses.dayBtnWeekend);
+      }
+      if (Array.isArray(self.selectedHolidays)) {
+        self.selectedHolidays.forEach((holiday) => {
+          if (holiday === date) {
+            dayBtnEl.classList.add(self.CSSClasses.dayBtnHoliday);
+          }
+        });
+      }
+      let thisToday = self.date.today.getDate();
+      let thisMonth = self.date.today.getMonth() + 1;
+      thisToday = thisToday < 10 ? `0${thisToday}` : thisToday;
+      thisMonth = thisMonth < 10 ? `0${thisMonth}` : thisMonth;
+      const thisDay = `${self.date.today.getFullYear()}-${thisMonth}-${thisToday}`;
+      if (self.settings.visibility.today && dayBtnEl.dataset.calendarDay === thisDay) {
+        dayBtnEl.classList.add(self.CSSClasses.dayBtnToday);
+      }
+      if (self.selectedDates && self.selectedDates.indexOf(date) === 0) {
+        if (self.settings.selection.day === "multiple-ranged" && self.selectedDates.length > 1) {
+          dayEl.classList.add(self.CSSClasses.daySelectedFirst);
+        } else {
+          dayEl.classList.add(self.CSSClasses.daySelected);
+        }
+        dayBtnEl.classList.add(self.CSSClasses.dayBtnSelected);
+      } else if (self.selectedDates && self.selectedDates[0] && self.selectedDates.indexOf(date) === self.selectedDates.length - 1) {
+        dayEl.classList.add(self.CSSClasses.daySelected);
+        if (self.settings.selection.day === "multiple-ranged") {
+          dayEl.classList.add(self.CSSClasses.daySelectedLast);
+        } else {
+          dayEl.classList.add(self.CSSClasses.daySelected);
+        }
+        dayBtnEl.classList.add(self.CSSClasses.dayBtnSelected);
+      } else if (self.selectedDates && self.selectedDates.indexOf(date) > 0 && self.settings.selection.day === "multiple-ranged") {
+        dayEl.classList.add(self.CSSClasses.daySelectedIntermediate);
+        dayBtnEl.classList.add(self.CSSClasses.dayBtnSelected);
+        dayBtnEl.classList.add(self.CSSClasses.dayBtnIntermediate);
+      } else if (self.selectedDates && self.selectedDates.indexOf(date) > 0) {
+        dayEl.classList.add(self.CSSClasses.daySelected);
+        dayBtnEl.classList.add(self.CSSClasses.dayBtnSelected);
+      }
+      if (Array.isArray(self.rangeDisabled) && self.rangeDisabled[0]) {
+        self.rangeDisabled.forEach((dateDisabled) => {
+          if (dateDisabled === date) {
+            dayBtnEl.classList.add(self.CSSClasses.dayBtnDisabled);
+            dayBtnEl.tabIndex = -1;
+          }
+        });
+      }
+      if (!self.settings.selection.month && otherMonth) {
+        dayBtnEl.classList.add(self.CSSClasses.dayBtnDisabled);
+        dayBtnEl.tabIndex = -1;
+      }
+      if (!self.settings.selection.year && (/* @__PURE__ */ new Date(`${date}T00:00:00`)).getFullYear() !== selectedYear) {
+        dayBtnEl.classList.add(self.CSSClasses.dayBtnDisabled);
+        dayBtnEl.tabIndex = -1;
+      }
+    };
+    const createDay = (dayText, dayID, date, otherMonth, modifier) => {
+      var _a2, _b2, _c, _d, _e, _f, _g, _h, _i;
+      const dayEl = templateDayEl.cloneNode(true);
+      const dayBtnEl = templateDayBtnEl.cloneNode(true);
+      if (modifier)
+        dayBtnEl.classList.add(modifier);
+      dayBtnEl.innerText = dayText;
+      dayBtnEl.dataset.calendarDay = date;
+      if (self.settings.visibility.weekNumbers) {
+        const weekNumber = getWeekNumber(date, self.settings.iso8601);
+        if (!weekNumber)
+          return;
+        dayBtnEl.dataset.calendarWeekNumber = `${weekNumber.week}`;
+      }
+      if (((_a2 = self.rangeEnabled) == null ? void 0 : _a2[0]) && self.settings.range.disableAllDays && !((_b2 = self.rangeDisabled) == null ? void 0 : _b2.includes(date))) {
+        (_c = self.rangeDisabled) == null ? void 0 : _c.push(date);
+      }
+      if (((_d = self.rangeEnabled) == null ? void 0 : _d[0]) && ((_e = self.rangeDisabled) == null ? void 0 : _e.includes(date))) {
+        self.rangeDisabled = (_f = self.rangeDisabled) == null ? void 0 : _f.filter((d) => {
+          var _a3;
+          return !((_a3 = self.rangeEnabled) == null ? void 0 : _a3.includes(d));
+        });
+      }
+      if (((_g = self.settings.range.disableWeekday) == null ? void 0 : _g.includes(dayID)) && !((_h = self.rangeDisabled) == null ? void 0 : _h.includes(date))) {
+        (_i = self.rangeDisabled) == null ? void 0 : _i.push(date);
+      }
+      setDayModifier(dayEl, dayBtnEl, dayID, date, otherMonth);
+      if (otherMonth) {
+        if (self.settings.visibility.daysOutside)
+          dayEl.append(dayBtnEl);
+      } else {
+        dayEl.append(dayBtnEl);
+      }
+      daysEls[index].append(dayEl);
+      if (self.actions.getDays)
+        self.actions.getDays(Number(dayText), date, dayEl, dayBtnEl);
+    };
+    const prevMonth = () => {
+      const prevMonthDays = new Date(selectedYear, selectedMonth, 0).getDate();
+      let day = prevMonthDays - firstDayWeek;
+      let year = selectedYear;
+      let month = selectedMonth;
+      if (selectedMonth === 0) {
+        month = self.locale.months.length;
+        year = selectedYear - 1;
+      } else if (selectedMonth < 10) {
+        month = `0${selectedMonth}`;
+      }
+      for (let i = 0; i < firstDayWeek; i++) {
+        day += 1;
+        const date = `${year}-${month}-${day}`;
+        const dayIDCurrent = new Date(selectedYear, selectedMonth, day - 1);
+        const prevMonthID = dayIDCurrent.getMonth() - 1;
+        const dayID = new Date(selectedYear, prevMonthID, day).getDay();
+        createDay(String(day), dayID, date, true, self.CSSClasses.dayBtnPrev);
+      }
+    };
+    const currentMonth = () => {
+      for (let i = 1; i <= daysSelectedMonth; i++) {
+        const day = new Date(selectedYear, selectedMonth, i);
+        const date = generateDate(day);
+        const dayID = day.getDay();
+        createDay(String(i), dayID, date, false, null);
+      }
+    };
+    const nextMonth = () => {
+      const total = firstDayWeek + daysSelectedMonth;
+      const rows = Math.ceil(total / self.locale.weekday.length);
+      const nextDays = self.locale.weekday.length * rows - total;
+      let year = selectedYear;
+      let month = String(selectedMonth + 2);
+      if (selectedMonth + 1 === self.locale.months.length) {
+        month = "01";
+        year = selectedYear + 1;
+      } else if (selectedMonth + 2 < 10) {
+        month = `0${selectedMonth + 2}`;
+      }
+      for (let i = 1; i <= nextDays; i++) {
+        const day = i < 10 ? `0${i}` : String(i);
+        const date = `${year}-${month}-${day}`;
+        const dayIDCurrent = new Date(selectedYear, selectedMonth, i);
+        const nextMonthID = dayIDCurrent.getMonth() + 1;
+        const dayID = new Date(selectedYear, nextMonthID, i).getDay();
+        createDay(String(i), dayID, date, true, self.CSSClasses.dayBtnNext);
+      }
+    };
+    prevMonth();
+    currentMonth();
+    nextMonth();
+    createPopup(self, daysEls[index]);
+    createWeekNumbers(self, firstDayWeek, daysSelectedMonth, weekNumbersEls[index], daysEls[index]);
+  });
+  (_b = self.rangeDisabled) == null ? void 0 : _b.sort((a, b) => +new Date(a) - +new Date(b));
+};
+const ArrowPrev = (self) => `
+	<button type="button"
+		class="${self.CSSClasses.arrow} ${self.CSSClasses.arrowPrev}"
+		data-calendar-arrow="prev"
+		title="Prev">
+	</button>
+`;
+const ArrowNext = (self) => `
+	<button type="button"
+	class="${self.CSSClasses.arrow} ${self.CSSClasses.arrowNext}"
+	data-calendar-arrow="next"
+	title="Next">
+	</button>
+`;
+const Month = (self) => `
+	<button type="button"
+		class="${self.CSSClasses.month}"
+		data-calendar-selected-month>
+	</button>
+`;
+const Year = (self) => `
+	<button type="button"
+		class="${self.CSSClasses.year}"
+		data-calendar-selected-year>
+	</button>
+`;
+const Week = (self) => `
+	<div class="${self.CSSClasses.week}"></div>
+`;
+const Days = (self) => `
+	<div class="${self.CSSClasses.days}"></div>
+`;
+const Months = (self) => `
+	<div class="${self.CSSClasses.months}"></div>
+`;
+const Years = (self) => `
+	<div class="${self.CSSClasses.years}"></div>
+`;
+const WeekNumbers = (self) => self.settings.visibility.weekNumbers ? `
+	<div class="${self.CSSClasses.weekNumbers}"></div>
+` : "";
+const ControlTime = (self) => self.settings.selection.time ? `
+	<div class="${self.CSSClasses.time}"></div>
+` : "";
+const getComponent = (pattern) => {
+  let FC = null;
+  switch (pattern) {
+    case "ArrowPrev":
+      FC = ArrowPrev;
+      break;
+    case "ArrowNext":
+      FC = ArrowNext;
+      break;
+    case "Month":
+      FC = Month;
+      break;
+    case "Year":
+      FC = Year;
+      break;
+    case "Week":
+      FC = Week;
+      break;
+    case "Days":
+      FC = Days;
+      break;
+    case "Months":
+      FC = Months;
+      break;
+    case "Years":
+      FC = Years;
+      break;
+    case "WeekNumbers":
+      FC = WeekNumbers;
+      break;
+    case "ControlTime":
+      FC = ControlTime;
+      break;
+  }
+  return FC;
+};
+const DOMParser = (self, template) => template.replace(/<#(.*?)\/>/g, (_, p1) => {
+  const component = getComponent(p1.replace(/[\s\n\t]/g, ""));
+  return component ? component(self) : "";
+}).replace(/[\n\t]/g, "");
+const MultipleParser = (self, template) => template.replace(/<#Multiple>(.*?)<#\/Multiple>/g, (_, p1) => {
+  let content = "";
+  for (let i = 0; i < self.correctMonths; i++) {
+    content += p1;
+  }
+  return content;
+}).replace(/[\n\t]/g, "");
+const createDOM = (self, target) => {
+  const calendarElement = self.HTMLElement;
+  calendarElement.classList.add(self.CSSClasses.calendar);
+  const switcherTypeMultiple = (columnClass, DOMTemplates) => {
+    if (!target)
+      return;
+    const controls = self.HTMLElement.querySelector(`.${self.CSSClasses.controls}`);
+    if (controls)
+      self.HTMLElement.removeChild(controls);
+    const grid = self.HTMLElement.querySelector(`.${self.CSSClasses.grid}`);
+    grid.classList.add(self.CSSClasses.gridDisabled);
+    const columnElement = target.closest(`.${self.CSSClasses.column}`);
+    columnElement.classList.add(columnClass);
+    columnElement.innerHTML = DOMParser(self, DOMTemplates);
+  };
+  switch (self.currentType) {
+    case "default":
+      calendarElement.classList.add(self.CSSClasses.calendarDefault);
+      calendarElement.classList.remove(self.CSSClasses.calendarMonth);
+      calendarElement.classList.remove(self.CSSClasses.calendarYear);
+      calendarElement.innerHTML = DOMParser(self, self.DOMTemplates.default);
+      break;
+    case "multiple":
+      if (!self.correctMonths)
+        break;
+      calendarElement.classList.add(self.CSSClasses.calendarMultiple);
+      calendarElement.classList.remove(self.CSSClasses.calendarMonth);
+      calendarElement.classList.remove(self.CSSClasses.calendarYear);
+      calendarElement.innerHTML = MultipleParser(self, DOMParser(self, self.DOMTemplates.multiple));
+      break;
+    case "month":
+      if (self.type === "multiple") {
+        switcherTypeMultiple(self.CSSClasses.columnMonth, self.DOMTemplates.month);
+        break;
+      }
+      calendarElement.classList.remove(self.CSSClasses.calendarDefault);
+      calendarElement.classList.add(self.CSSClasses.calendarMonth);
+      calendarElement.classList.remove(self.CSSClasses.calendarYear);
+      calendarElement.innerHTML = DOMParser(self, self.DOMTemplates.month);
+      break;
+    case "year":
+      if (self.type === "multiple") {
+        switcherTypeMultiple(self.CSSClasses.columnYear, self.DOMTemplates.year);
+        break;
+      }
+      calendarElement.classList.remove(self.CSSClasses.calendarDefault);
+      calendarElement.classList.remove(self.CSSClasses.calendarMonth);
+      calendarElement.classList.add(self.CSSClasses.calendarYear);
+      calendarElement.innerHTML = DOMParser(self, self.DOMTemplates.year);
+      break;
+  }
+};
+const showMonth = (self) => {
+  const months = self.HTMLElement.querySelectorAll("[data-calendar-selected-month]");
+  if (!months[0] || self.selectedMonth === void 0)
+    return;
+  const initDate = new Date(self.selectedYear, self.selectedMonth, 1);
+  months.forEach((_, index) => {
+    const selectedMonth = new Date(initDate.setMonth(self.selectedMonth + index)).getMonth();
+    months[index].dataset.calendarSelectedMonth = String(selectedMonth);
+    months[index].innerText = self.locale.months[selectedMonth];
+    if (self.settings.selection.month === false || self.settings.selection.month === "only-arrows") {
+      months[index].tabIndex = -1;
+      months[index].classList.add(self.CSSClasses.monthDisabled);
+    } else {
+      months[index].tabIndex = 0;
+      months[index].classList.remove(self.CSSClasses.monthDisabled);
+    }
+  });
+};
+const showYear = (self) => {
+  const years = self.HTMLElement.querySelectorAll("[data-calendar-selected-year]");
+  if (!years || self.selectedMonth === void 0)
+    return;
+  const initDate = new Date(self.selectedYear, self.selectedMonth, 1);
+  years.forEach((_, index) => {
+    const selectedYear = new Date(initDate.setFullYear(self.selectedYear, self.selectedMonth + index)).getFullYear();
+    years[index].dataset.calendarSelectedYear = String(selectedYear);
+    years[index].innerText = String(selectedYear);
+    if (self.settings.selection.year === false || self.settings.selection.year === "only-arrows") {
+      years[index].tabIndex = -1;
+      years[index].classList.add(self.CSSClasses.yearDisabled);
+    } else {
+      years[index].tabIndex = 0;
+      years[index].classList.remove(self.CSSClasses.yearDisabled);
+    }
+  });
+};
+const createMonths = (self, target) => {
+  var _a;
+  const selectedMonth = (target == null ? void 0 : target.dataset.calendarSelectedMonth) ? Number(target.dataset.calendarSelectedMonth) : self.selectedMonth;
+  const yearEl = (_a = target == null ? void 0 : target.closest(`.${self.CSSClasses.column}`)) == null ? void 0 : _a.querySelector(`.${self.CSSClasses.year}`);
+  const selectedYear = yearEl ? Number(yearEl.dataset.calendarSelectedYear) : self.selectedYear;
+  self.currentType = "month";
+  createDOM(self, target);
+  showMonth(self);
+  showYear(self);
+  const monthsEl = self.HTMLElement.querySelector(`.${self.CSSClasses.months}`);
+  if (!self.dateMin || !self.dateMax || !monthsEl)
+    return;
+  if (self.settings.selection.month)
+    monthsEl.classList.add(self.CSSClasses.monthsSelecting);
+  const activeMonthsID = self.jumpMonths > 1 ? self.locale.months.map((_, i) => selectedMonth - self.jumpMonths * i).concat(self.locale.months.map((_, i) => selectedMonth + self.jumpMonths * i)).filter((monthID) => monthID >= 0 && monthID <= 12) : Array.from(Array(12).keys());
+  const templateMonthEl = document.createElement("button");
+  templateMonthEl.type = "button";
+  templateMonthEl.className = self.CSSClasses.monthsMonth;
+  const columnID = () => {
+    if (self.type !== "multiple")
+      return 0;
+    const columnEls = self.HTMLElement.querySelectorAll(`.${self.CSSClasses.column}`);
+    const indexColumn = [...columnEls].findIndex((column) => column.classList.contains(`${self.CSSClasses.columnMonth}`));
+    return indexColumn > 0 ? indexColumn : 0;
+  };
+  for (let i = 0; i < self.locale.months.length; i++) {
+    const month = self.locale.months[i];
+    const monthEl = templateMonthEl.cloneNode(true);
+    if (i === selectedMonth) {
+      monthEl.classList.add(self.CSSClasses.monthsMonthSelected);
+    }
+    if (i < self.dateMin.getMonth() + columnID() && selectedYear <= self.dateMin.getFullYear() || i > self.dateMax.getMonth() + columnID() && selectedYear >= self.dateMax.getFullYear() || i !== selectedMonth && !activeMonthsID.includes(i)) {
+      monthEl.classList.add(self.CSSClasses.monthsMonthDisabled);
+      monthEl.tabIndex = -1;
+    }
+    monthEl.dataset.calendarMonth = String(i);
+    monthEl.title = `${month}`;
+    monthEl.innerText = `${self.settings.visibility.monthShort ? month.substring(0, 3) : month}`;
+    monthsEl.append(monthEl);
+  }
+};
+const calendarInput = (self) => ({
+  hide() {
+    self.HTMLElement.classList.add(self.CSSClasses.calendarHidden);
+  },
+  show() {
+    self.HTMLElement.classList.remove(self.CSSClasses.calendarHidden);
+  },
+  HTMLInputElement: self.HTMLInputElement,
+  HTMLElement: self.HTMLElement
+});
+const transformTime24 = (hour, keeping) => {
+  const oldHour = Number(hour);
+  let newHour = String(oldHour);
+  if (keeping === "AM") {
+    if (oldHour === 12) {
+      newHour = "00";
+    }
+  } else if (keeping === "PM") {
+    if (oldHour === 1) {
+      newHour = "13";
+    } else if (oldHour === 2) {
+      newHour = "14";
+    } else if (oldHour === 3) {
+      newHour = "15";
+    } else if (oldHour === 4) {
+      newHour = "16";
+    } else if (oldHour === 5) {
+      newHour = "17";
+    } else if (oldHour === 6) {
+      newHour = "18";
+    } else if (oldHour === 7) {
+      newHour = "19";
+    } else if (oldHour === 8) {
+      newHour = "20";
+    } else if (oldHour === 9) {
+      newHour = "21";
+    } else if (oldHour === 10) {
+      newHour = "22";
+    } else if (oldHour === 11) {
+      newHour = "23";
+    }
+  }
+  return newHour;
+};
+const controlTime = (self, keepingTime) => {
+  const rangeHours = self.HTMLElement.querySelector(`.${self.CSSClasses.timeRange} input[name="hours"]`);
+  const rangeMinutes = self.HTMLElement.querySelector(`.${self.CSSClasses.timeRange} input[name="minutes"]`);
+  const inputHours = self.HTMLElement.querySelector(`.${self.CSSClasses.timeHours} input[name="hours"]`);
+  const inputMinutes = self.HTMLElement.querySelector(`.${self.CSSClasses.timeMinutes} input[name="minutes"]`);
+  const btnKeepingTime = self.HTMLElement.querySelector(`.${self.CSSClasses.timeKeeping}`);
+  const mouseoverRange = (range, input) => {
+    range.addEventListener("mouseover", () => input.classList.add(self.CSSClasses.isFocus));
+  };
+  const mouseoutRange = (range, input) => {
+    range.addEventListener("mouseout", () => input.classList.remove(self.CSSClasses.isFocus));
+  };
+  const setTime = (e, value, type) => {
+    if (type === "hours") {
+      self.selectedHours = `${value}`;
+    } else if (type === "minutes") {
+      self.selectedMinutes = `${value}`;
+    }
+    self.selectedTime = `${self.selectedHours}:${self.selectedMinutes}${self.selectedKeeping ? ` ${self.selectedKeeping}` : ""}`;
+    if (self.actions.changeTime) {
+      self.actions.changeTime(e, self.selectedTime, self.selectedHours, self.selectedMinutes, self.selectedKeeping);
+    }
+    if (self.input && self.HTMLInputElement && self.actions.changeToInput) {
+      self.actions.changeToInput(
+        e,
+        calendarInput(self),
+        self.selectedDates,
+        self.selectedTime,
+        self.selectedHours,
+        self.selectedMinutes,
+        self.selectedKeeping
+      );
+    }
+  };
+  const changeRange = (range, input, type, max) => {
+    range.addEventListener("input", (e) => {
+      let value = Number(e.target.value);
+      value = value < 10 ? `0${value}` : `${value}`;
+      if (type === "hours" && max === 12) {
+        if (Number(e.target.value) < max && Number(e.target.value) > 0) {
+          input.value = value;
+          self.selectedKeeping = "AM";
+          btnKeepingTime.innerText = self.selectedKeeping;
+          setTime(e, value, type);
+        } else {
+          if (Number(e.target.value) === 0) {
+            self.selectedKeeping = "AM";
+            btnKeepingTime.innerText = "AM";
+          } else {
+            self.selectedKeeping = "PM";
+            btnKeepingTime.innerText = "PM";
+          }
+          input.value = transformTime12(e.target.value);
+          setTime(e, transformTime12(e.target.value), type);
+        }
+      } else {
+        input.value = value;
+        setTime(e, value, type);
+      }
+    });
+  };
+  const changeInput = (range, input, type, max) => {
+    input.addEventListener("change", (e) => {
+      const changeInputEl = e.target;
+      let value = Number(changeInputEl.value);
+      value = value < 10 ? `0${value}` : `${value}`;
+      if (type === "hours" && max === 12) {
+        if (changeInputEl.value && Number(changeInputEl.value) <= max && Number(changeInputEl.value) > 0) {
+          changeInputEl.value = value;
+          range.value = transformTime24(value, self.selectedKeeping);
+          setTime(e, value, type);
+        } else if (changeInputEl.value && Number(changeInputEl.value) < 24 && (Number(changeInputEl.value) > max || Number(changeInputEl.value) === 0)) {
+          if (Number(changeInputEl.value) === 0) {
+            self.selectedKeeping = "AM";
+            btnKeepingTime.innerText = "AM";
+          } else {
+            self.selectedKeeping = "PM";
+            btnKeepingTime.innerText = "PM";
+          }
+          changeInputEl.value = transformTime12(changeInputEl.value);
+          range.value = value;
+          setTime(e, transformTime12(changeInputEl.value), type);
+        } else {
+          changeInputEl.value = self.selectedHours;
+        }
+      } else if (changeInputEl.value && Number(changeInputEl.value) <= max && Number(changeInputEl.value) >= 0) {
+        changeInputEl.value = value;
+        range.value = value;
+        setTime(e, value, type);
+      } else if (type === "hours") {
+        changeInputEl.value = self.selectedHours;
+      } else if (type === "minutes") {
+        changeInputEl.value = self.selectedMinutes;
+      }
+    });
+  };
+  mouseoverRange(rangeHours, inputHours);
+  mouseoverRange(rangeMinutes, inputMinutes);
+  mouseoutRange(rangeHours, inputHours);
+  mouseoutRange(rangeMinutes, inputMinutes);
+  changeRange(rangeHours, inputHours, "hours", keepingTime === 24 ? 23 : 12);
+  changeRange(rangeMinutes, inputMinutes, "minutes", 0);
+  changeInput(rangeHours, inputHours, "hours", keepingTime === 24 ? 23 : 12);
+  changeInput(rangeMinutes, inputMinutes, "minutes", 59);
+  if (!btnKeepingTime)
+    return;
+  btnKeepingTime.addEventListener("click", (e) => {
+    if (btnKeepingTime.innerText.includes("AM")) {
+      self.selectedKeeping = "PM";
+    } else {
+      self.selectedKeeping = "AM";
+    }
+    rangeHours.value = transformTime24(self.selectedHours, self.selectedKeeping);
+    setTime(e, self.selectedHours, "hours");
+    btnKeepingTime.innerText = self.selectedKeeping;
+  });
+};
+const createTime = (self) => {
+  const timeEl = self.HTMLElement.querySelector(`.${self.CSSClasses.time}`);
+  if (!timeEl)
+    return;
+  const keepingTime = self.settings.selection.time === true ? 12 : self.settings.selection.time;
+  const range = self.settings.selection.controlTime === "range";
+  timeEl.innerHTML = `
+	<div class="${self.CSSClasses.timeContent}">
+		<label class="${self.CSSClasses.timeHours}">
+			<input type="text"
+				name="hours"
+				maxlength="2"
+				value="${self.selectedHours}"
+				${range ? "disabled" : ""}>
+		</label>
+		<label class="${self.CSSClasses.timeMinutes}">
+			<input type="text"
+				name="minutes"
+				maxlength="2"
+				value="${self.selectedMinutes}"
+				${range ? "disabled" : ""}>
+		</label>
+		${keepingTime === 12 ? `
+		<button type="button"
+			class="${self.CSSClasses.timeKeeping}"
+			${range ? "disabled" : ""}>${self.selectedKeeping}</button>
+		` : ""}
+	</div>
+	<div class="${self.CSSClasses.timeRanges}">
+		<label class="${self.CSSClasses.timeRange}">
+			<input type="range"
+				name="hours"
+				min="0"
+				max="23"
+				step="${self.settings.selection.stepHours}"
+				value="${self.selectedKeeping ? transformTime24(self.selectedHours, self.selectedKeeping) : self.selectedHours}">
+		</label>
+		<label class="${self.CSSClasses.timeRange}">
+			<input type="range"
+				name="minutes"
+				min="0"
+				max="59"
+				step="${self.settings.selection.stepMinutes}"
+				value="${self.selectedMinutes}">
+		</label>
+	</div>`;
+  controlTime(self, keepingTime);
+};
+const createWeek = (self) => {
+  const weekday = [...self.locale.weekday];
+  if (!weekday[0])
+    return;
+  const weekEls = self.HTMLElement.querySelectorAll(`.${self.CSSClasses.week}`);
+  const templateWeekDayEl = document.createElement("b");
+  templateWeekDayEl.className = self.CSSClasses.weekDay;
+  if (self.settings.iso8601)
+    weekday.push(weekday.shift());
+  weekEls.forEach((weekEl) => {
+    weekEl.innerHTML = "";
+    for (let i = 0; i < weekday.length; i++) {
+      const weekDayName = weekday[i];
+      const weekDayEl = templateWeekDayEl.cloneNode(true);
+      if (self.settings.visibility.weekend && self.settings.iso8601) {
+        if (i === 5 || i === 6) {
+          weekDayEl.classList.add(self.CSSClasses.weekDayWeekend);
+        }
+      } else if (self.settings.visibility.weekend && !self.settings.iso8601) {
+        if (i === 0 || i === 6) {
+          weekDayEl.classList.add(self.CSSClasses.weekDayWeekend);
+        }
+      }
+      weekDayEl.innerText = `${weekDayName}`;
+      weekEl.append(weekDayEl);
+    }
+  });
+};
+const createYears = (self, target) => {
+  if (self.viewYear === void 0 || !self.dateMin || !self.dateMax)
+    return;
+  const selectedYear = (target == null ? void 0 : target.dataset.calendarSelectedYear) ? Number(target == null ? void 0 : target.dataset.calendarSelectedYear) : self.selectedYear;
+  self.currentType = "year";
+  createDOM(self, target);
+  showMonth(self);
+  showYear(self);
+  controlArrows(self);
+  const yearsEl = self.HTMLElement.querySelector(`.${self.CSSClasses.years}`);
+  if (!yearsEl)
+    return;
+  if (self.settings.selection.year)
+    yearsEl.classList.add(self.CSSClasses.yearsSelecting);
+  const templateYearEl = document.createElement("button");
+  templateYearEl.type = "button";
+  templateYearEl.className = self.CSSClasses.yearsYear;
+  const relationshipID = () => {
+    if (self.type !== "multiple")
+      return 0;
+    return self.selectedYear === selectedYear ? 0 : 1;
+  };
+  for (let i = self.viewYear - 7; i < self.viewYear + 8; i++) {
+    const year = i;
+    const yearEl = templateYearEl.cloneNode(true);
+    if (year === selectedYear) {
+      yearEl.classList.add(self.CSSClasses.yearsYearSelected);
+    }
+    if (year < self.dateMin.getFullYear() + relationshipID() || year > self.dateMax.getFullYear()) {
+      yearEl.classList.add(self.CSSClasses.yearsYearDisabled);
+      yearEl.tabIndex = -1;
+    }
+    yearEl.dataset.calendarYear = String(year);
+    yearEl.innerText = `${year}`;
+    yearsEl.append(yearEl);
+  }
+};
+const getLocale = (self) => {
+  if (self.settings.lang === "define")
+    return;
+  self.locale.weekday = [];
+  for (let i = 0; i < 7; i++) {
+    let weekday = new Date(0, 0, i).toLocaleString(self.settings.lang, { weekday: "short" });
+    weekday = `${weekday.charAt(0).toUpperCase()}${weekday.substring(1, weekday.length)}`;
+    weekday = weekday.replace(/\./, "");
+    self.locale.weekday.push(weekday);
+  }
+  self.locale.months = [];
+  for (let i = 0; i < 12; i++) {
+    let month = new Date(0, i).toLocaleString(self.settings.lang, { month: "long" });
+    month = `${month.charAt(0).toUpperCase()}${month.substring(1, month.length)}`;
+    month = month.replace(/\./, "");
+    self.locale.months.push(month);
+  }
+};
+const themes = ["light", "dark", "system"];
+let haveListener = false;
+const getActiveTheme = (htmlEl, attr) => {
+  var _a;
+  let activeTheme = null;
+  for (let i = 0; i < themes.length; i++) {
+    const theme = themes[i];
+    if (theme === "system")
+      return;
+    if ((_a = htmlEl.getAttribute(attr)) == null ? void 0 : _a.includes(themes[i])) {
+      activeTheme = themes[i];
+      break;
+    }
+  }
+  return activeTheme;
+};
+const set = (self, theme) => {
+  if (!self.HTMLElement)
+    return;
+  if (themes.includes(theme)) {
+    self.HTMLElement.dataset.calendarTheme = theme;
+    return;
+  }
+  console.error("Incorrect name of theme in settings.visibility.theme");
+};
+const get = (self, supportDarkTheme) => {
+  if (!supportDarkTheme) {
+    set(self, "light");
+    return;
+  }
+  const theme = (e) => e.matches ? "dark" : "light";
+  self.HTMLElement.dataset.calendarTheme = theme(supportDarkTheme);
+  if (!haveListener) {
+    supportDarkTheme.onchange = (e) => {
+      if (self.settings.visibility.theme !== "system")
+        return;
+      self.HTMLElement.dataset.calendarTheme = theme(e);
+    };
+    haveListener = true;
+  }
+};
+const track = (self, htmlEl, attr) => {
+  const changes = (mutationsList) => {
+    for (let i = 0; i < mutationsList.length; i++) {
+      const record = mutationsList[i];
+      if (record.attributeName === attr) {
+        const activeTheme = getActiveTheme(htmlEl, attr);
+        if (activeTheme)
+          set(self, activeTheme);
+        break;
+      }
+    }
+  };
+  const observer = new MutationObserver(changes);
+  observer.observe(htmlEl, {
+    attributes: true
+  });
+};
+const detect = (self, supportDarkTheme) => {
+  if (!self.HTMLElement)
+    return;
+  const detectedThemeEl = self.settings.visibility.themeDetect ? document.querySelector(self.settings.visibility.themeDetect) : false;
+  if (!detectedThemeEl) {
+    get(self, supportDarkTheme);
+    return;
+  }
+  const attr = self.settings.visibility.themeDetect.replace(/^.*\[(.+)\]/g, (_, p1) => p1);
+  const strValues = detectedThemeEl.hasAttribute(attr);
+  if (!attr || !strValues) {
+    get(self, supportDarkTheme);
+    return;
+  }
+  const activeTheme = getActiveTheme(detectedThemeEl, attr);
+  if (activeTheme) {
+    set(self, activeTheme);
+    track(self, detectedThemeEl, attr);
+  } else {
+    get(self, supportDarkTheme);
+  }
+};
+const setTheme = (self) => {
+  if (!self.HTMLElement)
+    return;
+  let supportDarkTheme;
+  if (window.matchMedia("(prefers-color-scheme)").media !== "not all") {
+    supportDarkTheme = window.matchMedia("(prefers-color-scheme: dark)");
+  }
+  if (self.settings.visibility.theme === "system") {
+    detect(self, supportDarkTheme);
+  } else {
+    set(self, self.settings.visibility.theme);
+  }
+};
+const mainMethod = (self) => {
+  const typeMapper = {
+    default() {
+      createWeek(self);
+      createDays(self);
+    },
+    multiple() {
+      createWeek(self);
+      createDays(self);
+    },
+    month() {
+      createMonths(self);
+    },
+    year() {
+      createYears(self);
+    }
+  };
+  setTheme(self);
+  getLocale(self);
+  createDOM(self);
+  showMonth(self);
+  showYear(self);
+  controlArrows(self);
+  createTime(self);
+  typeMapper[self.currentType]();
+};
+const resetCalendar = (self) => {
+  setVariablesDates(self);
+  mainMethod(self);
+};
+const updateCalendar = (self) => {
+  var _a;
+  let tempSelectedDates = null;
+  let tempSelectedMonth = null;
+  let tempSelectedYear = null;
+  if (!((_a = self.settings.selected.dates) == null ? void 0 : _a[0])) {
+    tempSelectedDates = self.settings.selected.dates;
+    self.settings.selected.dates = self.selectedDates;
+  }
+  if (!self.settings.selected.month) {
+    tempSelectedMonth = self.settings.selected.month;
+    self.settings.selected.month = self.selectedMonth;
+  }
+  if (!self.settings.selected.year) {
+    tempSelectedYear = self.settings.selected.year;
+    self.settings.selected.year = self.selectedYear;
+  }
+  setVariablesDates(self);
+  mainMethod(self);
+  self.settings.selected.dates = tempSelectedDates;
+  self.settings.selected.month = tempSelectedMonth;
+  self.settings.selected.year = tempSelectedYear;
+};
+const changeMonth = (self, route) => {
+  if (self.selectedMonth === void 0 || self.selectedYear === void 0)
+    return;
+  const jumpDate = /* @__PURE__ */ new Date(`${generateDate(new Date(self.selectedYear, self.selectedMonth, 1))}T00:00:00`);
+  switch (route) {
+    case "prev":
+      jumpDate.setMonth(jumpDate.getMonth() - self.jumpMonths);
+      break;
+    case "next":
+      jumpDate.setMonth(jumpDate.getMonth() + self.jumpMonths);
+      break;
+  }
+  self.selectedMonth = jumpDate.getMonth();
+  self.selectedYear = jumpDate.getFullYear();
+  showMonth(self);
+  showYear(self);
+  controlArrows(self);
+  createDays(self);
+};
+let currentSelf$1 = null;
+const removeHover = () => {
+  var _a;
+  if (!currentSelf$1)
+    return;
+  const daysEl = (_a = currentSelf$1.HTMLElement) == null ? void 0 : _a.querySelectorAll(`.${currentSelf$1.CSSClasses.dayBtnHover}`);
+  if (daysEl)
+    daysEl.forEach((d) => d.classList.remove(currentSelf$1.CSSClasses.dayBtnHover));
+};
+const addHover = (day) => {
+  var _a;
+  if (!currentSelf$1 || !currentSelf$1.selectedDates)
+    return;
+  const date = generateDate(day);
+  if (currentSelf$1.rangeDisabled && currentSelf$1.rangeDisabled.includes(date))
+    return;
+  const dayEls = (_a = currentSelf$1.HTMLElement) == null ? void 0 : _a.querySelectorAll(`[data-calendar-day="${date}"]`);
+  dayEls == null ? void 0 : dayEls.forEach((dayEl) => {
+    dayEl.classList.add(currentSelf$1.CSSClasses.dayBtnHover);
+  });
+};
+const hoverDaysEvent = (e) => {
+  if (!e.target || !currentSelf$1 || !currentSelf$1.selectedDates)
+    return;
+  if (!e.target.closest(`.${currentSelf$1.CSSClasses.days}`)) {
+    removeHover();
+    return;
+  }
+  const date = e.target.dataset.calendarDay;
+  if (!date)
+    return;
+  removeHover();
+  const startDate = new Date(
+    (/* @__PURE__ */ new Date(`${currentSelf$1.selectedDates[0]}T00:00:00`)).getFullYear(),
+    (/* @__PURE__ */ new Date(`${currentSelf$1.selectedDates[0]}T00:00:00`)).getMonth(),
+    (/* @__PURE__ */ new Date(`${currentSelf$1.selectedDates[0]}T00:00:00`)).getDate()
+  );
+  const endDate = new Date(
+    (/* @__PURE__ */ new Date(`${date}T00:00:00`)).getFullYear(),
+    (/* @__PURE__ */ new Date(`${date}T00:00:00`)).getMonth(),
+    (/* @__PURE__ */ new Date(`${date}T00:00:00`)).getDate()
+  );
+  if (endDate > startDate) {
+    for (let i = startDate; i <= endDate; i.setDate(i.getDate() + 1)) {
+      addHover(i);
+    }
+  } else {
+    for (let i = startDate; i >= endDate; i.setDate(i.getDate() - 1)) {
+      addHover(i);
+    }
+  }
+};
+const cancelSelectionDays = (e) => {
+  if (!currentSelf$1 || e.key !== "Escape")
+    return;
+  currentSelf$1.selectedDates = [];
+  currentSelf$1.HTMLElement.removeEventListener("mousemove", hoverDaysEvent);
+  document.removeEventListener("keydown", cancelSelectionDays);
+  mainMethod(currentSelf$1);
+};
+const setDisabledDates = () => {
+  var _a;
+  if (!currentSelf$1 || !((_a = currentSelf$1.selectedDates) == null ? void 0 : _a[0]) || !currentSelf$1.rangeDisabled || currentSelf$1.rangeDisabled.length < 2)
+    return;
+  const selectedDate = /* @__PURE__ */ new Date(`${currentSelf$1.selectedDates[0]}T00:00:00`);
+  let startDate = null;
+  let endDate = null;
+  for (let index = 0; index < currentSelf$1.rangeDisabled.length; index++) {
+    const disabledDate = /* @__PURE__ */ new Date(`${currentSelf$1.rangeDisabled[index]}T00:00:00`);
+    if (selectedDate >= disabledDate) {
+      startDate = disabledDate;
+    } else {
+      endDate = disabledDate;
+      break;
+    }
+  }
+  if (startDate) {
+    startDate = new Date(startDate.setDate(startDate.getDate() + 1));
+    currentSelf$1.rangeMin = generateDate(startDate);
+  }
+  if (endDate) {
+    endDate = new Date(endDate.setDate(endDate.getDate() - 1));
+    currentSelf$1.rangeMax = generateDate(endDate);
+  }
+};
+const resetDisabledDates = () => {
+  if (!currentSelf$1)
+    return;
+  currentSelf$1.rangeMin = currentSelf$1.settings.range.min;
+  currentSelf$1.rangeMax = currentSelf$1.settings.range.max;
+  if (currentSelf$1.settings.range.disablePast && /* @__PURE__ */ new Date(`${currentSelf$1.settings.range.min}T00:00:00`) < currentSelf$1.date.today) {
+    currentSelf$1.rangeMin = generateDate(currentSelf$1.date.today);
+  }
+};
+const handlerMultipleRanged = (self) => {
+  if (!self || !self.selectedDates)
+    return;
+  currentSelf$1 = self;
+  if (self.selectedDates[0] && self.selectedDates.length <= 1) {
+    self.HTMLElement.addEventListener("mousemove", hoverDaysEvent);
+    document.addEventListener("keydown", cancelSelectionDays);
+    if (self.settings.range.disableGaps)
+      setDisabledDates();
+  } else {
+    self.HTMLElement.removeEventListener("mousemove", hoverDaysEvent);
+    document.removeEventListener("keydown", cancelSelectionDays);
+    if (self.settings.range.disableGaps)
+      resetDisabledDates();
+  }
+};
+const getColumnID = (self, columnClass, personalClass, id, dataAttr) => {
+  const columnEls = self.HTMLElement.querySelectorAll(`.${self.CSSClasses.column}`);
+  const indexColumn = [...columnEls].findIndex((column) => column.classList.contains(columnClass));
+  const currentValue = Number(columnEls[indexColumn].querySelector(`.${personalClass}`).getAttribute(dataAttr));
+  if (self.currentType === "month" && indexColumn >= 0)
+    return id - indexColumn;
+  if (self.currentType === "year" && self.selectedYear !== currentValue)
+    return id - 1;
+  return id;
+};
+const clickCalendar = (self) => {
+  self.HTMLElement.addEventListener("click", (e) => {
+    const element = e.target;
+    const arrowEl = element.closest(`.${self.CSSClasses.arrow}`);
+    const arrowPrevEl = element.closest(`.${self.CSSClasses.arrowPrev}`);
+    const arrowNextEl = element.closest(`.${self.CSSClasses.arrowNext}`);
+    const dayBtnEl = element.closest(`.${self.CSSClasses.dayBtn}`);
+    const dayBtnPrevEl = element.closest(`.${self.CSSClasses.dayBtnPrev}`);
+    const dayBtnNextEl = element.closest(`.${self.CSSClasses.dayBtnNext}`);
+    const weekNumberEl = element.closest(`.${self.CSSClasses.weekNumber}`);
+    const yearHeaderEl = element.closest(`.${self.CSSClasses.year}`);
+    const yearItemEl = element.closest(`.${self.CSSClasses.yearsYear}`);
+    const monthHeaderEl = element.closest(`.${self.CSSClasses.month}`);
+    const monthItemEl = element.closest(`.${self.CSSClasses.monthsMonth}`);
+    const gridEl = element.closest(`.${self.CSSClasses.grid}`);
+    const columnEl = element.closest(`.${self.CSSClasses.column}`);
+    const clickArrowMonth = () => {
+      if (arrowEl && self.currentType !== "year" && self.currentType !== "month") {
+        changeMonth(self, element.dataset.calendarArrow);
+      }
+      if (arrowEl) {
+        if (self.actions.clickArrow)
+          self.actions.clickArrow(e, Number(self.selectedYear), Number(self.selectedMonth));
+      }
+    };
+    const clickDaySingle = () => {
+      if (!self.selectedDates || !dayBtnEl || !dayBtnEl.dataset.calendarDay)
+        return;
+      if (dayBtnEl.classList.contains(self.CSSClasses.dayBtnSelected)) {
+        self.selectedDates.splice(self.selectedDates.indexOf(dayBtnEl.dataset.calendarDay), 1);
+      } else {
+        self.selectedDates = [];
+        self.selectedDates.push(dayBtnEl.dataset.calendarDay);
+      }
+    };
+    const clickDayMultiple = () => {
+      if (!self.selectedDates || !dayBtnEl || !dayBtnEl.dataset.calendarDay)
+        return;
+      if (dayBtnEl.classList.contains(self.CSSClasses.dayBtnSelected)) {
+        self.selectedDates.splice(self.selectedDates.indexOf(dayBtnEl.dataset.calendarDay), 1);
+      } else {
+        self.selectedDates.push(dayBtnEl.dataset.calendarDay);
+      }
+    };
+    const clickDayMultipleRanged = () => {
+      if (!self.selectedDates || !dayBtnEl || !dayBtnEl.dataset.calendarDay)
+        return;
+      if (self.selectedDates.length <= 1 && self.selectedDates[0] && self.selectedDates[0].includes(dayBtnEl.dataset.calendarDay)) {
+        self.selectedDates = [];
+      } else {
+        if (self.selectedDates.length > 1)
+          self.selectedDates = [];
+        self.selectedDates.push(dayBtnEl.dataset.calendarDay);
+      }
+      if (self.selectedDates[1]) {
+        const startDate = new Date(
+          (/* @__PURE__ */ new Date(`${self.selectedDates[0]}T00:00:00`)).getFullYear(),
+          (/* @__PURE__ */ new Date(`${self.selectedDates[0]}T00:00:00`)).getMonth(),
+          (/* @__PURE__ */ new Date(`${self.selectedDates[0]}T00:00:00`)).getDate()
+        );
+        const endDate = new Date(
+          (/* @__PURE__ */ new Date(`${self.selectedDates[1]}T00:00:00`)).getFullYear(),
+          (/* @__PURE__ */ new Date(`${self.selectedDates[1]}T00:00:00`)).getMonth(),
+          (/* @__PURE__ */ new Date(`${self.selectedDates[1]}T00:00:00`)).getDate()
+        );
+        const addSelectedDate = (day) => {
+          if (!self.selectedDates)
+            return;
+          const date = generateDate(day);
+          if (self.rangeDisabled && self.rangeDisabled.includes(date))
+            return;
+          self.selectedDates.push(date);
+        };
+        self.selectedDates = [];
+        if (endDate > startDate) {
+          for (let i = startDate; i <= endDate; i.setDate(i.getDate() + 1)) {
+            addSelectedDate(i);
+          }
+        } else {
+          for (let i = startDate; i >= endDate; i.setDate(i.getDate() - 1)) {
+            addSelectedDate(i);
+          }
+        }
+      }
+      handlerMultipleRanged(self);
+    };
+    const clickDay = () => {
+      if (self.settings.selection.day && ["single", "multiple", "multiple-ranged"].includes(self.settings.selection.day) && dayBtnEl) {
+        switch (self.settings.selection.day) {
+          case "single":
+            clickDaySingle();
+            break;
+          case "multiple":
+            clickDayMultiple();
+            break;
+          case "multiple-ranged":
+            clickDayMultipleRanged();
+            break;
+        }
+        if (self.actions.clickDay)
+          self.actions.clickDay(e, self.selectedDates);
+        if (self.input && self.HTMLInputElement && self.HTMLElement && self.actions.changeToInput) {
+          self.actions.changeToInput(
+            e,
+            calendarInput(self),
+            self.selectedDates,
+            self.selectedTime,
+            self.selectedHours,
+            self.selectedMinutes,
+            self.selectedKeeping
+          );
+        }
+        if (dayBtnPrevEl) {
+          changeMonth(self, "prev");
+        } else if (dayBtnNextEl) {
+          changeMonth(self, "next");
+        } else {
+          createDays(self);
+        }
+      }
+    };
+    const clickWeekNumber = () => {
+      var _a;
+      if (!self.settings.visibility.weekNumbers || !weekNumberEl || !self.actions.clickWeekNumber)
+        return;
+      const daysToWeeks = (_a = self.HTMLElement) == null ? void 0 : _a.querySelectorAll("[data-calendar-week-number]");
+      if (!daysToWeeks)
+        return;
+      const weekNumberValue = Number(weekNumberEl.innerText);
+      const yearWeek = Number(weekNumberEl.dataset.calendarYearWeek);
+      const daysOfThisWeek = [...daysToWeeks].filter((day) => Number(day.dataset.calendarWeekNumber) === weekNumberValue);
+      self.actions.clickWeekNumber(e, weekNumberValue, daysOfThisWeek, yearWeek);
+    };
+    const clickYear = () => {
+      if (!self.settings.selection.year)
+        return;
+      if (arrowEl && self.currentType === "year") {
+        if (self.viewYear === void 0)
+          return;
+        if (arrowNextEl) {
+          self.viewYear += 15;
+        } else if (arrowPrevEl) {
+          self.viewYear -= 15;
+        }
+        createYears(self, e.target);
+      } else if (self.currentType !== "year" && yearHeaderEl) {
+        createYears(self, e.target);
+      } else if (self.currentType === "year" && yearHeaderEl) {
+        self.currentType = self.type;
+        mainMethod(self);
+      } else if (yearItemEl) {
+        if (self.selectedMonth === void 0 || !self.dateMin || !self.dateMax)
+          return;
+        self.selectedYear = self.type === "multiple" ? getColumnID(self, self.CSSClasses.columnYear, self.CSSClasses.year, Number(yearItemEl.dataset.calendarYear), "data-calendar-selected-year") : Number(yearItemEl.dataset.calendarYear);
+        self.currentType = self.type;
+        if (self.selectedMonth < self.dateMin.getMonth() && self.selectedYear <= self.dateMin.getFullYear() || self.selectedYear < self.dateMin.getFullYear()) {
+          self.selectedMonth = self.dateMin.getMonth();
+          self.selectedYear = self.dateMin.getFullYear();
+        }
+        if (self.selectedMonth > self.dateMax.getMonth() && self.selectedYear >= self.dateMax.getFullYear() || self.selectedYear > self.dateMax.getFullYear()) {
+          self.selectedMonth = self.dateMax.getMonth();
+          self.selectedYear = self.dateMax.getFullYear();
+        }
+        if (self.actions.clickYear)
+          self.actions.clickYear(e, self.selectedYear);
+        mainMethod(self);
+      } else if (self.type === "multiple" && self.currentType === "year" && gridEl && !columnEl) {
+        self.currentType = self.type;
+        mainMethod(self);
+      }
+    };
+    const clickMonth = () => {
+      if (!self.settings.selection.month)
+        return;
+      if (self.currentType !== "month" && monthHeaderEl) {
+        createMonths(self, e.target);
+      } else if (self.currentType === "month" && monthHeaderEl) {
+        self.currentType = self.type;
+        mainMethod(self);
+      } else if (monthItemEl) {
+        if (self.selectedMonth === void 0 || !self.dateMin || !self.dateMax)
+          return;
+        self.selectedMonth = self.type === "multiple" ? getColumnID(self, self.CSSClasses.columnMonth, self.CSSClasses.month, Number(monthItemEl.dataset.calendarMonth), "data-calendar-selected-month") : Number(monthItemEl.dataset.calendarMonth);
+        if (self.type === "multiple") {
+          const column = monthItemEl.closest(`.${self.CSSClasses.columnMonth}`);
+          const year = column.querySelector(`.${self.CSSClasses.year}`);
+          self.selectedYear = Number(year.dataset.calendarSelectedYear);
+          if (self.selectedMonth < self.dateMin.getMonth() && self.selectedYear <= self.dateMin.getFullYear()) {
+            self.selectedMonth = self.dateMin.getMonth();
+          }
+          if (self.selectedMonth > self.dateMax.getMonth() && self.selectedYear >= self.dateMax.getFullYear()) {
+            self.selectedMonth = self.dateMax.getMonth();
+          }
+        }
+        self.currentType = self.type;
+        if (self.actions.clickMonth)
+          self.actions.clickMonth(e, self.selectedMonth);
+        mainMethod(self);
+      } else if (self.type === "multiple" && self.currentType === "month" && gridEl && !columnEl) {
+        self.currentType = self.type;
+        mainMethod(self);
+      }
+    };
+    clickArrowMonth();
+    clickDay();
+    clickWeekNumber();
+    clickYear();
+    clickMonth();
+  });
+};
+let currentSelf = null;
+const setPositionCalendar = (input, calendar) => {
+  let top = input.offsetHeight;
+  let left = 0;
+  for (let el = input; el; el = el.offsetParent) {
+    top += el.offsetTop || 0;
+    left += el.offsetLeft || 0;
+  }
+  Object.assign(calendar.style, { left: `${left}px`, top: `${top}px` });
+};
+const createCalendarToInput = (self) => {
+  if (!self.HTMLInputElement)
+    return;
+  const calendar = document.createElement("div");
+  calendar.className = `${self.CSSClasses.calendar} ${self.CSSClasses.calendarToInput} ${self.CSSClasses.calendarHidden}`;
+  setPositionCalendar(self.HTMLInputElement, calendar);
+  self.HTMLElement = calendar;
+  document.body.append(self.HTMLElement);
+  setTimeout(() => self.HTMLElement.classList.remove(self.CSSClasses.calendarHidden), 0);
+  resetCalendar(self);
+  clickCalendar(self);
+};
+const documentClickEvent = (e) => {
+  if (!currentSelf || e.target.closest(`.${currentSelf.CSSClasses.calendar}.${currentSelf.CSSClasses.calendarToInput}`))
+    return;
+  const calendarEls = document.querySelectorAll(`.${currentSelf.CSSClasses.calendar}.${currentSelf.CSSClasses.calendarToInput}`);
+  calendarEls.forEach((calendar) => calendar.classList.add(currentSelf.CSSClasses.calendarHidden));
+  document.removeEventListener("click", documentClickEvent, { capture: true });
+};
+const handlerInput = (self) => {
+  if (!self)
+    return;
+  currentSelf = self;
+  self.HTMLInputElement = self.HTMLElement;
+  self.HTMLElement = null;
+  self.HTMLInputElement.addEventListener("click", () => {
+    if (self.HTMLElement && self.HTMLInputElement) {
+      setPositionCalendar(self.HTMLInputElement, self.HTMLElement);
+      self.HTMLElement.classList.remove(self.CSSClasses.calendarHidden);
+    } else if (self.HTMLElement) {
+      self.HTMLElement.classList.remove(self.CSSClasses.calendarHidden);
+    } else {
+      createCalendarToInput(self);
+    }
+    document.addEventListener("click", documentClickEvent, { capture: true });
+  });
+};
+const initCalendar = (self) => {
+  if (!self.HTMLElement)
+    return;
+  if (self.input) {
+    handlerInput(self);
+  } else {
+    resetCalendar(self);
+    clickCalendar(self);
+  }
+};
+const DOMDefault = (styles) => `
+	<div class="${styles.header}">
+		<#ArrowPrev />
+		<div class="${styles.headerContent}">
+			<#Month />
+			<#Year />
+		</div>
+		<#ArrowNext />
+	</div>
+	<div class="${styles.wrapper}">
+		<#WeekNumbers />
+		<div class="${styles.content}">
+			<#Week />
+			<#Days />
+		</div>
+	</div>
+	<#ControlTime />
+`;
+const DOMMultiple = (styles) => `
+	<div class="${styles.controls}">
+		<#ArrowPrev />
+		<#ArrowNext />
+	</div>
+	<div class="${styles.grid}">
+		<#Multiple>
+			<div class="${styles.column}">
+				<div class="${styles.header}">
+					<div class="${styles.headerContent}">
+						<#Month />
+						<#Year />
+					</div>
+				</div>
+				<div class="${styles.wrapper}">
+					<#WeekNumbers />
+					<div class="${styles.content}">
+						<#Week />
+						<#Days />
+					</div>
+				</div>
+			</div>
+		<#/Multiple>
+	</div>
+	<#ControlTime />
+`;
+const DOMMonths = (styles) => `
+	<div class="${styles.header}">
+		<div class="${styles.headerContent}">
+			<#Month />
+			<#Year />
+		</div>
+	</div>
+	<div class="${styles.wrapper}">
+		<div class="${styles.content}">
+			<#Months />
+		</div>
+	</div>
+`;
+const DOMYears = (styles) => `
+	<div class="${styles.header}">
+		<#ArrowPrev />
+		<div class="${styles.headerContent}">
+			<#Month />
+			<#Year />
+		</div>
+		<#ArrowNext />
+	</div>
+	<div class="${styles.wrapper}">
+		<div class="${styles.content}">
+			<#Years />
+		</div>
+	</div>
+`;
+const classes = {
+  calendar: "vanilla-calendar",
+  calendarDefault: "vanilla-calendar_default",
+  calendarMultiple: "vanilla-calendar_multiple",
+  calendarMonth: "vanilla-calendar_month",
+  calendarYear: "vanilla-calendar_year",
+  calendarHidden: "vanilla-calendar_hidden",
+  calendarToInput: "vanilla-calendar_to-input",
+  controls: "vanilla-calendar-controls",
+  grid: "vanilla-calendar-grid",
+  gridDisabled: "vanilla-calendar-grid_disabled",
+  column: "vanilla-calendar-column",
+  columnMonth: "vanilla-calendar-column_month",
+  columnYear: "vanilla-calendar-column_year",
+  header: "vanilla-calendar-header",
+  headerContent: "vanilla-calendar-header__content",
+  month: "vanilla-calendar-month",
+  monthDisabled: "vanilla-calendar-month_disabled",
+  year: "vanilla-calendar-year",
+  yearDisabled: "vanilla-calendar-year_disabled",
+  arrow: "vanilla-calendar-arrow",
+  arrowPrev: "vanilla-calendar-arrow_prev",
+  arrowNext: "vanilla-calendar-arrow_next",
+  wrapper: "vanilla-calendar-wrapper",
+  content: "vanilla-calendar-content",
+  week: "vanilla-calendar-week",
+  weekDay: "vanilla-calendar-week__day",
+  weekDayWeekend: "vanilla-calendar-week__day_weekend",
+  days: "vanilla-calendar-days",
+  daysSelecting: "vanilla-calendar-days_selecting",
+  months: "vanilla-calendar-months",
+  monthsSelecting: "vanilla-calendar-months_selecting",
+  monthsMonth: "vanilla-calendar-months__month",
+  monthsMonthSelected: "vanilla-calendar-months__month_selected",
+  monthsMonthDisabled: "vanilla-calendar-months__month_disabled",
+  years: "vanilla-calendar-years",
+  yearsSelecting: "vanilla-calendar-years_selecting",
+  yearsYear: "vanilla-calendar-years__year",
+  yearsYearSelected: "vanilla-calendar-years__year_selected",
+  yearsYearDisabled: "vanilla-calendar-years__year_disabled",
+  time: "vanilla-calendar-time",
+  timeContent: "vanilla-calendar-time__content",
+  timeHours: "vanilla-calendar-time__hours",
+  timeMinutes: "vanilla-calendar-time__minutes",
+  timeKeeping: "vanilla-calendar-time__keeping",
+  timeRanges: "vanilla-calendar-time__ranges",
+  timeRange: "vanilla-calendar-time__range",
+  day: "vanilla-calendar-day",
+  daySelected: "vanilla-calendar-day_selected",
+  daySelectedFirst: "vanilla-calendar-day_selected-first",
+  daySelectedLast: "vanilla-calendar-day_selected-last",
+  daySelectedIntermediate: "vanilla-calendar-day_selected-intermediate",
+  dayPopup: "vanilla-calendar-day__popup",
+  dayBtn: "vanilla-calendar-day__btn",
+  dayBtnPrev: "vanilla-calendar-day__btn_prev",
+  dayBtnNext: "vanilla-calendar-day__btn_next",
+  dayBtnToday: "vanilla-calendar-day__btn_today",
+  dayBtnSelected: "vanilla-calendar-day__btn_selected",
+  dayBtnHover: "vanilla-calendar-day__btn_hover",
+  dayBtnDisabled: "vanilla-calendar-day__btn_disabled",
+  dayBtnIntermediate: "vanilla-calendar-day__btn_intermediate",
+  dayBtnWeekend: "vanilla-calendar-day__btn_weekend",
+  dayBtnHoliday: "vanilla-calendar-day__btn_holiday",
+  weekNumbers: "vanilla-calendar-week-numbers",
+  weekNumbersTitle: "vanilla-calendar-week-numbers__title",
+  weekNumbersContent: "vanilla-calendar-week-numbers__content",
+  weekNumber: "vanilla-calendar-week-number",
+  isFocus: "vanilla-calendar-is-focus"
+};
+class VanillaCalendar {
+  constructor(selector, option) {
+    __publicField(this, "HTMLElement");
+    __publicField(this, "input");
+    __publicField(this, "type");
+    __publicField(this, "months");
+    __publicField(this, "jumpMonths");
+    __publicField(this, "date");
+    __publicField(this, "settings");
+    __publicField(this, "locale");
+    __publicField(this, "actions");
+    __publicField(this, "popups");
+    __publicField(this, "CSSClasses");
+    __publicField(this, "DOMTemplates");
+    __publicField(this, "currentType");
+    __publicField(this, "reset", () => resetCalendar(this));
+    __publicField(this, "update", () => updateCalendar(this));
+    __publicField(this, "init", () => initCalendar(this));
+    var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L, _M, _N, _O, _P, _Q, _R, _S, _T, _U, _V, _W, _X, _Y, _Z, __, _$, _aa, _ba, _ca, _da, _ea, _fa, _ga, _ha, _ia, _ja, _ka, _la, _ma, _na, _oa, _pa, _qa, _ra, _sa, _ta, _ua, _va, _wa, _xa, _ya, _za, _Aa, _Ba, _Ca, _Da, _Ea, _Fa, _Ga, _Ha, _Ia, _Ja, _Ka, _La, _Ma, _Na, _Oa, _Pa, _Qa, _Ra, _Sa, _Ta, _Ua, _Va, _Wa, _Xa, _Ya, _Za, __a, _$a, _ab, _bb, _cb, _db, _eb, _fb, _gb, _hb, _ib, _jb, _kb, _lb, _mb, _nb, _ob, _pb, _qb, _rb, _sb;
+    this.HTMLElement = typeof selector === "string" ? document.querySelector(selector) : selector;
+    if (!this.HTMLElement)
+      return;
+    this.input = (_a = option == null ? void 0 : option.input) != null ? _a : false;
+    this.type = (_b = option == null ? void 0 : option.type) != null ? _b : "default";
+    this.months = (_c = option == null ? void 0 : option.months) != null ? _c : 2;
+    this.jumpMonths = (_d = option == null ? void 0 : option.jumpMonths) != null ? _d : 1;
+    this.date = {
+      min: (_f = (_e = option == null ? void 0 : option.date) == null ? void 0 : _e.min) != null ? _f : "1970-01-01",
+      max: (_h = (_g = option == null ? void 0 : option.date) == null ? void 0 : _g.max) != null ? _h : "2470-12-31",
+      today: (_j = (_i = option == null ? void 0 : option.date) == null ? void 0 : _i.today) != null ? _j : /* @__PURE__ */ new Date()
+    };
+    this.settings = {
+      lang: (_l = (_k = option == null ? void 0 : option.settings) == null ? void 0 : _k.lang) != null ? _l : "en",
+      iso8601: (_n = (_m = option == null ? void 0 : option.settings) == null ? void 0 : _m.iso8601) != null ? _n : true,
+      range: {
+        min: (_q = (_p = (_o = option == null ? void 0 : option.settings) == null ? void 0 : _o.range) == null ? void 0 : _p.min) != null ? _q : this.date.min,
+        max: (_t = (_s = (_r = option == null ? void 0 : option.settings) == null ? void 0 : _r.range) == null ? void 0 : _s.max) != null ? _t : this.date.max,
+        disablePast: (_w = (_v = (_u = option == null ? void 0 : option.settings) == null ? void 0 : _u.range) == null ? void 0 : _v.disablePast) != null ? _w : false,
+        disableGaps: (_z = (_y = (_x = option == null ? void 0 : option.settings) == null ? void 0 : _x.range) == null ? void 0 : _y.disableGaps) != null ? _z : false,
+        disableAllDays: (_C = (_B = (_A = option == null ? void 0 : option.settings) == null ? void 0 : _A.range) == null ? void 0 : _B.disableAllDays) != null ? _C : false,
+        disableWeekday: (_F = (_E = (_D = option == null ? void 0 : option.settings) == null ? void 0 : _D.range) == null ? void 0 : _E.disableWeekday) != null ? _F : null,
+        disabled: (_I = (_H = (_G = option == null ? void 0 : option.settings) == null ? void 0 : _G.range) == null ? void 0 : _H.disabled) != null ? _I : null,
+        enabled: (_L = (_K = (_J = option == null ? void 0 : option.settings) == null ? void 0 : _J.range) == null ? void 0 : _K.enabled) != null ? _L : null
+      },
+      selection: {
+        day: (_O = (_N = (_M = option == null ? void 0 : option.settings) == null ? void 0 : _M.selection) == null ? void 0 : _N.day) != null ? _O : "single",
+        month: (_R = (_Q = (_P = option == null ? void 0 : option.settings) == null ? void 0 : _P.selection) == null ? void 0 : _Q.month) != null ? _R : true,
+        year: (_U = (_T = (_S = option == null ? void 0 : option.settings) == null ? void 0 : _S.selection) == null ? void 0 : _T.year) != null ? _U : true,
+        time: (_X = (_W = (_V = option == null ? void 0 : option.settings) == null ? void 0 : _V.selection) == null ? void 0 : _W.time) != null ? _X : false,
+        controlTime: (__ = (_Z = (_Y = option == null ? void 0 : option.settings) == null ? void 0 : _Y.selection) == null ? void 0 : _Z.controlTime) != null ? __ : "all",
+        stepHours: (_ba = (_aa = (_$ = option == null ? void 0 : option.settings) == null ? void 0 : _$.selection) == null ? void 0 : _aa.stepHours) != null ? _ba : 1,
+        stepMinutes: (_ea = (_da = (_ca = option == null ? void 0 : option.settings) == null ? void 0 : _ca.selection) == null ? void 0 : _da.stepMinutes) != null ? _ea : 1
+      },
+      selected: {
+        dates: (_ha = (_ga = (_fa = option == null ? void 0 : option.settings) == null ? void 0 : _fa.selected) == null ? void 0 : _ga.dates) != null ? _ha : null,
+        month: (_ka = (_ja = (_ia = option == null ? void 0 : option.settings) == null ? void 0 : _ia.selected) == null ? void 0 : _ja.month) != null ? _ka : null,
+        year: (_na = (_ma = (_la = option == null ? void 0 : option.settings) == null ? void 0 : _la.selected) == null ? void 0 : _ma.year) != null ? _na : null,
+        holidays: (_qa = (_pa = (_oa = option == null ? void 0 : option.settings) == null ? void 0 : _oa.selected) == null ? void 0 : _pa.holidays) != null ? _qa : null,
+        time: (_ta = (_sa = (_ra = option == null ? void 0 : option.settings) == null ? void 0 : _ra.selected) == null ? void 0 : _sa.time) != null ? _ta : null
+      },
+      visibility: {
+        theme: (_wa = (_va = (_ua = option == null ? void 0 : option.settings) == null ? void 0 : _ua.visibility) == null ? void 0 : _va.theme) != null ? _wa : "system",
+        themeDetect: (_za = (_ya = (_xa = option == null ? void 0 : option.settings) == null ? void 0 : _xa.visibility) == null ? void 0 : _ya.themeDetect) != null ? _za : "html[data-theme]",
+        monthShort: (_Ca = (_Ba = (_Aa = option == null ? void 0 : option.settings) == null ? void 0 : _Aa.visibility) == null ? void 0 : _Ba.monthShort) != null ? _Ca : true,
+        weekNumbers: (_Fa = (_Ea = (_Da = option == null ? void 0 : option.settings) == null ? void 0 : _Da.visibility) == null ? void 0 : _Ea.weekNumbers) != null ? _Fa : false,
+        weekend: (_Ia = (_Ha = (_Ga = option == null ? void 0 : option.settings) == null ? void 0 : _Ga.visibility) == null ? void 0 : _Ha.weekend) != null ? _Ia : true,
+        today: (_La = (_Ka = (_Ja = option == null ? void 0 : option.settings) == null ? void 0 : _Ja.visibility) == null ? void 0 : _Ka.today) != null ? _La : true,
+        disabled: (_Oa = (_Na = (_Ma = option == null ? void 0 : option.settings) == null ? void 0 : _Ma.visibility) == null ? void 0 : _Na.disabled) != null ? _Oa : false,
+        daysOutside: (_Ra = (_Qa = (_Pa = option == null ? void 0 : option.settings) == null ? void 0 : _Pa.visibility) == null ? void 0 : _Qa.daysOutside) != null ? _Ra : true
+      }
+    };
+    this.locale = {
+      months: (_Ta = (_Sa = option == null ? void 0 : option.locale) == null ? void 0 : _Sa.months) != null ? _Ta : [],
+      weekday: (_Va = (_Ua = option == null ? void 0 : option.locale) == null ? void 0 : _Ua.weekday) != null ? _Va : []
+    };
+    this.actions = {
+      clickDay: (_Xa = (_Wa = option == null ? void 0 : option.actions) == null ? void 0 : _Wa.clickDay) != null ? _Xa : null,
+      clickWeekNumber: (_Za = (_Ya = option == null ? void 0 : option.actions) == null ? void 0 : _Ya.clickWeekNumber) != null ? _Za : null,
+      clickMonth: (_$a = (__a = option == null ? void 0 : option.actions) == null ? void 0 : __a.clickMonth) != null ? _$a : null,
+      clickYear: (_bb = (_ab = option == null ? void 0 : option.actions) == null ? void 0 : _ab.clickYear) != null ? _bb : null,
+      clickArrow: (_db = (_cb = option == null ? void 0 : option.actions) == null ? void 0 : _cb.clickArrow) != null ? _db : null,
+      changeTime: (_fb = (_eb = option == null ? void 0 : option.actions) == null ? void 0 : _eb.changeTime) != null ? _fb : null,
+      changeToInput: (_hb = (_gb = option == null ? void 0 : option.actions) == null ? void 0 : _gb.changeToInput) != null ? _hb : null,
+      getDays: (_jb = (_ib = option == null ? void 0 : option.actions) == null ? void 0 : _ib.getDays) != null ? _jb : null
+    };
+    this.popups = (_kb = option == null ? void 0 : option.popups) != null ? _kb : null;
+    this.CSSClasses = (() => {
+      const classesObj = __spreadValues({}, classes);
+      Object.keys(classes).forEach((className) => {
+        var _a2;
+        if ((_a2 = option == null ? void 0 : option.CSSClasses) == null ? void 0 : _a2[className]) {
+          classesObj[className] = option.CSSClasses[className];
+        } else {
+          classesObj[className] = classes[className];
+        }
+      });
+      return classesObj;
+    })();
+    this.DOMTemplates = {
+      default: (_mb = (_lb = option == null ? void 0 : option.DOMTemplates) == null ? void 0 : _lb.default) != null ? _mb : DOMDefault(this.CSSClasses),
+      multiple: (_ob = (_nb = option == null ? void 0 : option.DOMTemplates) == null ? void 0 : _nb.multiple) != null ? _ob : DOMMultiple(this.CSSClasses),
+      month: (_qb = (_pb = option == null ? void 0 : option.DOMTemplates) == null ? void 0 : _pb.month) != null ? _qb : DOMMonths(this.CSSClasses),
+      year: (_sb = (_rb = option == null ? void 0 : option.DOMTemplates) == null ? void 0 : _rb.year) != null ? _sb : DOMYears(this.CSSClasses)
+    };
+    this.currentType = this.type;
+  }
+}
+export {
+  VanillaCalendar as default
+};
Index: /mods/mod_ticket/classes/Action.php
===================================================================
--- /mods/mod_ticket/classes/Action.php	(revision 8427)
+++ /mods/mod_ticket/classes/Action.php	(revision 8427)
@@ -0,0 +1,333 @@
+<?php
+	
+	declare(strict_types=1);
+	
+	/**
+	 * @author: Daniel Schmitzer (daniel@maennchen1.de)
+	 * @date: 14.10.23
+	 * @time: 07:38
+	 */
+	
+	namespace wpsgTicket;
+	
+	use \wpsg\M1;
+	
+	abstract class Action {
+		
+		public static function wpsg_produkt_edit(array $arParam): void {
+			
+			$arParam[0]['basket_multiple'] = '1';
+			
+		}
+		
+		public static function wpsg_renderProdukt_templateSelect(array &$arParam): void {
+			
+			$product_id = intval(\wpsg_ShopController::getShop()->getProduktID($arParam[0]['id']));
+
+			if (TicketProduct::isTicketProduct($product_id)) {
+			
+				$arParam[1] = implode(DIRECTORY_SEPARATOR, [WPSG_PATH_VIEW, '..', 'views', 'mods', 'mod_ticket', 'produkttemplate.phtml']);
+ 
+			}
+			
+		}
+		
+		public static function cronDaily(): void {
+			
+			foreach (Ticket::findSerial([], true) as $oTicket) {
+			
+				$oTicket->createTickets();
+			
+			}
+			
+		}
+		
+		public static function admin_menu(): void {
+		 
+			\add_menu_page(
+            	__('QR Scanner', 'wpsg'),
+		        __('QR Scanner', 'wpsg'),
+		        'manage_options',
+		        'wpsgTicketQrScanner',
+		        ['\wpsgTicket\QrScanner', 'dispatch'],
+		        'dashicons-id',
+		        65
+		    );
+			
+		}
+		
+		public static function wpsg_admin_emailconf(array $arParam): void {
+			
+			echo \wpsg_drawEMailConfig(
+				'ticketmail',
+				__('E-Mail mit den PDF Tickets an den Kunden', 'wpsg'),
+				__('Diese Mail wird bei bestimmten BestellzustÃ€nden ausgelÃ¶st und stell die Tickets dem Kunden als PDFzu.', 'wpsg'));
+			
+		}
+		
+		public static function wpsg_admin_emailconf_save(array $arParam): void {
+			
+			\wpsg_saveEMailConfig("ticketmail");
+			
+		}
+		
+		public static function order_view(array $arParam): void {
+			
+			list($order_id, &$arSubAction) = $arParam;
+			
+			$oOrder = \wpsg_order::getInstance(intval($order_id));
+			
+			foreach ($oOrder->getOrderProducts() as $oOrderProduct) {
+				
+				if (intval($oOrderProduct->getMeta('ticket_id', false, 0)) > 0) {
+					
+					$arSubAction['ticket'] = [
+						'title' => 'Tickets',
+						'content' => \wpsg_ShopController::getShop()->render(implode(DIRECTORY_SEPARATOR, [WPSG_PATH_VIEW, 'mods', 'mod_ticket', 'order_view.phtml']), false)
+					];
+					
+					break;
+					
+				}
+				
+			}
+			
+		}
+		
+		public static function wpsg_order_view_row(array $arParam): void {
+			
+			list(&$p, $i) = $arParam;
+			
+			if (TicketProduct::isTicketProduct(intval($p['product_id']))) {
+			
+				$oOrderProduct = \wpsg_order_product::getInstance(intval($p['order_product_id']));
+				$oTicket = Ticket::getInstance(intval($oOrderProduct->getMeta('ticket_id')));
+				
+				$oShop = \wpsg_ShopController::getShop();
+				$oShop->view['i'] = $i;
+				$oShop->view['p'] = $p;
+				$oShop->view['oTicket'] = $oTicket;
+				$oShop->view['oOrderProduct'] = $oOrderProduct;
+				
+				$oShop->render(implode(DIRECTORY_SEPARATOR, [WPSG_PATH_VIEW, 'mods', 'mod_ticket', 'order_view_row.phtml']));
+			
+			}
+			
+		}
+		
+		public static function wpsg_install(): void {
+	 
+			global $wpdb;
+			
+			$charset_collate = $wpdb->get_charset_collate();
+			
+			$sql = "CREATE TABLE ".$wpdb->prefix."wpsg_tickets (
+				id INT NOT NULL AUTO_INCREMENT,
+				label VARCHAR(500) DEFAULT '' NOT NULL,
+				label_short VARCHAR(500) DEFAULT '' NOT NULL,
+				p_id INT NOT NULL,
+				from_date DATE,
+				from_time TIME,
+				to_date DATE,
+				to_time TIME,
+				slots INT,
+				state INT DEFAULT 0,
+				autoticket TEXT DEFAULT NULL,
+				autoticket_id INT(11) DEFAULT 0 NULL,
+				PRIMARY KEY  (id),
+				KEY autoticket_id (autoticket_id),
+				KEY p_id (p_id)
+			) $charset_collate;";
+			
+			require_once(ABSPATH.'wp-admin/includes/upgrade.php');
+
+			dbDelta($sql);
+			
+			$sql = "CREATE TABLE ".$wpdb->prefix."wpsg_ticket_templates (
+				id INT NOT NULL AUTO_INCREMENT,
+				config BLOB,
+				template_name VARCHAR(500) NOT NULL DEFAULT '',
+				defaulttemplate INT(1) NOT NULL DEFAULT 0,
+				deleted INT NOT NULL DEFAULT 0,
+				PRIMARY KEY  (id)
+			) $charset_collate;";
+			
+			dbDelta($sql);
+			
+			$sql = "CREATE TABLE ".$wpdb->prefix."wpsg_ticket_booking (
+				id INT NOT NULL AUTO_INCREMENT,
+				booking_key VARCHAR(255) NOT NULL,
+				order_id INT NOT NULL,
+				order_product_id INT NOT NULL,
+				product_id INT NOT NULL,
+				ticket_id INT NOT NULL,
+				amount_index INT NOT NULL,
+				revoke_user INT(11) NULL DEFAULT NULL,
+				revoke_time DATETIME NULL DEFAULT NULL,
+				send_user INT(11) NOT NULL DEFAULT 0,
+				send_time DATETIME NULL DEFAULT NULL,
+				PRIMARY KEY  (id),
+				KEY booking_key (booking_key),
+				KEY order_id (order_id),
+				KEY order_product_id (order_product_id),
+				KEY product_id (product_id),
+				KEY ticket_id (ticket_id),
+				KEY amount_index (amount_index)
+			) $charset_collate;";
+			
+			dbDelta($sql);
+			
+			$sql = "CREATE TABLE ".$wpdb->prefix."wpsg_ticket_log (
+				id INT NOT NULL AUTO_INCREMENT,
+				booking_id INT(11) NOT NULL,
+				user_id INT(11) NOT NULL,
+				date_time DATETIME NOT NULL,
+				log INT(11) NOT NULL,
+				PRIMARY KEY  (id),
+				KEY booking_id (booking_id)
+			) $charset_collate;";
+			
+			dbDelta($sql);
+			
+			\wpsg_ShopController::getShop()->checkDefault('wpsg_mod_ticket_orderstate_active', '100,110');
+			\wpsg_ShopController::getShop()->checkDefault('wpsg_mod_ticket_orderstate_send', '100');
+			\wpsg_ShopController::getShop()->checkDefault('wpsg_ticketmail_betreff', 'Ihre Tickets');
+			
+		}
+		
+		public static function wpsg_calculation_saveProduct_after(array $arParam): void {
+		
+			list($oCalculation, $p, $db_data, $finish_order) = $arParam;
+			
+			if (TicketProduct::isTicketProduct(intval($p['product_id']))) {
+				
+				if ($finish_order) {
+				
+					if (($p['ticket_id']??0) <= 0) throw new \Exception(__('Ticket ID nicht gesetzt!', 'wpsg'));
+					
+					$oOrderProduct = \wpsg_order_product::getInstance(intval($p['order_product_id']));
+					
+					$arSecret = [];
+					for ($i = 1; $i <= $p['amount']; $i ++) {
+						
+						$arSecret[] = base64_encode(random_bytes(64));
+						
+					}
+					
+					$oOrderProduct->setMeta('ticket_id', intval($p['ticket_id']));
+					$oOrderProduct->setMeta('ticket_secrets', json_encode($arSecret));
+					
+				}
+			
+			}
+		
+		}
+		
+		public static function wpsg_calculation_addProduct(array $arParam): void {
+		
+			list(&$p, $ses_data) = $arParam;
+			
+			if ($ses_data !== false) {
+				
+				if ($ses_data['ticket_id']) $p['data']['ticket_id'] = $ses_data['ticket_id'];
+				
+			} else {
+				
+				if (TicketProduct::isTicketProduct(intval($p['data']['product_id']))) {
+					
+					$p['data']['ticket_id'] = \wpsg_order_product::getInstance(intval($p['data']['order_product_id']))->getMeta('ticket_id');
+					
+				}
+				
+			}
+			
+		}
+		
+		public static function basket_updateProduktFromSession(array $arParam): void {
+			
+			$amount_index = $arParam[0];
+			$stock = &$arParam[1];
+			
+			if (intval($_SESSION['wpsg']['basket'][$amount_index]['ticket_id']??0) > 0) {
+				
+				$oTicket = Ticket::getInstance(intval($_SESSION['wpsg']['basket'][$amount_index]['ticket_id']));
+				
+				if ($oTicket->getBookingState() !== Ticket::BOOKING_STATE_OPEN) {
+				
+					$stock = 0;
+					\wpsg_ShopController::getShop()->addFrontendError(__('Ticket ist nicht mehr buchbar und wurde aus dem Warenkorb entfernt.', 'wpsg'));
+					
+					return;
+				
+				}
+				
+				if ($stock > $oTicket->getFreeSlotCount()) {
+					
+					$stock = $oTicket->getFreeSlotCount();
+					\wpsg_ShopController::getShop()->addFrontendError(__('Bestand ÃŒberschreitet die freien Slots des Tickets, Menge wurde angepasst.', 'wpsg'));
+					
+					return;
+					
+				}
+				
+			}
+			
+		}
+		
+		public static function wpsg_basket_row(array $arParam): void {
+			
+			$product_data = $arParam[0];
+			
+			if (intval($product_data['ticket_id']??0) > 0) {
+			
+				$oShop = \wpsg_ShopController::getShop();
+				$oShop->view['oTicket'] = Ticket::getInstance(intval($product_data['ticket_id']));
+				
+				$oShop->render(implode(DIRECTORY_SEPARATOR, [WPSG_PATH_VIEW, 'mods', 'mod_ticket', 'basket_row.phtml']));
+			
+			}
+			
+		}
+		
+		public static function wpsg_overview_row(array $arParam): void {
+			
+			$product_data = $arParam[0];
+			
+			if (intval($product_data['ticket_id']??0) > 0) {
+				
+				$oShop = \wpsg_ShopController::getShop();
+				$oShop->view['oTicket'] = Ticket::getInstance(intval($product_data['ticket_id']));
+				$oShop->render(implode(DIRECTORY_SEPARATOR, [WPSG_PATH_VIEW, 'mods', 'mod_ticket', 'basket_row.phtml']));
+			
+			}
+			
+		}
+		
+		public static function wpsg_product_addedit_content(array $arParam): void {
+			
+			if (($_REQUEST['action']??'add') === 'add') return;
+			
+			$content = Plugin::getInstance()->render('product_addedit_content.phtml', [
+				'product_data' => $arParam[1]
+			]);
+			
+			$arParam[0]['wpsg_mod_ticket'] = [
+				'title' => __('Ticketprodukt', 'wpsg'),
+				'content' => $content
+			];
+			
+		}
+		
+		public static function setOrderStatus(array $arParam): void {
+			
+			list($order_id, $status_id, $inform) = $arParam;
+			
+			if (in_array(intval($status_id), Plugin::getInstance()->getSendOrderState())) {
+			
+				Plugin::getInstance()->sendTickets(intval($order_id));
+				
+			}
+			
+		}
+	
+	}
Index: /mods/mod_ticket/classes/Ajax.php
===================================================================
--- /mods/mod_ticket/classes/Ajax.php	(revision 8427)
+++ /mods/mod_ticket/classes/Ajax.php	(revision 8427)
@@ -0,0 +1,673 @@
+<?php
+	
+	declare(strict_types=1);
+	
+	/**
+	 * @author: Daniel Schmitzer (daniel@maennchen1.de)
+	 * @date: 15.10.23
+	 * @time: 09:28
+	 */
+	
+	namespace wpsgTicket;
+	
+	abstract class Ajax {
+		
+		public static function backend(): void {
+			
+			$raw_data = file_get_contents('php://input');
+			$request = json_decode($raw_data, true);
+			
+			if (!current_user_can('administrator' )) throw new \Exception("1");
+			
+			if (!is_array($request)) { $request = $_REQUEST; $request['action'] = $_REQUEST['ticket_action']; }
+			
+			$actionName = $request['action'].'Action';
+			
+			if (method_exists(__NAMESPACE__.'\Ajax', $actionName)) {
+				
+				$out = self::$actionName($request);
+				
+				header('Content-Type: application/json');
+				
+				echo json_encode($out); exit;
+				
+			} else throw new \Exception('2');
+		
+		}
+		
+		public static function frontend(): void {
+		 
+			$raw_data = file_get_contents('php://input');
+			$request = json_decode($raw_data, true);
+			
+			if (!is_array($request)) { $request = $_REQUEST; $request['action'] = $_REQUEST['ticket_action']; }
+			
+			$actionName = $request['action'].'FrontendAction';
+			
+			if (method_exists(__NAMESPACE__.'\Ajax', $actionName)) {
+				
+				$out = self::$actionName($request);
+				
+				header('Content-Type: application/json');
+				echo json_encode($out); exit;
+				
+			} else throw new \Exception('2');
+			
+		}
+		
+		/* - */
+		
+		private static function setVariFrontendAction(array $request): array {
+ 
+			$product_key = \wpsg_ShopController::getShop()->callMod(
+				'wpsg_mod_productvariants',
+				'getSimulatedVariKey', [
+					$request['product_key'],
+					$request['var_id'],
+					$request['vari_id']
+				]
+			);
+			
+			$oProduct = \wpsg_product::getInstance($request['product_id']);
+			$oProduct->setProductKey($product_key);
+			
+			$r = [
+				'price' => $oProduct->getPrice($product_key, \wpsg_ShopController::getShop()->getFrontendTaxview()),
+				'product_key' => $product_key,
+			];
+		
+			if (\wpsg_ShopController::getShop()->hasMod('wpsg_mod_productvariants')) {
+				
+				if (\wpsg_ShopController::getShop()->callMod('wpsg_mod_productvariants', 'isVariantsProductKey', [$product_key])) {
+					
+					$r['vp_info'] = \wpsg_ShopController::getShop()->callMod('wpsg_mod_productvariants', 'getVariantenInfoArray', [$product_key]);
+					
+				}
+				
+			}
+			
+			return $r;
+			
+		}
+	
+		private static function getTicketFrontendAction(array $request): void {
+			
+			$ticket_id = intval($request['ticket_id']);
+			
+			header('Content-Type: application/json');
+			echo json_encode(['ticket' => Ticket::getInstance($ticket_id)->toJSON()]); exit;
+			
+		}
+		
+		private static function getFrontendAction(array $request): void {
+			
+			$oOrderProduct = \wpsg_order_product::getInstance(intval($request['order_product_id']));
+			$oTicketProduct = TicketProduct::getInstance($oOrderProduct->getProductId());
+			
+			$ticket_id = intval($oOrderProduct->getMeta('ticket_id'));
+			$arTicketSecrets = json_decode($oOrderProduct->getMeta('ticket_secrets'));
+			
+			$oTicket = Ticket::getInstance($ticket_id);
+			
+			TicketRenderer::render(
+				intval($oTicketProduct->getProduct()->getMeta('ticket_template')),
+				$oOrderProduct->getId(),
+				intval($request['amount_index'])
+			);
+			
+			exit;
+			
+		}
+		
+		private static function addProductToBasketFrontendAction(array $request): array {
+			
+			//\wpsg_ShopController::getShop()->basket->addProduktToSession($request['form_data']['wpsg[product_key]'], $request['ticket']['amount']);
+			
+			$product_key = $request['form_data']['wpsg']['product_key'];
+			
+			if (!wpsg_isSizedArray($_SESSION['wpsg']['basket'])) $_SESSION['wpsg']['basket'] = [];
+			
+			$oTicketProduct = \wpsgTicket\TicketProduct::getInstance(intval(\wpsg_ShopController::getShop()->getProduktID($product_key)));
+			$oTicket = \wpsgTicket\Ticket::getInstance($request['ticket']['id']);
+			
+			$wpsg_afterinsert = intval(\wpsg_ShopController::getShop()->get_option('wpsg_afterinsert'));
+			
+			if ($request['ticket']['amount'] > $oTicket->getFreeSlotCount()) {
+				
+				return [
+					'success' => false,
+					'alert' => __('Es sind nicht genug freie Slots verfÃŒgbar.', 'wpsg')
+				];
+				
+			}
+			
+			$p = [
+				'menge' => $request['ticket']['amount'],
+				'id' => $product_key,
+				'referer' => '',
+				'ticket_id' => $oTicket->getId()
+			];
+			
+			if (isset($request['form_data']['wpsg_mod_productvars'])) {
+				
+				$p['wpsg_mod_productvars'] = [];
+				
+				foreach ($request['form_data']['wpsg_mod_productvars'] as $pv_id => $pv_value) {
+					
+					$p['wpsg_mod_productvars'][$pv_id] = wpsg_xss($pv_value);
+					
+				}
+				
+			}
+			
+			$_SESSION['wpsg']['basket'][] = $p;
+			
+			$r = [
+				'success' => true
+			];
+			
+			if ($wpsg_afterinsert === 0) $r['showDoneLayer'] = __('Produkt wurde erfolgreich in den Warenkorb gelegt.', 'wpsg');
+			else $r['redirect'] = \wpsg_ShopController::getShop()->getURL(\wpsg_ShopController::URL_BASKET);
+			
+			return $r;
+			
+		}
+		
+		private static function getEventsFrontendAction(array $request): array {
+			
+			$start = date('Y-m-d H:i:s', strtotime($request['start']));
+			$end = date('Y-m-d H:i:s', strtotime($request['end']));
+			$product_id = intval($request['product_id']);
+			$arTicketID = [];
+			
+			foreach (Plugin::getDatesBetween($start, $end) as $day) {
+				
+				if (strtotime($day) < time()) continue;
+				
+				$arTicket = Ticket::find([
+					'product_id' => $product_id,
+					'day' => $day
+				]);
+				
+				foreach ($arTicket as $ticket_id) {
+					
+					$arTicketID[] = $ticket_id;
+					
+				}
+				
+			}
+			
+			$arReturn = [];
+			
+			foreach (array_unique($arTicketID) as $ticket_id) {
+				
+				$oTicket = Ticket::getInstance(intval($ticket_id));
+				
+				if ($oTicket->getFreeSlotCount() <= 0) continue;
+				
+				if ($oTicket->isSerialTicket()) {
+					
+					$label_short = $oTicket->getSerialTicket()->getShortLabel();
+					if ($label_short !== '') $ticket_title = $label_short;
+					else $ticket_title = $oTicket->getSerialTicket()->getLabel();
+				}
+				else $ticket_title = $oTicket->getProduct()->getProductName();
+				
+				$arReturn[] = [
+					'title' => $ticket_title,
+					'id' => $ticket_id,
+					'free_slots' => $oTicket->getFreeSlotCount(),
+					'start' => $oTicket->getStartDate()->getTimestamp() * 1000,
+					'end' => $oTicket->getEndDate()->getTimestamp() * 1000
+				];
+				
+			}
+			
+			header('Content-Type: application/json');
+			echo json_encode($arReturn); exit;
+			
+		}
+		
+		/* Backend */
+		
+		private static function loadOccupancyAction(array $request): array {
+			
+			$oTicketProduct = TicketProduct::getInstance(intval($request['product_id']));
+			
+			$date_from = date('Y-m-d', strtotime('-2 Month'));
+			$date_to = date('Y-m-d', strtotime('+4 Month'));
+			
+			$arOccupancy = $oTicketProduct->getOccupancy($date_from, $date_to);
+			
+			return [
+				'arOccupancy' => $arOccupancy
+			];
+			
+		}
+		
+		private static function resendAction(array $request): array {
+			
+			$oOrder = \wpsg_order::getInstance(intval($request['order_id']));
+			
+			Plugin::getInstance()->sendTickets($oOrder->getId());
+			
+			\wpsg_ShopController::getShop()->addBackendMessage(__('Tickets wurden erneut versendet.'));
+			
+			\wpsg_ShopController::getShop()->redirect(
+				wpsg_admin_url('Order', 'view', ['edit_id' => $oOrder->getId()])
+			); exit;
+			
+		}
+		
+		private static function exportAction(array $request): array {
+			
+			if (isset($request['ticket_product_id'])) {
+				
+				$ticket_product_id = intval($request['ticket_product_id']);
+				$oTicketProduct = TicketProduct::getInstance($ticket_product_id);
+				$arTicketBooking = $oTicketProduct->getBookingTickets();
+				
+			} else if (isset($request['order_id'])) {
+				
+				$oOrder = \wpsg_order::getInstance($request['order_id']);
+				
+				/** @var TicketBooking[] $arTicketBooking */
+				$arTicketBooking = [];
+				
+				foreach ($oOrder->getOrderProducts() as $oOrderProduct) {
+					
+					if (intval($oOrderProduct->getMeta('ticket_id', false, 0)) > 0) {
+					
+						for ($amount_index = 0; $amount_index < $oOrderProduct->getAmount(); $amount_index ++) {
+							
+							$arTicketBooking[] = TicketBooking::getInstanceByBookingKey(TicketBooking::encodeBookingKey($oOrderProduct->getId(), $amount_index));
+							
+						}
+					
+					}
+					
+				}
+				
+				
+			}
+			
+			if (sizeof($arTicketBooking) > 0) {
+				
+				$csvFilePath = tempnam(sys_get_temp_dir(), 'csv');
+				$csvFile = fopen($csvFilePath, 'w');
+				
+				$arHead = [
+					'Ticketbuchung',
+					'Serientermin',
+					'Zeitraum',
+					'Produkt',
+					'Bestellung',
+					'KÃ€ufer',
+					'Status',
+					'Entwertung'
+				];
+				
+				$arProductVars = \wpsg_ShopController::getShop()->db->fetchAssoc("
+					SELECT
+						PV.*
+					FROM
+						`".WPSG_TBL_PRODUCTS_VARS."` AS PV
+					WHERE
+						1
+					ORDER BY
+						PV.`pos` ASC, PV.`id` ASC
+				");
+				
+				foreach ($arProductVars as $pv) $arHead[] = $pv['name'];
+				
+				fputcsv($csvFile, $arHead);
+				
+				foreach ($arTicketBooking as $oTicketBooking) {
+					
+					$arRow = [
+						$oTicketBooking->getLabel(),
+						(($oTicketBooking->getTicket()->isSerialTicket())?$oTicketBooking->getTicket()->getSerialTicket()->getLabel():'--'),
+						$oTicketBooking->getTicket()->getLabel(),
+						$oTicketBooking->getProduct()->getProduct()->getProductName(),
+						$oTicketBooking->getOrder()->getNr(),
+						$oTicketBooking->getOrder()->getCustomer()->getFirstname().' '.$oTicketBooking->getOrder()->getCustomer()->getName(),
+						$oTicketBooking->getStateLabel(),
+						$oTicketBooking->getRevokeTooltip()
+					];
+					
+					$arProductVarData = \wpsg_ShopController::getShop()->callMod('wpsg_mod_productvars', 'getAllProductVarValues', [$oTicketBooking->getOrderID(), $oTicketBooking->getOrderProduct()->getProductIndex()]);
+					
+					foreach ($arProductVars as $pv) {
+						
+						$pv_active = \wpsg_ShopController::getShop()->callMod('wpsg_mod_productvars', 'hasProductProductVarActive', [$oTicketBooking->getProductID(), $pv['id']]);
+						
+						if ($pv_active === true) {
+							
+							$arRow[] = $arProductVarData[$pv['id']]['value']??'';
+							
+						} else {
+							
+							$arRow[] = '';
+							
+						}
+						
+					}
+					
+					fputcsv($csvFile, $arRow);
+					
+				}
+				
+				fclose($csvFile);
+				
+				header('Content-Type: text/csv');
+				header('Content-Disposition: attachment; filename="export.csv"');
+				
+				readfile($csvFilePath);
+				unlink($csvFilePath);
+				
+				exit;
+				
+			} else {
+				
+				die("Keine Daten zu exportieren");
+				
+			}
+			
+		}
+	
+		private static function deleteTicketAction(array $request): array {
+			
+			$oTicket = Ticket::getInstance($request['ticket_id']);
+			$oTicket->delete();
+			
+			return [
+				'ticket' => $oTicket->toJSON()
+			];
+			
+		}
+		
+		private static function getTicketBookingAction(array $request): array {
+			
+			try {
+				
+				$oTicketBooking = TicketBooking::getInstance(intval($request['ticket_booking_id']));
+				
+				return [
+					'found' => true,
+					'loading' => false,
+					'tab' => 1,
+				] + $oTicketBooking->toJSON();
+				
+				throw new \Exception(__('TicketBuchung konnte nicht geladen werden.', 'wpsg'));
+				
+			} catch (\Exception $e) {
+				
+				return [
+					'found' => false,
+					'exception' => $e->getMessage()
+				];
+				
+			}
+			
+		}
+		
+		private static function save_ticketsAction(array $request): array {
+			
+			global $wpdb;
+			
+			$serial_id = intval($request['serial']['id']??0);
+			
+			if ($serial_id <= 0) {
+				
+				$wpdb->show_errors = true;
+				
+				$wpdb->insert(WPSG_TBL_TICKETS, [
+					'autoticket' => json_encode($request['serial']),
+					'p_id' => $request['product_id'],
+					'label' => $request['serial']['label'],
+					'label_short' => $request['serial']['label_short'],
+					'from_date' => $request['serial']['from_date'],
+					'from_time' => $request['serial']['event_data']['to_time'],
+					'to_date' => $request['serial']['to_date'],
+					'to_time' => $request['serial']['event_data']['to_time'],
+					'slots' =>  $request['serial']['event_data']['slots'],
+					'state' => Ticket::STATE_ACTIVE
+				], [
+					'%s', '%d', '%s', '%s', '%s', '%s', '%s', '%s', '%d', '%d'
+				]);
+		 
+				$ticket_id = $wpdb->insert_id;
+				
+			} else {
+				
+				$wpdb->update(WPSG_TBL_TICKETS, [
+					'autoticket' => json_encode($request['serial']),
+					'p_id' => $request['product_id'],
+					'label' => $request['serial']['label'],
+					'label_short' => $request['serial']['label_short'],
+					'from_date' => $request['serial']['from_date'],
+					'from_time' => $request['serial']['event_data']['from_time'],  // Annahme korrekte Zuweisung wie im Insert-Teil
+					'to_date' => $request['serial']['to_date'],
+					'to_time' => $request['serial']['event_data']['to_time'],
+					'slots' => 20, //$request['serial']['event_data']['slots'],
+					'state' => Ticket::STATE_ACTIVE
+				], [
+					'id' => $serial_id
+				], [
+					'%s', '%d', '%s', '%s', '%s', '%s', '%s', '%s', '%d', '%d'
+				], [
+					'%d'
+				]);
+
+				$ticket_id = $serial_id;
+				
+			}
+			
+			$oTicket = Ticket::getInstance($ticket_id);
+			$oTicket->createTickets();
+			
+			return [true];
+			
+		}
+		
+		private static function add_ticketsAction(array $request): array {
+		
+			$oTicketProduct = TicketProduct::getInstance($request['product_id']);
+			$oTicketProduct->addTickets(
+				$request['data']['from_date'], $request['data']['from_time'],
+				$request['data']['to_date'], $request['data']['to_time'],
+				$request['data']['slots']
+			);
+			
+			return [true];
+			
+		}
+		
+		private static function revokeBookingAction(array $request): array {
+			
+			$oTicketBooking = TicketBooking::getInstance($request['booking_id']);
+			$oTicketBooking->revoke();
+			
+			return [
+				'result' => true,
+				'ticket_booking' =>  [
+					'found' => true,
+					'loading' => false,
+					'tab' => 1,
+				] + TicketBooking::getInstance($oTicketBooking->getId(), true)->toJSON(true)
+			];
+			
+		}
+	
+		private static function decodeTicketAction(array $request): array {
+			
+			try {
+				
+				$order_product_id = intval($request['order_product_id']);
+				$amount_index = intval($request['amount_index']);
+				$hash = $request['hash'];
+				
+				$oOrderProduct = \wpsg_order_product::getInstance($order_product_id);
+				$ticket_secrets = $oOrderProduct->getMeta('ticket_secrets');
+				
+				if (md5($ticket_secrets[$amount_index]) === $hash) {
+					
+					$oTicketBooking = TicketBooking::getInstanceByBookingKey(
+						TicketBooking::encodeBookingKey($order_product_id, $amount_index)
+					);
+					
+					if ($request['log'] === true) {
+						
+						$oTicketBooking->addBookingLog(TicketBooking::LOG_SCAN);
+						
+					}
+					
+					return [
+						'found' => true,
+						'loading' => false,
+						'tab' => 1,
+					] + $oTicketBooking->toJSON();
+					
+				}
+				
+			} catch (\Exception $e) {
+				
+				return [
+					'found' => false,
+					'exception' => $e->getMessage()
+				];
+				
+			}
+			
+			return [
+				'found' => false
+			];
+			
+		}
+		
+		private static function previewAction(array $request): array {
+		
+			TicketRenderer::render(intval($request['template_id'])); exit;
+			
+			return [];
+			
+		}
+		
+		private static function saveSettingsAction(array $request): array {
+			
+			global $wpdb;
+			
+			\wpsg_ShopController::getShop()->update_option('wpsg_mod_ticket_orderstate_active', implode(',', $request['wpsg_mod_ticket_orderstate_active']??''));
+			\wpsg_ShopController::getShop()->update_option('wpsg_mod_ticket_orderstate_send', implode(',', $request['wpsg_mod_ticket_orderstate_send']??''));
+			
+			foreach ($request['arTemplates'] as $template_data) {
+			
+				TicketTemplate::save($template_data);
+			
+			}
+			
+			return [];
+			
+		}
+		
+		private static function getBackgroundAction(array $request): array {
+			
+			$oTemplate = TicketTemplate::getInstance(intval($request['template_id']));
+			
+			$file = $oTemplate->getBgFilePath();
+			
+			$mimeType = mime_content_type($file);
+
+			header("Content-Type: $mimeType");
+			header("Content-Length: ".filesize($file));
+			header("Content-Disposition: inline; filename=\"".basename($file)."\"");
+		
+			readfile($file);  // Datei ausgeben
+			exit;
+			
+			return [];
+			
+		}
+		
+		private static function uploadBgAction(array $request): array {
+			
+			TicketTemplate::save($request['template']);
+			$oTemplate = TicketTemplate::getInstance($request['template']['id']);
+			
+			$path = $oTemplate->getStoragePath();
+			
+			if (file_exists($path)) wpsg_clearDirectory($path); \wpsg_ShopController::getShop()->protectDirectory($path);
+			
+			file_put_contents($path.$request['file']['fileName'], base64_decode($request['file']['fileData']));
+			
+			return [
+				'template' => $oTemplate->toJSON()
+			];
+			
+		}
+		
+		private static function addTemplateAction(array $request): array {
+			
+			global $wpdb;
+			
+			$wpdb->insert(WPSG_TBL_TICKET_TEMPLATES, [
+				'config' => json_encode([
+					'width' => 85.6,
+					'height' => 53.98,
+					'arField' => [
+						[
+							'x' => 10, 'y' => 10, 'w' => 33.98, 'h' => 33.98,
+							'align' => 'L', 'color' => '000000', 'opaque' => '1', 'angle' => 0,
+							'text' => '%qr%', 'font' => 'helvetica.php', 'fontsize' => 12
+						]
+					]
+				]),
+				'template_name' => $request['template_name']
+			], [
+				'%s',
+				'%s'
+			]);
+			
+			$template_id = $wpdb->insert_id;
+			
+			return [
+				'template' => TicketTemplate::getInstance($template_id)->toJSON()
+			];
+			
+		}
+		
+		private static function changeStateAction(array $request): array {
+			
+			$oTicket = Ticket::getInstance($request['ticket_id']);
+			$oTicket->changeState();
+			
+			return [
+				'ticket' => $oTicket->toJSON()
+			];
+			
+		}
+		
+		private static function getTicketAction(array $request): array {
+			
+			$arPager = $request['pager'];
+			
+			$arPager['count'] = Ticket::count($request['filter']);
+			$arPager['pages'] = ceil($arPager['count'] / $arPager['per_page']);
+			$arPager['page'] = max(min(($arPager['page']??1), $arPager['pages']), 1);
+			
+			$arPagerSerial = $request['pager_serial'];
+			
+			$arPagerSerial['count'] = Ticket::countSerial($request['filter_serial']);
+			$arPagerSerial['pages'] = ceil($arPagerSerial['count'] / $arPagerSerial['per_page']);
+			$arPagerSerial['page'] = max(min(($arPagerSerial['page']??1), $arPagerSerial['pages']), 1);
+			
+			return [
+				'items' => Ticket::find($request['filter'], $arPager, false, true),
+				'items_serial' => Ticket::findSerial($request['filter_serial'], false, true),
+				'pager' => $arPager,
+				'pager_serial' => $arPagerSerial
+			];
+			
+		}
+		
+	}
Index: /mods/mod_ticket/classes/PDF.php
===================================================================
--- /mods/mod_ticket/classes/PDF.php	(revision 8427)
+++ /mods/mod_ticket/classes/PDF.php	(revision 8427)
@@ -0,0 +1,94 @@
+<?php
+	
+	declare(strict_types=1);
+	
+	/**
+	 * @author: Daniel Schmitzer (daniel@maennchen1.de)
+	 * @date: 04.11.23
+	 * @time: 11:46
+	 */
+	
+	namespace wpsgTicket;
+	
+	class PDF extends \setasign\Fpdi\Fpdi {
+	
+		var $extgstates = [];
+		
+		function TextWithRotation($x, $y, $txt, $txt_angle, $font_angle = 0): void {
+			
+		    $txt = str_replace(')', '\\)', str_replace('(', '\\(', str_replace('\\', '\\\\', $txt)));
+		
+		    $font_angle += 90+$txt_angle;
+		    $txt_angle *= M_PI/180;
+		    $font_angle *= M_PI/180;
+		
+		    $txt_dx = cos($txt_angle);
+		    $txt_dy = sin($txt_angle);
+		    $font_dx = cos($font_angle);
+		    $font_dy = sin($font_angle);
+		
+		    $s = sprintf('BT %.2f %.2f %.2f %.2f %.2f %.2f Tm (%s) Tj ET',
+		             $txt_dx, $txt_dy, $font_dx, $font_dy,
+		             $x*$this->k, ($this->h-$y)*$this->k, $txt);
+			
+		    if ($this->ColorFlag)
+		        $s='q '.$this->TextColor.' '.$s.' Q';
+		    $this->_out($s);
+		}
+		 
+	    function SetAlpha($alpha, $bm='Normal')
+	    {
+	        // set alpha for stroking (CA) and non-stroking (ca) operations
+	        $gs = $this->AddExtGState(array('ca'=>$alpha, 'CA'=>$alpha, 'BM'=>'/'.$bm));
+	        $this->SetExtGState($gs);
+	    }
+	
+	    function AddExtGState($parms)
+	    {
+	        $n = count($this->extgstates)+1;
+	        $this->extgstates[$n]['parms'] = $parms;
+	        return $n;
+	    }
+	 	  
+	    function SetExtGState($gs)
+	    {
+	        $this->_out(sprintf('/GS%d gs', $gs));
+	    }
+		
+		function _enddoc()
+	    {
+	        if(!empty($this->extgstates) && $this->PDFVersion<'1.4')
+	            $this->PDFVersion='1.4';
+	        parent::_enddoc();
+	    }
+	
+	    function _putextgstates()
+	    {
+	        for ($i = 1; $i <= count($this->extgstates); $i++)
+	        {
+	            $this->_newobj();
+	            $this->extgstates[$i]['n'] = $this->n;
+	            $this->_out('<</Type /ExtGState');
+	            foreach ($this->extgstates[$i]['parms'] as $k=>$v)
+	                $this->_out('/'.$k.' '.$v);
+	            $this->_out('>>');
+	            $this->_out('endobj');
+	        }
+	    }
+
+	    function _putresourcedict()
+	    {
+	        parent::_putresourcedict();
+	        $this->_out('/ExtGState <<');
+	        foreach((array)$this->extgstates as $k=>$extgstate)
+	            $this->_out('/GS'.$k.' '.$extgstate['n'].' 0 R');
+	        $this->_out('>>');
+	    }
+	
+	    function _putresources()
+	    {
+	        $this->_putextgstates();
+	        parent::_putresources();
+	    }
+	
+	}
Index: /mods/mod_ticket/classes/Plugin.php
===================================================================
--- /mods/mod_ticket/classes/Plugin.php	(revision 8427)
+++ /mods/mod_ticket/classes/Plugin.php	(revision 8427)
@@ -0,0 +1,159 @@
+<?php
+	
+	declare(strict_types=1);
+	
+	/**
+	 * @author: Daniel Schmitzer (daniel@maennchen1.de)
+	 * @date: 14.10.23
+	 * @time: 07:51
+	 */
+	
+	namespace wpsgTicket;
+	
+	class Plugin {
+		
+		protected static $instance = null;
+		
+		public function __construct() {
+		
+		}
+		
+		/**
+		 * Erstellt den QR Code
+		 *
+		 * @param int $order_product_id
+		 * @param int $amount_index
+		 * @return string
+		 */
+		public function buildCode(int $order_product_id, int $amount_index): string {
+			
+			$oOrderProduct = \wpsg_order_product::getInstance($order_product_id);
+			$ticket_secrets = $oOrderProduct->getMeta('ticket_secrets');
+			
+			return $oOrderProduct->getId().'|'.$amount_index.'|'.md5($ticket_secrets[$amount_index]);
+			
+		}
+		
+		public function getActiveOrderState(): array {
+		
+			$wpsg_mod_ticket_orderstate_active = \wpsg_ShopController::getShop()->get_option('wpsg_mod_ticket_orderstate_active');
+			if ($wpsg_mod_ticket_orderstate_active === false) return [];
+			
+			return array_map('intval', explode(',', $wpsg_mod_ticket_orderstate_active));
+		
+		}
+		
+		public function getSendOrderState(): array {
+		
+			$wpsg_mod_ticket_orderstate_send = \wpsg_ShopController::getShop()->get_option('wpsg_mod_ticket_orderstate_send');
+			if ($wpsg_mod_ticket_orderstate_send === false) return [];
+			
+			return array_map('intval', explode(',', $wpsg_mod_ticket_orderstate_send));
+		
+		}
+		
+		public function render(string $template, array $view): string {
+			
+			return \wpsg_ShopController::getShop()->render(WPSG_PATH_VIEW.'mods/mod_ticket/'.$template, false);
+			
+		}
+		
+		public function templatePath(): string {
+			
+			return dirname(__FILE__).DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'views'.DIRECTORY_SEPARATOR;
+			
+		}
+		
+		public function sendTickets(int $order_id, bool $resend = false): void {
+		
+			$oOrder = \wpsg_order::getInstance(intval($order_id));
+			
+			$arTicketBookingIDSend = [];
+			
+			foreach ($oOrder->getOrderProducts() as $oOrderProduct) {
+		
+				$oOrderProduct->getMeta('ticket_id', false, 0);
+				
+				$ticket_id = intval($oOrderProduct->getMeta('ticket_id', false, 0));
+				
+				if ($ticket_id > 0) {
+					
+					for ($amount_index = 0; $amount_index < $oOrderProduct->getAmount(); $amount_index ++) {
+						
+						$oTicketBooking = TicketBooking::getInstanceByBookingKey(TicketBooking::encodeBookingKey($oOrderProduct->getId(), $amount_index));
+					
+						if ($resend || !$oTicketBooking->isSend()) $arTicketBookingIDSend[] = $oTicketBooking->getId();
+						
+					}
+					
+				}
+				
+			}
+			
+			if (sizeof($arTicketBookingIDSend) > 0) {
+				
+				$oShop = \wpsg_ShopController::getShop();
+				$oShop->view['arTicketBookingIDs'] = $arTicketBookingIDSend;
+				$oShop->view['oOrder'] = $oOrder;
+				
+				$mail_txt = $oShop->render(implode(DIRECTORY_SEPARATOR, [WPSG_PATH_VIEW, 'mods', 'mod_ticket', 'ticket_mail.phtml']), false);
+				$mail_html = $oShop->render(implode(DIRECTORY_SEPARATOR, [WPSG_PATH_VIEW, 'mods', 'mod_ticket', 'ticket_mail_html.phtml']), false);
+				
+				$arAttachment = [];
+				
+				foreach ($arTicketBookingIDSend as $ticket_booking_id) {
+					
+					$oTicketBooking = TicketBooking::getInstance($ticket_booking_id);
+					
+					TicketRenderer::render(null, $oTicketBooking->getOrderProductID(), $oTicketBooking->getAmountIndex(), false);
+					$arAttachment[] = $oTicketBooking->getTicketPDFPath();
+					
+				}
+				
+				$oShop->sendMail($mail_txt, $oOrder->getCustomer()->getEMail(), 'ticketmail', $arAttachment, $oOrder->getId(), $oOrder->getCustomer()->getId(), $mail_html);
+				
+				foreach ($arTicketBookingIDSend as $ticket_booking_id) {
+					
+					$oTicketBooking = TicketBooking::getInstance($ticket_booking_id);
+					$oTicketBooking->setSend();
+					
+				}
+			
+			}
+		
+		}
+		
+		/** static */
+		
+		public static function getInstance(): Plugin {
+			
+			if (!isset(static::$instance)) static::$instance = new static;
+			
+			return static::$instance;
+			
+		}
+		
+		/**
+		 * Gibt einen Array mit Tagen im Format YYYY-MM-DD zurÃŒck die zwischen $startDate und $endDate liegen
+		 *
+		 * @param string $startDate
+		 * @param string $endDate
+		 * @return string[]
+		 * @throws \Exception
+		 */
+		public static function getDatesBetween(string $startDate, string $endDate): array {
+   
+			$start = new \DateTime($startDate);
+			$end = new \DateTime($endDate);
+			$interval = new \DateInterval('P1D');
+			$period = new \DatePeriod($start, $interval, $end->modify('+1 day'));
+
+			$arDates = [];
+		
+			foreach ($period as $date) $arDates[] = $date->format('Y-m-d');
+			
+			return $arDates;
+
+		}
+		
+	}
Index: /mods/mod_ticket/classes/QrScanner.php
===================================================================
--- /mods/mod_ticket/classes/QrScanner.php	(revision 8427)
+++ /mods/mod_ticket/classes/QrScanner.php	(revision 8427)
@@ -0,0 +1,21 @@
+<?php
+	
+	declare(strict_types=1);
+	
+	/**
+	 * @author: Daniel Schmitzer (daniel@maennchen1.de)
+	 * @date: 13.11.23
+	 * @time: 19:09
+	 */
+	
+	namespace wpsgTicket;
+	
+	abstract class QrScanner {
+		
+		public static function dispatch(): void {
+			
+			include implode(DIRECTORY_SEPARATOR, [WPSG_PATH_VIEW, 'mods', 'mod_ticket', 'qrScanner.phtml']);
+			
+		}
+		
+	}
Index: /mods/mod_ticket/classes/Ticket.php
===================================================================
--- /mods/mod_ticket/classes/Ticket.php	(revision 8427)
+++ /mods/mod_ticket/classes/Ticket.php	(revision 8427)
@@ -0,0 +1,667 @@
+<?php
+	
+	declare(strict_types=1);
+	
+	/**
+	 * @author: Daniel Schmitzer (daniel@maennchen1.de)
+	 * @date: 20.10.23
+	 * @time: 14:48
+	 */
+	
+	namespace wpsgTicket;
+	
+	class Ticket {
+	
+		private static array $arInstances = [];
+		
+		private ?int $id = null;
+		private ?array $data = null;
+	
+		public const STATE_ACTIVE = 1;
+		public const STATE_INACTIVE = 2;
+		public const STATE_DELETED = 3;
+		
+		public const BOOKING_STATE_OPEN = 1;
+		public const BOOKING_STATE_CLOSED = 2;
+		
+		private function __construct($id) {
+		
+			global $wpdb;
+			
+			$this->id = $id;
+			
+			$query = $wpdb->prepare("SELECT * FROM `".$wpdb->prefix."wpsg_tickets` WHERE id = %d", $id);
+			$this->data = $wpdb->get_row($query, ARRAY_A);
+			
+			if (intval($id) !== intval($this->data['id']??-1)) throw new \Exception(sprintf(__('Ticket mit ID %s kann nicht geladen werden', 'wpsg'), $id));
+			
+		}
+		
+		public function getStartDate(): \DateTime {
+			
+			$start_date_time = $this->__get('from_date');
+			
+			if ($this->__get('from_time') !== '') $start_date_time .= ' '.$this->__get('from_time');
+			
+			return new \DateTime($start_date_time);
+			
+		}
+		
+		public function getEndDate(): \DateTime {
+		
+			if ($this->__get('to_date') !== '') return new \DateTime($this->__get('to_date'));
+			else return $this->getStartDate();
+		
+		}
+		
+		public function getDates(): array {
+			
+			return Plugin::getDatesBetween(
+				$this->getStartDate()->format('Y-m-d'), $this->getEndDate()->format('Y-m-d')
+			);
+			
+		}
+		
+		public function getProductID(): int {
+			
+			return intval($this->__get('p_id'));
+			
+		}
+		
+		public function getProduct(): \wpsg_product {
+			
+			return \wpsg_product::getInstance($this->getProductID());
+			
+		}
+		
+		/**
+		 * Ist das Ticket an Datum $td verfÃŒgbar
+		 *
+		 * @param \DateTime $td
+		 * @return void
+		 */
+		public function isActive(\DateTime $td) {
+		
+			return in_array($td->format('Y-m-d'), $this->getDates());
+		
+		}
+		
+		public function isAvailable(): bool {
+		
+			if ($this->getFreeSlotCount() <= 0) return false;
+			
+			if ($this->getState() === self::STATE_INACTIVE || $this->getState() === self::STATE_DELETED) return false;
+			
+			// Vergangene Termine ausblenden
+			if ($this->getStartDate() < new \DateTime()) {
+				
+				if ($this->__get('from_time') === '' && $this->__get('from_date') === (new \DateTime())->format('Y-m-d')) return true;
+				else return false;
+			
+			}
+			
+			return true;
+		
+		}
+		
+		public function getId(): int {
+			
+			return $this->id;
+			
+		}
+		
+		public function changeState(): void {
+			
+			global $wpdb;
+			
+			$new_state = null;
+			
+			if ($this->getState() === self::STATE_ACTIVE) $new_state = self::STATE_INACTIVE;
+			else if ($this->getState() === self::STATE_INACTIVE) $new_state = self::STATE_ACTIVE;
+			
+			if ($new_state !== null) {
+				
+				$wpdb->update(
+					$wpdb->prefix.'wpsg_tickets',
+					[ 'state' => $new_state ],
+					[ 'id' => $this->getId() ],
+					[ '%d' ],
+					[ '%d' ]
+				);
+				
+				$this->data['state'] = strval($new_state);
+			
+			}
+			
+		}
+		
+		public function delete(): void {
+			
+			global $wpdb;
+			
+			$wpdb->update(
+				$wpdb->prefix.'wpsg_tickets',
+				[ 'state' => self::STATE_DELETED ],
+				[ 'id' => $this->getId() ],
+				[ '%d' ],
+				[ '%d' ]
+			);
+			
+			if ($this->isSerial()) {
+				
+				foreach (self::find(['autoticket_id' => $this->getId()], null, true) as $oTicket) {
+					
+					$oTicket->delete();
+					
+				}
+				
+			}
+			
+			$this->data['state'] = strval(self::STATE_DELETED);
+			
+		}
+		
+		public function getSerialTicket(): Ticket {
+			
+			return Ticket::getInstance(intval($this->__get('autoticket_id')));
+			
+		}
+		
+		/**
+		 * Gibt true zurÃŒck, wenn der Termin aus einem Serientermin erstellt wurde
+		 * @return bool
+		 */
+		public function isSerialTicket(): bool {
+			
+			return intval($this->__get('autoticket_id')) > 0;
+			
+		}
+		
+		/**
+		 * Gibt true bei einem Serientermin zurÃŒck
+		 * @return bool
+		 */
+		public function isSerial(): bool {
+			
+			return $this->__get('autoticket') !== '';
+			
+		}
+		
+		public function getAutoConfig(): array {
+			
+			$autoconfig = $this->__get('autoticket');
+			$autoconfig = json_decode($autoconfig, true);
+
+			if (!is_array($autoconfig)) throw new \Exception(__('Konfiguration des Serientermins kann nicht gelesen werden!'));
+			
+			return $autoconfig;
+			
+		}
+		
+		public function createTickets(): void {
+			
+			global $wpdb;
+		
+			if ($this->isSerial()) {
+			
+				$conf = $this->getAutoConfig();
+				
+				$from_date_obj = new \DateTime($conf['from_date']);
+				$to_date_obj = new \DateTime($conf['to_date']);
+				
+				$interval = new \DateInterval('P1D');
+				$dates = new \DatePeriod($from_date_obj, $interval, $to_date_obj->modify('+1 day'));
+ 
+				$today = new \DateTime();
+				
+				foreach ($dates as $date) {
+
+					if ($date < $today) continue;
+					if ($date->diff($today)->days > intval($conf['days_future']??0)) continue;
+					
+					$strDay = $date->format('Y-m-d');
+					$weekday = (intval($date->format('w')) + 6) % 7;
+					
+					if (in_array($weekday, $conf['days'])) {
+					
+						$where_condition = []; foreach([
+							'autoticket_id' => $this->getId(),
+							'from_date' => $strDay,
+							'to_date' => $strDay
+						] as $column => $value) $where_condition[] = $wpdb->prepare("$column = %s", $value);
+						$query = "SELECT * FROM ".WPSG_TBL_TICKETS." WHERE ".implode(' AND ', $where_condition);
+						$result = $wpdb->get_row($query);
+						
+						if (!$result) {
+						
+							$wpdb->insert(WPSG_TBL_TICKETS, [
+								'p_id' => $this->getProductID(),
+								'from_date' => $strDay,
+								'from_time' => $conf['event_data']['from_time'],
+								'to_date' => $strDay,
+								'to_time' => $conf['event_data']['to_time'],
+								'slots' => $conf['event_data']['slots'],
+								'state' => self::STATE_ACTIVE,
+								'autoticket' => '',
+								'autoticket_id' => $this->getId()
+							]);
+							
+						}
+						
+					}
+					
+				}
+			
+			} else throw new \Exception(__('Aufrufsfehler!'.$this->getId(), 'wpsg'));
+		
+		}
+		
+		public function getTicketPublicURL(int $order_product_id, int $amount_index): string {
+			
+			//$oTicketBooking = TicketBooking::getInstanceByBookingKey(TicketBooking::encodeBookingKey($order_product_id, ))
+			
+			$oOrderProduct = \wpsg_order_product::getInstance($order_product_id);
+			
+			$arTicketSecrets = json_decode($oOrderProduct->getMeta('ticket_secrets'));
+	 
+			return \add_query_arg([
+				'action' => 'wpsg_ticket_frontend',
+				'ticket_action' => 'get',
+				'order_product_id' => $oOrderProduct->getId(),
+				'amount_index' => $amount_index,
+				'hash' => hash_hmac('sha256', strval($oOrderProduct->getId().$amount_index.$this->getId()), $arTicketSecrets[$amount_index])
+			], \admin_url('admin-ajax.php'));
+			
+		}
+		
+		public function toJSON(): array {
+			
+			$r = [
+				'id' => $this->id,
+				'autoticket_id' => intval($this->__get('autoticket_id')),
+				'label' => $this->getLabel(),
+				'label_short' => $this->getShortLabel(),
+				'slots' => $this->getSlotCount(),
+				'slots_used' => $this->getUsedSlotCount(),
+				'slots_available' => $this->getFreeSlotCount(),
+				'state' => $this->getState(),
+				'booking_state' => $this->getBookingState(),
+				'dates' => $this->getDates(),
+				'amount' => 1,
+				'order' => $this->getOrderInfo()
+			];
+			
+			if ($this->isSerial()) {
+				
+				$r['is_autoticket'] = true;
+				$r['autoticket'] = json_decode($this->__get('autoticket'));
+				$r['count_tickets'] = self::count(['autoticket_id' => $this->getId()]);
+				
+			} else {
+				
+				$r['is_autoticket'] = false;
+				
+			}
+			
+			return $r;
+			
+		}
+		
+		public function getState(): int { return intval($this->__get('state')); }
+		
+		public function getOrderInfo(): array {
+			
+			global $wpdb;
+			
+			$arOrderID = $wpdb->get_col(
+				$wpdb->prepare("
+					SELECT
+    					DISTINCT O.`id`
+					FROM
+						`".WPSG_TBL_META."` AS M
+							LEFT JOIN `".WPSG_TBL_ORDERPRODUCT."` AS OP ON (M.`target_id` = OP.`id`)
+							LEFT JOIN `".WPSG_TBL_ORDER."` AS O ON (OP.`o_id` = O.`id`)
+					WHERE
+						M.`meta_table` = 'WPSG_TBL_ORDERPRODUCT' AND
+						M.`meta_key` = 'ticket_id' AND
+						M.`meta_value` = %d AND
+						O.`status` != %d
+					", $this->getId(), \wpsg_ShopController::STATUS_STORNIERT
+				)
+			);
+			
+			$arReturn = [];
+			
+			foreach ($arOrderID as $order_id) {
+				
+				$arReturn[] = [
+					'amount' => intval($wpdb->get_var(
+						$wpdb->prepare("
+							SELECT
+							    SUM(OP.`menge`)
+							FROM
+								 `".WPSG_TBL_ORDERPRODUCT."` AS OP
+									LEFT JOIN `".WPSG_TBL_META."` AS M ON (M.`target_id` = OP.`id` AND M.`meta_table` = 'WPSG_TBL_ORDERPRODUCT' AND M.`meta_key` = 'ticket_id')
+							WHERE
+								OP.`o_id` = %d AND
+								M.`meta_value` = %d
+						", $order_id, $this->getId())
+					)),
+					'order_id' => intval($order_id),
+					'order_nr' => \wpsg_order::getInstance($order_id)->getNr(),
+					'order_invoice_name' => \wpsg_order::getInstance($order_id)->getInvoiceFirstName().' '.\wpsg_order::getInstance($order_id)->getInvoiceName(),
+					'order_link' => \wpsg_admin_url('Order', 'view', ['edit_id' => $order_id], [], true)
+				];
+				
+			}
+			
+			return $arReturn;
+			
+		}
+		
+		public function getBookingState(): int {
+			
+			if (!$this->isAvailable()) return self::BOOKING_STATE_CLOSED;
+			
+			return self::BOOKING_STATE_OPEN;
+			
+		}
+		
+		public function getFreeSlotCount(): int { return $this->getSlotCount() - $this->getUsedSlotCount(); }
+		
+		public function getSlotCount(): int { return intval($this->__get('slots')); }
+		
+		public function getUsedSlotCount(): int {
+			
+			global $wpdb;
+			
+			return intval($wpdb->get_var(
+				$wpdb->prepare("
+					SELECT
+						SUM(OP.`menge`)
+					FROM
+						`".WPSG_TBL_META."` AS M
+							LEFT JOIN `".WPSG_TBL_ORDERPRODUCT."` AS OP ON (OP.`id` = M.`target_id`)
+					WHERE
+						M.`meta_table` = 'WPSG_TBL_ORDERPRODUCT' AND
+						M.`meta_key` = 'ticket_id' AND
+						M.`meta_value` = %d AND
+						OP.`id` IS NOT NULL
+				", $this->getId())
+			));
+			
+		}
+		
+		public function getShortLabel(): string {
+			
+			if ($this->isSerial()) {
+			
+				return $this->__get('label_short');
+				
+			} else return '';
+			
+		}
+		
+		public function getLabel(): string {
+			
+			if ($this->isSerial()) {
+				
+				if (trim($this->__get('label')) !== '') return $this->__get('label');
+				else return __('Serientermin #', 'wpsg').$this->getId();
+				
+			}
+			
+			$strLabel = date('d.m.Y', strtotime($this->__get('from_date')));
+			
+			if ($this->__get('from_time') !== '') $strLabel .= ' '.self::clearTime($this->__get('from_time'));
+			
+			if ($this->__get('to_date') !== '') {
+				
+				$strLabel .= ' - ';
+				
+				if ($this->__get('from_date') !== $this->__get('to_date')) $strLabel .= date('d.m.Y', strtotime($this->__get('to_date'))).' ';
+				
+				if ($this->__get('to_time') !== '') $strLabel .= self::clearTime($this->__get('to_time'));
+				
+			}
+			
+			return $strLabel;
+			
+		}
+		
+		public function __get($key): string {
+			
+			return $this->data[$key]??'';
+			
+		}
+		
+		public static function getQueryWHERE(array $arFilter): string {
+			
+			global $wpdb;
+			
+			$strQueryWHERE = "";
+	 
+			if (intval($arFilter['product_id']??-1) > -1) $strQueryWHERE .= $wpdb->prepare(" AND `p_id` = %d ", intval($arFilter['product_id']));
+			if (intval($arFilter['autoticket_id']??-1) > 0) $strQueryWHERE .= $wpdb->prepare(" AND `autoticket_id` = %d ", intval($arFilter['autoticket_id']));
+			
+			if (intval($arFilter['state']) > 0) $strQueryWHERE .= $wpdb->prepare(" AND `state` = %d ", intval($arFilter['state']));
+			else if (intval($arFilter['state']) !== -1) $strQueryWHERE .= $wpdb->prepare(" AND `state` != %d ", intval(self::STATE_DELETED));
+	 	
+			if (preg_match('/^\d{4}\-\d{2}\-\d{2}$/', $arFilter['day']??'')) {
+			
+				$strQueryWHERE .= "AND
+					(
+						(`to_date` IS NULL AND `from_date` = CAST('".wpsg_q($arFilter['day'])."' AS DATE)) OR
+						(`to_date` >= CAST('".wpsg_q($arFilter['day'])."' AS DATE) AND `from_date` <= CAST('".wpsg_q($arFilter['day'])."' AS DATE))
+					)
+				";
+			
+			}
+			
+			return $strQueryWHERE;
+			
+		}
+		
+		public static function count(array $arFilter): int {
+			
+			global $wpdb;
+			
+			$strQueryWHERE = self::getQueryWHERE($arFilter);
+			
+			$arID = $wpdb->get_col("
+				SELECT
+					`id`
+				FROM
+					`".$wpdb->prefix."wpsg_tickets`
+				WHERE
+					1
+					".$strQueryWHERE." AND COALESCE(`autoticket`, '') = ''
+			");
+			
+			$return = function(array $arID) use ($arFilter): int {
+				
+				if (($arFilter['hideInactive']??false) === true) {
+					
+					foreach ($arID as $k => $v) {
+					
+						$o = Ticket::getInstance(intval($v));
+						
+						if (!$o->isAvailable()) unset($arID[$k]);
+						
+					}
+					
+				}
+
+				return sizeof($arID);
+				
+			};
+			
+			return $return($arID);
+			
+		}
+		
+		/**
+		 * @param array $arFilter
+		 * @param array|null $arPager
+		 * @param bool $getObject
+		 * @param $getJSON
+		 * @return Ticket[]
+		 */
+		public static function find(array $arFilter, ?array $arPager = null, bool $getObject = false, $getJSON = false): array {
+		
+			global $wpdb;
+			
+			$strQueryWHERE = self::getQueryWHERE($arFilter);
+			
+			$arID = $wpdb->get_col("
+				SELECT
+					`id`
+				FROM
+					`".$wpdb->prefix."wpsg_tickets`
+				WHERE
+					1
+					".$strQueryWHERE." AND COALESCE(`autoticket`, '') = ''
+			");
+			
+			if (($arFilter['hideInactive']??false) === true) {
+			
+				foreach ($arID as $k => $id) {
+					
+					$o = Ticket::getInstance(intval($id));
+					
+					if (!$o->isAvailable()) unset($arID[$k]);
+					
+				}
+				
+			}
+			
+			$arReturn = $arID;
+			
+			if ($arPager !== null) {
+				
+				$per_page = intval($arPager['per_page'] ?? 1);
+				$page = intval($arPager['page'] ?? 1);
+				
+				$offset = ($page - 1) * $per_page;
+				
+				$arReturn = array_slice($arReturn, $offset, $per_page);
+				
+			}
+			
+			if ($getObject === true) {
+				
+				foreach ($arReturn as $k => $v) $arReturn[$k] = Ticket::getInstance(intval($v));
+				
+			} else if ($getJSON === true) {
+				
+				foreach ($arReturn as $k => $v) $arReturn[$k] = Ticket::getInstance(intval($v))->toJSON();
+				
+			}
+			
+			return array_values($arReturn);
+			
+		}
+		
+		public static function countSerial(array $arFilter): int {
+			
+			global $wpdb;
+			
+			$strQueryWHERE = self::getQueryWHERE($arFilter);
+			
+			$arID = $wpdb->get_col("
+				SELECT
+					`id`
+				FROM
+					`".$wpdb->prefix."wpsg_tickets`
+				WHERE
+					1
+					".$strQueryWHERE." AND COALESCE(`autoticket`, '') != ''
+			");
+			
+			$return = function(array $arID) use ($arFilter): int {
+				
+				if (($arFilter['hideInactive']??false) === true) {
+					
+					foreach ($arID as $k => $v) {
+					
+						$o = Ticket::getInstance(intval($v));
+						
+						if (!$o->isAvailable()) unset($arID[$k]);
+						
+					}
+					
+				}
+
+				return sizeof($arID);
+				
+			};
+			
+			return $return($arID);
+			
+		}
+		
+		/**
+		 * @param array $arFilter
+		 * @param bool $getObject
+		 * @param bool $getJSON
+		 * @return Ticket[]
+		 */
+		public static function findSerial(array $arFilter, bool $getObject = false, bool $getJSON = false): array {
+			
+			global $wpdb;
+			
+			$strQueryWHERE = self::getQueryWHERE($arFilter);
+			
+			$arID = $wpdb->get_col("
+				SELECT
+					`id`
+				FROM
+					`".$wpdb->prefix."wpsg_tickets`
+				WHERE
+					1
+					".$strQueryWHERE." AND COALESCE(`autoticket`, '') != ''
+			");
+			
+			if (($arFilter['hideInactive']??false) === true) {
+			
+				foreach ($arID as $k => $id) {
+					
+					$o = Ticket::getInstance(intval($id));
+					
+					if (!$o->isAvailable()) unset($arID[$k]);
+					
+				}
+				
+			}
+			
+			$arReturn = $arID;
+			
+			if ($getObject === true) {
+				
+				foreach ($arReturn as $k => $v) $arReturn[$k] = Ticket::getInstance(intval($v));
+				
+			} else if ($getJSON === true) {
+				
+				foreach ($arReturn as $k => $v) $arReturn[$k] = Ticket::getInstance(intval($v))->toJSON();
+				
+			}
+			
+			return array_values($arReturn);
+			
+		}
+		
+		public static function getInstance($id): Ticket {
+   
+			if (!isset(self::$arInstances[$id])) self::$arInstances[$id] = new self($id);
+			
+        	return self::$arInstances[$id];
+    
+		}
+		
+		public static function clearTime(string $time): string {
+			
+			return preg_replace('/\:00$/', '', $time);
+			
+		}
+		
+	}
Index: /mods/mod_ticket/classes/TicketBooking.php
===================================================================
--- /mods/mod_ticket/classes/TicketBooking.php	(revision 8427)
+++ /mods/mod_ticket/classes/TicketBooking.php	(revision 8427)
@@ -0,0 +1,380 @@
+<?php
+	
+	declare(strict_types=1);
+	
+	/**
+	 * @author: Daniel Schmitzer (daniel@maennchen1.de)
+	 * @date: 18.11.23
+	 * @time: 15:58
+	 */
+	
+	namespace wpsgTicket;
+	
+	class TicketBooking {
+	 
+		const LOG_SCAN = 1;
+		const LOG_REVOKE = 2;
+		
+		const STATUS_AVAILABLE = 1;
+		const STATUS_UNAVAILABLE = 2;
+		
+		private static array $arInstances = array();
+		
+		private ?int $booking_id = null;
+		public ?array $data = null;
+		
+		public function __construct(int $booking_id) {
+		
+			global $wpdb;
+			
+			$this->booking_id = $booking_id;
+			
+			$sql = $wpdb->prepare("SELECT * FROM ".$wpdb->prefix."wpsg_ticket_booking WHERE id = %d", $booking_id);
+			$this->data = $wpdb->get_row($sql, ARRAY_A);
+			
+		}
+		
+		public function getId(): int { return $this->booking_id; }
+		public function getOrderID(): int { return intval($this->data['order_id']); }
+		public function getOrder(): \wpsg_order { return \wpsg_order::getInstance($this->getOrderID()); }
+		public function getOrderProductID(): int { return intval($this->data['order_product_id']); }
+		public function getOrderProduct(): \wpsg_order_product { return \wpsg_order_product::getInstance($this->getOrderProductID()); }
+		public function getProductID(): int { return intval($this->data['product_id']); }
+		public function getProduct(): TicketProduct { return TicketProduct::getInstance($this->getProductID()); }
+		public function getTicketID(): int { return intval($this->data['ticket_id']); }
+		public function getTicket(): Ticket { return Ticket::getInstance($this->getTicketID()); }
+		public function getAmountIndex(): int { return intval($this->data['amount_index']); }
+		public function getBookingKey(): string { return $this->data['booking_key']; }
+		public function isRevoked(): bool { return intval($this->data['revoke_user']??0) > 0; }
+		public function isSend(): bool { return intval($this->data['send_user']) > 0; }
+		public function getStatusCode(): int {
+			
+			if ($this->isRevoked()) return self::STATUS_UNAVAILABLE;
+		
+			$wpsg_mod_ticket_orderstate_active = Plugin::getInstance()->getActiveOrderState();
+			
+			if (!in_array($this->getOrder()->getStatusCode(), $wpsg_mod_ticket_orderstate_active)) return self::STATUS_UNAVAILABLE;
+			
+			return self::STATUS_AVAILABLE;
+		
+		}
+		
+		public function getRevokeTooltip(): string {
+			
+			if ($this->isRevoked()) {
+				
+				$tSend = strtotime($this->data['revoke_time']);
+				
+				return wpsg_translate(__('Am #1# um #2# von #3# entwertet.', 'wpsg'), date('d.m.Y', $tSend), date('H:i', $tSend), \get_userdata(intval($this->data['revoke_user']))->display_name);
+				
+			} else return '';
+			
+		}
+		
+		public function isSendTooltip(): string {
+			
+			if ($this->isSend()) {
+				
+				$tSend = strtotime($this->data['send_time']);
+				
+				return wpsg_translate(__('Am #1# um #2# von #3# versendet.', 'wpsg'), date('d.m.Y', $tSend), date('H:i', $tSend), \get_userdata(intval($this->data['send_user']))->display_name);
+				
+			} else return '';
+			
+		}
+		
+		public function getStateLabel(): string {
+			
+			return match($this->getStatusCode()) {
+				self::STATUS_UNAVAILABLE => __('Inaktiv', 'wpsg'),
+				self::STATUS_AVAILABLE => __('Aktiv', 'wpsg')
+			};
+		}
+		
+		public function isTimeRaised(): bool {
+			
+			return !$this->getTicket()->isActive(new \DateTime());
+			
+		}
+		
+		public function revoke(): void {
+		
+			global $wpdb;
+			
+			$result = $wpdb->update($wpdb->prefix."wpsg_ticket_booking", [
+				'revoke_user' => \get_current_user_id(),
+				'revoke_time' => \current_time('mysql')
+			], [
+				'id' => $this->getId()
+			]);
+			
+			$this->addBookingLog(self::LOG_REVOKE);
+		
+		}
+		
+		public function setSend(): void {
+			
+			global $wpdb;
+			
+			$wpdb->update($wpdb->prefix."wpsg_ticket_booking", [
+				'send_user' => \get_current_user_id(),
+				'send_time' => \current_time('mysql')
+			], [
+				'id' => $this->getId()
+			]);
+			
+		}
+		
+		public function getBookingLog(): array {
+			
+			global $wpdb;
+			
+			$query = $wpdb->prepare(
+				"SELECT * FROM ".$wpdb->prefix."wpsg_ticket_log  WHERE booking_id = %d",
+				$this->getId()
+			);
+			
+			$arReturn = [];
+
+			foreach ($wpdb->get_results($query, ARRAY_A) as $k => $l) {
+				
+				$l['log'] = intval($l['log']);
+				
+				$user_data = \get_userdata(intval($l['user_id']));
+				
+				$l['user_name'] = $user_data->display_name;
+				
+				$arReturn[] = $l;
+				
+			}
+			
+			return $arReturn;
+			
+		}
+		
+		public function toJSON(bool $bLoadSibling = true): array {
+			
+			$oOrderProduct = \wpsg_order_product::getInstance($this->getOrderProductID());
+			$oTicket = Ticket::getInstance($this->getTicketID());
+			$oShop = \wpsg_ShopController::getShop();
+			
+			$revoke_text = '';
+			
+			if ($this->isRevoked()) {
+				
+				$revoke_user = \get_userdata(intval(intval($this->data['revoke_user'])));
+				$revoke_time = strtotime($this->data['revoke_time']);
+				
+				$revoke_text = wpsg_translate(__('Am #1# um #2# von #3# entwertet.', 'wpsg'), date('d.m.Y', $revoke_time), date('H:i', $revoke_time), $revoke_user->display_name);
+				
+			} else {
+				
+				if (!$this->getTicket()->isActive(new \DateTime())) $revoke_text = __('Ausgelaufen', 'wpsg');
+				else {
+					
+					$wpsg_mod_ticket_orderstate_active = Plugin::getInstance()->getActiveOrderState();
+					if (!in_array($this->getOrder()->getStatusCode(), $wpsg_mod_ticket_orderstate_active)) $revoke_text = __('Bestellstatus ungÃŒltig', 'wpsg');
+				
+				}
+				
+			}
+			
+			$r = [
+				'label' => $this->getLabel(),
+				'booking_id' => $this->getId(),
+				'ticket_product_label' => $this->getProduct()->getProduct()->getProductName(),
+				'order_product_price' => $this->getOrderProduct()->getPrice(\wpsg_ShopController::getShop()->getBackendTaxview()),
+				'order_product_price_ff' => wpsg_ff($this->getOrderProduct()->getPrice($oShop->getBackendTaxview()), $oShop->get_option('wpsg_currency')),
+				'order_product_id' => $this->getOrderProductID(),
+				'amount_index' => $this->getAmountIndex(),
+				'revoked' => $this->isRevoked(),
+				'ticket_id' => $oTicket->getId(),
+				'ticket_data' => $oTicket->toJSON(),
+				'booking_key' => $this->getBookingKey(),
+				'order_id' => $this->getOrderID(),
+				'order_nr' => $this->getOrder()->getNr(),
+				'order_state_label' => $this->getOrder()->getStateLabel(),
+				'order_state' => $this->getOrder()->getStatusCode(),
+				'wpsg_mod_ticket_orderstate_active' => Plugin::getInstance()->getActiveOrderState(),
+				'order_title' => $this->getOrder()->getInvoiceTitle(),
+				'order_firstname' => $this->getOrder()->getInvoiceFirstName(),
+				'order_lastname' => $this->getOrder()->getInvoiceName(),
+				'time_raised' => $this->isTimeRaised(),
+				'state_code' => $this->getStatusCode(),
+				'state_label' => $this->getStateLabel(),
+				'log' => $this->getBookingLog(),
+				'is_send' => $this->isSend(),
+				'is_send_tooltip' => $this->isSendTooltip(),
+				'revoke_text' => $revoke_text,
+				'urls' => [
+					'pdf' => $this->getTicketPublicURL(),
+					'order_edit' => wpsg_admin_url('Order', 'view', ['edit_id' => $this->getOrderID()], [], true),
+					'product_edit' => html_entity_decode(wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Produkt&action=edit&edit_id='.$this->getProductID(), 'wpsg-product-edit-'.$this->getProductID()))
+				]
+			];
+			
+			$arProductVarData = \wpsg_ShopController::getShop()->callMod('wpsg_mod_productvars', 'getAllProductVarValues', [$this->getOrderID(), $this->getOrderProduct()->getProductIndex()]);
+			
+			$r['arProductVars'] = [];
+			
+			if (sizeof($arProductVarData??[]) > 0) {
+				
+				$r['arProductVars'] = array_values($arProductVarData);
+				
+			}
+			
+			
+			if ($bLoadSibling) $r['sibling'] = $this->getSiblingTicketBooking();
+			
+			return $r;
+			
+		}
+		
+		public function getLabel(): string  {
+			
+			return 'Ticket #'.$this->getOrderProductID().'-'.($this->getAmountIndex() + 1);
+			
+		}
+		
+		public function getTicketPublicURL(): string { return $this->getTicket()->getTicketPublicURL($this->getOrderProductID(), $this->getAmountIndex()); }
+		
+		/**
+		 * Gibt weitere TicketBuchungen
+		 * @return array
+		 */
+		public function getSiblingTicketBooking(): array {
+		
+			$arTicketBooking = [];
+			
+			foreach ($this->getOrder()->getOrderProducts() as $oOrderProduct) {
+				
+				$ticket_id = intval($oOrderProduct->getMeta('ticket_id'));
+				
+				if ($ticket_id > 0) {
+					
+					for ($amount_index = 0; $amount_index < $oOrderProduct->getAmount(); $amount_index ++) {
+						
+						// if ($this->getOrderProductID() !== $oOrderProduct->getId() || $this->getAmountIndex() !== $amount_index) {
+							
+						$oTicketBooking = TicketBooking::getInstanceByBookingKey(TicketBooking::encodeBookingKey(
+							$oOrderProduct->getId(), $amount_index
+						));
+					
+						$arTicketBooking[] = $oTicketBooking->toJSON(false);
+							
+						//}
+						
+					}
+					
+				}
+				
+			}
+			
+			return $arTicketBooking;
+			
+		}
+		
+		public function addBookingLog(int $log): void {
+			
+			global $wpdb;
+			
+			$wpdb->insert(
+				$wpdb->prefix."wpsg_ticket_log",
+				[
+					'booking_id' => $this->getId(),
+					'log' => $log,
+					'user_id' => \get_current_user_id(),
+					'date_time' => \current_time('mysql')
+				]
+			);
+		
+		}
+		
+		public function getTicketPDFPath(): string {
+			
+			return $this->getStoragePath().'ticket_'.$this->getId().'.pdf';
+			
+		}
+		
+		public function getStoragePath(): string {
+			
+			 if (\wpsg_ShopController::getShop()->isMultiBlog()) {
+
+                $path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_ticket/tickets/';
+
+            } else {
+
+                $path = WP_CONTENT_DIR.'/uploads/wpsg/wpsg_ticket/tickets/';
+
+            }
+			 
+			$path .= $this->getId().DIRECTORY_SEPARATOR;
+			
+			\wpsg_ShopController::getShop()->protectDirectory($path);
+			 
+			 return $path;
+			
+		}
+		
+		/** Static */
+		
+		public static function encodeBookingKey(int $order_product_id, int $amount_index): string {
+			
+			$oOrderProduct = \wpsg_order_product::getInstance($order_product_id);
+			
+			$ticket_id = $oOrderProduct->getMeta('ticket_id');
+			
+			return $oOrderProduct->getProductId().'|'.$oOrderProduct->getOrder()->getId().'|'.$order_product_id.'|'.$ticket_id.'|'.$amount_index;
+			
+		}
+		
+		public static function decodeBookingKey(string $booking_key): array {
+			
+			$arKey = explode('|', $booking_key);
+			
+			return [
+				'product_id' => intval($arKey[0]),
+				'order_id' => intval($arKey[1]),
+				'order_product_id' => intval($arKey[2]),
+				'ticket_id' => intval($arKey[3]),
+				'amount_index' => intval($arKey[4])
+			];
+			
+		}
+		
+		public static function getInstanceByBookingKey(string $booking_key) {
+			
+			global $wpdb;
+			
+			$id = intval($wpdb->get_var($wpdb->prepare("SELECT `id` FROM ".$wpdb->prefix."wpsg_ticket_booking WHERE booking_key = '%s' ", $booking_key)));
+			
+			if ($id <= 0) {
+				
+				list($product_id, $order_id, $order_product_id, $ticket_id, $amount_index) = array_values(self::decodeBookingKey($booking_key));
+				
+				$wpdb->insert($wpdb->prefix."wpsg_ticket_booking", [
+					'booking_key' => $booking_key,
+					'product_id' => $product_id,
+					'order_id' => $order_id,
+					'order_product_id' => $order_product_id,
+					'ticket_id' => $ticket_id,
+					'amount_index' => $amount_index
+				]);
+				
+				$id = $wpdb->insert_id;
+				
+			}
+			
+			return self::getInstance($id);
+			
+		}
+		
+		public static function getInstance(int $id, bool $no_cache = false) {
+			
+			if (!isset(self::$arInstances[$id]) || $no_cache === true) self::$arInstances[$id] = new self($id);
+			
+			return self::$arInstances[$id];
+			
+		}
+	
+	}
Index: /mods/mod_ticket/classes/TicketProduct.php
===================================================================
--- /mods/mod_ticket/classes/TicketProduct.php	(revision 8427)
+++ /mods/mod_ticket/classes/TicketProduct.php	(revision 8427)
@@ -0,0 +1,215 @@
+<?php
+	
+	declare(strict_types=1);
+	
+	/**
+	 * @author: Daniel Schmitzer (daniel@maennchen1.de)
+	 * @date: 20.10.23
+	 * @time: 14:33
+	 */
+	
+	namespace wpsgTicket;
+	
+	class TicketProduct {
+	
+		public static bool $enqueTicket = false;
+		
+		private static array $arInstances = array();
+		
+		private ?int $product_id = null;
+		
+		public function __construct(int $product_id) {
+		
+			$this->product_id = $product_id;
+			
+		}
+		
+		public function getProductId(): int { return $this->product_id; }
+		public function getProduct(): \wpsg_product { return \wpsg_product::getInstance($this->getProductId()); }
+		
+		/**
+		 * Gibt einen Array von Tagen zwischen $from und $to zurÃŒck, an dem Tickets angelegt sind
+		 * und zÃ€hlt auch die Belegung
+		 *
+		 * @param string $from YYYY-MM-DD
+		 * @param string $to YYYY-MM-DD
+		 * @return array [YYYY-MM-DD] => $nAnzahlBelegungen
+		 * @throws \Exception
+		 */
+		public function getOccupancy(string $from, string $to): array {
+		
+			$arReturn = [
+				'min' => null,
+				'max' => null,
+			];
+			
+			if (!preg_match('/^\d{4}-\d{2}\-\d{2}$/', $from)) throw new \Exception();
+			if (!preg_match('/^\d{4}-\d{2}\-\d{2}$/', $to)) throw new \Exception();
+			
+			$tFrom = strtotime($from); $tTo = strtotime($to);
+			
+			if ($tFrom > $tTo) throw new \Exception();
+			
+			$t = $tFrom;
+			
+			while ($t < $tTo) {
+				
+				$date = date('Y-m-d', $t);
+				
+				$arTicket = Ticket::find([
+					'day' => $date,
+					'product_id' => $this->getProductId()
+				], null, true, false);
+				
+				if (sizeof($arTicket) > 0) {
+					
+					if ($arReturn['max'] === null || strtotime($arReturn['max']) < $t) $arReturn['max'] = $date;
+					if ($arReturn['min'] === null || strtotime($arReturn['min']) > $t) $arReturn['min'] = $date;
+					
+					foreach ($arTicket as $oTicket) {
+						
+						if (!isset($arReturn[$date])) {
+							
+							$arReturn[$date] = [
+								'arTicket' => [],
+								'slots' => 0,
+								'slots_used' => 0
+							];
+							
+						}
+						
+						$arReturn[$date]['arTicket'][] = $oTicket->toJSON();
+						$arReturn[$date]['slots'] += $oTicket->getSlotCount();
+						$arReturn[$date]['slots_used'] += $oTicket->getUsedSlotCount();
+						
+					}
+					
+				}
+				
+				$t = strtotime('+1 day', $t);
+				
+			}
+			
+			return $arReturn;
+			
+			$results = $wpdb->get_results($wpdb->prepare("
+				SELECT
+					CAST('%s' AS `date`) AS `get_from`,
+					CAST('%s' AS `date`) AS `get_to`,
+				FROM
+					`".WPSG_TBL_TICKETS."` AS T
+				WHERE
+					T.`p_id` = %d
+				HAVING
+					(T.`from_date` >= `get_from` AND T.`from_date` <= `get_to` AND T.`to_date` IS NULL) OR
+					(T.`from_date`T.`to_date` >= `get_from` )
+			"), $from, $to, $this->getProductId());
+		
+		}
+		
+		public function getBookingTickets(): array {
+			
+			global $wpdb;
+			
+			$arReturn = [];
+			
+			foreach (Ticket::find([
+				'product_id' => $this->getProductId(),
+				'state' => -1
+			], null, true) as $oTicket) {
+			 
+				$results = $wpdb->get_results($wpdb->prepare("
+					SELECT
+					    OP.`id` AS `order_product_id`, M.`meta_value`
+					FROM
+						`".WPSG_TBL_ORDERPRODUCT."` AS OP
+							LEFT JOIN `".WPSG_TBL_META."` AS M ON (M.`meta_table` = 'WPSG_TBL_ORDERPRODUCT' AND M.`target_id` = OP.`id` AND M.`meta_key` = 'ticket_id')
+					WHERE
+						OP.`p_id` = %d AND
+						M.`meta_value` = %d
+					GROUP BY
+						OP.`id`
+				", $this->getProductId(), $oTicket->getId()), ARRAY_A);
+				
+				foreach ($results as $row) {
+				 
+					$oOrderProduct = \wpsg_order_product::getInstance(intval($row['order_product_id']));
+					
+					if (intval($oOrderProduct->getMeta('ticket_id', false, 0)) === $oTicket->getId()) {
+						
+						for ($amount_index = 0; $amount_index < $oOrderProduct->getAmount(); $amount_index++) {
+							
+							$arReturn[] = TicketBooking::getInstanceByBookingKey(TicketBooking::encodeBookingKey($oOrderProduct->getId(), $amount_index));
+							
+						}
+						
+					}
+					
+				}
+				
+			}
+			
+			return $arReturn;
+		
+		}
+		
+		public function addTickets(string $from_date, string $from_time, string $to_date, string $to_time, int $slots): void {
+		
+			global $wpdb;
+   
+			$from_date = ($from_date !== "0000-00-00") ? $from_date : null;
+			$to_date = ($to_date !== "0000-00-00") ? $to_date : null;
+			$from_time = ($from_time !== "00:00") ? $from_time : null;
+			$to_time = ($to_time !== "00:00") ? $to_time : null;
+		
+			$data = array(
+				'p_id' => $this->getProductId(),
+				'from_date' => $from_date,
+				'from_time' => $from_time,
+				'to_date' => $to_date,
+				'to_time' => $to_time,
+				'slots' => $slots,
+				'state' => Ticket::STATE_ACTIVE
+			);
+		 
+			$wpdb->insert($wpdb->prefix . "wpsg_tickets", $data);
+		
+		}
+		
+		/**
+		 * @return Ticket[]
+		 */
+		public function getAvailableTickets(): array {
+			
+			/** @var Ticket[] $arTicket */
+			$arTicket = Ticket::find([
+				'product_id' => $this->getProductId(),
+				'state' => Ticket::STATE_ACTIVE
+			], null, true);
+			
+			foreach ($arTicket as $k => $oTicket) {
+				
+				if (!$oTicket->isAvailable()) unset($arTicket[$k]);
+				
+			}
+			
+			return $arTicket;
+			
+		}
+		
+		public static function isTicketProduct(int $product_id): bool {
+
+			if ($product_id <= 0) return false;
+			
+			return \wpsg_product::getInstance($product_id)->getMeta('ticket_product', '0') === '1';
+			
+		}
+		
+		public static function getInstance($id) {
+		
+			if (!isset(self::$arInstances[$id])) self::$arInstances[$id] = new self($id);
+		
+			return self::$arInstances[$id];
+		}
+	
+	}
Index: /mods/mod_ticket/classes/TicketRenderer.php
===================================================================
--- /mods/mod_ticket/classes/TicketRenderer.php	(revision 8427)
+++ /mods/mod_ticket/classes/TicketRenderer.php	(revision 8427)
@@ -0,0 +1,204 @@
+<?php
+	
+	declare(strict_types=1);
+	
+	/**
+	 * @author: Daniel Schmitzer (daniel@maennchen1.de)
+	 * @date: 31.10.23
+	 * @time: 13:22
+	 */
+	
+	namespace wpsgTicket;
+	
+	use chillerlan\QRCode\Data\QRMatrix;
+	use chillerlan\QRCode\Output\QROutputInterface;
+	use chillerlan\QRCode\QRCode;
+	use chillerlan\QRCode\QROptions;
+	
+	abstract class TicketRenderer {
+		
+		private static function SetTextColor(&$pdf, $strHEXCode) {
+			
+			if ($strHEXCode[0] == '#') $strHEXCode = substr($strHEXCode, 1);
+		
+		    if (strlen($strHEXCode) == 6) list($r, $g, $b) = array(
+				$strHEXCode[0].$strHEXCode[1],
+				$strHEXCode[2].$strHEXCode[3],
+				$strHEXCode[4].$strHEXCode[5]
+			);
+		    else if (strlen($strHEXCode) == 3) list($r, $g, $b) = array($strHEXCode[0].$strHEXCode[0], $strHEXCode[1].$strHEXCode[1], $strHEXCode[2].$strHEXCode[2]);
+		    else
+		        return false;
+		
+		    $r = hexdec($r); $g = hexdec($g); $b = hexdec($b);
+				  
+			$pdf->setTextColor($r, $g, $b);
+			
+		}
+		
+		public static function render(?int $emplate_id = null, ?int $order_product_id = null, ?int $amount_index = null, bool $out = true): void {
+		
+			if ($order_product_id !== null && $amount_index !== null) {
+				
+				$oTicketBooking = TicketBooking::getInstanceByBookingKey(TicketBooking::encodeBookingKey($order_product_id, $amount_index));
+				$ticket_booking_id = strval($oTicketBooking->getId());
+				
+				$ticket_file = $oTicketBooking->getTicketPDFPath();
+				
+				if (file_exists($ticket_file) && $out === true) {
+					
+					\wpsg_header::PDFPlugin($ticket_file); exit;
+				
+				} else if (file_exists($ticket_file)) return;
+				
+				if ($emplate_id === null) {
+					
+					$emplate_id = intval(\wpsg_order_product::getInstance($order_product_id)->getProduct()->getMeta('ticket_template'));
+					
+				}
+				
+			} else {
+				
+				$ticket_booking_id = '';
+				$ticket_file = null;
+				
+			}
+			
+			require_once WPSG_PATH_LIB.'FPDF_1.81/fpdf.php';
+			require_once WPSG_PATH_LIB.'FPDI_2.2.0/autoload.php';
+			require_once WPSG_PATH_VIEW.'../mods/mod_ticket/lib/vendor/autoload.php';
+			
+			$oTickeTemplate = TicketTemplate::getInstance($emplate_id);
+			$arConfig = $oTickeTemplate->getConfig();
+			
+			$w = wpsg_tf($arConfig['width']);
+			$h = wpsg_tf($arConfig['height']);
+			
+			//$pdf = new \setasign\Fpdi\Fpdi((($w > $h)?'L':'P'), 'mm', [$w, $h]);
+			$pdf = new PDF((($w > $h)?'L':'P'), 'mm', [$w, $h]);
+			$pdf->SetAutoPageBreak(false);
+			$pdf->AddPage();
+			
+			if ($oTickeTemplate->hasBackground()) {
+				
+				$bg_file = $oTickeTemplate->getBgFilePath();
+				$info = pathinfo($bg_file);
+				
+				if ($info['extension'] === 'jpg') {
+				
+					$pdf->image($bg_file, 0, 0, $w, $h, 'jpg');
+					
+				} else if ($info['extension'] === 'pdf') {
+				
+					$pdf->setSourceFile($bg_file);
+					$tplidx = $pdf->importPage(1, '/MediaBox');
+					$pdf->useTemplate($tplidx, 0, 0, 210);
+					
+				}
+				
+			}
+			
+			foreach ($arConfig['arField'] as $c) {
+				
+				if ($c['text'] === '%qr%') {
+					
+					$pdf->SetAlpha(1);
+					
+					if ($order_product_id !== null) {
+						
+						$qr = Plugin::getInstance()->buildCode($order_product_id, $amount_index);
+						
+					} else {
+						
+						$qr = base64_encode('123456789');
+						
+					}
+					
+					
+					$tmpfname = tempnam("/tmp", "wpsgTicket").'.png';
+					
+					$qrCodeOptions = new QROptions();
+					$qrCodeOptions->quietzoneSize = 0;
+					$qrCodeOptions->scale = 10;
+					$qrCodeOptions->eccLevel = \chillerlan\QRCode\QRCode::ECC_Q;
+					
+					(new \chillerlan\QRCode\QRCode($qrCodeOptions))->render($qr, $tmpfname);
+					
+					$pdf->image($tmpfname, wpsg_tf($c['x']), wpsg_tf($c['y']), wpsg_tf($c['w']), wpsg_tf($c['h']));
+					
+				} else {
+					
+					if ($order_product_id !== null) {
+						
+						$oOrderProduct = \wpsg_order_product::getInstance($order_product_id);
+						
+						$c['text'] = \wpsg_ShopController::getShop()->replaceUniversalPlatzhalter(
+							$c['text'],
+							$oOrderProduct->getOrder()->getId(),
+							$oOrderProduct->getOrder()->getCustomer()->getId(),
+							null,
+							$oOrderProduct->getProductId(),
+							[
+								'/%ticketbooking_id%/i' => $ticket_booking_id
+							],
+							$oOrderProduct->getProductId()
+						);
+						
+					}
+				 
+					$font_file = WPSG_PATH_LIB.'FPDF_1.81/font/'.$c['font'];
+
+					if (file_exists($font_file)) {
+						
+						global $name;
+						
+						include $font_file;
+					
+						$pdf->AddFont($name, '', $c['font']);
+						$pdf->SetFont($name, '', $c['fontsize']);
+						
+						if (in_array($c['align'], ['C', 'R'])) {
+							
+							$text_width = $pdf->GetStringWidth($c['text']);
+							
+							if ($c['align'] === 'C') $c['x'] -= $text_width / 2;
+							else if ($c['align'] === 'R') $c['x'] -= $text_width;
+							
+						}
+						
+					}
+					
+					self::SetTextColor($pdf, $c['color']);
+					$pdf->setXY($c['x'], $c['y']);
+					
+					if (intval($c['opaque']) !== 100) {
+						
+						$pdf->SetAlpha(intval($c['opaque']) / 100);
+						
+					} else {
+						
+						$pdf->SetAlpha(1);
+						
+					}
+					
+					if ($c['angle'] !== '' && wpsg_tf($c['angle']) != 0) {
+						
+						$pdf->TextWithRotation($c['x'], $c['y'], $c['text'], wpsg_tf($c['angle']), 0);
+						
+					} else {
+						
+						$pdf->MultiCell(0, 3, $c['text']);
+					
+					}
+				
+				}
+				
+			}
+			
+			if ($ticket_file !== null) $pdf->output('F', $ticket_file);
+			
+			if ($out === true) $pdf->output();
+			
+		}
+		
+	}
Index: /mods/mod_ticket/classes/TicketTemplate.php
===================================================================
--- /mods/mod_ticket/classes/TicketTemplate.php	(revision 8427)
+++ /mods/mod_ticket/classes/TicketTemplate.php	(revision 8427)
@@ -0,0 +1,222 @@
+<?php
+	
+	declare(strict_types=1);
+	
+	/**
+	 * @author: Daniel Schmitzer (daniel@maennchen1.de)
+	 * @date: 30.10.23
+	 * @time: 16:00
+	 */
+	
+	namespace wpsgTicket;
+	
+	class TicketTemplate {
+		
+		private static array $arInstances = [];
+		
+		private int $id;
+		private array $data;
+		private array $config;
+		
+		public function __construct(int $id) {
+		
+			global $wpdb;
+			
+			$this->id = $id;
+			
+			$query = $wpdb->prepare("SELECT * FROM `".WPSG_TBL_TICKET_TEMPLATES."` WHERE id = %d", $id);
+			$this->data = $wpdb->get_row($query, ARRAY_A);
+			
+			$this->config = json_decode($this->data['config'], true);
+		
+		}
+		
+		public function getConfig(): array { return $this->config; }
+		
+		public function getStoragePath(): string {
+			
+			$shop = \wpsg_ShopController::getShop();
+			
+			if ($shop->isMultiBlog()) $path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_ticket/templates/';
+			else $path = WP_CONTENT_DIR.'/uploads/wpsg/wpsg_ticket/templates/';
+   
+			$shop->protectDirectory($path.intval($this->id).DIRECTORY_SEPARATOR);
+			
+			return $path.intval($this->id).DIRECTORY_SEPARATOR;
+			
+		}
+		
+		public function toJSON(): array {
+			
+			$r = [
+				'id' => $this->id,
+				'template_name' => $this->getLabel(),
+				'config' => $this->config,
+				'url_preview' => \add_query_arg([
+					'action' => 'wpsg_ticket',
+					'ticket_action' => 'preview',
+					'template_id' => $this->id
+				], \admin_url('admin-ajax.php'))
+			];
+			
+			if ($this->hasBackground()) {
+				
+				$r['hasBackground'] = true;
+				$r['url_bg_download'] = \add_query_arg([
+					'action' => 'wpsg_ticket',
+					'ticket_action' => 'getBackground',
+					'template_id' => $this->id
+				], \admin_url('admin-ajax.php'));
+				
+			} else {
+				
+				$r['hasBackground'] = false;
+				
+			}
+			
+			return $r;
+			
+		}
+		
+		public function getId(): int {
+			
+			return $this->id;
+			
+		}
+		
+		public function getBgFilePath(): ?string {
+			
+			$path = $this->getStoragePath();
+			
+			foreach(scandir($path) as $f) {
+				
+				if (!in_array($f, ['.', '..', '.htaccess'])) {
+					
+					return $path.$f;
+					
+				}
+				
+			}
+			
+			return null;
+			
+		}
+		
+		public function hasBackground(): bool {
+		
+			return $this->getBgFilePath() !== null;
+		
+		}
+		
+		public function getLabel(): string { return $this->data['template_name']; }
+		
+		/**
+		 * @param array $arFilter
+		 * @param array|null $arPager
+		 * @param bool $getObject
+		 * @return array|TicketTemplate[]
+		 */
+		public static function find(array $arFilter = [], ?array $arPager = null, bool $getObject = false): array {
+		
+			global $wpdb;
+			
+			$strQueryWHERE = self::getQueryWHERE($arFilter);
+			
+			if ($arPager !== null) {
+				
+				$per_page = intval($arPager['per_page']??1);
+				$page = intval($arPager['page']??1);
+				
+				$offset = ($page - 1) * $per_page;
+				
+				$arID = $wpdb->get_results("
+					SELECT
+						O.`id`
+					FROM
+						`".WPSG_TBL_TICKET_TEMPLATES."` AS O
+					WHERE
+						1
+						".$strQueryWHERE."
+					LIMIT
+						".intval($per_page)." OFFSET ".intval($offset)."
+					", ARRAY_A);
+				
+				$r = []; foreach ($arID as $id) {
+					
+					if ($getObject) $r[] = TicketTemplate::getInstance(intval($id['id']));
+					else $r[] = TicketTemplate::getInstance(intval($id['id']))->toJSON();
+					
+				}
+				
+				return $r;
+				
+			} else {
+				
+				$arID = $wpdb->get_results("
+					SELECT
+						O.`id`
+					FROM
+						`".WPSG_TBL_TICKET_TEMPLATES."` AS O
+					WHERE
+						1
+						".$strQueryWHERE, ARRAY_A);
+				
+				$r = []; foreach ($arID as $id) {
+					
+					if ($getObject) $r[] = TicketTemplate::getInstance(intval($id['id']));
+					else $r[] = TicketTemplate::getInstance(intval($id['id']))->toJSON();
+					
+				}
+				
+				return $r;
+				
+			}
+		
+		}
+		
+		public static function getQueryWHERE(array $arFilter): string {
+			
+			global $wpdb;
+			
+			$strQueryWHERE = " AND `deleted` != '1' ";
+			
+			return $strQueryWHERE;
+			
+		}
+		
+		public static function getInstance($id): TicketTemplate {
+   
+			if (!isset(self::$arInstances[$id])) self::$arInstances[$id] = new self($id);
+			
+        	return self::$arInstances[$id];
+    
+		}
+		
+		public static function save(array $template_data): void {
+			
+			global $wpdb;
+			
+			if ($template_data['id'] <= 0) {
+				
+				$wpdb->insert(WPSG_TBL_TICKET_TEMPLATES, [
+					'config' => json_encode($template_data['config']),
+					'template_name' => $template_data['template_name']
+				], [
+					'%s',
+					'%s'
+				]);
+				
+			} else {
+				
+				$wpdb->update(WPSG_TBL_TICKET_TEMPLATES, [
+					'config' => json_encode($template_data['config']),
+					'template_name' => $template_data['template_name']
+				], [
+					'id' => $template_data['id']
+				]);
+				
+			}
+			
+		}
+		
+	}
Index: /mods/mod_ticket/lib/composer.json
===================================================================
--- /mods/mod_ticket/lib/composer.json	(revision 8427)
+++ /mods/mod_ticket/lib/composer.json	(revision 8427)
@@ -0,0 +1,12 @@
+{
+    "name": "daniel/lib",
+    "authors": [
+        {
+            "name": "Daniel Schmitzer",
+            "email": "daniel@maennchen1.de"
+        }
+    ],
+    "require": {
+        "chillerlan/php-qrcode": "^4.3"
+    }
+}
Index: /mods/mod_ticket/lib/composer.lock
===================================================================
--- /mods/mod_ticket/lib/composer.lock	(revision 8427)
+++ /mods/mod_ticket/lib/composer.lock	(revision 8427)
@@ -0,0 +1,161 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+        "This file is @generated automatically"
+    ],
+    "content-hash": "0425f5d2dcf8df94c3795b6bcf8556e0",
+    "packages": [
+        {
+            "name": "chillerlan/php-qrcode",
+            "version": "4.3.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/chillerlan/php-qrcode.git",
+                "reference": "2ca4bf5ae048af1981d1023ee42a0a2a9d51e51d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/chillerlan/php-qrcode/zipball/2ca4bf5ae048af1981d1023ee42a0a2a9d51e51d",
+                "reference": "2ca4bf5ae048af1981d1023ee42a0a2a9d51e51d",
+                "shasum": ""
+            },
+            "require": {
+                "chillerlan/php-settings-container": "^2.1.4",
+                "ext-mbstring": "*",
+                "php": "^7.4 || ^8.0"
+            },
+            "require-dev": {
+                "phan/phan": "^5.3",
+                "phpunit/phpunit": "^9.5",
+                "setasign/fpdf": "^1.8.2"
+            },
+            "suggest": {
+                "chillerlan/php-authenticator": "Yet another Google authenticator! Also creates URIs for mobile apps.",
+                "setasign/fpdf": "Required to use the QR FPDF output."
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "chillerlan\\QRCode\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Kazuhiko Arase",
+                    "homepage": "https://github.com/kazuhikoarase"
+                },
+                {
+                    "name": "Smiley",
+                    "email": "smiley@chillerlan.net",
+                    "homepage": "https://github.com/codemasher"
+                },
+                {
+                    "name": "Contributors",
+                    "homepage": "https://github.com/chillerlan/php-qrcode/graphs/contributors"
+                }
+            ],
+            "description": "A QR code generator. PHP 7.4+",
+            "homepage": "https://github.com/chillerlan/php-qrcode",
+            "keywords": [
+                "phpqrcode",
+                "qr",
+                "qr code",
+                "qrcode",
+                "qrcode-generator"
+            ],
+            "support": {
+                "issues": "https://github.com/chillerlan/php-qrcode/issues",
+                "source": "https://github.com/chillerlan/php-qrcode/tree/4.3.4"
+            },
+            "funding": [
+                {
+                    "url": "https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://ko-fi.com/codemasher",
+                    "type": "ko_fi"
+                }
+            ],
+            "time": "2022-07-25T09:12:45+00:00"
+        },
+        {
+            "name": "chillerlan/php-settings-container",
+            "version": "2.1.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/chillerlan/php-settings-container.git",
+                "reference": "1beb7df3c14346d4344b0b2e12f6f9a74feabd4a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/chillerlan/php-settings-container/zipball/1beb7df3c14346d4344b0b2e12f6f9a74feabd4a",
+                "reference": "1beb7df3c14346d4344b0b2e12f6f9a74feabd4a",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "php": "^7.4 || ^8.0"
+            },
+            "require-dev": {
+                "phan/phan": "^5.3",
+                "phpunit/phpunit": "^9.5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "chillerlan\\Settings\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Smiley",
+                    "email": "smiley@chillerlan.net",
+                    "homepage": "https://github.com/codemasher"
+                }
+            ],
+            "description": "A container class for immutable settings objects. Not a DI container. PHP 7.4+",
+            "homepage": "https://github.com/chillerlan/php-settings-container",
+            "keywords": [
+                "PHP7",
+                "Settings",
+                "configuration",
+                "container",
+                "helper"
+            ],
+            "support": {
+                "issues": "https://github.com/chillerlan/php-settings-container/issues",
+                "source": "https://github.com/chillerlan/php-settings-container"
+            },
+            "funding": [
+                {
+                    "url": "https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://ko-fi.com/codemasher",
+                    "type": "ko_fi"
+                }
+            ],
+            "time": "2022-07-05T22:32:14+00:00"
+        }
+    ],
+    "packages-dev": [],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": [],
+    "platform-dev": [],
+    "plugin-api-version": "2.2.0"
+}
Index: /mods/mod_ticket/lib/vendor/autoload.php
===================================================================
--- /mods/mod_ticket/lib/vendor/autoload.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/autoload.php	(revision 8427)
@@ -0,0 +1,7 @@
+<?php
+
+// autoload.php @generated by Composer
+
+require_once __DIR__ . '/composer/autoload_real.php';
+
+return ComposerAutoloaderInitcf45e5dd2bb09e95d0cb68c0c04ff884::getLoader();
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/.github/FUNDING.yml
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/.github/FUNDING.yml	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/.github/FUNDING.yml	(revision 8427)
@@ -0,0 +1,2 @@
+ko_fi: codemasher
+custom: "https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4"
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/.github/workflows/tests.yml
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/.github/workflows/tests.yml	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/.github/workflows/tests.yml	(revision 8427)
@@ -0,0 +1,82 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+# https://github.com/sebastianbergmann/phpunit/blob/master/.github/workflows/ci.yml
+
+on:
+  push:
+    branches:
+      - v4.3.x
+  pull_request:
+    branches:
+      - v4.3.x
+
+name: "Continuous Integration"
+
+jobs:
+
+  static-code-analysis:
+    name: "Static Code Analysis"
+
+    runs-on: ubuntu-latest
+
+    env:
+      PHAN_ALLOW_XDEBUG: 0
+      PHAN_DISABLE_XDEBUG_WARN: 1
+
+    steps:
+      - name: "Checkout"
+        uses: actions/checkout@v3
+
+      - name: "Install PHP"
+        uses: shivammathur/setup-php@v2
+        with:
+          php-version: "7.4"
+          coverage: none
+          tools: pecl
+          extensions: ast, gd, imagick, json, mbstring
+
+      - name: "Update dependencies with composer"
+        run: composer update --no-interaction --no-ansi --no-progress --no-suggest
+
+      - name: "Run phan"
+        run: php vendor/bin/phan
+
+  tests:
+    name: "Unit Tests"
+
+    runs-on: ${{ matrix.os }}
+
+    strategy:
+      fail-fast: false
+      matrix:
+        os:
+          - ubuntu-latest
+          - windows-latest
+        php-version:
+          - "7.4"
+          - "8.0"
+          - "8.1"
+
+    steps:
+#      - name: "Configure git to avoid issues with line endings"
+#        if: matrix.os == 'windows-latest'
+#        run: git config --global core.autocrlf false
+
+      - name: "Checkout"
+        uses: actions/checkout@v3
+
+      - name: "Install PHP with extensions"
+        uses: shivammathur/setup-php@v2
+        with:
+          php-version: ${{ matrix.php-version }}
+          coverage: pcov
+          tools: pecl
+          extensions: gd, imagick, json, mbstring
+
+      - name: "Install dependencies with composer"
+        run: composer update --no-ansi --no-interaction --no-progress --no-suggest
+
+      - name: "Run tests with phpunit"
+        run: php vendor/bin/phpunit --configuration=phpunit.xml
+
+      - name: "Send code coverage report to Codecov.io"
+        uses: codecov/codecov-action@v3
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/.gitignore
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/.gitignore	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/.gitignore	(revision 8427)
@@ -0,0 +1,5 @@
+.build/*
+.idea/*
+docs/*
+vendor/*
+composer.lock
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/.phan/config.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/.phan/config.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/.phan/config.php	(revision 8427)
@@ -0,0 +1,55 @@
+<?php
+/**
+ * This configuration will be read and overlaid on top of the
+ * default configuration. Command-line arguments will be applied
+ * after this file is read.
+ */
+return [
+	// Supported values: `'5.6'`, `'7.0'`, `'7.1'`, `'7.2'`, `'7.3'`,
+	// `'7.4'`, `null`.
+	// If this is set to `null`,
+	// then Phan assumes the PHP version which is closest to the minor version
+	// of the php executable used to execute Phan.
+	//
+	// Note that the **only** effect of choosing `'5.6'` is to infer
+	// that functions removed in php 7.0 exist.
+	// (See `backward_compatibility_checks` for additional options)
+	'target_php_version' => '7.4',
+
+	// A list of directories that should be parsed for class and
+	// method information. After excluding the directories
+	// defined in exclude_analysis_directory_list, the remaining
+	// files will be statically analyzed for errors.
+	//
+	// Thus, both first-party and third-party code being used by
+	// your application should be included in this list.
+	'directory_list' => [
+		'examples',
+		'src',
+		'tests',
+		'vendor',
+		'.phan/stubs'
+	],
+
+	// A regex used to match every file name that you want to
+	// exclude from parsing. Actual value will exclude every
+	// "test", "tests", "Test" and "Tests" folders found in
+	// "vendor/" directory.
+	'exclude_file_regex' => '@^vendor/.*/(tests?|Tests?)/@',
+
+	// A directory list that defines files that will be excluded
+	// from static analysis, but whose class and method
+	// information should be included.
+	//
+	// Generally, you'll want to include the directories for
+	// third-party code (such as "vendor/") in this list.
+	//
+	// n.b.: If you'd like to parse but not analyze 3rd
+	//       party code, directories containing that code
+	//       should be added to both the `directory_list`
+	//       and `exclude_analysis_directory_list` arrays.
+	'exclude_analysis_directory_list' => [
+		'vendor/',
+		'.phan/stubs'
+	],
+];
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/.phan/stubs/imagick.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/.phan/stubs/imagick.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/.phan/stubs/imagick.php	(revision 8427)
@@ -0,0 +1,6744 @@
+<?php
+
+// Start of imagick v.3.4.3
+
+class ImagickException extends Exception  {
+}
+
+class ImagickDrawException extends Exception  {
+}
+
+class ImagickPixelIteratorException extends Exception  {
+}
+
+class ImagickPixelException extends Exception  {
+}
+
+/**
+ * @method Imagick clone() (PECL imagick 2.0.0)<br/>Makes an exact copy of the Imagick object
+ * @link https://php.net/manual/en/class.imagick.php
+ */
+class Imagick implements Iterator, Countable {
+	const COLOR_BLACK = 11;
+	const COLOR_BLUE = 12;
+	const COLOR_CYAN = 13;
+	const COLOR_GREEN = 14;
+	const COLOR_RED = 15;
+	const COLOR_YELLOW = 16;
+	const COLOR_MAGENTA = 17;
+	const COLOR_OPACITY = 18;
+	const COLOR_ALPHA = 19;
+	const COLOR_FUZZ = 20;
+	const IMAGICK_EXTNUM = 30403;
+	const IMAGICK_EXTVER = "3.4.3";
+	const QUANTUM_RANGE = 65535;
+	const USE_ZEND_MM = 0;
+	const COMPOSITE_DEFAULT = 40;
+	const COMPOSITE_UNDEFINED = 0;
+	const COMPOSITE_NO = 1;
+	const COMPOSITE_ADD = 2;
+	const COMPOSITE_ATOP = 3;
+	const COMPOSITE_BLEND = 4;
+	const COMPOSITE_BUMPMAP = 5;
+	const COMPOSITE_CLEAR = 7;
+	const COMPOSITE_COLORBURN = 8;
+	const COMPOSITE_COLORDODGE = 9;
+	const COMPOSITE_COLORIZE = 10;
+	const COMPOSITE_COPYBLACK = 11;
+	const COMPOSITE_COPYBLUE = 12;
+	const COMPOSITE_COPY = 13;
+	const COMPOSITE_COPYCYAN = 14;
+	const COMPOSITE_COPYGREEN = 15;
+	const COMPOSITE_COPYMAGENTA = 16;
+	const COMPOSITE_COPYOPACITY = 17;
+	const COMPOSITE_COPYRED = 18;
+	const COMPOSITE_COPYYELLOW = 19;
+	const COMPOSITE_DARKEN = 20;
+	const COMPOSITE_DSTATOP = 21;
+	const COMPOSITE_DST = 22;
+	const COMPOSITE_DSTIN = 23;
+	const COMPOSITE_DSTOUT = 24;
+	const COMPOSITE_DSTOVER = 25;
+	const COMPOSITE_DIFFERENCE = 26;
+	const COMPOSITE_DISPLACE = 27;
+	const COMPOSITE_DISSOLVE = 28;
+	const COMPOSITE_EXCLUSION = 29;
+	const COMPOSITE_HARDLIGHT = 30;
+	const COMPOSITE_HUE = 31;
+	const COMPOSITE_IN = 32;
+	const COMPOSITE_LIGHTEN = 33;
+	const COMPOSITE_LUMINIZE = 35;
+	const COMPOSITE_MINUS = 36;
+	const COMPOSITE_MODULATE = 37;
+	const COMPOSITE_MULTIPLY = 38;
+	const COMPOSITE_OUT = 39;
+	const COMPOSITE_OVER = 40;
+	const COMPOSITE_OVERLAY = 41;
+	const COMPOSITE_PLUS = 42;
+	const COMPOSITE_REPLACE = 43;
+	const COMPOSITE_SATURATE = 44;
+	const COMPOSITE_SCREEN = 45;
+	const COMPOSITE_SOFTLIGHT = 46;
+	const COMPOSITE_SRCATOP = 47;
+	const COMPOSITE_SRC = 48;
+	const COMPOSITE_SRCIN = 49;
+	const COMPOSITE_SRCOUT = 50;
+	const COMPOSITE_SRCOVER = 51;
+	const COMPOSITE_SUBTRACT = 52;
+	const COMPOSITE_THRESHOLD = 53;
+	const COMPOSITE_XOR = 54;
+	const COMPOSITE_CHANGEMASK = 6;
+	const COMPOSITE_LINEARLIGHT = 34;
+	const COMPOSITE_DIVIDE = 55;
+	const COMPOSITE_DISTORT = 56;
+	const COMPOSITE_BLUR = 57;
+	const COMPOSITE_PEGTOPLIGHT = 58;
+	const COMPOSITE_VIVIDLIGHT = 59;
+	const COMPOSITE_PINLIGHT = 60;
+	const COMPOSITE_LINEARDODGE = 61;
+	const COMPOSITE_LINEARBURN = 62;
+	const COMPOSITE_MATHEMATICS = 63;
+	const COMPOSITE_MODULUSADD = 2;
+	const COMPOSITE_MODULUSSUBTRACT = 52;
+	const COMPOSITE_MINUSDST = 36;
+	const COMPOSITE_DIVIDEDST = 55;
+	const COMPOSITE_DIVIDESRC = 64;
+	const COMPOSITE_MINUSSRC = 65;
+	const COMPOSITE_DARKENINTENSITY = 66;
+	const COMPOSITE_LIGHTENINTENSITY = 67;
+	const MONTAGEMODE_FRAME = 1;
+	const MONTAGEMODE_UNFRAME = 2;
+	const MONTAGEMODE_CONCATENATE = 3;
+	const STYLE_NORMAL = 1;
+	const STYLE_ITALIC = 2;
+	const STYLE_OBLIQUE = 3;
+	const STYLE_ANY = 4;
+	const FILTER_UNDEFINED = 0;
+	const FILTER_POINT = 1;
+	const FILTER_BOX = 2;
+	const FILTER_TRIANGLE = 3;
+	const FILTER_HERMITE = 4;
+	const FILTER_HANNING = 5;
+	const FILTER_HAMMING = 6;
+	const FILTER_BLACKMAN = 7;
+	const FILTER_GAUSSIAN = 8;
+	const FILTER_QUADRATIC = 9;
+	const FILTER_CUBIC = 10;
+	const FILTER_CATROM = 11;
+	const FILTER_MITCHELL = 12;
+	const FILTER_LANCZOS = 22;
+	const FILTER_BESSEL = 13;
+	const FILTER_SINC = 14;
+	const FILTER_KAISER = 16;
+	const FILTER_WELSH = 17;
+	const FILTER_PARZEN = 18;
+	const FILTER_LAGRANGE = 21;
+	const FILTER_SENTINEL = 31;
+	const FILTER_BOHMAN = 19;
+	const FILTER_BARTLETT = 20;
+	const FILTER_JINC = 13;
+	const FILTER_SINCFAST = 15;
+	const FILTER_ROBIDOUX = 26;
+	const FILTER_LANCZOSSHARP = 23;
+	const FILTER_LANCZOS2 = 24;
+	const FILTER_LANCZOS2SHARP = 25;
+	const FILTER_ROBIDOUXSHARP = 27;
+	const FILTER_COSINE = 28;
+	const FILTER_SPLINE = 29;
+	const FILTER_LANCZOSRADIUS = 30;
+	const IMGTYPE_UNDEFINED = 0;
+	const IMGTYPE_BILEVEL = 1;
+	const IMGTYPE_GRAYSCALE = 2;
+	const IMGTYPE_GRAYSCALEMATTE = 3;
+	const IMGTYPE_PALETTE = 4;
+	const IMGTYPE_PALETTEMATTE = 5;
+	const IMGTYPE_TRUECOLOR = 6;
+	const IMGTYPE_TRUECOLORMATTE = 7;
+	const IMGTYPE_COLORSEPARATION = 8;
+	const IMGTYPE_COLORSEPARATIONMATTE = 9;
+	const IMGTYPE_OPTIMIZE = 10;
+	const IMGTYPE_PALETTEBILEVELMATTE = 11;
+	const RESOLUTION_UNDEFINED = 0;
+	const RESOLUTION_PIXELSPERINCH = 1;
+	const RESOLUTION_PIXELSPERCENTIMETER = 2;
+	const COMPRESSION_UNDEFINED = 0;
+	const COMPRESSION_NO = 1;
+	const COMPRESSION_BZIP = 2;
+	const COMPRESSION_FAX = 6;
+	const COMPRESSION_GROUP4 = 7;
+	const COMPRESSION_JPEG = 8;
+	const COMPRESSION_JPEG2000 = 9;
+	const COMPRESSION_LOSSLESSJPEG = 10;
+	const COMPRESSION_LZW = 11;
+	const COMPRESSION_RLE = 12;
+	const COMPRESSION_ZIP = 13;
+	const COMPRESSION_DXT1 = 3;
+	const COMPRESSION_DXT3 = 4;
+	const COMPRESSION_DXT5 = 5;
+	const COMPRESSION_ZIPS = 14;
+	const COMPRESSION_PIZ = 15;
+	const COMPRESSION_PXR24 = 16;
+	const COMPRESSION_B44 = 17;
+	const COMPRESSION_B44A = 18;
+	const COMPRESSION_LZMA = 19;
+	const COMPRESSION_JBIG1 = 20;
+	const COMPRESSION_JBIG2 = 21;
+	const PAINT_POINT = 1;
+	const PAINT_REPLACE = 2;
+	const PAINT_FLOODFILL = 3;
+	const PAINT_FILLTOBORDER = 4;
+	const PAINT_RESET = 5;
+	const GRAVITY_NORTHWEST = 1;
+	const GRAVITY_NORTH = 2;
+	const GRAVITY_NORTHEAST = 3;
+	const GRAVITY_WEST = 4;
+	const GRAVITY_CENTER = 5;
+	const GRAVITY_EAST = 6;
+	const GRAVITY_SOUTHWEST = 7;
+	const GRAVITY_SOUTH = 8;
+	const GRAVITY_SOUTHEAST = 9;
+	const GRAVITY_FORGET = 0;
+	const GRAVITY_STATIC = 10;
+	const STRETCH_NORMAL = 1;
+	const STRETCH_ULTRACONDENSED = 2;
+	const STRETCH_EXTRACONDENSED = 3;
+	const STRETCH_CONDENSED = 4;
+	const STRETCH_SEMICONDENSED = 5;
+	const STRETCH_SEMIEXPANDED = 6;
+	const STRETCH_EXPANDED = 7;
+	const STRETCH_EXTRAEXPANDED = 8;
+	const STRETCH_ULTRAEXPANDED = 9;
+	const STRETCH_ANY = 10;
+	const ALIGN_UNDEFINED = 0;
+	const ALIGN_LEFT = 1;
+	const ALIGN_CENTER = 2;
+	const ALIGN_RIGHT = 3;
+	const DECORATION_NO = 1;
+	const DECORATION_UNDERLINE = 2;
+	const DECORATION_OVERLINE = 3;
+	const DECORATION_LINETROUGH = 4;
+	const DECORATION_LINETHROUGH = 4;
+	const NOISE_UNIFORM = 1;
+	const NOISE_GAUSSIAN = 2;
+	const NOISE_MULTIPLICATIVEGAUSSIAN = 3;
+	const NOISE_IMPULSE = 4;
+	const NOISE_LAPLACIAN = 5;
+	const NOISE_POISSON = 6;
+	const NOISE_RANDOM = 7;
+	const CHANNEL_UNDEFINED = 0;
+	const CHANNEL_RED = 1;
+	const CHANNEL_GRAY = 1;
+	const CHANNEL_CYAN = 1;
+	const CHANNEL_GREEN = 2;
+	const CHANNEL_MAGENTA = 2;
+	const CHANNEL_BLUE = 4;
+	const CHANNEL_YELLOW = 4;
+	const CHANNEL_ALPHA = 8;
+	const CHANNEL_OPACITY = 8;
+	const CHANNEL_MATTE = 8;
+	const CHANNEL_BLACK = 32;
+	const CHANNEL_INDEX = 32;
+	const CHANNEL_ALL = 134217727;
+	const CHANNEL_DEFAULT = 134217719;
+	const CHANNEL_RGBA = 15;
+	const CHANNEL_TRUEALPHA = 64;
+	const CHANNEL_RGBS = 128;
+	const CHANNEL_GRAY_CHANNELS = 128;
+	const CHANNEL_SYNC = 256;
+	const CHANNEL_COMPOSITES = 47;
+	const METRIC_UNDEFINED = 0;
+	const METRIC_ABSOLUTEERRORMETRIC = 1;
+	const METRIC_MEANABSOLUTEERROR = 2;
+	const METRIC_MEANERRORPERPIXELMETRIC = 3;
+	const METRIC_MEANSQUAREERROR = 4;
+	const METRIC_PEAKABSOLUTEERROR = 5;
+	const METRIC_PEAKSIGNALTONOISERATIO = 6;
+	const METRIC_ROOTMEANSQUAREDERROR = 7;
+	const METRIC_NORMALIZEDCROSSCORRELATIONERRORMETRIC = 8;
+	const METRIC_FUZZERROR = 9;
+	const PIXEL_CHAR = 1;
+	const PIXEL_DOUBLE = 2;
+	const PIXEL_FLOAT = 3;
+	const PIXEL_INTEGER = 4;
+	const PIXEL_LONG = 5;
+	const PIXEL_QUANTUM = 6;
+	const PIXEL_SHORT = 7;
+	const EVALUATE_UNDEFINED = 0;
+	const EVALUATE_ADD = 1;
+	const EVALUATE_AND = 2;
+	const EVALUATE_DIVIDE = 3;
+	const EVALUATE_LEFTSHIFT = 4;
+	const EVALUATE_MAX = 5;
+	const EVALUATE_MIN = 6;
+	const EVALUATE_MULTIPLY = 7;
+	const EVALUATE_OR = 8;
+	const EVALUATE_RIGHTSHIFT = 9;
+	const EVALUATE_SET = 10;
+	const EVALUATE_SUBTRACT = 11;
+	const EVALUATE_XOR = 12;
+	const EVALUATE_POW = 13;
+	const EVALUATE_LOG = 14;
+	const EVALUATE_THRESHOLD = 15;
+	const EVALUATE_THRESHOLDBLACK = 16;
+	const EVALUATE_THRESHOLDWHITE = 17;
+	const EVALUATE_GAUSSIANNOISE = 18;
+	const EVALUATE_IMPULSENOISE = 19;
+	const EVALUATE_LAPLACIANNOISE = 20;
+	const EVALUATE_MULTIPLICATIVENOISE = 21;
+	const EVALUATE_POISSONNOISE = 22;
+	const EVALUATE_UNIFORMNOISE = 23;
+	const EVALUATE_COSINE = 24;
+	const EVALUATE_SINE = 25;
+	const EVALUATE_ADDMODULUS = 26;
+	const EVALUATE_MEAN = 27;
+	const EVALUATE_ABS = 28;
+	const EVALUATE_EXPONENTIAL = 29;
+	const EVALUATE_MEDIAN = 30;
+	const EVALUATE_SUM = 31;
+	const COLORSPACE_UNDEFINED = 0;
+	const COLORSPACE_RGB = 1;
+	const COLORSPACE_GRAY = 2;
+	const COLORSPACE_TRANSPARENT = 3;
+	const COLORSPACE_OHTA = 4;
+	const COLORSPACE_LAB = 5;
+	const COLORSPACE_XYZ = 6;
+	const COLORSPACE_YCBCR = 7;
+	const COLORSPACE_YCC = 8;
+	const COLORSPACE_YIQ = 9;
+	const COLORSPACE_YPBPR = 10;
+	const COLORSPACE_YUV = 11;
+	const COLORSPACE_CMYK = 12;
+	const COLORSPACE_SRGB = 13;
+	const COLORSPACE_HSB = 14;
+	const COLORSPACE_HSL = 15;
+	const COLORSPACE_HWB = 16;
+	const COLORSPACE_REC601LUMA = 17;
+	const COLORSPACE_REC709LUMA = 19;
+	const COLORSPACE_LOG = 21;
+	const COLORSPACE_CMY = 22;
+	const COLORSPACE_LUV = 23;
+	const COLORSPACE_HCL = 24;
+	const COLORSPACE_LCH = 25;
+	const COLORSPACE_LMS = 26;
+	const COLORSPACE_LCHAB = 27;
+	const COLORSPACE_LCHUV = 28;
+	const COLORSPACE_SCRGB = 29;
+	const COLORSPACE_HSI = 30;
+	const COLORSPACE_HSV = 31;
+	const COLORSPACE_HCLP = 32;
+	const COLORSPACE_YDBDR = 33;
+	const COLORSPACE_REC601YCBCR = 18;
+	const COLORSPACE_REC709YCBCR = 20;
+	const VIRTUALPIXELMETHOD_UNDEFINED = 0;
+	const VIRTUALPIXELMETHOD_BACKGROUND = 1;
+	const VIRTUALPIXELMETHOD_CONSTANT = 2;
+	const VIRTUALPIXELMETHOD_EDGE = 4;
+	const VIRTUALPIXELMETHOD_MIRROR = 5;
+	const VIRTUALPIXELMETHOD_TILE = 7;
+	const VIRTUALPIXELMETHOD_TRANSPARENT = 8;
+	const VIRTUALPIXELMETHOD_MASK = 9;
+	const VIRTUALPIXELMETHOD_BLACK = 10;
+	const VIRTUALPIXELMETHOD_GRAY = 11;
+	const VIRTUALPIXELMETHOD_WHITE = 12;
+	const VIRTUALPIXELMETHOD_HORIZONTALTILE = 13;
+	const VIRTUALPIXELMETHOD_VERTICALTILE = 14;
+	const VIRTUALPIXELMETHOD_HORIZONTALTILEEDGE = 15;
+	const VIRTUALPIXELMETHOD_VERTICALTILEEDGE = 16;
+	const VIRTUALPIXELMETHOD_CHECKERTILE = 17;
+	const PREVIEW_UNDEFINED = 0;
+	const PREVIEW_ROTATE = 1;
+	const PREVIEW_SHEAR = 2;
+	const PREVIEW_ROLL = 3;
+	const PREVIEW_HUE = 4;
+	const PREVIEW_SATURATION = 5;
+	const PREVIEW_BRIGHTNESS = 6;
+	const PREVIEW_GAMMA = 7;
+	const PREVIEW_SPIFF = 8;
+	const PREVIEW_DULL = 9;
+	const PREVIEW_GRAYSCALE = 10;
+	const PREVIEW_QUANTIZE = 11;
+	const PREVIEW_DESPECKLE = 12;
+	const PREVIEW_REDUCENOISE = 13;
+	const PREVIEW_ADDNOISE = 14;
+	const PREVIEW_SHARPEN = 15;
+	const PREVIEW_BLUR = 16;
+	const PREVIEW_THRESHOLD = 17;
+	const PREVIEW_EDGEDETECT = 18;
+	const PREVIEW_SPREAD = 19;
+	const PREVIEW_SOLARIZE = 20;
+	const PREVIEW_SHADE = 21;
+	const PREVIEW_RAISE = 22;
+	const PREVIEW_SEGMENT = 23;
+	const PREVIEW_SWIRL = 24;
+	const PREVIEW_IMPLODE = 25;
+	const PREVIEW_WAVE = 26;
+	const PREVIEW_OILPAINT = 27;
+	const PREVIEW_CHARCOALDRAWING = 28;
+	const PREVIEW_JPEG = 29;
+	const RENDERINGINTENT_UNDEFINED = 0;
+	const RENDERINGINTENT_SATURATION = 1;
+	const RENDERINGINTENT_PERCEPTUAL = 2;
+	const RENDERINGINTENT_ABSOLUTE = 3;
+	const RENDERINGINTENT_RELATIVE = 4;
+	const INTERLACE_UNDEFINED = 0;
+	const INTERLACE_NO = 1;
+	const INTERLACE_LINE = 2;
+	const INTERLACE_PLANE = 3;
+	const INTERLACE_PARTITION = 4;
+	const INTERLACE_GIF = 5;
+	const INTERLACE_JPEG = 6;
+	const INTERLACE_PNG = 7;
+	const FILLRULE_UNDEFINED = 0;
+	const FILLRULE_EVENODD = 1;
+	const FILLRULE_NONZERO = 2;
+	const PATHUNITS_UNDEFINED = 0;
+	const PATHUNITS_USERSPACE = 1;
+	const PATHUNITS_USERSPACEONUSE = 2;
+	const PATHUNITS_OBJECTBOUNDINGBOX = 3;
+	const LINECAP_UNDEFINED = 0;
+	const LINECAP_BUTT = 1;
+	const LINECAP_ROUND = 2;
+	const LINECAP_SQUARE = 3;
+	const LINEJOIN_UNDEFINED = 0;
+	const LINEJOIN_MITER = 1;
+	const LINEJOIN_ROUND = 2;
+	const LINEJOIN_BEVEL = 3;
+	const RESOURCETYPE_UNDEFINED = 0;
+	const RESOURCETYPE_AREA = 1;
+	const RESOURCETYPE_DISK = 2;
+	const RESOURCETYPE_FILE = 3;
+	const RESOURCETYPE_MAP = 4;
+	const RESOURCETYPE_MEMORY = 5;
+	const RESOURCETYPE_TIME = 7;
+	const RESOURCETYPE_THROTTLE = 8;
+	const RESOURCETYPE_THREAD = 6;
+	const DISPOSE_UNRECOGNIZED = 0;
+	const DISPOSE_UNDEFINED = 0;
+	const DISPOSE_NONE = 1;
+	const DISPOSE_BACKGROUND = 2;
+	const DISPOSE_PREVIOUS = 3;
+	const INTERPOLATE_UNDEFINED = 0;
+	const INTERPOLATE_AVERAGE = 1;
+	const INTERPOLATE_BICUBIC = 2;
+	const INTERPOLATE_BILINEAR = 3;
+	const INTERPOLATE_FILTER = 4;
+	const INTERPOLATE_INTEGER = 5;
+	const INTERPOLATE_MESH = 6;
+	const INTERPOLATE_NEARESTNEIGHBOR = 7;
+	const INTERPOLATE_SPLINE = 8;
+	const LAYERMETHOD_UNDEFINED = 0;
+	const LAYERMETHOD_COALESCE = 1;
+	const LAYERMETHOD_COMPAREANY = 2;
+	const LAYERMETHOD_COMPARECLEAR = 3;
+	const LAYERMETHOD_COMPAREOVERLAY = 4;
+	const LAYERMETHOD_DISPOSE = 5;
+	const LAYERMETHOD_OPTIMIZE = 6;
+	const LAYERMETHOD_OPTIMIZEPLUS = 8;
+	const LAYERMETHOD_OPTIMIZETRANS = 9;
+	const LAYERMETHOD_COMPOSITE = 12;
+	const LAYERMETHOD_OPTIMIZEIMAGE = 7;
+	const LAYERMETHOD_REMOVEDUPS = 10;
+	const LAYERMETHOD_REMOVEZERO = 11;
+	const LAYERMETHOD_TRIMBOUNDS = 16;
+	const ORIENTATION_UNDEFINED = 0;
+	const ORIENTATION_TOPLEFT = 1;
+	const ORIENTATION_TOPRIGHT = 2;
+	const ORIENTATION_BOTTOMRIGHT = 3;
+	const ORIENTATION_BOTTOMLEFT = 4;
+	const ORIENTATION_LEFTTOP = 5;
+	const ORIENTATION_RIGHTTOP = 6;
+	const ORIENTATION_RIGHTBOTTOM = 7;
+	const ORIENTATION_LEFTBOTTOM = 8;
+	const DISTORTION_UNDEFINED = 0;
+	const DISTORTION_AFFINE = 1;
+	const DISTORTION_AFFINEPROJECTION = 2;
+	const DISTORTION_ARC = 9;
+	const DISTORTION_BILINEAR = 6;
+	const DISTORTION_PERSPECTIVE = 4;
+	const DISTORTION_PERSPECTIVEPROJECTION = 5;
+	const DISTORTION_SCALEROTATETRANSLATE = 3;
+	const DISTORTION_POLYNOMIAL = 8;
+	const DISTORTION_POLAR = 10;
+	const DISTORTION_DEPOLAR = 11;
+	const DISTORTION_BARREL = 14;
+	const DISTORTION_SHEPARDS = 16;
+	const DISTORTION_SENTINEL = 18;
+	const DISTORTION_BARRELINVERSE = 15;
+	const DISTORTION_BILINEARFORWARD = 6;
+	const DISTORTION_BILINEARREVERSE = 7;
+	const DISTORTION_RESIZE = 17;
+	const DISTORTION_CYLINDER2PLANE = 12;
+	const DISTORTION_PLANE2CYLINDER = 13;
+	const LAYERMETHOD_MERGE = 13;
+	const LAYERMETHOD_FLATTEN = 14;
+	const LAYERMETHOD_MOSAIC = 15;
+	const ALPHACHANNEL_ACTIVATE = 1;
+	const ALPHACHANNEL_RESET = 7;
+	const ALPHACHANNEL_SET = 8;
+	const ALPHACHANNEL_UNDEFINED = 0;
+	const ALPHACHANNEL_COPY = 3;
+	const ALPHACHANNEL_DEACTIVATE = 4;
+	const ALPHACHANNEL_EXTRACT = 5;
+	const ALPHACHANNEL_OPAQUE = 6;
+	const ALPHACHANNEL_SHAPE = 9;
+	const ALPHACHANNEL_TRANSPARENT = 10;
+	const SPARSECOLORMETHOD_UNDEFINED = 0;
+	const SPARSECOLORMETHOD_BARYCENTRIC = 1;
+	const SPARSECOLORMETHOD_BILINEAR = 7;
+	const SPARSECOLORMETHOD_POLYNOMIAL = 8;
+	const SPARSECOLORMETHOD_SPEPARDS = 16;
+	const SPARSECOLORMETHOD_VORONOI = 18;
+	const SPARSECOLORMETHOD_INVERSE = 19;
+	const DITHERMETHOD_UNDEFINED = 0;
+	const DITHERMETHOD_NO = 1;
+	const DITHERMETHOD_RIEMERSMA = 2;
+	const DITHERMETHOD_FLOYDSTEINBERG = 3;
+	const FUNCTION_UNDEFINED = 0;
+	const FUNCTION_POLYNOMIAL = 1;
+	const FUNCTION_SINUSOID = 2;
+	const ALPHACHANNEL_BACKGROUND = 2;
+	const FUNCTION_ARCSIN = 3;
+	const FUNCTION_ARCTAN = 4;
+	const ALPHACHANNEL_FLATTEN = 11;
+	const ALPHACHANNEL_REMOVE = 12;
+	const STATISTIC_GRADIENT = 1;
+	const STATISTIC_MAXIMUM = 2;
+	const STATISTIC_MEAN = 3;
+	const STATISTIC_MEDIAN = 4;
+	const STATISTIC_MINIMUM = 5;
+	const STATISTIC_MODE = 6;
+	const STATISTIC_NONPEAK = 7;
+	const STATISTIC_STANDARD_DEVIATION = 8;
+	const MORPHOLOGY_CONVOLVE = 1;
+	const MORPHOLOGY_CORRELATE = 2;
+	const MORPHOLOGY_ERODE = 3;
+	const MORPHOLOGY_DILATE = 4;
+	const MORPHOLOGY_ERODE_INTENSITY = 5;
+	const MORPHOLOGY_DILATE_INTENSITY = 6;
+	const MORPHOLOGY_DISTANCE = 7;
+	const MORPHOLOGY_OPEN = 8;
+	const MORPHOLOGY_CLOSE = 9;
+	const MORPHOLOGY_OPEN_INTENSITY = 10;
+	const MORPHOLOGY_CLOSE_INTENSITY = 11;
+	const MORPHOLOGY_SMOOTH = 12;
+	const MORPHOLOGY_EDGE_IN = 13;
+	const MORPHOLOGY_EDGE_OUT = 14;
+	const MORPHOLOGY_EDGE = 15;
+	const MORPHOLOGY_TOP_HAT = 16;
+	const MORPHOLOGY_BOTTOM_HAT = 17;
+	const MORPHOLOGY_HIT_AND_MISS = 18;
+	const MORPHOLOGY_THINNING = 19;
+	const MORPHOLOGY_THICKEN = 20;
+	const MORPHOLOGY_VORONOI = 21;
+	const MORPHOLOGY_ITERATIVE = 22;
+	const KERNEL_UNITY = 1;
+	const KERNEL_GAUSSIAN = 2;
+	const KERNEL_DIFFERENCE_OF_GAUSSIANS = 3;
+	const KERNEL_LAPLACIAN_OF_GAUSSIANS = 4;
+	const KERNEL_BLUR = 5;
+	const KERNEL_COMET = 6;
+	const KERNEL_LAPLACIAN = 7;
+	const KERNEL_SOBEL = 8;
+	const KERNEL_FREI_CHEN = 9;
+	const KERNEL_ROBERTS = 10;
+	const KERNEL_PREWITT = 11;
+	const KERNEL_COMPASS = 12;
+	const KERNEL_KIRSCH = 13;
+	const KERNEL_DIAMOND = 14;
+	const KERNEL_SQUARE = 15;
+	const KERNEL_RECTANGLE = 16;
+	const KERNEL_OCTAGON = 17;
+	const KERNEL_DISK = 18;
+	const KERNEL_PLUS = 19;
+	const KERNEL_CROSS = 20;
+	const KERNEL_RING = 21;
+	const KERNEL_PEAKS = 22;
+	const KERNEL_EDGES = 23;
+	const KERNEL_CORNERS = 24;
+	const KERNEL_DIAGONALS = 25;
+	const KERNEL_LINE_ENDS = 26;
+	const KERNEL_LINE_JUNCTIONS = 27;
+	const KERNEL_RIDGES = 28;
+	const KERNEL_CONVEX_HULL = 29;
+	const KERNEL_THIN_SE = 30;
+	const KERNEL_SKELETON = 31;
+	const KERNEL_CHEBYSHEV = 32;
+	const KERNEL_MANHATTAN = 33;
+	const KERNEL_OCTAGONAL = 34;
+	const KERNEL_EUCLIDEAN = 35;
+	const KERNEL_USER_DEFINED = 36;
+	const KERNEL_BINOMIAL = 37;
+	const DIRECTION_LEFT_TO_RIGHT = 2;
+	const DIRECTION_RIGHT_TO_LEFT = 1;
+	const NORMALIZE_KERNEL_NONE = 0;
+	const NORMALIZE_KERNEL_VALUE = 8192;
+	const NORMALIZE_KERNEL_CORRELATE = 65536;
+	const NORMALIZE_KERNEL_PERCENT = 4096;
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Removes repeated portions of images to optimize
+	 * @link https://php.net/manual/en/imagick.optimizeimagelayers.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function optimizeImageLayers () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the maximum bounding region between images
+	 * @link https://php.net/manual/en/imagick.compareimagelayers.php
+	 * @param int $method <p>
+	 * One of the layer method constants.
+	 * </p>
+	 * @return Imagick <b>TRUE</b> on success.
+	 */
+	public function compareImageLayers ($method) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Quickly fetch attributes
+	 * @link https://php.net/manual/en/imagick.pingimageblob.php
+	 * @param string $image <p>
+	 * A string containing the image.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function pingImageBlob ($image) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Get basic image attributes in a lightweight manner
+	 * @link https://php.net/manual/en/imagick.pingimagefile.php
+	 * @param resource $filehandle <p>
+	 * An open filehandle to the image.
+	 * </p>
+	 * @param string $fileName [optional] <p>
+	 * Optional filename for this image.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function pingImageFile ($filehandle, $fileName = null) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Creates a vertical mirror image
+	 * @link https://php.net/manual/en/imagick.transposeimage.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function transposeImage () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Creates a horizontal mirror image
+	 * @link https://php.net/manual/en/imagick.transverseimage.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function transverseImage () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Remove edges from the image
+	 * @link https://php.net/manual/en/imagick.trimimage.php
+	 * @param float $fuzz <p>
+	 * By default target must match a particular pixel color exactly.
+	 * However, in many cases two colors may differ by a small amount.
+	 * The fuzz member of image defines how much tolerance is acceptable
+	 * to consider two colors as the same. This parameter represents the variation
+	 * on the quantum range.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function trimImage ($fuzz) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Applies wave filter to the image
+	 * @link https://php.net/manual/en/imagick.waveimage.php
+	 * @param float $amplitude <p>
+	 * The amplitude of the wave.
+	 * </p>
+	 * @param float $length <p>
+	 * The length of the wave.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function waveImage ($amplitude, $length) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Adds vignette filter to the image
+	 * @link https://php.net/manual/en/imagick.vignetteimage.php
+	 * @param float $blackPoint <p>
+	 * The black point.
+	 * </p>
+	 * @param float $whitePoint <p>
+	 * The white point
+	 * </p>
+	 * @param int $x <p>
+	 * X offset of the ellipse
+	 * </p>
+	 * @param int $y <p>
+	 * Y offset of the ellipse
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function vignetteImage ($blackPoint, $whitePoint, $x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Discards all but one of any pixel color
+	 * @link https://php.net/manual/en/imagick.uniqueimagecolors.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function uniqueImageColors () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Return if the image has a matte channel
+	 * @link https://php.net/manual/en/imagick.getimagematte.php
+	 * @return bool <b>TRUE</b> on success or <b>FALSE</b> on failure.
+	 */
+	public function getImageMatte () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image matte channel
+	 * @link https://php.net/manual/en/imagick.setimagematte.php
+	 * @param bool $matte <p>
+	 * True activates the matte channel and false disables it.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageMatte ($matte) {}
+
+	/**
+	 * Adaptively resize image with data dependent triangulation
+	 *
+	 * If legacy is true, the calculations are done with the small rounding bug that existed in Imagick before 3.4.0.<br>
+	 * If false, the calculations should produce the same results as ImageMagick CLI does.<br>
+	 * <br>
+	 * <b>Note:</b> The behavior of the parameter bestfit changed in Imagick 3.0.0. Before this version given dimensions 400x400 an image of dimensions 200x150 would be left untouched.
+	 * In Imagick 3.0.0 and later the image would be scaled up to size 400x300 as this is the "best fit" for the given dimensions. If bestfit parameter is used both width and height must be given.
+	 * @link https://php.net/manual/en/imagick.adaptiveresizeimage.php
+	 * @param int $columns The number of columns in the scaled image.
+	 * @param int $rows The number of rows in the scaled image.
+	 * @param bool $bestfit [optional] Whether to fit the image inside a bounding box.<br>
+	 *                                 The behavior of the parameter bestfit changed in Imagick 3.0.0. Before this version given dimensions 400x400 an image of dimensions 200x150 would be left untouched. In Imagick 3.0.0 and later the image would be scaled up to size 400x300 as this is the "best fit" for the given dimensions. If bestfit parameter is used both width and height must be given.
+	 * @param bool $legacy [optional] Added since 3.4.0. Default value FALSE
+	 * @return bool TRUE on success
+	 * @throws ImagickException Throws ImagickException on error
+	 * @since 2.0.0
+	 */
+	public function adaptiveResizeImage ($columns, $rows, $bestfit = false, $legacy = false) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Simulates a pencil sketch
+	 * @link https://php.net/manual/en/imagick.sketchimage.php
+	 * @param float $radius <p>
+	 * The radius of the Gaussian, in pixels, not counting the center pixel
+	 * </p>
+	 * @param float $sigma <p>
+	 * The standard deviation of the Gaussian, in pixels.
+	 * </p>
+	 * @param float $angle <p>
+	 * Apply the effect along this angle.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function sketchImage ($radius, $sigma, $angle) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Creates a 3D effect
+	 * @link https://php.net/manual/en/imagick.shadeimage.php
+	 * @param bool $gray <p>
+	 * A value other than zero shades the intensity of each pixel.
+	 * </p>
+	 * @param float $azimuth <p>
+	 * Defines the light source direction.
+	 * </p>
+	 * @param float $elevation <p>
+	 * Defines the light source direction.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function shadeImage ($gray, $azimuth, $elevation) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the size offset
+	 * @link https://php.net/manual/en/imagick.getsizeoffset.php
+	 * @return int the size offset associated with the Imagick object.
+	 */
+	public function getSizeOffset () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the size and offset of the Imagick object
+	 * @link https://php.net/manual/en/imagick.setsizeoffset.php
+	 * @param int $columns <p>
+	 * The width in pixels.
+	 * </p>
+	 * @param int $rows <p>
+	 * The height in pixels.
+	 * </p>
+	 * @param int $offset <p>
+	 * The image offset.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setSizeOffset ($columns, $rows, $offset) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Adds adaptive blur filter to image
+	 * @link https://php.net/manual/en/imagick.adaptiveblurimage.php
+	 * @param float $radius <p>
+	 * The radius of the Gaussian, in pixels, not counting the center pixel.
+	 * Provide a value of 0 and the radius will be chosen automagically.
+	 * </p>
+	 * @param float $sigma <p>
+	 * The standard deviation of the Gaussian, in pixels.
+	 * </p>
+	 * @param int $channel [optional] <p>
+	 * Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to <b>Imagick::CHANNEL_DEFAULT</b>. Refer to this list of channel constants
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function adaptiveBlurImage ($radius, $sigma, $channel = Imagick::CHANNEL_DEFAULT) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Enhances the contrast of a color image
+	 * @link https://php.net/manual/en/imagick.contraststretchimage.php
+	 * @param float $black_point <p>
+	 * The black point.
+	 * </p>
+	 * @param float $white_point <p>
+	 * The white point.
+	 * </p>
+	 * @param int $channel [optional] <p>
+	 * Provide any channel constant that is valid for your channel mode. To
+	 * apply to more than one channel, combine channeltype constants using
+	 * bitwise operators. <b>Imagick::CHANNEL_ALL</b>. Refer to this
+	 * list of channel constants.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function contrastStretchImage ($black_point, $white_point, $channel = Imagick::CHANNEL_ALL) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Adaptively sharpen the image
+	 * @link https://php.net/manual/en/imagick.adaptivesharpenimage.php
+	 * @param float $radius <p>
+	 * The radius of the Gaussian, in pixels, not counting the center pixel. Use 0 for auto-select.
+	 * </p>
+	 * @param float $sigma <p>
+	 * The standard deviation of the Gaussian, in pixels.
+	 * </p>
+	 * @param int $channel [optional] <p>
+	 * Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to <b>Imagick::CHANNEL_DEFAULT</b>. Refer to this list of channel constants
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function adaptiveSharpenImage ($radius, $sigma, $channel = Imagick::CHANNEL_DEFAULT) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Creates a high-contrast, two-color image
+	 * @link https://php.net/manual/en/imagick.randomthresholdimage.php
+	 * @param float $low <p>
+	 * The low point
+	 * </p>
+	 * @param float $high <p>
+	 * The high point
+	 * </p>
+	 * @param int $channel [optional] <p>
+	 * Provide any channel constant that is valid for your channel mode. To
+	 * apply to more than one channel, combine channeltype constants using
+	 * bitwise operators. Refer to this
+	 * list of channel constants.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function randomThresholdImage ($low, $high, $channel = Imagick::CHANNEL_ALL) {}
+
+	/**
+	 * @param $xRounding
+	 * @param $yRounding
+	 * @param $strokeWidth [optional]
+	 * @param $displace [optional]
+	 * @param $sizeCorrection [optional]
+	 */
+	public function roundCornersImage ($xRounding, $yRounding, $strokeWidth, $displace, $sizeCorrection) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Rounds image corners
+	 * @link https://php.net/manual/en/imagick.roundcorners.php
+	 * @param float $x_rounding <p>
+	 * x rounding
+	 * </p>
+	 * @param float $y_rounding <p>
+	 * y rounding
+	 * </p>
+	 * @param float $stroke_width [optional] <p>
+	 * stroke width
+	 * </p>
+	 * @param float $displace [optional] <p>
+	 * image displace
+	 * </p>
+	 * @param float $size_correction [optional] <p>
+	 * size correction
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function roundCorners ($x_rounding, $y_rounding, $stroke_width = 10.0, $displace = 5.0, $size_correction = -6.0) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Set the iterator position
+	 * @link https://php.net/manual/en/imagick.setiteratorindex.php
+	 * @param int $index <p>
+	 * The position to set the iterator to
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setIteratorIndex ($index) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the index of the current active image
+	 * @link https://php.net/manual/en/imagick.getiteratorindex.php
+	 * @return int an integer containing the index of the image in the stack.
+	 */
+	public function getIteratorIndex () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Convenience method for setting crop size and the image geometry
+	 * @link https://php.net/manual/en/imagick.transformimage.php
+	 * @param string $crop <p>
+	 * A crop geometry string. This geometry defines a subregion of the image to crop.
+	 * </p>
+	 * @param string $geometry <p>
+	 * An image geometry string. This geometry defines the final size of the image.
+	 * </p>
+	 * @return Imagick <b>TRUE</b> on success.
+	 */
+	public function transformImage ($crop, $geometry) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image opacity level
+	 * @link https://php.net/manual/en/imagick.setimageopacity.php
+	 * @param float $opacity <p>
+	 * The level of transparency: 1.0 is fully opaque and 0.0 is fully
+	 * transparent.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageOpacity ($opacity) {}
+
+	/**
+	 * (PECL imagick 2.2.2)<br/>
+	 * Performs an ordered dither
+	 * @link https://php.net/manual/en/imagick.orderedposterizeimage.php
+	 * @param string $threshold_map <p>
+	 * A string containing the name of the threshold dither map to use
+	 * </p>
+	 * @param int $channel [optional] <p>
+	 * Provide any channel constant that is valid for your channel mode. To
+	 * apply to more than one channel, combine channeltype constants using
+	 * bitwise operators. Refer to this
+	 * list of channel constants.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function orderedPosterizeImage ($threshold_map, $channel = Imagick::CHANNEL_ALL) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Simulates a Polaroid picture
+	 * @link https://php.net/manual/en/imagick.polaroidimage.php
+	 * @param ImagickDraw $properties <p>
+	 * The polaroid properties
+	 * </p>
+	 * @param float $angle <p>
+	 * The polaroid angle
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function polaroidImage (ImagickDraw $properties, $angle) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the named image property
+	 * @link https://php.net/manual/en/imagick.getimageproperty.php
+	 * @param string $name <p>
+	 * name of the property (for example Exif:DateTime)
+	 * </p>
+	 * @return string|false a string containing the image property, false if a
+	 * property with the given name does not exist.
+	 */
+	public function getImageProperty ($name) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets an image property
+	 * @link https://php.net/manual/en/imagick.setimageproperty.php
+	 * @param string $name
+	 * @param string $value
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageProperty ($name, $value) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image interpolate pixel method
+	 * @link https://php.net/manual/en/imagick.setimageinterpolatemethod.php
+	 * @param int $method <p>
+	 * The method is one of the <b>Imagick::INTERPOLATE_*</b> constants
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageInterpolateMethod ($method) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the interpolation method
+	 * @link https://php.net/manual/en/imagick.getimageinterpolatemethod.php
+	 * @return int the interpolate method on success.
+	 */
+	public function getImageInterpolateMethod () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Stretches with saturation the image intensity
+	 * @link https://php.net/manual/en/imagick.linearstretchimage.php
+	 * @param float $blackPoint <p>
+	 * The image black point
+	 * </p>
+	 * @param float $whitePoint <p>
+	 * The image white point
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function linearStretchImage ($blackPoint, $whitePoint) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the image length in bytes
+	 * @link https://php.net/manual/en/imagick.getimagelength.php
+	 * @return int an int containing the current image size.
+	 */
+	public function getImageLength () {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Set image size
+	 * @link https://php.net/manual/en/imagick.extentimage.php
+	 * @param int $width <p>
+	 * The new width
+	 * </p>
+	 * @param int $height <p>
+	 * The new height
+	 * </p>
+	 * @param int $x <p>
+	 * X position for the new size
+	 * </p>
+	 * @param int $y <p>
+	 * Y position for the new size
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function extentImage ($width, $height, $x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the image orientation
+	 * @link https://php.net/manual/en/imagick.getimageorientation.php
+	 * @return int an int on success.
+	 */
+	public function getImageOrientation () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image orientation
+	 * @link https://php.net/manual/en/imagick.setimageorientation.php
+	 * @param int $orientation <p>
+	 * One of the orientation constants
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageOrientation ($orientation) {}
+
+	/**
+	 * (PECL imagick 2.1.0)<br/>
+	 * Changes the color value of any pixel that matches target
+	 * @link https://php.net/manual/en/imagick.paintfloodfillimage.php
+	 * @param mixed $fill <p>
+	 * ImagickPixel object or a string containing the fill color
+	 * </p>
+	 * @param float $fuzz <p>
+	 * The amount of fuzz. For example, set fuzz to 10 and the color red at
+	 * intensities of 100 and 102 respectively are now interpreted as the
+	 * same color for the purposes of the floodfill.
+	 * </p>
+	 * @param mixed $bordercolor <p>
+	 * ImagickPixel object or a string containing the border color
+	 * </p>
+	 * @param int $x <p>
+	 * X start position of the floodfill
+	 * </p>
+	 * @param int $y <p>
+	 * Y start position of the floodfill
+	 * </p>
+	 * @param int $channel [optional] <p>
+	 * Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to <b>Imagick::CHANNEL_DEFAULT</b>. Refer to this list of channel constants
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function paintFloodfillImage ($fill, $fuzz, $bordercolor, $x, $y, $channel = Imagick::CHANNEL_ALL) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Replaces colors in the image from a color lookup table. Optional second parameter to replace colors in a specific channel. This method is available if Imagick has been compiled against ImageMagick version 6.3.6 or newer.
+	 * @link https://php.net/manual/en/imagick.clutimage.php
+	 * @param Imagick $lookup_table <p>
+	 * Imagick object containing the color lookup table
+	 * </p>
+	 * @param int $channel [optional] <p>
+	 * The Channeltype
+	 * constant. When not supplied, default channels are replaced.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 * @since 2.0.0
+	 */
+	public function clutImage (Imagick $lookup_table, $channel = Imagick::CHANNEL_DEFAULT) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the image properties
+	 * @link https://php.net/manual/en/imagick.getimageproperties.php
+	 * @param string $pattern [optional] <p>
+	 * The pattern for property names.
+	 * </p>
+	 * @param bool $only_names [optional] <p>
+	 * Whether to return only property names. If <b>FALSE</b> then also the values are returned
+	 * </p>
+	 * @return array an array containing the image properties or property names.
+	 */
+	public function getImageProperties ($pattern = "*", $only_names = true) {}
+
+	/**
+	 * (PECL imagick 2.2.0)<br/>
+	 * Returns the image profiles
+	 * @link https://php.net/manual/en/imagick.getimageprofiles.php
+	 * @param string $pattern [optional] <p>
+	 * The pattern for profile names.
+	 * </p>
+	 * @param bool $include_values [optional] <p>
+	 * Whether to return only profile names. If <b>FALSE</b> then only profile names will be returned.
+	 * </p>
+	 * @return array an array containing the image profiles or profile names.
+	 */
+	public function getImageProfiles ($pattern = "*", $include_values = true) {}
+
+	/**
+	 * (PECL imagick 2.0.1)<br/>
+	 * Distorts an image using various distortion methods
+	 * @link https://php.net/manual/en/imagick.distortimage.php
+	 * @param int $method <p>
+	 * The method of image distortion. See distortion constants
+	 * </p>
+	 * @param array $arguments <p>
+	 * The arguments for this distortion method
+	 * </p>
+	 * @param bool $bestfit <p>
+	 * Attempt to resize destination to fit distorted source
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function distortImage ($method, array $arguments, $bestfit) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Writes an image to a filehandle
+	 * @link https://php.net/manual/en/imagick.writeimagefile.php
+	 * @param resource $filehandle <p>
+	 * Filehandle where to write the image
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function writeImageFile ($filehandle) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Writes frames to a filehandle
+	 * @link https://php.net/manual/en/imagick.writeimagesfile.php
+	 * @param resource $filehandle <p>
+	 * Filehandle where to write the images
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function writeImagesFile ($filehandle) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Reset image page
+	 * @link https://php.net/manual/en/imagick.resetimagepage.php
+	 * @param string $page <p>
+	 * The page definition. For example 7168x5147+0+0
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function resetImagePage ($page) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Sets image clip mask
+	 * @link https://php.net/manual/en/imagick.setimageclipmask.php
+	 * @param Imagick $clip_mask <p>
+	 * The Imagick object containing the clip mask
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageClipMask (Imagick $clip_mask) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Gets image clip mask
+	 * @link https://php.net/manual/en/imagick.getimageclipmask.php
+	 * @return Imagick an Imagick object containing the clip mask.
+	 */
+	public function getImageClipMask () {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Animates an image or images
+	 * @link https://php.net/manual/en/imagick.animateimages.php
+	 * @param string $x_server <p>
+	 * X server address
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function animateImages ($x_server) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Recolors image
+	 * @link https://php.net/manual/en/imagick.recolorimage.php
+	 * @param array $matrix <p>
+	 * The matrix containing the color values
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function recolorImage (array $matrix) {}
+
+	/**
+	 * (PECL imagick 2.1.0)<br/>
+	 * Sets font
+	 * @link https://php.net/manual/en/imagick.setfont.php
+	 * @param string $font <p>
+	 * Font name or a filename
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setFont ($font) {}
+
+	/**
+	 * (PECL imagick 2.1.0)<br/>
+	 * Gets font
+	 * @link https://php.net/manual/en/imagick.getfont.php
+	 * @return string|false the string containing the font name or <b>FALSE</b> if not font is set.
+	 */
+	public function getFont () {}
+
+	/**
+	 * (PECL imagick 2.1.0)<br/>
+	 * Sets point size
+	 * @link https://php.net/manual/en/imagick.setpointsize.php
+	 * @param float $point_size <p>
+	 * Point size
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setPointSize ($point_size) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Gets point size
+	 * @link https://php.net/manual/en/imagick.getpointsize.php
+	 * @return float a float containing the point size.
+	 */
+	public function getPointSize () {}
+
+	/**
+	 * (PECL imagick 2.1.0)<br/>
+	 * Merges image layers
+	 * @link https://php.net/manual/en/imagick.mergeimagelayers.php
+	 * @param int $layer_method <p>
+	 * One of the <b>Imagick::LAYERMETHOD_*</b> constants
+	 * </p>
+	 * @return Imagick Returns an Imagick object containing the merged image.
+	 * @throws ImagickException
+	 */
+	public function mergeImageLayers ($layer_method) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Sets image alpha channel
+	 * @link https://php.net/manual/en/imagick.setimagealphachannel.php
+	 * @param int $mode <p>
+	 * One of the <b>Imagick::ALPHACHANNEL_*</b> constants
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageAlphaChannel ($mode) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Changes the color value of any pixel that matches target
+	 * @link https://php.net/manual/en/imagick.floodfillpaintimage.php
+	 * @param mixed $fill <p>
+	 * ImagickPixel object or a string containing the fill color
+	 * </p>
+	 * @param float $fuzz <p>
+	 * The amount of fuzz. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color.
+	 * </p>
+	 * @param mixed $target <p>
+	 * ImagickPixel object or a string containing the target color to paint
+	 * </p>
+	 * @param int $x <p>
+	 * X start position of the floodfill
+	 * </p>
+	 * @param int $y <p>
+	 * Y start position of the floodfill
+	 * </p>
+	 * @param bool $invert <p>
+	 * If <b>TRUE</b> paints any pixel that does not match the target color.
+	 * </p>
+	 * @param int $channel [optional] <p>
+	 * Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to <b>Imagick::CHANNEL_DEFAULT</b>. Refer to this list of channel constants
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function floodFillPaintImage ($fill, $fuzz, $target, $x, $y, $invert, $channel = Imagick::CHANNEL_DEFAULT) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Changes the color value of any pixel that matches target
+	 * @link https://php.net/manual/en/imagick.opaquepaintimage.php
+	 * @param mixed $target <p>
+	 * ImagickPixel object or a string containing the color to change
+	 * </p>
+	 * @param mixed $fill <p>
+	 * The replacement color
+	 * </p>
+	 * @param float $fuzz <p>
+	 * The amount of fuzz. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color.
+	 * </p>
+	 * @param bool $invert <p>
+	 * If <b>TRUE</b> paints any pixel that does not match the target color.
+	 * </p>
+	 * @param int $channel [optional] <p>
+	 * Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to <b>Imagick::CHANNEL_DEFAULT</b>. Refer to this list of channel constants
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function opaquePaintImage ($target, $fill, $fuzz, $invert, $channel = Imagick::CHANNEL_DEFAULT) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Paints pixels transparent
+	 * @link https://php.net/manual/en/imagick.transparentpaintimage.php
+	 * @param mixed $target <p>
+	 * The target color to paint
+	 * </p>
+	 * @param float $alpha <p>
+	 * The level of transparency: 1.0 is fully opaque and 0.0 is fully transparent.
+	 * </p>
+	 * @param float $fuzz <p>
+	 * The amount of fuzz. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color.
+	 * </p>
+	 * @param bool $invert <p>
+	 * If <b>TRUE</b> paints any pixel that does not match the target color.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function transparentPaintImage ($target, $alpha, $fuzz, $invert) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Animates an image or images
+	 * @link https://php.net/manual/en/imagick.liquidrescaleimage.php
+	 * @param int $width <p>
+	 * The width of the target size
+	 * </p>
+	 * @param int $height <p>
+	 * The height of the target size
+	 * </p>
+	 * @param float $delta_x <p>
+	 * How much the seam can traverse on x-axis.
+	 * Passing 0 causes the seams to be straight.
+	 * </p>
+	 * @param float $rigidity <p>
+	 * Introduces a bias for non-straight seams. This parameter is
+	 * typically 0.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function liquidRescaleImage ($width, $height, $delta_x, $rigidity) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Enciphers an image
+	 * @link https://php.net/manual/en/imagick.encipherimage.php
+	 * @param string $passphrase <p>
+	 * The passphrase
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function encipherImage ($passphrase) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Deciphers an image
+	 * @link https://php.net/manual/en/imagick.decipherimage.php
+	 * @param string $passphrase <p>
+	 * The passphrase
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function decipherImage ($passphrase) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Sets the gravity
+	 * @link https://php.net/manual/en/imagick.setgravity.php
+	 * @param int $gravity <p>
+	 * The gravity property. Refer to the list of
+	 * gravity constants.
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setGravity ($gravity) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Gets the gravity
+	 * @link https://php.net/manual/en/imagick.getgravity.php
+	 * @return int the gravity property. Refer to the list of
+	 * gravity constants.
+	 */
+	public function getGravity () {}
+
+	/**
+	 * (PECL imagick 2.2.1)<br/>
+	 * Gets channel range
+	 * @link https://php.net/manual/en/imagick.getimagechannelrange.php
+	 * @param int $channel <p>
+	 * Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to <b>Imagick::CHANNEL_DEFAULT</b>. Refer to this list of channel constants
+	 * </p>
+	 * @return array an array containing minima and maxima values of the channel(s).
+	 */
+	public function getImageChannelRange ($channel) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Gets the image alpha channel
+	 * @link https://php.net/manual/en/imagick.getimagealphachannel.php
+	 * @return int a constant defining the current alpha channel value. Refer to this
+	 * list of alpha channel constants.
+	 */
+	public function getImageAlphaChannel () {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Gets channel distortions
+	 * @link https://php.net/manual/en/imagick.getimagechanneldistortions.php
+	 * @param Imagick $reference <p>
+	 * Imagick object containing the reference image
+	 * </p>
+	 * @param int $metric <p>
+	 * Refer to this list of metric type constants.
+	 * </p>
+	 * @param int $channel [optional] <p>
+	 * Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to <b>Imagick::CHANNEL_DEFAULT</b>. Refer to this list of channel constants
+	 * </p>
+	 * @return float a float describing the channel distortion.
+	 */
+	public function getImageChannelDistortions (Imagick $reference, $metric, $channel = Imagick::CHANNEL_DEFAULT) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Sets the image gravity
+	 * @link https://php.net/manual/en/imagick.setimagegravity.php
+	 * @param int $gravity <p>
+	 * The gravity property. Refer to the list of
+	 * gravity constants.
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setImageGravity ($gravity) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Gets the image gravity
+	 * @link https://php.net/manual/en/imagick.getimagegravity.php
+	 * @return int the images gravity property. Refer to the list of
+	 * gravity constants.
+	 */
+	public function getImageGravity () {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Imports image pixels
+	 * @link https://php.net/manual/en/imagick.importimagepixels.php
+	 * @param int $x <p>
+	 * The image x position
+	 * </p>
+	 * @param int $y <p>
+	 * The image y position
+	 * </p>
+	 * @param int $width <p>
+	 * The image width
+	 * </p>
+	 * @param int $height <p>
+	 * The image height
+	 * </p>
+	 * @param string $map <p>
+	 * Map of pixel ordering as a string. This can be for example RGB.
+	 * The value can be any combination or order of R = red, G = green, B = blue, A = alpha (0 is transparent),
+	 * O = opacity (0 is opaque), C = cyan, Y = yellow, M = magenta, K = black, I = intensity (for grayscale), P = pad.
+	 * </p>
+	 * @param int $storage <p>
+	 * The pixel storage method.
+	 * Refer to this list of pixel constants.
+	 * </p>
+	 * @param array $pixels <p>
+	 * The array of pixels
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function importImagePixels ($x, $y, $width, $height, $map, $storage, array $pixels) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Removes skew from the image
+	 * @link https://php.net/manual/en/imagick.deskewimage.php
+	 * @param float $threshold <p>
+	 * Deskew threshold
+	 * </p>
+	 * @return bool
+	 */
+	public function deskewImage ($threshold) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Segments an image
+	 * @link https://php.net/manual/en/imagick.segmentimage.php
+	 * @param int $COLORSPACE <p>
+	 * One of the COLORSPACE constants.
+	 * </p>
+	 * @param float $cluster_threshold <p>
+	 * A percentage describing minimum number of pixels
+	 * contained in hexedra before it is considered valid.
+	 * </p>
+	 * @param float $smooth_threshold <p>
+	 * Eliminates noise from the histogram.
+	 * </p>
+	 * @param bool $verbose [optional] <p>
+	 * Whether to output detailed information about recognised classes.
+	 * </p>
+	 * @return bool
+	 */
+	public function segmentImage ($COLORSPACE, $cluster_threshold, $smooth_threshold, $verbose = false) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Interpolates colors
+	 * @link https://php.net/manual/en/imagick.sparsecolorimage.php
+	 * @param int $SPARSE_METHOD <p>
+	 * Refer to this list of sparse method constants
+	 * </p>
+	 * @param array $arguments <p>
+	 * An array containing the coordinates.
+	 * The array is in format array(1,1, 2,45)
+	 * </p>
+	 * @param int $channel [optional]
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function sparseColorImage ($SPARSE_METHOD, array $arguments, $channel = Imagick::CHANNEL_DEFAULT) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Remaps image colors
+	 * @link https://php.net/manual/en/imagick.remapimage.php
+	 * @param Imagick $replacement <p>
+	 * An Imagick object containing the replacement colors
+	 * </p>
+	 * @param int $DITHER <p>
+	 * Refer to this list of dither method constants
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function remapImage (Imagick $replacement, $DITHER) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Exports raw image pixels
+	 * @link https://php.net/manual/en/imagick.exportimagepixels.php
+	 * @param int $x <p>
+	 * X-coordinate of the exported area
+	 * </p>
+	 * @param int $y <p>
+	 * Y-coordinate of the exported area
+	 * </p>
+	 * @param int $width <p>
+	 * Width of the exported aread
+	 * </p>
+	 * @param int $height <p>
+	 * Height of the exported area
+	 * </p>
+	 * @param string $map <p>
+	 * Ordering of the exported pixels. For example "RGB".
+	 * Valid characters for the map are R, G, B, A, O, C, Y, M, K, I and P.
+	 * </p>
+	 * @param int $STORAGE <p>
+	 * Refer to this list of pixel type constants
+	 * </p>
+	 * @return array an array containing the pixels values.
+	 */
+	public function exportImagePixels ($x, $y, $width, $height, $map, $STORAGE) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * The getImageChannelKurtosis purpose
+	 * @link https://php.net/manual/en/imagick.getimagechannelkurtosis.php
+	 * @param int $channel [optional] <p>
+	 * Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to <b>Imagick::CHANNEL_DEFAULT</b>. Refer to this list of channel constants
+	 * </p>
+	 * @return array an array with kurtosis and skewness
+	 * members.
+	 */
+	public function getImageChannelKurtosis ($channel = Imagick::CHANNEL_DEFAULT) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Applies a function on the image
+	 * @link https://php.net/manual/en/imagick.functionimage.php
+	 * @param int $function <p>
+	 * Refer to this list of function constants
+	 * </p>
+	 * @param array $arguments <p>
+	 * Array of arguments to pass to this function.
+	 * </p>
+	 * @param int $channel [optional]
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function functionImage ($function, array $arguments, $channel = Imagick::CHANNEL_DEFAULT) {}
+
+	/**
+	 * @param $COLORSPACE
+	 */
+	public function transformImageColorspace ($COLORSPACE) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Replaces colors in the image
+	 * @link https://php.net/manual/en/imagick.haldclutimage.php
+	 * @param Imagick $clut <p>
+	 * Imagick object containing the Hald lookup image.
+	 * </p>
+	 * @param int $channel [optional] <p>
+	 * Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to <b>Imagick::CHANNEL_DEFAULT</b>. Refer to this list of channel constants
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function haldClutImage (Imagick $clut, $channel = Imagick::CHANNEL_DEFAULT) {}
+
+	/**
+	 * @param $CHANNEL [optional]
+	 */
+	public function autoLevelImage ($CHANNEL) {}
+
+	/**
+	 * @param $factor [optional]
+	 */
+	public function blueShiftImage ($factor) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Get image artifact
+	 * @link https://php.net/manual/en/imagick.getimageartifact.php
+	 * @param string $artifact <p>
+	 * The name of the artifact
+	 * </p>
+	 * @return string the artifact value on success.
+	 */
+	public function getImageArtifact ($artifact) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Set image artifact
+	 * @link https://php.net/manual/en/imagick.setimageartifact.php
+	 * @param string $artifact <p>
+	 * The name of the artifact
+	 * </p>
+	 * @param string $value <p>
+	 * The value of the artifact
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageArtifact ($artifact, $value) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Delete image artifact
+	 * @link https://php.net/manual/en/imagick.deleteimageartifact.php
+	 * @param string $artifact <p>
+	 * The name of the artifact to delete
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function deleteImageArtifact ($artifact) {}
+
+	/**
+	 * (PECL imagick 0.9.10-0.9.9)<br/>
+	 * Gets the colorspace
+	 * @link https://php.net/manual/en/imagick.getcolorspace.php
+	 * @return int an integer which can be compared against COLORSPACE constants.
+	 */
+	public function getColorspace () {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Set colorspace
+	 * @link https://php.net/manual/en/imagick.setcolorspace.php
+	 * @param int $COLORSPACE <p>
+	 * One of the COLORSPACE constants
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setColorspace ($COLORSPACE) {}
+
+	/**
+	 * @param $CHANNEL [optional]
+	 */
+	public function clampImage ($CHANNEL) {}
+
+	/**
+	 * @param $stack
+	 * @param $offset
+	 */
+	public function smushImages ($stack, $offset) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * The Imagick constructor
+	 * @link https://php.net/manual/en/imagick.construct.php
+	 * @param mixed $files <p>
+	 * The path to an image to load or an array of paths. Paths can include
+	 * wildcards for file names, or can be URLs.
+	 * </p>
+	 * @throws ImagickException Throws ImagickException on error.
+	 */
+	public function __construct ($files = null) {}
+
+	/**
+	 * @return string
+	 */
+	public function __toString () {}
+
+	public function count () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns a MagickPixelIterator
+	 * @link https://php.net/manual/en/imagick.getpixeliterator.php
+	 * @return ImagickPixelIterator an ImagickPixelIterator on success.
+	 */
+	public function getPixelIterator () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Get an ImagickPixelIterator for an image section
+	 * @link https://php.net/manual/en/imagick.getpixelregioniterator.php
+	 * @param int $x <p>
+	 * The x-coordinate of the region.
+	 * </p>
+	 * @param int $y <p>
+	 * The y-coordinate of the region.
+	 * </p>
+	 * @param int $columns <p>
+	 * The width of the region.
+	 * </p>
+	 * @param int $rows <p>
+	 * The height of the region.
+	 * </p>
+	 * @return ImagickPixelIterator an ImagickPixelIterator for an image section.
+	 */
+	public function getPixelRegionIterator ($x, $y, $columns, $rows) {}
+
+	/**
+	 * (PECL imagick 0.9.0-0.9.9)<br/>
+	 * Reads image from filename
+	 * @link https://php.net/manual/en/imagick.readimage.php
+	 * @param string $filename
+	 * @return bool <b>TRUE</b> on success.
+	 * @throws ImagickException Throws ImagickException on error.
+	 */
+	public function readImage ($filename) {}
+
+	/**
+	 * @param $filenames
+	 * @throws ImagickException Throws ImagickException on error.
+	 */
+	public function readImages ($filenames) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Reads image from a binary string
+	 * @link https://php.net/manual/en/imagick.readimageblob.php
+	 * @param string $image
+	 * @param string $filename [optional]
+	 * @return bool <b>TRUE</b> on success.
+	 * @throws ImagickException Throws ImagickException on error.
+	 */
+	public function readImageBlob ($image, $filename = null) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the format of a particular image
+	 * @link https://php.net/manual/en/imagick.setimageformat.php
+	 * @param string $format <p>
+	 * String presentation of the image format. Format support
+	 * depends on the ImageMagick installation.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageFormat ($format) {}
+
+	/**
+	 * Scales the size of an image to the given dimensions. Passing zero as either of the arguments will preserve dimension while scaling.<br>
+	 * If legacy is true, the calculations are done with the small rounding bug that existed in Imagick before 3.4.0.<br>
+	 * If false, the calculations should produce the same results as ImageMagick CLI does.
+	 * @link https://php.net/manual/en/imagick.scaleimage.php
+	 * @param int $cols
+	 * @param int $rows
+	 * @param bool $bestfit [optional] The behavior of the parameter bestfit changed in Imagick 3.0.0. Before this version given dimensions 400x400 an image of dimensions 200x150 would be left untouched. In Imagick 3.0.0 and later the image would be scaled up to size 400x300 as this is the "best fit" for the given dimensions. If bestfit parameter is used both width and height must be given.
+	 * @param bool $legacy [optional] Added since 3.4.0. Default value FALSE
+	 * @return bool <b>TRUE</b> on success.
+	 * @throws ImagickException Throws ImagickException on error
+	 * @since 2.0.0
+	 */
+	public function scaleImage ($cols, $rows, $bestfit = false, $legacy = false) {}
+
+	/**
+	 * (PECL imagick 0.9.0-0.9.9)<br/>
+	 * Writes an image to the specified filename
+	 * @link https://php.net/manual/en/imagick.writeimage.php
+	 * @param string $filename [optional] <p>
+	 * Filename where to write the image. The extension of the filename
+	 * defines the type of the file.
+	 * Format can be forced regardless of file extension using format: prefix,
+	 * for example "jpg:test.png".
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function writeImage ($filename = null) {}
+
+	/**
+	 * (PECL imagick 0.9.0-0.9.9)<br/>
+	 * Writes an image or image sequence
+	 * @link https://php.net/manual/en/imagick.writeimages.php
+	 * @param string $filename
+	 * @param bool $adjoin
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function writeImages ($filename, $adjoin) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Adds blur filter to image
+	 * @link https://php.net/manual/en/imagick.blurimage.php
+	 * @param float $radius <p>
+	 * Blur radius
+	 * </p>
+	 * @param float $sigma <p>
+	 * Standard deviation
+	 * </p>
+	 * @param int $channel [optional] <p>
+	 * The Channeltype
+	 * constant. When not supplied, all channels are blurred.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function blurImage ($radius, $sigma, $channel = null) {}
+
+	/**
+	 * Changes the size of an image to the given dimensions and removes any associated profiles.<br>
+	 * If legacy is true, the calculations are done with the small rounding bug that existed in Imagick before 3.4.0.<br>
+	 * If false, the calculations should produce the same results as ImageMagick CLI does.<br>
+	 * <br>
+	 * <b>Note:</b> The behavior of the parameter bestfit changed in Imagick 3.0.0. Before this version given dimensions 400x400 an image of dimensions 200x150 would be left untouched. In Imagick 3.0.0 and later the image would be scaled up to size 400x300 as this is the "best fit" for the given dimensions. If bestfit parameter is used both width and height must be given.
+	 * @link https://php.net/manual/en/imagick.thumbnailimage.php
+	 * @param int $columns <p>
+	 * Image width
+	 * </p>
+	 * @param int $rows <p>
+	 * Image height
+	 * </p>
+	 * @param bool $bestfit [optional] <p>
+	 * Whether to force maximum values
+	 * </p>
+	 * The behavior of the parameter bestfit changed in Imagick 3.0.0. Before this version given dimensions 400x400 an image of dimensions 200x150 would be left untouched. In Imagick 3.0.0 and later the image would be scaled up to size 400x300 as this is the "best fit" for the given dimensions. If bestfit parameter is used both width and height must be given.
+	 * @param bool $fill [optional]
+	 * @param bool $legacy [optional] Added since 3.4.0. Default value FALSE
+	 * @return bool <b>TRUE</b> on success.
+	 * @since 2.0.0
+	 */
+	public function thumbnailImage ($columns, $rows, $bestfit = false, $fill = false, $legacy = false) {}
+
+	/**
+	 * Creates a cropped thumbnail at the requested size.
+	 * If legacy is true, uses the incorrect behaviour that was present until Imagick 3.4.0.
+	 * If false it uses the correct behaviour.
+	 * @link https://php.net/manual/en/imagick.cropthumbnailimage.php
+	 * @param int $width The width of the thumbnail
+	 * @param int $height The Height of the thumbnail
+	 * @param bool $legacy [optional] Added since 3.4.0. Default value FALSE
+	 * @return bool TRUE on succes
+	 * @throws ImagickException Throws ImagickException on error
+	 * @since 2.0.0
+	 */
+	public function cropThumbnailImage ($width, $height, $legacy = false) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the filename of a particular image in a sequence
+	 * @link https://php.net/manual/en/imagick.getimagefilename.php
+	 * @return string a string with the filename of the image.
+	 */
+	public function getImageFilename () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the filename of a particular image
+	 * @link https://php.net/manual/en/imagick.setimagefilename.php
+	 * @param string $filename
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageFilename ($filename) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the format of a particular image in a sequence
+	 * @link https://php.net/manual/en/imagick.getimageformat.php
+	 * @return string a string containing the image format on success.
+	 */
+	public function getImageFormat () {}
+
+	/**
+	 * @link https://secure.php.net/manual/en/imagick.getimagemimetype.php
+	 * @return string Returns the image mime-type.
+	 */
+	public function getImageMimeType () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Removes an image from the image list
+	 * @link https://php.net/manual/en/imagick.removeimage.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function removeImage () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Destroys the Imagick object
+	 * @link https://php.net/manual/en/imagick.destroy.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function destroy () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Clears all resources associated to Imagick object
+	 * @link https://php.net/manual/en/imagick.clear.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function clear () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the image length in bytes
+	 * @link https://php.net/manual/en/imagick.getimagesize.php
+	 * @return int an int containing the current image size.
+	 * @deprecated use {@see Imagick::getImageLength()} instead
+	 */
+	public function getImageSize () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the image sequence as a blob
+	 * @link https://php.net/manual/en/imagick.getimageblob.php
+	 * @return string a string containing the image.
+	 */
+	public function getImageBlob () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns all image sequences as a blob
+	 * @link https://php.net/manual/en/imagick.getimagesblob.php
+	 * @return string a string containing the images. On failure, throws ImagickException on failure
+	 * @throws ImagickException on failure
+	 */
+	public function getImagesBlob () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the Imagick iterator to the first image
+	 * @link https://php.net/manual/en/imagick.setfirstiterator.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setFirstIterator () {}
+
+	/**
+	 * (PECL imagick 2.0.1)<br/>
+	 * Sets the Imagick iterator to the last image
+	 * @link https://php.net/manual/en/imagick.setlastiterator.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setLastIterator () {}
+
+	public function resetIterator () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Move to the previous image in the object
+	 * @link https://php.net/manual/en/imagick.previousimage.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function previousImage () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Moves to the next image
+	 * @link https://php.net/manual/en/imagick.nextimage.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function nextImage () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Checks if the object has a previous image
+	 * @link https://php.net/manual/en/imagick.haspreviousimage.php
+	 * @return bool <b>TRUE</b> if the object has more images when traversing the list in the
+	 * reverse direction, returns <b>FALSE</b> if there are none.
+	 */
+	public function hasPreviousImage () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Checks if the object has more images
+	 * @link https://php.net/manual/en/imagick.hasnextimage.php
+	 * @return bool <b>TRUE</b> if the object has more images when traversing the list in the
+	 * forward direction, returns <b>FALSE</b> if there are none.
+	 */
+	public function hasNextImage () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Set the iterator position
+	 * @link https://php.net/manual/en/imagick.setimageindex.php
+	 * @param int $index <p>
+	 * The position to set the iterator to
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageIndex ($index) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the index of the current active image
+	 * @link https://php.net/manual/en/imagick.getimageindex.php
+	 * @return int an integer containing the index of the image in the stack.
+	 */
+	public function getImageIndex () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Adds a comment to your image
+	 * @link https://php.net/manual/en/imagick.commentimage.php
+	 * @param string $comment <p>
+	 * The comment to add
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function commentImage ($comment) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Extracts a region of the image
+	 * @link https://php.net/manual/en/imagick.cropimage.php
+	 * @param int $width <p>
+	 * The width of the crop
+	 * </p>
+	 * @param int $height <p>
+	 * The height of the crop
+	 * </p>
+	 * @param int $x <p>
+	 * The X coordinate of the cropped region's top left corner
+	 * </p>
+	 * @param int $y <p>
+	 * The Y coordinate of the cropped region's top left corner
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function cropImage ($width, $height, $x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Adds a label to an image
+	 * @link https://php.net/manual/en/imagick.labelimage.php
+	 * @param string $label <p>
+	 * The label to add
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function labelImage ($label) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the width and height as an associative array
+	 * @link https://php.net/manual/en/imagick.getimagegeometry.php
+	 * @return array an array with the width/height of the image.
+	 */
+	public function getImageGeometry () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Renders the ImagickDraw object on the current image
+	 * @link https://php.net/manual/en/imagick.drawimage.php
+	 * @param ImagickDraw $draw <p>
+	 * The drawing operations to render on the image.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function drawImage (ImagickDraw $draw) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Sets the image compression quality
+	 * @link https://php.net/manual/en/imagick.setimagecompressionquality.php
+	 * @param int $quality <p>
+	 * The image compression quality as an integer
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageCompressionQuality ($quality) {}
+
+	/**
+	 * (PECL imagick 2.2.2)<br/>
+	 * Gets the current image's compression quality
+	 * @link https://php.net/manual/en/imagick.getimagecompressionquality.php
+	 * @return int integer describing the images compression quality
+	 */
+	public function getImageCompressionQuality () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Annotates an image with text
+	 * @link https://php.net/manual/en/imagick.annotateimage.php
+	 * @param ImagickDraw $draw_settings <p>
+	 * The ImagickDraw object that contains settings for drawing the text
+	 * </p>
+	 * @param float $x <p>
+	 * Horizontal offset in pixels to the left of text
+	 * </p>
+	 * @param float $y <p>
+	 * Vertical offset in pixels to the baseline of text
+	 * </p>
+	 * @param float $angle <p>
+	 * The angle at which to write the text
+	 * </p>
+	 * @param string $text <p>
+	 * The string to draw
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function annotateImage (ImagickDraw $draw_settings, $x, $y, $angle, $text) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Composite one image onto another
+	 * @link https://php.net/manual/en/imagick.compositeimage.php
+	 * @param Imagick $composite_object <p>
+	 * Imagick object which holds the composite image
+	 * </p>
+	 * @param int $composite Composite operator
+	 * @param int $x <p>
+	 * The column offset of the composited image
+	 * </p>
+	 * @param int $y <p>
+	 * The row offset of the composited image
+	 * </p>
+	 * @param int $channel [optional] <p>
+	 * Provide any channel constant that is valid for your channel mode. To
+	 * apply to more than one channel, combine channeltype constants using
+	 * bitwise operators. Refer to this list of channel constants.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function compositeImage (Imagick $composite_object, $composite, $x, $y, $channel = Imagick::CHANNEL_ALL) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Control the brightness, saturation, and hue
+	 * @link https://php.net/manual/en/imagick.modulateimage.php
+	 * @param float $brightness
+	 * @param float $saturation
+	 * @param float $hue
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function modulateImage ($brightness, $saturation, $hue) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the number of unique colors in the image
+	 * @link https://php.net/manual/en/imagick.getimagecolors.php
+	 * @return int <b>TRUE</b> on success.
+	 */
+	public function getImageColors () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Creates a composite image
+	 * @link https://php.net/manual/en/imagick.montageimage.php
+	 * @param ImagickDraw $draw <p>
+	 * The font name, size, and color are obtained from this object.
+	 * </p>
+	 * @param string $tile_geometry <p>
+	 * The number of tiles per row and page (e.g. 6x4+0+0).
+	 * </p>
+	 * @param string $thumbnail_geometry <p>
+	 * Preferred image size and border size of each thumbnail
+	 * (e.g. 120x120+4+3>).
+	 * </p>
+	 * @param int $mode <p>
+	 * Thumbnail framing mode, see Montage Mode constants.
+	 * </p>
+	 * @param string $frame <p>
+	 * Surround the image with an ornamental border (e.g. 15x15+3+3). The
+	 * frame color is that of the thumbnail's matte color.
+	 * </p>
+	 * @return Imagick <b>TRUE</b> on success.
+	 */
+	public function montageImage (ImagickDraw $draw, $tile_geometry, $thumbnail_geometry, $mode, $frame) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Identifies an image and fetches attributes
+	 * @link https://php.net/manual/en/imagick.identifyimage.php
+	 * @param bool $appendRawOutput [optional]
+	 * @return array Identifies an image and returns the attributes. Attributes include
+	 * the image width, height, size, and others.
+	 */
+	public function identifyImage ($appendRawOutput = false) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Changes the value of individual pixels based on a threshold
+	 * @link https://php.net/manual/en/imagick.thresholdimage.php
+	 * @param float $threshold
+	 * @param int $channel [optional]
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function thresholdImage ($threshold, $channel = Imagick::CHANNEL_ALL) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Selects a threshold for each pixel based on a range of intensity
+	 * @link https://php.net/manual/en/imagick.adaptivethresholdimage.php
+	 * @param int $width <p>
+	 * Width of the local neighborhood.
+	 * </p>
+	 * @param int $height <p>
+	 * Height of the local neighborhood.
+	 * </p>
+	 * @param int $offset <p>
+	 * The mean offset
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function adaptiveThresholdImage ($width, $height, $offset) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Forces all pixels below the threshold into black
+	 * @link https://php.net/manual/en/imagick.blackthresholdimage.php
+	 * @param mixed $threshold <p>
+	 * The threshold below which everything turns black
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function blackThresholdImage ($threshold) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Force all pixels above the threshold into white
+	 * @link https://php.net/manual/en/imagick.whitethresholdimage.php
+	 * @param mixed $threshold
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function whiteThresholdImage ($threshold) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Append a set of images
+	 * @link https://php.net/manual/en/imagick.appendimages.php
+	 * @param bool $stack [optional] <p>
+	 * Whether to stack the images vertically.
+	 * By default (or if <b>FALSE</b> is specified) images are stacked left-to-right.
+	 * If <i>stack</i> is <b>TRUE</b>, images are stacked top-to-bottom.
+	 * </p>
+	 * @return Imagick Imagick instance on success.
+	 */
+	public function appendImages ($stack = false) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Simulates a charcoal drawing
+	 * @link https://php.net/manual/en/imagick.charcoalimage.php
+	 * @param float $radius <p>
+	 * The radius of the Gaussian, in pixels, not counting the center pixel
+	 * </p>
+	 * @param float $sigma <p>
+	 * The standard deviation of the Gaussian, in pixels
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function charcoalImage ($radius, $sigma) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Enhances the contrast of a color image
+	 * @link https://php.net/manual/en/imagick.normalizeimage.php
+	 * @param int $channel [optional] <p>
+	 * Provide any channel constant that is valid for your channel mode. To
+	 * apply to more than one channel, combine channeltype constants using
+	 * bitwise operators. Refer to this
+	 * list of channel constants.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function normalizeImage ($channel = Imagick::CHANNEL_ALL) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Simulates an oil painting
+	 * @link https://php.net/manual/en/imagick.oilpaintimage.php
+	 * @param float $radius <p>
+	 * The radius of the circular neighborhood.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function oilPaintImage ($radius) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Reduces the image to a limited number of color level
+	 * @link https://php.net/manual/en/imagick.posterizeimage.php
+	 * @param int $levels
+	 * @param bool $dither
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function posterizeImage ($levels, $dither) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Radial blurs an image
+	 * @link https://php.net/manual/en/imagick.radialblurimage.php
+	 * @param float $angle
+	 * @param int $channel [optional]
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function radialBlurImage ($angle, $channel = Imagick::CHANNEL_ALL) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Creates a simulated 3d button-like effect
+	 * @link https://php.net/manual/en/imagick.raiseimage.php
+	 * @param int $width
+	 * @param int $height
+	 * @param int $x
+	 * @param int $y
+	 * @param bool $raise
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function raiseImage ($width, $height, $x, $y, $raise) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Resample image to desired resolution
+	 * @link https://php.net/manual/en/imagick.resampleimage.php
+	 * @param float $x_resolution
+	 * @param float $y_resolution
+	 * @param int $filter
+	 * @param float $blur
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function resampleImage ($x_resolution, $y_resolution, $filter, $blur) {}
+
+	/**
+	 * Scales an image to the desired dimensions with one of these filters:<br>
+	 * If legacy is true, the calculations are done with the small rounding bug that existed in Imagick before 3.4.0.<br>
+	 * If false, the calculations should produce the same results as ImageMagick CLI does.<br>
+	 * <br>
+	 * <b>Note:</b> The behavior of the parameter bestfit changed in Imagick 3.0.0. Before this version given dimensions 400x400 an image of dimensions 200x150 would be left untouched.<br>
+	 * In Imagick 3.0.0 and later the image would be scaled up to size 400x300 as this is the "best fit" for the given dimensions. If bestfit parameter is used both width and height must be given.
+	 * @link https://php.net/manual/en/imagick.resizeimage.php
+	 * @param int $columns Width of the image
+	 * @param int $rows Height of the image
+	 * @param int $filter Refer to the list of filter constants.
+	 * @param float $blur The blur factor where > 1 is blurry, < 1 is sharp.
+	 * @param bool $bestfit [optional] Added since 2.1.0. Added optional fit parameter. This method now supports proportional scaling. Pass zero as either parameter for proportional scaling
+	 * @param bool $legacy [optional] Added since 3.4.0. Default value FALSE
+	 * @return bool TRUE on success
+	 * @since 2.0.0
+	 */
+	public function resizeImage ($columns, $rows, $filter, $blur, $bestfit = false, $legacy = false) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Offsets an image
+	 * @link https://php.net/manual/en/imagick.rollimage.php
+	 * @param int $x <p>
+	 * The X offset.
+	 * </p>
+	 * @param int $y <p>
+	 * The Y offset.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function rollImage ($x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Rotates an image
+	 * @link https://php.net/manual/en/imagick.rotateimage.php
+	 * @param mixed $background <p>
+	 * The background color
+	 * </p>
+	 * @param float $degrees <p>
+	 * The number of degrees to rotate the image
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function rotateImage ($background, $degrees) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Scales an image with pixel sampling
+	 * @link https://php.net/manual/en/imagick.sampleimage.php
+	 * @param int $columns
+	 * @param int $rows
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function sampleImage ($columns, $rows) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Applies a solarizing effect to the image
+	 * @link https://php.net/manual/en/imagick.solarizeimage.php
+	 * @param int $threshold
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function solarizeImage ($threshold) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Simulates an image shadow
+	 * @link https://php.net/manual/en/imagick.shadowimage.php
+	 * @param float $opacity
+	 * @param float $sigma
+	 * @param int $x
+	 * @param int $y
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function shadowImage ($opacity, $sigma, $x, $y) {}
+
+	/**
+	 * @param $key
+	 * @param $value
+	 */
+	public function setImageAttribute ($key, $value) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image background color
+	 * @link https://php.net/manual/en/imagick.setimagebackgroundcolor.php
+	 * @param mixed $background
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageBackgroundColor ($background) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image composite operator
+	 * @link https://php.net/manual/en/imagick.setimagecompose.php
+	 * @param int $compose
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageCompose ($compose) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image compression
+	 * @link https://php.net/manual/en/imagick.setimagecompression.php
+	 * @param int $compression <p>
+	 * One of the <b>COMPRESSION</b> constants
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageCompression ($compression) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image delay
+	 * @link https://php.net/manual/en/imagick.setimagedelay.php
+	 * @param int $delay <p>
+	 * The amount of time expressed in 'ticks' that the image should be
+	 * displayed for. For animated GIFs there are 100 ticks per second, so a
+	 * value of 20 would be 20/100 of a second aka 1/5th of a second.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageDelay ($delay) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image depth
+	 * @link https://php.net/manual/en/imagick.setimagedepth.php
+	 * @param int $depth
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageDepth ($depth) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image gamma
+	 * @link https://php.net/manual/en/imagick.setimagegamma.php
+	 * @param float $gamma
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageGamma ($gamma) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image iterations
+	 * @link https://php.net/manual/en/imagick.setimageiterations.php
+	 * @param int $iterations <p>
+	 * The number of iterations the image should loop over. Set to '0' to loop
+	 * continuously.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageIterations ($iterations) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image matte color
+	 * @link https://php.net/manual/en/imagick.setimagemattecolor.php
+	 * @param mixed $matte
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageMatteColor ($matte) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the page geometry of the image
+	 * @link https://php.net/manual/en/imagick.setimagepage.php
+	 * @param int $width
+	 * @param int $height
+	 * @param int $x
+	 * @param int $y
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImagePage ($width, $height, $x, $y) {}
+
+	/**
+	 * @param $filename
+	 */
+	public function setImageProgressMonitor ($filename) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image resolution
+	 * @link https://php.net/manual/en/imagick.setimageresolution.php
+	 * @param float $x_resolution
+	 * @param float $y_resolution
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageResolution ($x_resolution, $y_resolution) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image scene
+	 * @link https://php.net/manual/en/imagick.setimagescene.php
+	 * @param int $scene
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageScene ($scene) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image ticks-per-second
+	 * @link https://php.net/manual/en/imagick.setimagetickspersecond.php
+	 * @param int $ticks_per_second <p>
+	 * The duration for which an image should be displayed expressed in ticks
+	 * per second.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageTicksPerSecond ($ticks_per_second) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image type
+	 * @link https://php.net/manual/en/imagick.setimagetype.php
+	 * @param int $image_type
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageType ($image_type) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image units of resolution
+	 * @link https://php.net/manual/en/imagick.setimageunits.php
+	 * @param int $units
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageUnits ($units) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sharpens an image
+	 * @link https://php.net/manual/en/imagick.sharpenimage.php
+	 * @param float $radius
+	 * @param float $sigma
+	 * @param int $channel [optional]
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function sharpenImage ($radius, $sigma, $channel = Imagick::CHANNEL_ALL) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Shaves pixels from the image edges
+	 * @link https://php.net/manual/en/imagick.shaveimage.php
+	 * @param int $columns
+	 * @param int $rows
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function shaveImage ($columns, $rows) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Creating a parallelogram
+	 * @link https://php.net/manual/en/imagick.shearimage.php
+	 * @param mixed $background <p>
+	 * The background color
+	 * </p>
+	 * @param float $x_shear <p>
+	 * The number of degrees to shear on the x axis
+	 * </p>
+	 * @param float $y_shear <p>
+	 * The number of degrees to shear on the y axis
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function shearImage ($background, $x_shear, $y_shear) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Splices a solid color into the image
+	 * @link https://php.net/manual/en/imagick.spliceimage.php
+	 * @param int $width
+	 * @param int $height
+	 * @param int $x
+	 * @param int $y
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function spliceImage ($width, $height, $x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Fetch basic attributes about the image
+	 * @link https://php.net/manual/en/imagick.pingimage.php
+	 * @param string $filename <p>
+	 * The filename to read the information from.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function pingImage ($filename) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Reads image from open filehandle
+	 * @link https://php.net/manual/en/imagick.readimagefile.php
+	 * @param resource $filehandle
+	 * @param string $fileName [optional]
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function readImageFile ($filehandle, $fileName = null) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Displays an image
+	 * @link https://php.net/manual/en/imagick.displayimage.php
+	 * @param string $servername <p>
+	 * The X server name
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function displayImage ($servername) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Displays an image or image sequence
+	 * @link https://php.net/manual/en/imagick.displayimages.php
+	 * @param string $servername <p>
+	 * The X server name
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function displayImages ($servername) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Randomly displaces each pixel in a block
+	 * @link https://php.net/manual/en/imagick.spreadimage.php
+	 * @param float $radius
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function spreadImage ($radius) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Swirls the pixels about the center of the image
+	 * @link https://php.net/manual/en/imagick.swirlimage.php
+	 * @param float $degrees
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function swirlImage ($degrees) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Strips an image of all profiles and comments
+	 * @link https://php.net/manual/en/imagick.stripimage.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function stripImage () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns formats supported by Imagick
+	 * @link https://php.net/manual/en/imagick.queryformats.php
+	 * @param string $pattern [optional]
+	 * @return array an array containing the formats supported by Imagick.
+	 */
+	public static function queryFormats ($pattern = "*") {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the configured fonts
+	 * @link https://php.net/manual/en/imagick.queryfonts.php
+	 * @param string $pattern [optional] <p>
+	 * The query pattern
+	 * </p>
+	 * @return array an array containing the configured fonts.
+	 */
+	public static function queryFonts ($pattern = "*") {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns an array representing the font metrics
+	 * @link https://php.net/manual/en/imagick.queryfontmetrics.php
+	 * @param ImagickDraw $properties <p>
+	 * ImagickDraw object containing font properties
+	 * </p>
+	 * @param string $text <p>
+	 * The text
+	 * </p>
+	 * @param bool $multiline [optional] <p>
+	 * Multiline parameter. If left empty it is autodetected
+	 * </p>
+	 * @return array a multi-dimensional array representing the font metrics.
+	 */
+	public function queryFontMetrics (ImagickDraw $properties, $text, $multiline = null) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Hides a digital watermark within the image
+	 * @link https://php.net/manual/en/imagick.steganoimage.php
+	 * @param Imagick $watermark_wand
+	 * @param int $offset
+	 * @return Imagick <b>TRUE</b> on success.
+	 */
+	public function steganoImage (Imagick $watermark_wand, $offset) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Adds random noise to the image
+	 * @link https://php.net/manual/en/imagick.addnoiseimage.php
+	 * @param int $noise_type <p>
+	 * The type of the noise. Refer to this list of
+	 * noise constants.
+	 * </p>
+	 * @param int $channel [optional] <p>
+	 * Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to <b>Imagick::CHANNEL_DEFAULT</b>. Refer to this list of channel constants
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function addNoiseImage ($noise_type, $channel = Imagick::CHANNEL_DEFAULT) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Simulates motion blur
+	 * @link https://php.net/manual/en/imagick.motionblurimage.php
+	 * @param float $radius <p>
+	 * The radius of the Gaussian, in pixels, not counting the center pixel.
+	 * </p>
+	 * @param float $sigma <p>
+	 * The standard deviation of the Gaussian, in pixels.
+	 * </p>
+	 * @param float $angle <p>
+	 * Apply the effect along this angle.
+	 * </p>
+	 * @param int $channel [optional] <p>
+	 * Provide any channel constant that is valid for your channel mode. To
+	 * apply to more than one channel, combine channeltype constants using
+	 * bitwise operators. Refer to this
+	 * list of channel constants.
+	 * The channel argument affects only if Imagick is compiled against ImageMagick version
+	 * 6.4.4 or greater.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function motionBlurImage ($radius, $sigma, $angle, $channel = Imagick::CHANNEL_DEFAULT) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Forms a mosaic from images
+	 * @link https://php.net/manual/en/imagick.mosaicimages.php
+	 * @return Imagick <b>TRUE</b> on success.
+	 */
+	public function mosaicImages () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Method morphs a set of images
+	 * @link https://php.net/manual/en/imagick.morphimages.php
+	 * @param int $number_frames <p>
+	 * The number of in-between images to generate.
+	 * </p>
+	 * @return Imagick This method returns a new Imagick object on success.
+	 * Throw an <b>ImagickException</b> on error.
+	 * @throws ImagickException on error
+	 */
+	public function morphImages ($number_frames) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Scales an image proportionally to half its size
+	 * @link https://php.net/manual/en/imagick.minifyimage.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function minifyImage () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Transforms an image
+	 * @link https://php.net/manual/en/imagick.affinetransformimage.php
+	 * @param ImagickDraw $matrix <p>
+	 * The affine matrix
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function affineTransformImage (ImagickDraw $matrix) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Average a set of images
+	 * @link https://php.net/manual/en/imagick.averageimages.php
+	 * @return Imagick a new Imagick object on success.
+	 */
+	public function averageImages () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Surrounds the image with a border
+	 * @link https://php.net/manual/en/imagick.borderimage.php
+	 * @param mixed $bordercolor <p>
+	 * ImagickPixel object or a string containing the border color
+	 * </p>
+	 * @param int $width <p>
+	 * Border width
+	 * </p>
+	 * @param int $height <p>
+	 * Border height
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function borderImage ($bordercolor, $width, $height) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Removes a region of an image and trims
+	 * @link https://php.net/manual/en/imagick.chopimage.php
+	 * @param int $width <p>
+	 * Width of the chopped area
+	 * </p>
+	 * @param int $height <p>
+	 * Height of the chopped area
+	 * </p>
+	 * @param int $x <p>
+	 * X origo of the chopped area
+	 * </p>
+	 * @param int $y <p>
+	 * Y origo of the chopped area
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function chopImage ($width, $height, $x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Clips along the first path from the 8BIM profile
+	 * @link https://php.net/manual/en/imagick.clipimage.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function clipImage () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Clips along the named paths from the 8BIM profile
+	 * @link https://php.net/manual/en/imagick.clippathimage.php
+	 * @param string $pathname <p>
+	 * The name of the path
+	 * </p>
+	 * @param bool $inside <p>
+	 * If <b>TRUE</b> later operations take effect inside clipping path.
+	 * Otherwise later operations take effect outside clipping path.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function clipPathImage ($pathname, $inside) {}
+
+	/**
+	 * @param $pathname
+	 * @param $inside
+	 */
+	public function clipImagePath ($pathname, $inside) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Composites a set of images
+	 * @link https://php.net/manual/en/imagick.coalesceimages.php
+	 * @return Imagick a new Imagick object on success.
+	 */
+	public function coalesceImages () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Changes the color value of any pixel that matches target
+	 * @link https://php.net/manual/en/imagick.colorfloodfillimage.php
+	 * @param mixed $fill <p>
+	 * ImagickPixel object containing the fill color
+	 * </p>
+	 * @param float $fuzz <p>
+	 * The amount of fuzz. For example, set fuzz to 10 and the color red at
+	 * intensities of 100 and 102 respectively are now interpreted as the
+	 * same color for the purposes of the floodfill.
+	 * </p>
+	 * @param mixed $bordercolor <p>
+	 * ImagickPixel object containing the border color
+	 * </p>
+	 * @param int $x <p>
+	 * X start position of the floodfill
+	 * </p>
+	 * @param int $y <p>
+	 * Y start position of the floodfill
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function colorFloodfillImage ($fill, $fuzz, $bordercolor, $x, $y) {}
+
+	/**
+	 * Blends the fill color with each pixel in the image. The 'opacity' color is a per channel strength factor for how strongly the color should be applied.<br>
+	 * If legacy is true, the behaviour of this function is incorrect, but consistent with how it behaved before Imagick version 3.4.0
+	 * @link https://php.net/manual/en/imagick.colorizeimage.php
+	 * @param mixed $colorize <p>
+	 * ImagickPixel object or a string containing the colorize color
+	 * </p>
+	 * @param mixed $opacity <p>
+	 * ImagickPixel object or an float containing the opacity value.
+	 * 1.0 is fully opaque and 0.0 is fully transparent.
+	 * </p>
+	 * @param bool $legacy [optional] Added since 3.4.0. Default value FALSE
+	 * @return bool <b>TRUE</b> on success.
+	 * @throws ImagickException Throws ImagickException on error
+	 * @since 2.0.0
+	 */
+	public function colorizeImage ($colorize, $opacity, $legacy = false) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the difference in one or more images
+	 * @link https://php.net/manual/en/imagick.compareimagechannels.php
+	 * @param Imagick $image <p>
+	 * Imagick object containing the image to compare.
+	 * </p>
+	 * @param int $channelType <p>
+	 * Provide any channel constant that is valid for your channel mode. To
+	 * apply to more than one channel, combine channeltype constants using
+	 * bitwise operators. Refer to this
+	 * list of channel constants.
+	 * </p>
+	 * @param int $metricType <p>
+	 * One of the metric type constants.
+	 * </p>
+	 * @return array Array consisting of new_wand and
+	 * distortion.
+	 */
+	public function compareImageChannels (Imagick $image, $channelType, $metricType) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Compares an image to a reconstructed image
+	 * @link https://php.net/manual/en/imagick.compareimages.php
+	 * @param Imagick $compare <p>
+	 * An image to compare to.
+	 * </p>
+	 * @param int $metric <p>
+	 * Provide a valid metric type constant. Refer to this
+	 * list of metric constants.
+	 * </p>
+	 * @return array Array consisting of an Imagick object of the
+	 * reconstructed image and a float representing the difference.
+	 * @throws ImagickException Throws ImagickException on error.
+	 */
+	public function compareImages (Imagick $compare, $metric) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Change the contrast of the image
+	 * @link https://php.net/manual/en/imagick.contrastimage.php
+	 * @param bool $sharpen <p>
+	 * The sharpen value
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function contrastImage ($sharpen) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Combines one or more images into a single image
+	 * @link https://php.net/manual/en/imagick.combineimages.php
+	 * @param int $channelType <p>
+	 * Provide any channel constant that is valid for your channel mode. To
+	 * apply to more than one channel, combine channeltype constants using
+	 * bitwise operators. Refer to this
+	 * list of channel constants.
+	 * </p>
+	 * @return Imagick <b>TRUE</b> on success.
+	 */
+	public function combineImages ($channelType) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Applies a custom convolution kernel to the image
+	 * @link https://php.net/manual/en/imagick.convolveimage.php
+	 * @param array $kernel <p>
+	 * The convolution kernel
+	 * </p>
+	 * @param int $channel [optional] <p>
+	 * Provide any channel constant that is valid for your channel mode. To
+	 * apply to more than one channel, combine channeltype constants using
+	 * bitwise operators. Refer to this
+	 * list of channel constants.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function convolveImage (array $kernel, $channel = Imagick::CHANNEL_ALL) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Displaces an image's colormap
+	 * @link https://php.net/manual/en/imagick.cyclecolormapimage.php
+	 * @param int $displace <p>
+	 * The amount to displace the colormap.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function cycleColormapImage ($displace) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns certain pixel differences between images
+	 * @link https://php.net/manual/en/imagick.deconstructimages.php
+	 * @return Imagick a new Imagick object on success.
+	 */
+	public function deconstructImages () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Reduces the speckle noise in an image
+	 * @link https://php.net/manual/en/imagick.despeckleimage.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function despeckleImage () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Enhance edges within the image
+	 * @link https://php.net/manual/en/imagick.edgeimage.php
+	 * @param float $radius <p>
+	 * The radius of the operation.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function edgeImage ($radius) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns a grayscale image with a three-dimensional effect
+	 * @link https://php.net/manual/en/imagick.embossimage.php
+	 * @param float $radius <p>
+	 * The radius of the effect
+	 * </p>
+	 * @param float $sigma <p>
+	 * The sigma of the effect
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function embossImage ($radius, $sigma) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Improves the quality of a noisy image
+	 * @link https://php.net/manual/en/imagick.enhanceimage.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function enhanceImage () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Equalizes the image histogram
+	 * @link https://php.net/manual/en/imagick.equalizeimage.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function equalizeImage () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Applies an expression to an image
+	 * @link https://php.net/manual/en/imagick.evaluateimage.php
+	 * @param int $op <p>
+	 * The evaluation operator
+	 * </p>
+	 * @param float $constant <p>
+	 * The value of the operator
+	 * </p>
+	 * @param int $channel [optional] <p>
+	 * Provide any channel constant that is valid for your channel mode. To
+	 * apply to more than one channel, combine channeltype constants using
+	 * bitwise operators. Refer to this
+	 * list of channel constants.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function evaluateImage ($op, $constant, $channel = Imagick::CHANNEL_ALL) {}
+
+	/**
+	 * Merges a sequence of images. This is useful for combining Photoshop layers into a single image.
+	 * This is replaced by:
+	 * <pre>
+	 * $im = $im->mergeImageLayers(\Imagick::LAYERMETHOD_FLATTEN)
+	 * </pre>
+	 * @link https://php.net/manual/en/imagick.flattenimages.php
+	 * @return Imagick Returns an Imagick object containing the merged image.
+	 * @throws ImagickException Throws ImagickException on error.
+	 * @since 2.0.0
+	 */
+	public function flattenImages () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Creates a vertical mirror image
+	 * @link https://php.net/manual/en/imagick.flipimage.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function flipImage () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Creates a horizontal mirror image
+	 * @link https://php.net/manual/en/imagick.flopimage.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function flopImage () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Adds a simulated three-dimensional border
+	 * @link https://php.net/manual/en/imagick.frameimage.php
+	 * @param mixed $matte_color <p>
+	 * ImagickPixel object or a string representing the matte color
+	 * </p>
+	 * @param int $width <p>
+	 * The width of the border
+	 * </p>
+	 * @param int $height <p>
+	 * The height of the border
+	 * </p>
+	 * @param int $inner_bevel <p>
+	 * The inner bevel width
+	 * </p>
+	 * @param int $outer_bevel <p>
+	 * The outer bevel width
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function frameImage ($matte_color, $width, $height, $inner_bevel, $outer_bevel) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Evaluate expression for each pixel in the image
+	 * @link https://php.net/manual/en/imagick.fximage.php
+	 * @param string $expression <p>
+	 * The expression.
+	 * </p>
+	 * @param int $channel [optional] <p>
+	 * Provide any channel constant that is valid for your channel mode. To
+	 * apply to more than one channel, combine channeltype constants using
+	 * bitwise operators. Refer to this
+	 * list of channel constants.
+	 * </p>
+	 * @return Imagick <b>TRUE</b> on success.
+	 */
+	public function fxImage ($expression, $channel = Imagick::CHANNEL_ALL) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gamma-corrects an image
+	 * @link https://php.net/manual/en/imagick.gammaimage.php
+	 * @param float $gamma <p>
+	 * The amount of gamma-correction.
+	 * </p>
+	 * @param int $channel [optional] <p>
+	 * Provide any channel constant that is valid for your channel mode. To
+	 * apply to more than one channel, combine channeltype constants using
+	 * bitwise operators. Refer to this
+	 * list of channel constants.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function gammaImage ($gamma, $channel = Imagick::CHANNEL_ALL) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Blurs an image
+	 * @link https://php.net/manual/en/imagick.gaussianblurimage.php
+	 * @param float $radius <p>
+	 * The radius of the Gaussian, in pixels, not counting the center pixel.
+	 * </p>
+	 * @param float $sigma <p>
+	 * The standard deviation of the Gaussian, in pixels.
+	 * </p>
+	 * @param int $channel [optional] <p>
+	 * Provide any channel constant that is valid for your channel mode. To
+	 * apply to more than one channel, combine channeltype constants using
+	 * bitwise operators. Refer to this
+	 * list of channel constants.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function gaussianBlurImage ($radius, $sigma, $channel = Imagick::CHANNEL_ALL) {}
+
+	/**
+	 * @param $key
+	 */
+	public function getImageAttribute ($key) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the image background color
+	 * @link https://php.net/manual/en/imagick.getimagebackgroundcolor.php
+	 * @return ImagickPixel an ImagickPixel set to the background color of the image.
+	 */
+	public function getImageBackgroundColor () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the chromaticy blue primary point
+	 * @link https://php.net/manual/en/imagick.getimageblueprimary.php
+	 * @return array Array consisting of "x" and "y" coordinates of point.
+	 */
+	public function getImageBluePrimary () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the image border color
+	 * @link https://php.net/manual/en/imagick.getimagebordercolor.php
+	 * @return ImagickPixel <b>TRUE</b> on success.
+	 */
+	public function getImageBorderColor () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the depth for a particular image channel
+	 * @link https://php.net/manual/en/imagick.getimagechanneldepth.php
+	 * @param int $channel <p>
+	 * Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to <b>Imagick::CHANNEL_DEFAULT</b>. Refer to this list of channel constants
+	 * </p>
+	 * @return int <b>TRUE</b> on success.
+	 */
+	public function getImageChannelDepth ($channel) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Compares image channels of an image to a reconstructed image
+	 * @link https://php.net/manual/en/imagick.getimagechanneldistortion.php
+	 * @param Imagick $reference <p>
+	 * Imagick object to compare to.
+	 * </p>
+	 * @param int $channel <p>
+	 * Provide any channel constant that is valid for your channel mode. To
+	 * apply to more than one channel, combine channeltype constants using
+	 * bitwise operators. Refer to this
+	 * list of channel constants.
+	 * </p>
+	 * @param int $metric <p>
+	 * One of the metric type constants.
+	 * </p>
+	 * @return float <b>TRUE</b> on success.
+	 */
+	public function getImageChannelDistortion (Imagick $reference, $channel, $metric) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the extrema for one or more image channels
+	 * @link https://php.net/manual/en/imagick.getimagechannelextrema.php
+	 * @param int $channel <p>
+	 * Provide any channel constant that is valid for your channel mode. To
+	 * apply to more than one channel, combine channeltype constants using
+	 * bitwise operators. Refer to this
+	 * list of channel constants.
+	 * </p>
+	 * @return array <b>TRUE</b> on success.
+	 */
+	public function getImageChannelExtrema ($channel) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the mean and standard deviation
+	 * @link https://php.net/manual/en/imagick.getimagechannelmean.php
+	 * @param int $channel <p>
+	 * Provide any channel constant that is valid for your channel mode. To
+	 * apply to more than one channel, combine channeltype constants using
+	 * bitwise operators. Refer to this
+	 * list of channel constants.
+	 * </p>
+	 * @return array <b>TRUE</b> on success.
+	 */
+	public function getImageChannelMean ($channel) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns statistics for each channel in the image
+	 * @link https://php.net/manual/en/imagick.getimagechannelstatistics.php
+	 * @return array <b>TRUE</b> on success.
+	 */
+	public function getImageChannelStatistics () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the color of the specified colormap index
+	 * @link https://php.net/manual/en/imagick.getimagecolormapcolor.php
+	 * @param int $index <p>
+	 * The offset into the image colormap.
+	 * </p>
+	 * @return ImagickPixel <b>TRUE</b> on success.
+	 */
+	public function getImageColormapColor ($index) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the image colorspace
+	 * @link https://php.net/manual/en/imagick.getimagecolorspace.php
+	 * @return int <b>TRUE</b> on success.
+	 */
+	public function getImageColorspace () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the composite operator associated with the image
+	 * @link https://php.net/manual/en/imagick.getimagecompose.php
+	 * @return int <b>TRUE</b> on success.
+	 */
+	public function getImageCompose () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the image delay
+	 * @link https://php.net/manual/en/imagick.getimagedelay.php
+	 * @return int the image delay.
+	 */
+	public function getImageDelay () {}
+
+	/**
+	 * (PECL imagick 0.9.1-0.9.9)<br/>
+	 * Gets the image depth
+	 * @link https://php.net/manual/en/imagick.getimagedepth.php
+	 * @return int The image depth.
+	 */
+	public function getImageDepth () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Compares an image to a reconstructed image
+	 * @link https://php.net/manual/en/imagick.getimagedistortion.php
+	 * @param Imagick $reference <p>
+	 * Imagick object to compare to.
+	 * </p>
+	 * @param int $metric <p>
+	 * One of the metric type constants.
+	 * </p>
+	 * @return float the distortion metric used on the image (or the best guess
+	 * thereof).
+	 */
+	public function getImageDistortion (Imagick $reference, $metric) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the extrema for the image
+	 * @link https://php.net/manual/en/imagick.getimageextrema.php
+	 * @return array an associative array with the keys "min" and "max".
+	 */
+	public function getImageExtrema () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the image disposal method
+	 * @link https://php.net/manual/en/imagick.getimagedispose.php
+	 * @return int the dispose method on success.
+	 */
+	public function getImageDispose () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the image gamma
+	 * @link https://php.net/manual/en/imagick.getimagegamma.php
+	 * @return float the image gamma on success.
+	 */
+	public function getImageGamma () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the chromaticy green primary point
+	 * @link https://php.net/manual/en/imagick.getimagegreenprimary.php
+	 * @return array an array with the keys "x" and "y" on success, throws an ImagickException on failure.
+	 * @throws ImagickException on failure
+	 */
+	public function getImageGreenPrimary () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the image height
+	 * @link https://php.net/manual/en/imagick.getimageheight.php
+	 * @return int the image height in pixels.
+	 */
+	public function getImageHeight () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the image histogram
+	 * @link https://php.net/manual/en/imagick.getimagehistogram.php
+	 * @return array the image histogram as an array of ImagickPixel objects.
+	 */
+	public function getImageHistogram () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the image interlace scheme
+	 * @link https://php.net/manual/en/imagick.getimageinterlacescheme.php
+	 * @return int the interlace scheme as an integer on success.
+	 * Trhow an <b>ImagickException</b> on error.
+	 * @throws ImagickException on error
+	 */
+	public function getImageInterlaceScheme () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the image iterations
+	 * @link https://php.net/manual/en/imagick.getimageiterations.php
+	 * @return int the image iterations as an integer.
+	 */
+	public function getImageIterations () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the image matte color
+	 * @link https://php.net/manual/en/imagick.getimagemattecolor.php
+	 * @return ImagickPixel ImagickPixel object on success.
+	 */
+	public function getImageMatteColor () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the page geometry
+	 * @link https://php.net/manual/en/imagick.getimagepage.php
+	 * @return array the page geometry associated with the image in an array with the
+	 * keys "width", "height", "x", and "y".
+	 */
+	public function getImagePage () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the color of the specified pixel
+	 * @link https://php.net/manual/en/imagick.getimagepixelcolor.php
+	 * @param int $x <p>
+	 * The x-coordinate of the pixel
+	 * </p>
+	 * @param int $y <p>
+	 * The y-coordinate of the pixel
+	 * </p>
+	 * @return ImagickPixel an ImagickPixel instance for the color at the coordinates given.
+	 */
+	public function getImagePixelColor ($x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the named image profile
+	 * @link https://php.net/manual/en/imagick.getimageprofile.php
+	 * @param string $name <p>
+	 * The name of the profile to return.
+	 * </p>
+	 * @return string a string containing the image profile.
+	 */
+	public function getImageProfile ($name) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the chromaticity red primary point
+	 * @link https://php.net/manual/en/imagick.getimageredprimary.php
+	 * @return array the chromaticity red primary point as an array with the keys "x"
+	 * and "y".
+	 * Throw an <b>ImagickException</b> on error.
+	 * @throws ImagickException on error
+	 */
+	public function getImageRedPrimary () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the image rendering intent
+	 * @link https://php.net/manual/en/imagick.getimagerenderingintent.php
+	 * @return int the image rendering intent.
+	 */
+	public function getImageRenderingIntent () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the image X and Y resolution
+	 * @link https://php.net/manual/en/imagick.getimageresolution.php
+	 * @return array the resolution as an array.
+	 */
+	public function getImageResolution () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the image scene
+	 * @link https://php.net/manual/en/imagick.getimagescene.php
+	 * @return int the image scene.
+	 */
+	public function getImageScene () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Generates an SHA-256 message digest
+	 * @link https://php.net/manual/en/imagick.getimagesignature.php
+	 * @return string a string containing the SHA-256 hash of the file.
+	 */
+	public function getImageSignature () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the image ticks-per-second
+	 * @link https://php.net/manual/en/imagick.getimagetickspersecond.php
+	 * @return int the image ticks-per-second.
+	 */
+	public function getImageTicksPerSecond () {}
+
+	/**
+	 * (PECL imagick 0.9.10-0.9.9)<br/>
+	 * Gets the potential image type
+	 * @link https://php.net/manual/en/imagick.getimagetype.php
+	 * @return int the potential image type.
+	 * <b>imagick::IMGTYPE_UNDEFINED</b>
+	 * <b>imagick::IMGTYPE_BILEVEL</b>
+	 * <b>imagick::IMGTYPE_GRAYSCALE</b>
+	 * <b>imagick::IMGTYPE_GRAYSCALEMATTE</b>
+	 * <b>imagick::IMGTYPE_PALETTE</b>
+	 * <b>imagick::IMGTYPE_PALETTEMATTE</b>
+	 * <b>imagick::IMGTYPE_TRUECOLOR</b>
+	 * <b>imagick::IMGTYPE_TRUECOLORMATTE</b>
+	 * <b>imagick::IMGTYPE_COLORSEPARATION</b>
+	 * <b>imagick::IMGTYPE_COLORSEPARATIONMATTE</b>
+	 * <b>imagick::IMGTYPE_OPTIMIZE</b>
+	 */
+	public function getImageType () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the image units of resolution
+	 * @link https://php.net/manual/en/imagick.getimageunits.php
+	 * @return int the image units of resolution.
+	 */
+	public function getImageUnits () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the virtual pixel method
+	 * @link https://php.net/manual/en/imagick.getimagevirtualpixelmethod.php
+	 * @return int the virtual pixel method on success.
+	 */
+	public function getImageVirtualPixelMethod () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the chromaticity white point
+	 * @link https://php.net/manual/en/imagick.getimagewhitepoint.php
+	 * @return array the chromaticity white point as an associative array with the keys
+	 * "x" and "y".
+	 */
+	public function getImageWhitePoint () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the image width
+	 * @link https://php.net/manual/en/imagick.getimagewidth.php
+	 * @return int the image width.
+	 */
+	public function getImageWidth () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the number of images in the object
+	 * @link https://php.net/manual/en/imagick.getnumberimages.php
+	 * @return int the number of images associated with Imagick object.
+	 */
+	public function getNumberImages () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the image total ink density
+	 * @link https://php.net/manual/en/imagick.getimagetotalinkdensity.php
+	 * @return float the image total ink density of the image.
+	 * Throw an <b>ImagickException</b> on error.
+	 * @throws ImagickException on error
+	 */
+	public function getImageTotalInkDensity () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Extracts a region of the image
+	 * @link https://php.net/manual/en/imagick.getimageregion.php
+	 * @param int $width <p>
+	 * The width of the extracted region.
+	 * </p>
+	 * @param int $height <p>
+	 * The height of the extracted region.
+	 * </p>
+	 * @param int $x <p>
+	 * X-coordinate of the top-left corner of the extracted region.
+	 * </p>
+	 * @param int $y <p>
+	 * Y-coordinate of the top-left corner of the extracted region.
+	 * </p>
+	 * @return Imagick Extracts a region of the image and returns it as a new wand.
+	 */
+	public function getImageRegion ($width, $height, $x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Creates a new image as a copy
+	 * @link https://php.net/manual/en/imagick.implodeimage.php
+	 * @param float $radius <p>
+	 * The radius of the implode
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function implodeImage ($radius) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Adjusts the levels of an image
+	 * @link https://php.net/manual/en/imagick.levelimage.php
+	 * @param float $blackPoint <p>
+	 * The image black point
+	 * </p>
+	 * @param float $gamma <p>
+	 * The gamma value
+	 * </p>
+	 * @param float $whitePoint <p>
+	 * The image white point
+	 * </p>
+	 * @param int $channel [optional] <p>
+	 * Provide any channel constant that is valid for your channel mode. To
+	 * apply to more than one channel, combine channeltype constants using
+	 * bitwise operators. Refer to this
+	 * list of channel constants.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function levelImage ($blackPoint, $gamma, $whitePoint, $channel = Imagick::CHANNEL_ALL) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Scales an image proportionally 2x
+	 * @link https://php.net/manual/en/imagick.magnifyimage.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function magnifyImage () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Replaces the colors of an image with the closest color from a reference image.
+	 * @link https://php.net/manual/en/imagick.mapimage.php
+	 * @param Imagick $map
+	 * @param bool $dither
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function mapImage (Imagick $map, $dither) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Changes the transparency value of a color
+	 * @link https://php.net/manual/en/imagick.mattefloodfillimage.php
+	 * @param float $alpha <p>
+	 * The level of transparency: 1.0 is fully opaque and 0.0 is fully
+	 * transparent.
+	 * </p>
+	 * @param float $fuzz <p>
+	 * The fuzz member of image defines how much tolerance is acceptable to
+	 * consider two colors as the same.
+	 * </p>
+	 * @param mixed $bordercolor <p>
+	 * An <b>ImagickPixel</b> object or string representing the border color.
+	 * </p>
+	 * @param int $x <p>
+	 * The starting x coordinate of the operation.
+	 * </p>
+	 * @param int $y <p>
+	 * The starting y coordinate of the operation.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function matteFloodfillImage ($alpha, $fuzz, $bordercolor, $x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Applies a digital filter
+	 * @link https://php.net/manual/en/imagick.medianfilterimage.php
+	 * @param float $radius <p>
+	 * The radius of the pixel neighborhood.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function medianFilterImage ($radius) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Negates the colors in the reference image
+	 * @link https://php.net/manual/en/imagick.negateimage.php
+	 * @param bool $gray <p>
+	 * Whether to only negate grayscale pixels within the image.
+	 * </p>
+	 * @param int $channel [optional] <p>
+	 * Provide any channel constant that is valid for your channel mode. To
+	 * apply to more than one channel, combine channeltype constants using
+	 * bitwise operators. Refer to this
+	 * list of channel constants.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function negateImage ($gray, $channel = Imagick::CHANNEL_ALL) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Change any pixel that matches color
+	 * @link https://php.net/manual/en/imagick.paintopaqueimage.php
+	 * @param mixed $target <p>
+	 * Change this target color to the fill color within the image. An
+	 * ImagickPixel object or a string representing the target color.
+	 * </p>
+	 * @param mixed $fill <p>
+	 * An ImagickPixel object or a string representing the fill color.
+	 * </p>
+	 * @param float $fuzz <p>
+	 * The fuzz member of image defines how much tolerance is acceptable to
+	 * consider two colors as the same.
+	 * </p>
+	 * @param int $channel [optional] <p>
+	 * Provide any channel constant that is valid for your channel mode. To
+	 * apply to more than one channel, combine channeltype constants using
+	 * bitwise operators. Refer to this
+	 * list of channel constants.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function paintOpaqueImage ($target, $fill, $fuzz, $channel = Imagick::CHANNEL_ALL) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Changes any pixel that matches color with the color defined by fill
+	 * @link https://php.net/manual/en/imagick.painttransparentimage.php
+	 * @param mixed $target <p>
+	 * Change this target color to specified opacity value within the image.
+	 * </p>
+	 * @param float $alpha <p>
+	 * The level of transparency: 1.0 is fully opaque and 0.0 is fully
+	 * transparent.
+	 * </p>
+	 * @param float $fuzz <p>
+	 * The fuzz member of image defines how much tolerance is acceptable to
+	 * consider two colors as the same.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function paintTransparentImage ($target, $alpha, $fuzz) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Quickly pin-point appropriate parameters for image processing
+	 * @link https://php.net/manual/en/imagick.previewimages.php
+	 * @param int $preview <p>
+	 * Preview type. See Preview type constants
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function previewImages ($preview) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Adds or removes a profile from an image
+	 * @link https://php.net/manual/en/imagick.profileimage.php
+	 * @param string $name
+	 * @param string $profile
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function profileImage ($name, $profile) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Analyzes the colors within a reference image
+	 * @link https://php.net/manual/en/imagick.quantizeimage.php
+	 * @param int $numberColors
+	 * @param int $colorspace
+	 * @param int $treedepth
+	 * @param bool $dither
+	 * @param bool $measureError
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function quantizeImage ($numberColors, $colorspace, $treedepth, $dither, $measureError) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Analyzes the colors within a sequence of images
+	 * @link https://php.net/manual/en/imagick.quantizeimages.php
+	 * @param int $numberColors
+	 * @param int $colorspace
+	 * @param int $treedepth
+	 * @param bool $dither
+	 * @param bool $measureError
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function quantizeImages ($numberColors, $colorspace, $treedepth, $dither, $measureError) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Smooths the contours of an image
+	 * @link https://php.net/manual/en/imagick.reducenoiseimage.php
+	 * @param float $radius
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function reduceNoiseImage ($radius) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Removes the named image profile and returns it
+	 * @link https://php.net/manual/en/imagick.removeimageprofile.php
+	 * @param string $name
+	 * @return string a string containing the profile of the image.
+	 */
+	public function removeImageProfile ($name) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Separates a channel from the image
+	 * @link https://php.net/manual/en/imagick.separateimagechannel.php
+	 * @param int $channel
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function separateImageChannel ($channel) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sepia tones an image
+	 * @link https://php.net/manual/en/imagick.sepiatoneimage.php
+	 * @param float $threshold
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function sepiaToneImage ($threshold) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image bias for any method that convolves an image
+	 * @link https://php.net/manual/en/imagick.setimagebias.php
+	 * @param float $bias
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageBias ($bias) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image chromaticity blue primary point
+	 * @link https://php.net/manual/en/imagick.setimageblueprimary.php
+	 * @param float $x
+	 * @param float $y
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageBluePrimary ($x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image border color
+	 * @link https://php.net/manual/en/imagick.setimagebordercolor.php
+	 * @param mixed $border <p>
+	 * The border color
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageBorderColor ($border) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the depth of a particular image channel
+	 * @link https://php.net/manual/en/imagick.setimagechanneldepth.php
+	 * @param int $channel
+	 * @param int $depth
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageChannelDepth ($channel, $depth) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the color of the specified colormap index
+	 * @link https://php.net/manual/en/imagick.setimagecolormapcolor.php
+	 * @param int $index
+	 * @param ImagickPixel $color
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageColormapColor ($index, ImagickPixel $color) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image colorspace
+	 * @link https://php.net/manual/en/imagick.setimagecolorspace.php
+	 * @param int $colorspace <p>
+	 * One of the COLORSPACE constants
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageColorspace ($colorspace) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image disposal method
+	 * @link https://php.net/manual/en/imagick.setimagedispose.php
+	 * @param int $dispose
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageDispose ($dispose) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image size
+	 * @link https://php.net/manual/en/imagick.setimageextent.php
+	 * @param int $columns
+	 * @param int $rows
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageExtent ($columns, $rows) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image chromaticity green primary point
+	 * @link https://php.net/manual/en/imagick.setimagegreenprimary.php
+	 * @param float $x
+	 * @param float $y
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageGreenPrimary ($x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image compression
+	 * @link https://php.net/manual/en/imagick.setimageinterlacescheme.php
+	 * @param int $interlace_scheme
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageInterlaceScheme ($interlace_scheme) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Adds a named profile to the Imagick object
+	 * @link https://php.net/manual/en/imagick.setimageprofile.php
+	 * @param string $name
+	 * @param string $profile
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageProfile ($name, $profile) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image chromaticity red primary point
+	 * @link https://php.net/manual/en/imagick.setimageredprimary.php
+	 * @param float $x
+	 * @param float $y
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageRedPrimary ($x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image rendering intent
+	 * @link https://php.net/manual/en/imagick.setimagerenderingintent.php
+	 * @param int $rendering_intent
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageRenderingIntent ($rendering_intent) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image virtual pixel method
+	 * @link https://php.net/manual/en/imagick.setimagevirtualpixelmethod.php
+	 * @param int $method
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageVirtualPixelMethod ($method) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image chromaticity white point
+	 * @link https://php.net/manual/en/imagick.setimagewhitepoint.php
+	 * @param float $x
+	 * @param float $y
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImageWhitePoint ($x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Adjusts the contrast of an image
+	 * @link https://php.net/manual/en/imagick.sigmoidalcontrastimage.php
+	 * @param bool $sharpen
+	 * @param float $alpha
+	 * @param float $beta
+	 * @param int $channel [optional]
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function sigmoidalContrastImage ($sharpen, $alpha, $beta, $channel = Imagick::CHANNEL_ALL) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Composites two images
+	 * @link https://php.net/manual/en/imagick.stereoimage.php
+	 * @param Imagick $offset_wand
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function stereoImage (Imagick $offset_wand) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Repeatedly tiles the texture image
+	 * @link https://php.net/manual/en/imagick.textureimage.php
+	 * @param Imagick $texture_wand
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function textureImage (Imagick $texture_wand) {}
+
+	/**
+	 * pplies a color vector to each pixel in the image. The 'opacity' color is a per channel strength factor for how strongly the color should be applied.
+	 * If legacy is true, the behaviour of this function is incorrect, but consistent with how it behaved before Imagick version 3.4.0
+	 * @link https://php.net/manual/en/imagick.tintimage.php
+	 * @param mixed $tint
+	 * @param mixed $opacity
+	 * @param bool $legacy [optional]
+	 * @return bool <b>TRUE</b> on success.
+	 * @throws ImagickException Throws ImagickException on error
+	 * @since 2.0.0
+	 */
+	public function tintImage ($tint, $opacity, $legacy = false) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sharpens an image
+	 * @link https://php.net/manual/en/imagick.unsharpmaskimage.php
+	 * @param float $radius
+	 * @param float $sigma
+	 * @param float $amount
+	 * @param float $threshold
+	 * @param int $channel [optional]
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function unsharpMaskImage ($radius, $sigma, $amount, $threshold, $channel = Imagick::CHANNEL_ALL) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns a new Imagick object
+	 * @link https://php.net/manual/en/imagick.getimage.php
+	 * @return Imagick a new Imagick object with the current image sequence.
+	 */
+	public function getImage () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Adds new image to Imagick object image list
+	 * @link https://php.net/manual/en/imagick.addimage.php
+	 * @param Imagick $source <p>
+	 * The source Imagick object
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function addImage (Imagick $source) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Replaces image in the object
+	 * @link https://php.net/manual/en/imagick.setimage.php
+	 * @param Imagick $replace <p>
+	 * The replace Imagick object
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setImage (Imagick $replace) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Creates a new image
+	 * @link https://php.net/manual/en/imagick.newimage.php
+	 * @param int $cols <p>
+	 * Columns in the new image
+	 * </p>
+	 * @param int $rows <p>
+	 * Rows in the new image
+	 * </p>
+	 * @param mixed $background <p>
+	 * The background color used for this image
+	 * </p>
+	 * @param string $format [optional] <p>
+	 * Image format. This parameter was added in Imagick version 2.0.1.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function newImage ($cols, $rows, $background, $format = null) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Creates a new image
+	 * @link https://php.net/manual/en/imagick.newpseudoimage.php
+	 * @param int $columns <p>
+	 * columns in the new image
+	 * </p>
+	 * @param int $rows <p>
+	 * rows in the new image
+	 * </p>
+	 * @param string $pseudoString <p>
+	 * string containing pseudo image definition.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function newPseudoImage ($columns, $rows, $pseudoString) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the object compression type
+	 * @link https://php.net/manual/en/imagick.getcompression.php
+	 * @return int the compression constant
+	 */
+	public function getCompression () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the object compression quality
+	 * @link https://php.net/manual/en/imagick.getcompressionquality.php
+	 * @return int integer describing the compression quality
+	 */
+	public function getCompressionQuality () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the ImageMagick API copyright as a string
+	 * @link https://php.net/manual/en/imagick.getcopyright.php
+	 * @return string a string containing the copyright notice of Imagemagick and
+	 * Magickwand C API.
+	 */
+	public static function getCopyright () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * The filename associated with an image sequence
+	 * @link https://php.net/manual/en/imagick.getfilename.php
+	 * @return string a string on success.
+	 */
+	public function getFilename () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the format of the Imagick object
+	 * @link https://php.net/manual/en/imagick.getformat.php
+	 * @return string the format of the image.
+	 */
+	public function getFormat () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the ImageMagick home URL
+	 * @link https://php.net/manual/en/imagick.gethomeurl.php
+	 * @return string a link to the imagemagick homepage.
+	 */
+	public static function getHomeURL () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the object interlace scheme
+	 * @link https://php.net/manual/en/imagick.getinterlacescheme.php
+	 * @return int Gets the wand interlace
+	 * scheme.
+	 */
+	public function getInterlaceScheme () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns a value associated with the specified key
+	 * @link https://php.net/manual/en/imagick.getoption.php
+	 * @param string $key <p>
+	 * The name of the option
+	 * </p>
+	 * @return string a value associated with a wand and the specified key.
+	 */
+	public function getOption ($key) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the ImageMagick package name
+	 * @link https://php.net/manual/en/imagick.getpackagename.php
+	 * @return string the ImageMagick package name as a string.
+	 */
+	public static function getPackageName () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the page geometry
+	 * @link https://php.net/manual/en/imagick.getpage.php
+	 * @return array the page geometry associated with the Imagick object in
+	 * an associative array with the keys "width", "height", "x", and "y",
+	 * throwing ImagickException on error.
+	 * @throws ImagickException on error
+	 */
+	public function getPage () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the quantum depth
+	 * @link https://php.net/manual/en/imagick.getquantumdepth.php
+	 * @return array the Imagick quantum depth as a string.
+	 */
+	public static function getQuantumDepth () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the Imagick quantum range
+	 * @link https://php.net/manual/en/imagick.getquantumrange.php
+	 * @return array the Imagick quantum range as a string.
+	 */
+	public static function getQuantumRange () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the ImageMagick release date
+	 * @link https://php.net/manual/en/imagick.getreleasedate.php
+	 * @return string the ImageMagick release date as a string.
+	 */
+	public static function getReleaseDate () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the specified resource's memory usage
+	 * @link https://php.net/manual/en/imagick.getresource.php
+	 * @param int $type <p>
+	 * Refer to the list of resourcetype constants.
+	 * </p>
+	 * @return int the specified resource's memory usage in megabytes.
+	 */
+	public static function getResource ($type) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the specified resource limit
+	 * @link https://php.net/manual/en/imagick.getresourcelimit.php
+	 * @param int $type <p>
+	 * Refer to the list of resourcetype constants.
+	 * </p>
+	 * @return int the specified resource limit in megabytes.
+	 */
+	public static function getResourceLimit ($type) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the horizontal and vertical sampling factor
+	 * @link https://php.net/manual/en/imagick.getsamplingfactors.php
+	 * @return array an associative array with the horizontal and vertical sampling
+	 * factors of the image.
+	 */
+	public function getSamplingFactors () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the size associated with the Imagick object
+	 * @link https://php.net/manual/en/imagick.getsize.php
+	 * @return array the size associated with the Imagick object as an array with the
+	 * keys "columns" and "rows".
+	 */
+	public function getSize () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the ImageMagick API version
+	 * @link https://php.net/manual/en/imagick.getversion.php
+	 * @return array the ImageMagick API version as a string and as a number.
+	 */
+	public static function getVersion () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the object's default background color
+	 * @link https://php.net/manual/en/imagick.setbackgroundcolor.php
+	 * @param mixed $background
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setBackgroundColor ($background) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the object's default compression type
+	 * @link https://php.net/manual/en/imagick.setcompression.php
+	 * @param int $compression
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setCompression ($compression) {}
+
+	/**
+	 * (PECL imagick 0.9.10-0.9.9)<br/>
+	 * Sets the object's default compression quality
+	 * @link https://php.net/manual/en/imagick.setcompressionquality.php
+	 * @param int $quality
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setCompressionQuality ($quality) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the filename before you read or write the image
+	 * @link https://php.net/manual/en/imagick.setfilename.php
+	 * @param string $filename
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setFilename ($filename) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the format of the Imagick object
+	 * @link https://php.net/manual/en/imagick.setformat.php
+	 * @param string $format
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setFormat ($format) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image compression
+	 * @link https://php.net/manual/en/imagick.setinterlacescheme.php
+	 * @param int $interlace_scheme
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setInterlaceScheme ($interlace_scheme) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Set an option
+	 * @link https://php.net/manual/en/imagick.setoption.php
+	 * @param string $key
+	 * @param string $value
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setOption ($key, $value) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the page geometry of the Imagick object
+	 * @link https://php.net/manual/en/imagick.setpage.php
+	 * @param int $width
+	 * @param int $height
+	 * @param int $x
+	 * @param int $y
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setPage ($width, $height, $x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the limit for a particular resource in megabytes
+	 * @link https://php.net/manual/en/imagick.setresourcelimit.php
+	 * @param int $type <p>
+	 * Refer to the list of resourcetype constants.
+	 * </p>
+	 * @param int $limit <p>
+	 * The resource limit. The unit depends on the type of the resource being limited.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public static function setResourceLimit ($type, $limit) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image resolution
+	 * @link https://php.net/manual/en/imagick.setresolution.php
+	 * @param float $x_resolution <p>
+	 * The horizontal resolution.
+	 * </p>
+	 * @param float $y_resolution <p>
+	 * The vertical resolution.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setResolution ($x_resolution, $y_resolution) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image sampling factors
+	 * @link https://php.net/manual/en/imagick.setsamplingfactors.php
+	 * @param array $factors
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setSamplingFactors (array $factors) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the size of the Imagick object
+	 * @link https://php.net/manual/en/imagick.setsize.php
+	 * @param int $columns
+	 * @param int $rows
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setSize ($columns, $rows) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the image type attribute
+	 * @link https://php.net/manual/en/imagick.settype.php
+	 * @param int $image_type
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setType ($image_type) {}
+
+	public function key () {}
+
+	public function next () {}
+
+	public function rewind () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Checks if the current item is valid
+	 * @link https://php.net/manual/en/imagick.valid.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function valid () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns a reference to the current Imagick object
+	 * @link https://php.net/manual/en/imagick.current.php
+	 * @return Imagick self on success.
+	 */
+	public function current () {}
+
+	/**
+	 * Change the brightness and/or contrast of an image. It converts the brightness and contrast parameters into slope and intercept and calls a polynomical function to apply to the image.
+	 * @link https://php.net/manual/en/imagick.brightnesscontrastimage.php
+	 * @param string $brightness
+	 * @param string $contrast
+	 * @param int $CHANNEL [optional]
+	 * @return void
+	 * @since 3.3.0
+	 */
+	public function brightnessContrastImage ($brightness, $contrast, $CHANNEL = Imagick::CHANNEL_DEFAULT) { }
+
+	/**
+	 * Applies a user supplied kernel to the image according to the given morphology method.
+	 * @link https://php.net/manual/en/imagick.morphology.php
+	 * @param int $morphologyMethod Which morphology method to use one of the \Imagick::MORPHOLOGY_* constants.
+	 * @param int $iterations The number of iteration to apply the morphology function. A value of -1 means loop until no change found. How this is applied may depend on the morphology method. Typically this is a value of 1.
+	 * @param ImagickKernel $ImagickKernel
+	 * @param int $CHANNEL [optional]
+	 * @return void
+	 * @since 3.3.0
+	 */
+	public function morphology ($morphologyMethod, $iterations, ImagickKernel $ImagickKernel, $CHANNEL = Imagick::CHANNEL_DEFAULT) { }
+
+	/**
+	 * Applies a custom convolution kernel to the image.
+	 * @link https://php.net/manual/en/imagick.filter.php
+	 * @param ImagickKernel $ImagickKernel An instance of ImagickKernel that represents either a single kernel or a linked series of kernels.
+	 * @param int $CHANNEL [optional] Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to Imagick::CHANNEL_DEFAULT. Refer to this list of channel constants
+	 * @return void
+	 * @since 3.3.0
+	 */
+	public function filter (ImagickKernel $ImagickKernel , $CHANNEL = Imagick::CHANNEL_DEFAULT) { }
+
+	/**
+	 * Apply color transformation to an image. The method permits saturation changes, hue rotation, luminance to alpha, and various other effects. Although variable-sized transformation matrices can be used, typically one uses a 5x5 matrix for an RGBA image and a 6x6 for CMYKA (or RGBA with offsets).
+	 * The matrix is similar to those used by Adobe Flash except offsets are in column 6 rather than 5 (in support of CMYKA images) and offsets are normalized (divide Flash offset by 255)
+	 * @link https://php.net/manual/en/imagick.colormatriximage.php
+	 * @param string $color_matrix
+	 * @return void
+	 * @since 3.3.0
+	 */
+	public function colorMatrixImage ($color_matrix = Imagick::CHANNEL_DEFAULT) { }
+
+	/**
+	 * Deletes an image property.
+	 * @link https://php.net/manual/en/imagick.deleteimageproperty.php
+	 * @param string $name The name of the property to delete.
+	 * @return void
+	 * @since 3.3.0
+	 */
+	public function deleteImageProperty ($name) { }
+
+	/**
+	 * Implements the discrete Fourier transform (DFT) of the image either as a magnitude / phase or real / imaginary image pair.
+	 * @link https://php.net/manual/en/imagick.forwardfouriertransformimage.php
+	 * @param bool $magnitude If true, return as magnitude / phase pair otherwise a real / imaginary image pair.
+	 * @return void
+	 * @since 3.3.0
+	 */
+	public function forwardFourierTransformimage ($magnitude) { }
+
+	/**
+	 * Gets the current image's compression type.
+	 * @link https://php.net/manual/en/imagick.getimagecompression.php
+	 * @return int
+	 * @since 3.3.0
+	 */
+	public function getImageCompression () { }
+
+	/**
+	 * Get the StringRegistry entry for the named key or false if not set.
+	 * @link https://php.net/manual/en/imagick.getregistry.php
+	 * @param string $key
+	 * @return string|false
+	 * @throws Exception Since version >=3.4.3. Throws an exception if the key does not exist, rather than terminating the program.
+	 * @since 3.3.0
+	 */
+	public static function getRegistry ($key) { }
+
+	/**
+	 * Returns the ImageMagick quantum range as an integer.
+	 * @link https://php.net/manual/en/imagick.getquantum.php
+	 * @return int
+	 * @since 3.3.0
+	 */
+	public static function getQuantum () { }
+
+	/**
+	 * Replaces any embedded formatting characters with the appropriate image property and returns the interpreted text. See https://www.imagemagick.org/script/escape.php for escape sequences.
+	 * @link https://php.net/manual/en/imagick.identifyformat.php
+	 * @see https://www.imagemagick.org/script/escape.php
+	 * @param string $embedText A string containing formatting sequences e.g. "Trim box: %@ number of unique colors: %k".
+	 * @return bool
+	 * @since 3.3.0
+	 */
+	public function identifyFormat ($embedText) { }
+
+	/**
+	 * Implements the inverse discrete Fourier transform (DFT) of the image either as a magnitude / phase or real / imaginary image pair.
+	 * @link https://php.net/manual/en/imagick.inversefouriertransformimage.php
+	 * @param Imagick $complement The second image to combine with this one to form either the magnitude / phase or real / imaginary image pair.
+	 * @param bool $magnitude If true, combine as magnitude / phase pair otherwise a real / imaginary image pair.
+	 * @return void
+	 * @since 3.3.0
+	 */
+	public function inverseFourierTransformImage ($complement, $magnitude) { }
+
+	/**
+	 * List all the registry settings. Returns an array of all the key/value pairs in the registry
+	 * @link https://php.net/manual/en/imagick.listregistry.php
+	 * @return array An array containing the key/values from the registry.
+	 * @since 3.3.0
+	 */
+	public static function listRegistry () { }
+
+	/**
+	 * Rotational blurs an image.
+	 * @link https://php.net/manual/en/imagick.rotationalblurimage.php
+	 * @param string $angle
+	 * @param string $CHANNEL
+	 * @return void
+	 * @since 3.3.0
+	 */
+	public function rotationalBlurImage ($angle, $CHANNEL = Imagick::CHANNEL_DEFAULT) { }
+
+	/**
+	 * Selectively blur an image within a contrast threshold. It is similar to the unsharpen mask that sharpens everything with contrast above a certain threshold.
+	 * @link https://php.net/manual/en/imagick.selectiveblurimage.php
+	 * @param float $radius
+	 * @param float $sigma
+	 * @param float $threshold
+	 * @param int $CHANNEL Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to Imagick::CHANNEL_DEFAULT. Refer to this list of channel constants
+	 * @return void
+	 * @since 3.3.0
+	 */
+	public function selectiveBlurImage ($radius, $sigma, $threshold, $CHANNEL = Imagick::CHANNEL_DEFAULT) { }
+
+	/**
+	 * Set whether antialiasing should be used for operations. On by default.
+	 * @param bool $antialias
+	 * @return int
+	 * @since 3.3.0
+	 */
+	public function setAntiAlias ($antialias) { }
+
+	/**
+	 * @link https://php.net/manual/en/imagick.setimagebiasquantum.php
+	 * @param string $bias
+	 * @return void
+	 * @since 3.3.0
+	 */
+	public function setImageBiasQuantum ($bias) { }
+
+	/**
+	 * Set a callback that will be called during the processing of the Imagick image.
+	 * @link https://php.net/manual/en/imagick.setprogressmonitor.php
+	 * @param callable $callback The progress function to call. It should return true if image processing should continue, or false if it should be cancelled.
+	 * The offset parameter indicates the progress and the span parameter indicates the total amount of work needed to be done.
+	 * <pre> bool callback ( mixed $offset , mixed $span ) </pre>
+	 * <b>Caution</b>
+	 * The values passed to the callback function are not consistent. In particular the span parameter can increase during image processing. Because of this calculating the percentage complete of an image operation is not trivial.
+	 * @return void
+	 * @since 3.3.0
+	 */
+	public function setProgressMonitor ($callback) { }
+
+	/**
+	 * Sets the ImageMagick registry entry named key to value. This is most useful for setting "temporary-path" which controls where ImageMagick creates temporary images e.g. while processing PDFs.
+	 * @link https://php.net/manual/en/imagick.setregistry.php
+	 * @param string $key
+	 * @param string $value
+	 * @return void
+	 * @since 3.3.0
+	 */
+	public static function setRegistry ($key, $value) { }
+
+	/**
+	 * Replace each pixel with corresponding statistic from the neighborhood of the specified width and height.
+	 * @link https://php.net/manual/en/imagick.statisticimage.php
+	 * @param int $type
+	 * @param int $width
+	 * @param int $height
+	 * @param int $channel [optional]
+	 * @return void
+	 * @since 3.3.0
+	 */
+	public function statisticImage ($type, $width, $height, $channel = Imagick::CHANNEL_DEFAULT ) { }
+
+	/**
+	 * Searches for a subimage in the current image and returns a similarity image such that an exact match location is
+	 * completely white and if none of the pixels match, black, otherwise some gray level in-between.
+	 * You can also pass in the optional parameters bestMatch and similarity. After calling the function similarity will
+	 * be set to the 'score' of the similarity between the subimage and the matching position in the larger image,
+	 * bestMatch will contain an associative array with elements x, y, width, height that describe the matching region.
+	 *
+	 * @link https://php.net/manual/en/imagick.subimagematch.php
+	 * @param Imagick $imagick
+	 * @param array &$bestMatch [optional]
+	 * @param float &$similarity [optional] A new image that displays the amount of similarity at each pixel.
+	 * @param float $similarity_threshold [optional] Only used if compiled with ImageMagick (library) > 7
+	 * @param int $metric [optional] Only used if compiled with ImageMagick (library) > 7
+	 * @return Imagick
+	 * @since 3.3.0
+	 */
+	public function subImageMatch (Imagick $imagick, array &$bestMatch, &$similarity, $similarity_threshold, $metric) { }
+
+	/**
+	 * Is an alias of Imagick::subImageMatch
+	 *
+	 * @param Imagick $imagick
+	 * @param array $bestMatch [optional]
+	 * @param float $similarity [optional] A new image that displays the amount of similarity at each pixel.
+	 * @param float $similarity_threshold [optional]
+	 * @param int $metric [optional]
+	 * @return Imagick
+	 * @see Imagick::subImageMatch() This function is an alias of subImageMatch()
+	 * @since 3.4.0
+	 */
+	public function similarityImage (Imagick $imagick, array &$bestMatch, &$similarity, $similarity_threshold, $metric) { }
+
+	/**
+	 * Returns any ImageMagick  configure options that match the specified pattern (e.g. "*" for all). Options include NAME, VERSION, LIB_VERSION, etc.
+	 * @return string
+	 * @since 3.4.0
+	 */
+	public function getConfigureOptions () { }
+
+	/**
+	 * GetFeatures() returns the ImageMagick features that have been compiled into the runtime.
+	 * @return string
+	 * @since 3.4.0
+	 */
+	public function getFeatures () { }
+
+	/**
+	 * @return int
+	 * @since 3.4.0
+	 */
+	public function getHDRIEnabled () { }
+
+	/**
+	 * Sets the image channel mask. Returns the previous set channel mask.
+	 * Only works with Imagick >=7
+	 * @param int $channel
+	 * @since 3.4.0
+	 */
+	public function setImageChannelMask ($channel) {}
+
+	/**
+	 * Merge multiple images of the same size together with the selected operator. https://www.imagemagick.org/Usage/layers/#evaluate-sequence
+	 * @param int $EVALUATE_CONSTANT
+	 * @return bool
+	 * @see https://www.imagemagick.org/Usage/layers/#evaluate-sequence
+	 * @since 3.4.0
+	 */
+	public function evaluateImages ($EVALUATE_CONSTANT) { }
+
+	/**
+	 * Extracts the 'mean' from the image and adjust the image to try make set its gamma appropriately.
+	 * @param int $channel [optional] Default value Imagick::CHANNEL_ALL
+	 * @return bool
+	 * @since 3.4.1
+	 */
+	public function autoGammaImage ($channel = Imagick::CHANNEL_ALL) { }
+
+	/**
+	 * Adjusts an image so that its orientation is suitable $ for viewing (i.e. top-left orientation).
+	 * @return bool
+	 * @since 3.4.1
+	 */
+	public function autoOrient () { }
+
+	/**
+	 * Composite one image onto another using the specified gravity.
+	 *
+	 * @param Imagick $imagick
+	 * @param int $COMPOSITE_CONSTANT
+	 * @param int $GRAVITY_CONSTANT
+	 * @return bool
+	 * @since 3.4.1
+	 */
+	public function compositeImageGravity(Imagick $imagick, $COMPOSITE_CONSTANT, $GRAVITY_CONSTANT) { }
+
+	/**
+	 * Attempts to increase the appearance of large-scale light-dark transitions.
+	 *
+	 * @param float $radius
+	 * @param float $strength
+	 * @return bool
+	 * @since 3.4.1
+	 */
+	public function localContrastImage($radius, $strength) { }
+
+	/**
+	 * Identifies the potential image type, returns one of the Imagick::IMGTYPE_* constants
+	 * @return int
+	 * @since 3.4.3
+	 */
+	public function identifyImageType() { }
+
+	/**
+	 * Sets the image to the specified alpha level. Will replace ImagickDraw::setOpacity()
+	 *
+	 * @param float $alpha
+	 * @return bool
+	 * @since 3.4.3
+	 */
+	public function setImageAlpha($alpha) { }
+}
+
+/**
+ * @method ImagickDraw clone() (PECL imagick 2.0.0)<br/>Makes an exact copy of the specified ImagickDraw object
+ * @link https://php.net/manual/en/class.imagickdraw.php
+ */
+class ImagickDraw  {
+
+	public function resetVectorGraphics () {}
+
+	public function getTextKerning () {}
+
+	/**
+	 * @param $kerning
+	 */
+	public function setTextKerning ($kerning) {}
+
+	public function getTextInterWordSpacing () {}
+
+	/**
+	 * @param $spacing
+	 */
+	public function setTextInterWordSpacing ($spacing) {}
+
+	public function getTextInterLineSpacing () {}
+
+	/**
+	 * @param $spacing
+	 */
+	public function setTextInterLineSpacing ($spacing) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * The ImagickDraw constructor
+	 * @link https://php.net/manual/en/imagickdraw.construct.php
+	 */
+	public function __construct () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the fill color to be used for drawing filled objects
+	 * @link https://php.net/manual/en/imagickdraw.setfillcolor.php
+	 * @param ImagickPixel $fill_pixel <p>
+	 * ImagickPixel to use to set the color
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setFillColor (ImagickPixel $fill_pixel) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the opacity to use when drawing using the fill color or fill texture
+	 * @link https://php.net/manual/en/imagickdraw.setfillalpha.php
+	 * @param float $opacity <p>
+	 * fill alpha
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setFillAlpha ($opacity) {}
+
+	/**
+	 * @param $x_resolution
+	 * @param $y_resolution
+	 */
+	public function setResolution ($x_resolution, $y_resolution) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the color used for stroking object outlines
+	 * @link https://php.net/manual/en/imagickdraw.setstrokecolor.php
+	 * @param ImagickPixel $stroke_pixel <p>
+	 * the stroke color
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setStrokeColor (ImagickPixel $stroke_pixel) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Specifies the opacity of stroked object outlines
+	 * @link https://php.net/manual/en/imagickdraw.setstrokealpha.php
+	 * @param float $opacity <p>
+	 * opacity
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setStrokeAlpha ($opacity) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the width of the stroke used to draw object outlines
+	 * @link https://php.net/manual/en/imagickdraw.setstrokewidth.php
+	 * @param float $stroke_width <p>
+	 * stroke width
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setStrokeWidth ($stroke_width) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Clears the ImagickDraw
+	 * @link https://php.net/manual/en/imagickdraw.clear.php
+	 * @return bool an ImagickDraw object.
+	 */
+	public function clear () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws a circle
+	 * @link https://php.net/manual/en/imagickdraw.circle.php
+	 * @param float $ox <p>
+	 * origin x coordinate
+	 * </p>
+	 * @param float $oy <p>
+	 * origin y coordinate
+	 * </p>
+	 * @param float $px <p>
+	 * perimeter x coordinate
+	 * </p>
+	 * @param float $py <p>
+	 * perimeter y coordinate
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function circle ($ox, $oy, $px, $py) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws text on the image
+	 * @link https://php.net/manual/en/imagickdraw.annotation.php
+	 * @param float $x <p>
+	 * The x coordinate where text is drawn
+	 * </p>
+	 * @param float $y <p>
+	 * The y coordinate where text is drawn
+	 * </p>
+	 * @param string $text <p>
+	 * The text to draw on the image
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function annotation ($x, $y, $text) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Controls whether text is antialiased
+	 * @link https://php.net/manual/en/imagickdraw.settextantialias.php
+	 * @param bool $antiAlias
+	 * @return bool No value is returned.
+	 */
+	public function setTextAntialias ($antiAlias) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Specifies specifies the text code set
+	 * @link https://php.net/manual/en/imagickdraw.settextencoding.php
+	 * @param string $encoding <p>
+	 * the encoding name
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setTextEncoding ($encoding) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the fully-specified font to use when annotating with text
+	 * @link https://php.net/manual/en/imagickdraw.setfont.php
+	 * @param string $font_name
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setFont ($font_name) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the font family to use when annotating with text
+	 * @link https://php.net/manual/en/imagickdraw.setfontfamily.php
+	 * @param string $font_family <p>
+	 * the font family
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setFontFamily ($font_family) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the font pointsize to use when annotating with text
+	 * @link https://php.net/manual/en/imagickdraw.setfontsize.php
+	 * @param float $pointsize <p>
+	 * the point size
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setFontSize ($pointsize) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the font style to use when annotating with text
+	 * @link https://php.net/manual/en/imagickdraw.setfontstyle.php
+	 * @param int $style <p>
+	 * STYLETYPE_ constant
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setFontStyle ($style) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the font weight
+	 * @link https://php.net/manual/en/imagickdraw.setfontweight.php
+	 * @param int $font_weight
+	 * @return bool
+	 */
+	public function setFontWeight ($font_weight) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the font
+	 * @link https://php.net/manual/en/imagickdraw.getfont.php
+	 * @return string|false a string on success and false if no font is set.
+	 */
+	public function getFont () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the font family
+	 * @link https://php.net/manual/en/imagickdraw.getfontfamily.php
+	 * @return string|false the font family currently selected or false if font family is not set.
+	 */
+	public function getFontFamily () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the font pointsize
+	 * @link https://php.net/manual/en/imagickdraw.getfontsize.php
+	 * @return float the font size associated with the current ImagickDraw object.
+	 */
+	public function getFontSize () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the font style
+	 * @link https://php.net/manual/en/imagickdraw.getfontstyle.php
+	 * @return int the font style constant (STYLE_) associated with the ImagickDraw object
+	 * or 0 if no style is set.
+	 */
+	public function getFontStyle () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the font weight
+	 * @link https://php.net/manual/en/imagickdraw.getfontweight.php
+	 * @return int an int on success and 0 if no weight is set.
+	 */
+	public function getFontWeight () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Frees all associated resources
+	 * @link https://php.net/manual/en/imagickdraw.destroy.php
+	 * @return bool No value is returned.
+	 */
+	public function destroy () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws a rectangle
+	 * @link https://php.net/manual/en/imagickdraw.rectangle.php
+	 * @param float $x1 <p>
+	 * x coordinate of the top left corner
+	 * </p>
+	 * @param float $y1 <p>
+	 * y coordinate of the top left corner
+	 * </p>
+	 * @param float $x2 <p>
+	 * x coordinate of the bottom right corner
+	 * </p>
+	 * @param float $y2 <p>
+	 * y coordinate of the bottom right corner
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function rectangle ($x1, $y1, $x2, $y2) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws a rounded rectangle
+	 * @link https://php.net/manual/en/imagickdraw.roundrectangle.php
+	 * @param float $x1 <p>
+	 * x coordinate of the top left corner
+	 * </p>
+	 * @param float $y1 <p>
+	 * y coordinate of the top left corner
+	 * </p>
+	 * @param float $x2 <p>
+	 * x coordinate of the bottom right
+	 * </p>
+	 * @param float $y2 <p>
+	 * y coordinate of the bottom right
+	 * </p>
+	 * @param float $rx <p>
+	 * x rounding
+	 * </p>
+	 * @param float $ry <p>
+	 * y rounding
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function roundRectangle ($x1, $y1, $x2, $y2, $rx, $ry) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws an ellipse on the image
+	 * @link https://php.net/manual/en/imagickdraw.ellipse.php
+	 * @param float $ox
+	 * @param float $oy
+	 * @param float $rx
+	 * @param float $ry
+	 * @param float $start
+	 * @param float $end
+	 * @return bool No value is returned.
+	 */
+	public function ellipse ($ox, $oy, $rx, $ry, $start, $end) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Skews the current coordinate system in the horizontal direction
+	 * @link https://php.net/manual/en/imagickdraw.skewx.php
+	 * @param float $degrees <p>
+	 * degrees to skew
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function skewX ($degrees) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Skews the current coordinate system in the vertical direction
+	 * @link https://php.net/manual/en/imagickdraw.skewy.php
+	 * @param float $degrees <p>
+	 * degrees to skew
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function skewY ($degrees) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Applies a translation to the current coordinate system
+	 * @link https://php.net/manual/en/imagickdraw.translate.php
+	 * @param float $x <p>
+	 * horizontal translation
+	 * </p>
+	 * @param float $y <p>
+	 * vertical translation
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function translate ($x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws a line
+	 * @link https://php.net/manual/en/imagickdraw.line.php
+	 * @param float $sx <p>
+	 * starting x coordinate
+	 * </p>
+	 * @param float $sy <p>
+	 * starting y coordinate
+	 * </p>
+	 * @param float $ex <p>
+	 * ending x coordinate
+	 * </p>
+	 * @param float $ey <p>
+	 * ending y coordinate
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function line ($sx, $sy, $ex, $ey) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws an arc
+	 * @link https://php.net/manual/en/imagickdraw.arc.php
+	 * @param float $sx <p>
+	 * Starting x ordinate of bounding rectangle
+	 * </p>
+	 * @param float $sy <p>
+	 * starting y ordinate of bounding rectangle
+	 * </p>
+	 * @param float $ex <p>
+	 * ending x ordinate of bounding rectangle
+	 * </p>
+	 * @param float $ey <p>
+	 * ending y ordinate of bounding rectangle
+	 * </p>
+	 * @param float $sd <p>
+	 * starting degrees of rotation
+	 * </p>
+	 * @param float $ed <p>
+	 * ending degrees of rotation
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function arc ($sx, $sy, $ex, $ey, $sd, $ed) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Paints on the image's opacity channel
+	 * @link https://php.net/manual/en/imagickdraw.matte.php
+	 * @param float $x <p>
+	 * x coordinate of the matte
+	 * </p>
+	 * @param float $y <p>
+	 * y coordinate of the matte
+	 * </p>
+	 * @param int $paintMethod <p>
+	 * PAINT_ constant
+	 * </p>
+	 * @return bool <b>TRUE</b> on success or <b>FALSE</b> on failure.
+	 */
+	public function matte ($x, $y, $paintMethod) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws a polygon
+	 * @link https://php.net/manual/en/imagickdraw.polygon.php
+	 * @param array $coordinates <p>
+	 * multidimensional array like array( array( 'x' => 3, 'y' => 4 ), array( 'x' => 2, 'y' => 6 ) );
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function polygon (array $coordinates) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws a point
+	 * @link https://php.net/manual/en/imagickdraw.point.php
+	 * @param float $x <p>
+	 * point's x coordinate
+	 * </p>
+	 * @param float $y <p>
+	 * point's y coordinate
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function point ($x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the text decoration
+	 * @link https://php.net/manual/en/imagickdraw.gettextdecoration.php
+	 * @return int one of the DECORATION_ constants
+	 * and 0 if no decoration is set.
+	 */
+	public function getTextDecoration () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the code set used for text annotations
+	 * @link https://php.net/manual/en/imagickdraw.gettextencoding.php
+	 * @return string a string specifying the code set
+	 * or false if text encoding is not set.
+	 */
+	public function getTextEncoding () {}
+
+	public function getFontStretch () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the font stretch to use when annotating with text
+	 * @link https://php.net/manual/en/imagickdraw.setfontstretch.php
+	 * @param int $fontStretch <p>
+	 * STRETCH_ constant
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setFontStretch ($fontStretch) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Controls whether stroked outlines are antialiased
+	 * @link https://php.net/manual/en/imagickdraw.setstrokeantialias.php
+	 * @param bool $stroke_antialias <p>
+	 * the antialias setting
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setStrokeAntialias ($stroke_antialias) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Specifies a text alignment
+	 * @link https://php.net/manual/en/imagickdraw.settextalignment.php
+	 * @param int $alignment <p>
+	 * ALIGN_ constant
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setTextAlignment ($alignment) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Specifies a decoration
+	 * @link https://php.net/manual/en/imagickdraw.settextdecoration.php
+	 * @param int $decoration <p>
+	 * DECORATION_ constant
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setTextDecoration ($decoration) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Specifies the color of a background rectangle
+	 * @link https://php.net/manual/en/imagickdraw.settextundercolor.php
+	 * @param ImagickPixel $under_color <p>
+	 * the under color
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setTextUnderColor (ImagickPixel $under_color) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the overall canvas size
+	 * @link https://php.net/manual/en/imagickdraw.setviewbox.php
+	 * @param int $x1 <p>
+	 * left x coordinate
+	 * </p>
+	 * @param int $y1 <p>
+	 * left y coordinate
+	 * </p>
+	 * @param int $x2 <p>
+	 * right x coordinate
+	 * </p>
+	 * @param int $y2 <p>
+	 * right y coordinate
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setViewbox ($x1, $y1, $x2, $y2) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Adjusts the current affine transformation matrix
+	 * @link https://php.net/manual/en/imagickdraw.affine.php
+	 * @param array $affine <p>
+	 * Affine matrix parameters
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function affine (array $affine) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws a bezier curve
+	 * @link https://php.net/manual/en/imagickdraw.bezier.php
+	 * @param array $coordinates <p>
+	 * Multidimensional array like array( array( 'x' => 1, 'y' => 2 ),
+	 * array( 'x' => 3, 'y' => 4 ) )
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function bezier (array $coordinates) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Composites an image onto the current image
+	 * @link https://php.net/manual/en/imagickdraw.composite.php
+	 * @param int $compose <p>
+	 * composition operator. One of COMPOSITE_ constants
+	 * </p>
+	 * @param float $x <p>
+	 * x coordinate of the top left corner
+	 * </p>
+	 * @param float $y <p>
+	 * y coordinate of the top left corner
+	 * </p>
+	 * @param float $width <p>
+	 * width of the composition image
+	 * </p>
+	 * @param float $height <p>
+	 * height of the composition image
+	 * </p>
+	 * @param Imagick $compositeWand <p>
+	 * the Imagick object where composition image is taken from
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function composite ($compose, $x, $y, $width, $height, Imagick $compositeWand) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws color on image
+	 * @link https://php.net/manual/en/imagickdraw.color.php
+	 * @param float $x <p>
+	 * x coordinate of the paint
+	 * </p>
+	 * @param float $y <p>
+	 * y coordinate of the paint
+	 * </p>
+	 * @param int $paintMethod <p>
+	 * one of the PAINT_ constants
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function color ($x, $y, $paintMethod) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Adds a comment
+	 * @link https://php.net/manual/en/imagickdraw.comment.php
+	 * @param string $comment <p>
+	 * The comment string to add to vector output stream
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function comment ($comment) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Obtains the current clipping path ID
+	 * @link https://php.net/manual/en/imagickdraw.getclippath.php
+	 * @return string|false a string containing the clip path ID or false if no clip path exists.
+	 */
+	public function getClipPath () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the current polygon fill rule
+	 * @link https://php.net/manual/en/imagickdraw.getcliprule.php
+	 * @return int one of the FILLRULE_ constants.
+	 */
+	public function getClipRule () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the interpretation of clip path units
+	 * @link https://php.net/manual/en/imagickdraw.getclipunits.php
+	 * @return int an int on success.
+	 */
+	public function getClipUnits () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the fill color
+	 * @link https://php.net/manual/en/imagickdraw.getfillcolor.php
+	 * @return ImagickPixel an ImagickPixel object.
+	 */
+	public function getFillColor () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the opacity used when drawing
+	 * @link https://php.net/manual/en/imagickdraw.getfillopacity.php
+	 * @return float The opacity.
+	 */
+	public function getFillOpacity () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the fill rule
+	 * @link https://php.net/manual/en/imagickdraw.getfillrule.php
+	 * @return int a FILLRULE_ constant
+	 */
+	public function getFillRule () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the text placement gravity
+	 * @link https://php.net/manual/en/imagickdraw.getgravity.php
+	 * @return int a GRAVITY_ constant on success and 0 if no gravity is set.
+	 */
+	public function getGravity () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the current stroke antialias setting
+	 * @link https://php.net/manual/en/imagickdraw.getstrokeantialias.php
+	 * @return bool <b>TRUE</b> if antialiasing is on and false if it is off.
+	 */
+	public function getStrokeAntialias () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the color used for stroking object outlines
+	 * @link https://php.net/manual/en/imagickdraw.getstrokecolor.php
+	 * @return ImagickPixel an ImagickPixel object which describes the color.
+	 */
+	public function getStrokeColor () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns an array representing the pattern of dashes and gaps used to stroke paths
+	 * @link https://php.net/manual/en/imagickdraw.getstrokedasharray.php
+	 * @return array an array on success and empty array if not set.
+	 */
+	public function getStrokeDashArray () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the offset into the dash pattern to start the dash
+	 * @link https://php.net/manual/en/imagickdraw.getstrokedashoffset.php
+	 * @return float a float representing the offset and 0 if it's not set.
+	 */
+	public function getStrokeDashOffset () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the shape to be used at the end of open subpaths when they are stroked
+	 * @link https://php.net/manual/en/imagickdraw.getstrokelinecap.php
+	 * @return int one of the LINECAP_ constants or 0 if stroke linecap is not set.
+	 */
+	public function getStrokeLineCap () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the shape to be used at the corners of paths when they are stroked
+	 * @link https://php.net/manual/en/imagickdraw.getstrokelinejoin.php
+	 * @return int one of the LINEJOIN_ constants or 0 if stroke line join is not set.
+	 */
+	public function getStrokeLineJoin () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the stroke miter limit
+	 * @link https://php.net/manual/en/imagickdraw.getstrokemiterlimit.php
+	 * @return int an int describing the miter limit
+	 * and 0 if no miter limit is set.
+	 */
+	public function getStrokeMiterLimit () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the opacity of stroked object outlines
+	 * @link https://php.net/manual/en/imagickdraw.getstrokeopacity.php
+	 * @return float a float describing the opacity.
+	 */
+	public function getStrokeOpacity () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the width of the stroke used to draw object outlines
+	 * @link https://php.net/manual/en/imagickdraw.getstrokewidth.php
+	 * @return float a float describing the stroke width.
+	 */
+	public function getStrokeWidth () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the text alignment
+	 * @link https://php.net/manual/en/imagickdraw.gettextalignment.php
+	 * @return int one of the ALIGN_ constants and 0 if no align is set.
+	 */
+	public function getTextAlignment () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the current text antialias setting
+	 * @link https://php.net/manual/en/imagickdraw.gettextantialias.php
+	 * @return bool <b>TRUE</b> if text is antialiased and false if not.
+	 */
+	public function getTextAntialias () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns a string containing vector graphics
+	 * @link https://php.net/manual/en/imagickdraw.getvectorgraphics.php
+	 * @return string a string containing the vector graphics.
+	 */
+	public function getVectorGraphics () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the text under color
+	 * @link https://php.net/manual/en/imagickdraw.gettextundercolor.php
+	 * @return ImagickPixel an ImagickPixel object describing the color.
+	 */
+	public function getTextUnderColor () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Adds a path element to the current path
+	 * @link https://php.net/manual/en/imagickdraw.pathclose.php
+	 * @return bool No value is returned.
+	 */
+	public function pathClose () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws a cubic Bezier curve
+	 * @link https://php.net/manual/en/imagickdraw.pathcurvetoabsolute.php
+	 * @param float $x1 <p>
+	 * x coordinate of the first control point
+	 * </p>
+	 * @param float $y1 <p>
+	 * y coordinate of the first control point
+	 * </p>
+	 * @param float $x2 <p>
+	 * x coordinate of the second control point
+	 * </p>
+	 * @param float $y2 <p>
+	 * y coordinate of the first control point
+	 * </p>
+	 * @param float $x <p>
+	 * x coordinate of the curve end
+	 * </p>
+	 * @param float $y <p>
+	 * y coordinate of the curve end
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function pathCurveToAbsolute ($x1, $y1, $x2, $y2, $x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws a cubic Bezier curve
+	 * @link https://php.net/manual/en/imagickdraw.pathcurvetorelative.php
+	 * @param float $x1 <p>
+	 * x coordinate of starting control point
+	 * </p>
+	 * @param float $y1 <p>
+	 * y coordinate of starting control point
+	 * </p>
+	 * @param float $x2 <p>
+	 * x coordinate of ending control point
+	 * </p>
+	 * @param float $y2 <p>
+	 * y coordinate of ending control point
+	 * </p>
+	 * @param float $x <p>
+	 * ending x coordinate
+	 * </p>
+	 * @param float $y <p>
+	 * ending y coordinate
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function pathCurveToRelative ($x1, $y1, $x2, $y2, $x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws a quadratic Bezier curve
+	 * @link https://php.net/manual/en/imagickdraw.pathcurvetoquadraticbezierabsolute.php
+	 * @param float $x1 <p>
+	 * x coordinate of the control point
+	 * </p>
+	 * @param float $y1 <p>
+	 * y coordinate of the control point
+	 * </p>
+	 * @param float $x <p>
+	 * x coordinate of the end point
+	 * </p>
+	 * @param float $y <p>
+	 * y coordinate of the end point
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function pathCurveToQuadraticBezierAbsolute ($x1, $y1, $x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws a quadratic Bezier curve
+	 * @link https://php.net/manual/en/imagickdraw.pathcurvetoquadraticbezierrelative.php
+	 * @param float $x1 <p>
+	 * starting x coordinate
+	 * </p>
+	 * @param float $y1 <p>
+	 * starting y coordinate
+	 * </p>
+	 * @param float $x <p>
+	 * ending x coordinate
+	 * </p>
+	 * @param float $y <p>
+	 * ending y coordinate
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function pathCurveToQuadraticBezierRelative ($x1, $y1, $x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws a quadratic Bezier curve
+	 * @link https://php.net/manual/en/imagickdraw.pathcurvetoquadraticbeziersmoothabsolute.php
+	 * @param float $x <p>
+	 * ending x coordinate
+	 * </p>
+	 * @param float $y <p>
+	 * ending y coordinate
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function pathCurveToQuadraticBezierSmoothAbsolute ($x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws a quadratic Bezier curve
+	 * @link https://php.net/manual/en/imagickdraw.pathcurvetoquadraticbeziersmoothrelative.php
+	 * @param float $x <p>
+	 * ending x coordinate
+	 * </p>
+	 * @param float $y <p>
+	 * ending y coordinate
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function pathCurveToQuadraticBezierSmoothRelative ($x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws a cubic Bezier curve
+	 * @link https://php.net/manual/en/imagickdraw.pathcurvetosmoothabsolute.php
+	 * @param float $x2 <p>
+	 * x coordinate of the second control point
+	 * </p>
+	 * @param float $y2 <p>
+	 * y coordinate of the second control point
+	 * </p>
+	 * @param float $x <p>
+	 * x coordinate of the ending point
+	 * </p>
+	 * @param float $y <p>
+	 * y coordinate of the ending point
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function pathCurveToSmoothAbsolute ($x2, $y2, $x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws a cubic Bezier curve
+	 * @link https://php.net/manual/en/imagickdraw.pathcurvetosmoothrelative.php
+	 * @param float $x2 <p>
+	 * x coordinate of the second control point
+	 * </p>
+	 * @param float $y2 <p>
+	 * y coordinate of the second control point
+	 * </p>
+	 * @param float $x <p>
+	 * x coordinate of the ending point
+	 * </p>
+	 * @param float $y <p>
+	 * y coordinate of the ending point
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function pathCurveToSmoothRelative ($x2, $y2, $x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws an elliptical arc
+	 * @link https://php.net/manual/en/imagickdraw.pathellipticarcabsolute.php
+	 * @param float $rx <p>
+	 * x radius
+	 * </p>
+	 * @param float $ry <p>
+	 * y radius
+	 * </p>
+	 * @param float $x_axis_rotation <p>
+	 * x axis rotation
+	 * </p>
+	 * @param bool $large_arc_flag <p>
+	 * large arc flag
+	 * </p>
+	 * @param bool $sweep_flag <p>
+	 * sweep flag
+	 * </p>
+	 * @param float $x <p>
+	 * x coordinate
+	 * </p>
+	 * @param float $y <p>
+	 * y coordinate
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function pathEllipticArcAbsolute ($rx, $ry, $x_axis_rotation, $large_arc_flag, $sweep_flag, $x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws an elliptical arc
+	 * @link https://php.net/manual/en/imagickdraw.pathellipticarcrelative.php
+	 * @param float $rx <p>
+	 * x radius
+	 * </p>
+	 * @param float $ry <p>
+	 * y radius
+	 * </p>
+	 * @param float $x_axis_rotation <p>
+	 * x axis rotation
+	 * </p>
+	 * @param bool $large_arc_flag <p>
+	 * large arc flag
+	 * </p>
+	 * @param bool $sweep_flag <p>
+	 * sweep flag
+	 * </p>
+	 * @param float $x <p>
+	 * x coordinate
+	 * </p>
+	 * @param float $y <p>
+	 * y coordinate
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function pathEllipticArcRelative ($rx, $ry, $x_axis_rotation, $large_arc_flag, $sweep_flag, $x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Terminates the current path
+	 * @link https://php.net/manual/en/imagickdraw.pathfinish.php
+	 * @return bool No value is returned.
+	 */
+	public function pathFinish () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws a line path
+	 * @link https://php.net/manual/en/imagickdraw.pathlinetoabsolute.php
+	 * @param float $x <p>
+	 * starting x coordinate
+	 * </p>
+	 * @param float $y <p>
+	 * ending x coordinate
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function pathLineToAbsolute ($x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws a line path
+	 * @link https://php.net/manual/en/imagickdraw.pathlinetorelative.php
+	 * @param float $x <p>
+	 * starting x coordinate
+	 * </p>
+	 * @param float $y <p>
+	 * starting y coordinate
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function pathLineToRelative ($x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws a horizontal line path
+	 * @link https://php.net/manual/en/imagickdraw.pathlinetohorizontalabsolute.php
+	 * @param float $x <p>
+	 * x coordinate
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function pathLineToHorizontalAbsolute ($x) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws a horizontal line
+	 * @link https://php.net/manual/en/imagickdraw.pathlinetohorizontalrelative.php
+	 * @param float $x <p>
+	 * x coordinate
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function pathLineToHorizontalRelative ($x) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws a vertical line
+	 * @link https://php.net/manual/en/imagickdraw.pathlinetoverticalabsolute.php
+	 * @param float $y <p>
+	 * y coordinate
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function pathLineToVerticalAbsolute ($y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws a vertical line path
+	 * @link https://php.net/manual/en/imagickdraw.pathlinetoverticalrelative.php
+	 * @param float $y <p>
+	 * y coordinate
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function pathLineToVerticalRelative ($y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Starts a new sub-path
+	 * @link https://php.net/manual/en/imagickdraw.pathmovetoabsolute.php
+	 * @param float $x <p>
+	 * x coordinate of the starting point
+	 * </p>
+	 * @param float $y <p>
+	 * y coordinate of the starting point
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function pathMoveToAbsolute ($x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Starts a new sub-path
+	 * @link https://php.net/manual/en/imagickdraw.pathmovetorelative.php
+	 * @param float $x <p>
+	 * target x coordinate
+	 * </p>
+	 * @param float $y <p>
+	 * target y coordinate
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function pathMoveToRelative ($x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Declares the start of a path drawing list
+	 * @link https://php.net/manual/en/imagickdraw.pathstart.php
+	 * @return bool No value is returned.
+	 */
+	public function pathStart () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Draws a polyline
+	 * @link https://php.net/manual/en/imagickdraw.polyline.php
+	 * @param array $coordinates <p>
+	 * array of x and y coordinates: array( array( 'x' => 4, 'y' => 6 ), array( 'x' => 8, 'y' => 10 ) )
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function polyline (array $coordinates) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Terminates a clip path definition
+	 * @link https://php.net/manual/en/imagickdraw.popclippath.php
+	 * @return bool No value is returned.
+	 */
+	public function popClipPath () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Terminates a definition list
+	 * @link https://php.net/manual/en/imagickdraw.popdefs.php
+	 * @return bool No value is returned.
+	 */
+	public function popDefs () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Terminates a pattern definition
+	 * @link https://php.net/manual/en/imagickdraw.poppattern.php
+	 * @return bool <b>TRUE</b> on success or <b>FALSE</b> on failure.
+	 */
+	public function popPattern () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Starts a clip path definition
+	 * @link https://php.net/manual/en/imagickdraw.pushclippath.php
+	 * @param string $clip_mask_id <p>
+	 * Clip mask Id
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function pushClipPath ($clip_mask_id) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Indicates that following commands create named elements for early processing
+	 * @link https://php.net/manual/en/imagickdraw.pushdefs.php
+	 * @return bool No value is returned.
+	 */
+	public function pushDefs () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Indicates that subsequent commands up to a ImagickDraw::opPattern() command comprise the definition of a named pattern
+	 * @link https://php.net/manual/en/imagickdraw.pushpattern.php
+	 * @param string $pattern_id <p>
+	 * the pattern Id
+	 * </p>
+	 * @param float $x <p>
+	 * x coordinate of the top-left corner
+	 * </p>
+	 * @param float $y <p>
+	 * y coordinate of the top-left corner
+	 * </p>
+	 * @param float $width <p>
+	 * width of the pattern
+	 * </p>
+	 * @param float $height <p>
+	 * height of the pattern
+	 * </p>
+	 * @return bool <b>TRUE</b> on success or <b>FALSE</b> on failure.
+	 */
+	public function pushPattern ($pattern_id, $x, $y, $width, $height) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Renders all preceding drawing commands onto the image
+	 * @link https://php.net/manual/en/imagickdraw.render.php
+	 * @return bool <b>TRUE</b> on success or <b>FALSE</b> on failure.
+	 */
+	public function render () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Applies the specified rotation to the current coordinate space
+	 * @link https://php.net/manual/en/imagickdraw.rotate.php
+	 * @param float $degrees <p>
+	 * degrees to rotate
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function rotate ($degrees) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Adjusts the scaling factor
+	 * @link https://php.net/manual/en/imagickdraw.scale.php
+	 * @param float $x <p>
+	 * horizontal factor
+	 * </p>
+	 * @param float $y <p>
+	 * vertical factor
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function scale ($x, $y) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Associates a named clipping path with the image
+	 * @link https://php.net/manual/en/imagickdraw.setclippath.php
+	 * @param string $clip_mask <p>
+	 * the clipping path name
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setClipPath ($clip_mask) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Set the polygon fill rule to be used by the clipping path
+	 * @link https://php.net/manual/en/imagickdraw.setcliprule.php
+	 * @param int $fill_rule <p>
+	 * FILLRULE_ constant
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setClipRule ($fill_rule) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the interpretation of clip path units
+	 * @link https://php.net/manual/en/imagickdraw.setclipunits.php
+	 * @param int $clip_units <p>
+	 * the number of clip units
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setClipUnits ($clip_units) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the opacity to use when drawing using the fill color or fill texture
+	 * @link https://php.net/manual/en/imagickdraw.setfillopacity.php
+	 * @param float $fillOpacity <p>
+	 * the fill opacity
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setFillOpacity ($fillOpacity) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the URL to use as a fill pattern for filling objects
+	 * @link https://php.net/manual/en/imagickdraw.setfillpatternurl.php
+	 * @param string $fill_url <p>
+	 * URL to use to obtain fill pattern.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success or <b>FALSE</b> on failure.
+	 */
+	public function setFillPatternURL ($fill_url) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the fill rule to use while drawing polygons
+	 * @link https://php.net/manual/en/imagickdraw.setfillrule.php
+	 * @param int $fill_rule <p>
+	 * FILLRULE_ constant
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setFillRule ($fill_rule) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the text placement gravity
+	 * @link https://php.net/manual/en/imagickdraw.setgravity.php
+	 * @param int $gravity <p>
+	 * GRAVITY_ constant
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setGravity ($gravity) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the pattern used for stroking object outlines
+	 * @link https://php.net/manual/en/imagickdraw.setstrokepatternurl.php
+	 * @param string $stroke_url <p>
+	 * stroke URL
+	 * </p>
+	 * @return bool imagick.imagickdraw.return.success;
+	 */
+	public function setStrokePatternURL ($stroke_url) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Specifies the offset into the dash pattern to start the dash
+	 * @link https://php.net/manual/en/imagickdraw.setstrokedashoffset.php
+	 * @param float $dash_offset <p>
+	 * dash offset
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setStrokeDashOffset ($dash_offset) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Specifies the shape to be used at the end of open subpaths when they are stroked
+	 * @link https://php.net/manual/en/imagickdraw.setstrokelinecap.php
+	 * @param int $linecap <p>
+	 * LINECAP_ constant
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setStrokeLineCap ($linecap) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Specifies the shape to be used at the corners of paths when they are stroked
+	 * @link https://php.net/manual/en/imagickdraw.setstrokelinejoin.php
+	 * @param int $linejoin <p>
+	 * LINEJOIN_ constant
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setStrokeLineJoin ($linejoin) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Specifies the miter limit
+	 * @link https://php.net/manual/en/imagickdraw.setstrokemiterlimit.php
+	 * @param int $miterlimit <p>
+	 * the miter limit
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setStrokeMiterLimit ($miterlimit) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Specifies the opacity of stroked object outlines
+	 * @link https://php.net/manual/en/imagickdraw.setstrokeopacity.php
+	 * @param float $stroke_opacity <p>
+	 * stroke opacity. 1.0 is fully opaque
+	 * </p>
+	 * @return bool No value is returned.
+	 */
+	public function setStrokeOpacity ($stroke_opacity) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the vector graphics
+	 * @link https://php.net/manual/en/imagickdraw.setvectorgraphics.php
+	 * @param string $xml <p>
+	 * xml containing the vector graphics
+	 * </p>
+	 * @return bool <b>TRUE</b> on success or <b>FALSE</b> on failure.
+	 */
+	public function setVectorGraphics ($xml) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Destroys the current ImagickDraw in the stack, and returns to the previously pushed ImagickDraw
+	 * @link https://php.net/manual/en/imagickdraw.pop.php
+	 * @return bool <b>TRUE</b> on success and false on failure.
+	 */
+	public function pop () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Clones the current ImagickDraw and pushes it to the stack
+	 * @link https://php.net/manual/en/imagickdraw.push.php
+	 * @return bool <b>TRUE</b> on success or <b>FALSE</b> on failure.
+	 */
+	public function push () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Specifies the pattern of dashes and gaps used to stroke paths
+	 * @link https://php.net/manual/en/imagickdraw.setstrokedasharray.php
+	 * @param array $dashArray <p>
+	 * array of floats
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setStrokeDashArray (array $dashArray) {}
+
+    /**
+     * Sets the opacity to use when drawing using the fill or stroke color or texture. Fully opaque is 1.0.
+     *
+     * @param float $opacity
+     * @return void
+     * @since 3.4.1
+     */
+	public function setOpacity($opacity) { }
+
+	/**
+	 * Returns the opacity used when drawing with the fill or stroke color or texture. Fully opaque is 1.0.
+	 *
+	 * @return float
+	 * @since 3.4.1
+	 */
+	public function getOpacity() { }
+
+	/**
+	 * Sets the image font resolution.
+	 *
+	 * @param float $x
+	 * @param float $y
+	 * @return bool
+	 * @since 3.4.1
+	 */
+	public function setFontResolution($x, $y) { }
+
+	/**
+	 * Gets the image X and Y resolution.
+	 *
+	 * @return array
+	 * @since 3.4.1
+	 */
+	public function getFontResolution() { }
+
+	/**
+	 * Returns the direction that will be used when annotating with text.
+	 * @return bool
+	 * @since 3.4.1
+	 */
+	public function getTextDirection() { }
+
+	/**
+	 * Sets the font style to use when annotating with text. The AnyStyle enumeration acts as a wild-card "don't care" option.
+	 *
+	 * @param int $direction
+	 * @return bool
+	 * @since 3.4.1
+	 */
+	public function setTextDirection($direction) { }
+
+	/**
+	 * Returns the border color used for drawing bordered objects.
+	 *
+	 * @return ImagickPixel
+	 * @since 3.4.1
+	 */
+	public function getBorderColor() { }
+
+	/**
+	 * Sets the border color to be used for drawing bordered objects.
+	 * @param ImagickPixel $color
+	 * @return bool
+	 * @since 3.4.1
+	 */
+	public function setBorderColor(ImagickPixel $color) { }
+
+	/**
+	 * Obtains the vertical and horizontal resolution.
+	 *
+	 * @return string|null
+	 * @since 3.4.1
+	 */
+	public function getDensity() { }
+
+	/**
+	 * Sets the vertical and horizontal resolution.
+	 * @param string $density_string
+	 * @return bool
+	 * @since 3.4.1
+	 */
+	public function setDensity($density_string) { }
+}
+
+/**
+ * @link https://php.net/manual/en/class.imagickpixeliterator.php
+ */
+class ImagickPixelIterator implements Iterator {
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * The ImagickPixelIterator constructor
+	 * @link https://php.net/manual/en/imagickpixeliterator.construct.php
+	 * @param Imagick $wand
+	 */
+	public function __construct (Imagick $wand) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns a new pixel iterator
+	 * @link https://php.net/manual/en/imagickpixeliterator.newpixeliterator.php
+	 * @param Imagick $wand
+	 * @return bool <b>TRUE</b> on success. Throwing ImagickPixelIteratorException.
+	 * @throws ImagickPixelIteratorException
+	 */
+	public function newPixelIterator (Imagick $wand) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns a new pixel iterator
+	 * @link https://php.net/manual/en/imagickpixeliterator.newpixelregioniterator.php
+	 * @param Imagick $wand
+	 * @param int $x
+	 * @param int $y
+	 * @param int $columns
+	 * @param int $rows
+	 * @return bool a new ImagickPixelIterator on success; on failure, throws ImagickPixelIteratorException
+	 * @throws ImagickPixelIteratorException
+	 */
+	public function newPixelRegionIterator (Imagick $wand, $x, $y, $columns, $rows) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the current pixel iterator row
+	 * @link https://php.net/manual/en/imagickpixeliterator.getiteratorrow.php
+	 * @return int the integer offset of the row, throwing ImagickPixelIteratorException on error.
+	 * @throws ImagickPixelIteratorException on error
+	 */
+	public function getIteratorRow () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Set the pixel iterator row
+	 * @link https://php.net/manual/en/imagickpixeliterator.setiteratorrow.php
+	 * @param int $row
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setIteratorRow ($row) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the pixel iterator to the first pixel row
+	 * @link https://php.net/manual/en/imagickpixeliterator.setiteratorfirstrow.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setIteratorFirstRow () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the pixel iterator to the last pixel row
+	 * @link https://php.net/manual/en/imagickpixeliterator.setiteratorlastrow.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setIteratorLastRow () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the previous row
+	 * @link https://php.net/manual/en/imagickpixeliterator.getpreviousiteratorrow.php
+	 * @return array the previous row as an array of ImagickPixelWand objects from the
+	 * ImagickPixelIterator, throwing ImagickPixelIteratorException on error.
+	 * @throws ImagickPixelIteratorException on error
+	 */
+	public function getPreviousIteratorRow () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the current row of ImagickPixel objects
+	 * @link https://php.net/manual/en/imagickpixeliterator.getcurrentiteratorrow.php
+	 * @return array a row as an array of ImagickPixel objects that can themselves be iterated.
+	 */
+	public function getCurrentIteratorRow () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the next row of the pixel iterator
+	 * @link https://php.net/manual/en/imagickpixeliterator.getnextiteratorrow.php
+	 * @return array the next row as an array of ImagickPixel objects, throwing
+	 * ImagickPixelIteratorException on error.
+	 * @throws ImagickPixelIteratorException on error
+	 */
+	public function getNextIteratorRow () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Resets the pixel iterator
+	 * @link https://php.net/manual/en/imagickpixeliterator.resetiterator.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function resetIterator () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Syncs the pixel iterator
+	 * @link https://php.net/manual/en/imagickpixeliterator.synciterator.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function syncIterator () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Deallocates resources associated with a PixelIterator
+	 * @link https://php.net/manual/en/imagickpixeliterator.destroy.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function destroy () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Clear resources associated with a PixelIterator
+	 * @link https://php.net/manual/en/imagickpixeliterator.clear.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function clear () {}
+
+	/**
+	 * @param Imagick $Imagick
+	 */
+	public static function getpixeliterator (Imagick $Imagick) {}
+
+	/**
+	 * @param Imagick $Imagick
+	 * @param $x
+	 * @param $y
+	 * @param $columns
+	 * @param $rows
+	 */
+	public static function getpixelregioniterator (Imagick $Imagick, $x, $y, $columns, $rows) {}
+
+	public function key () {}
+
+	public function next () {}
+
+	public function rewind () {}
+
+	public function current () {}
+
+	public function valid () {}
+
+}
+
+/**
+ * @method clone()
+ * @link https://php.net/manual/en/class.imagickpixel.php
+ */
+class ImagickPixel  {
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the normalized HSL color of the ImagickPixel object
+	 * @link https://php.net/manual/en/imagickpixel.gethsl.php
+	 * @return array the HSL value in an array with the keys "hue",
+	 * "saturation", and "luminosity". Throws ImagickPixelException on failure.
+	 * @throws ImagickPixelException on failure
+	 */
+	public function getHSL () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the normalized HSL color
+	 * @link https://php.net/manual/en/imagickpixel.sethsl.php
+	 * @param float $hue <p>
+	 * The normalized value for hue, described as a fractional arc
+	 * (between 0 and 1) of the hue circle, where the zero value is
+	 * red.
+	 * </p>
+	 * @param float $saturation <p>
+	 * The normalized value for saturation, with 1 as full saturation.
+	 * </p>
+	 * @param float $luminosity <p>
+	 * The normalized value for luminosity, on a scale from black at
+	 * 0 to white at 1, with the full HS value at 0.5 luminosity.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setHSL ($hue, $saturation, $luminosity) {}
+
+	public function getColorValueQuantum () {}
+
+	/**
+	 * @param $color_value
+	 */
+	public function setColorValueQuantum ($color_value) {}
+
+	public function getIndex () {}
+
+	/**
+	 * @param $index
+	 */
+	public function setIndex ($index) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * The ImagickPixel constructor
+	 * @link https://php.net/manual/en/imagickpixel.construct.php
+	 * @param string $color [optional] <p>
+	 * The optional color string to use as the initial value of this object.
+	 * </p>
+	 */
+	public function __construct ($color = null) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the color
+	 * @link https://php.net/manual/en/imagickpixel.setcolor.php
+	 * @param string $color <p>
+	 * The color definition to use in order to initialise the
+	 * ImagickPixel object.
+	 * </p>
+	 * @return bool <b>TRUE</b> if the specified color was set, <b>FALSE</b> otherwise.
+	 */
+	public function setColor ($color) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Sets the normalized value of one of the channels
+	 * @link https://php.net/manual/en/imagickpixel.setcolorvalue.php
+	 * @param int $color <p>
+	 * One of the Imagick color constants e.g. \Imagick::COLOR_GREEN or \Imagick::COLOR_ALPHA.
+	 * </p>
+	 * @param float $value <p>
+	 * The value to set this channel to, ranging from 0 to 1.
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function setColorValue ($color, $value) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Gets the normalized value of the provided color channel
+	 * @link https://php.net/manual/en/imagickpixel.getcolorvalue.php
+	 * @param int $color <p>
+	 * The color to get the value of, specified as one of the Imagick color
+	 * constants. This can be one of the RGB colors, CMYK colors, alpha and
+	 * opacity e.g (Imagick::COLOR_BLUE, Imagick::COLOR_MAGENTA).
+	 * </p>
+	 * @return float The value of the channel, as a normalized floating-point number, throwing
+	 * ImagickPixelException on error.
+	 * @throws ImagickPixelException on error
+	 */
+	public function getColorValue ($color) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Clears resources associated with this object
+	 * @link https://php.net/manual/en/imagickpixel.clear.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function clear () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Deallocates resources associated with this object
+	 * @link https://php.net/manual/en/imagickpixel.destroy.php
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function destroy () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Check the distance between this color and another
+	 * @link https://php.net/manual/en/imagickpixel.issimilar.php
+	 * @param ImagickPixel $color <p>
+	 * The ImagickPixel object to compare this object against.
+	 * </p>
+	 * @param float $fuzz <p>
+	 * The maximum distance within which to consider these colors as similar.
+	 * The theoretical maximum for this value is the square root of three
+	 * (1.732).
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function isSimilar (ImagickPixel $color, $fuzz) {}
+
+	/**
+	 * (No version information available, might only be in SVN)<br/>
+	 * Check the distance between this color and another
+	 * @link https://php.net/manual/en/imagickpixel.ispixelsimilar.php
+	 * @param ImagickPixel $color <p>
+	 * The ImagickPixel object to compare this object against.
+	 * </p>
+	 * @param float $fuzz <p>
+	 * The maximum distance within which to consider these colors as similar.
+	 * The theoretical maximum for this value is the square root of three
+	 * (1.732).
+	 * </p>
+	 * @return bool <b>TRUE</b> on success.
+	 */
+	public function isPixelSimilar (ImagickPixel $color, $fuzz) {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the color
+	 * @link https://php.net/manual/en/imagickpixel.getcolor.php
+	 * @param bool $normalized [optional] <p>
+	 * Normalize the color values
+	 * </p>
+	 * @return array An array of channel values, each normalized if <b>TRUE</b> is given as param. Throws
+	 * ImagickPixelException on error.
+	 * @throws ImagickPixelException on error.
+	 */
+	public function getColor ($normalized = false) {}
+
+	/**
+	 * (PECL imagick 2.1.0)<br/>
+	 * Returns the color as a string
+	 * @link https://php.net/manual/en/imagickpixel.getcolorasstring.php
+	 * @return string the color of the ImagickPixel object as a string.
+	 */
+	public function getColorAsString () {}
+
+	/**
+	 * (PECL imagick 2.0.0)<br/>
+	 * Returns the color count associated with this color
+	 * @link https://php.net/manual/en/imagickpixel.getcolorcount.php
+	 * @return int the color count as an integer on success, throws
+	 * ImagickPixelException on failure.
+	 * @throws ImagickPixelException on failure.
+	 */
+	public function getColorCount () {}
+
+	/**
+	 * @param $colorCount
+	 */
+	public function setColorCount ($colorCount) {}
+
+
+	/**
+	 * Returns true if the distance between two colors is less than the specified distance. The fuzz value should be in the range 0-QuantumRange.<br>
+	 * The maximum value represents the longest possible distance in the colorspace. e.g. from RGB(0, 0, 0) to RGB(255, 255, 255) for the RGB colorspace
+	 * @link https://php.net/manual/en/imagickpixel.ispixelsimilarquantum.php
+	 * @param string $pixel
+	 * @param string $fuzz
+	 * @return bool
+	 * @since 3.3.0
+	 */
+	public function isPixelSimilarQuantum($color, $fuzz) { }
+
+	/**
+	 * Returns the color of the pixel in an array as Quantum values. If ImageMagick was compiled as HDRI these will be floats, otherwise they will be integers.
+	 * @link https://php.net/manual/en/imagickpixel.getcolorquantum.php
+	 * @return mixed The quantum value of the color element. Float if ImageMagick was compiled with HDRI, otherwise an int.
+	 * @since 3.3.0
+	 */
+	public function getColorQuantum() { }
+
+	/**
+	 * Sets the color count associated with this color from another ImagickPixel object.
+	 *
+	 * @param ImagickPixel $srcPixel
+	 * @return bool
+	 * @since 3.4.1
+	 */
+	public function setColorFromPixel(ImagickPixel $srcPixel) { }
+}
+// End of imagick v.3.2.0RC1
+
+// Start of Imagick v3.3.0RC1
+
+/**
+ * @link https://php.net/manual/en/class.imagickkernel.php
+ */
+class ImagickKernel {
+	/**
+	 * Attach another kernel to this kernel to allow them to both be applied in a single morphology or filter function. Returns the new combined kernel.
+	 * @link https://php.net/manual/en/imagickkernel.addkernel.php
+	 * @param ImagickKernel $imagickKernel
+	 * @return void
+	 * @since 3.3.0
+	 */
+	public function addKernel(ImagickKernel $imagickKernel) { }
+
+	/**
+	 * Adds a given amount of the 'Unity' Convolution Kernel to the given pre-scaled and normalized Kernel. This in effect adds that amount of the original image into the resulting convolution kernel. The resulting effect is to convert the defined kernels into blended soft-blurs, unsharp kernels or into sharpening kernels.
+	 * @link https://php.net/manual/en/imagickkernel.addunitykernel.php
+	 * @return void
+	 * @since 3.3.0
+	 */
+	public function addUnityKernel() { }
+
+	/**
+	 * Create a kernel from a builtin in kernel. See https://www.imagemagick.org/Usage/morphology/#kernel for examples.<br>
+	 * Currently the 'rotation' symbols are not supported. Example: $diamondKernel = ImagickKernel::fromBuiltIn(\Imagick::KERNEL_DIAMOND, "2");
+	 * @link https://php.net/manual/en/imagickkernel.frombuiltin.php
+	 * @param string $kernelType The type of kernel to build e.g. \Imagick::KERNEL_DIAMOND
+	 * @param string $kernelString A string that describes the parameters e.g. "4,2.5"
+	 * @return void
+	 * @since 3.3.0
+	 */
+	public static function fromBuiltin($kernelType, $kernelString) { }
+
+	/**
+	 * Create a kernel from a builtin in kernel. See https://www.imagemagick.org/Usage/morphology/#kernel for examples.<br>
+	 * Currently the 'rotation' symbols are not supported. Example: $diamondKernel = ImagickKernel::fromBuiltIn(\Imagick::KERNEL_DIAMOND, "2");
+	 * @link https://php.net/manual/en/imagickkernel.frombuiltin.php
+	 * @see https://www.imagemagick.org/Usage/morphology/#kernel
+	 * @param array $matrix A matrix (i.e. 2d array) of values that define the kernel. Each element should be either a float value, or FALSE if that element shouldn't be used by the kernel.
+	 * @param array $origin [optional] Which element of the kernel should be used as the origin pixel. e.g. For a 3x3 matrix specifying the origin as [2, 2] would specify that the bottom right element should be the origin pixel.
+	 * @return ImagickKernel
+	 * @since 3.3.0
+	 */
+	public static function fromMatrix($matrix, $origin) { }
+
+	/**
+	 * Get the 2d matrix of values used in this kernel. The elements are either float for elements that are used or 'false' if the element should be skipped.
+	 * @link https://php.net/manual/en/imagickkernel.getmatrix.php
+	 * @return array A matrix (2d array) of the values that represent the kernel.
+	 * @since 3.3.0
+	 */
+	public function getMatrix() { }
+
+	/**
+	 * ScaleKernelInfo() scales the given kernel list by the given amount, with or without normalization of the sum of the kernel values (as per given flags).<br>
+	 * The exact behaviour of this function depends on the normalization type being used please see https://www.imagemagick.org/api/morphology.php#ScaleKernelInfo for details.<br>
+	 * Flag should be one of Imagick::NORMALIZE_KERNEL_VALUE, Imagick::NORMALIZE_KERNEL_CORRELATE, Imagick::NORMALIZE_KERNEL_PERCENT or not set.
+	 * @link https://php.net/manual/en/imagickkernel.scale.php
+	 * @see https://www.imagemagick.org/api/morphology.php#ScaleKernelInfo
+	 * @return void
+	 * @since 3.3.0
+	 */
+	public function scale() { }
+
+	/**
+	 * Separates a linked set of kernels and returns an array of ImagickKernels.
+	 * @link https://php.net/manual/en/imagickkernel.separate.php
+	 * @return void
+	 * @since 3.3.0
+	 */
+	public function seperate() { }
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/.scrutinizer.yml
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/.scrutinizer.yml	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/.scrutinizer.yml	(revision 8427)
@@ -0,0 +1,16 @@
+build:
+  nodes:
+    analysis:
+      tests:
+        override:
+          - php-scrutinizer-run
+  environment:
+    php: 8.0.0
+
+filter:
+  excluded_paths:
+    - examples/*
+    - tests/*
+    - vendor/*
+    - .github/*
+    - .phan/*
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/LICENSE
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/LICENSE	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/LICENSE	(revision 8427)
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Smiley <smiley@chillerlan.net>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/README.md
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/README.md	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/README.md	(revision 8427)
@@ -0,0 +1,422 @@
+# chillerlan/php-qrcode
+
+A PHP 7.4+ QR Code library based on the [implementation](https://github.com/kazuhikoarase/qrcode-generator) by [Kazuhiko Arase](https://github.com/kazuhikoarase),
+namespaced, cleaned up, improved and other stuff.
+
+**Attention:** there is now also a javascript port: [chillerlan/js-qrcode](https://github.com/chillerlan/js-qrcode).
+
+[![PHP Version Support][php-badge]][php]
+[![Packagist version][packagist-badge]][packagist]
+[![License][license-badge]][license]
+[![CodeCov][coverage-badge]][coverage]
+[![Scrunitizer CI][scrutinizer-badge]][scrutinizer]
+[![Packagist downloads][downloads-badge]][downloads]<br/>
+[![Continuous Integration][gh-action-badge]][gh-action]
+
+[php-badge]: https://img.shields.io/packagist/php-v/chillerlan/php-qrcode?logo=php&color=8892BF
+[php]: https://www.php.net/supported-versions.php
+[packagist-badge]: https://img.shields.io/packagist/v/chillerlan/php-qrcode.svg?logo=packagist
+[packagist]: https://packagist.org/packages/chillerlan/php-qrcode
+[license-badge]: https://img.shields.io/github/license/chillerlan/php-qrcode.svg
+[license]: https://github.com/chillerlan/php-qrcode/blob/main/LICENSE
+[coverage-badge]: https://img.shields.io/codecov/c/github/chillerlan/php-qrcode.svg?logo=codecov
+[coverage]: https://codecov.io/github/chillerlan/php-qrcode
+[scrutinizer-badge]: https://img.shields.io/scrutinizer/g/chillerlan/php-qrcode.svg?logo=scrutinizer
+[scrutinizer]: https://scrutinizer-ci.com/g/chillerlan/php-qrcode
+[downloads-badge]: https://img.shields.io/packagist/dt/chillerlan/php-qrcode.svg?logo=packagist
+[downloads]: https://packagist.org/packages/chillerlan/php-qrcode/stats
+[gh-action-badge]: https://github.com/chillerlan/php-qrcode/workflows/Continuous%20Integration/badge.svg
+[gh-action]: https://github.com/chillerlan/php-qrcode/actions?query=workflow%3A%22Continuous+Integration%22+branch%3Av4.3.x
+
+# Documentation
+
+## Requirements
+- PHP 7.4+
+  - `ext-mbstring`
+  - optional:
+    - `ext-json`, `ext-gd`
+    - `ext-imagick` with [ImageMagick](https://imagemagick.org) installed
+    - [`setasign/fpdf`](https://github.com/setasign/fpdf) for the PDF output module
+
+## Installation
+**requires [composer](https://getcomposer.org)**
+
+via terminal: `composer require chillerlan/php-qrcode`
+
+*composer.json*
+```json
+{
+	"require": {
+		"php": "^7.4 || ^8.0",
+		"chillerlan/php-qrcode": "v4.3.x-dev"
+	}
+}
+```
+
+Note: replace `v4.3.x-dev` with a [version constraint](https://getcomposer.org/doc/articles/versions.md#writing-version-constraints), e.g. `^4.3` - see [releases](https://github.com/chillerlan/php-qrcode/releases) for valid versions.
+For PHP version ...
+  - 7.4+ use `^4.3`
+  - 7.2+ use `^3.4.1` (v3.4.1 also supports PHP8)
+  - 7.0+ use `^2.0`
+  - 5.6+ use `^1.0` (please let PHP 5 die!)
+
+In case you want to keep using `v4.3.x-dev`, specify the hash of a commit to avoid running into unforseen issues like so: `v4.3.x-dev#c115f7bc51d466ccb24c544e88329804aad8c2a0`
+
+PSA: [PHP 7.0 - 7.3 are EOL](https://www.php.net/supported-versions.php) and therefore the respective `QRCode` versions are also no longer supported!
+
+## Quickstart
+We want to encode this URI for a mobile authenticator into a QRcode image:
+```php
+$data = 'otpauth://totp/test?secret=B3JX4VCVJDVNXNZ5&issuer=chillerlan.net';
+
+// quick and simple:
+echo '<img src="'.(new QRCode)->render($data).'" alt="QR Code" />';
+```
+
+<p align="center">
+	<img alt="QR codes are awesome!" src="https://raw.githubusercontent.com/chillerlan/php-qrcode/v4.3.x/examples/example_image.png">
+	<img alt="QR codes are awesome!" src="https://raw.githubusercontent.com/chillerlan/php-qrcode/v4.3.x/examples/example_svg.png">
+</p>
+
+Wait, what was that? Please again, slower!
+
+
+## Advanced usage
+
+Ok, step by step. First you'll need a `QRCode` instance, which can be optionally invoked with a `QROptions` (or a [`SettingsContainerInterface`](https://github.com/chillerlan/php-settings-container/blob/master/src/SettingsContainerInterface.php), respectively) object as the only parameter.
+
+```php
+$options = new QROptions([
+	'version'    => 5,
+	'outputType' => QRCode::OUTPUT_MARKUP_SVG,
+	'eccLevel'   => QRCode::ECC_L,
+]);
+
+// invoke a fresh QRCode instance
+$qrcode = new QRCode($options);
+
+// and dump the output
+$qrcode->render($data);
+
+// ...with additional cache file
+$qrcode->render($data, '/path/to/file.svg');
+```
+
+In case you just want the raw QR code matrix, call `QRCode::getMatrix()` - this method is also called internally from `QRCode::render()`. See also [[Custom output interface]].
+
+```php
+$matrix = $qrcode->getMatrix($data);
+
+foreach($matrix->matrix() as $y => $row){
+	foreach($row as $x => $module){
+
+		// get a module's value
+		$value = $module;
+
+		// or via the matrix's getter method
+		$value = $matrix->get($x, $y);
+
+		// boolean check a module
+		if($matrix->check($x, $y)){ // if($module >> 8 > 0)
+			// do stuff, the module is dark
+		}
+		else{
+			// do other stuff, the module is light
+		}
+
+	}
+}
+```
+
+Have a look [in the examples folder](https://github.com/chillerlan/php-qrcode/tree/main/examples) for some more usage examples.
+
+### Notes
+The QR encoder, especially the subroutines for mask pattern testing, can cause high CPU load on increased matrix size.
+You can avoid a part of this load by choosing a fast output module, like `OUTPUT_IMAGE_*` and maybe setting the mask pattern manually (which may result in unreadable QR Codes).
+Oh hey and don't forget to sanitize any user input!
+
+
+## Custom output interface
+
+Instead of bloating your code you can simply create your own output interface by creating a `QROutputInterface` (i.e. extending `QROutputAbstract`).
+
+```php
+class MyCustomOutput extends QROutputAbstract{
+
+	// inherited from QROutputAbstract
+	protected QRMatrix $matrix;   // QRMatrix
+	protected int $moduleCount;   // modules QRMatrix::size()
+	protected QROptions $options; // MyCustomOptions or QROptions
+	protected int $scale;         // scale factor from options
+	protected int $length;        // length of the matrix ($moduleCount * $scale)
+
+	// ...check/set default module values (abstract method, called by the constructor)
+	protected function setModuleValues():void{
+		// $this->moduleValues = ...
+	}
+
+	// QROutputInterface::dump()
+	public function dump(string $file = null):string{
+		$output = '';
+
+		for($row = 0; $row < $this->moduleCount; $row++){
+			for($col = 0; $col < $this->moduleCount; $col++){
+				$output .= (int)$this->matrix->check($col, $row);
+			}
+		}
+
+		return $output;
+	}
+
+}
+```
+For more examples, have a look at the [built-in output modules](https://github.com/chillerlan/php-qrcode/tree/main/src/Output).
+
+In case you need additional settings for your output module, just extend `QROptions`...
+```
+class MyCustomOptions extends QROptions{
+	protected string $myParam = 'defaultValue';
+
+	// ...
+}
+```
+...or use the [`SettingsContainerInterface`](https://github.com/chillerlan/php-settings-container/blob/main/src/SettingsContainerInterface.php), which is the more flexible approach.
+
+```php
+trait MyCustomOptionsTrait{
+	protected string $myParam = 'defaultValue';
+
+	// ...
+}
+```
+set the options:
+```php
+$myOptions = [
+	'version'         => 5,
+	'eccLevel'        => QRCode::ECC_L,
+	'outputType'      => QRCode::OUTPUT_CUSTOM,
+	'outputInterface' => MyCustomOutput::class,
+	// your custom settings
+	'myParam'         => 'whatever value',
+ ];
+
+// extends QROptions
+$myCustomOptions = new MyCustomOptions($myOptions);
+
+// using the SettingsContainerInterface
+$myCustomOptions = new class($myOptions) extends SettingsContainerAbstract{
+	use QROptionsTrait, MyCustomOptionsTrait;
+};
+
+```
+
+You can then call `QRCode` with the custom modules...
+```php
+(new QRCode($myCustomOptions))->render($data);
+```
+...or invoke the `QROutputInterface` manually.
+```php
+$qrOutputInterface = new MyCustomOutput($myCustomOptions, (new QRCode($myCustomOptions))->getMatrix($data));
+
+//dump the output, which is equivalent to QRCode::render()
+$qrOutputInterface->dump();
+```
+
+### Custom module values
+
+You can distinguish between different parts of the matrix, namely the several required patterns from the QR Code specification, and use them in different ways, i.e. to assign different colors for each part of the matrix (see the [image example](https://github.com/chillerlan/php-qrcode/blob/main/examples/image.php)).
+The dark value is the module value (light) shifted by 8 bits to the left: `$value = $M_TYPE << ($bool ? 8 : 0);`, where `$M_TYPE` is one of the `QRMatrix::M_*` constants.
+You can check the value for a type explicitly like...
+```php
+// for true (dark)
+($value >> 8) === $M_TYPE;
+
+// for false (light)
+$value === $M_TYPE;
+```
+...or you can perform a loose check, ignoring the module value
+```php
+// for true
+($value >> 8) > 0;
+
+// for false
+($value >> 8) === 0;
+```
+
+See also `QRMatrix::set()`, `QRMatrix::check()` and [`QRMatrix` constants](#qrmatrix-constants).
+
+To map the values and properly render the modules for the given `QROutputInterface`, it's necessary to overwrite the default values:
+```php
+$options = new QROptions;
+
+// for HTML, SVG and ImageMagick
+$options->moduleValues = [
+	// finder
+	1536 => '#A71111', // dark (true)
+	6    => '#FFBFBF', // light (false)
+	// alignment
+	2560 => '#A70364',
+	10   => '#FFC9C9',
+	// timing
+	3072 => '#98005D',
+	12   => '#FFB8E9',
+	// format
+	3584 => '#003804',
+	14   => '#00FB12',
+	// version
+	4096 => '#650098',
+	16   => '#E0B8FF',
+	// data
+	1024 => '#4A6000',
+	4    => '#ECF9BE',
+	// darkmodule
+	512  => '#080063',
+	// separator
+	8    => '#AFBFBF',
+	// quietzone
+	18   => '#FFFFFF',
+];
+
+// for the image output types
+$options->moduleValues = [
+	512  => [0, 0, 0],
+	// ...
+];
+
+// for string/text output
+$options->moduleValues = [
+	512  => '#',
+	// ...
+];
+```
+
+
+## Public API
+
+### `QRCode` API
+####  Methods
+method | return | description
+------ | ------ | -----------
+`__construct(QROptions $options = null)` | - | see [`SettingsContainerInterface`](https://github.com/chillerlan/php-settings-container/blob/main/src/SettingsContainerInterface.php)
+`render(string $data, string $file = null)` | mixed, `QROutputInterface::dump()` | renders a QR Code for the given `$data` and `QROptions`, saves `$file` optional
+`getMatrix(string $data)` | `QRMatrix` | returns a `QRMatrix` object for the given `$data` and current `QROptions`
+`initDataInterface(string $data)` | `QRDataInterface` | returns a fresh `QRDataInterface` for the given `$data`
+`isNumber(string $string)` | bool | checks if a string qualifies for `Number`
+`isAlphaNum(string $string)` | bool | checks if a string qualifies for `AlphaNum`
+`isKanji(string $string)` | bool | checks if a string qualifies for `Kanji`
+`isByte(string $string)` | bool | checks if a string is non-empty
+
+####  Constants
+name | description
+---- | -----------
+`VERSION_AUTO` | `QROptions::$version`
+`MASK_PATTERN_AUTO` | `QROptions::$maskPattern`
+`OUTPUT_MARKUP_SVG`, `OUTPUT_MARKUP_HTML` | `QROptions::$outputType` markup
+`OUTPUT_IMAGE_PNG`, `OUTPUT_IMAGE_JPG`, `OUTPUT_IMAGE_GIF` | `QROptions::$outputType` image
+`OUTPUT_STRING_JSON`, `OUTPUT_STRING_TEXT` | `QROptions::$outputType` string
+`OUTPUT_IMAGICK` | `QROptions::$outputType` ImageMagick
+`OUTPUT_FPDF` | `QROptions::$outputType` PDF, using [FPDF](https://github.com/setasign/fpdf)
+`OUTPUT_CUSTOM` | `QROptions::$outputType`, requires `QROptions::$outputInterface`
+`ECC_L`, `ECC_M`, `ECC_Q`, `ECC_H`, | ECC-Level: 7%, 15%, 25%, 30%  in `QROptions::$eccLevel`
+`DATA_NUMBER`, `DATA_ALPHANUM`, `DATA_BYTE`, `DATA_KANJI` | `QRDataInterface::$datamode`
+
+
+### `QRMatrix` API
+
+#### Methods
+method | return | description
+------ | ------ | -----------
+`__construct(int $version, int $eclevel)` | - | -
+`init(int $maskPattern, bool $test = null)` | `QRMatrix` |
+`matrix()` | array | the internal matrix representation as a 2 dimensional array
+`version()` | int | the current QR Code version
+`eccLevel()` | int | current ECC level
+`maskPattern()` | int | the used mask pattern
+`size()` | int | the absoulute size of the matrix, including quiet zone (if set). `$version * 4 + 17 + 2 * $quietzone`
+`get(int $x, int $y)` | int | returns the value of the module
+`set(int $x, int $y, bool $value, int $M_TYPE)` | `QRMatrix` | sets the `$M_TYPE` value for the module
+`check(int $x, int $y)` | bool | checks whether a module is true (dark) or false (light)
+
+#### Constants
+name | light (false) | dark (true) | description
+---- | ------------- | ----------- | -----------
+`M_NULL` | 0 | - | module not set (should never appear. if so, there's an error)
+`M_DARKMODULE` | - | 512 | once per matrix at `$xy = [8, 4 * $version + 9]`
+`M_DATA` | 4 | 1024 | the actual encoded data
+`M_FINDER` | 6 | 1536 | the 7x7 finder patterns
+`M_SEPARATOR` | 8 | - | separator lines around the finder patterns
+`M_ALIGNMENT` | 10 | 2560 | the 5x5 alignment patterns
+`M_TIMING` | 12 | 3072 | the timing pattern lines
+`M_FORMAT` | 14 | 3584 | format information pattern
+`M_VERSION` | 16 | 4096 | version information pattern
+`M_QUIETZONE` | 18 | - | margin around the QR Code
+`M_LOGO` | 20 | - | space for a logo image (not used yet)
+`M_TEST` | 255 | 65280 | test value
+
+### `QROptions` API
+
+#### Properties
+property | type | default | allowed | description
+-------- | ---- | ------- | ------- | -----------
+`$version` | int | `QRCode::VERSION_AUTO` | 1...40 | the [QR Code version number](http://www.qrcode.com/en/about/version.html)
+`$versionMin` | int | 1 | 1...40 | Minimum QR version (if `$version = QRCode::VERSION_AUTO`)
+`$versionMax` | int | 40 | 1...40 | Maximum QR version (if `$version = QRCode::VERSION_AUTO`)
+`$eccLevel` | int | `QRCode::ECC_L` | `QRCode::ECC_X` | Error correct level, where X = L (7%), M (15%), Q (25%), H (30%)
+`$maskPattern` | int | `QRCode::MASK_PATTERN_AUTO` | 0...7 | Mask Pattern to use
+`$addQuietzone` | bool | `true` | - | Add a "quiet zone" (margin) according to the QR code spec
+`$quietzoneSize` | int | 4 | clamped to 0 ... `$matrixSize / 2` | Size of the quiet zone
+`$dataModeOverride` | string | `null` | `Number`, `AlphaNum`, `Kanji`, `Byte` | allows overriding the data type detection
+`$outputType` | string | `QRCode::OUTPUT_IMAGE_PNG` | `QRCode::OUTPUT_*` | built-in output type
+`$outputInterface` | string | `null` | * | FQCN of the custom `QROutputInterface` if `QROptions::$outputType` is set to `QRCode::OUTPUT_CUSTOM`
+`$cachefile` | string | `null` | * | optional cache file path
+`$eol` | string | `PHP_EOL` | * | newline string (HTML, SVG, TEXT)
+`$scale` | int | 5 | * | size of a QR code pixel (SVG, IMAGE_*), HTML -> via CSS
+`$cssClass` | string | `null` | * | a common css class
+`$svgOpacity` | float | 1.0 | 0...1 |
+`$svgDefs` | string | * | * | anything between [`<defs>`](https://developer.mozilla.org/docs/Web/SVG/Element/defs)
+`$svgViewBoxSize` | int | `null` | * | a positive integer which defines width/height of the [viewBox attribute](https://css-tricks.com/scale-svg/#article-header-id-3)
+`$textDark` | string | 'ðŽ' | * | string substitute for dark
+`$textLight` | string | 'â­' | * | string substitute for light
+`$markupDark` | string | '#000' | * | markup substitute for dark (CSS value)
+`$markupLight` | string | '#fff' | * | markup substitute for light (CSS value)
+`$imageBase64` | bool | `true` | - | whether to return the image data as base64 or raw like from `file_get_contents()`
+`$imageTransparent` | bool | `true` | - | toggle transparency (no jpeg support)
+`$imageTransparencyBG` | array | `[255, 255, 255]` | `[R, G, B]` | the RGB values for the transparent color, see [`imagecolortransparent()`](http://php.net/manual/function.imagecolortransparent.php)
+`$pngCompression` | int | -1 | -1 ... 9 | `imagepng()` compression level, -1 = auto
+`$jpegQuality` | int | 85 | 0 - 100 | `imagejpeg()` quality
+`$imagickFormat` | string | 'png' | * | ImageMagick output type, see `Imagick::setType()`
+`$imagickBG` | string | `null` | * | ImageMagick background color, see `ImagickPixel::__construct()`
+`$moduleValues` | array | `null` | * | Module values map, see [[Custom output interface]] and `QROutputInterface::DEFAULT_MODULE_VALUES`
+
+
+## Framework Integration
+- Drupal:
+  - [Google Authenticator Login `ga_login`](https://www.drupal.org/project/ga_login)
+- Symfony
+	- [phpqrcode-bundle](https://github.com/jonasarts/phpqrcode-bundle)
+- WordPress:
+  - [`wp-two-factor-auth`](https://github.com/sjinks/wp-two-factor-auth)
+  - [`simple-2fa`](https://wordpress.org/plugins/simple-2fa/)
+  - [`wordpress-seo`](https://github.com/Yoast/wordpress-seo)
+  - [`floating-share-button`](https://github.com/qriouslad/floating-share-button)
+- WoltLab Suite
+  - [two-step-verification](http://pluginstore.woltlab.com/file/3007-two-step-verification/)
+- [Appwrite](https://github.com/appwrite/appwrite)
+- [Cachet](https://github.com/CachetHQ/Cachet)
+- [twill](https://github.com/area17/twill)
+- other uses: [dependents](https://github.com/chillerlan/php-qrcode/network/dependents) / [packages](https://github.com/chillerlan/php-qrcode/network/dependents?dependent_type=PACKAGE)
+
+## Shameless advertising
+Hi, please check out my other projects that are way cooler than qrcodes!
+
+- [php-oauth-core](https://github.com/chillerlan/php-oauth-core) - an OAuth 1/2 client library along with a bunch of [providers](https://github.com/chillerlan/php-oauth-providers)
+- [php-httpinterface](https://github.com/chillerlan/php-httpinterface) - a PSR-7/15/17/18 implemetation
+- [php-database](https://github.com/chillerlan/php-database) - a database client & querybuilder for MySQL, Postgres, SQLite, MSSQL, Firebird
+
+## Disclaimer!
+I don't take responsibility for molten CPUs, misled applications, failed log-ins etc.. Use at your own risk!
+
+### Trademark Notice
+
+The word "QR Code" is a registered trademark of *DENSO WAVE INCORPORATED*<br>
+https://www.qrcode.com/en/faq.html#patentH2Title
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/composer.json
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/composer.json	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/composer.json	(revision 8427)
@@ -0,0 +1,61 @@
+{
+	"name": "chillerlan/php-qrcode",
+	"description": "A QR code generator. PHP 7.4+",
+	"homepage": "https://github.com/chillerlan/php-qrcode",
+	"license": "MIT",
+	"minimum-stability": "stable",
+	"type": "library",
+	"keywords": [
+		"QR code", "qrcode", "qr", "qrcode-generator", "phpqrcode"
+	],
+	"authors": [
+		{
+			"name": "Kazuhiko Arase",
+			"homepage": "https://github.com/kazuhikoarase"
+		},
+		{
+			"name": "Smiley",
+			"email": "smiley@chillerlan.net",
+			"homepage": "https://github.com/codemasher"
+		},
+		{
+			"name": "Contributors",
+			"homepage":"https://github.com/chillerlan/php-qrcode/graphs/contributors"
+		}
+	],
+	"require": {
+		"php": "^7.4 || ^8.0",
+		"ext-mbstring": "*",
+		"chillerlan/php-settings-container": "^2.1.4"
+	},
+	"require-dev": {
+		"phpunit/phpunit": "^9.5",
+		"phan/phan": "^5.3",
+		"setasign/fpdf": "^1.8.2"
+	},
+	"suggest": {
+		"chillerlan/php-authenticator": "Yet another Google authenticator! Also creates URIs for mobile apps.",
+		"setasign/fpdf": "Required to use the QR FPDF output."
+	},
+	"autoload": {
+		"psr-4": {
+			"chillerlan\\QRCode\\": "src/"
+		}
+	},
+	"autoload-dev": {
+		"psr-4": {
+			"chillerlan\\QRCodePublic\\": "public/",
+			"chillerlan\\QRCodeTest\\": "tests/",
+			"chillerlan\\QRCodeExamples\\": "examples/"
+		}
+	},
+	"scripts": {
+		"phpunit": "@php vendor/bin/phpunit",
+		"phan": "@php vendor/bin/phan"
+	},
+	"config": {
+		"lock": false,
+		"sort-packages": true,
+		"platform-check": true
+	}
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/docs/Readme.md
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/docs/Readme.md	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/docs/Readme.md	(revision 8427)
@@ -0,0 +1,13 @@
+# Auto generated API documentation
+
+The API documentation can be auto generated with [phpDocumentor](https://www.phpdoc.org/). 
+There is an [online version available](https://chillerlan.github.io/php-qrcode/) via the [gh-pages branch](https://github.com/chillerlan/php-qrcode/tree/gh-pages) that is [automatically deployed](https://github.com/chillerlan/php-qrcode/deployments) on each push to main.
+
+Locally created docs will appear in this directory. If you'd like to create local docs, please follow these steps:
+
+- [download phpDocumentor](https://github.com/phpDocumentor/phpDocumentor/releases) v3+ as .phar archive
+- run it in the repository root directory:
+  - on Windows `c:\path\to\php.exe c:\path\to\phpDocumentor.phar --config=phpdoc.xml`
+  - on Linux just `php /path/to/phpDocumentor.phar --config=phpdoc.xml`
+- open [index.html](./index.html) in a browser
+- profit!
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/MyCustomOutput.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/MyCustomOutput.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/MyCustomOutput.php	(revision 8427)
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Class MyCustomOutput
+ *
+ * @filesource   MyCustomOutput.php
+ * @created      24.12.2017
+ * @package      chillerlan\QRCodeExamples
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2017 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCodeExamples;
+
+use chillerlan\QRCode\Output\QROutputAbstract;
+
+class MyCustomOutput extends QROutputAbstract{
+
+	protected function setModuleValues():void{
+		// TODO: Implement setModuleValues() method.
+	}
+
+	public function dump(string $file = null){
+
+		$output = '';
+
+		for($row = 0; $row < $this->moduleCount; $row++){
+			for($col = 0; $col < $this->moduleCount; $col++){
+				$output .= (int)$this->matrix->check($col, $row);
+			}
+
+			$output .= \PHP_EOL;
+		}
+
+		return $output;
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/QRImageWithLogo.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/QRImageWithLogo.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/QRImageWithLogo.php	(revision 8427)
@@ -0,0 +1,81 @@
+<?php
+/**
+ * Class QRImageWithLogo
+ *
+ * @filesource   QRImageWithLogo.php
+ * @created      18.11.2020
+ * @package      chillerlan\QRCodeExamples
+ * @author       smiley <smiley@chillerlan.net>
+ * @copyright    2020 smiley
+ * @license      MIT
+ *
+ * @noinspection PhpComposerExtensionStubsInspection
+ */
+
+namespace chillerlan\QRCodeExamples;
+
+use chillerlan\QRCode\Output\{QRCodeOutputException, QRImage};
+
+use function imagecopyresampled, imagecreatefrompng, imagesx, imagesy, is_file, is_readable;
+
+/**
+ * @property \chillerlan\QRCodeExamples\LogoOptions $options
+ */
+class QRImageWithLogo extends QRImage{
+
+	/**
+	 * @param string|null $file
+	 * @param string|null $logo
+	 *
+	 * @return string
+	 * @throws \chillerlan\QRCode\Output\QRCodeOutputException
+	 */
+	public function dump(string $file = null, string $logo = null):string{
+		// set returnResource to true to skip further processing for now
+		$this->options->returnResource = true;
+
+		// of course you could accept other formats too (such as resource or Imagick)
+		// i'm not checking for the file type either for simplicity reasons (assuming PNG)
+		if(!is_file($logo) || !is_readable($logo)){
+			throw new QRCodeOutputException('invalid logo');
+		}
+
+		$this->matrix->setLogoSpace(
+			$this->options->logoSpaceWidth,
+			$this->options->logoSpaceHeight
+			// not utilizing the position here
+		);
+
+		// there's no need to save the result of dump() into $this->image here
+		parent::dump($file);
+
+		$im = imagecreatefrompng($logo);
+
+		// get logo image size
+		$w = imagesx($im);
+		$h = imagesy($im);
+
+		// set new logo size, leave a border of 1 module (no proportional resize/centering)
+		$lw = ($this->options->logoSpaceWidth - 2) * $this->options->scale;
+		$lh = ($this->options->logoSpaceHeight - 2) * $this->options->scale;
+
+		// get the qrcode size
+		$ql = $this->matrix->size() * $this->options->scale;
+
+		// scale the logo and copy it over. done!
+		imagecopyresampled($this->image, $im, ($ql - $lw) / 2, ($ql - $lh) / 2, 0, 0, $lw, $lh, $w, $h);
+
+		$imageData = $this->dumpImage();
+
+		if($file !== null){
+			$this->saveToFile($imageData, $file);
+		}
+
+		if($this->options->imageBase64){
+			$imageData = 'data:image/'.$this->options->outputType.';base64,'.base64_encode($imageData);
+		}
+
+		return $imageData;
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/QRImageWithText.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/QRImageWithText.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/QRImageWithText.php	(revision 8427)
@@ -0,0 +1,100 @@
+<?php
+/**
+ * Class QRImageWithText
+ *
+ * example for additional text
+ *
+ * @link         https://github.com/chillerlan/php-qrcode/issues/35
+ *
+ * @filesource   QRImageWithText.php
+ * @created      22.06.2019
+ * @package      chillerlan\QRCodeExamples
+ * @author       smiley <smiley@chillerlan.net>
+ * @copyright    2019 smiley
+ * @license      MIT
+ *
+ * @noinspection PhpComposerExtensionStubsInspection
+ */
+
+namespace chillerlan\QRCodeExamples;
+
+use chillerlan\QRCode\Output\QRImage;
+
+use function base64_encode, imagechar, imagecolorallocate, imagecolortransparent, imagecopymerge, imagecreatetruecolor,
+	imagedestroy, imagefilledrectangle, imagefontwidth, in_array, round, str_split, strlen;
+
+class QRImageWithText extends QRImage{
+
+	/**
+	 * @param string|null $file
+	 * @param string|null $text
+	 *
+	 * @return string
+	 */
+	public function dump(string $file = null, string $text = null):string{
+		// set returnResource to true to skip further processing for now
+		$this->options->returnResource = true;
+
+		// there's no need to save the result of dump() into $this->image here
+		parent::dump($file);
+
+		// render text output if a string is given
+		if($text !== null){
+			$this->addText($text);
+		}
+
+		$imageData = $this->dumpImage();
+
+		if($file !== null){
+			$this->saveToFile($imageData, $file);
+		}
+
+		if($this->options->imageBase64){
+			$imageData = 'data:image/'.$this->options->outputType.';base64,'.base64_encode($imageData);
+		}
+
+		return $imageData;
+	}
+
+	/**
+	 * @param string $text
+	 */
+	protected function addText(string $text):void{
+		// save the qrcode image
+		$qrcode = $this->image;
+
+		// options things
+		$textSize  = 3; // see imagefontheight() and imagefontwidth()
+		$textBG    = [200, 200, 200];
+		$textColor = [50, 50, 50];
+
+		$bgWidth  = $this->length;
+		$bgHeight = $bgWidth + 20; // 20px extra space
+
+		// create a new image with additional space
+		$this->image = imagecreatetruecolor($bgWidth, $bgHeight);
+		$background  = imagecolorallocate($this->image, ...$textBG);
+
+		// allow transparency
+		if($this->options->imageTransparent && in_array($this->options->outputType, $this::TRANSPARENCY_TYPES, true)){
+			imagecolortransparent($this->image, $background);
+		}
+
+		// fill the background
+		imagefilledrectangle($this->image, 0, 0, $bgWidth, $bgHeight, $background);
+
+		// copy over the qrcode
+		imagecopymerge($this->image, $qrcode, 0, 0, 0, 0, $this->length, $this->length, 100);
+		imagedestroy($qrcode);
+
+		$fontColor = imagecolorallocate($this->image, ...$textColor);
+		$w         = imagefontwidth($textSize);
+		$x         = round(($bgWidth - strlen($text) * $w) / 2);
+
+		// loop through the string and draw the letters
+		foreach(str_split($text) as $i => $chr){
+			imagechar($this->image, $textSize, (int)($i * $w + $x), $this->length, $chr, $fontColor);
+		}
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/custom_output.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/custom_output.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/custom_output.php	(revision 8427)
@@ -0,0 +1,38 @@
+<?php
+/**
+ *
+ * @filesource   custom_output.php
+ * @created      24.12.2017
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2017 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCodeExamples;
+
+use chillerlan\QRCode\{QRCode, QROptions};
+
+require_once __DIR__.'/../vendor/autoload.php';
+
+$data = 'https://www.youtube.com/watch?v=DLzxrzFCyOs&t=43s';
+
+// invoke the QROutputInterface manually
+$options = new QROptions([
+	'version'      => 5,
+	'eccLevel'     => QRCode::ECC_L,
+]);
+
+$qrOutputInterface = new MyCustomOutput($options, (new QRCode($options))->getMatrix($data));
+
+var_dump($qrOutputInterface->dump());
+
+
+// or just
+$options = new QROptions([
+	'version'         => 5,
+	'eccLevel'        => QRCode::ECC_L,
+	'outputType'      => QRCode::OUTPUT_CUSTOM,
+	'outputInterface' => MyCustomOutput::class,
+]);
+
+var_dump((new QRCode($options))->render($data));
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/fpdf.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/fpdf.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/fpdf.php	(revision 8427)
@@ -0,0 +1,47 @@
+<?php
+
+namespace chillerlan\QRCodeExamples;
+
+use chillerlan\QRCode\{QRCode, QROptions};
+
+require_once __DIR__ . '/../vendor/autoload.php';
+
+$data = 'https://www.youtube.com/watch?v=DLzxrzFCyOs&t=43s';
+
+$options = new QROptions([
+    'version'      => 7,
+    'outputType'   => QRCode::OUTPUT_FPDF,
+    'eccLevel'     => QRCode::ECC_L,
+    'scale'        => 5,
+    'imageBase64'  => false,
+    'moduleValues' => [
+        // finder
+        1536 => [0, 63, 255], // dark (true)
+        6    => [255, 255, 255], // light (false), white is the transparency color and is enabled by default
+        // alignment
+        2560 => [255, 0, 255],
+        10   => [255, 255, 255],
+        // timing
+        3072 => [255, 0, 0],
+        12   => [255, 255, 255],
+        // format
+        3584 => [67, 191, 84],
+        14   => [255, 255, 255],
+        // version
+        4096 => [62, 174, 190],
+        16   => [255, 255, 255],
+        // data
+        1024 => [0, 0, 0],
+        4    => [255, 255, 255],
+        // darkmodule
+        512  => [0, 0, 0],
+        // separator
+        8    => [255, 255, 255],
+        // quietzone
+        18   => [255, 255, 255],
+    ],
+]);
+
+\header('Content-type: application/pdf');
+
+echo (new QRCode($options))->render($data);
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/html.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/html.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/html.php	(revision 8427)
@@ -0,0 +1,102 @@
+<?php
+/**
+ *
+ * @filesource   html.php
+ * @created      21.12.2017
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2017 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCodeExamples;
+
+use chillerlan\QRCode\{QRCode, QROptions};
+
+require_once '../vendor/autoload.php';
+
+header('Content-Type: text/html; charset=utf-8');
+
+?>
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="UTF-8"/>
+	<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
+	<title>QRCode test</title>
+	<style>
+		body{
+			margin: 5em;
+			padding: 0;
+		}
+
+		div.qrcode{
+			margin: 0;
+			padding: 0;
+		}
+
+		/* rows */
+		div.qrcode > div {
+			margin: 0;
+			padding: 0;
+			height: 10px;
+		}
+
+		/* modules */
+		div.qrcode > div > span {
+			display: inline-block;
+			width: 10px;
+			height: 10px;
+		}
+
+		div.qrcode > div > span {
+			background-color: #ccc;
+		}
+	</style>
+</head>
+<body>
+	<div class="qrcode">
+<?php
+
+	$data = 'https://www.youtube.com/watch?v=DLzxrzFCyOs&t=43s';
+
+	$options = new QROptions([
+		'version' => 5,
+		'outputType' => QRCode::OUTPUT_MARKUP_HTML,
+		'eccLevel' => QRCode::ECC_L,
+		'moduleValues' => [
+			// finder
+			1536 => '#A71111', // dark (true)
+			6    => '#FFBFBF', // light (false)
+			// alignment
+			2560 => '#A70364',
+			10   => '#FFC9C9',
+			// timing
+			3072 => '#98005D',
+			12   => '#FFB8E9',
+			// format
+			3584 => '#003804',
+			14   => '#00FB12',
+			// version
+			4096 => '#650098',
+			16   => '#E0B8FF',
+			// data
+			1024 => '#4A6000',
+			4    => '#ECF9BE',
+			// darkmodule
+			512  => '#080063',
+			// separator
+			8    => '#AFBFBF',
+			// quietzone
+			18   => '#FFFFFF',
+		],
+	]);
+
+	echo (new QRCode($options))->render($data);
+
+?>
+	</div>
+</body>
+</html>
+
+
+
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/image.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/image.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/image.php	(revision 8427)
@@ -0,0 +1,63 @@
+<?php
+/**
+ *
+ * @filesource   image.php
+ * @created      24.12.2017
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2017 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCodeExamples;
+
+use chillerlan\QRCode\{QRCode, QROptions};
+
+require_once __DIR__.'/../vendor/autoload.php';
+
+$data = 'https://www.youtube.com/watch?v=DLzxrzFCyOs&t=43s';
+
+$options = new QROptions([
+	'version'      => 10,
+	'outputType'   => QRCode::OUTPUT_IMAGE_PNG,
+	'eccLevel'     => QRCode::ECC_H,
+	'scale'        => 5,
+	'imageBase64'  => false,
+	'moduleValues' => [
+		// finder
+		1536 => [0, 63, 255], // dark (true)
+		6    => [255, 255, 255], // light (false), white is the transparency color and is enabled by default
+		5632 => [241, 28, 163], // finder dot, dark (true)
+		// alignment
+		2560 => [255, 0, 255],
+		10   => [255, 255, 255],
+		// timing
+		3072 => [255, 0, 0],
+		12   => [255, 255, 255],
+		// format
+		3584 => [67, 99, 84],
+		14   => [255, 255, 255],
+		// version
+		4096 => [62, 174, 190],
+		16   => [255, 255, 255],
+		// data
+		1024 => [0, 0, 0],
+		4    => [255, 255, 255],
+		// darkmodule
+		512  => [0, 0, 0],
+		// separator
+		8    => [255, 255, 255],
+		// quietzone
+		18   => [255, 255, 255],
+		// logo (requires a call to QRMatrix::setLogoSpace())
+		20    => [255, 255, 255],
+	],
+]);
+
+header('Content-type: image/png');
+
+echo (new QRCode($options))->render($data);
+
+
+
+
+
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/imageWithLogo.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/imageWithLogo.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/imageWithLogo.php	(revision 8427)
@@ -0,0 +1,45 @@
+<?php
+/**
+ *
+ * @filesource   imageWithLogo.php
+ * @created      18.11.2020
+ * @author       smiley <smiley@chillerlan.net>
+ * @copyright    2020 smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCodeExamples;
+
+use chillerlan\QRCode\{QRCode, QROptions};
+
+require_once __DIR__.'/../vendor/autoload.php';
+
+$data = 'https://www.youtube.com/watch?v=DLzxrzFCyOs&t=43s';
+/**
+ * @property int $logoSpaceWidth
+ * @property int $logoSpaceHeight
+ *
+ * @noinspection PhpIllegalPsrClassPathInspection
+ */
+class LogoOptions extends QROptions{
+	// size in QR modules, multiply with QROptions::$scale for pixel size
+	protected int $logoSpaceWidth;
+	protected int $logoSpaceHeight;
+}
+
+$options = new LogoOptions;
+
+$options->version          = 7;
+$options->eccLevel         = QRCode::ECC_H;
+$options->imageBase64      = false;
+$options->logoSpaceWidth   = 13;
+$options->logoSpaceHeight  = 13;
+$options->scale            = 5;
+$options->imageTransparent = false;
+
+header('Content-type: image/png');
+
+$qrOutputInterface = new QRImageWithLogo($options, (new QRCode($options))->getMatrix($data));
+
+// dump the output, with an additional logo
+echo $qrOutputInterface->dump(null, __DIR__.'/octocat.png');
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/imageWithText.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/imageWithText.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/imageWithText.php	(revision 8427)
@@ -0,0 +1,33 @@
+<?php
+/**
+ * example for additional text
+ * @link https://github.com/chillerlan/php-qrcode/issues/35
+ *
+ * @filesource   imageWithText.php
+ * @created      22.06.2019
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2019 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCodeExamples;
+
+use chillerlan\QRCode\{QRCode, QROptions};
+
+require_once __DIR__.'/../vendor/autoload.php';
+
+$data = 'https://www.youtube.com/watch?v=DLzxrzFCyOs&t=43s';
+
+$options = new QROptions([
+	'version'      => 7,
+	'outputType'   => QRCode::OUTPUT_IMAGE_PNG,
+	'scale'        => 3,
+	'imageBase64'  => false,
+]);
+
+header('Content-type: image/png');
+
+$qrOutputInterface = new QRImageWithText($options, (new QRCode($options))->getMatrix($data));
+
+// dump the output, with additional text
+echo $qrOutputInterface->dump(null, 'example text');
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/imagick.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/imagick.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/imagick.php	(revision 8427)
@@ -0,0 +1,59 @@
+<?php
+/**
+ *
+ * @filesource   image.php
+ * @created      24.12.2017
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2017 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCodeExamples;
+
+use chillerlan\QRCode\{QRCode, QROptions};
+
+require_once __DIR__.'/../vendor/autoload.php';
+
+$data = 'https://www.youtube.com/watch?v=DLzxrzFCyOs&t=43s';
+
+$options = new QROptions([
+	'version'      => 7,
+	'outputType'   => QRCode::OUTPUT_IMAGICK,
+	'eccLevel'     => QRCode::ECC_L,
+	'scale'        => 5,
+	'moduleValues' => [
+		// finder
+		1536 => '#A71111', // dark (true)
+		6    => '#FFBFBF', // light (false)
+		// alignment
+		2560 => '#A70364',
+		10   => '#FFC9C9',
+		// timing
+		3072 => '#98005D',
+		12   => '#FFB8E9',
+		// format
+		3584 => '#003804',
+		14   => '#00FB12',
+		// version
+		4096 => '#650098',
+		16   => '#E0B8FF',
+		// data
+		1024 => '#4A6000',
+		4    => '#ECF9BE',
+		// darkmodule
+		512  => '#080063',
+		// separator
+		8    => '#DDDDDD',
+		// quietzone
+		18   => '#DDDDDD',
+	],
+]);
+
+header('Content-type: image/png');
+
+echo (new QRCode($options))->render($data);
+
+
+
+
+
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/svg.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/svg.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/svg.php	(revision 8427)
@@ -0,0 +1,78 @@
+<?php
+/**
+ *
+ * @filesource   svg.php
+ * @created      21.12.2017
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2017 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCodeExamples;
+
+use chillerlan\QRCode\{QRCode, QROptions};
+
+require_once __DIR__.'/../vendor/autoload.php';
+
+$data = 'https://www.youtube.com/watch?v=DLzxrzFCyOs&t=43s';
+$gzip = true;
+
+$options = new QROptions([
+	'version'      => 7,
+	'outputType'   => QRCode::OUTPUT_MARKUP_SVG,
+	'imageBase64'  => false,
+	'eccLevel'     => QRCode::ECC_L,
+	'svgViewBoxSize' => 530,
+	'addQuietzone' => true,
+	'cssClass'     => 'my-css-class',
+	'svgOpacity'   => 1.0,
+	'svgDefs'      => '
+		<linearGradient id="g2">
+			<stop offset="0%" stop-color="#39F" />
+			<stop offset="100%" stop-color="#F3F" />
+		</linearGradient>
+		<linearGradient id="g1">
+			<stop offset="0%" stop-color="#F3F" />
+			<stop offset="100%" stop-color="#39F" />
+		</linearGradient>
+		<style>rect{shape-rendering:crispEdges}</style>',
+	'moduleValues' => [
+		// finder
+		1536 => 'url(#g1)', // dark (true)
+		6    => '#fff', // light (false)
+		// alignment
+		2560 => 'url(#g1)',
+		10   => '#fff',
+		// timing
+		3072 => 'url(#g1)',
+		12   => '#fff',
+		// format
+		3584 => 'url(#g1)',
+		14   => '#fff',
+		// version
+		4096 => 'url(#g1)',
+		16   => '#fff',
+		// data
+		1024 => 'url(#g2)',
+		4    => '#fff',
+		// darkmodule
+		512  => 'url(#g1)',
+		// separator
+		8    => '#fff',
+		// quietzone
+		18   => '#fff',
+	],
+]);
+
+$qrcode = (new QRCode($options))->render($data);
+
+header('Content-type: image/svg+xml');
+
+if($gzip === true){
+	header('Vary: Accept-Encoding');
+	header('Content-Encoding: gzip');
+	$qrcode = gzencode($qrcode ,9);
+}
+echo $qrcode;
+
+
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/text.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/text.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/examples/text.php	(revision 8427)
@@ -0,0 +1,68 @@
+<?php
+/**
+ *
+ * @filesource   text.php
+ * @created      21.12.2017
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2017 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCodeExamples;
+
+use chillerlan\QRCode\{QRCode, QROptions};
+
+require_once __DIR__.'/../vendor/autoload.php';
+
+$data = 'https://www.youtube.com/watch?v=DLzxrzFCyOs&t=43s';
+
+$options = new QROptions([
+	'version'      => 5,
+	'outputType'   => QRCode::OUTPUT_STRING_TEXT,
+	'eccLevel'     => QRCode::ECC_L,
+]);
+
+// <pre> to view it in a browser
+echo '<pre style="font-size: 75%; line-height: 1;">'.(new QRCode($options))->render($data).'</pre>';
+
+
+// custom values
+$options = new QROptions([
+	'version'      => 5,
+	'outputType'   => QRCode::OUTPUT_STRING_TEXT,
+	'eccLevel'     => QRCode::ECC_L,
+	'moduleValues' => [
+		// finder
+		1536 => 'A', // dark (true)
+		6    => 'a', // light (false)
+		// alignment
+		2560 => 'B',
+		10   => 'b',
+		// timing
+		3072 => 'C',
+		12   => 'c',
+		// format
+		3584 => 'D',
+		14   => 'd',
+		// version
+		4096 => 'E',
+		16   => 'e',
+		// data
+		1024 => 'F',
+		4    => 'f',
+		// darkmodule
+		512  => 'G',
+		// separator
+		8    => 'h',
+		// quietzone
+		18   => 'i',
+	],
+]);
+
+// <pre> to view it in a browser
+echo '<pre style="font-size: 75%; line-height: 1;">'.(new QRCode($options))->render($data).'</pre>';
+
+
+
+
+
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/phpdoc.xml
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/phpdoc.xml	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/phpdoc.xml	(revision 8427)
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<phpdoc>
+	<parser>
+		<target>docs</target>
+		<encoding>utf8</encoding>
+		<markers>
+			<item>TODO</item>
+		</markers>
+	</parser>
+	<transformer>
+		<target>docs</target>
+	</transformer>
+	<files>
+		<directory>src</directory>
+		<directory>tests</directory>
+	</files>
+	<transformations>
+		<template name="responsive-twig"/>
+	</transformations>
+</phpdoc>
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/phpunit.xml
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/phpunit.xml	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/phpunit.xml	(revision 8427)
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		 xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.5/phpunit.xsd"
+		 bootstrap="vendor/autoload.php"
+		 cacheResultFile=".build/phpunit.result.cache"
+		 colors="true"
+		 verbose="true"
+>
+	<coverage processUncoveredFiles="true">
+		<include>
+			<directory suffix=".php">./src</directory>
+		</include>
+		<report>
+			<clover outputFile=".build/coverage/clover.xml"/>
+			<xml outputDirectory=".build/coverage/coverage-xml"/>
+		</report>
+	</coverage>
+	<testsuites>
+		<testsuite name="php-qrcode test suite">
+			<directory suffix=".php">./tests/</directory>
+		</testsuite>
+	</testsuites>
+	<logging>
+		<junit outputFile=".build/logs/junit.xml"/>
+	</logging>
+</phpunit>
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/public/index.html
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/public/index.html	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/public/index.html	(revision 8427)
@@ -0,0 +1,163 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head >
+	<meta charset="UTF-8" >
+	<meta name="viewport" content="width=device-width, initial-scale=1.0" />
+	<title >QR Code Generator</title >
+	<style >
+		body{ font-size: 20px; line-height: 1.4em; font-family: "Trebuchet MS", sans-serif; color: #000;}
+		input, textarea, select{font-family: Consolas, "Liberation Mono", Courier, monospace; font-size: 75%; line-height: 1.25em; border: 1px solid #aaa; }
+		input:focus, textarea:focus, select:focus{ border: 1px solid #ccc; }
+		label{ cursor: pointer; }
+		#qrcode-settings, div#qrcode-output{ text-align: center; }
+		div#qrcode-output > div {margin: 0;padding: 0;height: 3px;}
+		div#qrcode-output > div > span {display: inline-block;width: 3px;height: 3px;}
+		div#qrcode-output > div > span {background-color: lightgrey;}
+	</style >
+</head >
+<body >
+
+<form id="qrcode-settings" >
+
+	<label for="inputstring" >Input String</label ><br /><textarea name="inputstring" id="inputstring" cols="80" rows="3" autocomplete="off" spellcheck="false"></textarea ><br />
+
+	<label for="version" >Version</label >
+	<input id="version" name="version" class="options" type="number" min="1" max="40" value="5" placeholder="version" />
+
+	<label for="maskpattern" >Mask Pattern</label >
+	<input id="maskpattern" name="maskpattern" class="options" type="number" min="-1" max="7" value="-1" placeholder="mask pattern" />
+
+	<label for="ecc" >ECC</label >
+	<select class="options" id="ecc" name="ecc" >
+		<option value="L" selected="selected" >L - 7%</option >
+		<option value="M" >M - 15%</option >
+		<option value="Q" >Q - 25%</option >
+		<option value="H" >H - 30%</option >
+	</select >
+
+	<br />
+
+	<label for="quietzone" >Quiet Zone
+		<input id="quietzone" name="quietzone" class="options" type="checkbox" value="true" />
+	</label >
+
+	<label for="quietzonesize" >size</label >
+	<input id="quietzonesize" name="quietzonesize" class="options" type="number" min="0" max="100" value="4" placeholder="quiet zone" />
+
+	<br />
+
+	<label for="output_type" >Output</label >
+	<select class="options" id="output_type" name="output_type" >
+		<option value="html" >Markup - HTML</option >
+		<option value="svg"  selected="selected" >Markup - SVG</option >
+		<option value="png">Image - png</option >
+		<option value="jpg" >Image - jpg</option >
+		<option value="gif" >Image - gif</option >
+		<option value="text" >String - text</option >
+		<option value="json" >String - json</option >
+	</select >
+
+	<label for="scale" >scale</label >
+	<input id="scale" name="scale" class="options" type="number" min="1" max="10" value="5" placeholder="scale" />
+
+	<div>Finder</div>
+	<label for="m_finder_light" >
+		<input type="text" id="m_finder_light" name="m_finder_light" class="jscolor options" value="ffffff" autocomplete="off" spellcheck="false" minlength="6" maxlength="6" />
+	</label >
+	<label for="m_finder_dark" >
+		<input type="text" id="m_finder_dark" name="m_finder_dark" class="jscolor options" value="000000" autocomplete="off" spellcheck="false" minlength="6" maxlength="6" />
+	</label >
+
+	<div>Alignment</div>
+	<label for="m_alignment_light" >
+		<input type="text" id="m_alignment_light" name="m_alignment_light" class="jscolor options" value="ffffff" autocomplete="off" spellcheck="false" minlength="6" maxlength="6" />
+	</label >
+	<label for="m_alignment_dark" >
+		<input type="text" id="m_alignment_dark" name="m_alignment_dark" class="jscolor options" value="000000" autocomplete="off" spellcheck="false" minlength="6" maxlength="6" />
+	</label >
+
+	<div>Timing</div>
+	<label for="m_timing_light" >
+		<input type="text" id="m_timing_light" name="m_timing_light" class="jscolor options" value="ffffff" autocomplete="off" spellcheck="false" minlength="6" maxlength="6" />
+	</label >
+	<label for="m_timing_dark" >
+		<input type="text" id="m_timing_dark" name="m_timing_dark" class="jscolor options" value="000000" autocomplete="off" spellcheck="false" minlength="6" maxlength="6" />
+	</label >
+
+	<div>Format</div>
+	<label for="m_format_light" >
+		<input type="text" id="m_format_light" name="m_format_light" class="jscolor options" value="ffffff" autocomplete="off" spellcheck="false" minlength="6" maxlength="6" />
+	</label >
+	<label for="m_format_dark" >
+		<input type="text" id="m_format_dark" name="m_format_dark" class="jscolor options" value="000000" autocomplete="off" spellcheck="false" minlength="6" maxlength="6" />
+	</label >
+
+	<div>Version</div>
+	<label for="m_version_light" >
+		<input type="text" id="m_version_light" name="m_version_light" class="jscolor options" value="ffffff" autocomplete="off" spellcheck="false" minlength="6" maxlength="6" />
+	</label >
+	<label for="m_version_dark" >
+		<input type="text" id="m_version_dark" name="m_version_dark" class="jscolor options" value="000000" autocomplete="off" spellcheck="false" minlength="6" maxlength="6" />
+	</label >
+
+	<div>Data</div>
+	<label for="m_data_light" >
+		<input type="text" id="m_data_light" name="m_data_light" class="jscolor options" value="ffffff" autocomplete="off" spellcheck="false" minlength="6" maxlength="6" />
+	</label >
+	<label for="m_data_dark" >
+		<input type="text" id="m_data_dark" name="m_data_dark" class="jscolor options" value="000000" autocomplete="off" spellcheck="false" minlength="6" maxlength="6" />
+	</label >
+
+	<div>Dark Module</div>
+	<label for="m_darkmodule_light" >
+		<input disabled="disabled" type="text" id="m_darkmodule_light" class="options" value="" autocomplete="off" spellcheck="false" />
+	</label >
+	<label for="m_darkmodule_dark" >
+		<input type="text" id="m_darkmodule_dark" name="m_darkmodule_dark" class="jscolor options" value="000000" autocomplete="off" spellcheck="false" minlength="6" maxlength="6" />
+	</label >
+
+	<div>Separator</div>
+	<label for="m_separator_light" >
+		<input type="text" id="m_separator_light" name="m_separator_light" class="jscolor options" value="ffffff" autocomplete="off" spellcheck="false" minlength="6" maxlength="6" />
+	</label >
+	<label for="m_separator_dark" >
+		<input disabled="disabled" type="text" id="m_separator_dark" class="options" value="" autocomplete="off" spellcheck="false" />
+	</label >
+
+	<div>Quiet Zone</div>
+	<label for="m_quietzone_light" >
+		<input type="text" id="m_quietzone_light" name="m_quietzone_light" class="jscolor options" value="ffffff" autocomplete="off" spellcheck="false" minlength="6" maxlength="6" />
+	</label >
+	<label for="m_quietzone_dark" >
+		<input disabled="disabled" type="text" id="m_quietzone_dark" class="options" value="" autocomplete="off" spellcheck="false" />
+	</label >
+
+	<br />
+	<button type="submit" >generate</button >
+</form >
+<div id="qrcode-output" ></div >
+
+<div><a href="https://play.google.com/store/apps/details?id=com.google.zxing.client.android" >ZXing Barcode Scanner</a ></div>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.3/prototype.js" ></script >
+<script src="https://cdnjs.cloudflare.com/ajax/libs/jscolor/2.0.4/jscolor.js" ></script >
+<script >
+	((form, output, url) => {
+
+		$(form).observe('submit', ev => {
+			Event.stop(ev);
+
+			new Ajax.Request(url, {
+				method: 'post',
+				parameters: ev.target.serialize(true),
+				onUninitialized: $(output).update(),
+				onLoading: $(output).update('[portlandia_screaming.gif]'),
+				onFailure: response => $(output).update(response.responseJSON.error),
+				onSuccess: response => $(output).update(response.responseJSON.qrcode),
+			});
+
+		});
+	})('qrcode-settings', 'qrcode-output', './qrcode.php');
+</script >
+
+</body >
+</html >
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/public/qrcode.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/public/qrcode.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/public/qrcode.php	(revision 8427)
@@ -0,0 +1,97 @@
+<?php
+/**
+ * @filesource   qrcode.php
+ * @created      18.11.2017
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2017 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCodePublic;
+
+use chillerlan\QRCode\QRCode;
+use chillerlan\QRCode\QROptions;
+
+require_once '../vendor/autoload.php';
+
+try{
+
+	$moduleValues = [
+		// finder
+		1536 => $_POST['m_finder_dark'],
+		6    => $_POST['m_finder_light'],
+		// alignment
+		2560 => $_POST['m_alignment_dark'],
+		10   => $_POST['m_alignment_light'],
+		// timing
+		3072 => $_POST['m_timing_dark'],
+		12   => $_POST['m_timing_light'],
+		// format
+		3584 => $_POST['m_format_dark'],
+		14   => $_POST['m_format_light'],
+		// version
+		4096 => $_POST['m_version_dark'],
+		16   => $_POST['m_version_light'],
+		// data
+		1024 => $_POST['m_data_dark'],
+		4    => $_POST['m_data_light'],
+		// darkmodule
+		512  => $_POST['m_darkmodule_dark'],
+		// separator
+		8    => $_POST['m_separator_light'],
+		// quietzone
+		18   => $_POST['m_quietzone_light'],
+	];
+
+	$moduleValues = array_map(function($v){
+		if(preg_match('/[a-f\d]{6}/i', $v) === 1){
+			return in_array($_POST['output_type'], ['png', 'jpg', 'gif'])
+				? array_map('hexdec', str_split($v, 2))
+				: '#'.$v ;
+		}
+		return null;
+	}, $moduleValues);
+
+
+	$ecc = in_array($_POST['ecc'], ['L', 'M', 'Q', 'H'], true) ? $_POST['ecc'] : 'L';
+
+	$qro = new QROptions;
+
+	$qro->version          = (int)$_POST['version'];
+	$qro->eccLevel         = constant('chillerlan\\QRCode\\QRCode::ECC_'.$ecc);
+	$qro->maskPattern      = (int)$_POST['maskpattern'];
+	$qro->addQuietzone     = isset($_POST['quietzone']);
+	$qro->quietzoneSize    = (int)$_POST['quietzonesize'];
+	$qro->moduleValues     = $moduleValues;
+	$qro->outputType       = $_POST['output_type'];
+	$qro->scale            = (int)$_POST['scale'];
+	$qro->imageTransparent = false;
+
+	$qrcode = (new QRCode($qro))->render($_POST['inputstring']);
+
+	if(in_array($_POST['output_type'], ['png', 'jpg', 'gif'])){
+		$qrcode = '<img src="'.$qrcode.'" />';
+	}
+	elseif($_POST['output_type'] === 'text'){
+		$qrcode = '<pre style="font-size: 75%; line-height: 1;">'.$qrcode.'</pre>';
+	}
+	elseif($_POST['output_type'] === 'json'){
+		$qrcode = '<pre style="font-size: 75%; overflow-x: auto;">'.$qrcode.'</pre>';
+	}
+
+	send_response(['qrcode' => $qrcode]);
+}
+// PokÃ©mon exception handler
+catch(\Exception $e){
+	header('HTTP/1.1 500 Internal Server Error');
+	send_response(['error' => $e->getMessage()]);
+}
+
+/**
+ * @param array $response
+ */
+function send_response(array $response){
+	header('Content-type: application/json;charset=utf-8;');
+	echo json_encode($response);
+	exit;
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/AlphaNum.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/AlphaNum.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/AlphaNum.php	(revision 8427)
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Class AlphaNum
+ *
+ * @filesource   AlphaNum.php
+ * @created      25.11.2015
+ * @package      chillerlan\QRCode\Data
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2015 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCode\Data;
+
+use chillerlan\QRCode\QRCode;
+
+use function ord, sprintf;
+
+/**
+ * Alphanumeric mode: 0 to 9, A to Z, space, $ % * + - . / :
+ *
+ * ISO/IEC 18004:2000 Section 8.3.3
+ * ISO/IEC 18004:2000 Section 8.4.3
+ */
+final class AlphaNum extends QRDataAbstract{
+
+	protected int $datamode = QRCode::DATA_ALPHANUM;
+
+	protected array $lengthBits = [9, 11, 13];
+
+	/**
+	 * @inheritdoc
+	 */
+	protected function write(string $data):void{
+
+		for($i = 0; $i + 1 < $this->strlen; $i += 2){
+			$this->bitBuffer->put($this->getCharCode($data[$i]) * 45 + $this->getCharCode($data[$i + 1]), 11);
+		}
+
+		if($i < $this->strlen){
+			$this->bitBuffer->put($this->getCharCode($data[$i]), 6);
+		}
+
+	}
+
+	/**
+	 * get the code for the given character
+	 *
+	 * @throws \chillerlan\QRCode\Data\QRCodeDataException on an illegal character occurence
+	 */
+	protected function getCharCode(string $chr):int{
+
+		if(!isset($this::CHAR_MAP_ALPHANUM[$chr])){
+			throw new QRCodeDataException(sprintf('illegal char: "%s" [%d]', $chr, ord($chr)));
+		}
+
+		return $this::CHAR_MAP_ALPHANUM[$chr];
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/Byte.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/Byte.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/Byte.php	(revision 8427)
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Class Byte
+ *
+ * @filesource   Byte.php
+ * @created      25.11.2015
+ * @package      chillerlan\QRCode\Data
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2015 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCode\Data;
+
+use chillerlan\QRCode\QRCode;
+
+use function ord;
+
+/**
+ * Byte mode, ISO-8859-1 or UTF-8
+ *
+ * ISO/IEC 18004:2000 Section 8.3.4
+ * ISO/IEC 18004:2000 Section 8.4.4
+ */
+final class Byte extends QRDataAbstract{
+
+	protected int $datamode = QRCode::DATA_BYTE;
+
+	protected array $lengthBits = [8, 16, 16];
+
+	/**
+	 * @inheritdoc
+	 */
+	protected function write(string $data):void{
+		$i = 0;
+
+		while($i < $this->strlen){
+			$this->bitBuffer->put(ord($data[$i]), 8);
+			$i++;
+		}
+
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/Kanji.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/Kanji.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/Kanji.php	(revision 8427)
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Class Kanji
+ *
+ * @filesource   Kanji.php
+ * @created      25.11.2015
+ * @package      chillerlan\QRCode\Data
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2015 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCode\Data;
+
+use chillerlan\QRCode\QRCode;
+
+use function mb_strlen, ord, sprintf, strlen;
+
+/**
+ * Kanji mode: double-byte characters from the Shift JIS character set
+ *
+ * ISO/IEC 18004:2000 Section 8.3.5
+ * ISO/IEC 18004:2000 Section 8.4.5
+ */
+final class Kanji extends QRDataAbstract{
+
+	protected int $datamode = QRCode::DATA_KANJI;
+
+	protected array $lengthBits = [8, 10, 12];
+
+	/**
+	 * @inheritdoc
+	 */
+	protected function getLength(string $data):int{
+		return mb_strlen($data, 'SJIS');
+	}
+
+	/**
+	 * @inheritdoc
+	 *
+	 * @throws \chillerlan\QRCode\Data\QRCodeDataException on an illegal character occurence
+	 */
+	protected function write(string $data):void{
+		$len = strlen($data);
+
+		for($i = 0; $i + 1 < $len; $i += 2){
+			$c = ((0xff & ord($data[$i])) << 8) | (0xff & ord($data[$i + 1]));
+
+			if($c >= 0x8140 && $c <= 0x9FFC){
+				$c -= 0x8140;
+			}
+			elseif($c >= 0xE040 && $c <= 0xEBBF){
+				$c -= 0xC140;
+			}
+			else{
+				throw new QRCodeDataException(sprintf('illegal char at %d [%d]', $i + 1, $c));
+			}
+
+			$this->bitBuffer->put(((($c >> 8) & 0xff) * 0xC0) + ($c & 0xff), 13);
+
+		}
+
+		if($i < $len){
+			throw new QRCodeDataException(sprintf('illegal char at %d', $i + 1));
+		}
+
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/MaskPatternTester.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/MaskPatternTester.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/MaskPatternTester.php	(revision 8427)
@@ -0,0 +1,203 @@
+<?php
+/**
+ * Class MaskPatternTester
+ *
+ * @filesource   MaskPatternTester.php
+ * @created      22.11.2017
+ * @package      chillerlan\QRCode\Data
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2017 Smiley
+ * @license      MIT
+ *
+ * @noinspection PhpUnused
+ */
+
+namespace chillerlan\QRCode\Data;
+
+use function abs, array_search, call_user_func_array, min;
+
+/**
+ * Receives a QRDataInterface object and runs the mask pattern tests on it.
+ *
+ * ISO/IEC 18004:2000 Section 8.8.2 - Evaluation of masking results
+ *
+ * @see http://www.thonky.com/qr-code-tutorial/data-masking
+ */
+final class MaskPatternTester{
+
+	/**
+	 * The data interface that contains the data matrix to test
+	 */
+	protected QRDataInterface $dataInterface;
+
+	/**
+	 * Receives the QRDataInterface
+	 *
+	 * @see \chillerlan\QRCode\QROptions::$maskPattern
+	 * @see \chillerlan\QRCode\Data\QRMatrix::$maskPattern
+	 */
+	public function __construct(QRDataInterface $dataInterface){
+		$this->dataInterface = $dataInterface;
+	}
+
+	/**
+	 * shoves a QRMatrix through the MaskPatternTester to find the lowest penalty mask pattern
+	 *
+	 * @see \chillerlan\QRCode\Data\MaskPatternTester
+	 */
+	public function getBestMaskPattern():int{
+		$penalties = [];
+
+		for($pattern = 0; $pattern < 8; $pattern++){
+			$penalties[$pattern] = $this->testPattern($pattern);
+		}
+
+		return array_search(min($penalties), $penalties, true);
+	}
+
+	/**
+	 * Returns the penalty for the given mask pattern
+	 *
+	 * @see \chillerlan\QRCode\QROptions::$maskPattern
+	 * @see \chillerlan\QRCode\Data\QRMatrix::$maskPattern
+	 */
+	public function testPattern(int $pattern):int{
+		$matrix  = $this->dataInterface->initMatrix($pattern, true);
+		$penalty = 0;
+
+		for($level = 1; $level <= 4; $level++){
+			$penalty += call_user_func_array([$this, 'testLevel'.$level], [$matrix->matrix(true), $matrix->size()]);
+		}
+
+		return (int)$penalty;
+	}
+
+	/**
+	 * Checks for each group of five or more same-colored modules in a row (or column)
+	 */
+	protected function testLevel1(array $m, int $size):int{
+		$penalty = 0;
+
+		foreach($m as $y => $row){
+			foreach($row as $x => $val){
+				$count = 0;
+
+				for($ry = -1; $ry <= 1; $ry++){
+
+					if($y + $ry < 0 || $size <= $y + $ry){
+						continue;
+					}
+
+					for($rx = -1; $rx <= 1; $rx++){
+
+						if(($ry === 0 && $rx === 0) || (($x + $rx) < 0 || $size <= ($x + $rx))){
+							continue;
+						}
+
+						if($m[$y + $ry][$x + $rx] === $val){
+							$count++;
+						}
+
+					}
+				}
+
+				if($count > 5){
+					$penalty += (3 + $count - 5);
+				}
+
+			}
+		}
+
+		return $penalty;
+	}
+
+	/**
+	 * Checks for each 2x2 area of same-colored modules in the matrix
+	 */
+	protected function testLevel2(array $m, int $size):int{
+		$penalty = 0;
+
+		foreach($m as $y => $row){
+
+			if($y > $size - 2){
+				break;
+			}
+
+			foreach($row as $x => $val){
+
+				if($x > $size - 2){
+					break;
+				}
+
+				if(
+					   $val === $m[$y][$x + 1]
+					&& $val === $m[$y + 1][$x]
+					&& $val === $m[$y + 1][$x + 1]
+				){
+					$penalty++;
+				}
+			}
+		}
+
+		return 3 * $penalty;
+	}
+
+	/**
+	 * Checks if there are patterns that look similar to the finder patterns (1:1:3:1:1 ratio)
+	 */
+	protected function testLevel3(array $m, int $size):int{
+		$penalties = 0;
+
+		foreach($m as $y => $row){
+			foreach($row as $x => $val){
+
+				if(
+					$x + 6 < $size
+					&&  $val
+					&& !$m[$y][$x + 1]
+					&&  $m[$y][$x + 2]
+					&&  $m[$y][$x + 3]
+					&&  $m[$y][$x + 4]
+					&& !$m[$y][$x + 5]
+					&&  $m[$y][$x + 6]
+				){
+					$penalties++;
+				}
+
+				if(
+					$y + 6 < $size
+					&&  $val
+					&& !$m[$y + 1][$x]
+					&&  $m[$y + 2][$x]
+					&&  $m[$y + 3][$x]
+					&&  $m[$y + 4][$x]
+					&& !$m[$y + 5][$x]
+					&&  $m[$y + 6][$x]
+				){
+					$penalties++;
+				}
+
+			}
+		}
+
+		return $penalties * 40;
+	}
+
+	/**
+	 * Checks if more than half of the modules are dark or light, with a larger penalty for a larger difference
+	 */
+	protected function testLevel4(array $m, int $size):float{
+		$count = 0;
+
+		foreach($m as $y => $row){
+			foreach($row as $x => $val){
+				if($val){
+					$count++;
+				}
+			}
+		}
+
+		return (abs(100 * $count / $size / $size - 50) / 5) * 10;
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/Number.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/Number.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/Number.php	(revision 8427)
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Class Number
+ *
+ * @filesource   Number.php
+ * @created      26.11.2015
+ * @package      chillerlan\QRCode\Data
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2015 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCode\Data;
+
+use chillerlan\QRCode\QRCode;
+
+use function ord, sprintf, str_split, substr;
+
+/**
+ * Numeric mode: decimal digits 0 to 9
+ *
+ * ISO/IEC 18004:2000 Section 8.3.2
+ * ISO/IEC 18004:2000 Section 8.4.2
+ */
+final class Number extends QRDataAbstract{
+
+	protected int $datamode = QRCode::DATA_NUMBER;
+
+	protected array $lengthBits = [10, 12, 14];
+
+	/**
+	 * @inheritdoc
+	 */
+	protected function write(string $data):void{
+		$i = 0;
+
+		while($i + 2 < $this->strlen){
+			$this->bitBuffer->put($this->parseInt(substr($data, $i, 3)), 10);
+			$i += 3;
+		}
+
+		if($i < $this->strlen){
+
+			if($this->strlen - $i === 1){
+				$this->bitBuffer->put($this->parseInt(substr($data, $i, $i + 1)), 4);
+			}
+			elseif($this->strlen - $i === 2){
+				$this->bitBuffer->put($this->parseInt(substr($data, $i, $i + 2)), 7);
+			}
+
+		}
+
+	}
+
+	/**
+	 * get the code for the given numeric string
+	 *
+	 * @throws \chillerlan\QRCode\Data\QRCodeDataException on an illegal character occurence
+	 */
+	protected function parseInt(string $string):int{
+		$num = 0;
+
+		foreach(str_split($string) as $chr){
+			$c = ord($chr);
+
+			if(!isset($this::CHAR_MAP_NUMBER[$chr])){
+				throw new QRCodeDataException(sprintf('illegal char: "%s" [%d]', $chr, $c));
+			}
+
+			$c   = $c - 48; // ord('0')
+			$num = $num * 10 + $c;
+		}
+
+		return $num;
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/QRCodeDataException.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/QRCodeDataException.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/QRCodeDataException.php	(revision 8427)
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Class QRCodeDataException
+ *
+ * @filesource   QRCodeDataException.php
+ * @created      09.12.2015
+ * @package      chillerlan\QRCode\Data
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2015 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCode\Data;
+
+use chillerlan\QRCode\QRCodeException;
+
+class QRCodeDataException extends QRCodeException{}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/QRDataAbstract.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/QRDataAbstract.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/QRDataAbstract.php	(revision 8427)
@@ -0,0 +1,311 @@
+<?php
+/**
+ * Class QRDataAbstract
+ *
+ * @filesource   QRDataAbstract.php
+ * @created      25.11.2015
+ * @package      chillerlan\QRCode\Data
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2015 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCode\Data;
+
+use chillerlan\QRCode\QRCode;
+use chillerlan\QRCode\Helpers\{BitBuffer, Polynomial};
+use chillerlan\Settings\SettingsContainerInterface;
+
+use function array_fill, array_merge, count, max, mb_convert_encoding, mb_detect_encoding, range, sprintf, strlen;
+
+/**
+ * Processes the binary data and maps it on a matrix which is then being returned
+ */
+abstract class QRDataAbstract implements QRDataInterface{
+
+	/**
+	 * the string byte count
+	 */
+	protected ?int $strlen = null;
+
+	/**
+	 * the current data mode: Num, Alphanum, Kanji, Byte
+	 */
+	protected int $datamode;
+
+	/**
+	 * mode length bits for the version breakpoints 1-9, 10-26 and 27-40
+	 *
+	 * ISO/IEC 18004:2000 Table 3 - Number of bits in Character Count Indicator
+	 */
+	protected array $lengthBits = [0, 0, 0];
+
+	/**
+	 * current QR Code version
+	 */
+	protected int $version;
+
+	/**
+	 * ECC temp data
+	 */
+	protected array $ecdata;
+
+	/**
+	 * ECC temp data
+	 */
+	protected array $dcdata;
+
+	/**
+	 * the options instance
+	 *
+	 * @var \chillerlan\Settings\SettingsContainerInterface|\chillerlan\QRCode\QROptions
+	 */
+	protected SettingsContainerInterface $options;
+
+	/**
+	 * a BitBuffer instance
+	 */
+	protected BitBuffer $bitBuffer;
+
+	/**
+	 * QRDataInterface constructor.
+	 */
+	public function __construct(SettingsContainerInterface $options, string $data = null){
+		$this->options = $options;
+
+		if($data !== null){
+			$this->setData($data);
+		}
+	}
+
+	/**
+	 * @inheritDoc
+	 */
+	public function setData(string $data):QRDataInterface{
+
+		if($this->datamode === QRCode::DATA_KANJI){
+			$data = mb_convert_encoding($data, 'SJIS', mb_detect_encoding($data));
+		}
+
+		$this->strlen  = $this->getLength($data);
+		$this->version = $this->options->version === QRCode::VERSION_AUTO
+			? $this->getMinimumVersion()
+			: $this->options->version;
+
+		$this->writeBitBuffer($data);
+
+		return $this;
+	}
+
+	/**
+	 * @inheritDoc
+	 */
+	public function initMatrix(int $maskPattern, bool $test = null):QRMatrix{
+		return (new QRMatrix($this->version, $this->options->eccLevel))
+			->init($maskPattern, $test)
+			->mapData($this->maskECC(), $maskPattern)
+		;
+	}
+
+	/**
+	 * returns the length bits for the version breakpoints 1-9, 10-26 and 27-40
+	 *
+	 * @throws \chillerlan\QRCode\Data\QRCodeDataException
+	 * @codeCoverageIgnore
+	 */
+	protected function getLengthBits():int{
+
+		 foreach([9, 26, 40] as $key => $breakpoint){
+			 if($this->version <= $breakpoint){
+				 return $this->lengthBits[$key];
+			 }
+		 }
+
+		throw new QRCodeDataException(sprintf('invalid version number: %d', $this->version));
+	}
+
+	/**
+	 * returns the byte count of the $data string
+	 */
+	protected function getLength(string $data):int{
+		return strlen($data);
+	}
+
+	/**
+	 * returns the minimum version number for the given string
+	 *
+	 * @throws \chillerlan\QRCode\Data\QRCodeDataException
+	 */
+	protected function getMinimumVersion():int{
+		$maxlength = 0;
+
+		// guess the version number within the given range
+		$dataMode = QRCode::DATA_MODES[$this->datamode];
+		$eccMode  = QRCode::ECC_MODES[$this->options->eccLevel];
+
+		foreach(range($this->options->versionMin, $this->options->versionMax) as $version){
+			$maxlength = $this::MAX_LENGTH[$version][$dataMode][$eccMode];
+
+			if($this->strlen <= $maxlength){
+				return $version;
+			}
+		}
+
+		throw new QRCodeDataException(sprintf('data exceeds %d characters', $maxlength));
+	}
+
+	/**
+	 * writes the actual data string to the BitBuffer
+	 *
+	 * @see \chillerlan\QRCode\Data\QRDataAbstract::writeBitBuffer()
+	 */
+	abstract protected function write(string $data):void;
+
+	/**
+	 * creates a BitBuffer and writes the string data to it
+	 *
+	 * @throws \chillerlan\QRCode\QRCodeException on data overflow
+	 */
+	protected function writeBitBuffer(string $data):void{
+		$this->bitBuffer = new BitBuffer;
+
+		$MAX_BITS = $this::MAX_BITS[$this->version][QRCode::ECC_MODES[$this->options->eccLevel]];
+
+		$this->bitBuffer
+			->put($this->datamode, 4)
+			->put($this->strlen, $this->getLengthBits())
+		;
+
+		$this->write($data);
+
+		// overflow, likely caused due to invalid version setting
+		if($this->bitBuffer->getLength() > $MAX_BITS){
+			throw new QRCodeDataException(sprintf('code length overflow. (%d > %d bit)', $this->bitBuffer->getLength(), $MAX_BITS));
+		}
+
+		// add terminator (ISO/IEC 18004:2000 Table 2)
+		if($this->bitBuffer->getLength() + 4 <= $MAX_BITS){
+			$this->bitBuffer->put(0, 4);
+		}
+
+		// padding
+		while($this->bitBuffer->getLength() % 8 !== 0){
+			$this->bitBuffer->putBit(false);
+		}
+
+		// padding
+		while(true){
+
+			if($this->bitBuffer->getLength() >= $MAX_BITS){
+				break;
+			}
+
+			$this->bitBuffer->put(0xEC, 8);
+
+			if($this->bitBuffer->getLength() >= $MAX_BITS){
+				break;
+			}
+
+			$this->bitBuffer->put(0x11, 8);
+		}
+
+	}
+
+	/**
+	 * ECC masking
+	 *
+	 * ISO/IEC 18004:2000 Section 8.5 ff
+	 *
+	 * @see http://www.thonky.com/qr-code-tutorial/error-correction-coding
+	 */
+	protected function maskECC():array{
+		[$l1, $l2, $b1, $b2] = $this::RSBLOCKS[$this->version][QRCode::ECC_MODES[$this->options->eccLevel]];
+
+		$rsBlocks     = array_fill(0, $l1, [$b1, $b2]);
+		$rsCount      = $l1 + $l2;
+		$this->ecdata = array_fill(0, $rsCount, []);
+		$this->dcdata = $this->ecdata;
+
+		if($l2 > 0){
+			$rsBlocks = array_merge($rsBlocks, array_fill(0, $l2, [$b1 + 1, $b2 + 1]));
+		}
+
+		$totalCodeCount = 0;
+		$maxDcCount     = 0;
+		$maxEcCount     = 0;
+		$offset         = 0;
+
+		$bitBuffer = $this->bitBuffer->getBuffer();
+
+		foreach($rsBlocks as $key => $block){
+			[$rsBlockTotal, $dcCount] = $block;
+
+			$ecCount            = $rsBlockTotal - $dcCount;
+			$maxDcCount         = max($maxDcCount, $dcCount);
+			$maxEcCount         = max($maxEcCount, $ecCount);
+			$this->dcdata[$key] = array_fill(0, $dcCount, null);
+
+			foreach($this->dcdata[$key] as $a => $_z){
+				$this->dcdata[$key][$a] = 0xff & $bitBuffer[$a + $offset];
+			}
+
+			[$num, $add] = $this->poly($key, $ecCount);
+
+			foreach($this->ecdata[$key] as $c => $_){
+				$modIndex               = $c + $add;
+				$this->ecdata[$key][$c] = $modIndex >= 0 ? $num[$modIndex] : 0;
+			}
+
+			$offset         += $dcCount;
+			$totalCodeCount += $rsBlockTotal;
+		}
+
+		$data  = array_fill(0, $totalCodeCount, null);
+		$index = 0;
+
+		$mask = function(array $arr, int $count) use (&$data, &$index, $rsCount):void{
+			for($x = 0; $x < $count; $x++){
+				for($y = 0; $y < $rsCount; $y++){
+					if($x < count($arr[$y])){
+						$data[$index] = $arr[$y][$x];
+						$index++;
+					}
+				}
+			}
+		};
+
+		$mask($this->dcdata, $maxDcCount);
+		$mask($this->ecdata, $maxEcCount);
+
+		return $data;
+	}
+
+	/**
+	 * helper method for the polynomial operations
+	 */
+	protected function poly(int $key, int $count):array{
+		$rsPoly  = new Polynomial;
+		$modPoly = new Polynomial;
+
+		for($i = 0; $i < $count; $i++){
+			$modPoly->setNum([1, $modPoly->gexp($i)]);
+			$rsPoly->multiply($modPoly->getNum());
+		}
+
+		$rsPolyCount = count($rsPoly->getNum());
+
+		$modPoly
+			->setNum($this->dcdata[$key], $rsPolyCount - 1)
+			->mod($rsPoly->getNum())
+		;
+
+		$this->ecdata[$key] = array_fill(0, $rsPolyCount - 1, null);
+		$num                = $modPoly->getNum();
+
+		return [
+			$num,
+			count($num) - count($this->ecdata[$key]),
+		];
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/QRDataInterface.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/QRDataInterface.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/QRDataInterface.php	(revision 8427)
@@ -0,0 +1,200 @@
+<?php
+/**
+ * Interface QRDataInterface
+ *
+ * @filesource   QRDataInterface.php
+ * @created      01.12.2015
+ * @package      chillerlan\QRCode\Data
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2015 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCode\Data;
+
+/**
+ * Specifies the methods reqired for the data modules (Number, Alphanum, Byte and Kanji)
+ * and holds version information in several constants
+ */
+interface QRDataInterface{
+
+	/**
+	 * @var int[]
+	 */
+	const CHAR_MAP_NUMBER = [
+		'0' => 0, '1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5, '6' => 6, '7' => 7, '8' => 8, '9' => 9,
+	];
+
+	/**
+	 * ISO/IEC 18004:2000 Table 5
+	 *
+	 * @var int[]
+	 */
+	const CHAR_MAP_ALPHANUM = [
+		'0' =>  0, '1' =>  1, '2' =>  2, '3' =>  3, '4' =>  4, '5' =>  5, '6' =>  6, '7' =>  7,
+		'8' =>  8, '9' =>  9, 'A' => 10, 'B' => 11, 'C' => 12, 'D' => 13, 'E' => 14, 'F' => 15,
+		'G' => 16, 'H' => 17, 'I' => 18, 'J' => 19, 'K' => 20, 'L' => 21, 'M' => 22, 'N' => 23,
+		'O' => 24, 'P' => 25, 'Q' => 26, 'R' => 27, 'S' => 28, 'T' => 29, 'U' => 30, 'V' => 31,
+		'W' => 32, 'X' => 33, 'Y' => 34, 'Z' => 35, ' ' => 36, '$' => 37, '%' => 38, '*' => 39,
+		'+' => 40, '-' => 41, '.' => 42, '/' => 43, ':' => 44,
+	];
+
+	/**
+	 * ISO/IEC 18004:2000 Tables 7-11 - Number of symbol characters and input data capacity for versions 1 to 40
+	 *
+	 * @see http://www.qrcode.com/en/about/version.html
+	 *
+	 * @var int [][][]
+	 */
+	const MAX_LENGTH =[
+	//	v  => [NUMERIC => [L, M, Q, H ], ALPHANUM => [L, M, Q, H], BINARY => [L, M, Q, H  ], KANJI => [L, M, Q, H   ]]  // modules
+		1  => [[  41,   34,   27,   17], [  25,   20,   16,   10], [  17,   14,   11,    7], [  10,    8,    7,    4]], //  21
+		2  => [[  77,   63,   48,   34], [  47,   38,   29,   20], [  32,   26,   20,   14], [  20,   16,   12,    8]], //  25
+		3  => [[ 127,  101,   77,   58], [  77,   61,   47,   35], [  53,   42,   32,   24], [  32,   26,   20,   15]], //  29
+		4  => [[ 187,  149,  111,   82], [ 114,   90,   67,   50], [  78,   62,   46,   34], [  48,   38,   28,   21]], //  33
+		5  => [[ 255,  202,  144,  106], [ 154,  122,   87,   64], [ 106,   84,   60,   44], [  65,   52,   37,   27]], //  37
+		6  => [[ 322,  255,  178,  139], [ 195,  154,  108,   84], [ 134,  106,   74,   58], [  82,   65,   45,   36]], //  41
+		7  => [[ 370,  293,  207,  154], [ 224,  178,  125,   93], [ 154,  122,   86,   64], [  95,   75,   53,   39]], //  45
+		8  => [[ 461,  365,  259,  202], [ 279,  221,  157,  122], [ 192,  152,  108,   84], [ 118,   93,   66,   52]], //  49
+		9  => [[ 552,  432,  312,  235], [ 335,  262,  189,  143], [ 230,  180,  130,   98], [ 141,  111,   80,   60]], //  53
+		10 => [[ 652,  513,  364,  288], [ 395,  311,  221,  174], [ 271,  213,  151,  119], [ 167,  131,   93,   74]], //  57
+		11 => [[ 772,  604,  427,  331], [ 468,  366,  259,  200], [ 321,  251,  177,  137], [ 198,  155,  109,   85]], //  61
+		12 => [[ 883,  691,  489,  374], [ 535,  419,  296,  227], [ 367,  287,  203,  155], [ 226,  177,  125,   96]], //  65
+		13 => [[1022,  796,  580,  427], [ 619,  483,  352,  259], [ 425,  331,  241,  177], [ 262,  204,  149,  109]], //  69 NICE!
+		14 => [[1101,  871,  621,  468], [ 667,  528,  376,  283], [ 458,  362,  258,  194], [ 282,  223,  159,  120]], //  73
+		15 => [[1250,  991,  703,  530], [ 758,  600,  426,  321], [ 520,  412,  292,  220], [ 320,  254,  180,  136]], //  77
+		16 => [[1408, 1082,  775,  602], [ 854,  656,  470,  365], [ 586,  450,  322,  250], [ 361,  277,  198,  154]], //  81
+		17 => [[1548, 1212,  876,  674], [ 938,  734,  531,  408], [ 644,  504,  364,  280], [ 397,  310,  224,  173]], //  85
+		18 => [[1725, 1346,  948,  746], [1046,  816,  574,  452], [ 718,  560,  394,  310], [ 442,  345,  243,  191]], //  89
+		19 => [[1903, 1500, 1063,  813], [1153,  909,  644,  493], [ 792,  624,  442,  338], [ 488,  384,  272,  208]], //  93
+		20 => [[2061, 1600, 1159,  919], [1249,  970,  702,  557], [ 858,  666,  482,  382], [ 528,  410,  297,  235]], //  97
+		21 => [[2232, 1708, 1224,  969], [1352, 1035,  742,  587], [ 929,  711,  509,  403], [ 572,  438,  314,  248]], // 101
+		22 => [[2409, 1872, 1358, 1056], [1460, 1134,  823,  640], [1003,  779,  565,  439], [ 618,  480,  348,  270]], // 105
+		23 => [[2620, 2059, 1468, 1108], [1588, 1248,  890,  672], [1091,  857,  611,  461], [ 672,  528,  376,  284]], // 109
+		24 => [[2812, 2188, 1588, 1228], [1704, 1326,  963,  744], [1171,  911,  661,  511], [ 721,  561,  407,  315]], // 113
+		25 => [[3057, 2395, 1718, 1286], [1853, 1451, 1041,  779], [1273,  997,  715,  535], [ 784,  614,  440,  330]], // 117
+		26 => [[3283, 2544, 1804, 1425], [1990, 1542, 1094,  864], [1367, 1059,  751,  593], [ 842,  652,  462,  365]], // 121
+		27 => [[3517, 2701, 1933, 1501], [2132, 1637, 1172,  910], [1465, 1125,  805,  625], [ 902,  692,  496,  385]], // 125
+		28 => [[3669, 2857, 2085, 1581], [2223, 1732, 1263,  958], [1528, 1190,  868,  658], [ 940,  732,  534,  405]], // 129
+		29 => [[3909, 3035, 2181, 1677], [2369, 1839, 1322, 1016], [1628, 1264,  908,  698], [1002,  778,  559,  430]], // 133
+		30 => [[4158, 3289, 2358, 1782], [2520, 1994, 1429, 1080], [1732, 1370,  982,  742], [1066,  843,  604,  457]], // 137
+		31 => [[4417, 3486, 2473, 1897], [2677, 2113, 1499, 1150], [1840, 1452, 1030,  790], [1132,  894,  634,  486]], // 141
+		32 => [[4686, 3693, 2670, 2022], [2840, 2238, 1618, 1226], [1952, 1538, 1112,  842], [1201,  947,  684,  518]], // 145
+		33 => [[4965, 3909, 2805, 2157], [3009, 2369, 1700, 1307], [2068, 1628, 1168,  898], [1273, 1002,  719,  553]], // 149
+		34 => [[5253, 4134, 2949, 2301], [3183, 2506, 1787, 1394], [2188, 1722, 1228,  958], [1347, 1060,  756,  590]], // 153
+		35 => [[5529, 4343, 3081, 2361], [3351, 2632, 1867, 1431], [2303, 1809, 1283,  983], [1417, 1113,  790,  605]], // 157
+		36 => [[5836, 4588, 3244, 2524], [3537, 2780, 1966, 1530], [2431, 1911, 1351, 1051], [1496, 1176,  832,  647]], // 161
+		37 => [[6153, 4775, 3417, 2625], [3729, 2894, 2071, 1591], [2563, 1989, 1423, 1093], [1577, 1224,  876,  673]], // 165
+		38 => [[6479, 5039, 3599, 2735], [3927, 3054, 2181, 1658], [2699, 2099, 1499, 1139], [1661, 1292,  923,  701]], // 169
+		39 => [[6743, 5313, 3791, 2927], [4087, 3220, 2298, 1774], [2809, 2213, 1579, 1219], [1729, 1362,  972,  750]], // 173
+		40 => [[7089, 5596, 3993, 3057], [4296, 3391, 2420, 1852], [2953, 2331, 1663, 1273], [1817, 1435, 1024,  784]], // 177
+	];
+
+	/**
+	 * ISO/IEC 18004:2000 Tables 7-11 - Number of symbol characters and input data capacity for versions 1 to 40
+	 *
+	 * @var int [][]
+	 */
+	const MAX_BITS = [
+		// version => [L, M, Q, H ]
+		1  => [  152,   128,   104,    72],
+		2  => [  272,   224,   176,   128],
+		3  => [  440,   352,   272,   208],
+		4  => [  640,   512,   384,   288],
+		5  => [  864,   688,   496,   368],
+		6  => [ 1088,   864,   608,   480],
+		7  => [ 1248,   992,   704,   528],
+		8  => [ 1552,  1232,   880,   688],
+		9  => [ 1856,  1456,  1056,   800],
+		10 => [ 2192,  1728,  1232,   976],
+		11 => [ 2592,  2032,  1440,  1120],
+		12 => [ 2960,  2320,  1648,  1264],
+		13 => [ 3424,  2672,  1952,  1440],
+		14 => [ 3688,  2920,  2088,  1576],
+		15 => [ 4184,  3320,  2360,  1784],
+		16 => [ 4712,  3624,  2600,  2024],
+		17 => [ 5176,  4056,  2936,  2264],
+		18 => [ 5768,  4504,  3176,  2504],
+		19 => [ 6360,  5016,  3560,  2728],
+		20 => [ 6888,  5352,  3880,  3080],
+		21 => [ 7456,  5712,  4096,  3248],
+		22 => [ 8048,  6256,  4544,  3536],
+		23 => [ 8752,  6880,  4912,  3712],
+		24 => [ 9392,  7312,  5312,  4112],
+		25 => [10208,  8000,  5744,  4304],
+		26 => [10960,  8496,  6032,  4768],
+		27 => [11744,  9024,  6464,  5024],
+		28 => [12248,  9544,  6968,  5288],
+		29 => [13048, 10136,  7288,  5608],
+		30 => [13880, 10984,  7880,  5960],
+		31 => [14744, 11640,  8264,  6344],
+		32 => [15640, 12328,  8920,  6760],
+		33 => [16568, 13048,  9368,  7208],
+		34 => [17528, 13800,  9848,  7688],
+		35 => [18448, 14496, 10288,  7888],
+		36 => [19472, 15312, 10832,  8432],
+		37 => [20528, 15936, 11408,  8768],
+		38 => [21616, 16816, 12016,  9136],
+		39 => [22496, 17728, 12656,  9776],
+		40 => [23648, 18672, 13328, 10208],
+	];
+
+	/**
+	 * @see http://www.thonky.com/qr-code-tutorial/error-correction-table
+	 *
+	 * @var int [][][]
+	 */
+	const RSBLOCKS = [
+		1  => [[ 1,  0,  26,  19], [ 1,  0, 26, 16], [ 1,  0, 26, 13], [ 1,  0, 26,  9]],
+		2  => [[ 1,  0,  44,  34], [ 1,  0, 44, 28], [ 1,  0, 44, 22], [ 1,  0, 44, 16]],
+		3  => [[ 1,  0,  70,  55], [ 1,  0, 70, 44], [ 2,  0, 35, 17], [ 2,  0, 35, 13]],
+		4  => [[ 1,  0, 100,  80], [ 2,  0, 50, 32], [ 2,  0, 50, 24], [ 4,  0, 25,  9]],
+		5  => [[ 1,  0, 134, 108], [ 2,  0, 67, 43], [ 2,  2, 33, 15], [ 2,  2, 33, 11]],
+		6  => [[ 2,  0,  86,  68], [ 4,  0, 43, 27], [ 4,  0, 43, 19], [ 4,  0, 43, 15]],
+		7  => [[ 2,  0,  98,  78], [ 4,  0, 49, 31], [ 2,  4, 32, 14], [ 4,  1, 39, 13]],
+		8  => [[ 2,  0, 121,  97], [ 2,  2, 60, 38], [ 4,  2, 40, 18], [ 4,  2, 40, 14]],
+		9  => [[ 2,  0, 146, 116], [ 3,  2, 58, 36], [ 4,  4, 36, 16], [ 4,  4, 36, 12]],
+		10 => [[ 2,  2,  86,  68], [ 4,  1, 69, 43], [ 6,  2, 43, 19], [ 6,  2, 43, 15]],
+		11 => [[ 4,  0, 101,  81], [ 1,  4, 80, 50], [ 4,  4, 50, 22], [ 3,  8, 36, 12]],
+		12 => [[ 2,  2, 116,  92], [ 6,  2, 58, 36], [ 4,  6, 46, 20], [ 7,  4, 42, 14]],
+		13 => [[ 4,  0, 133, 107], [ 8,  1, 59, 37], [ 8,  4, 44, 20], [12,  4, 33, 11]],
+		14 => [[ 3,  1, 145, 115], [ 4,  5, 64, 40], [11,  5, 36, 16], [11,  5, 36, 12]],
+		15 => [[ 5,  1, 109,  87], [ 5,  5, 65, 41], [ 5,  7, 54, 24], [11,  7, 36, 12]],
+		16 => [[ 5,  1, 122,  98], [ 7,  3, 73, 45], [15,  2, 43, 19], [ 3, 13, 45, 15]],
+		17 => [[ 1,  5, 135, 107], [10,  1, 74, 46], [ 1, 15, 50, 22], [ 2, 17, 42, 14]],
+		18 => [[ 5,  1, 150, 120], [ 9,  4, 69, 43], [17,  1, 50, 22], [ 2, 19, 42, 14]],
+		19 => [[ 3,  4, 141, 113], [ 3, 11, 70, 44], [17,  4, 47, 21], [ 9, 16, 39, 13]],
+		20 => [[ 3,  5, 135, 107], [ 3, 13, 67, 41], [15,  5, 54, 24], [15, 10, 43, 15]],
+		21 => [[ 4,  4, 144, 116], [17,  0, 68, 42], [17,  6, 50, 22], [19,  6, 46, 16]],
+		22 => [[ 2,  7, 139, 111], [17,  0, 74, 46], [ 7, 16, 54, 24], [34,  0, 37, 13]],
+		23 => [[ 4,  5, 151, 121], [ 4, 14, 75, 47], [11, 14, 54, 24], [16, 14, 45, 15]],
+		24 => [[ 6,  4, 147, 117], [ 6, 14, 73, 45], [11, 16, 54, 24], [30,  2, 46, 16]],
+		25 => [[ 8,  4, 132, 106], [ 8, 13, 75, 47], [ 7, 22, 54, 24], [22, 13, 45, 15]],
+		26 => [[10,  2, 142, 114], [19,  4, 74, 46], [28,  6, 50, 22], [33,  4, 46, 16]],
+		27 => [[ 8,  4, 152, 122], [22,  3, 73, 45], [ 8, 26, 53, 23], [12, 28, 45, 15]],
+		28 => [[ 3, 10, 147, 117], [ 3, 23, 73, 45], [ 4, 31, 54, 24], [11, 31, 45, 15]],
+		29 => [[ 7,  7, 146, 116], [21,  7, 73, 45], [ 1, 37, 53, 23], [19, 26, 45, 15]],
+		30 => [[ 5, 10, 145, 115], [19, 10, 75, 47], [15, 25, 54, 24], [23, 25, 45, 15]],
+		31 => [[13,  3, 145, 115], [ 2, 29, 74, 46], [42,  1, 54, 24], [23, 28, 45, 15]],
+		32 => [[17,  0, 145, 115], [10, 23, 74, 46], [10, 35, 54, 24], [19, 35, 45, 15]],
+		33 => [[17,  1, 145, 115], [14, 21, 74, 46], [29, 19, 54, 24], [11, 46, 45, 15]],
+		34 => [[13,  6, 145, 115], [14, 23, 74, 46], [44,  7, 54, 24], [59,  1, 46, 16]],
+		35 => [[12,  7, 151, 121], [12, 26, 75, 47], [39, 14, 54, 24], [22, 41, 45, 15]],
+		36 => [[ 6, 14, 151, 121], [ 6, 34, 75, 47], [46, 10, 54, 24], [ 2, 64, 45, 15]],
+		37 => [[17,  4, 152, 122], [29, 14, 74, 46], [49, 10, 54, 24], [24, 46, 45, 15]],
+		38 => [[ 4, 18, 152, 122], [13, 32, 74, 46], [48, 14, 54, 24], [42, 32, 45, 15]],
+		39 => [[20,  4, 147, 117], [40,  7, 75, 47], [43, 22, 54, 24], [10, 67, 45, 15]],
+		40 => [[19,  6, 148, 118], [18, 31, 75, 47], [34, 34, 54, 24], [20, 61, 45, 15]],
+	];
+
+	/**
+	 * Sets the data string (internally called by the constructor)
+	 */
+	public function setData(string $data):QRDataInterface;
+
+	/**
+	 * returns a fresh matrix object with the data written for the given $maskPattern
+	 */
+	public function initMatrix(int $maskPattern, bool $test = null):QRMatrix;
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/QRMatrix.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/QRMatrix.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Data/QRMatrix.php	(revision 8427)
@@ -0,0 +1,740 @@
+<?php
+/**
+ * Class QRMatrix
+ *
+ * @filesource   QRMatrix.php
+ * @created      15.11.2017
+ * @package      chillerlan\QRCode\Data
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2017 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCode\Data;
+
+use chillerlan\QRCode\QRCode;
+use Closure;
+
+use function array_fill, array_key_exists, array_push, array_unshift, count, floor, in_array, max, min, range;
+
+/**
+ * Holds a numerical representation of the final QR Code;
+ * maps the ECC coded binary data and applies the mask pattern
+ *
+ * @see http://www.thonky.com/qr-code-tutorial/format-version-information
+ */
+final class QRMatrix{
+
+	/** @var int */
+	public const M_NULL       = 0x00;
+	/** @var int */
+	public const M_DARKMODULE = 0x02;
+	/** @var int */
+	public const M_DATA       = 0x04;
+	/** @var int */
+	public const M_FINDER     = 0x06;
+	/** @var int */
+	public const M_SEPARATOR  = 0x08;
+	/** @var int */
+	public const M_ALIGNMENT  = 0x0a;
+	/** @var int */
+	public const M_TIMING     = 0x0c;
+	/** @var int */
+	public const M_FORMAT     = 0x0e;
+	/** @var int */
+	public const M_VERSION    = 0x10;
+	/** @var int */
+	public const M_QUIETZONE  = 0x12;
+	/** @var int */
+	public const M_LOGO       = 0x14;
+	/** @var int */
+	public const M_FINDER_DOT = 0x16;
+	/** @var int */
+	public const M_TEST       = 0xff;
+
+	/**
+	 * ISO/IEC 18004:2000 Annex E, Table E.1 - Row/column coordinates of center module of Alignment Patterns
+	 *
+	 * version -> pattern
+	 *
+	 * @var int[][]
+	 */
+	protected const alignmentPattern = [
+		1  => [],
+		2  => [6, 18],
+		3  => [6, 22],
+		4  => [6, 26],
+		5  => [6, 30],
+		6  => [6, 34],
+		7  => [6, 22, 38],
+		8  => [6, 24, 42],
+		9  => [6, 26, 46],
+		10 => [6, 28, 50],
+		11 => [6, 30, 54],
+		12 => [6, 32, 58],
+		13 => [6, 34, 62],
+		14 => [6, 26, 46, 66],
+		15 => [6, 26, 48, 70],
+		16 => [6, 26, 50, 74],
+		17 => [6, 30, 54, 78],
+		18 => [6, 30, 56, 82],
+		19 => [6, 30, 58, 86],
+		20 => [6, 34, 62, 90],
+		21 => [6, 28, 50, 72,  94],
+		22 => [6, 26, 50, 74,  98],
+		23 => [6, 30, 54, 78, 102],
+		24 => [6, 28, 54, 80, 106],
+		25 => [6, 32, 58, 84, 110],
+		26 => [6, 30, 58, 86, 114],
+		27 => [6, 34, 62, 90, 118],
+		28 => [6, 26, 50, 74,  98, 122],
+		29 => [6, 30, 54, 78, 102, 126],
+		30 => [6, 26, 52, 78, 104, 130],
+		31 => [6, 30, 56, 82, 108, 134],
+		32 => [6, 34, 60, 86, 112, 138],
+		33 => [6, 30, 58, 86, 114, 142],
+		34 => [6, 34, 62, 90, 118, 146],
+		35 => [6, 30, 54, 78, 102, 126, 150],
+		36 => [6, 24, 50, 76, 102, 128, 154],
+		37 => [6, 28, 54, 80, 106, 132, 158],
+		38 => [6, 32, 58, 84, 110, 136, 162],
+		39 => [6, 26, 54, 82, 110, 138, 166],
+		40 => [6, 30, 58, 86, 114, 142, 170],
+	];
+
+	/**
+	 * ISO/IEC 18004:2000 Annex D, Table D.1 - Version information bit stream for each version
+	 *
+	 * no version pattern for QR Codes < 7
+	 *
+	 * @var int[]
+	 */
+	protected const versionPattern = [
+		7  => 0b000111110010010100,
+		8  => 0b001000010110111100,
+		9  => 0b001001101010011001,
+		10 => 0b001010010011010011,
+		11 => 0b001011101111110110,
+		12 => 0b001100011101100010,
+		13 => 0b001101100001000111,
+		14 => 0b001110011000001101,
+		15 => 0b001111100100101000,
+		16 => 0b010000101101111000,
+		17 => 0b010001010001011101,
+		18 => 0b010010101000010111,
+		19 => 0b010011010100110010,
+		20 => 0b010100100110100110,
+		21 => 0b010101011010000011,
+		22 => 0b010110100011001001,
+		23 => 0b010111011111101100,
+		24 => 0b011000111011000100,
+		25 => 0b011001000111100001,
+		26 => 0b011010111110101011,
+		27 => 0b011011000010001110,
+		28 => 0b011100110000011010,
+		29 => 0b011101001100111111,
+		30 => 0b011110110101110101,
+		31 => 0b011111001001010000,
+		32 => 0b100000100111010101,
+		33 => 0b100001011011110000,
+		34 => 0b100010100010111010,
+		35 => 0b100011011110011111,
+		36 => 0b100100101100001011,
+		37 => 0b100101010000101110,
+		38 => 0b100110101001100100,
+		39 => 0b100111010101000001,
+		40 => 0b101000110001101001,
+	];
+
+	/**
+	 * ISO/IEC 18004:2000 Section 8.9 - Format Information
+	 *
+	 * ECC level -> mask pattern
+	 *
+	 * @var int[][]
+	 */
+	protected const formatPattern = [
+		[ // L
+			0b111011111000100,
+			0b111001011110011,
+			0b111110110101010,
+			0b111100010011101,
+			0b110011000101111,
+			0b110001100011000,
+			0b110110001000001,
+			0b110100101110110,
+		],
+		[ // M
+			0b101010000010010,
+			0b101000100100101,
+			0b101111001111100,
+			0b101101101001011,
+			0b100010111111001,
+			0b100000011001110,
+			0b100111110010111,
+			0b100101010100000,
+		],
+		[ // Q
+			0b011010101011111,
+			0b011000001101000,
+			0b011111100110001,
+			0b011101000000110,
+			0b010010010110100,
+			0b010000110000011,
+			0b010111011011010,
+			0b010101111101101,
+		],
+		[ // H
+			0b001011010001001,
+			0b001001110111110,
+			0b001110011100111,
+			0b001100111010000,
+			0b000011101100010,
+			0b000001001010101,
+			0b000110100001100,
+			0b000100000111011,
+		],
+	];
+
+	/**
+	 * the current QR Code version number
+	 */
+	protected int $version;
+
+	/**
+	 * the current ECC level
+	 */
+	protected int $eclevel;
+
+	/**
+	 * the used mask pattern, set via QRMatrix::mapData()
+	 */
+	protected int $maskPattern = QRCode::MASK_PATTERN_AUTO;
+
+	/**
+	 * the size (side length) of the matrix
+	 */
+	protected int $moduleCount;
+
+	/**
+	 * the actual matrix data array
+	 *
+	 * @var int[][]
+	 */
+	protected array $matrix;
+
+	/**
+	 * QRMatrix constructor.
+	 *
+	 * @throws \chillerlan\QRCode\Data\QRCodeDataException
+	 */
+	public function __construct(int $version, int $eclevel){
+
+		if(!in_array($version, range(1, 40), true)){
+			throw new QRCodeDataException('invalid QR Code version');
+		}
+
+		if(!array_key_exists($eclevel, QRCode::ECC_MODES)){
+			throw new QRCodeDataException('invalid ecc level');
+		}
+
+		$this->version     = $version;
+		$this->eclevel     = $eclevel;
+		$this->moduleCount = $this->version * 4 + 17;
+		$this->matrix      = array_fill(0, $this->moduleCount, array_fill(0, $this->moduleCount, $this::M_NULL));
+	}
+
+	/**
+	 * shortcut to initialize the matrix
+	 */
+	public function init(int $maskPattern, bool $test = null):QRMatrix{
+		return $this
+			->setFinderPattern()
+			->setSeparators()
+			->setAlignmentPattern()
+			->setTimingPattern()
+			->setVersionNumber($test)
+			->setFormatInfo($maskPattern, $test)
+			->setDarkModule()
+		;
+	}
+
+	/**
+	 * Returns the data matrix, returns a pure boolean representation if $boolean is set to true
+	 *
+	 * @return int[][]|bool[][]
+	 */
+	public function matrix(bool $boolean = false):array{
+
+		if(!$boolean){
+			return $this->matrix;
+		}
+
+		$matrix = [];
+
+		foreach($this->matrix as $y => $row){
+			$matrix[$y] = [];
+
+			foreach($row as $x => $val){
+				$matrix[$y][$x] = ($val >> 8) > 0;
+			}
+		}
+
+		return $matrix;
+	}
+
+	/**
+	 * Returns the current version number
+	 */
+	public function version():int{
+		return $this->version;
+	}
+
+	/**
+	 * Returns the current ECC level
+	 */
+	public function eccLevel():int{
+		return $this->eclevel;
+	}
+
+	/**
+	 * Returns the current mask pattern
+	 */
+	public function maskPattern():int{
+		return $this->maskPattern;
+	}
+
+	/**
+	 * Returns the absoulute size of the matrix, including quiet zone (after setting it).
+	 *
+	 * size = version * 4 + 17 [ + 2 * quietzone size]
+	 */
+	public function size():int{
+		return $this->moduleCount;
+	}
+
+	/**
+	 * Returns the value of the module at position [$x, $y]
+	 */
+	public function get(int $x, int $y):int{
+		return $this->matrix[$y][$x];
+	}
+
+	/**
+	 * Sets the $M_TYPE value for the module at position [$x, $y]
+	 *
+	 *   true  => $M_TYPE << 8
+	 *   false => $M_TYPE
+	 */
+	public function set(int $x, int $y, bool $value, int $M_TYPE):QRMatrix{
+		$this->matrix[$y][$x] = $M_TYPE << ($value ? 8 : 0);
+
+		return $this;
+	}
+
+	/**
+	 * Checks whether a module is true (dark) or false (light)
+	 *
+	 *   true  => $value >> 8 === $M_TYPE
+	 *            $value >> 8 > 0
+	 *
+	 *   false => $value === $M_TYPE
+	 *            $value >> 8 === 0
+	 */
+	public function check(int $x, int $y):bool{
+		return ($this->matrix[$y][$x] >> 8) > 0;
+	}
+
+
+	/**
+	 * Sets the "dark module", that is always on the same position 1x1px away from the bottom left finder
+	 */
+	public function setDarkModule():QRMatrix{
+		$this->set(8, 4 * $this->version + 9, true, $this::M_DARKMODULE);
+
+		return $this;
+	}
+
+	/**
+	 * Draws the 7x7 finder patterns in the corners top left/right and bottom left
+	 *
+	 * ISO/IEC 18004:2000 Section 7.3.2
+	 */
+	public function setFinderPattern():QRMatrix{
+
+		$pos = [
+			[0, 0], // top left
+			[$this->moduleCount - 7, 0], // bottom left
+			[0, $this->moduleCount - 7], // top right
+		];
+
+		foreach($pos as $c){
+			for($y = 0; $y < 7; $y++){
+				for($x = 0; $x < 7; $x++){
+					// outer (dark) 7*7 square
+					if($x === 0 || $x === 6 || $y === 0 || $y === 6){
+						$this->set($c[0] + $y, $c[1] + $x, true, $this::M_FINDER);
+					}
+					// inner (light) 5*5 square
+					elseif($x === 1 || $x === 5 || $y === 1 || $y === 5){
+						$this->set($c[0] + $y, $c[1] + $x, false, $this::M_FINDER);
+					}
+					// 3*3 dot
+					else{
+						$this->set($c[0] + $y, $c[1] + $x, true, $this::M_FINDER_DOT);
+					}
+				}
+			}
+		}
+
+		return $this;
+	}
+
+	/**
+	 * Draws the separator lines around the finder patterns
+	 *
+	 * ISO/IEC 18004:2000 Section 7.3.3
+	 */
+	public function setSeparators():QRMatrix{
+
+		$h = [
+			[7, 0],
+			[$this->moduleCount - 8, 0],
+			[7, $this->moduleCount - 8],
+		];
+
+		$v = [
+			[7, 7],
+			[$this->moduleCount - 1, 7],
+			[7, $this->moduleCount - 8],
+		];
+
+		for($c = 0; $c < 3; $c++){
+			for($i = 0; $i < 8; $i++){
+				$this->set($h[$c][0]     , $h[$c][1] + $i, false, $this::M_SEPARATOR);
+				$this->set($v[$c][0] - $i, $v[$c][1]     , false, $this::M_SEPARATOR);
+			}
+		}
+
+		return $this;
+	}
+
+
+	/**
+	 * Draws the 5x5 alignment patterns
+	 *
+	 * ISO/IEC 18004:2000 Section 7.3.5
+	 */
+	public function setAlignmentPattern():QRMatrix{
+
+		foreach($this::alignmentPattern[$this->version] as $y){
+			foreach($this::alignmentPattern[$this->version] as $x){
+
+				// skip existing patterns
+				if($this->matrix[$y][$x] !== $this::M_NULL){
+					continue;
+				}
+
+				for($ry = -2; $ry <= 2; $ry++){
+					for($rx = -2; $rx <= 2; $rx++){
+						$v = ($ry === 0 && $rx === 0) || $ry === 2 || $ry === -2 || $rx === 2 || $rx === -2;
+
+						$this->set($x + $rx, $y + $ry, $v, $this::M_ALIGNMENT);
+					}
+				}
+
+			}
+		}
+
+		return $this;
+	}
+
+
+	/**
+	 * Draws the timing pattern (h/v checkered line between the finder patterns)
+	 *
+	 * ISO/IEC 18004:2000 Section 7.3.4
+	 */
+	public function setTimingPattern():QRMatrix{
+
+		foreach(range(8, $this->moduleCount - 8 - 1) as $i){
+
+			if($this->matrix[6][$i] !== $this::M_NULL || $this->matrix[$i][6] !== $this::M_NULL){
+				continue;
+			}
+
+			$v = $i % 2 === 0;
+
+			$this->set($i, 6, $v, $this::M_TIMING); // h
+			$this->set(6, $i, $v, $this::M_TIMING); // v
+		}
+
+		return $this;
+	}
+
+	/**
+	 * Draws the version information, 2x 3x6 pixel
+	 *
+	 * ISO/IEC 18004:2000 Section 8.10
+	 */
+	public function setVersionNumber(bool $test = null):QRMatrix{
+		$bits = $this::versionPattern[$this->version] ?? false;
+
+		if($bits !== false){
+
+			for($i = 0; $i < 18; $i++){
+				$a = (int)floor($i / 3);
+				$b = $i % 3 + $this->moduleCount - 8 - 3;
+				$v = !$test && (($bits >> $i) & 1) === 1;
+
+				$this->set($b, $a, $v, $this::M_VERSION); // ne
+				$this->set($a, $b, $v, $this::M_VERSION); // sw
+			}
+
+		}
+
+		return $this;
+	}
+
+	/**
+	 * Draws the format info along the finder patterns
+	 *
+	 * ISO/IEC 18004:2000 Section 8.9
+	 */
+	public function setFormatInfo(int $maskPattern, bool $test = null):QRMatrix{
+		$bits = $this::formatPattern[QRCode::ECC_MODES[$this->eclevel]][$maskPattern] ?? 0;
+
+		for($i = 0; $i < 15; $i++){
+			$v = !$test && (($bits >> $i) & 1) === 1;
+
+			if($i < 6){
+				$this->set(8, $i, $v, $this::M_FORMAT);
+			}
+			elseif($i < 8){
+				$this->set(8, $i + 1, $v, $this::M_FORMAT);
+			}
+			else{
+				$this->set(8, $this->moduleCount - 15 + $i, $v, $this::M_FORMAT);
+			}
+
+			if($i < 8){
+				$this->set($this->moduleCount - $i - 1, 8, $v, $this::M_FORMAT);
+			}
+			elseif($i < 9){
+				$this->set(15 - $i, 8, $v, $this::M_FORMAT);
+			}
+			else{
+				$this->set(15 - $i - 1, 8, $v, $this::M_FORMAT);
+			}
+
+		}
+
+		$this->set(8, $this->moduleCount - 8, !$test, $this::M_FORMAT);
+
+		return $this;
+	}
+
+	/**
+	 * Draws the "quiet zone" of $size around the matrix
+	 *
+	 * ISO/IEC 18004:2000 Section 7.3.7
+	 *
+	 * @throws \chillerlan\QRCode\Data\QRCodeDataException
+	 */
+	public function setQuietZone(int $size = null):QRMatrix{
+
+		if($this->matrix[$this->moduleCount - 1][$this->moduleCount - 1] === $this::M_NULL){
+			throw new QRCodeDataException('use only after writing data');
+		}
+
+		$size = $size !== null
+			? max(0, min($size, floor($this->moduleCount / 2)))
+			: 4;
+
+		for($y = 0; $y < $this->moduleCount; $y++){
+			for($i = 0; $i < $size; $i++){
+				array_unshift($this->matrix[$y], $this::M_QUIETZONE);
+				array_push($this->matrix[$y], $this::M_QUIETZONE);
+			}
+		}
+
+		$this->moduleCount += ($size * 2);
+
+		$r = array_fill(0, $this->moduleCount, $this::M_QUIETZONE);
+
+		for($i = 0; $i < $size; $i++){
+			array_unshift($this->matrix, $r);
+			array_push($this->matrix, $r);
+		}
+
+		return $this;
+	}
+
+	/**
+	 * Clears a space of $width * $height in order to add a logo or text.
+	 *
+	 * Additionally, the logo space can be positioned within the QR Code - respecting the main functional patterns -
+	 * using $startX and $startY. If either of these are null, the logo space will be centered in that direction.
+	 * ECC level "H" (30%) is required.
+	 *
+	 * Please note that adding a logo space minimizes the error correction capacity of the QR Code and
+	 * created images may become unreadable, especially when printed with a chance to receive damage.
+	 * Please test thoroughly before using this feature in production.
+	 *
+	 * This method should be called from within an output module (after the matrix has been filled with data).
+	 * Note that there is no restiction on how many times this method could be called on the same matrix instance.
+	 *
+	 * @link https://github.com/chillerlan/php-qrcode/issues/52
+	 *
+	 * @throws \chillerlan\QRCode\Data\QRCodeDataException
+	 */
+	public function setLogoSpace(int $width, int $height, int $startX = null, int $startY = null):QRMatrix{
+
+		// for logos we operate in ECC H (30%) only
+		if($this->eclevel !== QRCode::ECC_H){
+			throw new QRCodeDataException('ECC level "H" required to add logo space');
+		}
+
+		// we need uneven sizes to center the logo space, adjust if needed
+		if($startX === null && ($width % 2) === 0){
+			$width++;
+		}
+
+		if($startY === null && ($height % 2) === 0){
+			$height++;
+		}
+
+		// $this->moduleCount includes the quiet zone (if created), we need the QR size here
+		$length = $this->version * 4 + 17;
+
+		// throw if the logo space exceeds the maximum error correction capacity
+		if($width * $height > floor($length * $length * 0.2)){
+			throw new QRCodeDataException('logo space exceeds the maximum error correction capacity');
+		}
+
+		// quiet zone size
+		$qz    = ($this->moduleCount - $length) / 2;
+		// skip quiet zone and the first 9 rows/columns (finder-, mode-, version- and timing patterns)
+		$start = $qz + 9;
+		// skip quiet zone
+		$end   = $this->moduleCount - $qz;
+
+		// determine start coordinates
+		$startX = ($startX !== null ? $startX : ($length - $width) / 2) + $qz;
+		$startY = ($startY !== null ? $startY : ($length - $height) / 2) + $qz;
+
+		// clear the space
+		foreach($this->matrix as $y => $row){
+			foreach($row as $x => $val){
+				// out of bounds, skip
+				if($x < $start || $y < $start ||$x >= $end || $y >= $end){
+					continue;
+				}
+				// a match
+				if($x >= $startX && $x < ($startX + $width) && $y >= $startY && $y < ($startY + $height)){
+					$this->set($x, $y, false, $this::M_LOGO);
+				}
+			}
+		}
+
+		return $this;
+	}
+
+	/**
+	 * Maps the binary $data array from QRDataInterface::maskECC() on the matrix,
+	 * masking the data using $maskPattern (ISO/IEC 18004:2000 Section 8.8)
+	 *
+	 * @see \chillerlan\QRCode\Data\QRDataAbstract::maskECC()
+	 *
+	 * @param int[] $data
+	 * @param int   $maskPattern
+	 *
+	 * @return \chillerlan\QRCode\Data\QRMatrix
+	 */
+	public function mapData(array $data, int $maskPattern):QRMatrix{
+		$this->maskPattern = $maskPattern;
+		$byteCount         = count($data);
+		$y                 = $this->moduleCount - 1;
+		$inc               = -1;
+		$byteIndex         = 0;
+		$bitIndex          = 7;
+		$mask              = $this->getMask($this->maskPattern);
+
+		for($i = $y; $i > 0; $i -= 2){
+
+			if($i === 6){
+				$i--;
+			}
+
+			while(true){
+				for($c = 0; $c < 2; $c++){
+					$x = $i - $c;
+
+					if($this->matrix[$y][$x] === $this::M_NULL){
+						$v = false;
+
+						if($byteIndex < $byteCount){
+							$v = (($data[$byteIndex] >> $bitIndex) & 1) === 1;
+						}
+
+						if($mask($x, $y) === 0){
+							$v = !$v;
+						}
+
+						$this->matrix[$y][$x] = $this::M_DATA << ($v ? 8 : 0);
+						$bitIndex--;
+
+						if($bitIndex === -1){
+							$byteIndex++;
+							$bitIndex = 7;
+						}
+
+					}
+				}
+
+				$y += $inc;
+
+				if($y < 0 || $this->moduleCount <= $y){
+					$y   -=  $inc;
+					$inc  = -$inc;
+
+					break;
+				}
+
+			}
+		}
+
+		return $this;
+	}
+
+	/**
+	 * ISO/IEC 18004:2000 Section 8.8.1
+	 *
+	 * Note that some versions of the QR code standard have had errors in the section about mask patterns.
+	 * The information below has been corrected. (https://www.thonky.com/qr-code-tutorial/mask-patterns)
+	 *
+	 * @see \chillerlan\QRCode\QRMatrix::mapData()
+	 *
+	 * @internal
+	 *
+	 * @throws \chillerlan\QRCode\Data\QRCodeDataException
+	 */
+	protected function getMask(int $maskPattern):Closure{
+
+		if((0b111 & $maskPattern) !== $maskPattern){
+			throw new QRCodeDataException('invalid mask pattern'); // @codeCoverageIgnore
+		}
+
+		return [
+			0b000 => fn($x, $y):int => ($x + $y) % 2,
+			0b001 => fn($x, $y):int => $y % 2,
+			0b010 => fn($x, $y):int => $x % 3,
+			0b011 => fn($x, $y):int => ($x + $y) % 3,
+			0b100 => fn($x, $y):int => ((int)($y / 2) + (int)($x / 3)) % 2,
+			0b101 => fn($x, $y):int => (($x * $y) % 2) + (($x * $y) % 3),
+			0b110 => fn($x, $y):int => ((($x * $y) % 2) + (($x * $y) % 3)) % 2,
+			0b111 => fn($x, $y):int => ((($x * $y) % 3) + (($x + $y) % 2)) % 2,
+		][$maskPattern];
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Helpers/BitBuffer.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Helpers/BitBuffer.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Helpers/BitBuffer.php	(revision 8427)
@@ -0,0 +1,89 @@
+<?php
+/**
+ * Class BitBuffer
+ *
+ * @filesource   BitBuffer.php
+ * @created      25.11.2015
+ * @package      chillerlan\QRCode\Helpers
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2015 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCode\Helpers;
+
+use function count, floor;
+
+/**
+ * Holds the raw binary data
+ */
+final class BitBuffer{
+
+	/**
+	 * The buffer content
+	 *
+	 * @var int[]
+	 */
+	protected array $buffer = [];
+
+	/**
+	 * Length of the content (bits)
+	 */
+	protected int $length = 0;
+
+	/**
+	 * clears the buffer
+	 */
+	public function clear():BitBuffer{
+		$this->buffer = [];
+		$this->length = 0;
+
+		return $this;
+	}
+
+	/**
+	 * appends a sequence of bits
+	 */
+	public function put(int $num, int $length):BitBuffer{
+
+		for($i = 0; $i < $length; $i++){
+			$this->putBit((($num >> ($length - $i - 1)) & 1) === 1);
+		}
+
+		return $this;
+	}
+
+	/**
+	 * appends a single bit
+	 */
+	public function putBit(bool $bit):BitBuffer{
+		$bufIndex = floor($this->length / 8);
+
+		if(count($this->buffer) <= $bufIndex){
+			$this->buffer[] = 0;
+		}
+
+		if($bit === true){
+			$this->buffer[(int)$bufIndex] |= (0x80 >> ($this->length % 8));
+		}
+
+		$this->length++;
+
+		return $this;
+	}
+
+	/**
+	 * returns the current buffer length
+	 */
+	public function getLength():int{
+		return $this->length;
+	}
+
+	/**
+	 * returns the buffer content
+	 */
+	public function getBuffer():array{
+		return $this->buffer;
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Helpers/Polynomial.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Helpers/Polynomial.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Helpers/Polynomial.php	(revision 8427)
@@ -0,0 +1,178 @@
+<?php
+/**
+ * Class Polynomial
+ *
+ * @filesource   Polynomial.php
+ * @created      25.11.2015
+ * @package      chillerlan\QRCode\Helpers
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2015 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCode\Helpers;
+
+use chillerlan\QRCode\QRCodeException;
+
+use function array_fill, count, sprintf;
+
+/**
+ * Polynomial long division helpers
+ *
+ * @see http://www.thonky.com/qr-code-tutorial/error-correction-coding
+ */
+final class Polynomial{
+
+	/**
+	 * @see http://www.thonky.com/qr-code-tutorial/log-antilog-table
+	 */
+	protected const table = [
+		[  1,   0], [  2,   0], [  4,   1], [  8,  25], [ 16,   2], [ 32,  50], [ 64,  26], [128, 198],
+		[ 29,   3], [ 58, 223], [116,  51], [232, 238], [205,  27], [135, 104], [ 19, 199], [ 38,  75],
+		[ 76,   4], [152, 100], [ 45, 224], [ 90,  14], [180,  52], [117, 141], [234, 239], [201, 129],
+		[143,  28], [  3, 193], [  6, 105], [ 12, 248], [ 24, 200], [ 48,   8], [ 96,  76], [192, 113],
+		[157,   5], [ 39, 138], [ 78, 101], [156,  47], [ 37, 225], [ 74,  36], [148,  15], [ 53,  33],
+		[106,  53], [212, 147], [181, 142], [119, 218], [238, 240], [193,  18], [159, 130], [ 35,  69],
+		[ 70,  29], [140, 181], [  5, 194], [ 10, 125], [ 20, 106], [ 40,  39], [ 80, 249], [160, 185],
+		[ 93, 201], [186, 154], [105,   9], [210, 120], [185,  77], [111, 228], [222, 114], [161, 166],
+		[ 95,   6], [190, 191], [ 97, 139], [194,  98], [153, 102], [ 47, 221], [ 94,  48], [188, 253],
+		[101, 226], [202, 152], [137,  37], [ 15, 179], [ 30,  16], [ 60, 145], [120,  34], [240, 136],
+		[253,  54], [231, 208], [211, 148], [187, 206], [107, 143], [214, 150], [177, 219], [127, 189],
+		[254, 241], [225, 210], [223,  19], [163,  92], [ 91, 131], [182,  56], [113,  70], [226,  64],
+		[217,  30], [175,  66], [ 67, 182], [134, 163], [ 17, 195], [ 34,  72], [ 68, 126], [136, 110],
+		[ 13, 107], [ 26,  58], [ 52,  40], [104,  84], [208, 250], [189, 133], [103, 186], [206,  61],
+		[129, 202], [ 31,  94], [ 62, 155], [124, 159], [248,  10], [237,  21], [199, 121], [147,  43],
+		[ 59,  78], [118, 212], [236, 229], [197, 172], [151, 115], [ 51, 243], [102, 167], [204,  87],
+		[133,   7], [ 23, 112], [ 46, 192], [ 92, 247], [184, 140], [109, 128], [218,  99], [169,  13],
+		[ 79, 103], [158,  74], [ 33, 222], [ 66, 237], [132,  49], [ 21, 197], [ 42, 254], [ 84,  24],
+		[168, 227], [ 77, 165], [154, 153], [ 41, 119], [ 82,  38], [164, 184], [ 85, 180], [170, 124],
+		[ 73,  17], [146,  68], [ 57, 146], [114, 217], [228,  35], [213,  32], [183, 137], [115,  46],
+		[230,  55], [209,  63], [191, 209], [ 99,  91], [198, 149], [145, 188], [ 63, 207], [126, 205],
+		[252, 144], [229, 135], [215, 151], [179, 178], [123, 220], [246, 252], [241, 190], [255,  97],
+		[227, 242], [219,  86], [171, 211], [ 75, 171], [150,  20], [ 49,  42], [ 98,  93], [196, 158],
+		[149, 132], [ 55,  60], [110,  57], [220,  83], [165,  71], [ 87, 109], [174,  65], [ 65, 162],
+		[130,  31], [ 25,  45], [ 50,  67], [100, 216], [200, 183], [141, 123], [  7, 164], [ 14, 118],
+		[ 28, 196], [ 56,  23], [112,  73], [224, 236], [221, 127], [167,  12], [ 83, 111], [166, 246],
+		[ 81, 108], [162, 161], [ 89,  59], [178,  82], [121,  41], [242, 157], [249,  85], [239, 170],
+		[195, 251], [155,  96], [ 43, 134], [ 86, 177], [172, 187], [ 69, 204], [138,  62], [  9,  90],
+		[ 18, 203], [ 36,  89], [ 72,  95], [144, 176], [ 61, 156], [122, 169], [244, 160], [245,  81],
+		[247,  11], [243, 245], [251,  22], [235, 235], [203, 122], [139, 117], [ 11,  44], [ 22, 215],
+		[ 44,  79], [ 88, 174], [176, 213], [125, 233], [250, 230], [233, 231], [207, 173], [131, 232],
+		[ 27, 116], [ 54, 214], [108, 244], [216, 234], [173, 168], [ 71,  80], [142,  88], [  1, 175],
+	];
+
+	/**
+	 * @var int[]
+	 */
+	protected array $num = [];
+
+	/**
+	 * Polynomial constructor.
+	 */
+	public function __construct(array $num = null, int $shift = null){
+		$this->setNum($num ?? [1], $shift);
+	}
+
+	/**
+	 *
+	 */
+	public function getNum():array{
+		return $this->num;
+	}
+
+	/**
+	 * @param int[]    $num
+	 * @param int|null $shift
+	 *
+	 * @return \chillerlan\QRCode\Helpers\Polynomial
+	 */
+	public function setNum(array $num, int $shift = null):Polynomial{
+		$offset = 0;
+		$numCount = count($num);
+
+		while($offset < $numCount && $num[$offset] === 0){
+			$offset++;
+		}
+
+		$this->num = array_fill(0, $numCount - $offset + ($shift ?? 0), 0);
+
+		for($i = 0; $i < $numCount - $offset; $i++){
+			$this->num[$i] = $num[$i + $offset];
+		}
+
+		return $this;
+	}
+
+	/**
+	 * @param int[] $e
+	 *
+	 * @return \chillerlan\QRCode\Helpers\Polynomial
+	 */
+	public function multiply(array $e):Polynomial{
+		$n = array_fill(0, count($this->num) + count($e) - 1, 0);
+
+		foreach($this->num as $i => $vi){
+			$vi = $this->glog($vi);
+
+			foreach($e as $j => $vj){
+				$n[$i + $j] ^= $this->gexp($vi + $this->glog($vj));
+			}
+
+		}
+
+		$this->setNum($n);
+
+		return $this;
+	}
+
+	/**
+	 * @param int[] $e
+	 *
+	 * @return \chillerlan\QRCode\Helpers\Polynomial
+	 */
+	public function mod(array $e):Polynomial{
+		$n = $this->num;
+
+		if(count($n) - count($e) < 0){
+			return $this;
+		}
+
+		$ratio = $this->glog($n[0]) - $this->glog($e[0]);
+
+		foreach($e as $i => $v){
+			$n[$i] ^= $this->gexp($this->glog($v) + $ratio);
+		}
+
+		$this->setNum($n)->mod($e);
+
+		return $this;
+	}
+
+	/**
+	 * @throws \chillerlan\QRCode\QRCodeException
+	 */
+	public function glog(int $n):int{
+
+		if($n < 1){
+			throw new QRCodeException(sprintf('log(%s)', $n));
+		}
+
+		return Polynomial::table[$n][1];
+	}
+
+	/**
+	 *
+	 */
+	public function gexp(int $n):int{
+
+		if($n < 0){
+			$n += 255;
+		}
+		elseif($n >= 256){
+			$n -= 255;
+		}
+
+		return Polynomial::table[$n][0];
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Output/QRCodeOutputException.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Output/QRCodeOutputException.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Output/QRCodeOutputException.php	(revision 8427)
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Class QRCodeOutputException
+ *
+ * @filesource   QRCodeOutputException.php
+ * @created      09.12.2015
+ * @package      chillerlan\QRCode\Output
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2015 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCode\Output;
+
+use chillerlan\QRCode\QRCodeException;
+
+class QRCodeOutputException extends QRCodeException{}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Output/QRFpdf.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Output/QRFpdf.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Output/QRFpdf.php	(revision 8427)
@@ -0,0 +1,113 @@
+<?php
+/**
+ * Class QRFpdf
+ *
+ * https://github.com/chillerlan/php-qrcode/pull/49
+ *
+ * @filesource   QRFpdf.php
+ * @created      03.06.2020
+ * @package      chillerlan\QRCode\Output
+ * @author       Maximilian Kresse
+ *
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCode\Output;
+
+use chillerlan\QRCode\Data\QRMatrix;
+use chillerlan\QRCode\QRCodeException;
+use chillerlan\Settings\SettingsContainerInterface;
+use FPDF;
+
+use function array_values, class_exists, count, is_array;
+
+/**
+ * QRFpdf output module (requires fpdf)
+ *
+ * @see https://github.com/Setasign/FPDF
+ * @see http://www.fpdf.org/
+ */
+class QRFpdf extends QROutputAbstract{
+
+	public function __construct(SettingsContainerInterface $options, QRMatrix $matrix){
+
+		if(!class_exists(FPDF::class)){
+			// @codeCoverageIgnoreStart
+			throw new QRCodeException(
+				'The QRFpdf output requires FPDF as dependency but the class "\FPDF" couldn\'t be found.'
+			);
+			// @codeCoverageIgnoreEnd
+		}
+
+		parent::__construct($options, $matrix);
+	}
+
+	/**
+	 * @inheritDoc
+	 */
+	protected function setModuleValues():void{
+
+		foreach($this::DEFAULT_MODULE_VALUES as $M_TYPE => $defaultValue){
+			$v = $this->options->moduleValues[$M_TYPE] ?? null;
+
+			if(!is_array($v) || count($v) < 3){
+				$this->moduleValues[$M_TYPE] = $defaultValue
+					? [0, 0, 0]
+					: [255, 255, 255];
+			}
+			else{
+				$this->moduleValues[$M_TYPE] = array_values($v);
+			}
+
+		}
+
+	}
+
+	/**
+	 * @inheritDoc
+	 *
+	 * @return string|\FPDF
+	 */
+	public function dump(string $file = null){
+		$file ??= $this->options->cachefile;
+
+		$fpdf = new FPDF('P', $this->options->fpdfMeasureUnit, [$this->length, $this->length]);
+		$fpdf->AddPage();
+
+		$prevColor = null;
+
+		foreach($this->matrix->matrix() as $y => $row){
+
+			foreach($row as $x => $M_TYPE){
+				/** @var int $M_TYPE */
+				$color = $this->moduleValues[$M_TYPE];
+
+				if($prevColor === null || $prevColor !== $color){
+					/** @phan-suppress-next-line PhanParamTooFewUnpack */
+					$fpdf->SetFillColor(...$color);
+					$prevColor = $color;
+				}
+
+				$fpdf->Rect($x * $this->scale, $y * $this->scale, 1 * $this->scale, 1 * $this->scale, 'F');
+			}
+
+		}
+
+		if($this->options->returnResource){
+			return $fpdf;
+		}
+
+		$pdfData = $fpdf->Output('S');
+
+		if($file !== null){
+			$this->saveToFile($pdfData, $file);
+		}
+
+		if($this->options->imageBase64){
+			$pdfData = sprintf('data:application/pdf;base64,%s', base64_encode($pdfData));
+		}
+
+		return $pdfData;
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Output/QRImage.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Output/QRImage.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Output/QRImage.php	(revision 8427)
@@ -0,0 +1,217 @@
+<?php
+/**
+ * Class QRImage
+ *
+ * @filesource   QRImage.php
+ * @created      05.12.2015
+ * @package      chillerlan\QRCode\Output
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2015 Smiley
+ * @license      MIT
+ *
+ * @noinspection PhpComposerExtensionStubsInspection
+ */
+
+namespace chillerlan\QRCode\Output;
+
+use chillerlan\QRCode\Data\QRMatrix;
+use chillerlan\QRCode\{QRCode, QRCodeException};
+use chillerlan\Settings\SettingsContainerInterface;
+use Exception;
+
+use function array_values, base64_encode, call_user_func, count, extension_loaded, imagecolorallocate, imagecolortransparent,
+	imagecreatetruecolor, imagedestroy, imagefilledrectangle, imagegif, imagejpeg, imagepng, in_array,
+	is_array, ob_end_clean, ob_get_contents, ob_start, range, sprintf;
+
+/**
+ * Converts the matrix into GD images, raw or base64 output (requires ext-gd)
+ *
+ * @see http://php.net/manual/book.image.php
+ */
+class QRImage extends QROutputAbstract{
+
+	/**
+	 * GD image types that support transparency
+	 *
+	 * @var string[]
+	 */
+	protected const TRANSPARENCY_TYPES = [
+		QRCode::OUTPUT_IMAGE_PNG,
+		QRCode::OUTPUT_IMAGE_GIF,
+	];
+
+	protected string $defaultMode = QRCode::OUTPUT_IMAGE_PNG;
+
+	/**
+	 * The GD image resource
+	 *
+	 * @see imagecreatetruecolor()
+	 * @var resource|\GdImage
+	 *
+	 * @phan-suppress PhanUndeclaredTypeProperty
+	 */
+	protected $image;
+
+	/**
+	 * @inheritDoc
+	 *
+	 * @throws \chillerlan\QRCode\QRCodeException
+	 */
+	public function __construct(SettingsContainerInterface $options, QRMatrix $matrix){
+
+		if(!extension_loaded('gd')){
+			throw new QRCodeException('ext-gd not loaded'); // @codeCoverageIgnore
+		}
+
+		parent::__construct($options, $matrix);
+	}
+
+	/**
+	 * @inheritDoc
+	 */
+	protected function setModuleValues():void{
+
+		foreach($this::DEFAULT_MODULE_VALUES as $M_TYPE => $defaultValue){
+			$v = $this->options->moduleValues[$M_TYPE] ?? null;
+
+			if(!is_array($v) || count($v) < 3){
+				$this->moduleValues[$M_TYPE] = $defaultValue
+					? [0, 0, 0]
+					: [255, 255, 255];
+			}
+			else{
+				$this->moduleValues[$M_TYPE] = array_values($v);
+			}
+
+		}
+
+	}
+
+	/**
+	 * @inheritDoc
+	 *
+	 * @return string|resource|\GdImage
+	 *
+	 * @phan-suppress PhanUndeclaredTypeReturnType, PhanTypeMismatchReturn
+	 */
+	public function dump(string $file = null){
+		$file ??= $this->options->cachefile;
+
+		$this->image = imagecreatetruecolor($this->length, $this->length);
+
+		// avoid: Indirect modification of overloaded property $imageTransparencyBG has no effect
+		// https://stackoverflow.com/a/10455217
+		$tbg        = $this->options->imageTransparencyBG;
+		/** @phan-suppress-next-line PhanParamTooFewInternalUnpack */
+		$background = imagecolorallocate($this->image, ...$tbg);
+
+		if((bool)$this->options->imageTransparent && in_array($this->options->outputType, $this::TRANSPARENCY_TYPES, true)){
+			imagecolortransparent($this->image, $background);
+		}
+
+		imagefilledrectangle($this->image, 0, 0, $this->length, $this->length, $background);
+
+		foreach($this->matrix->matrix() as $y => $row){
+			foreach($row as $x => $M_TYPE){
+				$this->setPixel($x, $y, $this->moduleValues[$M_TYPE]);
+			}
+		}
+
+		if($this->options->returnResource){
+			return $this->image;
+		}
+
+		$imageData = $this->dumpImage();
+
+		if($file !== null){
+			$this->saveToFile($imageData, $file);
+		}
+
+		if($this->options->imageBase64){
+			$imageData = sprintf('data:image/%s;base64,%s', $this->options->outputType, base64_encode($imageData));
+		}
+
+		return $imageData;
+	}
+
+	/**
+	 * Creates a single QR pixel with the given settings
+	 */
+	protected function setPixel(int $x, int $y, array $rgb):void{
+		imagefilledrectangle(
+			$this->image,
+			$x * $this->scale,
+			$y * $this->scale,
+			($x + 1) * $this->scale,
+			($y + 1) * $this->scale,
+			/** @phan-suppress-next-line PhanParamTooFewInternalUnpack */
+			imagecolorallocate($this->image, ...$rgb)
+		);
+	}
+
+	/**
+	 * Creates the final image by calling the desired GD output function
+	 *
+	 * @throws \chillerlan\QRCode\Output\QRCodeOutputException
+	 */
+	protected function dumpImage():string{
+		ob_start();
+
+		try{
+			call_user_func([$this, $this->outputMode ?? $this->defaultMode]);
+		}
+		// not going to cover edge cases
+		// @codeCoverageIgnoreStart
+		catch(Exception $e){
+			throw new QRCodeOutputException($e->getMessage());
+		}
+		// @codeCoverageIgnoreEnd
+
+		$imageData = ob_get_contents();
+		imagedestroy($this->image);
+
+		ob_end_clean();
+
+		return $imageData;
+	}
+
+	/**
+	 * PNG output
+	 *
+	 * @return void
+	 */
+	protected function png():void{
+		imagepng(
+			$this->image,
+			null,
+			in_array($this->options->pngCompression, range(-1, 9), true)
+				? $this->options->pngCompression
+				: -1
+		);
+	}
+
+	/**
+	 * Jiff - like... JitHub!
+	 *
+	 * @return void
+	 */
+	protected function gif():void{
+		imagegif($this->image);
+	}
+
+	/**
+	 * JPG output
+	 *
+	 * @return void
+	 */
+	protected function jpg():void{
+		imagejpeg(
+			$this->image,
+			null,
+			in_array($this->options->jpegQuality, range(0, 100), true)
+				? $this->options->jpegQuality
+				: 85
+		);
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Output/QRImagick.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Output/QRImagick.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Output/QRImagick.php	(revision 8427)
@@ -0,0 +1,119 @@
+<?php
+/**
+ * Class QRImagick
+ *
+ * @filesource   QRImagick.php
+ * @created      04.07.2018
+ * @package      chillerlan\QRCode\Output
+ * @author       smiley <smiley@chillerlan.net>
+ * @copyright    2018 smiley
+ * @license      MIT
+ *
+ * @noinspection PhpComposerExtensionStubsInspection
+ */
+
+namespace chillerlan\QRCode\Output;
+
+use chillerlan\QRCode\Data\QRMatrix;
+use chillerlan\QRCode\QRCodeException;
+use chillerlan\Settings\SettingsContainerInterface;
+use Imagick, ImagickDraw, ImagickPixel;
+
+use function extension_loaded, is_string;
+
+/**
+ * ImageMagick output module (requires ext-imagick)
+ *
+ * @see http://php.net/manual/book.imagick.php
+ * @see http://phpimagick.com
+ */
+class QRImagick extends QROutputAbstract{
+
+	protected Imagick $imagick;
+
+	/**
+	 * @inheritDoc
+	 */
+	public function __construct(SettingsContainerInterface $options, QRMatrix $matrix){
+
+		if(!extension_loaded('imagick')){
+			throw new QRCodeException('ext-imagick not loaded'); // @codeCoverageIgnore
+		}
+
+		parent::__construct($options, $matrix);
+	}
+
+	/**
+	 * @inheritDoc
+	 */
+	protected function setModuleValues():void{
+
+		foreach($this::DEFAULT_MODULE_VALUES as $type => $defaultValue){
+			$v = $this->options->moduleValues[$type] ?? null;
+
+			if(!is_string($v)){
+				$this->moduleValues[$type] = $defaultValue
+					? new ImagickPixel($this->options->markupDark)
+					: new ImagickPixel($this->options->markupLight);
+			}
+			else{
+				$this->moduleValues[$type] = new ImagickPixel($v);
+			}
+		}
+	}
+
+	/**
+	 * @inheritDoc
+	 *
+	 * @return string|\Imagick
+	 */
+	public function dump(string $file = null){
+		$file ??= $this->options->cachefile;
+		$this->imagick = new Imagick;
+
+		$this->imagick->newImage(
+			$this->length,
+			$this->length,
+			new ImagickPixel($this->options->imagickBG ?? 'transparent'),
+			$this->options->imagickFormat
+		);
+
+		$this->drawImage();
+
+		if($this->options->returnResource){
+			return $this->imagick;
+		}
+
+		$imageData = $this->imagick->getImageBlob();
+
+		if($file !== null){
+			$this->saveToFile($imageData, $file);
+		}
+
+		return $imageData;
+	}
+
+	/**
+	 * Creates the QR image via ImagickDraw
+	 */
+	protected function drawImage():void{
+		$draw = new ImagickDraw;
+
+		foreach($this->matrix->matrix() as $y => $row){
+			foreach($row as $x => $M_TYPE){
+				$draw->setStrokeColor($this->moduleValues[$M_TYPE]);
+				$draw->setFillColor($this->moduleValues[$M_TYPE]);
+				$draw->rectangle(
+					$x * $this->scale,
+					$y * $this->scale,
+					($x + 1) * $this->scale,
+					($y + 1) * $this->scale
+				);
+
+			}
+		}
+
+		$this->imagick->drawImage($draw);
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Output/QRMarkup.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Output/QRMarkup.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Output/QRMarkup.php	(revision 8427)
@@ -0,0 +1,160 @@
+<?php
+/**
+ * Class QRMarkup
+ *
+ * @filesource   QRMarkup.php
+ * @created      17.12.2016
+ * @package      chillerlan\QRCode\Output
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2016 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCode\Output;
+
+use chillerlan\QRCode\QRCode;
+
+use function is_string, sprintf, strip_tags, trim;
+
+/**
+ * Converts the matrix into markup types: HTML, SVG, ...
+ */
+class QRMarkup extends QROutputAbstract{
+
+	protected string $defaultMode = QRCode::OUTPUT_MARKUP_SVG;
+
+	/**
+	 * @see \sprintf()
+	 */
+	protected string $svgHeader = '<svg xmlns="http://www.w3.org/2000/svg" class="qr-svg %1$s" '.
+	                              'style="width: 100%%; height: auto;" viewBox="0 0 %2$d %2$d">';
+
+	/**
+	 * @inheritDoc
+	 */
+	protected function setModuleValues():void{
+
+		foreach($this::DEFAULT_MODULE_VALUES as $M_TYPE => $defaultValue){
+			$v = $this->options->moduleValues[$M_TYPE] ?? null;
+
+			if(!is_string($v)){
+				$this->moduleValues[$M_TYPE] = $defaultValue
+					? $this->options->markupDark
+					: $this->options->markupLight;
+			}
+			else{
+				$this->moduleValues[$M_TYPE] = trim(strip_tags($v), '\'"');
+			}
+
+		}
+
+	}
+
+	/**
+	 * HTML output
+	 */
+	protected function html(string $file = null):string{
+
+		$html = empty($this->options->cssClass)
+			? '<div>'
+			: '<div class="'.$this->options->cssClass.'">';
+
+		$html .= $this->options->eol;
+
+		foreach($this->matrix->matrix() as $row){
+			$html .= '<div>';
+
+			foreach($row as $M_TYPE){
+				$html .= '<span style="background: '.$this->moduleValues[$M_TYPE].';"></span>';
+			}
+
+			$html .= '</div>'.$this->options->eol;
+		}
+
+		$html .= '</div>'.$this->options->eol;
+
+		if($file !== null){
+			return '<!DOCTYPE html>'.
+			       '<head><meta charset="UTF-8"><title>QR Code</title></head>'.
+			       '<body>'.$this->options->eol.$html.'</body>';
+		}
+
+		return $html;
+	}
+
+	/**
+	 * SVG output
+	 *
+	 * @see https://github.com/codemasher/php-qrcode/pull/5
+	 */
+	protected function svg(string $file = null):string{
+		$matrix = $this->matrix->matrix();
+
+		$svg = sprintf($this->svgHeader, $this->options->cssClass, $this->options->svgViewBoxSize ?? $this->moduleCount)
+		       .$this->options->eol
+		       .'<defs>'.$this->options->svgDefs.'</defs>'
+		       .$this->options->eol;
+
+		foreach($this->moduleValues as $M_TYPE => $value){
+			$path = '';
+
+			foreach($matrix as $y => $row){
+				//we'll combine active blocks within a single row as a lightweight compression technique
+				$start = null;
+				$count = 0;
+
+				foreach($row as $x => $module){
+
+					if($module === $M_TYPE){
+						$count++;
+
+						if($start === null){
+							$start = $x;
+						}
+
+						if(isset($row[$x + 1])){
+							continue;
+						}
+					}
+
+					if($count > 0){
+						$len   = $count;
+						$start ??= 0; // avoid type coercion in sprintf() - phan happy
+
+						$path .= sprintf('M%s %s h%s v1 h-%sZ ', $start, $y, $len, $len);
+
+						// reset count
+						$count = 0;
+						$start = null;
+					}
+
+				}
+
+			}
+
+			if(!empty($path)){
+				$svg .= sprintf(
+					'<path class="qr-%s %s" stroke="transparent" fill="%s" fill-opacity="%s" d="%s" />',
+					$M_TYPE, $this->options->cssClass, $value, $this->options->svgOpacity, $path
+				);
+			}
+
+		}
+
+		// close svg
+		$svg .= '</svg>'.$this->options->eol;
+
+		// if saving to file, append the correct headers
+		if($file !== null){
+			return '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">'.
+			       $this->options->eol.$svg;
+		}
+
+		if($this->options->imageBase64){
+			$svg = sprintf('data:image/svg+xml;base64,%s', base64_encode($svg));
+		}
+
+		return $svg;
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Output/QROutputAbstract.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Output/QROutputAbstract.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Output/QROutputAbstract.php	(revision 8427)
@@ -0,0 +1,129 @@
+<?php
+/**
+ * Class QROutputAbstract
+ *
+ * @filesource   QROutputAbstract.php
+ * @created      09.12.2015
+ * @package      chillerlan\QRCode\Output
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2015 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCode\Output;
+
+use chillerlan\QRCode\{Data\QRMatrix, QRCode};
+use chillerlan\Settings\SettingsContainerInterface;
+
+use function call_user_func_array, dirname, file_put_contents, get_called_class, in_array, is_writable, sprintf;
+
+/**
+ * common output abstract
+ */
+abstract class QROutputAbstract implements QROutputInterface{
+
+	/**
+	 * the current size of the QR matrix
+	 *
+	 * @see \chillerlan\QRCode\Data\QRMatrix::size()
+	 */
+	protected int $moduleCount;
+
+	/**
+	 * the current output mode
+	 *
+	 * @see \chillerlan\QRCode\QROptions::$outputType
+	 */
+	protected string $outputMode;
+
+	/**
+	 * the default output mode of the current output module
+	 */
+	protected string $defaultMode;
+
+	/**
+	 * the current scaling for a QR pixel
+	 *
+	 * @see \chillerlan\QRCode\QROptions::$scale
+	 */
+	protected int $scale;
+
+	/**
+	 * the side length of the QR image (modules * scale)
+	 */
+	protected int $length;
+
+	/**
+	 * an (optional) array of color values for the several QR matrix parts
+	 */
+	protected array $moduleValues;
+
+	/**
+	 * the (filled) data matrix object
+	 */
+	protected QRMatrix $matrix;
+
+	/**
+	 * @var \chillerlan\Settings\SettingsContainerInterface|\chillerlan\QRCode\QROptions
+	 */
+	protected SettingsContainerInterface $options;
+
+	/**
+	 * QROutputAbstract constructor.
+	 */
+	public function __construct(SettingsContainerInterface $options, QRMatrix $matrix){
+		$this->options     = $options;
+		$this->matrix      = $matrix;
+		$this->moduleCount = $this->matrix->size();
+		$this->scale       = $this->options->scale;
+		$this->length      = $this->moduleCount * $this->scale;
+
+		$class = get_called_class();
+
+		if(isset(QRCode::OUTPUT_MODES[$class]) && in_array($this->options->outputType, QRCode::OUTPUT_MODES[$class])){
+			$this->outputMode = $this->options->outputType;
+		}
+
+		$this->setModuleValues();
+	}
+
+	/**
+	 * Sets the initial module values (clean-up & defaults)
+	 */
+	abstract protected function setModuleValues():void;
+
+	/**
+	 * saves the qr data to a file
+	 *
+	 * @see file_put_contents()
+	 * @see \chillerlan\QRCode\QROptions::cachefile
+	 *
+	 * @throws \chillerlan\QRCode\Output\QRCodeOutputException
+	 */
+	protected function saveToFile(string $data, string $file):bool{
+
+		if(!is_writable(dirname($file))){
+			throw new QRCodeOutputException(sprintf('Could not write data to cache file: %s', $file));
+		}
+
+		return (bool)file_put_contents($file, $data);
+	}
+
+	/**
+	 * @inheritDoc
+	 */
+	public function dump(string $file = null){
+		$file ??= $this->options->cachefile;
+
+		// call the built-in output method with the optional file path as parameter
+		// to make the called method aware if a cache file was given
+		$data = call_user_func_array([$this, $this->outputMode ?? $this->defaultMode], [$file]);
+
+		if($file !== null){
+			$this->saveToFile($data, $file);
+		}
+
+		return $data;
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Output/QROutputInterface.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Output/QROutputInterface.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Output/QROutputInterface.php	(revision 8427)
@@ -0,0 +1,54 @@
+<?php
+/**
+ * Interface QROutputInterface,
+ *
+ * @filesource   QROutputInterface.php
+ * @created      02.12.2015
+ * @package      chillerlan\QRCode\Output
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2015 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCode\Output;
+
+use chillerlan\QRCode\Data\QRMatrix;
+
+/**
+ * Converts the data matrix into readable output
+ */
+interface QROutputInterface{
+
+	const DEFAULT_MODULE_VALUES = [
+		// light
+		QRMatrix::M_NULL            => false, // 0
+		QRMatrix::M_DATA            => false, // 4
+		QRMatrix::M_FINDER          => false, // 6
+		QRMatrix::M_SEPARATOR       => false, // 8
+		QRMatrix::M_ALIGNMENT       => false, // 10
+		QRMatrix::M_TIMING          => false, // 12
+		QRMatrix::M_FORMAT          => false, // 14
+		QRMatrix::M_VERSION         => false, // 16
+		QRMatrix::M_QUIETZONE       => false, // 18
+		QRMatrix::M_LOGO            => false, // 20
+		QRMatrix::M_TEST            => false, // 255
+		// dark
+		QRMatrix::M_DARKMODULE << 8 => true,  // 512
+		QRMatrix::M_DATA << 8       => true,  // 1024
+		QRMatrix::M_FINDER << 8     => true,  // 1536
+		QRMatrix::M_ALIGNMENT << 8  => true,  // 2560
+		QRMatrix::M_TIMING << 8     => true,  // 3072
+		QRMatrix::M_FORMAT << 8     => true,  // 3584
+		QRMatrix::M_VERSION << 8    => true,  // 4096
+		QRMatrix::M_FINDER_DOT << 8 => true,  // 5632
+		QRMatrix::M_TEST << 8       => true,  // 65280
+	];
+
+	/**
+	 * generates the output, optionally dumps it to a file, and returns it
+	 *
+	 * @return mixed
+	 */
+	public function dump(string $file = null);
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Output/QRString.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Output/QRString.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/Output/QRString.php	(revision 8427)
@@ -0,0 +1,76 @@
+<?php
+/**
+ * Class QRString
+ *
+ * @filesource   QRString.php
+ * @created      05.12.2015
+ * @package      chillerlan\QRCode\Output
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2015 Smiley
+ * @license      MIT
+ *
+ * @noinspection PhpUnusedParameterInspection
+ * @noinspection PhpComposerExtensionStubsInspection
+ */
+
+namespace chillerlan\QRCode\Output;
+
+use chillerlan\QRCode\QRCode;
+
+use function implode, is_string, json_encode;
+
+/**
+ * Converts the matrix data into string types
+ */
+class QRString extends QROutputAbstract{
+
+	protected string $defaultMode = QRCode::OUTPUT_STRING_TEXT;
+
+	/**
+	 * @inheritDoc
+	 */
+	protected function setModuleValues():void{
+
+		foreach($this::DEFAULT_MODULE_VALUES as $M_TYPE => $defaultValue){
+			$v = $this->options->moduleValues[$M_TYPE] ?? null;
+
+			if(!is_string($v)){
+				$this->moduleValues[$M_TYPE] = $defaultValue
+					? $this->options->textDark
+					: $this->options->textLight;
+			}
+			else{
+				$this->moduleValues[$M_TYPE] = $v;
+			}
+
+		}
+
+	}
+
+	/**
+	 * string output
+	 */
+	protected function text(string $file = null):string{
+		$str = [];
+
+		foreach($this->matrix->matrix() as $row){
+			$r = [];
+
+			foreach($row as $M_TYPE){
+				$r[] = $this->moduleValues[$M_TYPE];
+			}
+
+			$str[] = implode('', $r);
+		}
+
+		return implode($this->options->eol, $str);
+	}
+
+	/**
+	 * JSON output
+	 */
+	protected function json(string $file = null):string{
+		return json_encode($this->matrix->matrix());
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/QRCode.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/QRCode.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/QRCode.php	(revision 8427)
@@ -0,0 +1,313 @@
+<?php
+/**
+ * Class QRCode
+ *
+ * @filesource   QRCode.php
+ * @created      26.11.2015
+ * @package      chillerlan\QRCode
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2015 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCode;
+
+use chillerlan\QRCode\Data\{
+	AlphaNum, Byte, Kanji, MaskPatternTester, Number, QRCodeDataException, QRDataInterface, QRMatrix
+};
+use chillerlan\QRCode\Output\{
+	QRCodeOutputException, QRFpdf, QRImage, QRImagick, QRMarkup, QROutputInterface, QRString
+};
+use chillerlan\Settings\SettingsContainerInterface;
+
+use function call_user_func_array, class_exists, in_array, ord, strlen, strtolower, str_split;
+
+/**
+ * Turns a text string into a Model 2 QR Code
+ *
+ * @see https://github.com/kazuhikoarase/qrcode-generator/tree/master/php
+ * @see http://www.qrcode.com/en/codes/model12.html
+ * @see https://www.swisseduc.ch/informatik/theoretische_informatik/qr_codes/docs/qr_standard.pdf
+ * @see https://en.wikipedia.org/wiki/QR_code
+ * @see http://www.thonky.com/qr-code-tutorial/
+ */
+class QRCode{
+
+	/** @var int */
+	public const VERSION_AUTO       = -1;
+	/** @var int */
+	public const MASK_PATTERN_AUTO  = -1;
+
+	// ISO/IEC 18004:2000 Table 2
+
+	/** @var int */
+	public const DATA_NUMBER   = 0b0001;
+	/** @var int */
+	public const DATA_ALPHANUM = 0b0010;
+	/** @var int */
+	public const DATA_BYTE     = 0b0100;
+	/** @var int */
+	public const DATA_KANJI    = 0b1000;
+
+	/**
+	 * References to the keys of the following tables:
+	 *
+	 * @see \chillerlan\QRCode\Data\QRDataInterface::MAX_LENGTH
+	 *
+	 * @var int[]
+	 */
+	public const DATA_MODES = [
+		self::DATA_NUMBER   => 0,
+		self::DATA_ALPHANUM => 1,
+		self::DATA_BYTE     => 2,
+		self::DATA_KANJI    => 3,
+	];
+
+	// ISO/IEC 18004:2000 Tables 12, 25
+
+	/** @var int */
+	public const ECC_L = 0b01; // 7%.
+	/** @var int */
+	public const ECC_M = 0b00; // 15%.
+	/** @var int */
+	public const ECC_Q = 0b11; // 25%.
+	/** @var int */
+	public const ECC_H = 0b10; // 30%.
+
+	/**
+	 * References to the keys of the following tables:
+	 *
+	 * @see \chillerlan\QRCode\Data\QRDataInterface::MAX_BITS
+	 * @see \chillerlan\QRCode\Data\QRDataInterface::RSBLOCKS
+	 * @see \chillerlan\QRCode\Data\QRMatrix::formatPattern
+	 *
+	 * @var int[]
+	 */
+	public const ECC_MODES = [
+		self::ECC_L => 0,
+		self::ECC_M => 1,
+		self::ECC_Q => 2,
+		self::ECC_H => 3,
+	];
+
+	/** @var string */
+	public const OUTPUT_MARKUP_HTML = 'html';
+	/** @var string */
+	public const OUTPUT_MARKUP_SVG  = 'svg';
+	/** @var string */
+	public const OUTPUT_IMAGE_PNG   = 'png';
+	/** @var string */
+	public const OUTPUT_IMAGE_JPG   = 'jpg';
+	/** @var string */
+	public const OUTPUT_IMAGE_GIF   = 'gif';
+	/** @var string */
+	public const OUTPUT_STRING_JSON = 'json';
+	/** @var string */
+	public const OUTPUT_STRING_TEXT = 'text';
+	/** @var string */
+	public const OUTPUT_IMAGICK     = 'imagick';
+	/** @var string */
+	public const OUTPUT_FPDF        = 'fpdf';
+	/** @var string */
+	public const OUTPUT_CUSTOM      = 'custom';
+
+	/**
+	 * Map of built-in output modules => capabilities
+	 *
+	 * @var string[][]
+	 */
+	public const OUTPUT_MODES = [
+		QRMarkup::class => [
+			self::OUTPUT_MARKUP_SVG,
+			self::OUTPUT_MARKUP_HTML,
+		],
+		QRImage::class => [
+			self::OUTPUT_IMAGE_PNG,
+			self::OUTPUT_IMAGE_GIF,
+			self::OUTPUT_IMAGE_JPG,
+		],
+		QRString::class => [
+			self::OUTPUT_STRING_JSON,
+			self::OUTPUT_STRING_TEXT,
+		],
+		QRImagick::class => [
+			self::OUTPUT_IMAGICK,
+		],
+		QRFpdf::class => [
+			self::OUTPUT_FPDF
+		]
+	];
+
+	/**
+	 * Map of data mode => interface
+	 *
+	 * @var string[]
+	 */
+	protected const DATA_INTERFACES = [
+		'number'   => Number::class,
+		'alphanum' => AlphaNum::class,
+		'kanji'    => Kanji::class,
+		'byte'     => Byte::class,
+	];
+
+	/**
+	 * The settings container
+	 *
+	 * @var \chillerlan\QRCode\QROptions|\chillerlan\Settings\SettingsContainerInterface
+	 */
+	protected SettingsContainerInterface $options;
+
+	/**
+	 * The selected data interface (Number, AlphaNum, Kanji, Byte)
+	 */
+	protected QRDataInterface $dataInterface;
+
+	/**
+	 * QRCode constructor.
+	 *
+	 * Sets the options instance, determines the current mb-encoding and sets it to UTF-8
+	 */
+	public function __construct(SettingsContainerInterface $options = null){
+		$this->options = $options ?? new QROptions;
+	}
+
+	/**
+	 * Renders a QR Code for the given $data and QROptions
+	 *
+	 * @return mixed
+	 */
+	public function render(string $data, string $file = null){
+		return $this->initOutputInterface($data)->dump($file);
+	}
+
+	/**
+	 * Returns a QRMatrix object for the given $data and current QROptions
+	 *
+	 * @throws \chillerlan\QRCode\Data\QRCodeDataException
+	 */
+	public function getMatrix(string $data):QRMatrix{
+
+		if(empty($data)){
+			throw new QRCodeDataException('QRCode::getMatrix() No data given.');
+		}
+
+		$this->dataInterface = $this->initDataInterface($data);
+
+		$maskPattern = $this->options->maskPattern === $this::MASK_PATTERN_AUTO
+			? (new MaskPatternTester($this->dataInterface))->getBestMaskPattern()
+			: $this->options->maskPattern;
+
+		$matrix = $this->dataInterface->initMatrix($maskPattern);
+
+		if((bool)$this->options->addQuietzone){
+			$matrix->setQuietZone($this->options->quietzoneSize);
+		}
+
+		return $matrix;
+	}
+
+	/**
+	 * returns a fresh QRDataInterface for the given $data
+	 *
+	 * @throws \chillerlan\QRCode\Data\QRCodeDataException
+	 */
+	public function initDataInterface(string $data):QRDataInterface{
+
+		// allow forcing the data mode
+		// see https://github.com/chillerlan/php-qrcode/issues/39
+		$interface = $this::DATA_INTERFACES[strtolower($this->options->dataModeOverride)] ?? null;
+
+		if($interface !== null){
+			return new $interface($this->options, $data);
+		}
+
+		foreach($this::DATA_INTERFACES as $mode => $dataInterface){
+
+			if(call_user_func_array([$this, 'is'.$mode], [$data])){
+				return new $dataInterface($this->options, $data);
+			}
+
+		}
+
+		throw new QRCodeDataException('invalid data type'); // @codeCoverageIgnore
+	}
+
+	/**
+	 * returns a fresh (built-in) QROutputInterface
+	 *
+	 * @throws \chillerlan\QRCode\Output\QRCodeOutputException
+	 */
+	protected function initOutputInterface(string $data):QROutputInterface{
+
+		if($this->options->outputType === $this::OUTPUT_CUSTOM && class_exists($this->options->outputInterface)){
+			/** @phan-suppress-next-line PhanTypeExpectedObjectOrClassName */
+			return new $this->options->outputInterface($this->options, $this->getMatrix($data));
+		}
+
+		foreach($this::OUTPUT_MODES as $outputInterface => $modes){
+
+			if(in_array($this->options->outputType, $modes, true) && class_exists($outputInterface)){
+				return new $outputInterface($this->options, $this->getMatrix($data));
+			}
+
+		}
+
+		throw new QRCodeOutputException('invalid output type');
+	}
+
+	/**
+	 * checks if a string qualifies as numeric
+	 */
+	public function isNumber(string $string):bool{
+		return $this->checkString($string, QRDataInterface::CHAR_MAP_NUMBER);
+	}
+
+	/**
+	 * checks if a string qualifies as alphanumeric
+	 */
+	public function isAlphaNum(string $string):bool{
+		return $this->checkString($string, QRDataInterface::CHAR_MAP_ALPHANUM);
+	}
+
+	/**
+	 * checks is a given $string matches the characters of a given $charmap, returns false on the first invalid occurence.
+	 */
+	protected function checkString(string $string, array $charmap):bool{
+
+		foreach(str_split($string) as $chr){
+			if(!isset($charmap[$chr])){
+				return false;
+			}
+		}
+
+		return true;
+	}
+
+	/**
+	 * checks if a string qualifies as Kanji
+	 */
+	public function isKanji(string $string):bool{
+		$i   = 0;
+		$len = strlen($string);
+
+		while($i + 1 < $len){
+			$c = ((0xff & ord($string[$i])) << 8) | (0xff & ord($string[$i + 1]));
+
+			if(!($c >= 0x8140 && $c <= 0x9FFC) && !($c >= 0xE040 && $c <= 0xEBBF)){
+				return false;
+			}
+
+			$i += 2;
+		}
+
+		return $i >= $len;
+	}
+
+	/**
+	 * a dummy
+	 */
+	public function isByte(string $data):bool{
+		return $data !== '';
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/QRCodeException.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/QRCodeException.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/QRCodeException.php	(revision 8427)
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Class QRCodeException
+ *
+ * @filesource   QRCodeException.php
+ * @created      27.11.2015
+ * @package      chillerlan\QRCode
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2015 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCode;
+
+use Exception;
+
+/**
+ * An exception container
+ */
+class QRCodeException extends Exception{}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/QROptions.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/QROptions.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/QROptions.php	(revision 8427)
@@ -0,0 +1,54 @@
+<?php
+/**
+ * Class QROptions
+ *
+ * @filesource   QROptions.php
+ * @created      08.12.2015
+ * @package      chillerlan\QRCode
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2015 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCode;
+
+use chillerlan\Settings\SettingsContainerAbstract;
+
+/**
+ * The QRCode settings container
+ *
+ * @property int         $version
+ * @property int         $versionMin
+ * @property int         $versionMax
+ * @property int         $eccLevel
+ * @property int         $maskPattern
+ * @property bool        $addQuietzone
+ * @property int         $quietzoneSize
+ * @property string|null $dataModeOverride
+ * @property string      $outputType
+ * @property string|null $outputInterface
+ * @property string|null $cachefile
+ * @property string      $eol
+ * @property int         $scale
+ * @property string      $cssClass
+ * @property float       $svgOpacity
+ * @property string      $svgDefs
+ * @property int         $svgViewBoxSize
+ * @property string      $textDark
+ * @property string      $textLight
+ * @property string      $markupDark
+ * @property string      $markupLight
+ * @property bool        $returnResource
+ * @property bool        $imageBase64
+ * @property bool        $imageTransparent
+ * @property array       $imageTransparencyBG
+ * @property int         $pngCompression
+ * @property int         $jpegQuality
+ * @property string      $imagickFormat
+ * @property string|null $imagickBG
+ * @property string      $fpdfMeasureUnit
+ * @property array|null  $moduleValues
+ */
+class QROptions extends SettingsContainerAbstract{
+	use QROptionsTrait;
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/QROptionsTrait.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/QROptionsTrait.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/src/QROptionsTrait.php	(revision 8427)
@@ -0,0 +1,341 @@
+<?php
+/**
+ * Trait QROptionsTrait
+ *
+ * @filesource   QROptionsTrait.php
+ * @created      10.03.2018
+ * @package      chillerlan\QRCode
+ * @author       smiley <smiley@chillerlan.net>
+ * @copyright    2018 smiley
+ * @license      MIT
+ *
+ * @noinspection PhpUnused
+ */
+
+namespace chillerlan\QRCode;
+
+use function array_values, count, in_array, is_numeric, max, min, sprintf, strtolower;
+
+/**
+ * The QRCode plug-in settings & setter functionality
+ */
+trait QROptionsTrait{
+
+	/**
+	 * QR Code version number
+	 *
+	 * [1 ... 40] or QRCode::VERSION_AUTO
+	 */
+	protected int $version = QRCode::VERSION_AUTO;
+
+	/**
+	 * Minimum QR version
+	 *
+	 * if $version = QRCode::VERSION_AUTO
+	 */
+	protected int $versionMin = 1;
+
+	/**
+	 * Maximum QR version
+	 */
+	protected int $versionMax = 40;
+
+	/**
+	 * Error correct level
+	 *
+	 * QRCode::ECC_X where X is:
+	 *
+	 *   - L =>  7%
+	 *   - M => 15%
+	 *   - Q => 25%
+	 *   - H => 30%
+	 */
+	protected int $eccLevel = QRCode::ECC_L;
+
+	/**
+	 * Mask Pattern to use
+	 *
+	 * [0...7] or QRCode::MASK_PATTERN_AUTO
+	 */
+	protected int $maskPattern = QRCode::MASK_PATTERN_AUTO;
+
+	/**
+	 * Add a "quiet zone" (margin) according to the QR code spec
+	 */
+	protected bool $addQuietzone = true;
+
+	/**
+	 * Size of the quiet zone
+	 *
+	 * internally clamped to [0 ... $moduleCount / 2], defaults to 4 modules
+	 */
+	protected int $quietzoneSize = 4;
+
+	/**
+	 * Use this to circumvent the data mode detection and force the usage of the given mode.
+	 *
+	 * valid modes are: Number, AlphaNum, Kanji, Byte (case insensitive)
+	 *
+	 * @see https://github.com/chillerlan/php-qrcode/issues/39
+     * @see https://github.com/chillerlan/php-qrcode/issues/97 (changed default value to '')
+	 */
+	protected string $dataModeOverride = '';
+
+	/**
+	 * The output type
+	 *
+	 *   - QRCode::OUTPUT_MARKUP_XXXX where XXXX = HTML, SVG
+	 *   - QRCode::OUTPUT_IMAGE_XXX where XXX = PNG, GIF, JPG
+	 *   - QRCode::OUTPUT_STRING_XXXX where XXXX = TEXT, JSON
+	 *   - QRCode::OUTPUT_CUSTOM
+	 */
+	protected string $outputType = QRCode::OUTPUT_IMAGE_PNG;
+
+	/**
+	 * the FQCN of the custom QROutputInterface if $outputType is set to QRCode::OUTPUT_CUSTOM
+	 */
+	protected ?string $outputInterface = null;
+
+	/**
+	 * /path/to/cache.file
+	 */
+	protected ?string $cachefile = null;
+
+	/**
+	 * newline string [HTML, SVG, TEXT]
+	 */
+	protected string $eol = PHP_EOL;
+
+	/**
+	 * size of a QR code pixel [SVG, IMAGE_*], HTML via CSS
+	 */
+	protected int $scale = 5;
+
+	/**
+	 * a common css class
+	 */
+	protected string $cssClass = '';
+
+	/**
+	 * SVG opacity
+	 */
+	protected float $svgOpacity = 1.0;
+
+	/**
+	 * anything between <defs>
+	 *
+	 * @see https://developer.mozilla.org/docs/Web/SVG/Element/defs
+	 */
+	protected string $svgDefs = '<style>rect{shape-rendering:crispEdges}</style>';
+
+	/**
+	 * SVG viewBox size. a single integer number which defines width/height of the viewBox attribute.
+	 *
+	 * viewBox="0 0 x x"
+	 *
+	 * @see https://css-tricks.com/scale-svg/#article-header-id-3
+	 */
+	protected ?int $svgViewBoxSize = null;
+
+	/**
+	 * string substitute for dark
+	 */
+	protected string $textDark = 'ðŽ';
+
+	/**
+	 * string substitute for light
+	 */
+	protected string $textLight = 'â­';
+
+	/**
+	 * markup substitute for dark (CSS value)
+	 */
+	protected string $markupDark = '#000';
+
+	/**
+	 * markup substitute for light (CSS value)
+	 */
+	protected string $markupLight = '#fff';
+
+	/**
+	 * Return the image resource instead of a render if applicable.
+	 * This option overrides other output options, such as $cachefile and $imageBase64.
+	 *
+	 * Supported by the following modules:
+	 *
+	 * - QRImage:   resource (PHP < 8), GdImage
+	 * - QRImagick: Imagick
+	 * - QRFpdf:    FPDF
+	 *
+	 * @see \chillerlan\QRCode\Output\QROutputInterface::dump()
+	 *
+	 * @var bool
+	 */
+	protected bool $returnResource = false;
+
+	/**
+	 * toggle base64 or raw image data
+	 */
+	protected bool $imageBase64 = true;
+
+	/**
+	 * toggle transparency, not supported by jpg
+	 */
+	protected bool $imageTransparent = true;
+
+	/**
+	 * @see imagecolortransparent()
+	 *
+	 * [R, G, B]
+	 */
+	protected array $imageTransparencyBG = [255, 255, 255];
+
+	/**
+	 * @see imagepng()
+	 */
+	protected int $pngCompression = -1;
+
+	/**
+	 * @see imagejpeg()
+	 */
+	protected int $jpegQuality = 85;
+
+	/**
+	 * Imagick output format
+	 *
+	 * @see \Imagick::setType()
+	 */
+	protected string $imagickFormat = 'png';
+
+	/**
+	 * Imagick background color (defaults to "transparent")
+	 *
+	 * @see \ImagickPixel::__construct()
+	 */
+	protected ?string $imagickBG = null;
+
+	/**
+	 * Measurement unit for FPDF output: pt, mm, cm, in (defaults to "pt")
+	 *
+	 * @see \FPDF::__construct()
+	 */
+	protected string $fpdfMeasureUnit = 'pt';
+
+	/**
+	 * Module values map
+	 *
+	 *   - HTML, IMAGICK: #ABCDEF, cssname, rgb(), rgba()...
+	 *   - IMAGE: [63, 127, 255] // R, G, B
+	 */
+	protected ?array $moduleValues = null;
+
+	/**
+	 * clamp min/max version number
+	 */
+	protected function setMinMaxVersion(int $versionMin, int $versionMax):void{
+		$min = max(1, min(40, $versionMin));
+		$max = max(1, min(40, $versionMax));
+
+		$this->versionMin = min($min, $max);
+		$this->versionMax = max($min, $max);
+	}
+
+	/**
+	 * sets the minimum version number
+	 */
+	protected function set_versionMin(int $version):void{
+		$this->setMinMaxVersion($version, $this->versionMax);
+	}
+
+	/**
+	 * sets the maximum version number
+	 */
+	protected function set_versionMax(int $version):void{
+		$this->setMinMaxVersion($this->versionMin, $version);
+	}
+
+	/**
+	 * sets the error correction level
+	 *
+	 * @throws \chillerlan\QRCode\QRCodeException
+	 */
+	protected function set_eccLevel(int $eccLevel):void{
+
+		if(!isset(QRCode::ECC_MODES[$eccLevel])){
+			throw new QRCodeException(sprintf('Invalid error correct level: %s', $eccLevel));
+		}
+
+		$this->eccLevel = $eccLevel;
+	}
+
+	/**
+	 * sets/clamps the mask pattern
+	 */
+	protected function set_maskPattern(int $maskPattern):void{
+
+		if($maskPattern !== QRCode::MASK_PATTERN_AUTO){
+			$this->maskPattern = max(0, min(7, $maskPattern));
+		}
+
+	}
+
+	/**
+	 * sets the transparency background color
+	 *
+	 * @throws \chillerlan\QRCode\QRCodeException
+	 */
+	protected function set_imageTransparencyBG(array $imageTransparencyBG):void{
+
+		// invalid value - set to white as default
+		if(count($imageTransparencyBG) < 3){
+			$this->imageTransparencyBG = [255, 255, 255];
+
+			return;
+		}
+
+		foreach($imageTransparencyBG as $k => $v){
+
+			// cut off exceeding items
+			if($k > 2){
+				break;
+			}
+
+			if(!is_numeric($v)){
+				throw new QRCodeException('Invalid RGB value.');
+			}
+
+			// clamp the values
+			$this->imageTransparencyBG[$k] = max(0, min(255, (int)$v));
+		}
+
+		// use the array values to not run into errors with the spread operator (...$arr)
+		$this->imageTransparencyBG = array_values($this->imageTransparencyBG);
+	}
+
+	/**
+	 * sets/clamps the version number
+	 */
+	protected function set_version(int $version):void{
+
+		if($version !== QRCode::VERSION_AUTO){
+			$this->version = max(1, min(40, $version));
+		}
+
+	}
+
+	/**
+	 * sets the FPDF measurement unit
+	 *
+	 * @codeCoverageIgnore
+	 */
+	protected function set_fpdfMeasureUnit(string $unit):void{
+		$unit = strtolower($unit);
+
+		if(in_array($unit, ['cm', 'in', 'mm', 'pt'], true)){
+			$this->fpdfMeasureUnit = $unit;
+		}
+
+		// @todo throw or ignore silently?
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Data/AlphaNumTest.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Data/AlphaNumTest.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Data/AlphaNumTest.php	(revision 8427)
@@ -0,0 +1,61 @@
+<?php
+/**
+ * Class AlphaNumTest
+ *
+ * @filesource   AlphaNumTest.php
+ * @created      24.11.2017
+ * @package      chillerlan\QRCodeTest\Data
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2017 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCodeTest\Data;
+
+use chillerlan\QRCode\Data\{AlphaNum, QRCodeDataException, QRDataInterface};
+use chillerlan\QRCode\QROptions;
+
+/**
+ * Tests the AlphaNum class
+ */
+final class AlphaNumTest extends DatainterfaceTestAbstract{
+
+	/** @internal */
+	protected string $testdata  = '0 $%*+-./:';
+
+	/** @internal */
+	protected array  $expected  = [
+		32, 80, 36, 212, 252, 15, 175, 251,
+		176, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		112, 43, 9, 248, 200, 194, 75, 25,
+		205, 173, 154, 68, 191, 16, 128,
+		92, 112, 20, 198, 27
+	];
+
+	/**
+	 * @inheritDoc
+	 * @internal
+	 */
+	protected function getDataInterfaceInstance(QROptions $options):QRDataInterface{
+		return new AlphaNum($options);
+	}
+
+	/**
+	 * Tests if an exception is thrown when an invalid character is encountered
+	 */
+	public function testGetCharCodeException():void{
+		$this->expectException(QRCodeDataException::class);
+		$this->expectExceptionMessage('illegal char: "#" [35]');
+
+		$this->dataInterface->setData('#');
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Data/ByteTest.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Data/ByteTest.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Data/ByteTest.php	(revision 8427)
@@ -0,0 +1,52 @@
+<?php
+/**
+ * Class ByteTest
+ *
+ * @filesource   ByteTest.php
+ * @created      24.11.2017
+ * @package      chillerlan\QRCodeTest\Data
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2017 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCodeTest\Data;
+
+use chillerlan\QRCode\Data\Byte;
+use chillerlan\QRCode\Data\QRDataInterface;
+use chillerlan\QRCode\QROptions;
+
+/**
+ * Tests the Byte class
+ */
+final class ByteTest extends DatainterfaceTestAbstract{
+
+	/** @internal */
+	protected string $testdata = '[Â¯\_(ã)_/Â¯]';
+
+	/** @internal */
+	protected array  $expected = [
+		64, 245, 188, 42, 245, 197, 242, 142,
+		56, 56, 66, 149, 242, 252, 42, 245,
+		208, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		79, 89, 226, 48, 209, 89, 151, 1,
+		12, 73, 42, 163, 11, 34, 255, 205,
+		21, 47, 250, 101
+	];
+
+	/**
+	 * @inheritDoc
+	 * @internal
+	 */
+	protected function getDataInterfaceInstance(QROptions $options):QRDataInterface{
+		return new Byte($options);
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Data/DatainterfaceTestAbstract.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Data/DatainterfaceTestAbstract.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Data/DatainterfaceTestAbstract.php	(revision 8427)
@@ -0,0 +1,127 @@
+<?php
+/**
+ * Class DatainterfaceTestAbstract
+ *
+ * @filesource   DatainterfaceTestAbstract.php
+ * @created      24.11.2017
+ * @package      chillerlan\QRCodeTest\Data
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2017 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCodeTest\Data;
+
+use chillerlan\QRCode\QRCode;
+use chillerlan\QRCode\QROptions;
+use PHPUnit\Framework\TestCase;
+use chillerlan\QRCode\Data\{QRCodeDataException, QRDataInterface, QRMatrix};
+use ReflectionClass;
+
+use function str_repeat;
+
+/**
+ * The data interface test abstract
+ */
+abstract class DatainterfaceTestAbstract extends TestCase{
+
+	/** @internal */
+	protected ReflectionClass $reflection;
+	/** @internal */
+	protected QRDataInterface $dataInterface;
+	/** @internal */
+	protected string $testdata;
+	/** @internal */
+	protected array  $expected;
+
+	/**
+	 * @internal
+	 */
+	protected function setUp():void{
+		$this->dataInterface = $this->getDataInterfaceInstance(new QROptions(['version' => 4]));
+		$this->reflection    = new ReflectionClass($this->dataInterface);
+	}
+
+	/**
+	 * Returns a data interface instance
+	 *
+	 * @internal
+	 */
+	abstract protected function getDataInterfaceInstance(QROptions $options):QRDataInterface;
+
+	/**
+	 * Verifies the data interface instance
+	 */
+	public function testInstance():void{
+		$this::assertInstanceOf(QRDataInterface::class, $this->dataInterface);
+	}
+
+	/**
+	 * Tests ecc masking and verifies against a sample
+	 */
+	public function testMaskEcc():void{
+		$this->dataInterface->setData($this->testdata);
+
+		$maskECC = $this->reflection->getMethod('maskECC');
+		$maskECC->setAccessible(true);
+
+		$this::assertSame($this->expected, $maskECC->invoke($this->dataInterface));
+	}
+
+	/**
+	 * @see testInitMatrix()
+	 * @internal
+	 * @return int[][]
+	 */
+	public function MaskPatternProvider():array{
+		return [[0], [1], [2], [3], [4], [5], [6], [7]];
+	}
+
+	/**
+	 * Tests initializing the data matrix
+	 *
+	 * @dataProvider MaskPatternProvider
+	 */
+	public function testInitMatrix(int $maskPattern):void{
+		$this->dataInterface->setData($this->testdata);
+
+		$matrix = $this->dataInterface->initMatrix($maskPattern);
+
+		$this::assertInstanceOf(QRMatrix::class, $matrix);
+		$this::assertSame($maskPattern, $matrix->maskPattern());
+	}
+
+	/**
+	 * Tests getting the minimum QR version for the given data
+	 */
+	public function testGetMinimumVersion():void{
+		$this->dataInterface->setData($this->testdata);
+
+		$getMinimumVersion = $this->reflection->getMethod('getMinimumVersion');
+		$getMinimumVersion->setAccessible(true);
+
+		$this::assertSame(1, $getMinimumVersion->invoke($this->dataInterface));
+	}
+
+	/**
+	 * Tests if an exception is thrown when the data exceeds the maximum version while auto detecting
+	 */
+	public function testGetMinimumVersionException():void{
+		$this->expectException(QRCodeDataException::class);
+		$this->expectExceptionMessage('data exceeds');
+
+		$this->dataInterface = $this->getDataInterfaceInstance(new QROptions(['version' => QRCode::VERSION_AUTO]));
+		$this->dataInterface->setData(str_repeat($this->testdata, 1337));
+	}
+
+	/**
+	 * Tests if an exception is thrown on data overflow
+	 */
+	public function testCodeLengthOverflowException():void{
+		$this->expectException(QRCodeDataException::class);
+		$this->expectExceptionMessage('code length overflow');
+
+		$this->dataInterface->setData(str_repeat($this->testdata, 1337));
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Data/KanjiTest.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Data/KanjiTest.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Data/KanjiTest.php	(revision 8427)
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Class KanjiTest
+ *
+ * @filesource   KanjiTest.php
+ * @created      24.11.2017
+ * @package      chillerlan\QRCodeTest\Data
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2017 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCodeTest\Data;
+
+use chillerlan\QRCode\QROptions;
+use chillerlan\QRCode\Data\{Kanji, QRCodeDataException, QRDataInterface};
+
+/**
+ * Tests the Kanji class
+ */
+final class KanjiTest extends DatainterfaceTestAbstract{
+
+	/** @internal */
+	protected string $testdata = 'èè·èè·èè·èè·èè·';
+
+	/** @internal */
+	protected array  $expected = [
+		128, 173, 85, 26, 95, 85, 70, 151,
+		213, 81, 165, 245, 84, 105, 125, 85,
+		26, 92, 0, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		195, 11, 221, 91, 141, 220, 163, 46,
+		165, 37, 163, 176, 79, 0, 64, 68,
+		96, 113, 54, 191
+	];
+
+	/**
+	 * @inheritDoc
+	 * @internal
+	 */
+	protected function getDataInterfaceInstance(QROptions $options):QRDataInterface{
+		return new Kanji($options);
+	}
+
+	/**
+	 * Tests if an exception is thrown when an invalid character is encountered
+	 */
+	public function testIllegalCharException1():void{
+		$this->expectException(QRCodeDataException::class);
+		$this->expectExceptionMessage('illegal char at 1 [16191]');
+
+		$this->dataInterface->setData('ÃÃ');
+	}
+
+	/**
+	 * Tests if an exception is thrown when an invalid character is encountered
+	 */
+	public function testIllegalCharException2():void{
+		$this->expectException(QRCodeDataException::class);
+		$this->expectExceptionMessage('illegal char at 1');
+
+		$this->dataInterface->setData('Ã');
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Data/MaskPatternTesterTest.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Data/MaskPatternTesterTest.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Data/MaskPatternTesterTest.php	(revision 8427)
@@ -0,0 +1,42 @@
+<?php
+/**
+ * Class MaskPatternTesterTest
+ *
+ * @filesource   MaskPatternTesterTest.php
+ * @created      24.11.2017
+ * @package      chillerlan\QRCodeTest\Data
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2017 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCodeTest\Data;
+
+use chillerlan\QRCode\QROptions;
+use chillerlan\QRCode\Data\{Byte, MaskPatternTester};
+use PHPUnit\Framework\TestCase;
+
+/**
+ * MaskPatternTester coverage test
+ */
+final class MaskPatternTesterTest extends TestCase{
+
+	/**
+	 * Tests getting the best mask pattern
+	 */
+	public function testMaskpattern():void{
+		$dataInterface = new Byte(new QROptions(['version' => 10]), 'test');
+
+		$this::assertSame(3, (new MaskPatternTester($dataInterface))->getBestMaskPattern());
+	}
+
+	/**
+	 * Tests getting the penalty value for a given mask pattern
+	 */
+	public function testMaskpatternID():void{
+		$dataInterface = new Byte(new QROptions(['version' => 10]), 'test');
+
+		$this::assertSame(4243, (new MaskPatternTester($dataInterface))->testPattern(3));
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Data/NumberTest.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Data/NumberTest.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Data/NumberTest.php	(revision 8427)
@@ -0,0 +1,61 @@
+<?php
+/**
+ * Class NumberTest
+ *
+ * @filesource   NumberTest.php
+ * @created      24.11.2017
+ * @package      chillerlan\QRCodeTest\Data
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2017 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCodeTest\Data;
+
+use chillerlan\QRCode\QROptions;
+use chillerlan\QRCode\Data\{Number, QRCodeDataException, QRDataInterface};
+
+/**
+ * Tests the Number class
+ */
+final class NumberTest extends DatainterfaceTestAbstract{
+
+	/** @internal */
+	protected string $testdata  = '0123456789';
+
+	/** @internal */
+	protected array $expected = [
+		16, 40, 12, 86, 106, 105, 0, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		17, 236, 17, 236, 17, 236, 17, 236,
+		201, 141, 102, 116, 238, 162, 239, 230,
+		222, 37, 79, 192, 42, 109, 188, 72,
+		89, 63, 168, 151
+	];
+
+	/**
+	 * @inheritDoc
+	 * @internal
+	 */
+	protected function getDataInterfaceInstance(QROptions $options):QRDataInterface{
+		return new Number($options);
+	}
+
+	/**
+	 * Tests if an exception is thrown when an invalid character is encountered
+	 */
+	public function testGetCharCodeException():void{
+		$this->expectException(QRCodeDataException::class);
+		$this->expectExceptionMessage('illegal char: "#" [35]');
+
+		$this->dataInterface->setData('#');
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Data/QRMatrixTest.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Data/QRMatrixTest.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Data/QRMatrixTest.php	(revision 8427)
@@ -0,0 +1,377 @@
+<?php
+/**
+ * Class QRMatrixTest
+ *
+ * @filesource   QRMatrixTest.php
+ * @created      17.11.2017
+ * @package      chillerlan\QRCodeTest\Data
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2017 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCodeTest\Data;
+
+use chillerlan\QRCode\QRCode;
+use chillerlan\QRCode\QROptions;
+use chillerlan\QRCode\Data\{QRCodeDataException, QRMatrix};
+use PHPUnit\Framework\TestCase;
+use ReflectionClass;
+
+/**
+ * Tests the QRMatix class
+ */
+final class QRMatrixTest extends TestCase{
+
+	/** @internal */
+	protected const version = 40;
+	/** @internal */
+	protected QRMatrix $matrix;
+
+	/**
+	 * invokes a QRMatrix object
+	 *
+	 * @internal
+	 */
+	protected function setUp():void{
+		$this->matrix = $this->getMatrix($this::version);
+	}
+
+	/**
+	 * shortcut
+	 *
+	 * @internal
+	 */
+	protected function getMatrix(int $version):QRMatrix{
+		return  new QRMatrix($version, QRCode::ECC_L);
+	}
+
+	/**
+	 * Validates the QRMatrix instance
+	 */
+	public function testInstance():void{
+		$this::assertInstanceOf(QRMatrix::class, $this->matrix);
+	}
+
+	/**
+	 * Tests if an exception is thrown when an invalid QR version was given
+	 */
+	public function testInvalidVersionException():void{
+		$this->expectException(QRCodeDataException::class);
+		$this->expectExceptionMessage('invalid QR Code version');
+
+		$this->matrix = new QRMatrix(42, 0);
+	}
+
+	/**
+	 * Tests if an exception is thrown when an invalid ECC level was given
+	 */
+	public function testInvalidEccException():void{
+		$this->expectException(QRCodeDataException::class);
+		$this->expectExceptionMessage('invalid ecc level');
+
+		$this->matrix = new QRMatrix(1, 42);
+	}
+
+	/**
+	 * Tests if size() returns the actual matrix size/count
+	 */
+	public function testSize():void{
+		$this::assertCount($this->matrix->size(), $this->matrix->matrix());
+	}
+
+	/**
+	 * Tests if version() returns the current (given) version
+	 */
+	public function testVersion():void{
+		$this::assertSame($this::version, $this->matrix->version());
+	}
+
+	/**
+	 * Tests if eccLevel() returns the current (given) ECC level
+	 */
+	public function testECC():void{
+		$this::assertSame(QRCode::ECC_L, $this->matrix->eccLevel());
+	}
+
+	/**
+	 * Tests if maskPattern() returns the current (or default) mask pattern
+	 */
+	public function testMaskPattern():void{
+		$this::assertSame(-1, $this->matrix->maskPattern()); // default
+
+		// @todo: actual mask pattern after mapData()
+	}
+
+	/**
+	 * Tests the set(), get() and check() methods
+	 */
+	public function testGetSetCheck():void{
+		$this->matrix->set(10, 10, true, QRMatrix::M_TEST);
+		$this::assertSame(65280, $this->matrix->get(10, 10));
+		$this::assertTrue($this->matrix->check(10, 10));
+
+		$this->matrix->set(20, 20, false, QRMatrix::M_TEST);
+		$this::assertSame(255, $this->matrix->get(20, 20));
+		$this::assertFalse($this->matrix->check(20, 20));
+	}
+
+	/**
+	 * Version data provider for several pattern tests
+	 *
+	 * @return int[][]
+	 * @internal
+	 */
+	public function versionProvider():array{
+		$versions = [];
+
+		for($i = 1; $i <= 40; $i++){
+			$versions[] = [$i];
+		}
+
+		return $versions;
+	}
+
+	/**
+	 * Tests setting the dark module and verifies its position
+	 *
+	 * @dataProvider versionProvider
+	 */
+	public function testSetDarkModule(int $version):void{
+		$matrix = $this->getMatrix($version)->setDarkModule();
+
+		$this::assertSame(QRMatrix::M_DARKMODULE << 8, $matrix->get(8, $matrix->size() - 8));
+	}
+
+	/**
+	 * Tests setting the finder patterns and verifies their positions
+	 *
+	 * @dataProvider versionProvider
+	 */
+	public function testSetFinderPattern(int $version):void{
+		$matrix = $this->getMatrix($version)->setFinderPattern();
+
+		$this::assertSame(QRMatrix::M_FINDER << 8, $matrix->get(0, 0));
+		$this::assertSame(QRMatrix::M_FINDER << 8, $matrix->get(0, $matrix->size() - 1));
+		$this::assertSame(QRMatrix::M_FINDER << 8, $matrix->get($matrix->size() - 1, 0));
+	}
+
+	/**
+	 * Tests the separator patterns and verifies their positions
+	 *
+	 * @dataProvider versionProvider
+	 */
+	public function testSetSeparators(int $version):void{
+		$matrix = $this->getMatrix($version)->setSeparators();
+
+		$this::assertSame(QRMatrix::M_SEPARATOR, $matrix->get(7, 0));
+		$this::assertSame(QRMatrix::M_SEPARATOR, $matrix->get(0, 7));
+		$this::assertSame(QRMatrix::M_SEPARATOR, $matrix->get(0, $matrix->size() - 8));
+		$this::assertSame(QRMatrix::M_SEPARATOR, $matrix->get($matrix->size() - 8, 0));
+	}
+
+	/**
+	 * Tests the alignment patterns and verifies their positions - version 1 (no pattern) skipped
+	 *
+	 * @dataProvider versionProvider
+	 */
+	public function testSetAlignmentPattern(int $version):void{
+
+		if($version === 1){
+			$this->markTestSkipped('N/A');
+
+			/** @noinspection PhpUnreachableStatementInspection */
+			return;
+		}
+
+		$matrix = $this
+			->getMatrix($version)
+			->setFinderPattern()
+			->setAlignmentPattern()
+		;
+
+		$alignmentPattern = (new ReflectionClass(QRMatrix::class))->getConstant('alignmentPattern')[$version];
+
+		foreach($alignmentPattern as $py){
+			foreach($alignmentPattern as $px){
+
+				if($matrix->get($px, $py) === QRMatrix::M_FINDER << 8){
+					$this::assertSame(QRMatrix::M_FINDER << 8, $matrix->get($px, $py), 'skipped finder pattern');
+					continue;
+				}
+
+				$this::assertSame(QRMatrix::M_ALIGNMENT << 8, $matrix->get($px, $py));
+			}
+		}
+
+	}
+
+	/**
+	 * Tests the timing patterns and verifies their positions
+	 *
+	 * @dataProvider versionProvider
+	 */
+	public function testSetTimingPattern(int $version):void{
+
+		$matrix = $this
+			->getMatrix($version)
+			->setAlignmentPattern()
+			->setTimingPattern()
+		;
+
+		$size = $matrix->size();
+
+		for($i = 7; $i < $size - 7; $i++){
+			if($i % 2 === 0){
+				$p1 = $matrix->get(6, $i);
+
+				if($p1 === QRMatrix::M_ALIGNMENT << 8){
+					$this::assertSame(QRMatrix::M_ALIGNMENT << 8, $p1, 'skipped alignment pattern');
+					continue;
+				}
+
+				$this::assertSame(QRMatrix::M_TIMING << 8, $p1);
+				$this::assertSame(QRMatrix::M_TIMING << 8, $matrix->get($i, 6));
+			}
+		}
+	}
+
+	/**
+	 * Tests the version patterns and verifies their positions - version < 7 skipped
+	 *
+	 * @dataProvider versionProvider
+	 */
+	public function testSetVersionNumber(int $version):void{
+
+		if($version < 7){
+			$this->markTestSkipped('N/A');
+
+			/** @noinspection PhpUnreachableStatementInspection */
+			return;
+		}
+
+		$matrix = $this->getMatrix($version)->setVersionNumber(true);
+
+		$this::assertSame(QRMatrix::M_VERSION, $matrix->get($matrix->size() - 9, 0));
+		$this::assertSame(QRMatrix::M_VERSION, $matrix->get($matrix->size() - 11, 5));
+		$this::assertSame(QRMatrix::M_VERSION, $matrix->get(0, $matrix->size() - 9));
+		$this::assertSame(QRMatrix::M_VERSION, $matrix->get(5, $matrix->size() - 11));
+	}
+
+	/**
+	 * Tests the format patterns and verifies their positions
+	 *
+	 * @dataProvider versionProvider
+	 */
+	public function testSetFormatInfo(int $version):void{
+		$matrix = $this->getMatrix($version)->setFormatInfo(0, true);
+
+		$this::assertSame(QRMatrix::M_FORMAT, $matrix->get(8, 0));
+		$this::assertSame(QRMatrix::M_FORMAT, $matrix->get(0, 8));
+		$this::assertSame(QRMatrix::M_FORMAT, $matrix->get($matrix->size() - 1, 8));
+		$this::assertSame(QRMatrix::M_FORMAT, $matrix->get($matrix->size() - 8, 8));
+	}
+
+	/**
+	 * Tests the quiet zone pattern and verifies its position
+	 *
+	 * @dataProvider versionProvider
+	 */
+	public function testSetQuietZone(int $version):void{
+		$matrix = $this->getMatrix($version);
+
+		$size = $matrix->size();
+		$q    = 5;
+
+		$matrix->set(0, 0, true, QRMatrix::M_TEST);
+		$matrix->set($size - 1, $size - 1, true, QRMatrix::M_TEST);
+
+		$matrix->setQuietZone($q);
+
+		$this::assertCount($size + 2 * $q, $matrix->matrix());
+		$this::assertCount($size + 2 * $q, $matrix->matrix()[$size - 1]);
+
+		$size = $matrix->size();
+		$this::assertSame(QRMatrix::M_QUIETZONE, $matrix->get(0, 0));
+		$this::assertSame(QRMatrix::M_QUIETZONE, $matrix->get($size - 1, $size - 1));
+
+		$this::assertSame(QRMatrix::M_TEST << 8, $matrix->get($q, $q));
+		$this::assertSame(QRMatrix::M_TEST << 8, $matrix->get($size - 1 - $q, $size - 1 - $q));
+	}
+
+	/**
+	 * Tests if an exception is thrown in an attempt to create it before data was written
+	 */
+	public function testSetQuietZoneException():void{
+		$this->expectException(QRCodeDataException::class);
+		$this->expectExceptionMessage('use only after writing data');
+
+		$this->matrix->setQuietZone();
+	}
+
+	public function testSetLogoSpaceOrientation():void{
+		$o = new QROptions;
+		$o->version      = 10;
+		$o->eccLevel     = QRCode::ECC_H;
+		$o->addQuietzone = false;
+
+		$matrix = (new QRCode($o))->getMatrix('testdata');
+		// also testing size adjustment to uneven numbers
+		$matrix->setLogoSpace(20, 14);
+
+		// NW corner
+		$this::assertNotSame(QRMatrix::M_LOGO, $matrix->get(17, 20));
+		$this::assertSame(QRMatrix::M_LOGO, $matrix->get(18, 21));
+
+		// SE corner
+		$this::assertSame(QRMatrix::M_LOGO, $matrix->get(38, 35));
+		$this::assertNotSame(QRMatrix::M_LOGO, $matrix->get(39, 36));
+	}
+
+	public function testSetLogoSpacePosition():void{
+		$o = new QROptions;
+		$o->version       = 10;
+		$o->eccLevel      = QRCode::ECC_H;
+		$o->addQuietzone  = true;
+		$o->quietzoneSize = 10;
+
+		$m = (new QRCode($o))->getMatrix('testdata');
+
+		// logo space should not overwrite quiet zone & function patterns
+		$m->setLogoSpace(21, 21, -10, -10);
+		$this::assertSame(QRMatrix::M_QUIETZONE, $m->get(9, 9));
+		$this::assertSame(QRMatrix::M_FINDER << 8, $m->get(10, 10));
+		$this::assertSame(QRMatrix::M_FINDER << 8, $m->get(16, 16));
+		$this::assertSame(QRMatrix::M_SEPARATOR, $m->get(17, 17));
+		$this::assertSame(QRMatrix::M_FORMAT << 8, $m->get(18, 18));
+		$this::assertSame(QRMatrix::M_LOGO, $m->get(19, 19));
+		$this::assertSame(QRMatrix::M_LOGO, $m->get(20, 20));
+		$this::assertNotSame(QRMatrix::M_LOGO, $m->get(21, 21));
+
+		// i just realized that setLogoSpace() could be called multiple times
+		// on the same instance and i'm not going to do anything about it :P
+		$m->setLogoSpace(21, 21, 45, 45);
+		$this::assertNotSame(QRMatrix::M_LOGO, $m->get(54, 54));
+		$this::assertSame(QRMatrix::M_LOGO, $m->get(55, 55));
+		$this::assertSame(QRMatrix::M_QUIETZONE, $m->get(67, 67));
+	}
+
+	public function testSetLogoSpaceInvalidEccException():void{
+		$this->expectException(QRCodeDataException::class);
+		$this->expectExceptionMessage('ECC level "H" required to add logo space');
+
+		(new QRCode)->getMatrix('testdata')->setLogoSpace(50, 50);
+	}
+
+	public function testSetLogoSpaceMaxSizeException():void{
+		$this->expectException(QRCodeDataException::class);
+		$this->expectExceptionMessage('logo space exceeds the maximum error correction capacity');
+
+		$o = new QROptions;
+		$o->version  = 5;
+		$o->eccLevel = QRCode::ECC_H;
+
+		(new QRCode($o))->getMatrix('testdata')->setLogoSpace(50, 50);
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Helpers/BitBufferTest.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Helpers/BitBufferTest.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Helpers/BitBufferTest.php	(revision 8427)
@@ -0,0 +1,54 @@
+<?php
+/**
+ * Class BitBufferTest
+ *
+ * @filesource   BitBufferTest.php
+ * @created      08.02.2016
+ * @package      chillerlan\QRCodeTest\Helpers
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2015 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCodeTest\Helpers;
+
+use chillerlan\QRCode\QRCode;
+use chillerlan\QRCode\Helpers\BitBuffer;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * BitBuffer coverage test
+ */
+final class BitBufferTest extends TestCase{
+
+	protected BitBuffer $bitBuffer;
+
+	protected function setUp():void{
+		$this->bitBuffer = new BitBuffer;
+	}
+
+	public function bitProvider():array{
+		return [
+			'number'   => [QRCode::DATA_NUMBER, 16],
+			'alphanum' => [QRCode::DATA_ALPHANUM, 32],
+			'byte'     => [QRCode::DATA_BYTE, 64],
+			'kanji'    => [QRCode::DATA_KANJI, 128],
+		];
+	}
+
+	/**
+	 * @dataProvider bitProvider
+	 */
+	public function testPut(int $data, int $value):void{
+		$this->bitBuffer->put($data, 4);
+		$this::assertSame($value, $this->bitBuffer->getBuffer()[0]);
+		$this::assertSame(4, $this->bitBuffer->getLength());
+	}
+
+	public function testClear():void{
+		$this->bitBuffer->clear();
+		$this::assertSame([], $this->bitBuffer->getBuffer());
+		$this::assertSame(0, $this->bitBuffer->getLength());
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Helpers/PolynomialTest.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Helpers/PolynomialTest.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Helpers/PolynomialTest.php	(revision 8427)
@@ -0,0 +1,42 @@
+<?php
+/**
+ * Class PolynomialTest
+ *
+ * @filesource   PolynomialTest.php
+ * @created      09.02.2016
+ * @package      chillerlan\QRCodeTest\Helpers
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2015 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCodeTest\Helpers;
+
+use chillerlan\QRCode\Helpers\Polynomial;
+use chillerlan\QRCode\QRCodeException;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * Polynomial coverage test
+ */
+final class PolynomialTest extends TestCase{
+
+	protected Polynomial $polynomial;
+
+	protected function setUp():void{
+		$this->polynomial = new Polynomial;
+	}
+
+	public function testGexp():void{
+		$this::assertSame(142, $this->polynomial->gexp(-1));
+		$this::assertSame(133, $this->polynomial->gexp(128));
+		$this::assertSame(2,   $this->polynomial->gexp(256));
+	}
+
+	public function testGlogException():void{
+		$this->expectException(QRCodeException::class);
+		$this->expectExceptionMessage('log(0)');
+
+		$this->polynomial->glog(0);
+	}
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/QRFpdfTest.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/QRFpdfTest.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/QRFpdfTest.php	(revision 8427)
@@ -0,0 +1,99 @@
+<?php
+/**
+ * Class QRFpdfTest
+ *
+ * @filesource   QRFpdfTest.php
+ * @created      03.06.2020
+ * @package      chillerlan\QRCodeTest\Output
+ * @author       smiley <smiley@chillerlan.net>
+ * @copyright    2020 smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCodeTest\Output;
+
+use FPDF;
+use chillerlan\QRCode\Output\{QRFpdf, QROutputInterface};
+use chillerlan\QRCode\{QRCode, QROptions};
+
+use function class_exists, substr;
+
+/**
+ * Tests the QRFpdf output module
+ */
+class QRFpdfTest extends QROutputTestAbstract{
+
+	/**
+	 * @inheritDoc
+	 * @internal
+	 */
+	public function setUp():void{
+
+		if(!class_exists(FPDF::class)){
+			$this->markTestSkipped('FPDF not available');
+
+			/** @noinspection PhpUnreachableStatementInspection */
+			return;
+		}
+
+		parent::setUp();
+	}
+
+	/**
+	 * @inheritDoc
+	 * @internal
+	 */
+	protected function getOutputInterface(QROptions $options):QROutputInterface{
+		return new QRFpdf($options, $this->matrix);
+	}
+
+	/**
+	 * @inheritDoc
+	 * @internal
+	 */
+	public function types():array{
+		return [
+			'fpdf' => [QRCode::OUTPUT_FPDF],
+		];
+	}
+
+	/**
+	 * @inheritDoc
+	 */
+	public function testSetModuleValues():void{
+
+		$this->options->moduleValues = [
+			// data
+			1024 => [0, 0, 0],
+			4    => [255, 255, 255],
+		];
+
+		$this->outputInterface = $this->getOutputInterface($this->options);
+		$this->outputInterface->dump();
+
+		$this::assertTrue(true); // tricking the code coverage
+	}
+
+	/**
+	 * @inheritDoc
+	 * @dataProvider types
+	 */
+	public function testRenderImage(string $type):void{
+		$this->options->outputType  = $type;
+		$this->options->imageBase64 = false;
+
+		// substr() to avoid CreationDate
+		$expected = substr(file_get_contents(__DIR__.'/samples/'.$type), 0, 2500);
+		$actual   = substr((new QRCode($this->options))->render('test'), 0, 2500);
+
+		$this::assertSame($expected, $actual);
+	}
+
+	public function testOutputGetResource():void{
+		$this->options->returnResource = true;
+		$this->outputInterface         = $this->getOutputInterface($this->options);
+
+		$this::assertInstanceOf(FPDF::class, $this->outputInterface->dump());
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/QRImageTest.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/QRImageTest.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/QRImageTest.php	(revision 8427)
@@ -0,0 +1,89 @@
+<?php
+/**
+ * Class QRImageTest
+ *
+ * @filesource   QRImageTest.php
+ * @created      24.12.2017
+ * @package      chillerlan\QRCodeTest\Output
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2017 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCodeTest\Output;
+
+use chillerlan\QRCode\{QRCode, QROptions};
+use chillerlan\QRCode\Output\{QROutputInterface, QRImage};
+
+/**
+ * Tests the QRImage output module
+ */
+class QRImageTest extends QROutputTestAbstract{
+
+	/**
+	 * @inheritDoc
+	 * @internal
+	 */
+	public function setUp():void{
+
+		if(!extension_loaded('gd')){
+			$this->markTestSkipped('ext-gd not loaded');
+			return;
+		}
+
+		parent::setUp();
+	}
+
+	/**
+	 * @inheritDoc
+	 * @internal
+	 */
+	protected function getOutputInterface(QROptions $options):QROutputInterface{
+		return new QRImage($options, $this->matrix);
+	}
+
+	/**
+	 * @inheritDoc
+	 * @internal
+	 */
+	public function types():array{
+		return [
+			'png' => [QRCode::OUTPUT_IMAGE_PNG],
+			'gif' => [QRCode::OUTPUT_IMAGE_GIF],
+			'jpg' => [QRCode::OUTPUT_IMAGE_JPG],
+		];
+	}
+
+	/**
+	 * @inheritDoc
+	 */
+	public function testSetModuleValues():void{
+
+		$this->options->moduleValues = [
+			// data
+			1024 => [0, 0, 0],
+			4    => [255, 255, 255],
+		];
+
+		$this->outputInterface = $this->getOutputInterface($this->options);
+		$this->outputInterface->dump();
+
+		$this::assertTrue(true); // tricking the code coverage
+	}
+
+	/**
+	 * @phan-suppress PhanUndeclaredClassReference
+	 */
+	public function testOutputGetResource():void{
+		$this->options->returnResource = true;
+		$this->outputInterface         = $this->getOutputInterface($this->options);
+
+		$actual = $this->outputInterface->dump();
+
+		/** @noinspection PhpElementIsNotAvailableInCurrentPhpVersionInspection */
+		\PHP_MAJOR_VERSION >= 8
+			? $this::assertInstanceOf(\GdImage::class, $actual)
+			: $this::assertIsResource($actual);
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/QRImagickTest.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/QRImagickTest.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/QRImagickTest.php	(revision 8427)
@@ -0,0 +1,86 @@
+<?php
+/**
+ * Class QRImagickTest
+ *
+ * @filesource   QRImagickTest.php
+ * @created      04.07.2018
+ * @package      chillerlan\QRCodeTest\Output
+ * @author       smiley <smiley@chillerlan.net>
+ * @copyright    2018 smiley
+ * @license      MIT
+ *
+ * @noinspection PhpUndefinedClassInspection
+ * @noinspection PhpComposerExtensionStubsInspection
+ */
+
+namespace chillerlan\QRCodeTest\Output;
+
+use Imagick;
+use chillerlan\QRCode\{QRCode, QROptions};
+use chillerlan\QRCode\Output\{QROutputInterface, QRImagick};
+
+/**
+ * Tests the QRImagick output module
+ */
+class QRImagickTest extends QROutputTestAbstract{
+
+	/**
+	 * @inheritDoc
+	 * @internal
+	 */
+	public function setUp():void{
+
+		if(!extension_loaded('imagick')){
+			$this->markTestSkipped('ext-imagick not loaded');
+
+			/** @noinspection PhpUnreachableStatementInspection */
+			return;
+		}
+
+		parent::setUp();
+	}
+
+	/**
+	 * @inheritDoc
+	 * @internal
+	 */
+	protected function getOutputInterface(QROptions $options):QROutputInterface{
+		return new QRImagick($options, $this->matrix);
+	}
+
+	/**
+	 * @inheritDoc
+	 * @internal
+	 */
+	public function types():array{
+		return [
+			'imagick' => [QRCode::OUTPUT_IMAGICK],
+		];
+	}
+
+	/**
+	 * @inheritDoc
+	 */
+	public function testSetModuleValues():void{
+
+		$this->options->moduleValues = [
+			// data
+			1024 => '#4A6000',
+			4    => '#ECF9BE',
+		];
+
+		$this->outputInterface = $this->getOutputInterface($this->options);
+		$this->outputInterface->dump();
+
+		$this::assertTrue(true); // tricking the code coverage
+	}
+
+	public function testOutputGetResource():void{
+		$this->options->returnResource = true;
+		$this->outputInterface         = $this->getOutputInterface($this->options);
+
+		$this::assertInstanceOf(Imagick::class, $this->outputInterface->dump());
+	}
+
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/QRMarkupTest.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/QRMarkupTest.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/QRMarkupTest.php	(revision 8427)
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Class QRMarkupTest
+ *
+ * @filesource   QRMarkupTest.php
+ * @created      24.12.2017
+ * @package      chillerlan\QRCodeTest\Output
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2017 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCodeTest\Output;
+
+use chillerlan\QRCode\{QRCode, QROptions};
+use chillerlan\QRCode\Output\{QROutputInterface, QRMarkup};
+
+/**
+ * Tests the QRMarkup output module
+ */
+class QRMarkupTest extends QROutputTestAbstract{
+
+	/**
+	 * @inheritDoc
+	 * @internal
+	 */
+	protected function getOutputInterface(QROptions $options):QROutputInterface{
+		return new QRMarkup($options, $this->matrix);
+	}
+
+	/**
+	 * @inheritDoc
+	 * @internal
+	 */
+	public function types():array{
+		return [
+			'html' => [QRCode::OUTPUT_MARKUP_HTML],
+			'svg'  => [QRCode::OUTPUT_MARKUP_SVG],
+		];
+	}
+
+	/**
+	 * @inheritDoc
+	 */
+	public function testSetModuleValues():void{
+		$this->options->imageBase64  = false;
+		$this->options->moduleValues = [
+			// data
+			1024 => '#4A6000',
+			4    => '#ECF9BE',
+		];
+
+		$this->outputInterface = $this->getOutputInterface($this->options);
+		$data = $this->outputInterface->dump();
+		$this::assertStringContainsString('#4A6000', $data);
+		$this::assertStringContainsString('#ECF9BE', $data);
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/QROutputTestAbstract.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/QROutputTestAbstract.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/QROutputTestAbstract.php	(revision 8427)
@@ -0,0 +1,140 @@
+<?php
+/**
+ * Class QROutputTestAbstract
+ *
+ * @filesource   QROutputTestAbstract.php
+ * @created      24.12.2017
+ * @package      chillerlan\QRCodeTest\Output
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2017 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCodeTest\Output;
+
+use chillerlan\QRCode\{QRCode, QROptions};
+use chillerlan\QRCode\Data\{Byte, QRMatrix};
+use chillerlan\QRCode\Output\{QRCodeOutputException, QROutputInterface};
+use PHPUnit\Framework\TestCase;
+
+use function file_exists, in_array, mkdir;
+
+use const PHP_OS_FAMILY, PHP_VERSION_ID;
+
+/**
+ * Test abstract for the several (built-in) output modules,
+ * should also be used to test custom output modules
+ */
+abstract class QROutputTestAbstract extends TestCase{
+
+	/** @internal  */
+	protected string $builddir = __DIR__.'/../../.build/output_test';
+	/** @internal  */
+	protected QROutputInterface $outputInterface;
+	/** @internal  */
+	protected QROptions $options;
+	/** @internal  */
+	protected QRMatrix $matrix;
+
+	/**
+	 * Attempts to create a directory under /.build and instances several required objects
+	 *
+	 * @internal
+	 */
+	protected function setUp():void{
+
+		if(!file_exists($this->builddir)){
+			mkdir($this->builddir, 0777, true);
+		}
+
+		$this->options         = new QROptions;
+		$this->matrix          = (new Byte($this->options, 'testdata'))->initMatrix(0);
+		$this->outputInterface = $this->getOutputInterface($this->options);
+	}
+
+	/**
+	 * Returns a QROutputInterface instance with the given options and using $this->matrix
+	 *
+	 * @internal
+	 */
+	abstract protected function getOutputInterface(QROptions $options):QROutputInterface;
+
+	/**
+	 * Validate the instance of the interface
+	 */
+	public function testInstance():void{
+		$this::assertInstanceOf(QROutputInterface::class, $this->outputInterface);
+	}
+
+	/**
+	 * Tests if an exception is thrown when trying to write a cache file to an invalid destination
+	 */
+	public function testSaveException():void{
+		$this->expectException(QRCodeOutputException::class);
+		$this->expectExceptionMessage('Could not write data to cache file: /foo/bar.test');
+
+		$this->options->cachefile = '/foo/bar.test';
+		$this->outputInterface = $this->getOutputInterface($this->options);
+		$this->outputInterface->dump();
+	}
+
+	/**
+	 * covers the module values settings
+	 */
+	abstract public function testSetModuleValues():void;
+
+	/*
+	 * additional, non-essential, potentially inaccurate coverage tests
+	 */
+
+	/**
+	 * @see testStringOutput()
+	 * @return string[][]
+	 * @internal
+	 */
+	abstract public function types():array;
+
+	/**
+	 * coverage of the built-in output modules
+	 *
+	 * @dataProvider types
+	 */
+	public function testStringOutput(string $type):void{
+		$this->options->outputType  = $type;
+		$this->options->cachefile   = $this->builddir.'/test.'.$type;
+		$this->options->imageBase64 = false;
+
+		$this->outputInterface     = $this->getOutputInterface($this->options);
+		$data                      = $this->outputInterface->dump(); // creates the cache file
+
+		$this::assertSame($data, file_get_contents($this->options->cachefile));
+	}
+
+	/**
+	 * covers the built-in output modules, tests against pre-rendered data
+	 *
+	 * @dataProvider types
+	 */
+	public function testRenderImage(string $type):void{
+
+		// may fail on CI, different PHP (platform) versions produce different output
+		// the samples were generated on php-7.4.3-Win32-vc15-x64
+		if(
+			(PHP_OS_FAMILY !== 'Windows' || PHP_VERSION_ID >= 80100)
+			&& in_array($type, [QRCode::OUTPUT_IMAGE_JPG, QRCode::OUTPUT_IMAGICK, QRCode::OUTPUT_MARKUP_SVG])
+		){
+			$this::markTestSkipped('may fail on CI');
+
+			/** @noinspection PhpUnreachableStatementInspection */
+			return;
+		}
+
+		$this->options->outputType = $type;
+
+		$this::assertSame(
+			trim(file_get_contents(__DIR__.'/samples/'.$type)),
+			trim((new QRCode($this->options))->render('test'))
+		);
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/QRStringTest.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/QRStringTest.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/QRStringTest.php	(revision 8427)
@@ -0,0 +1,76 @@
+<?php
+/**
+ * Class QRStringTest
+ *
+ * @filesource   QRStringTest.php
+ * @created      24.12.2017
+ * @package      chillerlan\QRCodeTest\Output
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2017 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCodeTest\Output;
+
+use chillerlan\QRCodeExamples\MyCustomOutput;
+use chillerlan\QRCode\{QRCode, QROptions};
+use chillerlan\QRCode\Output\{QROutputInterface, QRString};
+
+/**
+ * Tests the QRString output module
+ */
+class QRStringTest extends QROutputTestAbstract{
+
+	/**
+	 * @inheritDoc
+	 * @internal
+	 */
+	protected function getOutputInterface(QROptions $options):QROutputInterface{
+		return new QRString($options, $this->matrix);
+	}
+
+	/**
+	 * @inheritDoc
+	 * @internal
+	 */
+	public function types():array{
+		return [
+			'json' => [QRCode::OUTPUT_STRING_JSON],
+			'text' => [QRCode::OUTPUT_STRING_TEXT],
+		];
+	}
+
+	/**
+	 * @inheritDoc
+	 */
+	public function testSetModuleValues():void{
+
+		$this->options->moduleValues = [
+			// data
+			1024 => 'A',
+			4    => 'B',
+		];
+
+		$this->outputInterface = $this->getOutputInterface($this->options);
+		$data                  = $this->outputInterface->dump();
+
+		$this::assertStringContainsString('A', $data);
+		$this::assertStringContainsString('B', $data);
+	}
+
+	/**
+	 * covers the custom output functionality via an example
+	 */
+	public function testCustomOutput():void{
+		$this->options->version         = 5;
+		$this->options->eccLevel        = QRCode::ECC_L;
+		$this->options->outputType      = QRCode::OUTPUT_CUSTOM;
+		$this->options->outputInterface = MyCustomOutput::class;
+
+		$this::assertSame(
+			file_get_contents(__DIR__.'/samples/custom'),
+			(new QRCode($this->options))->render('test')
+		);
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/samples/custom
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/samples/custom	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/samples/custom	(revision 8427)
@@ -0,0 +1,45 @@
+000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000
+000011111110111010000101111010000011111110000
+000010000010111000001101011000001010000010000
+000010111010101101011000001101011010111010000
+000010111010110100111110010100111010111010000
+000010111010000001101011000001101010111010000
+000010000010100111110010100111110010000010000
+000011111110101010101010101010101011111110000
+000000000000010010100111110010100000000000000
+000011001110000101111010000101111001011110000
+000000000000111010000101111010000111100010000
+000001011010100111110010100111110011001010000
+000010000101111101011000001101011110011110000
+000000011010100011000001101011000101110100000
+000011001100001001101011000001101010011010000
+000010110111110000001101011000001100110100000
+000010000100100010100111110010100001100100000
+000011111110111101111010000101111010100110000
+000011010000111010000101111010000111100100000
+000010101111111111110010100111110011001000000
+000010110001110101011000001101011110011010000
+000001001111100011000001101011000101110010000
+000011000100110001101011000001101010011100000
+000001000011001000001101011000001100110000000
+000011101001011010100111110010100001100000000
+000010111010001101111010000101111010100110000
+000011100000001010000101111010000111100000000
+000000001110110111110010100111110011001000000
+000000011001011101011000001101011110011100000
+000011111110101011000001101011001111110110000
+000000000000110001101011000001101000111100000
+000011111110001000001101011000011010110000000
+000010000010101010100111110010101000100100000
+000010111010111101111010000101111111100110000
+000010111010011010000101111010001101100010000
+000010111010000111110010100111100101101100000
+000010000010101101011000001101001100111100000
+000011111110101011000001101011000110010110000
+000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/samples/gif
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/samples/gif	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/samples/gif	(revision 8427)
@@ -0,0 +1,1 @@
+data:image/gif;base64,R0lGODlhkQCRAIAAAAQCBP///yH5BAEAAAEALAAAAACRAJEAAAL+jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8YhMKpfMpvOpBEin1Kr1ek1gpY6qdgsOU1niMviL7Y4R5raV7I4D0NmGly13w/Nm+tu+dsDXtjcY5nfHkGhgWFY4x7GoIOlXGRmYQnmhKYg56clZEToyOjF6CuqJURrCGoE6pRaLN7vh+nH7AMsFWMuouglcIklIy9vpG0CcmlyMfJzJLGb5DFlN/dvcZ2wdre3Ija0s3T3+PR2+sgx+nd7+ng1tjg6Psk4fX36vT464JX5i3xl3+WTJE+esoDpyA+vtKodwW72ADP8RnAfxYkT+dgpVCLToUFjHBR/TaDRRsk7IZAAvJsT4yJ/Jlfh0VZw50t5NlTlfGuTHEebCc4dcSoSQ8s9ElDuV9jxqk2jDnBSlgnwa9KdMnkI9iqSQa9VXU2NblX11VkPYXgeZsgz2FsRaRWk9zCVZV2xcUXkv7QXb18LdT39FNKq5b+NhnDoXM05s1DHXqpIh0wRaObDazJaxyuM8WC9ozKQVg4bC1ilqHVNX52jt+gbs2DVm087nM/Lnrw9bh4YbR6vujEur+dacgY/wy8vxBv0tOE/zrlRPGr9KvXHw1Kanb1UNne/flw9bXu6snThu7OWtewaPXLR6jMfH9+PODT3l+eT+ed+naxVRMaVWX1vM4XedgEPtFuBkCK4nx0/hAaZggg4CyKAhEsYHXGn5YTfdYhsWZlaFEF7oXIaDjGggCejlhiFpyhHIYXQNzvedabnot6CMdRXoI4kHvpAUWY81ZaSKMRQpAZA5NvmfC0yideSNSXpIg5Pu0ceef1W22IKWxZ0In31f4tjji14itmaZYD6ipplsyukmml6daR6ZPFqI5W17vtfdbYA+mN2fUBgap5KCFtpmoGMeGiVhig4p5WhvbgmkbZVaeiWLQaIYpqV2VsfndxN2IOqo2T3J56l+jdYpjTe6akuNpL4HI5k2TNheqyB+KKQ3l1IJZlKachn+bHqoNgpsTazOwCuzvjL2rAzGRmqqtEhBtV+2JkpaVIxXHmtYU4hyu6W3w+JiLrbNqpYnuOSWqKKYKYZ777i/DtPut/M+am+os0b6763ITrppvV1aCSWdhnb7bqLwElotreIpjOe7scb4sFsYcyXxud8u2S/CjGYsbro9qtvnySBruyoM1/qLJKbuEllyy1Ma3PGd60b1sR7D9SqsqiEepiPMENc68HM1p+yz0YSKOLTSHksNtZ5Q7QwunJlVvK/BO6QKNrUqvyZq2aBanB5nak/86Nhpa0x31ovejXfeeu/Nd99+/w144IIPTnjhhh+OeOKKL854444/DnnkkhcCXgAAOw==
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/samples/html
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/samples/html	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/samples/html	(revision 8427)
@@ -0,0 +1,31 @@
+<div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+</div>
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/samples/jpg
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/samples/jpg	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/samples/jpg	(revision 8427)
@@ -0,0 +1,1 @@
+data:image/jpg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2OTApLCBxdWFsaXR5ID0gODUK/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQgAkQCRAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A+y6KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDxn9pr46f8KW/wCEf/4pb+3f7Z+0/wDMQ+zeT5Plf9M33Z832xt7548Z/wCG5/8Aql3/AJX/AP7no/4Kaf8ANPv+4l/7a16n4O8NfBnw1+zv4W8aeNPBnhKO0j8P6bNf382gRXEjPLFEu9tsbOzM7jJwTk5Pc0AeWf8ADc//AFS7/wAr/wD9z0f8Nz/9Uu/8r/8A9z12f/Cy/wBjb/oG+DP/AAjJP/kaum+HF9+zF8RNcm0Twd4Y8GanfwWzXUkX/CKiHbErKpbMkCj7zqMZzz9aAOA8Cftlf8JR440Hwz/wrj7J/a+pW9j9o/tvf5Xmyqm/b5A3Y3ZxkZx1FemftNfHT/hS3/CP/wDFLf27/bP2n/mIfZvJ8nyv+mb7s+b7Y2988fLPxJ0nStD/AG+NL0vRNMstMsIPEmh+Va2cCwxR7ltWO1FAAyxJOB1JNfYHx08S/Brw7/Y//C27bRZvtHn/ANm/2jozX+Nvl+btxE+z70eemeOuOADzL4JftW/8LK+J+keCv+EC/sr+0fO/0v8AtfzvL8uCSX7nkrnOzHUYzn2r6Zr4T+H3gvU/AHx4/wCF5apo8Oj/AAqF9e39nqcLRmNLK7SVLMrbRkzKrefCAnlgqG+YKAcfY3w48e+E/iJoc2t+DtW/tOwguWtZJfs8sO2VVViuJFU/ddTnGOfrQB5N+zj+0h/wuHxxeeGf+EM/sT7Npr332j+0/tG7bLEmzb5SYz5uc57dOeMX42/tW/8ACtfifq/gr/hAv7V/s7yf9L/tfyfM8yCOX7nktjG/HU5xn2rxn/gnF/yW/Wf+xbn/APSm2qH452lrf/t/QWN9bQ3Vpc+INEhngmjDxyo0VoGRlPDKQSCDwQaAO5/4bn/6pd/5X/8A7no/4bn/AOqXf+V//wC569m+JsH7OPw1/s//AITXwj4M0r+0fN+yf8Uuk3meXs3/AOqhbGN6dcZzx3rjP+Fl/sbf9A3wZ/4Rkn/yNQBxn/Dc/wD1S7/yv/8A3PXpv7OP7SH/AAuHxxeeGf8AhDP7E+zaa999o/tP7Ru2yxJs2+UmM+bnOe3TnjpvhxonwA+Imhza34O8FeDNTsILlrWSX/hGo4dsqqrFcSRKfuupzjHP1r5Z/wCCcX/Jb9Z/7Fuf/wBKbagD7/ooooAKKKKACiiigD4z/wCCmn/NPv8AuJf+2tdn8ZP+Uedj/wBi3oX/AKMtK4z/AIKaf80+/wC4l/7a16zqXgrVfiJ+xdoHg7RLiyt7/UPDejeVJeOyxL5Yt5TuKqx+6hxgHnH1oA/Nqvpn/gnF/wAlv1n/ALFuf/0ptqP+GKvin/0H/Bn/AIGXP/yPXsH7Jv7PXjT4TfEXUPEfiPU/D91aXOkSWSJYTzPIHaaFwSHiQbcRt3zkjigDx/4yf8pDLH/sZNC/9F2ldn/wU0/5p9/3Ev8A21rjPjJ/ykMsf+xk0L/0XaV9Aftg/BTxV8Yf+EW/4RnUNFtP7I+1/aP7RmlTd5vk7duyN848ps5x1HXsAdN4b8FaV8RP2VfCng7W7i9t7DUPDelebJZuqyr5ccEo2llYfeQZyDxn618//Efxrqv7JmuQ/Dn4c29lquk6jbLrc02vo01ws8jNCyq0LRKE226EAqTktzjAHM/8MVfFP/oP+DP/AAMuf/kevqD9k34X6/8ACb4dah4c8R3mmXV3c6vJeo9hI7xhGhhQAl0Q7sxt2xgjmgA+Cn7PXgv4TeKrnxH4c1PxBdXdzYvZOl/PC8YRnjckBIkO7Ma98YJ4r5f+Mn/KQyx/7GTQv/RdpX3/AF8AfGT/AJSGWP8A2Mmhf+i7SgDs/wDgpp/zT7/uJf8AtrXxnX6M/tg/BTxV8Yf+EW/4RnUNFtP7I+1/aP7RmlTd5vk7duyN848ps5x1HXt8/wD/AAxV8U/+g/4M/wDAy5/+R6APZv8AgnF/yRDWf+xkn/8ASa2rxn/gnF/yW/Wf+xbn/wDSm2r6g/ZN+F+v/Cb4dah4c8R3mmXV3c6vJeo9hI7xhGhhQAl0Q7sxt2xgjmvl/wD4Jxf8lv1n/sW5/wD0ptqAPv8AooooAKKKKACiiigD5N/4KHeE/FXij/hBv+EZ8Na1rf2b+0PtH9nWMtx5W77Nt3bFO3O1sZ64PpXkuheN/wBrrQ9DsNE0vRvGdvYafbR2trF/wh6t5cUahUXLW5JwoAyST619TftNfHT/AIUt/wAI/wD8Ut/bv9s/af8AmIfZvJ8nyv8Apm+7Pm+2NvfPHjP/AA3P/wBUu/8AK/8A/c9AHGf8LL/bJ/6BvjP/AMIyP/5Go/4WX+2T/wBA3xn/AOEZH/8AI1dn/wANz/8AVLv/ACv/AP3PX2ZQB+cHg7w18ZvEv7RHhbxp408GeLZLuTxBps1/fzaBLbxqkUsS722xqiqqIMnAGBk9zX1B+2D4l+Mvh3/hFv8AhUltrU32j7X/AGl/Z2jLf42+T5W7MT7PvSY6Z5644PGX7SH/AAjv7Q0Hwk/4Qz7V5upWFj/aX9p7MfaVhO/yvKP3fN6b+dvUZ42f2mvjp/wpb/hH/wDilv7d/tn7T/zEPs3k+T5X/TN92fN9sbe+eADmfib8an0X9mUX9h470W3+JUGm6eLu0M1s17FeGSFbpHtWB2uuZQyFBsweBjjZ/Yp8e+LPiJ8LNT1vxjq39p38Gty2scv2eKHbEsEDBcRqo+87HOM8/SvnP42/Avzvhhq/7QP/AAlO3+3PJ13+xf7Pz5H2+eNvK8/zPm2efjd5Y3bei549m/4Jxf8AJENZ/wCxkn/9JragCH9k3xf8ftf+IuoWfxUtPEEOippEksDX/h9bKP7QJoQoDiFMtsMny56ZOOOPH/2ofCPxN/4al1nxf4Q8HeJrv7Nc2F1YX9no8txF5sVtAQykIyNtdMEHIyCD3FfWf7R3xX/4U94Hs/E39g/239p1JLH7P9s+z7d0Ur792x848rGMd+vHOz8EvHX/AAsr4YaR41/sv+yv7R87/RPtHneX5c8kX39q5zsz0GM496APjP8A4WX+2T/0DfGf/hGR/wDyNR/wsv8AbJ/6BvjP/wAIyP8A+Rq+mf2mvjp/wpb/AIR//ilv7d/tn7T/AMxD7N5Pk+V/0zfdnzfbG3vnjxn/AIbn/wCqXf8Alf8A/uegDjP+Fl/tk/8AQN8Z/wDhGR//ACNXQfsDeCPGnhr4w6tfeI/CHiDRrSTw/NCk9/ps1vGzm4tyEDOoBbCscdcA+lfSf7OPxX/4XD4HvPE39g/2J9m1J7H7P9s+0btsUT792xMZ83GMduvPHGfs4/tIf8Lh8cXnhn/hDP7E+zaa999o/tP7Ru2yxJs2+UmM+bnOe3TngA9/ooooAKKKKACiiigD4z/4Kaf80+/7iX/trXqfg7w18GfDX7O/hbxp408GeEo7SPw/ps1/fzaBFcSM8sUS722xs7MzuMnBOTk9zXln/BTT/mn3/cS/9ta7P4yf8o87H/sW9C/9GWlAHkHxr+Gq/GTxVbeJ/wBnnwrpl74VtbFLC7ksIoNMjF6rySODFN5TM3lyw/OFIIIGflIHiX/C2Pin/wBFL8Z/+D25/wDi6634KftC+NPhN4VufDnhzTPD91aXN896738EzyB2SNCAUlQbcRr2zknmvp//AIYq+Fn/AEH/ABn/AOBlt/8AI9AHn/ww8efC/Xvgrb6Vqt1Zan8adQtru2sNQu9Nkl1JtReSVLEi+aM7XXNuEkMg8vC8rt49A/Zl+Fvjub/hIP8AhoHQv+Eix9m/sX/hIbuDV/I/1vn+VueTyt37nd03bV67eKWvfsv+Afhrod/8RtC1fxNc6t4VtpNbsYb25ge3kntVM0ayKkKsULIAwVlJGcEHmvJv+G1fin/0APBn/gHc/wDyRQB9J/tl2lrYfsqeJrGxtobW0torCGCCGMJHEi3luFRVHCqAAABwAK5L/gnF/wAkQ1n/ALGSf/0mtq0/2kNbuvEv7Dtx4jvo4Y7vVdI0i9nSEERq8s9q7BQSSFyxxkk47msz/gnF/wAkQ1n/ALGSf/0mtqAPAP2cfinpE3ji8X47+KL3X/DQ01za22vifVbdLzzYtjrEwkCuI/OAfaMBmGfmwfobxd+0J8DrD4TeIPD3gHxTDpN2dIvItJt9N0i6tFiuHjcoYysKrGxkbO7IwTnPevz5r6//AGd/2X/APxE+DuheMdb1fxNb3+ofaPNjs7mBYl8u4liG0NCx+6gzknnP0oA5n9mX4peBJv8AhIP+Ggdd/wCEix9m/sX/AISG0n1fyP8AW+f5W5JPK3fud3TdtXrt45/xZ+zz8TvFPirVvE/gjwXDN4V1e+mv9EkhvbS3jeymcyQFYmkVo1MbJhCqlRwQMYr6G/4Yq+Fn/Qf8Z/8AgZbf/I9Y3wU+NfiqH4/WPwIXT9FPhrRbm80S2ujDL9teCxhlWJnfzNhciBNxCAHJwF4wAH7OPinQv2dvA954K+Md9/wjOv3upPqlvaeU95vtXiiiWTfbCRBl4ZRtJDfLnGCCfMv+CcX/ACW/Wf8AsW5//Sm2o/4KO/8AJb9G/wCxbg/9KbmvqD4Kfs9eC/hN4qufEfhzU/EF1d3Ni9k6X88LxhGeNyQEiQ7sxr3xgnigD1+iiigAooooAKKKKACviD4lfsifEnxL8RfEviOx1vwlHaarq91ewJNdXAkVJZmdQwEBAbDDOCRnua9G/bn+KXjv4a/8Id/whWu/2V/aP277X/okE3meX9n2f61Gxje/TGc89q8TsPit+1/f2NvfWNv4turS5iWaCeHwhE8cqMMq6sLbDKQQQRwQaAPqb9k34X6/8Jvh1qHhzxHeaZdXdzq8l6j2EjvGEaGFACXRDuzG3bGCOa8//ZN/Z68afCb4i6h4j8R6n4furS50iSyRLCeZ5A7TQuCQ8SDbiNu+ckcV4/8A8LL/AGyf+gb4z/8ACMj/APkaj/hZf7ZP/QN8Z/8AhGR//I1AHsHj79nrxpr/AO1RbfFSz1Pw/HosWr6betBLPMLnZbLAHAURFdx8psfNjkZI7ep/HT41+Ffg9/Y//CTafrV3/a/n/Z/7Ohifb5Xl7t2+RMZ81cYz0PTv8meAvjz8fP8Ahc/hjwh4v1+9tPtOt2Nrf2F5ottby+VLLGCrAwq67kfIIwcEEdjX2Z8Tfhb4E+JX9n/8JroX9q/2d5v2T/S54fL8zZv/ANU65zsTrnGOO9AHw18b/gp4qm0DxB8d11DRR4a1q5Gt21qZpftqQX06tErp5ewOBOm4ByBg4LcZ5/4Kfs9eNPiz4VufEfhzU/D9raW189k6X88ySF1SNyQEicbcSL3zkHivrL9pW98I3v7Pet/C3wJqumaprVpFZ6fY+H9OvVu78C2uYd0YhVmlZo0iYtkEgIxPQmuf/Yp1bSvhr8LNT0L4janZeDdWn1uW7hsdfnWwuJIGggRZVjmKsULI6hgMEowzkGgC7/wUd/5Iho3/AGMkH/pNc10H7KOt2vhr9jjSPEd9HNJaaVY6nezpCAZGSK6uXYKCQC2FOMkDPcV5/wDt8+N/BfiX4PaTY+HPF/h/WbuPxBDM8FhqUNxIqC3uAXKoxIXLKM9MketeDfA74peO5NQ8LfCR9dz4K1TUotLvNN+yQfvbW6uMXEfm7PNG4SyfMHDDdwRgYAPZvib/AMZg/wBn/wDCtP8AiUf8Il5v2/8A4SH9x5n2vZ5fleR5ucfZpN27bjK4zk48s/ZR0S68Nftj6R4cvpIZLvSr7U7Kd4STGzxWtyjFSQCVypxkA47Cvbfjp4T8VfBP+x/+Gb/DWtWP9s+f/bv9nWMuq7/J8v7Pu85ZfLx5s+Nu3dk5ztGPka18ZeN/DHxRu/GSXk2neMIr65luZprOMSR3Eu9Zw0TptVvncFSowTwBjgA9s/4KO/8AJb9G/wCxbg/9Kbmvv+vk39nHwtoX7RPge88a/GOx/wCEm1+y1J9Lt7vzXs9lqkUUqx7LYxocPNKdxBb5sZwAB9ZUAFFFFABRRRQAUUUUAfGf/BTT/mn3/cS/9ta9mtvHX/Ctf2QfDXjX+y/7V/s7w3pH+ifaPJ8zzEt4vv7Wxjfnoc4x714z/wAFNP8Amn3/AHEv/bWuz+Mn/KPOx/7FvQv/AEZaUAcZ/wANz/8AVLv/ACv/AP3PXpv7OP7SH/C4fHF54Z/4Qz+xPs2mvffaP7T+0btssSbNvlJjPm5znt054/Oavpn/AIJxf8lv1n/sW5//AEptqAD4yf8AKQyx/wCxk0L/ANF2lff9fAHxk/5SGWP/AGMmhf8Aou0r03/god4s8VeF/wDhBv8AhGfEutaJ9p/tD7R/Z19Lb+bt+zbd2xhuxubGemT60AfP9z46/wCFa/tfeJfGv9l/2r/Z3iTV/wDRPtHk+Z5j3EX39rYxvz0OcY96xv2jviv/AMLh8cWfib+wf7E+zaalj9n+2faN22WV9+7YmM+bjGO3Xnjufg/8N/EXh7xbo3xg+MGgQ3HgCeJ9Q1LUtSlh1BZxdQsIZJIQzyuzSzRHlCQTuOMEj3n/AIWX+xt/0DfBn/hGSf8AyNQBxn/DDH/VUf8Aygf/AHRXjNt4F/4Vr+194a8Ff2p/av8AZ3iTSP8AS/s/k+Z5j28v3NzYxvx1OcZ9q+rP2+fEOv8Ahr4PaTfeHNc1PRruTxBDC89hdvbyMht7glCyEErlVOOmQPSrv7Jvh7QPFPwX8K+N/E+h6ZrniqWWeaTW9RtEub93iu5ViczuDIWRURVO7KhFAxgUAe818NftUfs3/wDCO6R41+Lf/CZ/avN1Jr7+zf7M2Y+03ajZ5vmn7vm9dnO3oM8dn/wUO8WeKvC//CDf8Iz4l1rRPtP9ofaP7Ovpbfzdv2bbu2MN2NzYz0yfWvP/AIV6d8VtLvNF8e/GzUNa1H4Sy2wutQOr6v8A2laTRTQkWrPaeZI7/vpICAYyVbDHG3IAOZ/Zx/aQ/wCFPeB7zwz/AMIZ/bf2nUnvvtH9p/Z9u6KJNm3ynzjys5z36cc/TP7OP7SH/C4fHF54Z/4Qz+xPs2mvffaP7T+0btssSbNvlJjPm5znt0548G+Nfw1X4yeKrbxP+zz4V0y98K2tilhdyWEUGmRi9V5JHBim8pmby5YfnCkEEDPykD7Y8N+CPBfhq+e+8OeEPD+jXckRheew02G3kZCQShZFBK5VTjpkD0oA6CiiigAooooAKKKKAPjP/gpp/wA0+/7iX/trXufhvwVpXxE/ZV8KeDtbuL23sNQ8N6V5slm6rKvlxwSjaWVh95BnIPGfrXM/tg/BTxV8Yf8AhFv+EZ1DRbT+yPtf2j+0ZpU3eb5O3bsjfOPKbOcdR17fP/8AwxV8U/8AoP8Agz/wMuf/AJHoA9m/4Yq+Fn/Qf8Z/+Blt/wDI9d18FP2evBfwm8VXPiPw5qfiC6u7mxeydL+eF4wjPG5ICRId2Y174wTxXy//AMMVfFP/AKD/AIM/8DLn/wCR6P8Ahir4p/8AQf8ABn/gZc//ACPQAfGT/lIZY/8AYyaF/wCi7Suz/wCCmn/NPv8AuJf+2tZnw1/ZE+JPhr4i+GvEd9rfhKS00rV7W9nSG6uDIyRTK7BQYAC2FOMkDPcV7B+2D8FPFXxh/wCEW/4RnUNFtP7I+1/aP7RmlTd5vk7duyN848ps5x1HXsAfI3iX9oXxpr/wai+Fd5pnh+PRYrG0slnigmFzstjGUJYyldx8pc/Ljk4A7eP19s/s7/sv+Pvh38YtC8Y63q/hm4sNP+0ebHZ3M7St5lvLENoaFR95xnJHGfpXQftZfs9eNPiz8RdP8R+HNT8P2tpbaRHZOl/PMkhdZpnJASJxtxIvfOQeKAOF+HHjXVf2s9cm+HPxGt7LStJ062bW4ZtARobhp42WFVZpmlUptuHJAUHIXnGQdTTPihr/AMG/jbov7PXhiz0y88K2mr2NlHd6jG8l+UvHjmlJdHSPcGuHC/u8ABcg8k9N+yb+z140+E3xF1DxH4j1Pw/dWlzpElkiWE8zyB2mhcEh4kG3Ebd85I4r3/4laJdeJfh14l8OWMkMd3qukXVlA8xIjV5YWRSxAJC5YZwCcdjQB8p/8FNP+aff9xL/ANta5P4OfFDX/jIvh39nrxPZ6ZZ+FbuxSyku9OjeO/CWcHnREO7vHuLW6Bv3eCC2AOCPef2Pvgp4q+D3/CU/8JNqGi3f9r/ZPs/9nTSvt8rzt27fGmM+auMZ6Hp39/oA4b4KfC/QPhN4VufDnhy81O6tLm+e9d7+RHkDskaEAoiDbiNe2ck814z+yb+0L40+LPxF1Dw54j0zw/a2ltpEl6j2EEySF1mhQAl5XG3Ejds5A5r6fooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/Z
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/samples/json
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/samples/json	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/samples/json	(revision 8427)
@@ -0,0 +1,1 @@
+[[18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18],[18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18],[18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18],[18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18],[18,18,18,18,1536,1536,1536,1536,1536,1536,1536,8,3584,1024,4,4,1024,8,1536,1536,1536,1536,1536,1536,1536,18,18,18,18],[18,18,18,18,1536,6,6,6,6,6,1536,8,14,1024,4,4,1024,8,1536,6,6,6,6,6,1536,18,18,18,18],[18,18,18,18,1536,6,5632,5632,5632,6,1536,8,3584,4,1024,4,1024,8,1536,6,5632,5632,5632,6,1536,18,18,18,18],[18,18,18,18,1536,6,5632,5632,5632,6,1536,8,3584,4,4,1024,4,8,1536,6,5632,5632,5632,6,1536,18,18,18,18],[18,18,18,18,1536,6,5632,5632,5632,6,1536,8,3584,1024,1024,4,4,8,1536,6,5632,5632,5632,6,1536,18,18,18,18],[18,18,18,18,1536,6,6,6,6,6,1536,8,14,4,4,4,4,8,1536,6,6,6,6,6,1536,18,18,18,18],[18,18,18,18,1536,1536,1536,1536,1536,1536,1536,8,3072,12,3072,12,3072,8,1536,1536,1536,1536,1536,1536,1536,18,18,18,18],[18,18,18,18,8,8,8,8,8,8,8,8,14,1024,1024,4,4,8,8,8,8,8,8,8,8,18,18,18,18],[18,18,18,18,3584,3584,3584,3584,14,14,3072,14,3584,4,1024,4,4,3584,14,14,3584,3584,3584,14,3584,18,18,18,18],[18,18,18,18,1024,4,4,1024,1024,1024,12,1024,4,4,1024,4,1024,4,4,1024,4,1024,1024,4,1024,18,18,18,18],[18,18,18,18,1024,4,1024,4,1024,1024,3072,4,4,4,1024,4,1024,1024,1024,1024,1024,4,4,1024,1024,18,18,18,18],[18,18,18,18,1024,4,1024,1024,4,4,12,1024,1024,4,1024,4,1024,1024,4,4,4,1024,4,1024,4,18,18,18,18],[18,18,18,18,4,1024,1024,4,1024,4,3072,4,4,1024,1024,1024,4,1024,4,4,1024,1024,4,1024,4,18,18,18,18],[18,18,18,18,8,8,8,8,8,8,8,8,512,4,1024,4,4,1024,4,1024,4,1024,4,1024,4,18,18,18,18],[18,18,18,18,1536,1536,1536,1536,1536,1536,1536,8,14,4,1024,4,4,1024,1024,4,1024,1024,1024,4,4,18,18,18,18],[18,18,18,18,1536,6,6,6,6,6,1536,8,14,1024,4,1024,1024,1024,1024,4,4,1024,1024,4,4,18,18,18,18],[18,18,18,18,1536,6,5632,5632,5632,6,1536,8,14,1024,1024,1024,4,4,1024,4,4,4,1024,1024,1024,18,18,18,18],[18,18,18,18,1536,6,5632,5632,5632,6,1536,8,3584,1024,4,4,4,1024,4,4,1024,1024,4,1024,4,18,18,18,18],[18,18,18,18,1536,6,5632,5632,5632,6,1536,8,3584,4,1024,1024,4,1024,4,4,1024,4,1024,4,4,18,18,18,18],[18,18,18,18,1536,6,6,6,6,6,1536,8,3584,1024,1024,1024,1024,4,1024,4,1024,1024,4,4,1024,18,18,18,18],[18,18,18,18,1536,1536,1536,1536,1536,1536,1536,8,3584,1024,4,1024,1024,4,4,1024,4,4,4,4,4,18,18,18,18],[18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18],[18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18],[18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18],[18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18]]
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/samples/png
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/samples/png	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/samples/png	(revision 8427)
@@ -0,0 +1,1 @@
+data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJEAAACRCAIAAABMus10AAAABnRSTlMA/wD/AP83WBt9AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACd0lEQVR4nO3dQW7jIABA0fFo7n/ldFnJC0sMBvu3762bJtUXMnUwHJ/P5w8pf5/+AAzTrEezHs16NOvRrEezHs16NOvRrEezHs16NOvRrEezHs16NOvRrEeznn8zLz6O467Pce20aOX6fa9XuJxeO/SbbzSzDMc469GsR7MezXqm5iAnNy5vHZplrJs4bPuLhhhnPZr1aNajWc+dc5CToavu0NV+6F7GU/OIdQ8cGWc9mvVo1qNZz8I5yFO2TUmeYpz1aNajWY9mPT9hDjKzPKTIOOvRrEezHs16Fs5B1l38n5pWvGQ6Y5z1aNajWY9mPXfOQbY9VDKzHmToq5ltf9EQ46xHsx7NejTrOV7yv/0M38Xwdpr1aNajWc9j+4PcuIvHzKO6626LrFsaa5z1aNajWY9mPfv2BzldhGd2AJm5gM9MOp7a0OzEOOvRrEezHs169u0PMnQB3/ZA7Utumgwxzno069GsR7Oefc/mzkwrtq34uHGrtJnffM0469GsR7MezXqm5iAzx7hse3pl3eKRpxhnPZr1aNajWc9j58XM3DXYtle79SDcQ7MezXo060mem7ttecg717AYZz2a9WjWo1lP8tzc6x9ed7fCfRD+k2Y9mvVo1pM8N3fmfbftALJuHa1x1qNZj2Y9mvUkz6y78fJ+4+LXbef1Gmc9mvVo1qNZT3IOcjLzeM6697UehG+a9WjWo1lP8tzck3WLR2Yez5n54WvGWY9mPZr1aNaTPDf32szK0XW3NnwX86tp1qNZj2Y9P+Hc3N/GOOvRrEezHs16NOvRrEezHs16NOvRrEezHs16NOvRrEezHs16NOvRrEezni+wifc/oOyB/wAAAABJRU5ErkJggg==
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/samples/svg
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/samples/svg	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/Output/samples/svg	(revision 8427)
@@ -0,0 +1,1 @@
+data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJxci1zdmcgIiBzdHlsZT0id2lkdGg6IDEwMCU7IGhlaWdodDogYXV0bzsiIHZpZXdCb3g9IjAgMCAyOSAyOSI+DQo8ZGVmcz48c3R5bGU+cmVjdHtzaGFwZS1yZW5kZXJpbmc6Y3Jpc3BFZGdlc308L3N0eWxlPjwvZGVmcz4NCjxwYXRoIGNsYXNzPSJxci00ICIgc3Ryb2tlPSJ0cmFuc3BhcmVudCIgZmlsbD0iI2ZmZiIgZmlsbC1vcGFjaXR5PSIxIiBkPSJNMTQgNCBoMiB2MSBoLTJaIE0xNCA1IGgyIHYxIGgtMlogTTEzIDYgaDEgdjEgaC0xWiBNMTUgNiBoMSB2MSBoLTFaIE0xMyA3IGgyIHYxIGgtMlogTTE2IDcgaDEgdjEgaC0xWiBNMTUgOCBoMiB2MSBoLTJaIE0xMyA5IGg0IHYxIGgtNFogTTE1IDExIGgyIHYxIGgtMlogTTEzIDEyIGgxIHYxIGgtMVogTTE1IDEyIGgyIHYxIGgtMlogTTUgMTMgaDIgdjEgaC0yWiBNMTIgMTMgaDIgdjEgaC0yWiBNMTUgMTMgaDEgdjEgaC0xWiBNMTcgMTMgaDIgdjEgaC0yWiBNMjAgMTMgaDEgdjEgaC0xWiBNMjMgMTMgaDEgdjEgaC0xWiBNNSAxNCBoMSB2MSBoLTFaIE03IDE0IGgxIHYxIGgtMVogTTExIDE0IGgzIHYxIGgtM1ogTTE1IDE0IGgxIHYxIGgtMVogTTIxIDE0IGgyIHYxIGgtMlogTTUgMTUgaDEgdjEgaC0xWiBNOCAxNSBoMiB2MSBoLTJaIE0xMyAxNSBoMSB2MSBoLTFaIE0xNSAxNSBoMSB2MSBoLTFaIE0xOCAxNSBoMyB2MSBoLTNaIE0yMiAxNSBoMSB2MSBoLTFaIE0yNCAxNSBoMSB2MSBoLTFaIE00IDE2IGgxIHYxIGgtMVogTTcgMTYgaDEgdjEgaC0xWiBNOSAxNiBoMSB2MSBoLTFaIE0xMSAxNiBoMiB2MSBoLTJaIE0xNiAxNiBoMSB2MSBoLTFaIE0xOCAxNiBoMiB2MSBoLTJaIE0yMiAxNiBoMSB2MSBoLTFaIE0yNCAxNiBoMSB2MSBoLTFaIE0xMyAxNyBoMSB2MSBoLTFaIE0xNSAxNyBoMiB2MSBoLTJaIE0xOCAxNyBoMSB2MSBoLTFaIE0yMCAxNyBoMSB2MSBoLTFaIE0yMiAxNyBoMSB2MSBoLTFaIE0yNCAxNyBoMSB2MSBoLTFaIE0xMyAxOCBoMSB2MSBoLTFaIE0xNSAxOCBoMiB2MSBoLTJaIE0xOSAxOCBoMSB2MSBoLTFaIE0yMyAxOCBoMiB2MSBoLTJaIE0xNCAxOSBoMSB2MSBoLTFaIE0xOSAxOSBoMiB2MSBoLTJaIE0yMyAxOSBoMiB2MSBoLTJaIE0xNiAyMCBoMiB2MSBoLTJaIE0xOSAyMCBoMyB2MSBoLTNaIE0xNCAyMSBoMyB2MSBoLTNaIE0xOCAyMSBoMiB2MSBoLTJaIE0yMiAyMSBoMSB2MSBoLTFaIE0yNCAyMSBoMSB2MSBoLTFaIE0xMyAyMiBoMSB2MSBoLTFaIE0xNiAyMiBoMSB2MSBoLTFaIE0xOCAyMiBoMiB2MSBoLTJaIE0yMSAyMiBoMSB2MSBoLTFaIE0yMyAyMiBoMiB2MSBoLTJaIE0xNyAyMyBoMSB2MSBoLTFaIE0xOSAyMyBoMSB2MSBoLTFaIE0yMiAyMyBoMiB2MSBoLTJaIE0xNCAyNCBoMSB2MSBoLTFaIE0xNyAyNCBoMiB2MSBoLTJaIE0yMCAyNCBoNSB2MSBoLTVaICIgLz48cGF0aCBjbGFzcz0icXItNiAiIHN0cm9rZT0idHJhbnNwYXJlbnQiIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iMSIgZD0iTTUgNSBoNSB2MSBoLTVaIE0xOSA1IGg1IHYxIGgtNVogTTUgNiBoMSB2MSBoLTFaIE05IDYgaDEgdjEgaC0xWiBNMTkgNiBoMSB2MSBoLTFaIE0yMyA2IGgxIHYxIGgtMVogTTUgNyBoMSB2MSBoLTFaIE05IDcgaDEgdjEgaC0xWiBNMTkgNyBoMSB2MSBoLTFaIE0yMyA3IGgxIHYxIGgtMVogTTUgOCBoMSB2MSBoLTFaIE05IDggaDEgdjEgaC0xWiBNMTkgOCBoMSB2MSBoLTFaIE0yMyA4IGgxIHYxIGgtMVogTTUgOSBoNSB2MSBoLTVaIE0xOSA5IGg1IHYxIGgtNVogTTUgMTkgaDUgdjEgaC01WiBNNSAyMCBoMSB2MSBoLTFaIE05IDIwIGgxIHYxIGgtMVogTTUgMjEgaDEgdjEgaC0xWiBNOSAyMSBoMSB2MSBoLTFaIE01IDIyIGgxIHYxIGgtMVogTTkgMjIgaDEgdjEgaC0xWiBNNSAyMyBoNSB2MSBoLTVaICIgLz48cGF0aCBjbGFzcz0icXItOCAiIHN0cm9rZT0idHJhbnNwYXJlbnQiIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iMSIgZD0iTTExIDQgaDEgdjEgaC0xWiBNMTcgNCBoMSB2MSBoLTFaIE0xMSA1IGgxIHYxIGgtMVogTTE3IDUgaDEgdjEgaC0xWiBNMTEgNiBoMSB2MSBoLTFaIE0xNyA2IGgxIHYxIGgtMVogTTExIDcgaDEgdjEgaC0xWiBNMTcgNyBoMSB2MSBoLTFaIE0xMSA4IGgxIHYxIGgtMVogTTE3IDggaDEgdjEgaC0xWiBNMTEgOSBoMSB2MSBoLTFaIE0xNyA5IGgxIHYxIGgtMVogTTExIDEwIGgxIHYxIGgtMVogTTE3IDEwIGgxIHYxIGgtMVogTTQgMTEgaDggdjEgaC04WiBNMTcgMTEgaDggdjEgaC04WiBNNCAxNyBoOCB2MSBoLThaIE0xMSAxOCBoMSB2MSBoLTFaIE0xMSAxOSBoMSB2MSBoLTFaIE0xMSAyMCBoMSB2MSBoLTFaIE0xMSAyMSBoMSB2MSBoLTFaIE0xMSAyMiBoMSB2MSBoLTFaIE0xMSAyMyBoMSB2MSBoLTFaIE0xMSAyNCBoMSB2MSBoLTFaICIgLz48cGF0aCBjbGFzcz0icXItMTIgIiBzdHJva2U9InRyYW5zcGFyZW50IiBmaWxsPSIjZmZmIiBmaWxsLW9wYWNpdHk9IjEiIGQ9Ik0xMyAxMCBoMSB2MSBoLTFaIE0xNSAxMCBoMSB2MSBoLTFaIE0xMCAxMyBoMSB2MSBoLTFaIE0xMCAxNSBoMSB2MSBoLTFaICIgLz48cGF0aCBjbGFzcz0icXItMTQgIiBzdHJva2U9InRyYW5zcGFyZW50IiBmaWxsPSIjZmZmIiBmaWxsLW9wYWNpdHk9IjEiIGQ9Ik0xMiA1IGgxIHYxIGgtMVogTTEyIDkgaDEgdjEgaC0xWiBNMTIgMTEgaDEgdjEgaC0xWiBNOCAxMiBoMiB2MSBoLTJaIE0xMSAxMiBoMSB2MSBoLTFaIE0xOCAxMiBoMiB2MSBoLTJaIE0yMyAxMiBoMSB2MSBoLTFaIE0xMiAxOCBoMSB2MSBoLTFaIE0xMiAxOSBoMSB2MSBoLTFaIE0xMiAyMCBoMSB2MSBoLTFaICIgLz48cGF0aCBjbGFzcz0icXItMTggIiBzdHJva2U9InRyYW5zcGFyZW50IiBmaWxsPSIjZmZmIiBmaWxsLW9wYWNpdHk9IjEiIGQ9Ik0wIDAgaDI5IHYxIGgtMjlaIE0wIDEgaDI5IHYxIGgtMjlaIE0wIDIgaDI5IHYxIGgtMjlaIE0wIDMgaDI5IHYxIGgtMjlaIE0wIDQgaDQgdjEgaC00WiBNMjUgNCBoNCB2MSBoLTRaIE0wIDUgaDQgdjEgaC00WiBNMjUgNSBoNCB2MSBoLTRaIE0wIDYgaDQgdjEgaC00WiBNMjUgNiBoNCB2MSBoLTRaIE0wIDcgaDQgdjEgaC00WiBNMjUgNyBoNCB2MSBoLTRaIE0wIDggaDQgdjEgaC00WiBNMjUgOCBoNCB2MSBoLTRaIE0wIDkgaDQgdjEgaC00WiBNMjUgOSBoNCB2MSBoLTRaIE0wIDEwIGg0IHYxIGgtNFogTTI1IDEwIGg0IHYxIGgtNFogTTAgMTEgaDQgdjEgaC00WiBNMjUgMTEgaDQgdjEgaC00WiBNMCAxMiBoNCB2MSBoLTRaIE0yNSAxMiBoNCB2MSBoLTRaIE0wIDEzIGg0IHYxIGgtNFogTTI1IDEzIGg0IHYxIGgtNFogTTAgMTQgaDQgdjEgaC00WiBNMjUgMTQgaDQgdjEgaC00WiBNMCAxNSBoNCB2MSBoLTRaIE0yNSAxNSBoNCB2MSBoLTRaIE0wIDE2IGg0IHYxIGgtNFogTTI1IDE2IGg0IHYxIGgtNFogTTAgMTcgaDQgdjEgaC00WiBNMjUgMTcgaDQgdjEgaC00WiBNMCAxOCBoNCB2MSBoLTRaIE0yNSAxOCBoNCB2MSBoLTRaIE0wIDE5IGg0IHYxIGgtNFogTTI1IDE5IGg0IHYxIGgtNFogTTAgMjAgaDQgdjEgaC00WiBNMjUgMjAgaDQgdjEgaC00WiBNMCAyMSBoNCB2MSBoLTRaIE0yNSAyMSBoNCB2MSBoLTRaIE0wIDIyIGg0IHYxIGgtNFogTTI1IDIyIGg0IHYxIGgtNFogTTAgMjMgaDQgdjEgaC00WiBNMjUgMjMgaDQgdjEgaC00WiBNMCAyNCBoNCB2MSBoLTRaIE0yNSAyNCBoNCB2MSBoLTRaIE0wIDI1IGgyOSB2MSBoLTI5WiBNMCAyNiBoMjkgdjEgaC0yOVogTTAgMjcgaDI5IHYxIGgtMjlaIE0wIDI4IGgyOSB2MSBoLTI5WiAiIC8+PHBhdGggY2xhc3M9InFyLTUxMiAiIHN0cm9rZT0idHJhbnNwYXJlbnQiIGZpbGw9IiMwMDAiIGZpbGwtb3BhY2l0eT0iMSIgZD0iTTEyIDE3IGgxIHYxIGgtMVogIiAvPjxwYXRoIGNsYXNzPSJxci0xMDI0ICIgc3Ryb2tlPSJ0cmFuc3BhcmVudCIgZmlsbD0iIzAwMCIgZmlsbC1vcGFjaXR5PSIxIiBkPSJNMTMgNCBoMSB2MSBoLTFaIE0xNiA0IGgxIHYxIGgtMVogTTEzIDUgaDEgdjEgaC0xWiBNMTYgNSBoMSB2MSBoLTFaIE0xNCA2IGgxIHYxIGgtMVogTTE2IDYgaDEgdjEgaC0xWiBNMTUgNyBoMSB2MSBoLTFaIE0xMyA4IGgyIHYxIGgtMlogTTEzIDExIGgyIHYxIGgtMlogTTE0IDEyIGgxIHYxIGgtMVogTTQgMTMgaDEgdjEgaC0xWiBNNyAxMyBoMyB2MSBoLTNaIE0xMSAxMyBoMSB2MSBoLTFaIE0xNCAxMyBoMSB2MSBoLTFaIE0xNiAxMyBoMSB2MSBoLTFaIE0xOSAxMyBoMSB2MSBoLTFaIE0yMSAxMyBoMiB2MSBoLTJaIE0yNCAxMyBoMSB2MSBoLTFaIE00IDE0IGgxIHYxIGgtMVogTTYgMTQgaDEgdjEgaC0xWiBNOCAxNCBoMiB2MSBoLTJaIE0xNCAxNCBoMSB2MSBoLTFaIE0xNiAxNCBoNSB2MSBoLTVaIE0yMyAxNCBoMiB2MSBoLTJaIE00IDE1IGgxIHYxIGgtMVogTTYgMTUgaDIgdjEgaC0yWiBNMTEgMTUgaDIgdjEgaC0yWiBNMTQgMTUgaDEgdjEgaC0xWiBNMTYgMTUgaDIgdjEgaC0yWiBNMjEgMTUgaDEgdjEgaC0xWiBNMjMgMTUgaDEgdjEgaC0xWiBNNSAxNiBoMiB2MSBoLTJaIE04IDE2IGgxIHYxIGgtMVogTTEzIDE2IGgzIHYxIGgtM1ogTTE3IDE2IGgxIHYxIGgtMVogTTIwIDE2IGgyIHYxIGgtMlogTTIzIDE2IGgxIHYxIGgtMVogTTE0IDE3IGgxIHYxIGgtMVogTTE3IDE3IGgxIHYxIGgtMVogTTE5IDE3IGgxIHYxIGgtMVogTTIxIDE3IGgxIHYxIGgtMVogTTIzIDE3IGgxIHYxIGgtMVogTTE0IDE4IGgxIHYxIGgtMVogTTE3IDE4IGgyIHYxIGgtMlogTTIwIDE4IGgzIHYxIGgtM1ogTTEzIDE5IGgxIHYxIGgtMVogTTE1IDE5IGg0IHYxIGgtNFogTTIxIDE5IGgyIHYxIGgtMlogTTEzIDIwIGgzIHYxIGgtM1ogTTE4IDIwIGgxIHYxIGgtMVogTTIyIDIwIGgzIHYxIGgtM1ogTTEzIDIxIGgxIHYxIGgtMVogTTE3IDIxIGgxIHYxIGgtMVogTTIwIDIxIGgyIHYxIGgtMlogTTIzIDIxIGgxIHYxIGgtMVogTTE0IDIyIGgyIHYxIGgtMlogTTE3IDIyIGgxIHYxIGgtMVogTTIwIDIyIGgxIHYxIGgtMVogTTIyIDIyIGgxIHYxIGgtMVogTTEzIDIzIGg0IHYxIGgtNFogTTE4IDIzIGgxIHYxIGgtMVogTTIwIDIzIGgyIHYxIGgtMlogTTI0IDIzIGgxIHYxIGgtMVogTTEzIDI0IGgxIHYxIGgtMVogTTE1IDI0IGgyIHYxIGgtMlogTTE5IDI0IGgxIHYxIGgtMVogIiAvPjxwYXRoIGNsYXNzPSJxci0xNTM2ICIgc3Ryb2tlPSJ0cmFuc3BhcmVudCIgZmlsbD0iIzAwMCIgZmlsbC1vcGFjaXR5PSIxIiBkPSJNNCA0IGg3IHYxIGgtN1ogTTE4IDQgaDcgdjEgaC03WiBNNCA1IGgxIHYxIGgtMVogTTEwIDUgaDEgdjEgaC0xWiBNMTggNSBoMSB2MSBoLTFaIE0yNCA1IGgxIHYxIGgtMVogTTQgNiBoMSB2MSBoLTFaIE0xMCA2IGgxIHYxIGgtMVogTTE4IDYgaDEgdjEgaC0xWiBNMjQgNiBoMSB2MSBoLTFaIE00IDcgaDEgdjEgaC0xWiBNMTAgNyBoMSB2MSBoLTFaIE0xOCA3IGgxIHYxIGgtMVogTTI0IDcgaDEgdjEgaC0xWiBNNCA4IGgxIHYxIGgtMVogTTEwIDggaDEgdjEgaC0xWiBNMTggOCBoMSB2MSBoLTFaIE0yNCA4IGgxIHYxIGgtMVogTTQgOSBoMSB2MSBoLTFaIE0xMCA5IGgxIHYxIGgtMVogTTE4IDkgaDEgdjEgaC0xWiBNMjQgOSBoMSB2MSBoLTFaIE00IDEwIGg3IHYxIGgtN1ogTTE4IDEwIGg3IHYxIGgtN1ogTTQgMTggaDcgdjEgaC03WiBNNCAxOSBoMSB2MSBoLTFaIE0xMCAxOSBoMSB2MSBoLTFaIE00IDIwIGgxIHYxIGgtMVogTTEwIDIwIGgxIHYxIGgtMVogTTQgMjEgaDEgdjEgaC0xWiBNMTAgMjEgaDEgdjEgaC0xWiBNNCAyMiBoMSB2MSBoLTFaIE0xMCAyMiBoMSB2MSBoLTFaIE00IDIzIGgxIHYxIGgtMVogTTEwIDIzIGgxIHYxIGgtMVogTTQgMjQgaDcgdjEgaC03WiAiIC8+PHBhdGggY2xhc3M9InFyLTMwNzIgIiBzdHJva2U9InRyYW5zcGFyZW50IiBmaWxsPSIjMDAwIiBmaWxsLW9wYWNpdHk9IjEiIGQ9Ik0xMiAxMCBoMSB2MSBoLTFaIE0xNCAxMCBoMSB2MSBoLTFaIE0xNiAxMCBoMSB2MSBoLTFaIE0xMCAxMiBoMSB2MSBoLTFaIE0xMCAxNCBoMSB2MSBoLTFaIE0xMCAxNiBoMSB2MSBoLTFaICIgLz48cGF0aCBjbGFzcz0icXItMzU4NCAiIHN0cm9rZT0idHJhbnNwYXJlbnQiIGZpbGw9IiMwMDAiIGZpbGwtb3BhY2l0eT0iMSIgZD0iTTEyIDQgaDEgdjEgaC0xWiBNMTIgNiBoMSB2MSBoLTFaIE0xMiA3IGgxIHYxIGgtMVogTTEyIDggaDEgdjEgaC0xWiBNNCAxMiBoNCB2MSBoLTRaIE0xMiAxMiBoMSB2MSBoLTFaIE0xNyAxMiBoMSB2MSBoLTFaIE0yMCAxMiBoMyB2MSBoLTNaIE0yNCAxMiBoMSB2MSBoLTFaIE0xMiAyMSBoMSB2MSBoLTFaIE0xMiAyMiBoMSB2MSBoLTFaIE0xMiAyMyBoMSB2MSBoLTFaIE0xMiAyNCBoMSB2MSBoLTFaICIgLz48cGF0aCBjbGFzcz0icXItNTYzMiAiIHN0cm9rZT0idHJhbnNwYXJlbnQiIGZpbGw9IiMwMDAiIGZpbGwtb3BhY2l0eT0iMSIgZD0iTTYgNiBoMyB2MSBoLTNaIE0yMCA2IGgzIHYxIGgtM1ogTTYgNyBoMyB2MSBoLTNaIE0yMCA3IGgzIHYxIGgtM1ogTTYgOCBoMyB2MSBoLTNaIE0yMCA4IGgzIHYxIGgtM1ogTTYgMjAgaDMgdjEgaC0zWiBNNiAyMSBoMyB2MSBoLTNaIE02IDIyIGgzIHYxIGgtM1ogIiAvPjwvc3ZnPg0K
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/QRCodeTest.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/QRCodeTest.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/QRCodeTest.php	(revision 8427)
@@ -0,0 +1,152 @@
+<?php
+/**
+ * Class QRCodeTest
+ *
+ * @filesource   QRCodeTest.php
+ * @created      17.11.2017
+ * @package      chillerlan\QRCodeTest
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2017 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\QRCodeTest;
+
+use chillerlan\QRCode\{QROptions, QRCode};
+use chillerlan\QRCode\Data\{AlphaNum, Byte, Kanji, Number, QRCodeDataException};
+use chillerlan\QRCode\Output\QRCodeOutputException;
+use PHPUnit\Framework\TestCase;
+
+use function random_bytes;
+
+/**
+ * Tests basic functions of the QRCode class
+ */
+class QRCodeTest extends TestCase{
+
+	/** @internal  */
+	protected QRCode $qrcode;
+	/** @internal  */
+	protected QROptions $options;
+
+	/**
+	 * invoke test instances
+	 *
+	 * @internal
+	 */
+	protected function setUp():void{
+		$this->qrcode  = new QRCode;
+		$this->options = new QROptions;
+	}
+
+	/**
+	 * isNumber() should pass on any number and fail on anything else
+	 */
+	public function testIsNumber():void{
+		$this::assertTrue($this->qrcode->isNumber('0123456789'));
+
+		$this::assertFalse($this->qrcode->isNumber('ABC123'));
+	}
+
+	/**
+	 * isAlphaNum() should pass on the 45 defined characters and fail on anything else (e.g. lowercase)
+	 */
+	public function testIsAlphaNum():void{
+		$this::assertTrue($this->qrcode->isAlphaNum('ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 $%*+-./:'));
+
+		$this::assertFalse($this->qrcode->isAlphaNum('abc'));
+	}
+
+	/**
+	 * isKanji() should pass on Kanji/SJIS characters and fail on everything else
+	 */
+	public function testIsKanji():void{
+		$this::assertTrue($this->qrcode->isKanji('èè·'));
+
+		$this::assertFalse($this->qrcode->isKanji('Ã'));
+		$this::assertFalse($this->qrcode->isKanji('ABC'));
+		$this::assertFalse($this->qrcode->isKanji('123'));
+	}
+
+	/**
+	 * isByte() passses any binary string and only fails on empty strings
+	 */
+	public function testIsByte():void{
+		$this::assertTrue($this->qrcode->isByte("\x01\x02\x03"));
+		$this::assertTrue($this->qrcode->isByte('            ')); // not empty!
+		$this::assertTrue($this->qrcode->isByte('0'));
+
+		$this::assertFalse($this->qrcode->isByte(''));
+	}
+
+	/**
+	 * tests if an exception is thrown when an invalid (built-in) output type is specified
+	 */
+	public function testInitDataInterfaceException():void{
+		$this->expectException(QRCodeOutputException::class);
+		$this->expectExceptionMessage('invalid output type');
+
+		$this->options->outputType = 'foo';
+
+		(new QRCode($this->options))->render('test');
+	}
+
+	/**
+	 * tests if an exception is thrown when trying to call getMatrix() without data (empty string, no data set)
+	 */
+	public function testGetMatrixException():void{
+		$this->expectException(QRCodeDataException::class);
+		$this->expectExceptionMessage('QRCode::getMatrix() No data given.');
+
+		$this->qrcode->getMatrix('');
+	}
+
+	/**
+	 * test whether stings are trimmed (they are not) - i'm still torn on that (see isByte)
+	 */
+	public function testAvoidTrimming():void{
+		$m1 = $this->qrcode->getMatrix('hello')->matrix();
+		$m2 = $this->qrcode->getMatrix('hello ')->matrix(); // added space
+
+		$this::assertNotSame($m1, $m2);
+	}
+
+	/**
+	 * tests if the data mode is overriden if QROptions::$dataModeOverride is set to a valid value
+	 *
+	 * @see https://github.com/chillerlan/php-qrcode/issues/39
+	 */
+	public function testDataModeOverride():void{
+
+		// no (or invalid) value set - auto detection
+		$this->options->dataModeOverride = 'foo';
+		$this->qrcode = new QRCode;
+
+		$this::assertInstanceOf(Number::class, $this->qrcode->initDataInterface('123'));
+		$this::assertInstanceOf(AlphaNum::class, $this->qrcode->initDataInterface('ABC123'));
+		$this::assertInstanceOf(Byte::class, $this->qrcode->initDataInterface(random_bytes(32)));
+		$this::assertInstanceOf(Kanji::class, $this->qrcode->initDataInterface('èè·'));
+
+		// data mode set: force the given data mode
+		$this->options->dataModeOverride = 'Byte';
+		$this->qrcode = new QRCode($this->options);
+
+		$this::assertInstanceOf(Byte::class, $this->qrcode->initDataInterface('123'));
+		$this::assertInstanceOf(Byte::class, $this->qrcode->initDataInterface('ABC123'));
+		$this::assertInstanceOf(Byte::class, $this->qrcode->initDataInterface(random_bytes(32)));
+		$this::assertInstanceOf(Byte::class, $this->qrcode->initDataInterface('èè·'));
+	}
+
+	/**
+	 * tests if an exception is thrown when an invalid character occurs when forcing a data mode other than Byte
+	 */
+	public function testDataModeOverrideError():void{
+		$this->expectException(QRCodeDataException::class);
+		$this->expectExceptionMessage('illegal char:');
+
+		$this->options->dataModeOverride = 'AlphaNum';
+
+		(new QRCode($this->options))->initDataInterface(random_bytes(32));
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/QROptionsTest.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/QROptionsTest.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-qrcode/tests/QROptionsTest.php	(revision 8427)
@@ -0,0 +1,144 @@
+<?php
+/**
+ * Class QROptionsTest
+ *
+ * @filesource   QROptionsTest.php
+ * @created      08.11.2018
+ * @package      chillerlan\QRCodeTest
+ * @author       smiley <smiley@chillerlan.net>
+ * @copyright    2018 smiley
+ * @license      MIT
+ *
+ * @noinspection PhpUnusedLocalVariableInspection
+ */
+
+namespace chillerlan\QRCodeTest;
+
+use chillerlan\QRCode\{QRCode, QRCodeException, QROptions};
+use PHPUnit\Framework\TestCase;
+
+/**
+ * QROptions test
+ */
+class QROptionsTest extends TestCase{
+
+	/**
+	 * @see testVersionClamp()
+	 * @return int[][]
+	 * @internal
+	 */
+	public function VersionProvider():array{
+		return [
+			'values > 40 should be clamped to 40'        => [42, 40],
+			'values < 1 should be clamped to 1'          => [-42, 1],
+			'values in between shold not be touched'     => [21, 21],
+			'value -1 should be treated as is (default)' => [QRCode::VERSION_AUTO, -1],
+		];
+	}
+
+	/**
+	 * Tests the $version clamping
+	 *
+	 * @dataProvider VersionProvider
+	 */
+	public function testVersionClamp(int $version, int $expected):void{
+		$o = new QROptions(['version' => $version]);
+
+		$this::assertSame($expected, $o->version);
+	}
+
+	/**
+	 * @see testVersionMinMaxClamp()
+	 * @return int[][]
+	 * @internal
+	 */
+	public function VersionMinMaxProvider():array{
+		return [
+			'normal clamp'         => [5, 10, 5, 10],
+			'exceeding values'     => [-42, 42, 1, 40],
+			'min > max'            => [10, 5, 5, 10],
+			'min > max, exceeding' => [42, -42, 1, 40],
+		];
+	}
+
+	/**
+	 * Tests the $versionMin/$versionMax clamping
+	 *
+	 * @dataProvider VersionMinMaxProvider
+	 */
+	public function testVersionMinMaxClamp(int $versionMin, int $versionMax, int $expectedMin, int $expectedMax):void{
+		$o = new QROptions(['versionMin' => $versionMin, 'versionMax' => $versionMax]);
+
+		$this::assertSame($expectedMin, $o->versionMin);
+		$this::assertSame($expectedMax, $o->versionMax);
+	}
+
+	/**
+	 * @see testMaskPatternClamp()
+	 * @return int[][]
+	 * @internal
+	 */
+	public function MaskPatternProvider():array{
+		return [
+			'exceed max'   => [42, 7,],
+			'exceed min'   => [-42, 0],
+			'default (-1)' => [QRCode::MASK_PATTERN_AUTO, -1],
+		];
+	}
+
+	/**
+	 * Tests the $maskPattern clamping
+	 *
+	 * @dataProvider MaskPatternProvider
+	 */
+	public function testMaskPatternClamp(int $maskPattern, int $expected):void{
+		$o = new QROptions(['maskPattern' => $maskPattern]);
+
+		$this::assertSame($expected, $o->maskPattern);
+	}
+
+	/**
+	 * Tests if an exception is thrown on an incorrect ECC level
+	 */
+	public function testInvalidEccLevelException():void{
+		$this->expectException(QRCodeException::class);
+		$this->expectExceptionMessage('Invalid error correct level: 42');
+
+		$o = new QROptions(['eccLevel' => 42]);
+	}
+
+	/**
+	 * @see testClampRGBValues()
+	 * @return int[][][]
+	 * @internal
+	 */
+	public function RGBProvider():array{
+		return [
+			'exceeding values' => [[-1, 0, 999], [0, 0 ,255]],
+			'too few values'   => [[1, 2], [255, 255, 255]],
+			'too many values'  => [[1, 2, 3, 4, 5], [1, 2, 3]],
+		];
+	}
+
+	/**
+	 * Tests clamping of the RGB values for $imageTransparencyBG
+	 *
+	 * @dataProvider RGBProvider
+	 */
+	public function testClampRGBValues(array $rgb, array $expected):void{
+		$o = new QROptions(['imageTransparencyBG' => $rgb]);
+
+		$this::assertSame($expected, $o->imageTransparencyBG);
+	}
+
+	/**
+	 * Tests if an exception is thrown when a non-numeric RGB value was encoutered
+	 */
+	public function testInvalidRGBValueException():void{
+		$this->expectException(QRCodeException::class);
+		$this->expectExceptionMessage('Invalid RGB value.');
+
+		$o = new QROptions(['imageTransparencyBG' => ['r', 'g', 'b']]);
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/.github/FUNDING.yml
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/.github/FUNDING.yml	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/.github/FUNDING.yml	(revision 8427)
@@ -0,0 +1,2 @@
+ko_fi: codemasher
+custom: "https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4"
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/.github/workflows/tests.yml
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/.github/workflows/tests.yml	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/.github/workflows/tests.yml	(revision 8427)
@@ -0,0 +1,105 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+# https://github.com/sebastianbergmann/phpunit/blob/master/.github/workflows/ci.yml
+
+on:
+  push:
+    branches:
+      - main
+  pull_request:
+    branches:
+      - main
+
+
+name: "CI"
+
+jobs:
+
+  static-code-analysis:
+    name: "Static Code Analysis"
+
+    runs-on: ubuntu-latest
+
+    env:
+      PHAN_ALLOW_XDEBUG: 0
+      PHAN_DISABLE_XDEBUG_WARN: 1
+
+    steps:
+      - name: "Checkout"
+        uses: actions/checkout@v3
+
+      - name: "Install PHP"
+        uses: shivammathur/setup-php@v2
+        with:
+          php-version: "7.4"
+          tools: pecl
+          coverage: none
+          extensions: ast, json
+
+      - name: "Update dependencies with composer"
+        run: composer update --no-interaction --no-ansi --no-progress --no-suggest
+
+      - name: "Run phan"
+        run: php vendor/bin/phan
+
+  build-docs:
+    name: "Build and publish Docs"
+
+    runs-on: ubuntu-latest
+
+    steps:
+      - name: "Checkout sources"
+        uses: actions/checkout@v3
+
+      - name: "Install PHP"
+        uses: shivammathur/setup-php@v2
+        with:
+          php-version: "8.1"
+          coverage: none
+          tools: phpDocumentor
+          extensions: json
+
+      - name: "Build Docs"
+        run: phpdoc --config=phpdoc.xml
+
+      - name: "Publish Docs to gh-pages"
+        uses: JamesIves/github-pages-deploy-action@v4.3.4
+        with:
+          branch: gh-pages
+          folder: docs
+          clean: true
+
+  tests:
+    name: "Unit Tests"
+
+    runs-on: ${{ matrix.os }}
+
+    strategy:
+      fail-fast: false
+      matrix:
+        os:
+          - ubuntu-latest
+          - windows-latest
+        php-version:
+          - "7.4"
+          - "8.0"
+          - "8.1"
+
+    steps:
+      - name: "Checkout"
+        uses: actions/checkout@v3
+
+      - name: "Install PHP with extensions"
+        uses: shivammathur/setup-php@v2
+        with:
+          php-version: ${{ matrix.php-version }}
+          coverage: pcov
+          extensions: json
+
+      - name: "Install dependencies with composer"
+        run: composer update --no-ansi --no-interaction --no-progress --no-suggest
+
+      - name: "Run tests with phpunit"
+        run: php vendor/phpunit/phpunit/phpunit --configuration=phpunit.xml
+
+      - name: "Send code coverage report to Codecov.io"
+        uses: codecov/codecov-action@v3
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/.gitignore
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/.gitignore	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/.gitignore	(revision 8427)
@@ -0,0 +1,4 @@
+/.build
+/.idea
+/vendor
+composer.lock
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/.phan/config.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/.phan/config.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/.phan/config.php	(revision 8427)
@@ -0,0 +1,54 @@
+<?php
+/**
+ * This configuration will be read and overlaid on top of the
+ * default configuration. Command-line arguments will be applied
+ * after this file is read.
+ */
+return [
+	// Supported values: `'5.6'`, `'7.0'`, `'7.1'`, `'7.2'`, `'7.3'`,
+	// `'7.4'`, `null`.
+	// If this is set to `null`,
+	// then Phan assumes the PHP version which is closest to the minor version
+	// of the php executable used to execute Phan.
+	//
+	// Note that the **only** effect of choosing `'5.6'` is to infer
+	// that functions removed in php 7.0 exist.
+	// (See `backward_compatibility_checks` for additional options)
+	'target_php_version' => '7.4',
+
+	// A list of directories that should be parsed for class and
+	// method information. After excluding the directories
+	// defined in exclude_analysis_directory_list, the remaining
+	// files will be statically analyzed for errors.
+	//
+	// Thus, both first-party and third-party code being used by
+	// your application should be included in this list.
+	'directory_list' => [
+		'examples',
+		'src',
+		'tests',
+		'vendor',
+	],
+
+	// A regex used to match every file name that you want to
+	// exclude from parsing. Actual value will exclude every
+	// "test", "tests", "Test" and "Tests" folders found in
+	// "vendor/" directory.
+	'exclude_file_regex' => '@^vendor/.*/(tests?|Tests?)/@',
+
+	// A directory list that defines files that will be excluded
+	// from static analysis, but whose class and method
+	// information should be included.
+	//
+	// Generally, you'll want to include the directories for
+	// third-party code (such as "vendor/") in this list.
+	//
+	// n.b.: If you'd like to parse but not analyze 3rd
+	//       party code, directories containing that code
+	//       should be added to both the `directory_list`
+	//       and `exclude_analysis_directory_list` arrays.
+	'exclude_analysis_directory_list' => [
+		'tests',
+		'vendor',
+	],
+];
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/.scrutinizer.yml
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/.scrutinizer.yml	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/.scrutinizer.yml	(revision 8427)
@@ -0,0 +1,14 @@
+build:
+  nodes:
+    analysis:
+      tests:
+        override:
+          - php-scrutinizer-run
+  environment:
+    php: 8.0.0
+
+filter:
+  excluded_paths:
+    - examples/*
+    - tests/*
+    - vendor/*
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/LICENSE
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/LICENSE	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/LICENSE	(revision 8427)
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2018 Smiley <smiley@chillerlan.net>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/README.md
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/README.md	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/README.md	(revision 8427)
@@ -0,0 +1,156 @@
+# chillerlan/php-settings-container
+
+A container class for immutable settings objects. Not a DI container. PHP 7.4+
+- [`SettingsContainerInterface`](https://github.com/chillerlan/php-settings-container/blob/main/src/SettingsContainerInterface.php) provides immutable properties with magic getter & setter and some fancy - decouple configuration logic from your application!
+
+[![PHP Version Support][php-badge]][php]
+[![version][packagist-badge]][packagist]
+[![license][license-badge]][license]
+[![Coverage][coverage-badge]][coverage]
+[![Scrunitizer][scrutinizer-badge]][scrutinizer]
+[![Packagist downloads][downloads-badge]][downloads]
+[![Continuous Integration][gh-action-badge]][gh-action]
+
+[php-badge]: https://img.shields.io/packagist/php-v/chillerlan/php-settings-container?logo=php&color=8892BF
+[php]: https://www.php.net/supported-versions.php
+[packagist-badge]: https://img.shields.io/packagist/v/chillerlan/php-settings-container.svg?logo=packagist
+[packagist]: https://packagist.org/packages/chillerlan/php-settings-container
+[license-badge]: https://img.shields.io/github/license/chillerlan/php-settings-container.svg
+[license]: https://github.com/chillerlan/php-settings-container/blob/main/LICENSE
+[coverage-badge]: https://img.shields.io/codecov/c/github/chillerlan/php-settings-container.svg?logo=codecov
+[coverage]: https://codecov.io/github/chillerlan/php-settings-container
+[scrutinizer-badge]: https://img.shields.io/scrutinizer/g/chillerlan/php-settings-container.svg?logo=scrutinizer
+[scrutinizer]: https://scrutinizer-ci.com/g/chillerlan/php-settings-container
+[downloads-badge]: https://img.shields.io/packagist/dt/chillerlan/php-settings-container.svg?logo=packagist
+[downloads]: https://packagist.org/packages/chillerlan/php-settings-container/stats
+[gh-action-badge]: https://github.com/chillerlan/php-settings-container/workflows/CI/badge.svg
+[gh-action]: https://github.com/chillerlan/php-settings-container/actions?query=workflow%3A%22CI%22
+
+## Documentation
+
+### Installation
+**requires [composer](https://getcomposer.org)**
+
+*composer.json* (note: replace `dev-main` with a [version constraint](https://getcomposer.org/doc/articles/versions.md#writing-version-constraints), e.g. `^2.1` - see [releases](https://github.com/chillerlan/php-settings-container/releases) for valid versions)
+```json
+{
+	"require": {
+		"php": "^7.4 || ^8.0",
+		"chillerlan/php-settings-container": "dev-main"
+	}
+}
+```
+
+Profit!
+
+## Usage
+
+The `SettingsContainerInterface` (wrapped in`SettingsContainerAbstract` ) provides plug-in functionality for immutable object properties and adds some fancy, like loading/saving JSON, arrays etc. 
+It takes an `iterable` as the only constructor argument and calls a method with the trait's name on invocation (`MyTrait::MyTrait()`) for each used trait.
+
+### Simple usage
+```php
+class MyContainer extends SettingsContainerAbstract{
+	protected $foo;
+	protected $bar;
+}
+```
+Typed properties in PHP 7.4+:
+```php
+class MyContainer extends SettingsContainerAbstract{
+	protected string $foo;
+	protected string $bar;
+}
+```
+
+```php
+// use it just like a \stdClass
+$container = new MyContainer;
+$container->foo = 'what';
+$container->bar = 'foo';
+
+// which is equivalent to 
+$container = new MyContainer(['bar' => 'foo', 'foo' => 'what']);
+// ...or try
+$container->fromJSON('{"foo": "what", "bar": "foo"}');
+
+
+// fetch all properties as array
+$container->toArray(); // -> ['foo' => 'what', 'bar' => 'foo']
+// or JSON
+$container->toJSON(); // -> {"foo": "what", "bar": "foo"}
+// JSON via JsonSerializable
+$json = json_encode($container); // -> {"foo": "what", "bar": "foo"}
+
+//non-existing properties will be ignored:
+$container->nope = 'what';
+
+var_dump($container->nope); // -> null
+```
+
+### Advanced usage
+```php
+trait SomeOptions{
+	protected $foo;
+	protected $what;
+	
+	// this method will be called in SettingsContainerAbstract::construct()
+	// after the properties have been set
+	protected function SomeOptions(){
+		// just some constructor stuff...
+		$this->foo = strtoupper($this->foo);
+	}
+	
+	// this method will be called from __set() when property $what is set
+	protected function set_what(string $value){
+		$this->what = md5($value);
+	}
+}
+
+trait MoreOptions{
+	protected $bar = 'whatever'; // provide default values
+}
+```
+
+```php
+$commonOptions = [
+	// SomeOptions
+	'foo' => 'whatever', 
+	// MoreOptions
+	'bar' => 'nothing',
+];
+
+// now plug the several library options together to a single object 
+$container = new class ($commonOptions) extends SettingsContainerAbstract{
+	use SomeOptions, MoreOptions;
+};
+
+var_dump($container->foo); // -> WHATEVER (constructor ran strtoupper on the value)
+var_dump($container->bar); // -> nothing
+
+$container->what = 'some value';
+var_dump($container->what); // -> md5 hash of "some value"
+```
+
+### API
+
+#### [`SettingsContainerAbstract`](https://github.com/chillerlan/php-settings-container/blob/main/src/SettingsContainerAbstract.php)
+
+method | return  | info
+-------- | ----  | -----------
+`__construct(iterable $properties = null)` | - | calls `construct()` internally after the properties have been set
+(protected) `construct()` | void | calls a method with trait name as replacement constructor for each used trait
+`__get(string $property)` | mixed | calls `$this->{'get_'.$property}()` if such a method exists
+`__set(string $property, $value)` | void | calls `$this->{'set_'.$property}($value)` if such a method exists
+`__isset(string $property)` | bool | 
+`__unset(string $property)` | void | 
+`__toString()` | string | a JSON string
+`toArray()` | array | 
+`fromIterable(iterable $properties)` | `SettingsContainerInterface` | 
+`toJSON(int $jsonOptions = null)` | string | accepts [JSON options constants](http://php.net/manual/json.constants.php)
+`fromJSON(string $json)` | `SettingsContainerInterface` | 
+`jsonSerialize()` | mixed | implements the [`JsonSerializable`](https://www.php.net/manual/en/jsonserializable.jsonserialize.php) interface
+
+## Disclaimer
+This might be either an utterly genius or completely stupid idea - you decide. However, i like it and it works.
+Also, this is not a dependency injection container. Stop using DI containers FFS.
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/composer.json
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/composer.json	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/composer.json	(revision 8427)
@@ -0,0 +1,50 @@
+{
+	"name": "chillerlan/php-settings-container",
+	"description": "A container class for immutable settings objects. Not a DI container. PHP 7.4+",
+	"homepage": "https://github.com/chillerlan/php-settings-container",
+	"license": "MIT",
+	"type": "library",
+	"minimum-stability": "stable",
+	"keywords": [
+		"php7", "helper", "container", "settings", "configuration"
+	],
+	"authors": [
+		{
+			"name": "Smiley",
+			"email": "smiley@chillerlan.net",
+			"homepage": "https://github.com/codemasher"
+		}
+	],
+	"support": {
+		"issues": "https://github.com/chillerlan/php-settings-container/issues",
+		"source": "https://github.com/chillerlan/php-settings-container"
+	},
+	"require": {
+		"php": "^7.4 || ^8.0",
+		"ext-json": "*"
+	},
+	"require-dev": {
+		"phan/phan": "^5.3",
+		"phpunit/phpunit": "^9.5"
+	},
+	"autoload": {
+		"psr-4": {
+			"chillerlan\\Settings\\": "src/"
+		}
+	},
+	"autoload-dev": {
+		"psr-4": {
+			"chillerlan\\SettingsTest\\": "tests/",
+			"chillerlan\\SettingsExamples\\": "examples/"
+		}
+	},
+	"scripts": {
+		"phpunit": "@php vendor/bin/phpunit",
+		"phan": "@php vendor/bin/phan"
+	},
+	"config": {
+		"lock": false,
+		"sort-packages": true,
+		"platform-check": true
+	}
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/docs/Readme.md
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/docs/Readme.md	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/docs/Readme.md	(revision 8427)
@@ -0,0 +1,13 @@
+# Auto generated API documentation
+
+The API documentation can be auto generated with [phpDocumentor](https://www.phpdoc.org/). 
+There is an [online version available](https://chillerlan.github.io/php-settings-container/) via the [gh-pages branch](https://github.com/chillerlan/php-settings-container/tree/gh-pages) that is [automatically deployed](https://github.com/chillerlan/php-settings-container/deployments) on each push to main.
+
+Locally created docs will appear in this directory. If you'd like to create local docs, please follow these steps:
+
+- [download phpDocumentor](https://github.com/phpDocumentor/phpDocumentor/releases) v3+ as .phar archive
+- run it in the repository root directory:
+  - on Windows `c:\path\to\php.exe c:\path\to\phpDocumentor.phar --config=phpdoc.xml`
+  - on Linux just `php /path/to/phpDocumentor.phar --config=phpdoc.xml`
+- open [index.html](./index.html) in a browser
+- profit!
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/examples/advanced.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/examples/advanced.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/examples/advanced.php	(revision 8427)
@@ -0,0 +1,51 @@
+<?php
+/**
+ * @created      28.08.2018
+ * @author       smiley <smiley@chillerlan.net>
+ * @copyright    2018 smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\SettingsExamples;
+
+use chillerlan\Settings\SettingsContainerAbstract;
+
+require_once __DIR__.'/../vendor/autoload.php';
+
+// from library #1
+trait SomeOptions{
+	protected string $foo = '';
+
+	// this method will be called in SettingsContainerAbstract::__construct() after the properties have been set
+	protected function SomeOptions(){
+		// just some constructor stuff...
+		$this->foo = strtoupper($this->foo);
+	}
+}
+
+// from library #2
+trait MoreOptions{
+	protected string $bar = 'whatever'; // provide default values
+}
+
+$commonOptions = [
+	// SomeOptions
+	'foo' => 'whatever',
+	// MoreOptions
+	'bar' => 'nothing',
+];
+
+// now plug the several library options together to a single object
+
+/**
+ * @property string $foo
+ * @property string $bar
+ */
+class MySettings extends SettingsContainerAbstract{
+	use SomeOptions, MoreOptions; // ...
+};
+
+$container = new MySettings($commonOptions);
+
+var_dump($container->foo); // -> WHATEVER (constructor ran strtoupper on the value)
+var_dump($container->bar); // -> nothing
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/examples/simple.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/examples/simple.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/examples/simple.php	(revision 8427)
@@ -0,0 +1,29 @@
+<?php
+/**
+ * @created      28.08.2018
+ * @author       smiley <smiley@chillerlan.net>
+ * @copyright    2018 smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\SettingsExamples;
+
+use chillerlan\Settings\SettingsContainerAbstract;
+
+require_once __DIR__.'/../vendor/autoload.php';
+
+class MyContainer extends SettingsContainerAbstract{
+	protected $foo;
+	protected $bar;
+}
+
+/** @var \chillerlan\Settings\SettingsContainerInterface $container */
+$container = new MyContainer(['foo' => 'what']);
+$container->bar = 'foo';
+
+var_dump($container->toJSON()); // -> {"foo":"what","bar":"foo"}
+
+// non-existing properties will be ignored:
+$container->nope = 'what';
+
+var_dump($container->nope); // -> NULL
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/phpdoc.xml
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/phpdoc.xml	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/phpdoc.xml	(revision 8427)
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<phpdoc>
+	<parser>
+		<target>docs</target>
+		<encoding>utf8</encoding>
+		<markers>
+			<item>TODO</item>
+		</markers>
+	</parser>
+	<transformer>
+		<target>docs</target>
+	</transformer>
+	<files>
+		<directory>src</directory>
+		<directory>tests</directory>
+	</files>
+	<transformations>
+		<template name="responsive-twig"/>
+	</transformations>
+</phpdoc>
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/phpunit.xml
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/phpunit.xml	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/phpunit.xml	(revision 8427)
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		 xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.5/phpunit.xsd"
+		 bootstrap="vendor/autoload.php"
+		 cacheResultFile=".build/phpunit.result.cache"
+		 colors="true"
+		 verbose="true"
+>
+	<coverage processUncoveredFiles="true">
+		<include>
+			<directory suffix=".php">./src</directory>
+		</include>
+		<report>
+			<clover outputFile=".build/coverage/clover.xml"/>
+			<xml outputDirectory=".build/coverage/coverage-xml"/>
+		</report>
+	</coverage>
+	<testsuites>
+		<testsuite name="php-settings-container test suite">
+			<directory suffix=".php">./tests/</directory>
+		</testsuite>
+	</testsuites>
+	<logging>
+		<junit outputFile=".build/logs/junit.xml"/>
+	</logging>
+</phpunit>
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/src/SettingsContainerAbstract.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/src/SettingsContainerAbstract.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/src/SettingsContainerAbstract.php	(revision 8427)
@@ -0,0 +1,162 @@
+<?php
+/**
+ * Class SettingsContainerAbstract
+ *
+ * @created      28.08.2018
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2018 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\Settings;
+
+use ReflectionClass, ReflectionProperty;
+
+use function get_object_vars, json_decode, json_encode, method_exists, property_exists;
+use const JSON_THROW_ON_ERROR;
+
+abstract class SettingsContainerAbstract implements SettingsContainerInterface{
+
+	/**
+	 * SettingsContainerAbstract constructor.
+	 */
+	public function __construct(iterable $properties = null){
+
+		if(!empty($properties)){
+			$this->fromIterable($properties);
+		}
+
+		$this->construct();
+	}
+
+	/**
+	 * calls a method with trait name as replacement constructor for each used trait
+	 * (remember pre-php5 classname constructors? yeah, basically this.)
+	 */
+	protected function construct():void{
+		$traits = (new ReflectionClass($this))->getTraits();
+
+		foreach($traits as $trait){
+			$method = $trait->getShortName();
+
+			if(method_exists($this, $method)){
+				$this->{$method}();
+			}
+		}
+
+	}
+
+	/**
+	 * @inheritdoc
+	 */
+	public function __get(string $property){
+
+		if(!property_exists($this, $property) || $this->isPrivate($property)){
+			return null;
+		}
+
+		$method = 'get_'.$property;
+
+		if(method_exists($this, $method)){
+			return $this->{$method}();
+		}
+
+		return $this->{$property};
+	}
+
+	/**
+	 * @inheritdoc
+	 */
+	public function __set(string $property, $value):void{
+
+		if(!property_exists($this, $property) || $this->isPrivate($property)){
+			return;
+		}
+
+		$method = 'set_'.$property;
+
+		if(method_exists($this, $method)){
+			$this->{$method}($value);
+
+			return;
+		}
+
+		$this->{$property} = $value;
+	}
+
+	/**
+	 * @inheritdoc
+	 */
+	public function __isset(string $property):bool{
+		return isset($this->{$property}) && !$this->isPrivate($property);
+	}
+
+	/**
+	 * @internal Checks if a property is private
+	 */
+	protected function isPrivate(string $property):bool{
+		return (new ReflectionProperty($this, $property))->isPrivate();
+	}
+
+	/**
+	 * @inheritdoc
+	 */
+	public function __unset(string $property):void{
+
+		if($this->__isset($property)){
+			unset($this->{$property});
+		}
+
+	}
+
+	/**
+	 * @inheritdoc
+	 */
+	public function __toString():string{
+		return $this->toJSON();
+	}
+
+	/**
+	 * @inheritdoc
+	 */
+	public function toArray():array{
+		return get_object_vars($this);
+	}
+
+	/**
+	 * @inheritdoc
+	 */
+	public function fromIterable(iterable $properties):SettingsContainerInterface{
+
+		foreach($properties as $key => $value){
+			$this->__set($key, $value);
+		}
+
+		return $this;
+	}
+
+	/**
+	 * @inheritdoc
+	 */
+	public function toJSON(int $jsonOptions = null):string{
+		return json_encode($this, $jsonOptions ?? 0);
+	}
+
+	/**
+	 * @inheritdoc
+	 */
+	public function fromJSON(string $json):SettingsContainerInterface{
+		$data = json_decode($json, true, 512, JSON_THROW_ON_ERROR);
+
+		return $this->fromIterable($data);
+	}
+
+	/**
+	 * @inheritdoc
+	 */
+	#[\ReturnTypeWillChange]
+	public function jsonSerialize():array{
+		return $this->toArray();
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/src/SettingsContainerInterface.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/src/SettingsContainerInterface.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/src/SettingsContainerInterface.php	(revision 8427)
@@ -0,0 +1,74 @@
+<?php
+/**
+ * Interface SettingsContainerInterface
+ *
+ * @created      28.08.2018
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2018 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\Settings;
+
+use JsonSerializable;
+
+/**
+ * a generic container with magic getter and setter
+ */
+interface SettingsContainerInterface extends JsonSerializable{
+
+	/**
+	 * Retrieve the value of $property
+	 *
+	 * @return mixed|null
+	 */
+	public function __get(string $property);
+
+	/**
+	 * Set $property to $value while avoiding private and non-existing properties
+	 *
+	 * @param string $property
+	 * @param mixed  $value
+	 */
+	public function __set(string $property, $value):void;
+
+	/**
+	 * Checks if $property is set (aka. not null), excluding private properties
+	 */
+	public function __isset(string $property):bool;
+
+	/**
+	 * Unsets $property while avoiding private and non-existing properties
+	 */
+	public function __unset(string $property):void;
+
+	/**
+	 * @see SettingsContainerInterface::toJSON()
+	 */
+	public function __toString():string;
+
+	/**
+	 * Returns an array representation of the settings object
+	 */
+	public function toArray():array;
+
+	/**
+	 * Sets properties from a given iterable
+	 */
+	public function fromIterable(iterable $properties):SettingsContainerInterface;
+
+	/**
+	 * Returns a JSON representation of the settings object
+	 * @see \json_encode()
+	 */
+	public function toJSON(int $jsonOptions = null):string;
+
+	/**
+	 * Sets properties from a given JSON string
+	 *
+	 * @throws \Exception
+	 * @throws \JsonException
+	 */
+	public function fromJSON(string $json):SettingsContainerInterface;
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/tests/ContainerTest.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/tests/ContainerTest.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/tests/ContainerTest.php	(revision 8427)
@@ -0,0 +1,115 @@
+<?php
+/**
+ * Class ContainerTraitTest
+ *
+ * @created      28.08.2018
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2018 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\SettingsTest;
+
+use PHPUnit\Framework\TestCase;
+use JsonException, TypeError;
+use function sha1;
+
+class ContainerTest extends TestCase{
+
+	public function testConstruct(){
+		$container = new TestContainer([
+			'test1' => 'test1',
+			'test2' => true,
+			'test3' => 'test3',
+			'test4' => 'test4',
+		]);
+
+		$this::assertSame('test1', $container->test1);
+		$this::assertSame(true, $container->test2);
+		$this::assertNull($container->test3);
+		$this::assertSame('test4', $container->test4);
+
+		$this::assertSame('success', $container->testConstruct);
+	}
+
+	public function testGet(){
+		$container = new TestContainer;
+
+		$this::assertSame('foo', $container->test1);
+		$this::assertNull($container->test2);
+		$this::assertNull($container->test3);
+		$this::assertNull($container->test4);
+		$this::assertNull($container->foo);
+
+		// isset test
+		$this::assertTrue(isset($container->test1));
+		$this::assertFalse(isset($container->test2));
+		$this::assertFalse(isset($container->test3));
+		$this::assertFalse(isset($container->test4));
+		$this::assertFalse(isset($container->foo));
+
+		// custom getter
+		$container->test6 = 'foo';
+		$this::assertSame(sha1('foo'), $container->test6);
+		// nullable/isset test
+		$container->test6 = null;
+		$this::assertFalse(isset($container->test6));
+		$this::assertSame('null', $container->test6);
+	}
+
+	public function testSet(){
+		$container = new TestContainer;
+		$container->test1 = 'bar';
+		$container->test2 = false;
+		$container->test3 = 'nope';
+
+		$this::assertSame('bar', $container->test1);
+		$this::assertSame(false, $container->test2);
+		$this::assertNull($container->test3);
+
+		// unset
+		unset($container->test1);
+		$this::assertFalse(isset($container->test1));
+
+		// custom setter
+		$container->test5 = 'bar';
+		$this::assertSame('bar_test5', $container->test5);
+	}
+
+	public function testToArray(){
+		$container = new TestContainer([
+			'test1'         => 'no',
+			'test2'         => true,
+			'testConstruct' => 'success',
+		]);
+
+		$this::assertSame([
+			'test1'         => 'no',
+			'test2'         => true,
+			'testConstruct' => 'success',
+			'test4'         => null,
+			'test5'         => null,
+			'test6'         => null
+		], $container->toArray());
+	}
+
+	public function testToJSON(){
+		$container = (new TestContainer)->fromJSON('{"test1":"no","test2":true,"testConstruct":"success"}');
+
+		$expected  = '{"test1":"no","test2":true,"testConstruct":"success","test4":null,"test5":null,"test6":null}';
+
+		$this::assertSame($expected, $container->toJSON());
+		$this::assertSame($expected, (string)$container);
+	}
+
+	public function testFromJsonException(){
+		$this->expectException(JsonException::class);
+		(new TestContainer)->fromJSON('-');
+
+	}
+	public function testFromJsonTypeError(){
+		$this->expectException(TypeError::class);
+		(new TestContainer)->fromJSON('2');
+	}
+
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/tests/TestContainer.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/tests/TestContainer.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/tests/TestContainer.php	(revision 8427)
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Class TestContainer
+ *
+ * @created      28.08.2018
+ * @author       Smiley <smiley@chillerlan.net>
+ * @copyright    2018 Smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\SettingsTest;
+
+use chillerlan\Settings\SettingsContainerAbstract;
+
+/**
+ * @property $test1
+ * @property $test2
+ * @property $test3
+ * @property $test4
+ * @property $test5
+ * @property $test6
+ */
+class TestContainer extends SettingsContainerAbstract{
+	use TestOptionsTrait;
+
+	private string $test3 = 'what';
+}
Index: /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/tests/TestOptionsTrait.php
===================================================================
--- /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/tests/TestOptionsTrait.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/chillerlan/php-settings-container/tests/TestOptionsTrait.php	(revision 8427)
@@ -0,0 +1,42 @@
+<?php
+/**
+ * Trait TestOptionsTrait
+ *
+ * @created      28.08.2018
+ * @author       smiley <smiley@chillerlan.net>
+ * @copyright    2018 smiley
+ * @license      MIT
+ */
+
+namespace chillerlan\SettingsTest;
+
+use function sha1;
+
+trait TestOptionsTrait{
+
+	protected string $test1 = 'foo';
+
+	protected ?bool $test2 = null;
+
+	protected string $testConstruct;
+
+	protected ?string $test4 = null;
+
+	protected ?string $test5 = null;
+
+	protected ?string $test6 = null;
+
+	protected function TestOptionsTrait():void{
+		$this->testConstruct = 'success';
+	}
+
+	protected function set_test5($value):void{
+		$this->test5 = $value.'_test5';
+	}
+
+	protected function get_test6():string{
+		return $this->test6 === null
+			? 'null'
+			: sha1($this->test6);
+	}
+}
Index: /mods/mod_ticket/lib/vendor/composer/ClassLoader.php
===================================================================
--- /mods/mod_ticket/lib/vendor/composer/ClassLoader.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/composer/ClassLoader.php	(revision 8427)
@@ -0,0 +1,572 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Autoload;
+
+/**
+ * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
+ *
+ *     $loader = new \Composer\Autoload\ClassLoader();
+ *
+ *     // register classes with namespaces
+ *     $loader->add('Symfony\Component', __DIR__.'/component');
+ *     $loader->add('Symfony',           __DIR__.'/framework');
+ *
+ *     // activate the autoloader
+ *     $loader->register();
+ *
+ *     // to enable searching the include path (eg. for PEAR packages)
+ *     $loader->setUseIncludePath(true);
+ *
+ * In this example, if you try to use a class in the Symfony\Component
+ * namespace or one of its children (Symfony\Component\Console for instance),
+ * the autoloader will first look for the class under the component/
+ * directory, and it will then fallback to the framework/ directory if not
+ * found before giving up.
+ *
+ * This class is loosely based on the Symfony UniversalClassLoader.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @see    https://www.php-fig.org/psr/psr-0/
+ * @see    https://www.php-fig.org/psr/psr-4/
+ */
+class ClassLoader
+{
+    /** @var ?string */
+    private $vendorDir;
+
+    // PSR-4
+    /**
+     * @var array[]
+     * @psalm-var array<string, array<string, int>>
+     */
+    private $prefixLengthsPsr4 = array();
+    /**
+     * @var array[]
+     * @psalm-var array<string, array<int, string>>
+     */
+    private $prefixDirsPsr4 = array();
+    /**
+     * @var array[]
+     * @psalm-var array<string, string>
+     */
+    private $fallbackDirsPsr4 = array();
+
+    // PSR-0
+    /**
+     * @var array[]
+     * @psalm-var array<string, array<string, string[]>>
+     */
+    private $prefixesPsr0 = array();
+    /**
+     * @var array[]
+     * @psalm-var array<string, string>
+     */
+    private $fallbackDirsPsr0 = array();
+
+    /** @var bool */
+    private $useIncludePath = false;
+
+    /**
+     * @var string[]
+     * @psalm-var array<string, string>
+     */
+    private $classMap = array();
+
+    /** @var bool */
+    private $classMapAuthoritative = false;
+
+    /**
+     * @var bool[]
+     * @psalm-var array<string, bool>
+     */
+    private $missingClasses = array();
+
+    /** @var ?string */
+    private $apcuPrefix;
+
+    /**
+     * @var self[]
+     */
+    private static $registeredLoaders = array();
+
+    /**
+     * @param ?string $vendorDir
+     */
+    public function __construct($vendorDir = null)
+    {
+        $this->vendorDir = $vendorDir;
+    }
+
+    /**
+     * @return string[]
+     */
+    public function getPrefixes()
+    {
+        if (!empty($this->prefixesPsr0)) {
+            return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
+        }
+
+        return array();
+    }
+
+    /**
+     * @return array[]
+     * @psalm-return array<string, array<int, string>>
+     */
+    public function getPrefixesPsr4()
+    {
+        return $this->prefixDirsPsr4;
+    }
+
+    /**
+     * @return array[]
+     * @psalm-return array<string, string>
+     */
+    public function getFallbackDirs()
+    {
+        return $this->fallbackDirsPsr0;
+    }
+
+    /**
+     * @return array[]
+     * @psalm-return array<string, string>
+     */
+    public function getFallbackDirsPsr4()
+    {
+        return $this->fallbackDirsPsr4;
+    }
+
+    /**
+     * @return string[] Array of classname => path
+     * @psalm-return array<string, string>
+     */
+    public function getClassMap()
+    {
+        return $this->classMap;
+    }
+
+    /**
+     * @param string[] $classMap Class to filename map
+     * @psalm-param array<string, string> $classMap
+     *
+     * @return void
+     */
+    public function addClassMap(array $classMap)
+    {
+        if ($this->classMap) {
+            $this->classMap = array_merge($this->classMap, $classMap);
+        } else {
+            $this->classMap = $classMap;
+        }
+    }
+
+    /**
+     * Registers a set of PSR-0 directories for a given prefix, either
+     * appending or prepending to the ones previously set for this prefix.
+     *
+     * @param string          $prefix  The prefix
+     * @param string[]|string $paths   The PSR-0 root directories
+     * @param bool            $prepend Whether to prepend the directories
+     *
+     * @return void
+     */
+    public function add($prefix, $paths, $prepend = false)
+    {
+        if (!$prefix) {
+            if ($prepend) {
+                $this->fallbackDirsPsr0 = array_merge(
+                    (array) $paths,
+                    $this->fallbackDirsPsr0
+                );
+            } else {
+                $this->fallbackDirsPsr0 = array_merge(
+                    $this->fallbackDirsPsr0,
+                    (array) $paths
+                );
+            }
+
+            return;
+        }
+
+        $first = $prefix[0];
+        if (!isset($this->prefixesPsr0[$first][$prefix])) {
+            $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+
+            return;
+        }
+        if ($prepend) {
+            $this->prefixesPsr0[$first][$prefix] = array_merge(
+                (array) $paths,
+                $this->prefixesPsr0[$first][$prefix]
+            );
+        } else {
+            $this->prefixesPsr0[$first][$prefix] = array_merge(
+                $this->prefixesPsr0[$first][$prefix],
+                (array) $paths
+            );
+        }
+    }
+
+    /**
+     * Registers a set of PSR-4 directories for a given namespace, either
+     * appending or prepending to the ones previously set for this namespace.
+     *
+     * @param string          $prefix  The prefix/namespace, with trailing '\\'
+     * @param string[]|string $paths   The PSR-4 base directories
+     * @param bool            $prepend Whether to prepend the directories
+     *
+     * @throws \InvalidArgumentException
+     *
+     * @return void
+     */
+    public function addPsr4($prefix, $paths, $prepend = false)
+    {
+        if (!$prefix) {
+            // Register directories for the root namespace.
+            if ($prepend) {
+                $this->fallbackDirsPsr4 = array_merge(
+                    (array) $paths,
+                    $this->fallbackDirsPsr4
+                );
+            } else {
+                $this->fallbackDirsPsr4 = array_merge(
+                    $this->fallbackDirsPsr4,
+                    (array) $paths
+                );
+            }
+        } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
+            // Register directories for a new namespace.
+            $length = strlen($prefix);
+            if ('\\' !== $prefix[$length - 1]) {
+                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+            }
+            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+            $this->prefixDirsPsr4[$prefix] = (array) $paths;
+        } elseif ($prepend) {
+            // Prepend directories for an already registered namespace.
+            $this->prefixDirsPsr4[$prefix] = array_merge(
+                (array) $paths,
+                $this->prefixDirsPsr4[$prefix]
+            );
+        } else {
+            // Append directories for an already registered namespace.
+            $this->prefixDirsPsr4[$prefix] = array_merge(
+                $this->prefixDirsPsr4[$prefix],
+                (array) $paths
+            );
+        }
+    }
+
+    /**
+     * Registers a set of PSR-0 directories for a given prefix,
+     * replacing any others previously set for this prefix.
+     *
+     * @param string          $prefix The prefix
+     * @param string[]|string $paths  The PSR-0 base directories
+     *
+     * @return void
+     */
+    public function set($prefix, $paths)
+    {
+        if (!$prefix) {
+            $this->fallbackDirsPsr0 = (array) $paths;
+        } else {
+            $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
+        }
+    }
+
+    /**
+     * Registers a set of PSR-4 directories for a given namespace,
+     * replacing any others previously set for this namespace.
+     *
+     * @param string          $prefix The prefix/namespace, with trailing '\\'
+     * @param string[]|string $paths  The PSR-4 base directories
+     *
+     * @throws \InvalidArgumentException
+     *
+     * @return void
+     */
+    public function setPsr4($prefix, $paths)
+    {
+        if (!$prefix) {
+            $this->fallbackDirsPsr4 = (array) $paths;
+        } else {
+            $length = strlen($prefix);
+            if ('\\' !== $prefix[$length - 1]) {
+                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+            }
+            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+            $this->prefixDirsPsr4[$prefix] = (array) $paths;
+        }
+    }
+
+    /**
+     * Turns on searching the include path for class files.
+     *
+     * @param bool $useIncludePath
+     *
+     * @return void
+     */
+    public function setUseIncludePath($useIncludePath)
+    {
+        $this->useIncludePath = $useIncludePath;
+    }
+
+    /**
+     * Can be used to check if the autoloader uses the include path to check
+     * for classes.
+     *
+     * @return bool
+     */
+    public function getUseIncludePath()
+    {
+        return $this->useIncludePath;
+    }
+
+    /**
+     * Turns off searching the prefix and fallback directories for classes
+     * that have not been registered with the class map.
+     *
+     * @param bool $classMapAuthoritative
+     *
+     * @return void
+     */
+    public function setClassMapAuthoritative($classMapAuthoritative)
+    {
+        $this->classMapAuthoritative = $classMapAuthoritative;
+    }
+
+    /**
+     * Should class lookup fail if not found in the current class map?
+     *
+     * @return bool
+     */
+    public function isClassMapAuthoritative()
+    {
+        return $this->classMapAuthoritative;
+    }
+
+    /**
+     * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
+     *
+     * @param string|null $apcuPrefix
+     *
+     * @return void
+     */
+    public function setApcuPrefix($apcuPrefix)
+    {
+        $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
+    }
+
+    /**
+     * The APCu prefix in use, or null if APCu caching is not enabled.
+     *
+     * @return string|null
+     */
+    public function getApcuPrefix()
+    {
+        return $this->apcuPrefix;
+    }
+
+    /**
+     * Registers this instance as an autoloader.
+     *
+     * @param bool $prepend Whether to prepend the autoloader or not
+     *
+     * @return void
+     */
+    public function register($prepend = false)
+    {
+        spl_autoload_register(array($this, 'loadClass'), true, $prepend);
+
+        if (null === $this->vendorDir) {
+            return;
+        }
+
+        if ($prepend) {
+            self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
+        } else {
+            unset(self::$registeredLoaders[$this->vendorDir]);
+            self::$registeredLoaders[$this->vendorDir] = $this;
+        }
+    }
+
+    /**
+     * Unregisters this instance as an autoloader.
+     *
+     * @return void
+     */
+    public function unregister()
+    {
+        spl_autoload_unregister(array($this, 'loadClass'));
+
+        if (null !== $this->vendorDir) {
+            unset(self::$registeredLoaders[$this->vendorDir]);
+        }
+    }
+
+    /**
+     * Loads the given class or interface.
+     *
+     * @param  string    $class The name of the class
+     * @return true|null True if loaded, null otherwise
+     */
+    public function loadClass($class)
+    {
+        if ($file = $this->findFile($class)) {
+            includeFile($file);
+
+            return true;
+        }
+
+        return null;
+    }
+
+    /**
+     * Finds the path to the file where the class is defined.
+     *
+     * @param string $class The name of the class
+     *
+     * @return string|false The path if found, false otherwise
+     */
+    public function findFile($class)
+    {
+        // class map lookup
+        if (isset($this->classMap[$class])) {
+            return $this->classMap[$class];
+        }
+        if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
+            return false;
+        }
+        if (null !== $this->apcuPrefix) {
+            $file = apcu_fetch($this->apcuPrefix.$class, $hit);
+            if ($hit) {
+                return $file;
+            }
+        }
+
+        $file = $this->findFileWithExtension($class, '.php');
+
+        // Search for Hack files if we are running on HHVM
+        if (false === $file && defined('HHVM_VERSION')) {
+            $file = $this->findFileWithExtension($class, '.hh');
+        }
+
+        if (null !== $this->apcuPrefix) {
+            apcu_add($this->apcuPrefix.$class, $file);
+        }
+
+        if (false === $file) {
+            // Remember that this class does not exist.
+            $this->missingClasses[$class] = true;
+        }
+
+        return $file;
+    }
+
+    /**
+     * Returns the currently registered loaders indexed by their corresponding vendor directories.
+     *
+     * @return self[]
+     */
+    public static function getRegisteredLoaders()
+    {
+        return self::$registeredLoaders;
+    }
+
+    /**
+     * @param  string       $class
+     * @param  string       $ext
+     * @return string|false
+     */
+    private function findFileWithExtension($class, $ext)
+    {
+        // PSR-4 lookup
+        $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
+
+        $first = $class[0];
+        if (isset($this->prefixLengthsPsr4[$first])) {
+            $subPath = $class;
+            while (false !== $lastPos = strrpos($subPath, '\\')) {
+                $subPath = substr($subPath, 0, $lastPos);
+                $search = $subPath . '\\';
+                if (isset($this->prefixDirsPsr4[$search])) {
+                    $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
+                    foreach ($this->prefixDirsPsr4[$search] as $dir) {
+                        if (file_exists($file = $dir . $pathEnd)) {
+                            return $file;
+                        }
+                    }
+                }
+            }
+        }
+
+        // PSR-4 fallback dirs
+        foreach ($this->fallbackDirsPsr4 as $dir) {
+            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
+                return $file;
+            }
+        }
+
+        // PSR-0 lookup
+        if (false !== $pos = strrpos($class, '\\')) {
+            // namespaced class name
+            $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
+                . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
+        } else {
+            // PEAR-like class name
+            $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
+        }
+
+        if (isset($this->prefixesPsr0[$first])) {
+            foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
+                if (0 === strpos($class, $prefix)) {
+                    foreach ($dirs as $dir) {
+                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+                            return $file;
+                        }
+                    }
+                }
+            }
+        }
+
+        // PSR-0 fallback dirs
+        foreach ($this->fallbackDirsPsr0 as $dir) {
+            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+                return $file;
+            }
+        }
+
+        // PSR-0 include paths.
+        if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
+            return $file;
+        }
+
+        return false;
+    }
+}
+
+/**
+ * Scope isolated include.
+ *
+ * Prevents access to $this/self from included files.
+ *
+ * @param  string $file
+ * @return void
+ * @private
+ */
+function includeFile($file)
+{
+    include $file;
+}
Index: /mods/mod_ticket/lib/vendor/composer/InstalledVersions.php
===================================================================
--- /mods/mod_ticket/lib/vendor/composer/InstalledVersions.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/composer/InstalledVersions.php	(revision 8427)
@@ -0,0 +1,350 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer;
+
+use Composer\Autoload\ClassLoader;
+use Composer\Semver\VersionParser;
+
+/**
+ * This class is copied in every Composer installed project and available to all
+ *
+ * See also https://getcomposer.org/doc/07-runtime.md#installed-versions
+ *
+ * To require its presence, you can require `composer-runtime-api ^2.0`
+ */
+class InstalledVersions
+{
+    /**
+     * @var mixed[]|null
+     * @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}|array{}|null
+     */
+    private static $installed;
+
+    /**
+     * @var bool|null
+     */
+    private static $canGetVendors;
+
+    /**
+     * @var array[]
+     * @psalm-var array<string, array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
+     */
+    private static $installedByVendor = array();
+
+    /**
+     * Returns a list of all package names which are present, either by being installed, replaced or provided
+     *
+     * @return string[]
+     * @psalm-return list<string>
+     */
+    public static function getInstalledPackages()
+    {
+        $packages = array();
+        foreach (self::getInstalled() as $installed) {
+            $packages[] = array_keys($installed['versions']);
+        }
+
+        if (1 === \count($packages)) {
+            return $packages[0];
+        }
+
+        return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
+    }
+
+    /**
+     * Returns a list of all package names with a specific type e.g. 'library'
+     *
+     * @param  string   $type
+     * @return string[]
+     * @psalm-return list<string>
+     */
+    public static function getInstalledPackagesByType($type)
+    {
+        $packagesByType = array();
+
+        foreach (self::getInstalled() as $installed) {
+            foreach ($installed['versions'] as $name => $package) {
+                if (isset($package['type']) && $package['type'] === $type) {
+                    $packagesByType[] = $name;
+                }
+            }
+        }
+
+        return $packagesByType;
+    }
+
+    /**
+     * Checks whether the given package is installed
+     *
+     * This also returns true if the package name is provided or replaced by another package
+     *
+     * @param  string $packageName
+     * @param  bool   $includeDevRequirements
+     * @return bool
+     */
+    public static function isInstalled($packageName, $includeDevRequirements = true)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (isset($installed['versions'][$packageName])) {
+                return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Checks whether the given package satisfies a version constraint
+     *
+     * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
+     *
+     *   Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
+     *
+     * @param  VersionParser $parser      Install composer/semver to have access to this class and functionality
+     * @param  string        $packageName
+     * @param  string|null   $constraint  A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
+     * @return bool
+     */
+    public static function satisfies(VersionParser $parser, $packageName, $constraint)
+    {
+        $constraint = $parser->parseConstraints($constraint);
+        $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
+
+        return $provided->matches($constraint);
+    }
+
+    /**
+     * Returns a version constraint representing all the range(s) which are installed for a given package
+     *
+     * It is easier to use this via isInstalled() with the $constraint argument if you need to check
+     * whether a given version of a package is installed, and not just whether it exists
+     *
+     * @param  string $packageName
+     * @return string Version constraint usable with composer/semver
+     */
+    public static function getVersionRanges($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            $ranges = array();
+            if (isset($installed['versions'][$packageName]['pretty_version'])) {
+                $ranges[] = $installed['versions'][$packageName]['pretty_version'];
+            }
+            if (array_key_exists('aliases', $installed['versions'][$packageName])) {
+                $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
+            }
+            if (array_key_exists('replaced', $installed['versions'][$packageName])) {
+                $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
+            }
+            if (array_key_exists('provided', $installed['versions'][$packageName])) {
+                $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
+            }
+
+            return implode(' || ', $ranges);
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @param  string      $packageName
+     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
+     */
+    public static function getVersion($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            if (!isset($installed['versions'][$packageName]['version'])) {
+                return null;
+            }
+
+            return $installed['versions'][$packageName]['version'];
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @param  string      $packageName
+     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
+     */
+    public static function getPrettyVersion($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            if (!isset($installed['versions'][$packageName]['pretty_version'])) {
+                return null;
+            }
+
+            return $installed['versions'][$packageName]['pretty_version'];
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @param  string      $packageName
+     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
+     */
+    public static function getReference($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            if (!isset($installed['versions'][$packageName]['reference'])) {
+                return null;
+            }
+
+            return $installed['versions'][$packageName]['reference'];
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @param  string      $packageName
+     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
+     */
+    public static function getInstallPath($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @return array
+     * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}
+     */
+    public static function getRootPackage()
+    {
+        $installed = self::getInstalled();
+
+        return $installed[0]['root'];
+    }
+
+    /**
+     * Returns the raw installed.php data for custom implementations
+     *
+     * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
+     * @return array[]
+     * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}
+     */
+    public static function getRawData()
+    {
+        @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
+
+        if (null === self::$installed) {
+            // only require the installed.php file if this file is loaded from its dumped location,
+            // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
+            if (substr(__DIR__, -8, 1) !== 'C') {
+                self::$installed = include __DIR__ . '/installed.php';
+            } else {
+                self::$installed = array();
+            }
+        }
+
+        return self::$installed;
+    }
+
+    /**
+     * Returns the raw data of all installed.php which are currently loaded for custom implementations
+     *
+     * @return array[]
+     * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
+     */
+    public static function getAllRawData()
+    {
+        return self::getInstalled();
+    }
+
+    /**
+     * Lets you reload the static array from another file
+     *
+     * This is only useful for complex integrations in which a project needs to use
+     * this class but then also needs to execute another project's autoloader in process,
+     * and wants to ensure both projects have access to their version of installed.php.
+     *
+     * A typical case would be PHPUnit, where it would need to make sure it reads all
+     * the data it needs from this class, then call reload() with
+     * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
+     * the project in which it runs can then also use this class safely, without
+     * interference between PHPUnit's dependencies and the project's dependencies.
+     *
+     * @param  array[] $data A vendor/composer/installed.php data set
+     * @return void
+     *
+     * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>} $data
+     */
+    public static function reload($data)
+    {
+        self::$installed = $data;
+        self::$installedByVendor = array();
+    }
+
+    /**
+     * @return array[]
+     * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
+     */
+    private static function getInstalled()
+    {
+        if (null === self::$canGetVendors) {
+            self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
+        }
+
+        $installed = array();
+
+        if (self::$canGetVendors) {
+            foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
+                if (isset(self::$installedByVendor[$vendorDir])) {
+                    $installed[] = self::$installedByVendor[$vendorDir];
+                } elseif (is_file($vendorDir.'/composer/installed.php')) {
+                    $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
+                    if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
+                        self::$installed = $installed[count($installed) - 1];
+                    }
+                }
+            }
+        }
+
+        if (null === self::$installed) {
+            // only require the installed.php file if this file is loaded from its dumped location,
+            // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
+            if (substr(__DIR__, -8, 1) !== 'C') {
+                self::$installed = require __DIR__ . '/installed.php';
+            } else {
+                self::$installed = array();
+            }
+        }
+        $installed[] = self::$installed;
+
+        return $installed;
+    }
+}
Index: /mods/mod_ticket/lib/vendor/composer/LICENSE
===================================================================
--- /mods/mod_ticket/lib/vendor/composer/LICENSE	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/composer/LICENSE	(revision 8427)
@@ -0,0 +1,19 @@
+Copyright (c) Nils Adermann, Jordi Boggiano
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
Index: /mods/mod_ticket/lib/vendor/composer/autoload_classmap.php
===================================================================
--- /mods/mod_ticket/lib/vendor/composer/autoload_classmap.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/composer/autoload_classmap.php	(revision 8427)
@@ -0,0 +1,10 @@
+<?php
+
+// autoload_classmap.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+    'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
+);
Index: /mods/mod_ticket/lib/vendor/composer/autoload_namespaces.php
===================================================================
--- /mods/mod_ticket/lib/vendor/composer/autoload_namespaces.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/composer/autoload_namespaces.php	(revision 8427)
@@ -0,0 +1,9 @@
+<?php
+
+// autoload_namespaces.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+);
Index: /mods/mod_ticket/lib/vendor/composer/autoload_psr4.php
===================================================================
--- /mods/mod_ticket/lib/vendor/composer/autoload_psr4.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/composer/autoload_psr4.php	(revision 8427)
@@ -0,0 +1,11 @@
+<?php
+
+// autoload_psr4.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+    'chillerlan\\Settings\\' => array($vendorDir . '/chillerlan/php-settings-container/src'),
+    'chillerlan\\QRCode\\' => array($vendorDir . '/chillerlan/php-qrcode/src'),
+);
Index: /mods/mod_ticket/lib/vendor/composer/autoload_real.php
===================================================================
--- /mods/mod_ticket/lib/vendor/composer/autoload_real.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/composer/autoload_real.php	(revision 8427)
@@ -0,0 +1,57 @@
+<?php
+
+// autoload_real.php @generated by Composer
+
+class ComposerAutoloaderInitcf45e5dd2bb09e95d0cb68c0c04ff884
+{
+    private static $loader;
+
+    public static function loadClassLoader($class)
+    {
+        if ('Composer\Autoload\ClassLoader' === $class) {
+            require __DIR__ . '/ClassLoader.php';
+        }
+    }
+
+    /**
+     * @return \Composer\Autoload\ClassLoader
+     */
+    public static function getLoader()
+    {
+        if (null !== self::$loader) {
+            return self::$loader;
+        }
+
+        require __DIR__ . '/platform_check.php';
+
+        spl_autoload_register(array('ComposerAutoloaderInitcf45e5dd2bb09e95d0cb68c0c04ff884', 'loadClassLoader'), true, true);
+        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
+        spl_autoload_unregister(array('ComposerAutoloaderInitcf45e5dd2bb09e95d0cb68c0c04ff884', 'loadClassLoader'));
+
+        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
+        if ($useStaticLoader) {
+            require __DIR__ . '/autoload_static.php';
+
+            call_user_func(\Composer\Autoload\ComposerStaticInitcf45e5dd2bb09e95d0cb68c0c04ff884::getInitializer($loader));
+        } else {
+            $map = require __DIR__ . '/autoload_namespaces.php';
+            foreach ($map as $namespace => $path) {
+                $loader->set($namespace, $path);
+            }
+
+            $map = require __DIR__ . '/autoload_psr4.php';
+            foreach ($map as $namespace => $path) {
+                $loader->setPsr4($namespace, $path);
+            }
+
+            $classMap = require __DIR__ . '/autoload_classmap.php';
+            if ($classMap) {
+                $loader->addClassMap($classMap);
+            }
+        }
+
+        $loader->register(true);
+
+        return $loader;
+    }
+}
Index: /mods/mod_ticket/lib/vendor/composer/autoload_static.php
===================================================================
--- /mods/mod_ticket/lib/vendor/composer/autoload_static.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/composer/autoload_static.php	(revision 8427)
@@ -0,0 +1,41 @@
+<?php
+
+// autoload_static.php @generated by Composer
+
+namespace Composer\Autoload;
+
+class ComposerStaticInitcf45e5dd2bb09e95d0cb68c0c04ff884
+{
+    public static $prefixLengthsPsr4 = array (
+        'c' => 
+        array (
+            'chillerlan\\Settings\\' => 20,
+            'chillerlan\\QRCode\\' => 18,
+        ),
+    );
+
+    public static $prefixDirsPsr4 = array (
+        'chillerlan\\Settings\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/chillerlan/php-settings-container/src',
+        ),
+        'chillerlan\\QRCode\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/chillerlan/php-qrcode/src',
+        ),
+    );
+
+    public static $classMap = array (
+        'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
+    );
+
+    public static function getInitializer(ClassLoader $loader)
+    {
+        return \Closure::bind(function () use ($loader) {
+            $loader->prefixLengthsPsr4 = ComposerStaticInitcf45e5dd2bb09e95d0cb68c0c04ff884::$prefixLengthsPsr4;
+            $loader->prefixDirsPsr4 = ComposerStaticInitcf45e5dd2bb09e95d0cb68c0c04ff884::$prefixDirsPsr4;
+            $loader->classMap = ComposerStaticInitcf45e5dd2bb09e95d0cb68c0c04ff884::$classMap;
+
+        }, null, ClassLoader::class);
+    }
+}
Index: /mods/mod_ticket/lib/vendor/composer/installed.json
===================================================================
--- /mods/mod_ticket/lib/vendor/composer/installed.json	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/composer/installed.json	(revision 8427)
@@ -0,0 +1,154 @@
+{
+    "packages": [
+        {
+            "name": "chillerlan/php-qrcode",
+            "version": "4.3.4",
+            "version_normalized": "4.3.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/chillerlan/php-qrcode.git",
+                "reference": "2ca4bf5ae048af1981d1023ee42a0a2a9d51e51d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/chillerlan/php-qrcode/zipball/2ca4bf5ae048af1981d1023ee42a0a2a9d51e51d",
+                "reference": "2ca4bf5ae048af1981d1023ee42a0a2a9d51e51d",
+                "shasum": ""
+            },
+            "require": {
+                "chillerlan/php-settings-container": "^2.1.4",
+                "ext-mbstring": "*",
+                "php": "^7.4 || ^8.0"
+            },
+            "require-dev": {
+                "phan/phan": "^5.3",
+                "phpunit/phpunit": "^9.5",
+                "setasign/fpdf": "^1.8.2"
+            },
+            "suggest": {
+                "chillerlan/php-authenticator": "Yet another Google authenticator! Also creates URIs for mobile apps.",
+                "setasign/fpdf": "Required to use the QR FPDF output."
+            },
+            "time": "2022-07-25T09:12:45+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "chillerlan\\QRCode\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Kazuhiko Arase",
+                    "homepage": "https://github.com/kazuhikoarase"
+                },
+                {
+                    "name": "Smiley",
+                    "email": "smiley@chillerlan.net",
+                    "homepage": "https://github.com/codemasher"
+                },
+                {
+                    "name": "Contributors",
+                    "homepage": "https://github.com/chillerlan/php-qrcode/graphs/contributors"
+                }
+            ],
+            "description": "A QR code generator. PHP 7.4+",
+            "homepage": "https://github.com/chillerlan/php-qrcode",
+            "keywords": [
+                "phpqrcode",
+                "qr",
+                "qr code",
+                "qrcode",
+                "qrcode-generator"
+            ],
+            "support": {
+                "issues": "https://github.com/chillerlan/php-qrcode/issues",
+                "source": "https://github.com/chillerlan/php-qrcode/tree/4.3.4"
+            },
+            "funding": [
+                {
+                    "url": "https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://ko-fi.com/codemasher",
+                    "type": "ko_fi"
+                }
+            ],
+            "install-path": "../chillerlan/php-qrcode"
+        },
+        {
+            "name": "chillerlan/php-settings-container",
+            "version": "2.1.4",
+            "version_normalized": "2.1.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/chillerlan/php-settings-container.git",
+                "reference": "1beb7df3c14346d4344b0b2e12f6f9a74feabd4a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/chillerlan/php-settings-container/zipball/1beb7df3c14346d4344b0b2e12f6f9a74feabd4a",
+                "reference": "1beb7df3c14346d4344b0b2e12f6f9a74feabd4a",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "php": "^7.4 || ^8.0"
+            },
+            "require-dev": {
+                "phan/phan": "^5.3",
+                "phpunit/phpunit": "^9.5"
+            },
+            "time": "2022-07-05T22:32:14+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "chillerlan\\Settings\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Smiley",
+                    "email": "smiley@chillerlan.net",
+                    "homepage": "https://github.com/codemasher"
+                }
+            ],
+            "description": "A container class for immutable settings objects. Not a DI container. PHP 7.4+",
+            "homepage": "https://github.com/chillerlan/php-settings-container",
+            "keywords": [
+                "PHP7",
+                "Settings",
+                "configuration",
+                "container",
+                "helper"
+            ],
+            "support": {
+                "issues": "https://github.com/chillerlan/php-settings-container/issues",
+                "source": "https://github.com/chillerlan/php-settings-container"
+            },
+            "funding": [
+                {
+                    "url": "https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://ko-fi.com/codemasher",
+                    "type": "ko_fi"
+                }
+            ],
+            "install-path": "../chillerlan/php-settings-container"
+        }
+    ],
+    "dev": true,
+    "dev-package-names": []
+}
Index: /mods/mod_ticket/lib/vendor/composer/installed.php
===================================================================
--- /mods/mod_ticket/lib/vendor/composer/installed.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/composer/installed.php	(revision 8427)
@@ -0,0 +1,41 @@
+<?php return array(
+    'root' => array(
+        'pretty_version' => '1.0.0+no-version-set',
+        'version' => '1.0.0.0',
+        'type' => 'library',
+        'install_path' => __DIR__ . '/../../',
+        'aliases' => array(),
+        'reference' => NULL,
+        'name' => 'daniel/lib',
+        'dev' => true,
+    ),
+    'versions' => array(
+        'chillerlan/php-qrcode' => array(
+            'pretty_version' => '4.3.4',
+            'version' => '4.3.4.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../chillerlan/php-qrcode',
+            'aliases' => array(),
+            'reference' => '2ca4bf5ae048af1981d1023ee42a0a2a9d51e51d',
+            'dev_requirement' => false,
+        ),
+        'chillerlan/php-settings-container' => array(
+            'pretty_version' => '2.1.4',
+            'version' => '2.1.4.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../chillerlan/php-settings-container',
+            'aliases' => array(),
+            'reference' => '1beb7df3c14346d4344b0b2e12f6f9a74feabd4a',
+            'dev_requirement' => false,
+        ),
+        'daniel/lib' => array(
+            'pretty_version' => '1.0.0+no-version-set',
+            'version' => '1.0.0.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../../',
+            'aliases' => array(),
+            'reference' => NULL,
+            'dev_requirement' => false,
+        ),
+    ),
+);
Index: /mods/mod_ticket/lib/vendor/composer/platform_check.php
===================================================================
--- /mods/mod_ticket/lib/vendor/composer/platform_check.php	(revision 8427)
+++ /mods/mod_ticket/lib/vendor/composer/platform_check.php	(revision 8427)
@@ -0,0 +1,26 @@
+<?php
+
+// platform_check.php @generated by Composer
+
+$issues = array();
+
+if (!(PHP_VERSION_ID >= 70400)) {
+    $issues[] = 'Your Composer dependencies require a PHP version ">= 7.4.0". You are running ' . PHP_VERSION . '.';
+}
+
+if ($issues) {
+    if (!headers_sent()) {
+        header('HTTP/1.1 500 Internal Server Error');
+    }
+    if (!ini_get('display_errors')) {
+        if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
+            fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);
+        } elseif (!headers_sent()) {
+            echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
+        }
+    }
+    trigger_error(
+        'Composer detected issues in your platform: ' . implode(' ', $issues),
+        E_USER_ERROR
+    );
+}
Index: /mods/wpsg_mod_ticket.class.php
===================================================================
--- /mods/wpsg_mod_ticket.class.php	(revision 8427)
+++ /mods/wpsg_mod_ticket.class.php	(revision 8427)
@@ -0,0 +1,238 @@
+<?php
+	
+	declare(strict_types=1);
+	
+	/**
+	 * @author: daniel
+	 * @date: 22.08.24
+	 * @time: 11:13
+	 */
+	 
+	class wpsg_mod_ticket extends \wpsg_mod_basic {
+		
+		private static bool $init = false;
+		
+		var $lizenz = 1;
+		var $id = 5502;
+		var $hilfeURL = '';
+		//var $version = "9.9.9";
+		//var $free = false;
+		
+		public function __construct() {
+			
+			parent::__construct();
+			
+			$this->name = __('Ticketprodukte', 'wpsg');
+			$this->group = __('Produkte', 'wpsg');
+			$this->desc = __('', 'wpsg');
+			
+		}
+		
+		public function init(): void {
+			
+			global $wpdb;
+			
+			if (self::$init === false) {
+				
+				define('WPSG_TBL_TICKETS', $wpdb->prefix.'wpsg_tickets');
+				define('WPSG_TBL_TICKET_TEMPLATES', $wpdb->prefix.'wpsg_ticket_templates');
+				
+				\spl_autoload_register(function($class_name) {
+
+					$arPath = explode('\\', $class_name);
+			
+					if ($arPath[0] === 'wpsgTicket') {
+			
+						$file_path = implode(DIRECTORY_SEPARATOR, [dirname(__FILE__), 'mod_ticket', 'classes', ucfirst($arPath[1]).'.php']);
+						
+						if (file_exists($file_path)) {
+			
+							require_once($file_path);
+			
+						} else {
+							
+							throw new \Exception(wpsg_translate(__('Klasse #1# fÃŒr TicketProdukt Modul nicht gefunden.', 'wpsg'), $file_path));
+							
+						}
+			
+					}
+			
+				} );
+	 
+				\add_action('wp_ajax_wpsg_ticket', ['\wpsgTicket\Ajax', 'backend']);
+				\add_action('wp_ajax_wpsg_ticket_frontend', ['\wpsgTicket\Ajax', 'frontend']);
+				\add_action('wp_ajax_nopriv_wpsg_ticket_frontend', ['\wpsgTicket\Ajax', 'frontend']);
+				
+				\add_action('wpsg_produkt_edit', ['\wpsgTicket\Action', 'wpsg_produkt_edit']);
+				\add_action('wpsg_product_addedit_content', ['wpsgTicket\Action', 'wpsg_product_addedit_content']);
+				\add_action('wpsg_renderProdukt_templateSelect', ['\wpsgTicket\Action', 'wpsg_renderProdukt_templateSelect']);
+				\add_action('wpsg_basket_row', ['\wpsgTicket\Action', 'wpsg_basket_row']);
+				\add_action('wpsg_overview_row', ['\wpsgTicket\Action', 'wpsg_overview_row']);
+				\add_action('wpsg_calculation_saveProduct_after', ['\wpsgTicket\Action', 'wpsg_calculation_saveProduct_after']);
+				\add_action('wpsg_setOrderStatus', ['\wpsgTicket\Action', 'setOrderStatus']);
+				\add_action('wpsg_basket_updateProduktFromSession', ['\wpsgTicket\Action', 'basket_updateProduktFromSession']);
+				\add_action('wpsg_calculation_addProduct', ['\wpsgTicket\Action', 'wpsg_calculation_addProduct']);
+				\add_action('wpsg_order_view_row', ['\wpsgTicket\Action', 'wpsg_order_view_row']);
+				\add_action('wpsg_admin_emailconf', ['\wpsgTicket\Action', 'wpsg_admin_emailconf']);
+				\add_action('wpsg_admin_emailconf_save', ['\wpsgTicket\Action', 'wpsg_admin_emailconf_save']);
+				\add_action('wpsg_order_view', ['\wpsgTicket\Action', 'order_view']);
+				\add_action('admin_menu', ['\wpsgTicket\Action', 'admin_menu']);
+				
+				\add_action('wp_enqueue_scripts', function() {
+ 
+				
+					
+				});
+				\add_action('admin_enqueue_scripts', function() {
+				
+					if (($_REQUEST['page']??'') === 'wpsg-Produkt') {
+						
+						\wp_enqueue_style('vanilla-calendar', WPSG_URL.'mods/mod_ticket/assets/vanilla-calendar/vanilla-calendar.min.css');
+						\wp_enqueue_style('light-theme', WPSG_URL.'mods/mod_ticket/assets/vanilla-calendar/themes/light.min.css');
+						\wp_enqueue_style('dark-theme', WPSG_URL.'mods/mod_ticket/assets/vanilla-calendar/themes/dark.min.css');
+						
+					}
+				
+				});
+				\add_action('wp_footer', function() {
+					
+					if (\wpsgTicket\TicketProduct::$enqueTicket === true) {
+						
+						\wp_enqueue_style('vanilla-calendar', WPSG_URL.'mods/mod_ticket/assets/vanilla-calendar/vanilla-calendar.min.css');
+						\wp_enqueue_style('light-theme', WPSG_URL.'mods/mod_ticket/assets/vanilla-calendar/themes/light.min.css');
+						\wp_enqueue_style('dark-theme', WPSG_URL.'mods/mod_ticket/assets/vanilla-calendar/themes/dark.min.css');
+						\wp_enqueue_style('wpsg_ticket-frontend', WPSG_URL.'mods/mod_ticket/assets/css/wpsg_ticket.css');
+						\wp_enqueue_style('wpsg_ticket-calendar', WPSG_URL.'mods/mod_ticket/assets/css/wpsg_calendar.css');
+						
+						\wp_enqueue_script('vanilla-calendar', WPSG_URL.'mods/mod_ticket/assets/vanilla-calendar/vanilla-calendar.min.js', array(), '', true);
+						\wp_enqueue_script('wpsg_vue3', WPSG_URL.'mods/mod_ticket/assets/js/vue3.3.6.global.js', array(), '', true);
+						\wp_enqueue_script('wpsg_ticket-frontend', WPSG_URL.'mods/mod_ticket//assets/js/wpsg_ticket_frontend.js', ['wpsg_vue3', 'vanilla-calendar'], '', true);
+						
+						\wp_enqueue_script('wpsg_ticket_fullcalendar', WPSG_URL.'mods/mod_ticket/assets/vanilla-calendar/index.global.min.js', [], '1.0', true);
+					 	\wp_enqueue_script('wpsg_ticket_fullcalendar_de', WPSG_URL.'mods/mod_ticket/assets/vanilla-calendar/locales-all.global.min.js', [], '1.0', true);
+						
+					}
+					
+				});
+				
+				if (!\wp_next_scheduled('wpsg_ticket_daily')) {
+
+					\wp_schedule_event(time(), 'daily', 'wpsg_ticket_daily');
+			
+				}
+				
+				\add_action('wpsg_ticket_daily', ['\wpsgTicket\Action', 'cronDaily']);
+				
+				self::$init = true;
+				
+			}
+			
+		}
+		
+		public function settings_edit(): void {
+		
+			$font_path = WPSG_PATH_LIB.'FPDF_1.81/font/';
+
+	        $arFontFiles = scandir($font_path);
+
+	        foreach ($arFontFiles as $k => $v) {
+
+	            $file = $font_path.$v;
+
+	            if (is_file($file) && file_exists($file) && preg_match('/(.*)\.php$/i', $v)) {
+
+	                $this->shop->view['arFonts'][$v] = ucfirst(preg_replace('/\.php$/i', '', $v));
+
+	            }
+
+	        }
+			
+			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_ticket/settings_edit.phtml');
+		
+		}
+		
+		public function settings_save(): void {
+		
+		}
+		
+		public function install(): void {
+			
+			global $wpdb;
+			
+			$charset_collate = $wpdb->get_charset_collate();
+			
+			$sql = "CREATE TABLE ".$wpdb->prefix."wpsg_tickets (
+				id INT NOT NULL AUTO_INCREMENT,
+				label VARCHAR(500) DEFAULT '' NOT NULL,
+				label_short VARCHAR(500) DEFAULT '' NOT NULL,
+				p_id INT NOT NULL,
+				from_date DATE,
+				from_time TIME,
+				to_date DATE,
+				to_time TIME,
+				slots INT,
+				state INT DEFAULT 0,
+				autoticket TEXT DEFAULT NULL,
+				autoticket_id INT(11) DEFAULT 0 NULL,
+				PRIMARY KEY  (id),
+				KEY autoticket_id (autoticket_id),
+				KEY p_id (p_id)
+			) $charset_collate;";
+			
+			require_once(ABSPATH.'wp-admin/includes/upgrade.php');
+
+			dbDelta($sql);
+			
+			$sql = "CREATE TABLE ".$wpdb->prefix."wpsg_ticket_templates (
+				id INT NOT NULL AUTO_INCREMENT,
+				config BLOB,
+				template_name VARCHAR(500) NOT NULL DEFAULT '',
+				defaulttemplate INT(1) NOT NULL DEFAULT 0,
+				deleted INT NOT NULL DEFAULT 0,
+				PRIMARY KEY  (id)
+			) $charset_collate;";
+			
+			dbDelta($sql);
+			
+			$sql = "CREATE TABLE ".$wpdb->prefix."wpsg_ticket_booking (
+				id INT NOT NULL AUTO_INCREMENT,
+				booking_key VARCHAR(255) NOT NULL,
+				order_id INT NOT NULL,
+				order_product_id INT NOT NULL,
+				product_id INT NOT NULL,
+				ticket_id INT NOT NULL,
+				amount_index INT NOT NULL,
+				revoke_user INT(11) NULL DEFAULT NULL,
+				revoke_time DATETIME NULL DEFAULT NULL,
+				send_user INT(11) NOT NULL DEFAULT 0,
+				send_time DATETIME NULL DEFAULT NULL,
+				PRIMARY KEY  (id),
+				KEY booking_key (booking_key),
+				KEY order_id (order_id),
+				KEY order_product_id (order_product_id),
+				KEY product_id (product_id),
+				KEY ticket_id (ticket_id),
+				KEY amount_index (amount_index)
+			) $charset_collate;";
+			
+			dbDelta($sql);
+			
+			$sql = "CREATE TABLE ".$wpdb->prefix."wpsg_ticket_log (
+				id INT NOT NULL AUTO_INCREMENT,
+				booking_id INT(11) NOT NULL,
+				user_id INT(11) NOT NULL,
+				date_time DATETIME NOT NULL,
+				log INT(11) NOT NULL,
+				PRIMARY KEY  (id),
+				KEY booking_id (booking_id)
+			) $charset_collate;";
+			
+			dbDelta($sql);
+			
+			\wpsg_ShopController::getShop()->checkDefault('wpsg_mod_ticket_orderstate_active', '100,110');
+			\wpsg_ShopController::getShop()->checkDefault('wpsg_mod_ticket_orderstate_send', '100');
+			\wpsg_ShopController::getShop()->checkDefault('wpsg_ticketmail_betreff', 'Ihre Tickets');
+			
+		}
+		
+	}
Index: /views/mods/mod_ticket/basket_row.phtml
===================================================================
--- /views/mods/mod_ticket/basket_row.phtml	(revision 8427)
+++ /views/mods/mod_ticket/basket_row.phtml	(revision 8427)
@@ -0,0 +1,21 @@
+<?php
+
+	/**
+	 * Template fÃŒr die Integration der Produktvariablen innerhalb des Warenkorbs
+	 */
+
+	namespace wpsgTicket;
+	
+	/** @var Ticket $oTicket */
+	$oTicket = $this->view['oTicket'];
+	
+?>
+
+<div class="product_info">
+	<div class="title">
+		<?php echo __('Datum', 'wpsg'); ?>
+	</div>
+	<div class="value">
+		<?php echo $oTicket->getLabel(); ?>
+	</div>
+</div>
Index: /views/mods/mod_ticket/order_view.phtml
===================================================================
--- /views/mods/mod_ticket/order_view.phtml	(revision 8427)
+++ /views/mods/mod_ticket/order_view.phtml	(revision 8427)
@@ -0,0 +1,125 @@
+<?php
+	
+	declare(strict_types=1);
+	
+	/**
+	 * @author: Daniel Schmitzer (daniel@maennchen1.de)
+	 * @date: 03.12.23
+	 * @time: 15:14
+	 */
+	
+	namespace wpsgTicket;
+	
+	/** @var \wpsg_order $oOrder */
+    $oOrder = \wpsg_order::getInstance(intval($this->view['data']['id']));
+	
+	$data = [];
+	
+	foreach ($oOrder->getOrderProducts() as $oOrderProduct) {
+		
+		if (intval($oOrderProduct->getMeta('ticket_id', false, 0)) > 0) {
+		
+			for ($amount_index = 0; $amount_index < $oOrderProduct->getAmount(); $amount_index++) {
+			
+				$oTicketBooking = TicketBooking::getInstanceByBookingKey(TicketBooking::encodeBookingKey($oOrderProduct->getId(), $amount_index));
+				
+				$data[] = $oTicketBooking->toJSON();
+			
+			}
+		
+		}
+		
+	}
+	
+?>
+
+<?php echo wpsg_drawForm_AdminboxStart(__('Ticketbuchungen', 'wpsg')); ?>
+	<div id="order_view_app">
+		
+		<table>
+			<thead>
+				<tr>
+					<th class="col_ticket"><?php echo __('Ticket', 'wpsg'); ?></th>
+					<th class="col_product"><?php echo __('Ticket Produkt', 'wpsg'); ?></th>
+					<th class="col_date"><?php echo __('Datum / Zeitraum', 'wpsg'); ?></th>
+					<th class="col_state"><?php echo __('Status', 'wpsg'); ?></th>
+				</tr>
+			</thead>
+			<tbody v-for="(row, i) in data">
+				<tr>
+					<td class="col_ticket">
+						<a :href="row.urls.pdf" target="_blank">{{row.label}}</a>
+					</td>
+					<td class="col_product">
+						<a :href="row.urls.product_edit">{{row.ticket_product_label}}</a>
+					</td>
+					<td class="col_date">{{row.ticket_data.label}}</td>
+					<td class="col_state">
+						<span :class="{'text-red': row.state_code === <?php echo TicketBooking::STATUS_UNAVAILABLE; ?>, 'text-green': row.state_code === <?php echo TicketBooking::STATUS_AVAILABLE; ?>}">{{row.state_label}}</span>
+						<span v-if="row.is_send" :title="row.is_send_tooltip" class="ml-4 glyphicon glyphicon-send text-green"></span>
+					</td>
+				</tr>
+				<template v-if="row.arProductVars.length > 0">
+					<template v-for="(pv_data, pv_id) of row.arProductVars">
+						<tr>
+							<td colspan="2">
+								{{pv_data['name']}}:
+							</td>
+							<td colspan="2">
+								{{pv_data['value']}}
+							</td>
+						</tr>
+					</template>
+				</template>
+			</tbody>
+		</table>
+		
+		<br />
+		
+		<div class="flex items-center gap-2">
+			
+			<a href="<?php echo \add_query_arg([
+				'action' => 'wpsg_ticket',
+				'ticket_action' => 'export',
+				'order_id' => $oOrder->getId()
+			], \admin_url('admin-ajax.php')); ?>" target="_blank" class="button"><?php echo __('TerminÃŒbersicht exportieren', 'wpsg'); ?></a>
+			
+			<a href="<?php echo \add_query_arg([
+				'action' => 'wpsg_ticket',
+				'ticket_action' => 'resend',
+				'order_id' => $oOrder->getId()
+			], \admin_url('admin-ajax.php')); ?>" class="button"><?php echo __('Tickets per E-Mail an Kunden versenden', 'wpsg'); ?></a>
+		
+		</div>
+		
+	</div>
+	<style>
+		
+		#order_view_app table { width:100%; }
+		#order_view_app table tr td { padding:0.25rem 0.5rem 0.25rem 0; border-bottom:1px solid #DEDEDE; }
+		#order_view_app table tr th { border-bottom:1px solid black; }
+		#order_view_app .text-red { color:red; }
+		#order_view_app .text-green { color:green; }
+		#order_view_app .flex { display:flex; }
+		#order_view_app .items-center { align-items:center; }
+		#order_view_app .ml-4 { margin-left:1rem; }
+		#order_view_app .gap-2 { gap:0.5rem; }
+		
+	</style>
+<?php echo wpsg_drawForm_AdminboxEnd(); ?>
+
+<script type="module">
+	
+	const wpsgSettings = {
+		baseUrl: '<?php echo WPSG_URL; ?>'
+	};
+	
+	import { order_view } from '<?php echo WPSG_URL; ?>mods/mod_ticket/assets/js/wpsg_order_view.js';
+	
+	order_view(wpsgSettings, <?php echo json_encode([
+		'order_id' => $oOrder->getId(),
+		'data' => $data,
+		'ajax_url' => \admin_url('admin-ajax.php')
+	]); ?>);
+	
+</script>
Index: /views/mods/mod_ticket/order_view_row.phtml
===================================================================
--- /views/mods/mod_ticket/order_view_row.phtml	(revision 8427)
+++ /views/mods/mod_ticket/order_view_row.phtml	(revision 8427)
@@ -0,0 +1,41 @@
+<?php
+
+    /**
+     * Anzeige des Variantennamens in der Bestellverwaltung
+     */
+
+	namespace wpsgTicket;
+	
+    $i = $this->view['i'];
+    $p = $this->view['p'];
+
+	/** @var Ticket $oTicket */
+	$oTicket = $this->view['oTicket'];
+	
+	/** @var \wpsg_order_product $oOrderProduct */
+	$oOrderProduct = $this->view['oOrderProduct'];
+	
+?>
+
+<tr class="wpsg_<?php echo (($i % 2 == 0)?'odd':'even'); ?>">
+    <td class="wpsg_cell_name">
+        <?php echo __('Datum', 'wpsg'); ?>:
+    </td>
+    <td class="wpsg_cell_ticket text-right" colspan="<?php echo ((sizeof($this->view['arCalculation']['tax']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?4:3); ?>">
+		<?php echo $oTicket->getLabel(); ?>
+    </td>
+</tr>
+<tr class="wpsg_<?php echo (($i % 2 == 0)?'odd':'even'); ?>">
+    <td class="wpsg_cell_name">
+		<?php if ($p['amount'] > 1) { ?>
+        	<?php echo __('Tickets', 'wpsg'); ?>:
+		<?php } else { ?>
+			<?php echo __('Ticket', 'wpsg'); ?>:
+		<?php } ?>
+    </td>
+    <td class="wpsg_cell_ticket text-right" colspan="<?php echo ((sizeof($this->view['arCalculation']['tax']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1')?4:3); ?>">
+		<?php for ($i = 0; $i < $p['amount']; $i ++) { ?>
+			<a target="_blank" href="<?php echo $oTicket->getTicketPublicURL($oOrderProduct->getId(), $i); ?>">Ticket #<?php echo $i + 1; ?></a>
+		<?php } ?>
+    </td>
+</tr>
Index: /views/mods/mod_ticket/product_addedit_content.phtml
===================================================================
--- /views/mods/mod_ticket/product_addedit_content.phtml	(revision 8427)
+++ /views/mods/mod_ticket/product_addedit_content.phtml	(revision 8427)
@@ -0,0 +1,526 @@
+<?php
+	
+	declare(strict_types=1);
+	
+	/**
+	 * @author: Daniel Schmitzer (daniel@maennchen1.de)
+	 * @date: 14.10.23
+	 * @time: 07:56
+	 */
+	
+	namespace wpsgTicket;
+	
+	$oProduct = \wpsg_product::getInstance($this->view['data']['id']);
+	
+	\wpsg_drawForm_AdminboxStart(__('Ticketprodukt', 'wpsg'));
+	
+	$arTicketTemplate = [];
+	foreach (TicketTemplate::find([], null, true) as $oTicketTemplate) $arTicketTemplate[$oTicketTemplate->getId()] = $oTicketTemplate->getLabel();
+	
+?>
+
+<script type="module">
+	
+	import { product_addedit_content } from '<?php echo WPSG_URL; ?>mods/mod_ticket/assets/js/wpsg_ticket.js';
+	
+	const wpsgSettings = {
+		baseUrl: '<?php echo WPSG_URL; ?>'
+	};
+	
+	product_addedit_content(wpsgSettings, <?php echo $oProduct->getId(); ?>, '<?php echo \admin_url('admin-ajax.php'); ?>');
+	
+</script>
+
+<?php echo wpsg_drawForm_Checkbox('meta[ticket_product]', __('Produkt ist ein Ticket Produkt', 'wpsg'), $oProduct->getMeta('ticket_product', false, '0')); ?>
+
+<hr />
+
+<div id="wpsg_ticket_product" style="display:none;">
+	
+	<?php echo wpsg_drawForm_Select('meta[ticket_template]', __('Ticket Template', 'wpsg'), $arTicketTemplate, $oProduct->getMeta('ticket_template', false, '0')); ?>
+	
+	<template v-if="mounted">
+		
+		<br />
+		
+		<div class="flex justify-between">
+			<div class="flex gap-2 items-center">
+				<a href="#" @click.prevent="addSerialevent" class="button"><?php echo __('Neuen Serientermin definieren', 'wpsg'); ?></a>
+				<a href="#" @click.prevent="addEvent" class="button"><?php echo __('Neuen Einzeltermin anlegen', 'wpsg'); ?></a>
+				<a href="<?php echo \add_query_arg([
+					'action' => 'wpsg_ticket',
+					'ticket_action' => 'export',
+					'ticket_product_id' => $oProduct->getId()
+				], \admin_url('admin-ajax.php')); ?>" target="_blank" class="button"><?php echo __('TerminÃŒbersicht exportieren', 'wpsg'); ?></a>
+			</div>
+			<a href="/wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_ticket"><?php echo __('Zur Modulkonfiguration', 'wpsg'); ?></a>
+		</div>
+		
+		<br />
+	
+		<div class="nav nav-tabs">
+			<li :class="{'active': tab === 2}"><a @click.prevent="tab = 2" href="#"><?php echo __('Serientermine', 'wpsg'); ?></a></li>
+			<li :class="{'active': tab === 1}"><a @click.prevent="tab = 1" href="#"><?php echo __('Termine', 'wpsg'); ?></a></li>
+			<li :class="{'active': tab === 3}"><a @click.prevent="tab = 3" href="#"><?php echo __('Belegungsansicht', 'wpsg'); ?></a></li>
+		</div>
+		<div class="tab-content">
+			<div v-if="tab === 1" class="ticket_list">
+				<div class="head">
+					<div class="tablenav">
+						<div class="flex justify-between items-center grow pr-4">
+							<label>
+								<input type="checkbox" v-model="data.filter.hideInactive" @change="reload" /><span><?php echo __('Nur buchbare Termine anzeigen', 'wpsg'); ?></span>
+							</label>
+							<select style="width:200px;" v-if="data_serial.items.length > 0" v-model.number="data.filter.autoticket_id" @change="load()">
+								<option :value="0"><?php echo __('Alle', 'wpsg'); ?></option>
+								<template v-for="(st, i) of data_serial.items">
+									<option :value="st.id">{{st.label}}</option>
+								</template>
+							</select>
+						</div>
+						<span class="tablenav-pages" v-if="data.pager.count > 0">
+							<span class="displaying-num">{{data.pager.count}} Tickets</span>
+							<span class="pagination-links">
+								<a href="#" @click.prevent="goPage(1)" class="tablenav-pages-navspan button" :class="{'disabled': data.pager.page <= 1}">Â«</a>
+								<a href="#" @click.prevent="goPage(data.pager.page - 1)" class="tablenav-pages-navspan button" :class="{'disabled': data.pager.page <= 1}">â¹</a>
+								<span class="paging-input">
+									<span class="tablenav-paging-text">
+										<span class="total-pages">{{data.pager.page}}</span>
+										&nbsp;von&nbsp;
+										<span class="total-pages">{{data.pager.pages}}</span>
+									</span>
+								</span>
+								<a href="#" @click.prevent="goPage(data.pager.page + 1)" class="next-page button" :class="{'disabled': data.pager.page >= data.pager.pages}">âº</a>
+								<a href="#" @click.prevent="goPage(data.pager.pages)" class="last-page button" :class="{'disabled': data.pager.page >= data.pager.pages}">Â»</a>
+							</span>
+						</span>
+					</div>
+				</div>
+				<div class="content" v-if="data.items.length > 0">
+				 
+					<table>
+						<thead>
+							<tr>
+								<th class="col_date"><?php echo __('Datum', 'wpsg'); ?></th>
+								<th class="col_order"><?php echo __('Bestellungen', 'wpsg'); ?></th>
+								<th class="col_slots"><?php echo __('Slots', 'wpsg'); ?></th>
+								<th class="col_state"><?php echo __('Status', 'wpsg'); ?></th>
+							</tr>
+						</thead>
+						<tbody v-for="(t, i) of data.items">
+							<tr>
+								<td class="col_date">{{t.label}}</td>
+								<td class="col_order"></td>
+								<td class="col_slots">
+									{{t.slots_used}} / {{t.slots}}
+								</td>
+								<td class="col_state">
+									<div class="inner">
+										
+										<span v-if="t.state === 1" class="active"><?php echo __('aktiv', 'wpsg'); ?></span>
+										<span v-else-if="t.state === 2" class="inactive"><?php echo __('inaktiv', 'wpsg'); ?></span>
+									 
+										<span> / </span>
+										
+										<span v-if="t.booking_state === 1" class="text-green"><?php echo __('buchbar', 'wpsg'); ?></span>
+										<span v-else-if="t.booking_state === 2" class="text-red">
+											<span v-if="t.slots_used >= t.slots_available">
+												<?php echo __('ausgebucht', 'wpsg'); ?>
+											</span>
+											<span v-else>
+												<?php echo __('ausgelaufen', 'wpsg'); ?>
+											</span>
+										</span>
+										
+									</div>
+								</td>
+							</tr>
+							<tr>
+								<td class="col_action">
+									<div class="inner">
+										<a href="#" @click.prevent="changeTerminState(t)">
+											<span v-if="t.state === 1"><?php echo __('deaktivieren', 'wpsg'); ?></span>
+											<span v-else-if="t.state === 2"><?php echo __('aktivieren', 'wpsg'); ?></span>
+										</a>
+										<span> | </span>
+										<a href="#" @click.prevent="deleteTicket(t)"><?php echo __('lÃ¶schen', 'wpsg'); ?></a>
+									</div>
+								</td>
+								<td class="col_order" colspan="2">
+									<template v-if="t.order.length > 10">
+										{{t.order.length}} Bestellungen
+									</template>
+									<span v-else class="flex flex-wrap gap-4">
+										<span v-for="(o, i2) of t.order"><a :href="o.order_link">{{o.order_nr}}</a> ({{o.amount}})</span>
+									</span>
+								</td>
+								<td>
+									<template v-if="t.autoticket_id > 0">
+										<a title="<?php echo __('Termine dieses Serientermins anzeigen', 'wpsg'); ?>" href="#" @click.prevent="display_autoTermin(t.autoticket_id)"><?php echo __('Serientermin'); ?> #{{t.autoticket_id}}</a>
+									</template>
+								</td>
+							</tr>
+						</tbody>
+					</table>
+					
+				</div>
+			</div>
+			<div v-if="tab === 2" class="ticket_serial ticket_list">
+				<div class="head">
+					<div class="tablenav">
+						<div></div>
+						<span class="tablenav-pages" v-if="data_serial.pager.count > 0">
+							<span class="displaying-num">{{data_serial.pager.count}} Serientermine</span>
+							<span class="pagination-links">
+								<a href="#" @click.prevent="goSerialPage(1)" class="tablenav-pages-navspan button" :class="{'disabled': data_serial.pager.page <= 1}">Â«</a>
+								<a href="#" @click.prevent="goSerialPage(data_serial.pager.page - 1)" class="tablenav-pages-navspan button" :class="{'disabled': data_serial.pager.page <= 1}">â¹</a>
+								<span class="paging-input">
+									<span class="tablenav-paging-text">
+										<span class="total-pages">{{data_serial.pager.page}}</span>
+										&nbsp;von&nbsp;
+										<span class="total-pages">{{data_serial.pager.pages}}</span>
+									</span>
+								</span>
+								<a href="#" @click.prevent="goSerialPage(data_serial.pager.page + 1)" class="next-page button" :class="{'disabled': data_serial.pager.page >= data_serial.pager.pages}">âº</a>
+								<a href="#" @click.prevent="goSerialPage(data_serial.pager.pages)" class="last-page button" :class="{'disabled': data_serial.pager.page >= data_serial.pager.pages}">Â»</a>
+							</span>
+						</span>
+					</div>
+				</div>
+				<div class="content" v-if="data_serial.items.length > 0">
+				 
+					<table>
+						<thead>
+							<tr>
+								<th class="col_date"><?php echo __('Datum', 'wpsg'); ?></th>
+								<th class="col_tickets"><?php echo __('Termine', 'wpsg'); ?></th>
+								<th class="col_state"><?php echo __('Status', 'wpsg'); ?></th>
+							</tr>
+						</thead>
+						<tbody v-for="(t, i) of data_serial.items">
+							<tr>
+								<td class="col_date">
+									<a href="#" title="<?php echo __('Termine dieses Serientermins anzeigen', 'wpsg'); ?>" @click.prevent="display_autoTermin(t.id)">{{t.label}}</a>
+								</td>
+								<td class="col_tickets">{{t.count_tickets}}</td>
+								<td class="col_state">
+									<div class="inner">
+										
+										<span v-if="t.state === 1" class="active"><?php echo __('aktiv', 'wpsg'); ?></span>
+										<span v-else-if="t.state === 2" class="inactive"><?php echo __('inaktiv', 'wpsg'); ?></span>
+										
+									</div>
+								</td>
+							</tr>
+							<tr>
+								<td class="col_action">
+									<div class="inner">
+										<a href="#" @click.prevent="editTicket(t)">
+											<?php echo __('bearbeiten', 'wpsg'); ?>
+										</a>
+										<span> | </span>
+										<a href="#" @click.prevent="changeTerminState(t)">
+											<span v-if="t.state === 1"><?php echo __('deaktivieren', 'wpsg'); ?></span>
+											<span v-else-if="t.state === 2"><?php echo __('aktivieren', 'wpsg'); ?></span>
+										</a>
+										<span> | </span>
+										<a href="#" @click.prevent="deleteTicket(t)"><?php echo __('lÃ¶schen', 'wpsg'); ?></a>
+									</div>
+								</td>
+								<td class="col_order" colspan="2">
+									<template v-if="t.order.length > 10">
+										{{t.order.length}} Bestellungen
+									</template>
+									<span v-else class="flex flex-wrap gap-4">
+										<span v-for="(o, i2) of t.order"><a :href="o.order_link">{{o.order_nr}}</a> ({{o.amount}})</span>
+									</span>
+								</td>
+							</tr>
+						</tbody>
+					</table>
+					
+				</div>
+			</div>
+			<div v-if="tab === 3" class="ticket_cal relative">
+				<div class="flex">
+					<div id="calendar" ref="ref_calendar"></div>
+					<div v-if="arOccupancy && day_selected" class="occupancy_view">
+						
+						<template v-for="(t, i) of arOccupancy[day_selected].arTicket">
+							
+							<h3>
+								<span><?php echo __('Ticket', 'wpsg'); ?> #{{t.id}} {{t.label}}</span>
+								<span>{{t.slots}} <?php echo __('Slots', 'wpsg'); ?></span>
+							</h3>
+							
+							<ul>
+								<template v-for="(o, j) of t.order">
+									<li>
+										<a :href="o.order_link"><?php echo __('Bestellung', 'wpsg'); ?> {{o.order_nr}} / {{o.order_invoice_name}}</a>
+										<span>{{o.amount}} <?php echo __('Slots', 'wpsg'); ?></span>
+									</li>
+								</template>
+							</ul>
+							
+						</template>
+						
+					</div>
+				</div>
+				<div v-if="cal_loading" class="loading_layer">
+					<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />
+				</div>
+			</div>
+		</div>
+		
+		<div class="dialog" v-if="dialog_add">
+			<form class="inner" @submit.stop.prevent="dialog_submit">
+				<div class="head">
+					<span><?php echo __('Neue Termine', 'wpsg'); ?></span>
+					<a href="#" @click.prevent="closeDialog">X</a>
+				</div>
+				<div class="content">
+					<div class="form_col">
+						<div class="form_field">
+							<label>
+								<?php echo __('Start', 'wpsg'); ?>
+							</label>
+							<div class="flex gap-2 items-center">
+								<input type="date" v-model="dialog_add.from_date" required="required" />
+								<input type="time" v-model="dialog_add.from_time" />
+							</div>
+						</div>
+						<div class="form_field">
+							<label>
+								<?php echo __('Ende', 'wpsg'); ?>
+							</label>
+							<div class="flex gap-2 items-center">
+								<input type="date" v-model="dialog_add.to_date" />
+								<input type="time" v-model="dialog_add.to_time" />
+							</div>
+						</div>
+						<div class="form_field">
+							<label>
+								<?php echo __('Anzahl Slots', 'wpsg'); ?>
+							</label>
+							<div class="flex gap-2 items-center">
+								<input type="number" min="1" max="100" v-model="dialog_add.slots" />
+							</div>
+						</div>
+						<p style="max-width:500px; padding-top:1rem;">
+							<?php echo __('Ein Termin kann so oft gebucht/bestellt werden wie freie Slots verfÃŒgbar sind und er in der Zukunft liegt. Ein Termin kann ÃŒber mehrere Tage gehen, dann wird der gesammte Zeitraum gebucht. Wird eine Startzeit angegeben, muss auch eine Endzeit angegeben werden', 'wpsg'); ?>
+						</p>
+					</div>
+				</div>
+				<div class="foot">
+					<input type="submit" class="button button-primary" value="<?php echo __('Termin anlegen', 'wpsg'); ?>" />
+				</div>
+			</form>
+		</div>
+		
+		<div class="dialog" v-if="serial">
+			<form class="inner" @submit.stop.prevent="submitSerial">
+				<div class="head">
+					<span v-if="serial.id > 0"><?php echo __('Serientermin bearbeiten', 'wpsg'); ?></span>
+					<span v-else><?php echo __('Neuen Serientermin definieren', 'wpsg'); ?></span>
+					<a href="#" @click.prevent="closeSerialDialog">X</a>
+				</div>
+				<div class="content">
+					<div class="form_col">
+						<div class="form_field">
+							<label><?php echo __('Bezeichnung (optional)', 'wpsg'); ?></label>
+							<div>
+								<input type="text"  v-model="serial.label" style="width:275px;" />
+							</div>
+						</div>
+						<div class="form_field">
+							<label><?php echo __('Kurztext (Kalender)', 'wpsg'); ?></label>
+							<div>
+								<input type="text"  v-model="serial.label_short" style="width:275px;" />
+							</div>
+						</div>
+						<div class="form_field">
+							<label>
+								<?php echo __('Zeitraum', 'wpsg'); ?>
+							</label>
+							<div class="flex gap-2 items-center justify-between grow">
+								<input type="date" v-model="serial.from_date" required style="width:125px;"  />
+								<span>-</span>
+								<input type="date" v-model="serial.to_date" required style="width:125px;" />
+							</div>
+						</div>
+						<div class="form_field">
+							<label>
+								<?php echo __('Uhrzeit (optional)', 'wpsg'); ?>
+							</label>
+							<div class="flex gap-2 items-center justify-between grow">
+								<input type="time" v-model="serial.event_data.from_time" style="width:125px;" />
+								<span>-</span>
+								<input type="time" v-model="serial.event_data.to_time" style="width:125px;" />
+							</div>
+						</div>
+						<div class="form_field">
+							<label>
+								<?php echo __('Slots', 'wpsg'); ?>
+							</label>
+							<div class="flex gap-2 items-center">
+								<input type="number" v-model.number="serial.event_data.slots" style="width:275px;" />
+							</div>
+						</div>
+						<div class="form_field">
+							<label>
+								<?php echo __('Tage im voraus planen', 'wpsg'); ?>
+							</label>
+							<div class="flex gap-2 items-center">
+								<select v-model.number="serial.days_future" class="w-full" style="width:275px;">
+									<option value="30">30</option>
+									<option value="60">60</option>
+									<option value="90">90</option>
+								</select>
+							</div>
+						</div>
+						<div class="form_field">
+							<label>
+								<?php echo __('Wochentage', 'wpsg'); ?>
+							</label>
+							<div class="weekday_wrap">
+								<label v-for="i in 7">
+									<div>
+										<template v-if="i === 1">Mo</template>
+										<template v-if="i === 2">Die</template>
+										<template v-if="i === 3">Mi</template>
+										<template v-if="i === 4">Do</template>
+										<template v-if="i === 5">Fr</template>
+										<template v-if="i === 6">Sa</template>
+										<template v-if="i === 7">So</template>
+									</div>
+									<div>
+										<input type="checkbox" @change="setWeekDay($event, i - 1)" :checked="serial.days.includes(i - 1)" />
+									</div>
+								</label>
+							</div>
+						</div>
+						<div v-if="serial.id > 0">
+							<br />
+							<?php echo __('Eine Bearbeitung des Serientermins wirkt sich nur auf', 'wpsg'); ?><br />
+							<?php echo __('zukÃŒnftige Termine dieses Serientermins aus.', 'wpsg'); ?>
+						</div>
+					</div>
+				</div>
+				<div class="foot">
+					<input v-if="serial.id > 0" type="submit" class="button button-primary" value="<?php echo __('Serientermin speichen', 'wpsg'); ?>" />
+					<input v-else type="submit" class="button button-primary" value="<?php echo __('Serientermin + Termine anlegen', 'wpsg'); ?>" />
+				</div>
+			</form>
+		</div>
+		
+		<div v-if="loading" class="loading_layer">
+			<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />
+		</div>
+		
+	</template>
+</div>
+
+<style>
+	
+	#wpsg_ticket_product .occupancy_view { padding-left:2rem; flex-grow:1;
+		h3 { padding:0; display:flex; justify-content:space-between; align-items:flex-start; margin:1.5rem 0 1rem 0;
+			* { font-size:14px; font-weight:bold; line-height:1.5rem; }
+		}
+		ul { padding-left:1.5rem; font-size:14px;
+			li { list-style:disc; display:flex; align-items:flex-start; justify-content:space-between; position:relative;
+				&:before { content:'-'; position:absolute; margin-left:-1rem; }
+			}
+        }
+		pre { white-space:break-spaces; }
+	}
+	#wpsg_ticket_product .flex { display:flex; }
+	#wpsg_ticket_product .items-center { align-items:center; }
+	#wpsg_ticket_product .justify-between { justify-content:space-between; }
+	#wpsg_ticket_product .grow { flex-grow:1; }
+	#wpsg_ticket_product .pr-4 { padding-right:1rem; }
+	#wpsg_ticket_product label { margin-bottom:0; }
+	#wpsg_ticket_product .dialog { position:fixed; left:0; top:0; height:100dvh; width:100dvw; background-color:rgba(0, 0, 0, 0.75); z-index:99999; display:flex; justify-content:center; align-items:center; }
+	#wpsg_ticket_product .dialog > .inner { background-color:white; border:1px solid black; min-width:500px; min-height:275px; display:flex; flex-direction:column; }
+	#wpsg_ticket_product .dialog > .inner > .head { padding:1rem 2rem; border-bottom:1px solid black; font-weight:bold; font-size:1em; display:flex; align-items:center; justify-content:space-between; }
+	#wpsg_ticket_product .dialog > .inner > .head a { color:black; font-weight:bold; font-size:1.5em; }
+	#wpsg_ticket_product .dialog > .inner > .head a:hover { text-decoration:none !important; }
+	#wpsg_ticket_product .dialog > .inner > .content { padding:1rem 2rem; flex-grow:1; }
+	#wpsg_ticket_product .dialog > .inner > .foot { padding:1rem 2rem; }
+	#wpsg_ticket_product .dialog > .inner .form_field { display:flex; align-items:center; justify-content:flex-start; }
+	#wpsg_ticket_product .dialog > .inner .form_field label { width:200px; }
+	#wpsg_ticket_product .dialog > .inner .form_col { display:flex; flex-direction:column; gap:0.5rem; }
+	#wpsg_ticket_product .ticket_list { display:flex; flex-direction:column; }
+	#wpsg_ticket_product .ticket_list .head .tablenav { display:flex; justify-content:space-between; align-items:center; padding-top:0;}
+	#wpsg_ticket_product .ticket_list .head .tablenav label { display:flex; justify-content:flex-start; align-items:center; gap:0.5rem; font-weight:normal; }
+	#wpsg_ticket_product .ticket_list .head .tablenav label input { margin:0; }
+	#wpsg_ticket_product .ticket_list .head .tablenav-pages { display:flex; align-items:center; justify-content:flex-start; margin:0; }
+	#wpsg_ticket_product .ticket_list .head .pagination-links { display:flex; align-items:center; justify-content:flex-start; gap:0.5rem; }
+	#wpsg_ticket_product .ticket_list .content { border:1px solid #c3c4c7; padding:0; }
+	#wpsg_ticket_product .ticket_list .content table { width:100%; }
+	#wpsg_ticket_product .ticket_list .content table thead tr th { border-bottom:1px solid #c3c4c7; }
+	#wpsg_ticket_product .ticket_list .content table > * > tr > * { padding:3px 5px 0px 5px; text-align:center; }
+	#wpsg_ticket_product .ticket_list .content table > * > tr > *:first-child { text-align:left; }
+	#wpsg_ticket_product .ticket_list .content table > * > tr > *:last-child { text-align:right; }
+	#wpsg_ticket_product .ticket_list .content table > * > tr > .col_action { padding-top:0; padding-bottom:3px; }
+	#wpsg_ticket_product .ticket_list .content table > * > tr > .col_action > .inner { display:flex; gap:0.5rem; justify-content:flex-start; align-items:center; flex-wrap:wrap; }
+    #wpsg_ticket_product .ticket_list .content table > * > tr > .col_date { width:250px; }
+	#wpsg_ticket_product .ticket_list .content table > * > tr > .col_order { text-align:left; padding-bottom:3px; }
+	#wpsg_ticket_product .ticket_list .content table > * > tr > .col_state .inner { display:flex; justify-content:flex-end; align-items:center; gap:0.5rem; }
+    #wpsg_ticket_product .ticket_list .content table > *:nth-child(even) > tr > * { background-color:#f6f7f7; }
+	#wpsg_ticket_product .ticket_list .content table .inactive,
+	#wpsg_ticket_product .text-red { color:red; }
+	#wpsg_ticket_product .ticket_list .content table .active,
+	#wpsg_ticket_product .text-green { color:green; }
+	#wpsg_ticket_product .flex { display:flex; }
+	#wpsg_ticket_product .grow { flex-grow:1; }
+	#wpsg_ticket_product .flex-wrap { flex-wrap:wrap; }
+	#wpsg_ticket_product .gap-2 { gap:0.5rem; }
+	#wpsg_ticket_product .gap-4 { gap:1rem; }
+	#wpsg_ticket_product .relative { position:relative; }
+	#wpsg_ticket_product { position:relative; padding:1rem 0; }
+	#wpsg_ticket_product .loading_layer { position:absolute; left:0; top:0; width:100%; height:100%; transition:all 0.1s; display:flex; align-items:center; justify-content:center; background-color:rgba(255, 255, 255, 0.75); }
+	#wpsg_ticket_product .ticket_cal { all:initial !important; font-family:'Arial' !important; }
+	#wpsg_ticket_product .ticket_cal * { font-family:'Arial' !important; }
+	#wpsg_ticket_product .ticket_cal .vanilla-calendar-week__day { font-size:12px !important; }
+	#wpsg_ticket_product .vanilla-calendar-month,
+	#wpsg_ticket_product .vanilla-calendar-year { font-size:14px !important; font-family:'Arial' !important; }
+	#wpsg_ticket_product .vanilla-calendar-days { column-gap:15px; }
+	#wpsg_ticket_product .vanilla-calendar-days { row-gap:0.5rem; }
+	#wpsg_ticket_product .vanilla-calendar-day__btn { font-size:1rem; }
+    #wpsg_ticket_product .vanilla-calendar-day__btn:not(.vanilla-calendar-day__btn_disabled) { background-color:#fde047; color:black; }
+	#wpsg_ticket_product .vanilla-calendar-day__btn.full { background-color:green; color:white; }
+	#wpsg_ticket_product .weekday_wrap { display:flex; flex-grow:1; justify-content:space-between; align-items:flex-start; }
+	#wpsg_ticket_product .weekday_wrap > label { display:flex; flex-direction:column; gap:0.125rem; width:initial !important; margin-bottom:0 !important;  }
+	
+</style>
+
+<script>
+	
+	const el_ticket_product = document.getElementById('metaticket_product');
+	const el_wpsg_ticket_product = document.getElementById('wpsg_ticket_product');
+	const el_basket_multiple = document.getElementById('basket_multiple');
+	
+	el_ticket_product.addEventListener('change', (event) => {
+ 
+		if (event.target.checked) {
+
+			el_basket_multiple.disabled = true;
+			el_basket_multiple.selectedIndex = 2;
+			wpsg_ticket_product.style.display = 'block';
+		
+		} else {
+			
+			el_basket_multiple.disabled = false;
+			wpsg_ticket_product.style.display = 'none';
+			
+		}
+		
+	});
+	
+	el_ticket_product.dispatchEvent(new Event('change'));
+	
+</script>
+
+<?php
+	
+	\wpsg_drawForm_AdminboxEnd();
Index: /views/mods/mod_ticket/produkttemplate.phtml
===================================================================
--- /views/mods/mod_ticket/produkttemplate.phtml	(revision 8427)
+++ /views/mods/mod_ticket/produkttemplate.phtml	(revision 8427)
@@ -0,0 +1,255 @@
+<?php
+	
+	declare(strict_types=1);
+	
+	/**
+	 * @author: Daniel Schmitzer (daniel@maennchen1.de)
+	 * @date: 21.10.23
+	 * @time: 15:42
+	 */
+	
+	namespace wpsgTicket;
+ 
+	/** @var \wpsg_product $oProduct */
+	$oProduct = $this->view['oProduct'];
+	
+	$product_key = $this->view['data']['product_key'];
+	
+	/** @var TicketProduct $oTicketProduct */
+	$oTicketProduct = TicketProduct::getInstance($oProduct->getId());
+	
+	TicketProduct::$enqueTicket = true;
+	
+	$arTicket = $oTicketProduct->getAvailableTickets();
+	
+	if (sizeof($arTicket) <= 0) { wpsg_debug(__('Keine Tickets verfÃŒgbar', 'wpsg')); return; }
+	
+	$arProductVars = false;
+	
+	if ($this->hasMod('wpsg_mod_productvars')) {
+		
+		$arProductVars = array_values($this->callMod('wpsg_mod_productvars', 'getAllProductVars', [$oTicketProduct->getProductId()]));
+		foreach ($arProductVars as $k => $v) $arProductVars[$k]['value'] = '';
+		
+	}
+	
+	$json_data = [
+		'template_index' => $this->getTemplateIndex(),
+		'ajax_url' => \admin_url('admin-ajax.php'),
+		'product_id' => $oProduct->getId(),
+		'product_key' => $product_key,
+		'price' => $oProduct->getPrice($product_key, \wpsg_ShopController::getShop()->getFrontendTaxview()),
+		'product_vars' => $arProductVars
+	];
+ 
+	if ($this->hasMod('wpsg_mod_productvariants')) {
+ 
+		if ($this->callMod('wpsg_mod_productvariants', 'isVariantsProductKey', [$product_key])) {
+		
+			$product_id = $this->getProduktID($product_key);
+			$json_data['vp_data'] = $this->callMod('wpsg_mod_productvariants', 'getVariants', [$product_id, true, true, true]);
+			$json_data['vp_info'] = $this->callMod('wpsg_mod_productvariants', 'getVariantenInfoArray', [$product_key]);
+			
+			foreach ($json_data['vp_data'] as $k => $v) {
+				
+				foreach ($v['arVariation'] as $k2 => $v2) {
+				
+					$simulated_product_key = $this->callMod('wpsg_mod_productvariants', 'getSimulatedVariKey', array($this->view['data']['product_key'], $v['id'], $v2['variation_id']));
+					$attachmentID = $this->imagehandler->getAttachmentID($simulated_product_key);
+					$json_data['vp_data'][$k]['arVariation'][$k2]['img'] = \wp_get_attachment_image($attachmentID, 'thumbnail');
+					
+				}
+				
+			}
+			
+		}
+	
+	}
+	
+?>
+
+<div class="wpsg_ticket_product">
+	<div style="display:none;" class="json_data"><?php echo base64_encode(json_encode($json_data)); ?></div>
+	<template v-if="mounted">
+
+		<div v-if="layer_msg" class="layer_msg">
+			<div class="inner">
+				<div class="msg">{{layer_msg}}</div>
+				<div class="button_wrap">
+					<a class="wp-element-button" href="#" @click.prevent="layer_msg = undefined;"><?php echo __('OK', 'wpsg'); ?></a>
+					<a class="wp-element-button" href="<?php echo \wpsg_ShopController::getShop()->getURL(\wpsg_ShopController::URL_BASKET); ?>"><?php echo __('Zum Warenkorb', 'wpsg'); ?></a>
+				</div>
+			</div>
+		</div>
+		
+		<div class="wpsg_produkt wpsg_product_name">
+	
+			<?php if (!$this->titleDisplayed) { ?>
+				<h1 class="wpsg_producttitle"><?php echo $oProduct->getProductName(); ?></h1>
+				<h2 class="wpsg_productdetailtitle"><?php echo $this->view['data']['detailname']; ?></h2>
+			<?php }  ?>
+	
+			<?php $this->callMods('product_top_afterheadline', array(&$this->view['data']['id'], $this->getTemplateIndex())); ?>
+	
+		</div>
+		
+		<?php $this->callMods('product_top', array(&$this->view['data']['id'], $this->getTemplateIndex())); ?>
+		
+		<?php /* Block fÃŒr die Produktbilder START */ ?>
+		<?php
+		
+			/* Das ist das primÃ€re Anzeigebild des Produktes (AttachmentID) */
+			$arAttachmentID = $this->imagehandler->getAttachmentID($this->view['data']['product_key']);
+	
+			/* Array mit allen AttachmentIDs der Produktbilder */
+			$arAttachmentIDsAll = $this->imagehandler->getAttachmentIDs($this->view['data']['product_id']);
+	
+		?>
+		
+		<div class="product_top">
+			<?php if (sizeof($arAttachmentIDsAll) > 0) { ?>
+			<div class="wpsg_productimages">
+		
+				<div class="wpsg_produkt_produktbilder">
+		
+					<?php if (sizeof($arAttachmentIDsAll) > 0) { for ($i = 0; $i < sizeof($arAttachmentIDsAll); $i ++) { ?>
+		
+						<?php /* URL fÃŒr die Lightbox */ ?>
+						<?php $att = \wp_get_attachment_image_src($arAttachmentIDsAll[$i], array(800, 600), false); ?>
+		
+						<meta itemprop="image" content="<?php echo $att[0]; ?>" />
+		
+						<a <?php if ($arAttachmentIDsAll[$i] != $arAttachmentID) echo 'style="display:none;"'; ?> data-fslightbox="<?php echo $this->getTemplateIndex(); ?>" title="<?php echo $oProduct->getProductName(); ?>" href="<?php echo $att[0]; ?>">
+		
+							<?php echo \wp_get_attachment_image($arAttachmentIDsAll[$i], array(600, 600), false, array()); ?>
+							
+						</a>
+						
+					<?php } } ?>
+		
+				</div>
+		
+			</div>
+			<?php } ?>
+			<?php /* Block fÃŒr die Produktbilder ENDE */ ?>
+			<div class="product_top_content">
+
+				<?php if (strlen(trim($this->view['data']['beschreibung'])) > 0) { ?>
+				<div class="wpsg_product_information_short">
+					<div class="wpsg_produkt_additional_information">
+						<div itemprop="description" class="wpsg_produkt_shortdescription">
+							<span><?php echo $this->view['data']['beschreibung']; ?></span>
+						</div>
+					</div>
+				</div>
+				<?php } ?>
+				
+			</div>
+		</div>
+		
+		<?php if (strlen(trim($this->view['data']['longdescription'])) > 0) { ?>
+		<div class="wpsg_product_information_long">
+			<span><?php echo $this->view['data']['longdescription']; ?></span>
+		</div>
+		<?php } ?>
+		
+		<div class="calendar_wrap">
+			<div ref="ref_calendar"></div>
+		</div>
+		
+		<div v-if="data.product_vars" class="variant_wrap">
+			<template v-for="(pv, i) of data.product_vars">
+				<div class="variant_row">
+					<span>{{pv.name}}</span>
+					<span>
+						<template v-if="pv.typ === '1'"><!-- Auswahl -->
+							<select v-model="pv.value" :required="pv.pflicht === '1'" :name="'wpsg_mod_productvars[' + pv.id + ']'">
+								<option value=""><?php echo __('Bitte auswÃ€hlen', 'wpsg'); ?></option>
+								<option v-for="(option, i) of pv.auswahl.split('|')" :value="option">
+									{{option}}
+								</option>
+							</select>
+						</template>
+						<template v-else-if="pv.typ === '2'"><!-- Textzeile -->
+							<input type="text" v-model="pv.value" :required="pv.pflicht === '1'" :name="'wpsg_mod_productvars[' + pv.id + ']'" />
+						</template>
+						<template v-else-if="pv.typ === '4'"><!-- Textfeld -->
+							<textarea v-model="pv.value" :required="pv.pflicht === '1'" :name="'wpsg_mod_productvars[' + pv.id + ']'"></textarea>
+						</template>
+						<template v-else-if="pv.typ === '3'"><!-- Checkbox -->
+							<input type="checkbox" value="1" v-model="pv.value" :required="pv.pflicht === '1'" :name="'wpsg_mod_productvars[' + pv.id + ']'" />
+						</template>
+					</span>
+				</div>
+			</template>
+		</div>
+		
+		<div v-if="data.vp_data" class="variant_wrap">
+			<template v-for="(vp, i) of data.vp_data">
+				<div v-if="(vp.deleted + vp.count_variation) !== 1"  class="variant_row">
+					<span>{{vp.name}}</span>
+					<span>
+						<select v-if="vp.type == '<?php echo \wpsg_mod_productvariants::TYPE_SELECT; ?>'" @change="setVari(vp.id, $event.target.value)">
+							<template v-for="(o, j) of vp.arVariation">
+								<option v-if="o.active" :value="o.variation_id" :checked="((data.vp_info[vp.id]['vari_id'] === o.id)?'checked':'')">
+									{{o.name}} <?php if ($this->get_option('wpsg_mod_productvariants_price') === '1') { ?>(+ {{ff(o.price)}} <?php echo $this->get_option('wpsg_currency'); ?>)<?php } ?>
+								</option>
+							</template>
+						</select>
+						<div v-else-if="vp.type == '<?php echo \wpsg_mod_productvariants::TYPE_RADIO; ?>'" class="radio_wrap">
+							<template v-for="(o, j) of vp.arVariation">
+								<label class="radio" v-if="o.active">
+									
+									<input type="radio" :value="o.variation_id" :name="vp.id + 'radio'" v-if="data.vp_info[vp.id]['vari_id'] === o.id" checked="checked" />
+									<input v-else type="radio" :value="o.id" :name="vp.id + 'radio'" @change.prevent="setVari(vp.id, o.id)" />
+									
+									<span>{{o.name}} <?php if ($this->get_option('wpsg_mod_productvariants_price') === '1') { ?>(+ {{ff(o.price)}} <?php echo $this->get_option('wpsg_currency'); ?>)<?php } ?></span>
+								</label>
+							</template>
+						</div>
+						<div v-else-if="vp.type == '<?php echo \wpsg_mod_productvariants::TYPE_IMAGE; ?>'" class="image_wrap">
+							<template v-for="(o, j) of vp.arVariation">
+								<div class="image" v-if="o.active" :class="{'act': o.set}" @click="setVari(vp.id, o.variation_id)">
+									<div v-html="o.img"></div>
+								</div>
+							</template>
+						</div>
+					</span>
+				</div>
+			</template>
+		</div>
+		
+		<div class="no_event" v-if="ticket === undefined">
+			<?php echo __('Bitte einen Termin im Kalender wÃ€hlen.', 'wpsg'); ?>
+		</div>
+		<template v-else>
+		 
+			<div class="mt-8 flex justify-between items-center">
+				<div>
+					<strong><?php echo __('AusgewÃ€hlter Termin: ', 'wpsg'); ?></strong>{{ticket.label}}
+				</div>
+				<div>
+					<?php if ($this->view['oProduct']->canDisplayPrice()) { ?>
+						<span class="price">{{ff(data.price)}} <?php echo $this->get_option('wpsg_currency'); ?></span>
+					<?php } ?>
+				</div>
+			</div>
+			
+			<div class="ticket_selection">
+				<span>
+					<input v-if="ticket.slots !== 1" type="number" min="1" :max="ticket.slots" v-model="ticket.amount" />
+				</span>
+				
+				<button type="submit" class="wp-element-button" :class="computedButtonClass">
+					{{computedButtonText}}
+				</button>
+			</div>
+			
+		</template>
+		
+		<div v-if="loading" class="loading_layer">
+			<!--<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />-->
+		</div>
+		
+	</template>
+</div>
Index: /views/mods/mod_ticket/qrScanner.phtml
===================================================================
--- /views/mods/mod_ticket/qrScanner.phtml	(revision 8427)
+++ /views/mods/mod_ticket/qrScanner.phtml	(revision 8427)
@@ -0,0 +1,221 @@
+<?php
+	
+	declare(strict_types=1);
+	
+	/**
+	 * @author: Daniel Schmitzer (daniel@maennchen1.de)
+	 * @date: 13.11.23
+	 * @time: 19:11
+	 */
+	
+	namespace wpsgTicket;
+	
+?>
+
+<div id="qr_scanner_app" style="display:none; padding-right:2rem; padding-top:2rem; max-height:400px;">
+	
+	<div id="reader" style="width:500px;"></div>
+	
+	<div id="ticket_dialog" v-if="ticket_dialog">
+		<div class="inner">
+			
+			<div v-if="ticket_dialog.loading" class="loading_layer">
+				<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />
+			</div>
+			
+			<div class="head">
+				<div class="flex justify-between items-center">
+					<div class="flex items-center justify-start">
+						TicketBuchung #{{ticket_dialog.booking_id}}
+						<div class="button_wrap">
+							<a @click="ticket_dialog.tab = 1" :class="{'active': ticket_dialog.tab === 1}"><?php echo __('Informationen', 'wpsg'); ?></a>
+							<a @click="ticket_dialog.tab = 2" :class="{'active': ticket_dialog.tab === 2}"><?php echo __('Protokoll', 'wpsg'); ?></a>
+							<a :href="ticket_dialog.urls.pdf" target="_blank"><?php echo __('PDF', 'wpsg'); ?></a>
+							<!--<a @click="ticket_dialog.tab = 3" :class="{'active': ticket_dialog.tab === 3}"><?php echo __('RAW', 'wpsg'); ?></a>-->
+						</div>
+					</div>
+					<div class="flex flex-items-center justify-end">
+						<div :class="'state ' + 'state' + ticket_dialog.state_code">
+							{{ticket_dialog.state_label}}
+						</div>
+						<a @click.prevent="hideDialg">X</a>
+					</div>
+				</div>
+			</div>
+			<div class="content">
+				<template v-if="ticket_dialog.tab === 1">
+					<div class="grid-cols-2 grid">
+						<div>
+							<div class="form_row">
+								<div class="form_label"><?php echo __('Ticket-Produkt', 'wpsg'); ?></div>
+								<div class="form_value">
+									<a :href="ticket_dialog.urls.product_edit">{{ticket_dialog.ticket_product_label}}</a>
+								</div>
+							</div>
+							<div class="form_row">
+								<div class="form_label"><?php echo __('Datum/Zeitraum', 'wpsg'); ?></div>
+								<div class="form_value" :class="{'text-red': ticket_dialog.time_raised}">{{ticket_dialog.ticket_data.label}}</div>
+							</div>
+							<div class="form_row">
+								<div class="form_label"><?php echo __('Kaufpreis', 'wpsg'); ?></div>
+								<div class="form_value">{{ticket_dialog.order_product_price_ff}}</div>
+							</div>
+						</div>
+						<div>
+							<div class="form_row">
+								<div class="form_label"><?php echo __('Bestellnummer', 'wpsg'); ?></div>
+								<div class="form_value">
+									<a :href="ticket_dialog.urls.order_edit">{{ticket_dialog.order_nr}}</a>
+								</div>
+							</div>
+							<div class="form_row">
+								<div class="form_label"><?php echo __('Bestellstatus', 'wpsg'); ?></div>
+								<div class="form_value" :class="{
+									'text-red': !ticket_dialog.wpsg_mod_ticket_orderstate_active.includes(ticket_dialog.order_state),
+									'text-green': ticket_dialog.wpsg_mod_ticket_orderstate_active.includes(ticket_dialog.order_state)
+								}">{{ticket_dialog.order_state_label}}</div>
+							</div>
+							<div class="form_row">
+								<div class="form_label"><?php echo __('KÃ€ufer', 'wpsg'); ?></div>
+								<div class="form_value">{{ticket_dialog.order_title}} {{ticket_dialog.order_firstname}} {{ticket_dialog.order_lastname}}</div>
+							</div>
+						</div>
+					</div>
+					<br />
+					<div class="form_row form_row_1_4">
+						<div class="form_label"><?php echo __('Ticket-Status', 'wpsg'); ?></div>
+						<div class="form_value">
+							<span class="text-red" v-if="ticket_dialog.state_code === <?php echo TicketBooking::STATUS_UNAVAILABLE; ?>">
+								{{ticket_dialog.revoke_text}}
+							</span>
+							<span class="text-green" v-if="ticket_dialog.state_code === <?php echo TicketBooking::STATUS_AVAILABLE; ?>">
+								<?php echo __('GÃŒltig', 'wpsg'); ?>
+							</span>
+						</div>
+					</div>
+					<br />
+					<div v-if="ticket_dialog.sibling.length > 0">
+						<strong><?php echo __('Zusammengkaufte Tickets', 'wpsg'); ?> ({{ticket_dialog.sibling.length}} StÃŒck)</strong>
+						<table>
+							<thead>
+								<tr>
+									<td><?php echo __('Buchung', 'wpsg'); ?></td>
+									<td><?php echo __('Datum/Zeitraum', 'wpsg'); ?></td>
+									<td class="col_ticket_state"><?php echo __('Ticket-Status', 'wpsg'); ?></td>
+								</tr>
+							</thead>
+							<tbody v-for="(ts, i) of ticket_dialog.sibling">
+								<tr>
+									<td><a @click.prevent="showTicket(ts.booking_id)" href="#">#{{ts.booking_id}}</a> <a :href="ts.urls.pdf" target="_blank">[<?php echo __('PDF', 'wpsg'); ?>]</a></td>
+									<td :class="{'text-red': ticket_dialog.time_raised}">{{ticket_dialog.ticket_data.label}}</td>
+									<td>
+										<span class="text-red" v-if="ts.state_code === <?php echo TicketBooking::STATUS_UNAVAILABLE; ?>">
+											<span v-if="ts.revoked">
+												<?php echo __('Entwertet', 'wpsg'); ?>
+											</span>
+											<template v-else>
+												<span v-if="ts.time_raised" class="text-red"><?php echo __('Ausgelaufen', 'wpsg'); ?></span>
+												<span v-else><?php echo __('UngÃŒltig', 'wpsg'); ?></span>
+											</template>
+										</span>
+										<span class="text-green" v-if="ts.state_code === <?php echo TicketBooking::STATUS_AVAILABLE; ?>">
+											<?php echo __('GÃŒltig', 'wpsg'); ?>
+											[<a v-if="ts.state_code === <?php echo TicketBooking::STATUS_AVAILABLE; ?>" href="#" @click="revokeBooking(ts.booking_id, false)" class="revokeBooking">entwerten</a>]
+										</span>
+									</td>
+								</tr>
+							</tbody>
+						</table>
+					</div>
+				</template>
+				<div v-if="ticket_dialog.tab === 2">
+					<table>
+						<thead>
+							<tr>
+								<th><?php echo __('Datum/Zeit', 'wpsg'); ?></th>
+								<th><?php echo __('Benutzer', 'wpsg'); ?></th>
+								<th><?php echo __('Aktion', 'wpsg'); ?></th>
+							</tr>
+						</thead>
+						<tbody v-for="(l, i) of ticket_dialog.log">
+							<tr>
+								<td class="col_time">{{en_de_date_time(l.date_time)}}</td>
+								<td class="col_user">{{l.user_name}}</td>
+								<td>
+									<span class="text-green" v-if="l.log === <?php echo TicketBooking::LOG_SCAN; ?>"><?php echo __('gescannt', 'wpsg'); ?></span>
+									<span class="text-red" v-else-if="l.log === <?php echo TicketBooking::LOG_REVOKE; ?>"><?php echo __('entwertet', 'wpsg'); ?></span>
+								</td>
+							</tr>
+						</tbody>
+					</table>
+				</div>
+				<div v-if="ticket_dialog.tab === 3">
+					<pre>{{ticket_dialog}}</pre>
+				</div>
+			</div>
+			<div class="foot" v-if="ticket_dialog.state_code === 1">
+				<a href="#" @click="revokeBooking(ticket_dialog.booking_id)" v-if="ticket_dialog.state_code === 1" class="revokeBooking"><?php echo __('Ticket entwerten', 'wpsg'); ?></a>
+			</div>
+		</div>
+	</div>
+	
+</div>
+
+<style>
+	
+	#qr_scanner_app .flex { display:flex; }
+	#qr_scanner_app .grid { display:grid; }
+	#qr_scanner_app .text-red { color:red; }
+	#qr_scanner_app .justify-between { justify-content:space-between; }
+	#qr_scanner_app .justify-start { justify-content:flex-start; }
+	#qr_scanner_app .justify-end { justify-content:flex-end; }
+	#qr_scanner_app .items-center { align-items:center; }
+	#qr_scanner_app .text-green { color:green; }
+	#qr_scanner_app .text-red { color:red; }
+	#qr_scanner_app .grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
+	
+	#ticket_dialog { position:fixed; left:0; top:0; width:100dvw; height:100dvh; display:flex; justify-content:center; align-items:center; z-index:10000; background-color:rgba(255, 255, 255, 0.95); }
+	#ticket_dialog > .inner { background-color:white; border:1px solid #003664; position:relative; }
+	#ticket_dialog > .inner .loading_layer { position:absolute; left:0; top:0; width:100%; height:100%; transition:all 0.1s; display:flex; align-items:center; justify-content:center; background-color:rgba(255, 255, 255, 0.75); }
+	#ticket_dialog > .inner > .head { border-bottom:1px solid #003664; padding:0.5rem 1rem; font-size:1.25em; font-weight:bold; color:white; background-color:#003664; }
+	#ticket_dialog > .inner > .head .button_wrap { font-size:0.75em; margin-left:1.5rem; display:flex; gap:0.5rem; align-items:center; }
+	#ticket_dialog > .inner > .head .button_wrap > a { border:1px solid white; display:block; padding:0.25rem 0.75rem; }
+	#ticket_dialog > .inner > .head .button_wrap > a.active { background-color:white; color:#003664; }
+	#ticket_dialog > .inner > .head .state { font-size:0.75em; border:1px solid white; display:flex; align-items:center; padding:0.25rem 0.75rem; margin-right:1.5rem; }
+	#ticket_dialog > .inner > .head .state2 { background-color:red; }
+	#ticket_dialog > .inner > .head .state1 { background-color:green; }
+    #ticket_dialog > .inner > .head a { color:#FFFFFF; cursor:pointer; }
+    #ticket_dialog > .inner > .head > a:hover { text-decoration:none; }
+    #ticket_dialog > .inner > .head > a { padding:0.5rem; display:inline-block; cursor:pointer; color:#003664; }
+	#ticket_dialog > .inner > .content { padding:1rem; width:50dvw; max-width:calc(100dvw - 60px); height:500px; max-height:calc(100dvh - 60px); overflow:auto; }
+	#ticket_dialog > .inner > .content .form_row { display:flex; padding:0.25rem 0; justify-content:space-between; }
+	#ticket_dialog > .inner > .content .form_row .form_label {  }
+	#ticket_dialog > .inner > .content .form_row .form_value { width:50%; }
+	#ticket_dialog > .inner > .content .form_row_1_4 .form_value { width:75%; }
+	#ticket_dialog > .inner > .content table { width:100%; }
+	#ticket_dialog > .inner > .content table thead > tr > * { background-color:#003664; color:#FFFFFF; padding:0.25rem 0.5rem; }
+	#ticket_dialog > .inner > .content table tbody > tr > * { padding:0.25rem 0.5rem; }
+	#ticket_dialog > .inner > .content table tbody > tr:last-child > * { border-bottom:1px solid #333333; }
+	#ticket_dialog > .inner > .content table tr > *.col_time { width:130px; }
+	#ticket_dialog > .inner > .content table tr > *.col_user { width:250px; }
+	#ticket_dialog > .inner > .foot { border-top:1px solid #003664; padding:0.5rem 1rem; display:flex; justify-content:space-between; align-items:center; }
+	#ticket_dialog > .inner > .foot a { padding:0.25rem 0.75rem; background-color:green; border:1px solid #003664; color:#FFFFFF; }
+	#ticket_dialog .revokeBooking {  }
+	#ticket_dialog .col_ticket_state { width:150px; }
+	
+</style>
+
+<script src="<?php echo WPSG_URL; ?>mods/mod_ticket/assets/js/HTML5QrScannerv2.3.8.js"></script>
+<script type="module">
+	
+	const wpsgSettings = {
+		baseUrl: '<?php echo WPSG_URL; ?>'
+	};
+	
+	import { wpsg_ticket_qrScanner } from '<?php echo WPSG_URL; ?>mods/mod_ticket/assets/js/wpsg_qrscanner.js';
+	
+	wpsg_ticket_qrScanner(wpsgSettings, <?php echo json_encode([
+		'admin_url' => \admin_url('admin-ajax.php')
+	]); ?>);
+	
+</script>
Index: /views/mods/mod_ticket/settings_edit.phtml
===================================================================
--- /views/mods/mod_ticket/settings_edit.phtml	(revision 8427)
+++ /views/mods/mod_ticket/settings_edit.phtml	(revision 8427)
@@ -0,0 +1,159 @@
+<?php
+	
+	declare(strict_types=1);
+	
+	/**
+	 * @author: Daniel Schmitzer (daniel@maennchen1.de)
+	 * @date: 26.10.23
+	 * @time: 18:55
+	 */
+	
+	namespace wpsgTicket;
+	
+	$arTicketTemplates = TicketTemplate::find();
+
+	$arFontVue = [];
+	
+	foreach ($this->view['arFonts'] as $font_code => $font_label) {
+
+	    $arFontVue[] = ['code' => $font_code, 'label' => $font_label];
+
+    }
+	
+?>
+
+<div id="wpsg_ticket_modul">
+	
+	<ul class="nav nav-tabs" role="tablist">
+		<li role="presentation" class="active"><a href="#tab1" role="tab" data-toggle="tab"><?php echo __('Einstellungen', 'wpsg'); ?></a></li>
+		<li role="presentation" class=""><a href="#tab2" role="tab" data-toggle="tab"><?php echo __('Templates', 'wpsg'); ?></a></li>
+		<li role="presentation" style="float:right;"><a href="#tab5" role="tab" data-toggle="tab"><?php echo __('Info / Hilfe', 'wpsg'); ?></a></li>
+	</ul>
+	<div class="tab-content">
+        <div role="tabpanel" class="tab-pane active" id="tab1">
+			
+			<p>
+				<?php echo __('Beim Wechsel einer Bestellung auf einen der folgenden BestellzustÃ€nden wird einmalig eine E-Mail mit den Tickets versendet.', 'wpsg'); ?>
+			</p>
+			
+			<?php
+				
+				$wpsg_mod_ticket_orderstate_send = Plugin::getInstance()->getSendOrderState();
+				
+			?>
+			<select id="wpsg_mod_ticket_orderstate_send" multiple="multiple" size="5" style="border:1px solid black; width:100%;">
+				<?php foreach ($this->arStatus as $status_key => $status_label) { ?>
+				<option
+					<?php echo ((in_array($status_key, $wpsg_mod_ticket_orderstate_send))?'selected="selected"':''); ?>
+					value="<?php echo $status_key; ?>"><?php echo $status_label; ?></option>
+				<?php } ?>
+			</select>
+			
+			<hr />
+			
+			<p>
+				<?php echo __('Bei folgenden BestellzustÃ€nden gilt ein Ticket als "aktiv" sofern es noch nicht entwertet wurde.', 'wpsg'); ?>
+			</p>
+			
+			<?php
+				
+				$wpsg_mod_ticket_orderstate_active = Plugin::getInstance()->getActiveOrderState();
+			?>
+			<select id="wpsg_mod_ticket_orderstate_active" multiple="multiple" size="5" style="border:1px solid black; width:100%;">
+				<?php foreach ($this->arStatus as $status_key => $status_label) { ?>
+				<option
+					<?php echo ((in_array($status_key, $wpsg_mod_ticket_orderstate_active))?'selected="selected"':''); ?>
+					value="<?php echo $status_key; ?>"><?php echo $status_label; ?></option>
+				<?php } ?>
+			</select>
+			
+		</div>
+		<div role="tabpanel" class="tab-pane" id="tab2">
+			<?php echo $this->render(WPSG_PATH_VIEW.'/mods/mod_ticket/settings_edit_templates.phtml'); ?>
+		</div>
+        <div role="tabpanel" class="tab-pane" id="tab5">
+			TODO
+		</div>
+	</div>
+	
+	<div v-if="loading" class="loading_layer">
+		<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />
+	</div>
+	
+</div>
+
+<style>
+	
+	.items-center { justify-content:center; }
+	.items-start { justify-content:start; }
+	.flex { display:flex; }
+	.justify-between { justify-content:space-between; }
+	.mb-4 { margin-bottom:1rem; }
+	.gap-2 { gap:0.5rem; }
+	.text-center { text-align:center; }
+	
+	#wpsg_ticket_modul .control-label { padding-top:0; font-size:1em; }
+	
+	.checkbox_row { display:flex; flex-direction:row; align-items:center; justify-content:flex-start; gap:1rem; margin-bottom:0.5rem; }
+	.checkbox_row input { margin:0; }
+	
+	#wpsg_ticket_modul { position:relative; }
+	#wpsg_ticket_modul a { text-decoration:none; position:relative; }
+	#wpsg_ticket_modul select.template_select { width:200px; }
+	#wpsg_ticket_modul > .loading_layer { position:absolute; left:0; top:0; width:100%; height:100%; transition:all 0.1s; display:flex; align-items:center; justify-content:center; background-color:rgba(255, 255, 255, 0.75); }
+	
+	#wpsg_ticket_modul .field_table { width:100%; border-top:1px solid #dddddd; border-left:1px solid #dddddd; border-right:1px solid #dddddd; font-size:12px; }
+	#wpsg_ticket_modul .field_table td { padding:1px 5px; }
+	#wpsg_ticket_modul .field_table tbody > tr:first-child > * { padding-top:1rem; }
+	#wpsg_ticket_modul .field_table tbody > tr:last-child > * { padding-bottom:1rem; }
+	#wpsg_ticket_modul .field_table th { padding:1px 5px; }
+	#wpsg_ticket_modul .field_table tr > * { background-color:#f9f9f9; }
+	#wpsg_ticket_modul .field_table tr:nth-child(4) > * { border-bottom:1px solid #dddddd; padding-bottom:1rem; }
+	#wpsg_ticket_modul .field_table .w-1 { width:100px; font-size:12px; }
+	#wpsg_ticket_modul .field_table .w-2 { width:200px; font-size:12px; }
+	
+	#wpsg_ticket_modul_template .head { width:100%; display:flex; align-items:center; justify-content:space-between; border-bottom:1px solid #DDDDDD; margin-bottom:1rem; padding-bottom:1rem; }
+	#wpsg_ticket_modul_template .head select { width:300px; }
+    #wpsg_ticket_modul_template .head div { flex-grow:1;  }
+    #wpsg_ticket_modul_template .wpsg_field_wrap_template_name { display:flex; justify-content:space-between; align-items:center; padding-right:10px !important; }
+    #wpsg_ticket_modul_template .wpsg_field_wrap_template_name > div { gap:1rem; display:flex; justify-content:flex-start; align-items:center; }
+    #wpsg_ticket_modul_template .template td.col_bg,
+    #wpsg_ticket_modul_template .template td.col_align { width:50px; text-align:center; }
+    #wpsg_ticket_modul_template .template tr td { vertical-align:middle; }
+    #wpsg_ticket_modul_template .template tr td:last-child { text-align:right; }
+    #wpsg_ticket_modul_template .template tr td:last-child .wpsg-glyphicon { margin-right:0; }
+    #wpsg_ticket_modul_template .uploadstate { display:flex; justify-content:flex-start; align-items:center; }
+    #wpsg_ticket_modul_template .uploadstate > img { margin-right:1rem; }
+    #wpsg_ticket_modul_template .file_wrap { display:flex; justify-content:space-between; align-items:center; }
+    #wpsg_ticket_modul_template .file_wrap .file { display:flex; gap:1rem; justify-content:flex-end; align-items:center; }
+    #wpsg_ticket_modul_template .file_wrap .file .wpsg-glyphicon { margin-right:8px; }
+    #wpsg_ticket_modul_template .label-copy { display:flex; justify-content:space-between; }
+    #wpsg_ticket_modul_template .label-copy .glyphicon  { font-size:14px; }
+    #wpsg_ticket_modul_template .col_w0 { width:50px; }
+    #wpsg_ticket_modul_template .col_w1 { width:100px; }
+    #wpsg_ticket_modul_template .col_w1 select,
+    #wpsg_ticket_modul_template .col_w1 input { width:100% !important; }
+	
+	
+</style>
+
+<script type="module">
+	
+	const wpsgSettings = {
+		baseUrl: '<?php echo WPSG_URL; ?>'
+	};
+	
+	import { ticket_settings_edit } from '<?php echo WPSG_URL; ?>mods/mod_ticket/assets/js/wpsg_modul.js';
+	
+	ticket_settings_edit(wpsgSettings, '<?php echo \admin_url('admin-ajax.php'); ?>', <?php echo json_encode([
+		'arTemplates' => $arTicketTemplates,
+		'arFonts' => $arFontVue,
+		'label' => [
+			'copyTemplateConfirm' => __('Sind Sie sich sicher, dass sie das Template kopieren mÃ¶chten?', 'wpsg'),
+			'removeFieldConfirm' => __('Sind Sie sich sicher, dass sie das Feld lÃ¶schen mÃ¶chten?', 'wpsg'),
+			'newTemplate' => __('Bitte die Bezeichnung des neuen Templates angeben.', 'wpsg'),
+			'error_noTemplateName' => __('Bitte eine Bezeichnung angeben', 'wpsg')
+		]
+	]); ?>);
+	
+</script>
Index: /views/mods/mod_ticket/settings_edit_templates.phtml
===================================================================
--- /views/mods/mod_ticket/settings_edit_templates.phtml	(revision 8427)
+++ /views/mods/mod_ticket/settings_edit_templates.phtml	(revision 8427)
@@ -0,0 +1,209 @@
+<?php
+
+	namespace wpsgTicket;
+ 
+?>
+
+<div id="wpsg_ticket_modul_template">
+
+	<div class="head">
+
+        <a href="#" @click.prevent="addTemplate" title="<?php echo __('Neues Template anlegen', 'wpsg'); ?>">
+            <span class="wpsg-glyphicon glyphicon glyphicon-plus"></span>
+        </a>
+
+		<div v-if="data.arTemplates.length > 0">
+
+			<select v-model="template">
+				<option :value="null"><?php echo __('Bitte auswÃ€hlen', 'wpsg'); ?></option>
+				<option v-for="(template, index) in data.arTemplates" :value="template">
+                    {{template.template_name}} ({{template.config.arField.length}} <?php echo __('Felder', 'wpsg'); ?><template v-if="template.defaulttemplate">, <?php echo __('Standard', 'wpsg'); ?></template>)
+                </option>
+			</select>
+
+		</div>
+		<div v-else>
+
+			<?php echo __('Keine Templates vorhanden', 'wpsg'); ?>
+
+		</div>
+
+        <a v-if="template" href="#" @click.prevent="removeTemplate" title="<?php echo __('Template lÃ¶schen', 'wpsg'); ?>">
+            <span class="wpsg-glyphicon glyphicon glyphicon-trash"></span>
+        </a>
+
+	</div>
+
+	<div v-if="template" class="template">
+
+		<div class="form-group form-group-sm has-feedback">
+			<label class="col-sm-6 control-label label-copy" for="wpsg_mod_downloadplus_filename">
+                <a href="#" title="<?php echo __('Template kopieren', 'wpsg'); ?>" @click="copyTemplate()"><span class="wpsg-glyphicon glyphicon glyphicon-copy"></span></a>
+                <span><?php echo __('Name des Templates', 'wpsg'); ?></span>
+            </label>
+			<div class="col-sm-6">
+				<div class="wpsg_field_wrap wpsg_field_wrap_template_name">
+					<input type="text" v-model="template.template_name" />
+                    <div>
+                        <label class="control-label"><?php echo __('Standard: ', 'wpsg'); ?></label>
+                        <input type="checkbox" :checked="template.defaulttemplate" @click="setDefaultTemplate" />
+                    </div>
+				</div>
+			</div>
+		</div>
+		<div class="form-group form-group-sm has-feedback">
+			<label class="col-sm-6 control-label"><?php echo __('Template GrÃ¶Ãe (mm)', 'wpsg'); ?></label>
+			<div class="col-sm-6">
+				<div class="wpsg_field_wrap flex items-center justify-start gap-2">
+					<input type="text" class="form-control input-sm" autocomplete="off" v-model="template.config.width">
+					x
+					<input type="text" class="form-control input-sm" autocomplete="off" v-model="template.config.height">
+				</div>
+			</div>
+		</div>
+		<div class="form-group form-group-sm has-feedback">
+			<label class="col-sm-6 control-label"><?php echo __('Hintergrund (PDF/JPEG)', 'wpsg'); ?></label>
+			<div class="col-sm-6">
+				<div class="wpsg_field_wrap flex items-start justify-between gap-2">
+		 			<input type="file" @change.prevent="uploadBg" ref="file_upload" accept=".jpeg,.jpg,.pdf" />
+					<span class="flex items-center">
+						<a v-if="template.hasBackground" :href="template.url_bg_download" target="_blank"><?php echo __('Anzeigen', 'wpsg'); ?></a>
+					</span>
+				</div>
+			</div>
+		</div>
+
+		<br />
+		
+		<table class="table table_qr table-body-striped wpsg_mod_downloadplus_fieldtable">
+			<thead>
+				<tr>
+					<th colspan="8"><?php echo __('QR - Code', 'wpsg'); ?></th>
+				</tr>
+			</thead>
+			<template v-for="(field, field_index) in template.config.arField">
+				<tbody v-if="field.text === '%qr%'">
+					<tr>
+						<td class="col_w0"></td>
+						<td class="col_w1">
+							<div class="text-right"><strong><?php echo __('X / Y', 'wpsg'); ?></strong></div>
+						</td>
+						<td class="col_w1">
+							<div clasS="flex items-center gap-2">
+								<input type="text" style="width:50px;" v-model="field.x" />
+								<span>/</span>
+								<input type="text" style="width:50px;" v-model="field.y" />
+							</div>
+						</td>
+						<td class="col_w1">
+							<div class="text-right"><strong><?php echo __('Breite', 'wpsg'); ?></strong></div>
+						</td>
+						<td class="col_w1">
+							<input type="text" style="width:50px;" v-model="field.w" />
+						</td>
+						<td class="col_w1">
+							<div class="text-right"><strong><?php echo __('HÃ¶he', 'wpsg'); ?>:</strong></div>
+						</td>
+						<td class="col_w1">
+							 <input type="text" style="width:50px;" v-model="field.h" />
+						</td>
+						<td class="col_w0"></td>
+					</tr>
+            	</tbody>
+			</template>
+		</table>
+		
+		<table class="table table-body-striped wpsg_mod_downloadplus_fieldtable">
+            <thead>
+				<tr>
+					<th colspan="8"><?php echo __('Weitere Felder mit Platzhaltern', 'wpsg'); ?></th>
+				</tr>
+                <tr>
+                    <th class="col_w0">
+                        <a href="#" @click.prevent="addField" title="<?php echo __('Neues Feld', 'wpsg'); ?>">
+                            <span class="wpsg-glyphicon glyphicon glyphicon-plus"></span>
+                        </a>
+                    </th>
+                    <th class="col_w1"><?php echo __('X', 'wpsg'); ?></th>
+                    <th class="col_w1"><?php echo __('Y', 'wpsg'); ?></th>
+                    <th class="col_w1"><?php echo __('Ausrichtung', 'wpsg'); ?></th>
+                    <th class="col_w1"><?php echo __('Farbe', 'wpsg'); ?></th>
+                    <th class="col_w1"><?php echo __('Deckkraft', 'wpsg'); ?></th>
+                    <th class="col_w1"><?php echo __('Winkel', 'wpsg'); ?></th>
+                    <th class="col_action"></th>
+                </tr>
+            </thead>
+			<template v-for="(field, field_index) in template.config.arField">
+				<tbody v-if="field.text !== '%qr%'">
+					<tr>
+						<td class="col_w0">#{{field_index + 1}}</td>
+						<td class="col_w1">
+							<input type="text" style="width:50px;" v-model="field.x" />
+						</td>
+						<td class="col_w1">
+							<input type="text" style="width:50px;" v-model="field.y" />
+						</td>
+						<td class="col_w1">
+							<select v-model="field.align" v-if="field.text !== '%qr%'">
+								<option value="L">Links</option>
+								<option value="C">Zentriert</option>
+								<option value="R">Rechts</option>
+							</select>
+							<div v-else class="text-right"><strong><?php echo __('Breite', 'wpsg'); ?></strong></div>
+						</td>
+						<td class="col_w1">
+							<input class="wpsg_hideBarcode"  v-if="field.text !== '%qr%'" type="text" style="width:75px;" v-model="field.color" />
+							<input v-else type="text" style="width:50px;" v-model="field.w" />
+						</td>
+						<td class="col_w1">
+							<input class="wpsg_hideBarcode"  v-if="field.text !== '%qr%'" type="text" style="width:50px;" v-model="field.opaque" />
+							<div v-else class="text-right"><strong><?php echo __('HÃ¶he', 'wpsg'); ?>:</strong></div>
+						</td>
+						<td class="col_w1">
+							<input class="wpsg_hideBarcode"  v-if="field.text !== '%qr%'" type="text" style="width:50px;" v-model="field.angle" />
+							<input v-else type="text" style="width:50px;" v-model="field.h" />
+						</td>
+						<td class="col_w0"></td>
+					</tr>
+					<tr>
+						<td class="col_w0">
+							<a href="#" @click.prevent="addField(field_index)" title="<?php echo __('Neues Feld davor einfÃŒgen', 'wpsg'); ?>">
+								<span class="wpsg-glyphicon glyphicon glyphicon-plus"></span>
+							</a>
+						</td>
+						<td class="col_freitext_label col_w1" colspan="1">
+							<span v-if="field.text !== '%qr%'"><?php echo __('Freitext', 'wpsg'); ?>:</span>
+						</td>
+						<td colspan="5" class="col_freitext">
+							<div class="flex items-center gap-2">
+								<input v-if="field.text !== '%qr%'" type="text" style="width:100%;" v-model="field.text" />
+								<span v-else>QR Code</span>
+							 
+								<template v-if="field.text !== '%qr%'">
+									<select class="fontselect" v-model="field.font" style="width:100%;">
+										<option v-for="(font, index_font) in data.arFonts" :value="font.code">{{font.label}}</option>
+									</select>
+									 <select v-model="field.fontsize" style="width:100%;">
+										<option v-for="size in [4,5,6,7,8,9,10,11,12,13,14,16,18,20,22,24,26,28,30,32,34]" :value="size">{{size}}</option>
+									</select>
+								</template>
+								
+							</div>
+						</td>
+						<td>
+							<a v-if="field.text !== '%qr%'" target="_blank" href="#" @click.prevent="removeField(field_index)" title="<?php echo __('Feld lÃ¶schen', 'wpsg'); ?>">
+								<span class="wpsg-glyphicon glyphicon glyphicon-trash"></span>
+							</a>
+						</td>
+					</tr>
+				</tbody>
+            </template>
+		</table>
+		
+		<a :href="template.url_preview" target="_blank" class="button button-primary"><?php echo __('Vorschau', 'wpsg'); ?></a>
+ 
+	</div>
+
+	<br />
+
+</div>
Index: /views/mods/mod_ticket/ticket_mail.phtml
===================================================================
--- /views/mods/mod_ticket/ticket_mail.phtml	(revision 8427)
+++ /views/mods/mod_ticket/ticket_mail.phtml	(revision 8427)
@@ -0,0 +1,21 @@
+<?php
+	
+	declare(strict_types=1);
+	
+	/**
+	 * @author: Daniel Schmitzer (daniel@maennchen1.de)
+	 * @date: 03.12.23
+	 * @time: 13:12
+	 */
+	
+	namespace wpsgTicket;
+	
+	/** @var \wpsg_order $oOrder */
+	$oOrder = $this->view['oOrder'];
+	
+	/** @var int[] $arTicketBookingIDSend */
+	$arTicketBookingIDSend = $this->view['arTicketBookingIDSend'];
+	
+?>Hallo <?php echo $oOrder->getCustomer()->getFirstname().' '.$oOrder->getCustomer()->getName(); ?>
+
+Hiermit erhalten Sie im Anhang Ihre Tickets aus der Bestellung <?php echo $oOrder->getNr(); ?>.
Index: /views/mods/mod_ticket/ticket_mail_html.phtml
===================================================================
--- /views/mods/mod_ticket/ticket_mail_html.phtml	(revision 8427)
+++ /views/mods/mod_ticket/ticket_mail_html.phtml	(revision 8427)
@@ -0,0 +1,20 @@
+<?php
+	
+	declare(strict_types=1);
+	
+	/**
+	 * @author: Daniel Schmitzer (daniel@maennchen1.de)
+	 * @date: 03.12.23
+	 * @time: 13:13
+	 */
+	
+	namespace wpsgTicket;
+	
+	/** @var \wpsg_order $oOrder */
+	$oOrder = $this->view['oOrder'];
+	
+	/** @var int[] $arTicketBookingIDSend */
+	$arTicketBookingIDSend = $this->view['arTicketBookingIDSend'];
+
+?><p>Hallo <?php echo $oOrder->getCustomer()->getFirstname().' '.$oOrder->getCustomer()->getName(); ?></p>
+<p>Hiermit erhalten Sie im Anhang Ihre Tickets aus der Bestellung <?php echo $oOrder->getNr(); ?>.</p>
