@singlebase/elements 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/{display-8HEcKYR4.js → authui-display-BCZBP7HR.js} +11 -10
- package/dist/authui-display-BCZBP7HR.js.map +1 -0
- package/dist/{display-CLDNNZQy.cjs → authui-display-CLGFSqRi.cjs} +21 -21
- package/dist/authui-display-CLGFSqRi.cjs.map +1 -0
- package/dist/authui.cjs +1 -1
- package/dist/authui.d.ts +9 -9
- package/dist/authui.js +2 -2
- package/dist/chat-DRenTJlI.cjs +3001 -0
- package/dist/chat-DRenTJlI.cjs.map +1 -0
- package/dist/chat-bXaRWel7.js +4926 -0
- package/dist/chat-bXaRWel7.js.map +1 -0
- package/dist/chat-messages.d.ts +109 -0
- package/dist/chat.cjs +2 -0
- package/dist/chat.cjs.map +1 -0
- package/dist/chat.d.ts +10 -0
- package/dist/chat.js +13 -0
- package/dist/chat.js.map +1 -0
- package/dist/elements/{account-screen.d.ts → authui-account.d.ts} +1 -1
- package/dist/elements/{buttons.d.ts → authui-buttons.d.ts} +1 -1
- package/dist/elements/{display.d.ts → authui-display.d.ts} +1 -1
- package/dist/elements/{form-base.d.ts → authui-form-base.d.ts} +1 -1
- package/dist/elements/{guard.d.ts → authui-guard.d.ts} +1 -1
- package/dist/elements/{auth-screen.d.ts → authui.d.ts} +3 -3
- package/dist/elements/chat.d.ts +312 -0
- package/dist/files-BOwtpYyQ.js +168 -0
- package/dist/files-BOwtpYyQ.js.map +1 -0
- package/dist/files-DW8A4Jl-.cjs +38 -0
- package/dist/files-DW8A4Jl-.cjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +36 -25
- package/dist/index.js.map +1 -1
- package/dist/singlebase-elements.min.js +6841 -1824
- package/dist/singlebase-elements.min.js.map +1 -1
- package/dist/styles/chat.d.ts +6 -0
- package/dist/styles/tokens.d.ts +1 -1
- package/dist/{uploader-eFYKpk8b.cjs → uploader-DGV2y9uT.cjs} +41 -77
- package/dist/uploader-DGV2y9uT.cjs.map +1 -0
- package/dist/{uploader-D-Da1trc.js → uploader-abQoem5q.js} +309 -463
- package/dist/uploader-abQoem5q.js.map +1 -0
- package/dist/uploader.cjs +1 -1
- package/dist/uploader.js +5 -4
- package/dist/uploader.js.map +1 -1
- package/dist/utils/markdown.d.ts +108 -0
- package/package.json +13 -5
- package/dist/display-8HEcKYR4.js.map +0 -1
- package/dist/display-CLDNNZQy.cjs.map +0 -1
- package/dist/uploader-D-Da1trc.js.map +0 -1
- package/dist/uploader-eFYKpk8b.cjs.map +0 -1
- /package/dist/elements/{base.d.ts → authui-base.d.ts} +0 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <singlebase-chat> styles. Every colour comes from the shared --sb-* tokens
|
|
3
|
+
* (plus --sb-hover, --sb-ink-2 and --sb-divider, which only the chat uses),
|
|
4
|
+
* so a page themes the chat, the auth widget and the uploader in one place.
|
|
5
|
+
*/
|
|
6
|
+
export declare const chatStyles: import("lit").CSSResult;
|
package/dist/styles/tokens.d.ts
CHANGED
|
@@ -37,7 +37,7 @@ export declare const TOKEN_DEFAULTS: {
|
|
|
37
37
|
* Base host layout plus the theme="dark"/density="compact" attribute
|
|
38
38
|
* overrides. These overrides are legitimate unconditional assignments —
|
|
39
39
|
* they only fire when *this* element carries the attribute — but every
|
|
40
|
-
* composite element (
|
|
40
|
+
* composite element (<singlebase-authui>, <singlebase-authui-account>) must forward
|
|
41
41
|
* theme/density/field-style to the singlebase-* children it renders for the
|
|
42
42
|
* override to reach elements that don't carry the attribute directly.
|
|
43
43
|
*/
|
|
@@ -1,40 +1,4 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
:host {
|
|
3
|
-
display: block;
|
|
4
|
-
box-sizing: border-box;
|
|
5
|
-
font-family: var(--sb-font, ${n.unsafeCSS(ne.font)});
|
|
6
|
-
color: var(--sb-ink, ${n.unsafeCSS(ne.ink)});
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
:host([theme="dark"]) {
|
|
10
|
-
/* The light default accent is near-black, which disappears on a dark
|
|
11
|
-
surface — primary buttons and links both use it. A host that sets its
|
|
12
|
-
own --sb-accent still wins: outer-page declarations beat :host rules. */
|
|
13
|
-
--sb-accent: #f3f4f5;
|
|
14
|
-
--sb-on-accent: #17181b;
|
|
15
|
-
--sb-surface: #17181b;
|
|
16
|
-
--sb-surface-alt: #202226;
|
|
17
|
-
--sb-ink: #f3f4f5;
|
|
18
|
-
--sb-muted-ink: #a2a8ae;
|
|
19
|
-
--sb-border: #2c2f34;
|
|
20
|
-
--sb-border-strong: #3a3e44;
|
|
21
|
-
--sb-danger: #f08379;
|
|
22
|
-
--sb-danger-bg: rgba(240, 131, 121, 0.1);
|
|
23
|
-
--sb-danger-border: rgba(240, 131, 121, 0.3);
|
|
24
|
-
--sb-danger-outline: rgba(240, 131, 121, 0.4);
|
|
25
|
-
--sb-danger-panel-border: rgba(240, 131, 121, 0.3);
|
|
26
|
-
--sb-danger-panel-bg: rgba(240, 131, 121, 0.06);
|
|
27
|
-
--sb-ok: #6fd1a6;
|
|
28
|
-
--sb-ok-bg: rgba(111, 209, 166, 0.1);
|
|
29
|
-
--sb-ok-border: rgba(111, 209, 166, 0.28);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
:host([density="compact"]) {
|
|
33
|
-
--sb-gap: 12px;
|
|
34
|
-
--sb-pad: 16px;
|
|
35
|
-
--sb-field-pad: 9px 11px;
|
|
36
|
-
}
|
|
37
|
-
`,xe=n.css`
|
|
1
|
+
"use strict";var se=r=>{throw TypeError(r)};var le=(r,o,e)=>o.has(r)||se("Cannot "+e);var l=(r,o,e)=>(le(r,o,"read from private field"),e?e.call(r):o.get(r)),d=(r,o,e)=>o.has(r)?se("Cannot add the same private member more than once"):o instanceof WeakSet?o.add(r):o.set(r,e),c=(r,o,e,t)=>(le(r,o,"write to private field"),t?t.call(r,e):o.set(r,e),e);const a=require("lit"),p=require("lit/decorators.js"),we=require("@singlebase/core"),g=require("./files-DW8A4Jl-.cjs"),ue=a.css`
|
|
38
2
|
/* ── layout primitives ───────────────────────────────────── */
|
|
39
3
|
.stack {
|
|
40
4
|
display: flex;
|
|
@@ -1010,86 +974,86 @@
|
|
|
1010
974
|
color: var(--sb-muted-ink, #61666c);
|
|
1011
975
|
font-style: italic;
|
|
1012
976
|
}
|
|
1013
|
-
`;function
|
|
1014
|
-
`||a[g-1]==="\r");)g-=1;r+=1;try{const i=await Se(t.subarray(l,g),"deflate");e+=te(i)}catch{}}return e?$e(e):null}async function Re(t,a){const e=await ee(t.slice(0,8));if(Ie(e))return{pages:null,encrypted:!0};if(e[0]!==80||e[1]!==75)return we;const r=await Ge(t,"docProps/app.xml");if(!r)return{pages:null,encrypted:!1};const o=a==="pptx"?"Slides":"Pages",l=new TextDecoder().decode(r).match(new RegExp(`<${o}>(\\d+)</${o}>`));return{pages:l?Number(l[1]):null,encrypted:!1}}function Ie(t){return[208,207,17,224,161,177,26,225].every((e,r)=>t[r]===e)}async function Ge(t,a){const e=Math.min(t.size,66e3),r=new DataView(await t.slice(t.size-e).arrayBuffer());let o=-1;for(let h=r.byteLength-22;h>=0;h--)if(r.getUint32(h,!0)===101010256){o=h;break}if(o<0)return null;const l=r.getUint32(o+12,!0),g=r.getUint32(o+16,!0);if(!l||g===4294967295)return null;const i=new DataView(await t.slice(g,g+l).arrayBuffer()),s=new TextDecoder;let b=0;for(;b+46<=i.byteLength&&i.getUint32(b,!0)===33639248;){const h=i.getUint16(b+10,!0),m=i.getUint32(b+20,!0),v=i.getUint16(b+28,!0),X=i.getUint16(b+30,!0),re=i.getUint16(b+32,!0),oe=i.getUint32(b+42,!0);if(s.decode(new Uint8Array(i.buffer,i.byteOffset+b+46,v))===a){const de=new DataView(await t.slice(oe,oe+30).arrayBuffer()),ce=oe+30+de.getUint16(26,!0)+de.getUint16(28,!0),pe=await ee(t.slice(ce,ce+m));return h===0?pe:h===8&&typeof DecompressionStream<"u"?await Se(pe,"deflate-raw"):null}b+=46+v+X+re}return null}async function ee(t){return new Uint8Array(await t.arrayBuffer())}async function Se(t,a){const e=new Blob([t]).stream().pipeThrough(new DecompressionStream(a));return new Uint8Array(await new Response(e).arrayBuffer())}function te(t){let a="";for(let r=0;r<t.length;r+=32768)a+=String.fromCharCode(...t.subarray(r,r+32768));return a}var Ce=Object.defineProperty,_e=Object.getOwnPropertyDescriptor,Ke=(t,a,e)=>a in t?Ce(t,a,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[a]=e,f=(t,a,e,r)=>{for(var o=r>1?void 0:r?_e(a,e):a,l=t.length-1,g;l>=0;l--)(g=t[l])&&(o=(r?g(a,e,o):g(o))||o);return r&&o&&Ce(a,e,o),o},We=(t,a,e)=>Ke(t,a+"",e);const se={fromAttribute:t=>{if(!t)return{};try{const a=JSON.parse(t);return a&&typeof a=="object"?a:{}}catch{return console.warn("[singlebase-uploader] an attribute holds invalid JSON; ignoring it"),{}}},toAttribute:t=>JSON.stringify(t??{})},le={fromAttribute:t=>t===null?!0:t!=="false",toAttribute:t=>t?null:"false"},be=["view","dropzone","allowRename","autoUpload","branding","logoUrl","logoText","heading","description","maxFiles","maxSize","minSize","accept","rules","bucket","publicRead","redirectUrl","metadata","options","messages","theme","density","onComplete","onError"];var w,k,z,U,$,S,C,M,T,L,F,O,D,j,A,E,N,B,P,R,I,G,_,K,W,q,Y,H,V,J,he;exports.SinglebaseUploader=(he=class extends n.LitElement{constructor(){super(...arguments);c(this,w,null);c(this,k,{});c(this,z);c(this,U);c(this,$,"full");c(this,S,!0);c(this,C,!0);c(this,M,!1);c(this,T,!0);c(this,L,"");c(this,F,"");c(this,O,"");c(this,D,"");c(this,j,10);c(this,A,"25MB");c(this,E,0);c(this,N,"");c(this,B,{});c(this,P,"default");c(this,R,{});c(this,I,{});c(this,G,!1);c(this,_,"");c(this,K,null);c(this,W,null);c(this,q,[]);c(this,Y,"");c(this,H,!1);c(this,V,!1);c(this,J,"")}get client(){return d(this,w)}set client(e){p(this,w,e)}get messages(){return d(this,k)}set messages(e){p(this,k,e)}get theme(){return d(this,z)}set theme(e){p(this,z,e)}get density(){return d(this,U)}set density(e){p(this,U,e)}get view(){return d(this,$)}set view(e){p(this,$,e)}get dropzone(){return d(this,S)}set dropzone(e){p(this,S,e)}get allowRename(){return d(this,C)}set allowRename(e){p(this,C,e)}get autoUpload(){return d(this,M)}set autoUpload(e){p(this,M,e)}get branding(){return d(this,T)}set branding(e){p(this,T,e)}get logoUrl(){return d(this,L)}set logoUrl(e){p(this,L,e)}get logoText(){return d(this,F)}set logoText(e){p(this,F,e)}get heading(){return d(this,O)}set heading(e){p(this,O,e)}get description(){return d(this,D)}set description(e){p(this,D,e)}get maxFiles(){return d(this,j)}set maxFiles(e){p(this,j,e)}get maxSize(){return d(this,A)}set maxSize(e){p(this,A,e)}get minSize(){return d(this,E)}set minSize(e){p(this,E,e)}get accept(){return d(this,N)}set accept(e){p(this,N,e)}get rules(){return d(this,B)}set rules(e){p(this,B,e)}get bucket(){return d(this,P)}set bucket(e){p(this,P,e)}get metadata(){return d(this,R)}set metadata(e){p(this,R,e)}get options(){return d(this,I)}set options(e){p(this,I,e)}get publicRead(){return d(this,G)}set publicRead(e){p(this,G,e)}get redirectUrl(){return d(this,_)}set redirectUrl(e){p(this,_,e)}get onComplete(){return d(this,K)}set onComplete(e){p(this,K,e)}get onError(){return d(this,W)}set onError(e){p(this,W,e)}get items(){return d(this,q)}set items(e){p(this,q,e)}get notice(){return d(this,Y)}set notice(e){p(this,Y,e)}get busy(){return d(this,H)}set busy(e){p(this,H,e)}get dragging(){return d(this,V)}set dragging(e){p(this,V,e)}get editing(){return d(this,J)}set editing(e){p(this,J,e)}get msg(){return ye(this.messages)}get resolvedClient(){return this.client??Me.getDefaultClient()??null}get files(){return this.items}get percent(){const e=this.items.filter(r=>r.status!=="ready");return e.length?Math.round(e.reduce((r,o)=>r+o.percent,0)/e.length):0}open(){var e;(e=this.renderRoot.querySelector("input[type=file]"))==null||e.click()}set config(e){const r=this;for(const o of be)e&&o in e&&(r[o]=e[o])}get config(){const e=this;return Object.fromEntries(be.map(r=>[r,e[r]]))}clear(){this.items.forEach(y),this.items=[],this.notice=""}disconnectedCallback(){super.disconnectedCallback(),this.items.forEach(y)}async upload(){var g;if(this.busy)return;const e=this.items.filter(i=>i.status==="ready"||i.status==="error");if(!e.length)return;const r=this.resolvedClient;if(!r){this.fail(this.msg.errNoClient);return}this.busy=!0,this.notice="";for(const i of e)i.status="uploading",i.percent=0,i.error="";this.items=[...this.items];const o=new Map,l=e.map(i=>{const s={file:i.file,filename:i.file.name};return this.bucket&&(s.bucket=this.bucket),this.publicRead&&(s.publicRead=!0),i.name!==i.file.name&&(s.newName=i.name),Object.keys(this.metadata??{}).length&&(s.metadata={...this.metadata}),Object.keys(this.options??{}).length&&(s.options={...this.options}),o.set(s,i),s});try{const i=await r.files.upload(l,{onProgress:h=>{const m=o.get(h.input);m&&(m.percent=h.percent,this.items=[...this.items],this.emit("singlebase-upload-progress",{file:m,percent:this.percent}))}});for(const h of i.completed){const m=o.get(h.input);m&&(m.status="done",m.percent=100,m.record=h.file)}for(const h of i.failed){const m=o.get(h.input);m&&(m.status="error",m.error=h.error.message||h.error.code)}this.items=[...this.items];const s=i.completed.map(h=>o.get(h.input)).filter(Boolean),b=i.failed.map(h=>o.get(h.input)).filter(Boolean);this.emit("singlebase-upload-complete",{completed:s,failed:b}),(g=this.onComplete)==null||g.call(this,{completed:s,failed:b}),b.length?this.notice=this.msg.errUpload:this.redirect()}catch(i){for(const s of e)s.status="error",s.error="";this.items=[...this.items],this.fail(Ye(i)||this.msg.errUpload)}finally{this.busy=!1}}ruleFor(e){const r=Q(e);if(!r)return null;for(const[o,l]of Object.entries(this.rules??{}))if(o.toLowerCase().replace(/^\./,"")===r)return l;return null}async add(e){if(this.view==="button"){const s=this.items.filter(b=>b.status==="done"||b.status==="error");s.forEach(y),this.items=this.items.filter(b=>!s.includes(b))}const r=this.maxFiles>0?this.maxFiles:Number.POSITIVE_INFINITY,o=[...this.items],l=o.length,g=[];let i="";for(const s of Array.from(e)){if(o.length>=r){i=x(this.msg.errTooMany,{max:r});break}if(this.accept&&!Fe(this.accept,s.name,s.type)){i=x(this.msg.errType,{name:s.name});continue}const b=this.ruleFor(s.name),h=ae((b==null?void 0:b.maxSize)??this.maxSize),m=ae((b==null?void 0:b.minSize)??this.minSize);if(h&&s.size>h){i=x(this.msg.errTooLarge,{name:s.name,size:Z(h)});continue}if(m&&s.size<m){i=x(this.msg.errTooSmall,{name:s.name,size:Z(m)});continue}const v=De(s);if(o.some(re=>re.key===v)){i=x(this.msg.errDuplicate,{name:s.name});continue}const X={key:v,file:s,name:s.name,status:this.needsInspection(b,s.name)?"checking":"ready",percent:0,error:"",record:null,pages:null,encrypted:null,preview:qe(s)};o.push(X),g.push(X)}this.notice=i,i&&this.emit("singlebase-upload-rejected",{message:i}),o.length!==l&&(this.items=o,this.emit("singlebase-upload-selected",{files:this.items}),await Promise.all(g.filter(s=>s.status==="checking").map(s=>this.inspect(s,this.ruleFor(s.file.name)))),(this.autoUpload||this.view==="button")&&this.upload())}needsInspection(e,r){return!e||!Ue(Q(r))?!1:e.maxPages!==void 0||e.allowProtected===!1}async inspect(e,r){const o=await ze(e.file,Q(e.file.name));e.pages=o.pages,e.encrypted=o.encrypted;let l="";r.allowProtected===!1&&o.encrypted===!0?l=x(this.msg.errProtected,{name:e.name}):r.maxPages&&o.pages!==null&&o.pages>r.maxPages&&(l=x(this.msg.errTooManyPages,{name:e.name,pages:o.pages,max:r.maxPages})),l?(y(e),this.items=this.items.filter(g=>g!==e),this.notice=l,this.emit("singlebase-upload-rejected",{message:l})):(e.status="ready",this.items=[...this.items])}removeItem(e){this.items.filter(r=>r.key===e).forEach(y),this.items=this.items.filter(r=>r.key!==e),this.notice=""}commitRename(e,r){e.name=je(e.file.name,r),this.editing="",this.items=[...this.items]}fail(e){var r;this.notice=e,this.emit("singlebase-upload-error",{message:e}),(r=this.onError)==null||r.call(this,{message:e})}emit(e,r){this.dispatchEvent(new CustomEvent(e,{detail:r,bubbles:!0,composed:!0}))}redirect(){if(!this.redirectUrl||typeof location>"u")return;const e=ve(this.redirectUrl,location.href,r=>console.warn(`[singlebase-uploader] ${r}`));e&&location.assign(e)}onPick(e){var o;const r=e.target;(o=r.files)!=null&&o.length&&this.add(r.files),r.value=""}onDrop(e){var o;e.preventDefault(),this.dragging=!1;const r=(o=e.dataTransfer)==null?void 0:o.files;r!=null&&r.length&&this.add(r)}onDragOver(e){e.preventDefault(),this.dragging=!0}onDragLeave(){this.dragging=!1}get canAddMore(){return this.maxFiles<=0||this.items.length<this.maxFiles}get checking(){return this.items.some(e=>e.status==="checking")}get pendingCount(){return this.items.filter(e=>e.status==="ready"||e.status==="error").length}get hint(){const e=Oe(this.accept),r=ae(this.maxSize),o=r?x(this.msg.hintUpTo,{size:Z(r)}):"";return[e,o].filter(Boolean).join(" · ")}renderInput(){return n.html`<input
|
|
977
|
+
`;function fe(r,o,e){if(!r||!o)return null;let t;try{t=new URL(o)}catch{return null}let i;try{i=new URL(r,t.href)}catch{return e==null||e(`"${r}" is not a valid URL`),null}return i.protocol!=="http:"&&i.protocol!=="https:"?(e==null||e(`refusing redirect to unsupported scheme "${i.protocol}"`),null):i.origin!==t.origin?(e==null||e(`refusing cross-origin redirect to ${i.origin}; same-origin only`),null):i.href===t.href?null:i.href}const ge={pages:null,encrypted:null},de=16*1024*1024,ke=2*1024*1024,ze=40,$e=4*1024*1024,be=new Set(["docx","pptx","xlsx"]);async function he(r,o){try{if(o==="pdf")return await Ue(r);if(be.has(o))return await Me(r,o)}catch{}return ge}function me(r){return r==="pdf"||be.has(r)}async function Ue(r){const o=await Z(r.slice(0,de)),e=r.size>de?await Z(r.slice(Math.max(0,r.size-ke))):null,t=Q(o)+(e?Q(e):""),i=/\/Encrypt[\s/<>\]]/.test(t);let f=xe(t);return f===null&&(f=await Se(o)),{pages:f,encrypted:i}}function xe(r){if(/\/Type\s*\/Pages/.test(r)){let e=0;for(const t of r.matchAll(/\/Count\s+(\d+)/g))e=Math.max(e,Number(t[1]));if(e>0)return e}const o=r.match(/\/Type\s*\/Page[^s]/g);return o!=null&&o.length?o.length:null}async function Se(r){if(typeof DecompressionStream>"u")return null;const o=Q(r);let e="",t=0;for(const i of o.matchAll(/stream\r?\n/g)){if(t>=ze||e.length>=$e)break;const f=i.index+i[0].length;let m=o.indexOf("endstream",f);if(m<0)break;for(;m>f&&(o[m-1]===`
|
|
978
|
+
`||o[m-1]==="\r");)m-=1;t+=1;try{const n=await ve(r.subarray(f,m),"deflate");e+=Q(n)}catch{}}return e?xe(e):null}async function Me(r,o){const e=await Z(r.slice(0,8));if(Ce(e))return{pages:null,encrypted:!0};if(e[0]!==80||e[1]!==75)return ge;const t=await je(r,"docProps/app.xml");if(!t)return{pages:null,encrypted:!1};const i=o==="pptx"?"Slides":"Pages",f=new TextDecoder().decode(t).match(new RegExp(`<${i}>(\\d+)</${i}>`));return{pages:f?Number(f[1]):null,encrypted:!1}}function Ce(r){return[208,207,17,224,161,177,26,225].every((e,t)=>r[t]===e)}async function je(r,o){const e=Math.min(r.size,66e3),t=new DataView(await r.slice(r.size-e).arrayBuffer());let i=-1;for(let h=t.byteLength-22;h>=0;h--)if(t.getUint32(h,!0)===101010256){i=h;break}if(i<0)return null;const f=t.getUint32(i+12,!0),m=t.getUint32(i+16,!0);if(!f||m===4294967295)return null;const n=new DataView(await r.slice(m,m+f).arrayBuffer()),s=new TextDecoder;let b=0;for(;b+46<=n.byteLength&&n.getUint32(b,!0)===33639248;){const h=n.getUint16(b+10,!0),x=n.getUint32(b+20,!0),v=n.getUint16(b+28,!0),W=n.getUint16(b+30,!0),ee=n.getUint16(b+32,!0),te=n.getUint32(b+42,!0);if(s.decode(new Uint8Array(n.buffer,n.byteOffset+b+46,v))===o){const oe=new DataView(await r.slice(te,te+30).arrayBuffer()),ae=te+30+oe.getUint16(26,!0)+oe.getUint16(28,!0),ne=await Z(r.slice(ae,ae+x));return h===0?ne:h===8&&typeof DecompressionStream<"u"?await ve(ne,"deflate-raw"):null}b+=46+v+W+ee}return null}async function Z(r){return new Uint8Array(await r.arrayBuffer())}async function ve(r,o){const e=new Blob([r]).stream().pipeThrough(new DecompressionStream(o));return new Uint8Array(await new Response(e).arrayBuffer())}function Q(r){let o="";for(let t=0;t<r.length;t+=32768)o+=String.fromCharCode(...r.subarray(t,t+32768));return o}var ye=Object.defineProperty,Ee=Object.getOwnPropertyDescriptor,Fe=(r,o,e)=>o in r?ye(r,o,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[o]=e,u=(r,o,e,t)=>{for(var i=t>1?void 0:t?Ee(o,e):o,f=r.length-1,m;f>=0;f--)(m=r[f])&&(i=(t?m(o,e,i):m(i))||i);return t&&i&&ye(o,e,i),i},Oe=(r,o,e)=>Fe(r,o+"",e);const re={fromAttribute:r=>{if(!r)return{};try{const o=JSON.parse(r);return o&&typeof o=="object"?o:{}}catch{return console.warn("[singlebase-uploader] an attribute holds invalid JSON; ignoring it"),{}}},toAttribute:r=>JSON.stringify(r??{})},ie={fromAttribute:r=>r===null?!0:r!=="false",toAttribute:r=>r?null:"false"},ce=["view","dropzone","allowRename","autoUpload","branding","logoUrl","logoText","heading","description","maxFiles","maxSize","minSize","accept","rules","bucket","publicRead","redirectUrl","metadata","options","messages","theme","density","onComplete","onError"];var w,k,z,$,U,S,M,C,j,E,F,O,D,L,T,A,N,P,R,G,I,B,_,q,K,V,Y,H,J,X,pe;exports.SinglebaseUploader=(pe=class extends a.LitElement{constructor(){super(...arguments);d(this,w,null);d(this,k,{});d(this,z);d(this,$);d(this,U,"full");d(this,S,!0);d(this,M,!0);d(this,C,!1);d(this,j,!0);d(this,E,"");d(this,F,"");d(this,O,"");d(this,D,"");d(this,L,10);d(this,T,"25MB");d(this,A,0);d(this,N,"");d(this,P,{});d(this,R,"default");d(this,G,{});d(this,I,{});d(this,B,!1);d(this,_,"");d(this,q,null);d(this,K,null);d(this,V,[]);d(this,Y,"");d(this,H,!1);d(this,J,!1);d(this,X,"")}get client(){return l(this,w)}set client(e){c(this,w,e)}get messages(){return l(this,k)}set messages(e){c(this,k,e)}get theme(){return l(this,z)}set theme(e){c(this,z,e)}get density(){return l(this,$)}set density(e){c(this,$,e)}get view(){return l(this,U)}set view(e){c(this,U,e)}get dropzone(){return l(this,S)}set dropzone(e){c(this,S,e)}get allowRename(){return l(this,M)}set allowRename(e){c(this,M,e)}get autoUpload(){return l(this,C)}set autoUpload(e){c(this,C,e)}get branding(){return l(this,j)}set branding(e){c(this,j,e)}get logoUrl(){return l(this,E)}set logoUrl(e){c(this,E,e)}get logoText(){return l(this,F)}set logoText(e){c(this,F,e)}get heading(){return l(this,O)}set heading(e){c(this,O,e)}get description(){return l(this,D)}set description(e){c(this,D,e)}get maxFiles(){return l(this,L)}set maxFiles(e){c(this,L,e)}get maxSize(){return l(this,T)}set maxSize(e){c(this,T,e)}get minSize(){return l(this,A)}set minSize(e){c(this,A,e)}get accept(){return l(this,N)}set accept(e){c(this,N,e)}get rules(){return l(this,P)}set rules(e){c(this,P,e)}get bucket(){return l(this,R)}set bucket(e){c(this,R,e)}get metadata(){return l(this,G)}set metadata(e){c(this,G,e)}get options(){return l(this,I)}set options(e){c(this,I,e)}get publicRead(){return l(this,B)}set publicRead(e){c(this,B,e)}get redirectUrl(){return l(this,_)}set redirectUrl(e){c(this,_,e)}get onComplete(){return l(this,q)}set onComplete(e){c(this,q,e)}get onError(){return l(this,K)}set onError(e){c(this,K,e)}get items(){return l(this,V)}set items(e){c(this,V,e)}get notice(){return l(this,Y)}set notice(e){c(this,Y,e)}get busy(){return l(this,H)}set busy(e){c(this,H,e)}get dragging(){return l(this,J)}set dragging(e){c(this,J,e)}get editing(){return l(this,X)}set editing(e){c(this,X,e)}get msg(){return g.resolveUploadMessages(this.messages)}get resolvedClient(){return this.client??we.getDefaultClient()??null}get files(){return this.items}get percent(){const e=this.items.filter(t=>t.status!=="ready");return e.length?Math.round(e.reduce((t,i)=>t+i.percent,0)/e.length):0}open(){var e;(e=this.renderRoot.querySelector("input[type=file]"))==null||e.click()}set config(e){const t=this;for(const i of ce)e&&i in e&&(t[i]=e[i])}get config(){const e=this;return Object.fromEntries(ce.map(t=>[t,e[t]]))}clear(){this.items.forEach(y),this.items=[],this.notice=""}disconnectedCallback(){super.disconnectedCallback(),this.items.forEach(y)}async upload(){var m;if(this.busy)return;const e=this.items.filter(n=>n.status==="ready"||n.status==="error");if(!e.length)return;const t=this.resolvedClient;if(!t){this.fail(this.msg.errNoClient);return}this.busy=!0,this.notice="";for(const n of e)n.status="uploading",n.percent=0,n.error="";this.items=[...this.items];const i=new Map,f=e.map(n=>{const s={file:n.file,filename:n.file.name};return this.bucket&&(s.bucket=this.bucket),this.publicRead&&(s.publicRead=!0),n.name!==n.file.name&&(s.newName=n.name),Object.keys(this.metadata??{}).length&&(s.metadata={...this.metadata}),Object.keys(this.options??{}).length&&(s.options={...this.options}),i.set(s,n),s});try{const n=await t.files.upload(f,{onProgress:h=>{const x=i.get(h.input);x&&(x.percent=h.percent,this.items=[...this.items],this.emit("singlebase-upload-progress",{file:x,percent:this.percent}))}});for(const h of n.completed){const x=i.get(h.input);x&&(x.status="done",x.percent=100,x.record=h.file)}for(const h of n.failed){const x=i.get(h.input);x&&(x.status="error",x.error=h.error.message||h.error.code)}this.items=[...this.items];const s=n.completed.map(h=>i.get(h.input)).filter(Boolean),b=n.failed.map(h=>i.get(h.input)).filter(Boolean);this.emit("singlebase-upload-complete",{completed:s,failed:b}),(m=this.onComplete)==null||m.call(this,{completed:s,failed:b}),b.length?this.notice=this.msg.errUpload:this.redirect()}catch(n){for(const s of e)s.status="error",s.error="";this.items=[...this.items],this.fail(Le(n)||this.msg.errUpload)}finally{this.busy=!1}}ruleFor(e){const t=g.fileExtension(e);if(!t)return null;for(const[i,f]of Object.entries(this.rules??{}))if(i.toLowerCase().replace(/^\./,"")===t)return f;return null}async add(e){if(this.view==="button"){const s=this.items.filter(b=>b.status==="done"||b.status==="error");s.forEach(y),this.items=this.items.filter(b=>!s.includes(b))}const t=this.maxFiles>0?this.maxFiles:Number.POSITIVE_INFINITY,i=[...this.items],f=i.length,m=[];let n="";for(const s of Array.from(e)){if(i.length>=t){n=g.fill(this.msg.errTooMany,{max:t});break}if(this.accept&&!g.acceptsFile(this.accept,s.name,s.type)){n=g.fill(this.msg.errType,{name:s.name});continue}const b=this.ruleFor(s.name),h=g.parseSize((b==null?void 0:b.maxSize)??this.maxSize),x=g.parseSize((b==null?void 0:b.minSize)??this.minSize);if(h&&s.size>h){n=g.fill(this.msg.errTooLarge,{name:s.name,size:g.formatSize(h)});continue}if(x&&s.size<x){n=g.fill(this.msg.errTooSmall,{name:s.name,size:g.formatSize(x)});continue}const v=g.fileKey(s);if(i.some(ee=>ee.key===v)){n=g.fill(this.msg.errDuplicate,{name:s.name});continue}const W={key:v,file:s,name:s.name,status:this.needsInspection(b,s.name)?"checking":"ready",percent:0,error:"",record:null,pages:null,encrypted:null,preview:De(s)};i.push(W),m.push(W)}this.notice=n,n&&this.emit("singlebase-upload-rejected",{message:n}),i.length!==f&&(this.items=i,this.emit("singlebase-upload-selected",{files:this.items}),await Promise.all(m.filter(s=>s.status==="checking").map(s=>this.inspect(s,this.ruleFor(s.file.name)))),(this.autoUpload||this.view==="button")&&this.upload())}needsInspection(e,t){return!e||!me(g.fileExtension(t))?!1:e.maxPages!==void 0||e.allowProtected===!1}async inspect(e,t){const i=await he(e.file,g.fileExtension(e.file.name));e.pages=i.pages,e.encrypted=i.encrypted;let f="";t.allowProtected===!1&&i.encrypted===!0?f=g.fill(this.msg.errProtected,{name:e.name}):t.maxPages&&i.pages!==null&&i.pages>t.maxPages&&(f=g.fill(this.msg.errTooManyPages,{name:e.name,pages:i.pages,max:t.maxPages})),f?(y(e),this.items=this.items.filter(m=>m!==e),this.notice=f,this.emit("singlebase-upload-rejected",{message:f})):(e.status="ready",this.items=[...this.items])}removeItem(e){this.items.filter(t=>t.key===e).forEach(y),this.items=this.items.filter(t=>t.key!==e),this.notice=""}commitRename(e,t){e.name=g.renameKeepingExtension(e.file.name,t),this.editing="",this.items=[...this.items]}fail(e){var t;this.notice=e,this.emit("singlebase-upload-error",{message:e}),(t=this.onError)==null||t.call(this,{message:e})}emit(e,t){this.dispatchEvent(new CustomEvent(e,{detail:t,bubbles:!0,composed:!0}))}redirect(){if(!this.redirectUrl||typeof location>"u")return;const e=fe(this.redirectUrl,location.href,t=>console.warn(`[singlebase-uploader] ${t}`));e&&location.assign(e)}onPick(e){var i;const t=e.target;(i=t.files)!=null&&i.length&&this.add(t.files),t.value=""}onDrop(e){var i;e.preventDefault(),this.dragging=!1;const t=(i=e.dataTransfer)==null?void 0:i.files;t!=null&&t.length&&this.add(t)}onDragOver(e){e.preventDefault(),this.dragging=!0}onDragLeave(){this.dragging=!1}get canAddMore(){return this.maxFiles<=0||this.items.length<this.maxFiles}get checking(){return this.items.some(e=>e.status==="checking")}get pendingCount(){return this.items.filter(e=>e.status==="ready"||e.status==="error").length}get hint(){const e=g.acceptSummary(this.accept),t=g.parseSize(this.maxSize),i=t?g.fill(this.msg.hintUpTo,{size:g.formatSize(t)}):"";return[e,i].filter(Boolean).join(" · ")}renderInput(){return a.html`<input
|
|
1015
979
|
class="sr-only"
|
|
1016
980
|
type="file"
|
|
1017
981
|
?multiple=${this.maxFiles!==1}
|
|
1018
|
-
accept=${this.accept||
|
|
982
|
+
accept=${this.accept||a.nothing}
|
|
1019
983
|
@change=${this.onPick}
|
|
1020
|
-
/>`}renderLogo(){return this.logoUrl?
|
|
984
|
+
/>`}renderLogo(){return this.logoUrl?a.html`<img
|
|
1021
985
|
class="logo-img"
|
|
1022
986
|
src=${this.logoUrl}
|
|
1023
987
|
alt=${this.logoText||"Logo"}
|
|
1024
988
|
part="logo"
|
|
1025
|
-
/>`:this.logoText?
|
|
989
|
+
/>`:this.logoText?a.html`<div class="brand-mark" part="logo">${this.logoText}</div>`:a.nothing}renderBranding(){return this.branding?a.html`<div class="branding" part="branding">
|
|
1026
990
|
<a href="https://singlebase.cloud" target="_blank" rel="noopener noreferrer"
|
|
1027
991
|
>${this.msg.brandingLabel}</a
|
|
1028
992
|
>
|
|
1029
|
-
</div>`:
|
|
1030
|
-
${
|
|
1031
|
-
</div>`}renderStatus(e){const
|
|
993
|
+
</div>`:a.nothing}renderNotice(){return this.notice?a.html`<div class="banner" role="alert" part="error">${this.notice}</div>`:a.nothing}renderCount(){if(!this.items.length)return a.nothing;const e=this.items.length===1?this.msg.countOne:this.msg.countMany;return a.html`<div class="count" part="count">
|
|
994
|
+
${g.fill(e,{n:this.items.length,max:this.maxFiles})}
|
|
995
|
+
</div>`}renderStatus(e){const t=g.formatSize(e.file.size);if(e.status==="checking")return`${t} · ${this.msg.checking}`;if(e.status==="uploading")return`${t} · ${this.msg.uploading}`;if(e.status==="done")return`${t} · ${this.msg.uploaded}`;if(e.status==="error")return`${t} · ${e.error||this.msg.failedLabel}`;const i=e.pages?` · ${g.fill(this.msg.pagesLabel,{n:e.pages})}`:"";return t+i}renderRow(e){const t=this.allowRename&&e.status==="ready";return e.status==="uploading"||e.status,a.html`<div class="row" part="file">
|
|
1032
996
|
<div class="chip" part="file-type">
|
|
1033
|
-
${e.preview?
|
|
997
|
+
${e.preview?a.html`<img class="thumb" src=${e.preview} alt="" part="preview" />`:g.extensionOf(e.name)||"FILE"}
|
|
1034
998
|
</div>
|
|
1035
999
|
<div class="meta">
|
|
1036
|
-
${this.editing===e.key?
|
|
1000
|
+
${this.editing===e.key?a.html`<input
|
|
1037
1001
|
class="name-input"
|
|
1038
1002
|
.value=${e.name}
|
|
1039
1003
|
autofocus
|
|
1040
|
-
@keydown=${
|
|
1041
|
-
@blur=${
|
|
1042
|
-
/>`:
|
|
1004
|
+
@keydown=${i=>{i.key==="Enter"?this.commitRename(e,i.target.value):i.key==="Escape"&&(this.editing="")}}
|
|
1005
|
+
@blur=${i=>this.commitRename(e,i.target.value)}
|
|
1006
|
+
/>`:t?a.html`<button
|
|
1043
1007
|
class="name"
|
|
1044
1008
|
title=${this.msg.rename}
|
|
1045
1009
|
@click=${()=>{this.editing=e.key}}
|
|
1046
1010
|
>
|
|
1047
1011
|
${e.name}
|
|
1048
|
-
</button>`:
|
|
1012
|
+
</button>`:a.html`<div class="name">${e.name}</div>`}
|
|
1049
1013
|
<div class="sz" data-state=${e.status}>${this.renderStatus(e)}</div>
|
|
1050
|
-
${e.status==="uploading"?
|
|
1014
|
+
${e.status==="uploading"?a.html`<div class="bar" part="progress">
|
|
1051
1015
|
<div class="bar-fill" style="width:${e.percent}%"></div>
|
|
1052
|
-
</div>`:
|
|
1016
|
+
</div>`:a.nothing}
|
|
1053
1017
|
</div>
|
|
1054
1018
|
<div class="row-act">
|
|
1055
|
-
${e.status==="error"?
|
|
1019
|
+
${e.status==="error"?a.html`<button class="link-sm" @click=${()=>void this.upload()}>
|
|
1056
1020
|
${this.msg.retry}
|
|
1057
|
-
</button>`:
|
|
1058
|
-
${e.status==="uploading"||e.status==="done"?
|
|
1021
|
+
</button>`:a.nothing}
|
|
1022
|
+
${e.status==="uploading"||e.status==="done"?a.nothing:a.html`<button class="link-sm" @click=${()=>this.removeItem(e.key)}>
|
|
1059
1023
|
${this.msg.remove}
|
|
1060
1024
|
</button>`}
|
|
1061
1025
|
</div>
|
|
1062
|
-
</div>`}renderRows(){return this.items.length?
|
|
1026
|
+
</div>`}renderRows(){return this.items.length?a.html`<div class="rows" part="files">
|
|
1063
1027
|
${this.items.map(e=>this.renderRow(e))}
|
|
1064
|
-
</div>`:
|
|
1028
|
+
</div>`:a.nothing}renderDropzone(){return a.html`<div class="drop" part="dropzone" data-drag=${String(this.dragging)}>
|
|
1065
1029
|
<div class="arrow" aria-hidden="true">↑</div>
|
|
1066
1030
|
<div class="drop-title">${this.msg.dropTitle}</div>
|
|
1067
1031
|
<button class="link" @click=${this.open}>${this.msg.dropSub}</button>
|
|
1068
|
-
${this.hint?
|
|
1069
|
-
</div>`}renderUploadCta(){const e=this.pendingCount;if(this.autoUpload||!e&&!this.busy)return
|
|
1032
|
+
${this.hint?a.html`<div class="hint">${this.hint}</div>`:a.nothing}
|
|
1033
|
+
</div>`}renderUploadCta(){const e=this.pendingCount;if(this.autoUpload||!e&&!this.busy)return a.nothing;const t=e===1?this.msg.uploadCtaOne:this.msg.uploadCtaMany;return a.html`<button
|
|
1070
1034
|
class="primary wide"
|
|
1071
1035
|
part="submit"
|
|
1072
1036
|
?disabled=${this.busy||this.checking}
|
|
1073
1037
|
@click=${()=>void this.upload()}
|
|
1074
1038
|
>
|
|
1075
|
-
${this.busy?this.msg.uploading:
|
|
1076
|
-
</button>`}renderFull(){const e=this.dropzone&&!this.items.length&&this.canAddMore;return
|
|
1039
|
+
${this.busy?this.msg.uploading:g.fill(t,{n:e})}
|
|
1040
|
+
</button>`}renderFull(){const e=this.dropzone&&!this.items.length&&this.canAddMore;return a.html`<div
|
|
1077
1041
|
class="card"
|
|
1078
1042
|
part="card"
|
|
1079
1043
|
@dragover=${this.onDragOver}
|
|
1080
1044
|
@dragleave=${this.onDragLeave}
|
|
1081
1045
|
@drop=${this.onDrop}
|
|
1082
1046
|
>
|
|
1083
|
-
${this.logoUrl||this.logoText||this.heading||this.description?
|
|
1047
|
+
${this.logoUrl||this.logoText||this.heading||this.description?a.html`<div class="head-block">
|
|
1084
1048
|
${this.renderLogo()}
|
|
1085
|
-
${this.heading?
|
|
1086
|
-
${this.description?
|
|
1087
|
-
</div>`:
|
|
1049
|
+
${this.heading?a.html`<div class="title">${this.heading}</div>`:a.nothing}
|
|
1050
|
+
${this.description?a.html`<div class="sub">${this.description}</div>`:a.nothing}
|
|
1051
|
+
</div>`:a.nothing}
|
|
1088
1052
|
${this.renderCount()} ${this.renderNotice()} ${this.renderRows()}
|
|
1089
|
-
${e?this.renderDropzone():
|
|
1090
|
-
${!e&&this.canAddMore?
|
|
1053
|
+
${e?this.renderDropzone():a.nothing}
|
|
1054
|
+
${!e&&this.canAddMore?a.html`<button class="add-more" @click=${this.open}>${this.msg.addMore}</button>`:a.nothing}
|
|
1091
1055
|
${this.renderUploadCta()} ${this.renderBranding()}
|
|
1092
|
-
</div>`}renderCompact(){return
|
|
1056
|
+
</div>`}renderCompact(){return a.html`<div
|
|
1093
1057
|
class="card"
|
|
1094
1058
|
part="card"
|
|
1095
1059
|
@dragover=${this.onDragOver}
|
|
@@ -1100,23 +1064,23 @@
|
|
|
1100
1064
|
<span class="sec-title">${this.heading||this.msg.attachments}</span>
|
|
1101
1065
|
<span class="count">${this.items.length} / ${this.maxFiles}</span>
|
|
1102
1066
|
</div>
|
|
1103
|
-
${this.dropzone?
|
|
1067
|
+
${this.dropzone?a.html`<div class="strip" part="dropzone" data-drag=${String(this.dragging)}>
|
|
1104
1068
|
<span class="strip-label">${this.msg.dropOrChoose}</span>
|
|
1105
1069
|
<button class="secondary" ?disabled=${!this.canAddMore} @click=${this.open}>
|
|
1106
1070
|
${this.msg.chooseFiles}
|
|
1107
1071
|
</button>
|
|
1108
|
-
</div>`:
|
|
1072
|
+
</div>`:a.html`<button class="secondary" ?disabled=${!this.canAddMore} @click=${this.open}>
|
|
1109
1073
|
${this.msg.chooseFiles}
|
|
1110
1074
|
</button>`}
|
|
1111
|
-
${this.hint?
|
|
1075
|
+
${this.hint?a.html`<div class="hint">${this.hint}</div>`:a.nothing} ${this.renderNotice()}
|
|
1112
1076
|
${this.renderRows()} ${this.renderUploadCta()} ${this.renderBranding()}
|
|
1113
|
-
</div>`}renderButton(){const e=this.items[this.items.length-1];return
|
|
1077
|
+
</div>`}renderButton(){const e=this.items[this.items.length-1];return a.html`<div class="button-view">
|
|
1114
1078
|
<button class="primary" ?disabled=${this.busy||!this.canAddMore} @click=${this.open}>
|
|
1115
1079
|
${this.busy?this.msg.uploading:this.msg.chooseFile}
|
|
1116
1080
|
</button>
|
|
1117
|
-
${e&&e.status!=="ready"?
|
|
1081
|
+
${e&&e.status!=="ready"?a.html`<div class="sz" data-state=${e.status}>${this.renderStatus(e)}</div>`:a.nothing}
|
|
1118
1082
|
${this.renderNotice()}
|
|
1119
|
-
</div>`}render(){return
|
|
1083
|
+
</div>`}render(){return a.html`${this.renderInput()}${this.view==="button"?this.renderButton():this.view==="compact"?this.renderCompact():this.renderFull()}`}},w=new WeakMap,k=new WeakMap,z=new WeakMap,$=new WeakMap,U=new WeakMap,S=new WeakMap,M=new WeakMap,C=new WeakMap,j=new WeakMap,E=new WeakMap,F=new WeakMap,O=new WeakMap,D=new WeakMap,L=new WeakMap,T=new WeakMap,A=new WeakMap,N=new WeakMap,P=new WeakMap,R=new WeakMap,G=new WeakMap,I=new WeakMap,B=new WeakMap,_=new WeakMap,q=new WeakMap,K=new WeakMap,V=new WeakMap,Y=new WeakMap,H=new WeakMap,J=new WeakMap,X=new WeakMap,pe);Oe(exports.SinglebaseUploader,"styles",[g.tokenDefaults,ue,a.css`
|
|
1120
1084
|
.card {
|
|
1121
1085
|
display: flex;
|
|
1122
1086
|
flex-direction: column;
|
|
@@ -1386,5 +1350,5 @@
|
|
|
1386
1350
|
flex-direction: column;
|
|
1387
1351
|
gap: 8px;
|
|
1388
1352
|
}
|
|
1389
|
-
`]);
|
|
1390
|
-
//# sourceMappingURL=uploader-
|
|
1353
|
+
`]);u([p.property({attribute:!1})],exports.SinglebaseUploader.prototype,"client",1);u([p.property({attribute:!1})],exports.SinglebaseUploader.prototype,"messages",1);u([p.property({reflect:!0})],exports.SinglebaseUploader.prototype,"theme",1);u([p.property({reflect:!0})],exports.SinglebaseUploader.prototype,"density",1);u([p.property({reflect:!0})],exports.SinglebaseUploader.prototype,"view",1);u([p.property({converter:ie})],exports.SinglebaseUploader.prototype,"dropzone",1);u([p.property({converter:ie,attribute:"allow-rename"})],exports.SinglebaseUploader.prototype,"allowRename",1);u([p.property({type:Boolean,attribute:"auto-upload"})],exports.SinglebaseUploader.prototype,"autoUpload",1);u([p.property({converter:ie})],exports.SinglebaseUploader.prototype,"branding",1);u([p.property({attribute:"logo-url"})],exports.SinglebaseUploader.prototype,"logoUrl",1);u([p.property({attribute:"logo-text"})],exports.SinglebaseUploader.prototype,"logoText",1);u([p.property()],exports.SinglebaseUploader.prototype,"heading",1);u([p.property()],exports.SinglebaseUploader.prototype,"description",1);u([p.property({type:Number,attribute:"max-files"})],exports.SinglebaseUploader.prototype,"maxFiles",1);u([p.property({attribute:"max-size"})],exports.SinglebaseUploader.prototype,"maxSize",1);u([p.property({attribute:"min-size"})],exports.SinglebaseUploader.prototype,"minSize",1);u([p.property()],exports.SinglebaseUploader.prototype,"accept",1);u([p.property({converter:re})],exports.SinglebaseUploader.prototype,"rules",1);u([p.property()],exports.SinglebaseUploader.prototype,"bucket",1);u([p.property({converter:re})],exports.SinglebaseUploader.prototype,"metadata",1);u([p.property({converter:re})],exports.SinglebaseUploader.prototype,"options",1);u([p.property({type:Boolean,attribute:"public-read"})],exports.SinglebaseUploader.prototype,"publicRead",1);u([p.property({attribute:"redirect-url"})],exports.SinglebaseUploader.prototype,"redirectUrl",1);u([p.property({attribute:!1})],exports.SinglebaseUploader.prototype,"onComplete",1);u([p.property({attribute:!1})],exports.SinglebaseUploader.prototype,"onError",1);u([p.state()],exports.SinglebaseUploader.prototype,"items",1);u([p.state()],exports.SinglebaseUploader.prototype,"notice",1);u([p.state()],exports.SinglebaseUploader.prototype,"busy",1);u([p.state()],exports.SinglebaseUploader.prototype,"dragging",1);u([p.state()],exports.SinglebaseUploader.prototype,"editing",1);exports.SinglebaseUploader=u([p.customElement("singlebase-uploader")],exports.SinglebaseUploader);function De(r){return!r.type.startsWith("image/")||typeof URL.createObjectURL!="function"?"":URL.createObjectURL(r)}function y(r){r.preview&&URL.revokeObjectURL(r.preview)}function Le(r){return r instanceof Error?r.message:""}exports.inspectFile=he;exports.isInspectable=me;exports.resolveRedirectTarget=fe;exports.sharedStyles=ue;
|
|
1354
|
+
//# sourceMappingURL=uploader-DGV2y9uT.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploader-DGV2y9uT.cjs","sources":["../src/styles/shared.ts","../src/utils/redirect.ts","../src/utils/inspect.ts","../src/elements/uploader.ts"],"sourcesContent":["import { css } from \"lit\";\n\n/**\n * Shared internal styles, ported value-for-value from the design mock's\n * styles(t) / acc(t, open, bare) functions in project/AuthWidget.dc.html.\n * The mock computed these as inline style objects per render; here they are\n * static Shadow DOM CSS driven by the --sb-* tokens, with part hooks so\n * hosts can reach internals via ::part().\n */\nexport const sharedStyles = css`\n /* ── layout primitives ───────────────────────────────────── */\n .stack {\n display: flex;\n flex-direction: column;\n gap: var(--sb-gap, 16px);\n }\n\n .fields {\n display: flex;\n flex-direction: column;\n gap: var(--sb-gap, 16px);\n }\n\n .head {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .two-up {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: var(--sb-gap, 16px);\n }\n\n .actions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .rule {\n height: 1px;\n background: var(--sb-border, #e4e6e9);\n }\n\n .between {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n }\n\n /* ── type ────────────────────────────────────────────────── */\n .logo-dot {\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 12px;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--sb-muted-ink, #61666c);\n margin-bottom: 6px;\n }\n\n .title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n letter-spacing: -0.015em;\n color: var(--sb-ink, #16181a);\n }\n\n .sub {\n margin: 0;\n font-size: 13.5px;\n line-height: 1.5;\n color: var(--sb-muted-ink, #61666c);\n text-wrap: pretty;\n }\n\n .sec-title {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n letter-spacing: -0.01em;\n color: var(--sb-ink, #16181a);\n }\n\n .hint {\n margin: 0;\n font-size: 12.5px;\n line-height: 1.5;\n color: var(--sb-muted-ink, #61666c);\n text-wrap: pretty;\n }\n\n .sub-label {\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 11px;\n letter-spacing: 0.07em;\n text-transform: uppercase;\n color: var(--sb-muted-ink, #61666c);\n }\n\n /* ── fields ──────────────────────────────────────────────── */\n .field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .label-row {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 8px;\n }\n\n label,\n .label {\n font-size: 12.5px;\n font-weight: 500;\n color: var(--sb-muted-ink, #61666c);\n letter-spacing: 0.01em;\n }\n\n input {\n width: 100%;\n box-sizing: border-box;\n font: inherit;\n font-size: 14px;\n color: var(--sb-ink, #16181a);\n background: var(--sb-surface-alt, #fafafa);\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: var(--sb-radius, 4px);\n padding: var(--sb-field-pad, 11px 13px);\n outline: none;\n }\n\n input:focus {\n border-color: var(--sb-accent, #111111);\n }\n\n input[aria-invalid=\"true\"] {\n border-color: var(--sb-danger, #b4231a);\n }\n\n /* field-style=\"underline\" — code boxes keep their box, they read as cells */\n :host([field-style=\"underline\"]) *:not(.code-row):not(.code-row-sm) > input {\n background: transparent;\n border: none;\n border-bottom: 1px solid var(--sb-border-strong, #cdd1d6);\n border-radius: 0;\n padding: 9px 2px;\n }\n\n p.err {\n margin: 0;\n font-size: 12.5px;\n color: var(--sb-danger, #b4231a);\n }\n\n /* ── code entry ──────────────────────────────────────────── */\n .code-row {\n display: grid;\n grid-template-columns: repeat(6, 1fr);\n gap: 8px;\n }\n\n .code-row input {\n text-align: center;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 18px;\n padding: 12px 0;\n }\n\n .code-row-sm {\n display: grid;\n grid-template-columns: repeat(6, 1fr);\n gap: 6px;\n }\n\n .code-row-sm input {\n text-align: center;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 14px;\n padding: 8px 0;\n }\n\n .resend-row {\n display: flex;\n align-items: baseline;\n gap: 8px;\n }\n\n /* ── buttons ─────────────────────────────────────────────── */\n button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n font: inherit;\n font-size: 13.5px;\n font-weight: 500;\n border-radius: var(--sb-radius, 4px);\n cursor: pointer;\n padding: 9px 14px;\n border: 1px solid transparent;\n transition:\n background 0.15s,\n border-color 0.15s,\n filter 0.15s,\n color 0.15s;\n }\n\n button:disabled {\n cursor: not-allowed;\n }\n\n button.primary {\n background: var(--sb-accent, #111111);\n color: var(--sb-on-accent, #ffffff);\n width: 100%;\n }\n\n button.primary:hover:not(:disabled) {\n filter: brightness(0.92);\n }\n\n button.primary-sm {\n background: var(--sb-accent, #111111);\n color: var(--sb-on-accent, #ffffff);\n padding: 7px 12px;\n }\n\n button.primary-sm:hover:not(:disabled) {\n filter: brightness(0.92);\n }\n\n button.ghost {\n background: transparent;\n color: var(--sb-muted-ink, #61666c);\n border: 1px solid var(--sb-border, #e4e6e9);\n width: 100%;\n }\n\n button.ghost-sm {\n background: transparent;\n color: var(--sb-muted-ink, #61666c);\n border: 1px solid var(--sb-border, #e4e6e9);\n padding: 7px 12px;\n }\n\n button.ghost:hover:not(:disabled),\n button.ghost-sm:hover:not(:disabled) {\n background: var(--sb-surface-alt, #fafafa);\n color: var(--sb-ink, #16181a);\n }\n\n button.secondary {\n background: var(--sb-surface, #ffffff);\n color: var(--sb-ink, #16181a);\n border: 1px solid var(--sb-border-strong, #cdd1d6);\n padding: 7px 12px;\n }\n\n button.secondary:hover:not(:disabled) {\n background: var(--sb-surface-alt, #fafafa);\n }\n\n button.link {\n font: inherit;\n font-size: 13px;\n font-weight: 500;\n color: var(--sb-accent, #111111);\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n text-decoration: underline;\n text-underline-offset: 3px;\n }\n\n button.link-sm {\n font: inherit;\n font-size: 12.5px;\n font-weight: 400;\n color: var(--sb-muted-ink, #61666c);\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n text-decoration: underline;\n text-underline-offset: 3px;\n }\n\n /* the mock's editLink: a muted underlined affordance that inks on hover */\n button.edit-link {\n align-self: flex-start;\n font: inherit;\n font-size: 12.5px;\n font-weight: 400;\n color: var(--sb-muted-ink, #61666c);\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n text-decoration: underline;\n text-underline-offset: 3px;\n transition: color 0.15s;\n }\n\n button.edit-link:hover:not(:disabled) {\n color: var(--sb-ink, #16181a);\n }\n\n button.edit-link:disabled {\n opacity: 0.4;\n }\n\n button.danger-link {\n align-self: flex-start;\n font: inherit;\n font-size: 12.5px;\n font-weight: 400;\n color: var(--sb-muted-ink, #61666c);\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n text-decoration: underline;\n text-underline-offset: 3px;\n transition: color 0.15s;\n }\n\n button.danger-link:hover:not(:disabled) {\n color: var(--sb-danger, #b4231a);\n }\n\n button.danger {\n padding: 7px 12px;\n background: transparent;\n color: var(--sb-danger, #b4231a);\n border: 1px solid var(--sb-danger-outline, #e8c4c0);\n }\n\n button.danger:hover:not(:disabled) {\n background: var(--sb-danger-bg, #fdf1f0);\n }\n\n button.danger:disabled {\n opacity: 0.45;\n }\n\n .btn-row {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n }\n\n .btn-row-end {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 12px;\n flex-wrap: wrap;\n }\n\n .edit-actions {\n display: flex;\n gap: 8px;\n padding-top: 2px;\n }\n\n /* ── feedback ────────────────────────────────────────────── */\n .banner,\n .notice {\n font-size: 13px;\n line-height: 1.45;\n border-radius: var(--sb-radius, 4px);\n padding: 10px 12px;\n }\n\n .banner {\n color: var(--sb-danger, #b4231a);\n background: var(--sb-danger-bg, #fdf1f0);\n border: 1px solid var(--sb-danger-border, #f3d6d3);\n }\n\n .notice {\n color: var(--sb-ok, #0f6b4a);\n background: var(--sb-ok-bg, #f0f7f3);\n border: 1px solid var(--sb-ok-border, #cfe5da);\n }\n\n .saved-note {\n font-size: 12.5px;\n font-weight: 500;\n color: var(--sb-ok, #0f6b4a);\n }\n\n .spinner {\n width: 13px;\n height: 13px;\n border: 2px solid rgba(255, 255, 255, 0.4);\n border-top-color: var(--sb-on-accent, #ffffff);\n border-radius: 50%;\n animation: sb-spin 0.7s linear infinite;\n }\n\n @keyframes sb-spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n }\n\n /* ── step bar ────────────────────────────────────────────── */\n .step-bar {\n height: 3px;\n background: var(--sb-border, #e4e6e9);\n border-radius: 99px;\n overflow: hidden;\n }\n\n .step-fill {\n height: 100%;\n background: var(--sb-accent, #111111);\n transition: width 0.3s;\n }\n\n /* ── footer link row ─────────────────────────────────────── */\n .foot {\n margin: 0;\n display: flex;\n gap: 6px;\n justify-content: center;\n font-size: 13px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n /* ── oauth ───────────────────────────────────────────────── */\n .oauth-primary {\n background: var(--sb-surface, #ffffff);\n color: var(--sb-ink, #16181a);\n border: 1px solid var(--sb-border-strong, #cdd1d6);\n width: 100%;\n }\n\n .oauth-primary:hover:not(:disabled) {\n background: var(--sb-surface-alt, #fafafa);\n }\n\n .g-mark {\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-weight: 500;\n font-size: 13px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .icon-row {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n }\n\n .icon-btn {\n padding: 7px 0;\n background: var(--sb-surface, #ffffff);\n color: var(--sb-muted-ink, #61666c);\n border: 1px solid var(--sb-border, #e4e6e9);\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 13px;\n }\n\n .icon-btn:hover:not(:disabled) {\n background: var(--sb-surface-alt, #fafafa);\n color: var(--sb-ink, #16181a);\n }\n\n /* ── accordion (method picker) ───────────────────────────── */\n .acc-wrap {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .acc-item {\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: var(--sb-radius, 4px);\n overflow: hidden;\n background: transparent;\n transition:\n border-color 0.2s,\n background 0.2s;\n }\n\n .acc-item.open {\n border-color: var(--sb-border-strong, #cdd1d6);\n background: var(--sb-surface, #ffffff);\n }\n\n .acc-item.bare {\n border: none;\n background: transparent;\n }\n\n .acc-head {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n box-sizing: border-box;\n font: inherit;\n text-align: left;\n background: transparent;\n border: none;\n border-radius: 0;\n padding: 11px 12px;\n cursor: pointer;\n color: var(--sb-ink, #16181a);\n transition: background 0.15s;\n }\n\n .acc-head:hover {\n background: var(--sb-surface-alt, #fafafa);\n }\n\n .chev {\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 13px;\n color: var(--sb-muted-ink, #61666c);\n line-height: 1;\n transform: rotate(0deg);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .acc-item.open .chev {\n transform: rotate(90deg);\n }\n\n .acc-title {\n font-size: 13.5px;\n font-weight: 500;\n color: var(--sb-ink, #16181a);\n letter-spacing: -0.005em;\n }\n\n .acc-meta {\n font-size: 12px;\n color: var(--sb-muted-ink, #61666c);\n margin-left: auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .acc-body {\n display: grid;\n grid-template-rows: 0fr;\n opacity: 0;\n transition:\n grid-template-rows 0.28s cubic-bezier(0.32, 0.72, 0, 1),\n opacity 0.16s ease;\n }\n\n .acc-item.open .acc-body {\n grid-template-rows: 1fr;\n opacity: 1;\n transition:\n grid-template-rows 0.34s cubic-bezier(0.32, 0.72, 0, 1),\n opacity 0.26s ease 0.06s;\n }\n\n .acc-clip {\n overflow: hidden;\n min-height: 0;\n }\n\n .acc-inner {\n display: flex;\n flex-direction: column;\n gap: var(--sb-gap, 16px);\n padding: 2px 12px 14px;\n transform: translateY(-4px);\n transition: transform 0.3s cubic-bezier(0.32, 0.72, 0, 1);\n }\n\n .acc-item.open .acc-inner {\n transform: translateY(0);\n }\n\n .acc-item.bare .acc-inner {\n padding: 0;\n }\n\n /* ── invite ──────────────────────────────────────────────── */\n .invite-box {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 10px 12px;\n background: var(--sb-surface-alt, #fafafa);\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: var(--sb-radius, 4px);\n }\n\n .invite-label {\n font-size: 11.5px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n color: var(--sb-muted-ink, #61666c);\n }\n\n .invite-email {\n font-size: 14px;\n color: var(--sb-ink, #16181a);\n }\n\n /* ── account ─────────────────────────────────────────────── */\n .acct-root {\n display: flex;\n flex-direction: column;\n gap: 22px;\n width: 100%;\n }\n\n .acct-nav {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n padding-bottom: 18px;\n border-bottom: 1px solid var(--sb-border, #e4e6e9);\n }\n\n .acct-who {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .avatar-col {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 42px;\n height: 42px;\n border-radius: 50%;\n background: var(--sb-surface-alt, #fafafa);\n border: 1px dashed var(--sb-border, #e4e6e9);\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 13px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .avatar.has-photo {\n border-style: solid;\n overflow: hidden;\n }\n .avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .avatar-lg {\n width: 56px;\n height: 56px;\n border-radius: 50%;\n background: var(--sb-surface-alt, #fafafa);\n border: 1px dashed var(--sb-border-strong, #cdd1d6);\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 13px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .avatar-row {\n display: flex;\n align-items: center;\n gap: 14px;\n }\n\n .avatar-actions {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .acct-who-text {\n min-width: 0;\n }\n\n .acct-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--sb-ink, #16181a);\n letter-spacing: -0.01em;\n }\n\n .acct-email {\n font-size: 12.5px;\n color: var(--sb-muted-ink, #61666c);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .acct-body {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 22px;\n }\n\n .section {\n display: flex;\n flex-direction: column;\n gap: 14px;\n }\n\n .sum-list {\n display: flex;\n flex-direction: column;\n }\n\n .sum-row {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 16px;\n padding: 15px 0;\n border-bottom: 1px solid var(--sb-border, #e4e6e9);\n }\n\n .sum-label {\n flex: 0 0 auto;\n font-size: 12.5px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .sum-value {\n min-width: 0;\n font-size: 13.5px;\n color: var(--sb-ink, #16181a);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .edit-card {\n display: flex;\n flex-direction: column;\n gap: var(--sb-gap, 16px);\n padding: 14px;\n background: var(--sb-surface-alt, #fafafa);\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: var(--sb-radius, 4px);\n }\n\n /* 2FA switch */\n .switch {\n flex: 0 0 auto;\n width: 42px;\n height: 24px;\n border-radius: 99px;\n border: 1px solid var(--sb-border-strong, #cdd1d6);\n background: var(--sb-surface-alt, #fafafa);\n cursor: pointer;\n padding: 2px;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n transition:\n background 0.15s,\n border-color 0.15s;\n }\n\n .switch[aria-pressed=\"true\"] {\n border-color: var(--sb-accent, #111111);\n background: var(--sb-accent, #111111);\n justify-content: flex-end;\n }\n\n .knob {\n width: 18px;\n height: 18px;\n border-radius: 50%;\n background: var(--sb-muted-ink, #61666c);\n display: block;\n }\n\n .switch[aria-pressed=\"true\"] .knob {\n background: var(--sb-on-accent, #ffffff);\n }\n\n .qr-row {\n display: flex;\n gap: 14px;\n align-items: flex-start;\n }\n\n .qr-box {\n flex: 0 0 auto;\n width: 74px;\n height: 74px;\n border-radius: var(--sb-radius, 4px);\n background: var(--sb-surface-alt, #fafafa);\n border: 1px dashed var(--sb-border-strong, #cdd1d6);\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 12px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .qr-text {\n display: flex;\n flex-direction: column;\n gap: 10px;\n min-width: 0;\n }\n\n /* connected accounts */\n .list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .conn-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 10px 12px;\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: var(--sb-radius, 4px);\n background: var(--sb-surface-alt, #fafafa);\n }\n\n .conn-left {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n }\n\n .conn-mark {\n flex: 0 0 auto;\n width: 28px;\n height: 28px;\n border-radius: 50%;\n background: var(--sb-surface, #ffffff);\n border: 1px solid var(--sb-border, #e4e6e9);\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 11px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .conn-name {\n font-size: 13.5px;\n font-weight: 500;\n color: var(--sb-ink, #16181a);\n }\n\n .meta-row {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .dot {\n flex: 0 0 auto;\n width: 5px;\n height: 5px;\n border-radius: 50%;\n background: var(--sb-ok, #0f6b4a);\n }\n\n .conn-meta {\n font-size: 12px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .tile-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(118px, 1fr));\n gap: 8px;\n }\n\n .tile {\n display: flex;\n align-items: center;\n gap: 8px;\n font: inherit;\n text-align: left;\n padding: 10px 11px;\n border-radius: var(--sb-radius, 4px);\n border: 1px dashed var(--sb-border-strong, #cdd1d6);\n background: transparent;\n cursor: pointer;\n transition:\n background 0.15s,\n border-color 0.15s,\n color 0.15s;\n }\n\n .tile:hover:not(:disabled) {\n background: var(--sb-surface-alt, #fafafa);\n border-color: var(--sb-accent, #111111);\n border-style: solid;\n }\n\n .tile-mark {\n flex: 0 0 auto;\n width: 22px;\n height: 22px;\n border-radius: 50%;\n background: var(--sb-surface-alt, #fafafa);\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 10.5px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .tile-name {\n font-size: 13px;\n color: var(--sb-ink, #16181a);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .tile-plus {\n margin-left: auto;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 14px;\n line-height: 1;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .delete-panel {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 14px;\n border: 1px solid var(--sb-danger-panel-border, #efd9d6);\n border-radius: var(--sb-radius, 4px);\n background: var(--sb-danger-panel-bg, #fdf7f6);\n }\n\n .disabled-note {\n font-size: 12px;\n color: var(--sb-muted-ink, #61666c);\n font-style: italic;\n }\n`;\n","/**\n * Resolves a post-login destination, or null when there isn't a safe one.\n *\n * The candidate usually comes from a `?redirect=` parameter, which is\n * attacker-controllable: anyone can send a victim a link to your own login\n * page carrying `?redirect=https://evil.example`. If the widget followed it,\n * the victim would sign in on a page they trust and then be handed to a site\n * they don't — a textbook open redirect, and a convincing one precisely\n * because the login step was genuine.\n *\n * So the rule is same-origin only. Relative paths resolve against the current\n * page; anything landing on another origin is refused, and the caller is told\n * why rather than left wondering where the redirect went.\n */\nexport function resolveRedirectTarget(\n candidate: string | null | undefined,\n currentHref: string | null | undefined,\n onRefused?: (reason: string) => void\n): string | null {\n if (!candidate || !currentHref) return null;\n\n let here: URL;\n try {\n here = new URL(currentHref);\n } catch {\n return null;\n }\n\n let target: URL;\n try {\n target = new URL(candidate, here.href);\n } catch {\n onRefused?.(`\"${candidate}\" is not a valid URL`);\n return null;\n }\n\n // Only ever http(s). A `javascript:` or `data:` candidate resolves to a URL\n // object quite happily, and assigning it would execute script.\n if (target.protocol !== \"http:\" && target.protocol !== \"https:\") {\n onRefused?.(`refusing redirect to unsupported scheme \"${target.protocol}\"`);\n return null;\n }\n\n if (target.origin !== here.origin) {\n onRefused?.(`refusing cross-origin redirect to ${target.origin}; same-origin only`);\n return null;\n }\n\n // Already there — redirecting would just reload, and can loop.\n if (target.href === here.href) return null;\n\n return target.href;\n}\n","/**\n * Reads a few facts out of a file before it is uploaded: how many pages it\n * has, and whether it is encrypted. Everything here runs in the browser on\n * the bytes the user picked — no upload, no dependency, no worker.\n *\n * Two honest caveats, both of which the documentation repeats:\n *\n * - **This is a convenience, not a security control.** Anyone can bypass it.\n * The server still has to enforce whatever actually matters.\n * - **Facts can be unknown.** A page count is `null` when the structure\n * can't be read, and callers treat unknown as \"rule doesn't apply\" rather\n * than rejecting a file they simply failed to parse.\n */\n\nexport interface FileFacts {\n /** Pages for PDF and DOCX, slides for PPTX. Null when undeterminable. */\n pages: number | null;\n /** True when encrypted, false when plainly not, null when unknown. */\n encrypted: boolean | null;\n}\n\nconst UNKNOWN: FileFacts = { pages: null, encrypted: null };\n\n/** How much of a large PDF to look at, from each end. */\nconst PDF_HEAD = 16 * 1024 * 1024;\nconst PDF_TAIL = 2 * 1024 * 1024;\n\n/** Ceilings for the compressed-PDF fallback, so a hostile file can't stall the tab. */\nconst MAX_STREAMS = 40;\nconst MAX_INFLATED = 4 * 1024 * 1024;\n\nconst OOXML = new Set([\"docx\", \"pptx\", \"xlsx\"]);\n\n/** Inspects one file. Never throws — an unreadable file is simply unknown. */\nexport async function inspectFile(file: Blob, extension: string): Promise<FileFacts> {\n try {\n if (extension === \"pdf\") return await inspectPdf(file);\n if (OOXML.has(extension)) return await inspectOoxml(file, extension);\n } catch {\n // A corrupt or surprising file is not a rejection reason on its own.\n }\n return UNKNOWN;\n}\n\n/** True when this extension has anything worth reading bytes for. */\nexport function isInspectable(extension: string): boolean {\n return extension === \"pdf\" || OOXML.has(extension);\n}\n\n// ── PDF ──────────────────────────────────────────────────────\n\nasync function inspectPdf(file: Blob): Promise<FileFacts> {\n const head = await bytesOf(file.slice(0, PDF_HEAD));\n const tail =\n file.size > PDF_HEAD ? await bytesOf(file.slice(Math.max(0, file.size - PDF_TAIL))) : null;\n\n const text = latin1(head) + (tail ? latin1(tail) : \"\");\n\n // An encrypted PDF names /Encrypt in its trailer. The whole file is still\n // readable — it is the content streams that are encrypted — so this is a\n // reliable marker rather than a guess.\n const encrypted = /\\/Encrypt[\\s/<>\\]]/.test(text);\n\n let pages = pageCountIn(text);\n if (pages === null) pages = await pageCountInStreams(head);\n\n return { pages, encrypted };\n}\n\n/**\n * The page tree's root node carries `/Count` with the document total, so the\n * largest `/Count` next to a `/Pages` node is the answer. Files that write\n * the tree without counts fall back to counting `/Type /Page` objects.\n */\nfunction pageCountIn(text: string): number | null {\n if (/\\/Type\\s*\\/Pages/.test(text)) {\n let max = 0;\n for (const match of text.matchAll(/\\/Count\\s+(\\d+)/g)) {\n max = Math.max(max, Number(match[1]));\n }\n if (max > 0) return max;\n }\n const direct = text.match(/\\/Type\\s*\\/Page[^s]/g);\n return direct?.length ? direct.length : null;\n}\n\n/**\n * PDF 1.5 and later may pack the page tree into compressed object streams,\n * where a plain scan sees nothing. Inflating the streams and scanning the\n * result recovers the count, using only DecompressionStream.\n */\nasync function pageCountInStreams(bytes: Uint8Array): Promise<number | null> {\n if (typeof DecompressionStream === \"undefined\") return null;\n\n const text = latin1(bytes);\n let inflated = \"\";\n let streams = 0;\n\n for (const match of text.matchAll(/stream\\r?\\n/g)) {\n if (streams >= MAX_STREAMS || inflated.length >= MAX_INFLATED) break;\n const start = match.index! + match[0].length;\n let end = text.indexOf(\"endstream\", start);\n if (end < 0) break;\n // Writers put an EOL between the data and the keyword. It has to come off:\n // the decompressor rejects anything trailing the compressed data.\n while (end > start && (text[end - 1] === \"\\n\" || text[end - 1] === \"\\r\")) end -= 1;\n streams += 1;\n try {\n const out = await inflate(bytes.subarray(start, end), \"deflate\");\n inflated += latin1(out);\n } catch {\n // Not a zlib stream (an image, or a different filter). Skip it.\n }\n }\n\n return inflated ? pageCountIn(inflated) : null;\n}\n\n// ── OOXML (docx / pptx / xlsx) ───────────────────────────────\n\nasync function inspectOoxml(file: Blob, extension: string): Promise<FileFacts> {\n const magic = await bytesOf(file.slice(0, 8));\n\n // A password-protected Office file is not a zip at all: Office encrypts the\n // package and wraps it in an OLE compound file. The magic bytes say so\n // outright, which makes this the one exact check in this module.\n if (isCompoundFile(magic)) return { pages: null, encrypted: true };\n if (magic[0] !== 0x50 || magic[1] !== 0x4b) return UNKNOWN;\n\n const app = await readZipEntry(file, \"docProps/app.xml\");\n if (!app) return { pages: null, encrypted: false };\n\n // Word records Pages, PowerPoint records Slides. Excel records neither.\n const tag = extension === \"pptx\" ? \"Slides\" : \"Pages\";\n const match = new TextDecoder().decode(app).match(new RegExp(`<${tag}>(\\\\d+)</${tag}>`));\n return { pages: match ? Number(match[1]) : null, encrypted: false };\n}\n\nfunction isCompoundFile(magic: Uint8Array): boolean {\n const SIGNATURE = [0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1];\n return SIGNATURE.every((byte, i) => magic[i] === byte);\n}\n\n/**\n * Pulls one entry out of a zip by walking the central directory. Enough of\n * the format to find a small known file, and no more: zip64 archives return\n * null, which reads as \"unknown\" upstream.\n */\nasync function readZipEntry(file: Blob, wanted: string): Promise<Uint8Array | null> {\n const tailSize = Math.min(file.size, 66_000);\n const tail = new DataView(await file.slice(file.size - tailSize).arrayBuffer());\n\n let eocd = -1;\n for (let i = tail.byteLength - 22; i >= 0; i--) {\n if (tail.getUint32(i, true) === 0x06054b50) {\n eocd = i;\n break;\n }\n }\n if (eocd < 0) return null;\n\n const size = tail.getUint32(eocd + 12, true);\n const offset = tail.getUint32(eocd + 16, true);\n if (!size || offset === 0xffffffff) return null;\n\n const cd = new DataView(await file.slice(offset, offset + size).arrayBuffer());\n const decoder = new TextDecoder();\n let p = 0;\n\n while (p + 46 <= cd.byteLength && cd.getUint32(p, true) === 0x02014b50) {\n const method = cd.getUint16(p + 10, true);\n const compressed = cd.getUint32(p + 20, true);\n const nameLength = cd.getUint16(p + 28, true);\n const extraLength = cd.getUint16(p + 30, true);\n const commentLength = cd.getUint16(p + 32, true);\n const localOffset = cd.getUint32(p + 42, true);\n const name = decoder.decode(new Uint8Array(cd.buffer, cd.byteOffset + p + 46, nameLength));\n\n if (name === wanted) {\n // The central directory's name/extra lengths may differ from the local\n // header's, so the data offset has to come from the local header.\n const local = new DataView(await file.slice(localOffset, localOffset + 30).arrayBuffer());\n const start = localOffset + 30 + local.getUint16(26, true) + local.getUint16(28, true);\n const data = await bytesOf(file.slice(start, start + compressed));\n if (method === 0) return data;\n if (method === 8 && typeof DecompressionStream !== \"undefined\") {\n return await inflate(data, \"deflate-raw\");\n }\n return null;\n }\n\n p += 46 + nameLength + extraLength + commentLength;\n }\n return null;\n}\n\n// ── plumbing ─────────────────────────────────────────────────\n\nasync function bytesOf(blob: Blob): Promise<Uint8Array> {\n return new Uint8Array(await blob.arrayBuffer());\n}\n\nasync function inflate(data: Uint8Array, format: \"deflate\" | \"deflate-raw\"): Promise<Uint8Array> {\n const stream = new Blob([data as BlobPart]).stream().pipeThrough(new DecompressionStream(format));\n return new Uint8Array(await new Response(stream).arrayBuffer());\n}\n\n/** Bytes as one char each, so PDF structure can be matched with a regex. */\nfunction latin1(bytes: Uint8Array): string {\n let out = \"\";\n const CHUNK = 32_768;\n for (let i = 0; i < bytes.length; i += CHUNK) {\n out += String.fromCharCode(...bytes.subarray(i, i + CHUNK));\n }\n return out;\n}\n","import { LitElement, css, html, nothing } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { getDefaultClient } from \"@singlebase/core\";\nimport type {\n FileUploadInput,\n FilesUploadApi,\n SinglebaseClientInstance,\n UploadProgress\n} from \"@singlebase/singlebase-sdk\";\n\n/** What the uploader needs from a client: `files.upload`, and nothing else. */\nexport type UploaderClient = { files: Pick<FilesUploadApi, \"upload\"> };\nimport { tokenDefaults } from \"../styles/tokens.js\";\nimport { sharedStyles } from \"../styles/shared.js\";\nimport { fill, resolveUploadMessages, type SinglebaseUploadMessages } from \"../upload-messages.js\";\nimport { resolveRedirectTarget } from \"../utils/redirect.js\";\nimport {\n acceptSummary,\n acceptsFile,\n extensionOf,\n fileExtension,\n fileKey,\n formatSize,\n parseSize,\n renameKeepingExtension\n} from \"../utils/files.js\";\nimport { inspectFile, isInspectable } from \"../utils/inspect.js\";\n\n/** JSON in markup, an object in JavaScript. Bad JSON is ignored, not thrown. */\nconst jsonAttr = {\n fromAttribute: (value: string | null) => {\n if (!value) return {};\n try {\n const parsed = JSON.parse(value);\n return parsed && typeof parsed === \"object\" ? parsed : {};\n } catch {\n console.warn(\"[singlebase-uploader] an attribute holds invalid JSON; ignoring it\");\n return {};\n }\n },\n toAttribute: (value: unknown) => JSON.stringify(value ?? {})\n};\n\n/** Present-but-empty means true, so `dropzone` and `dropzone=\"false\"` both read. */\nconst flagAttr = {\n fromAttribute: (value: string | null) => (value === null ? true : value !== \"false\"),\n toAttribute: (value: boolean) => (value ? null : \"false\")\n};\n\nexport type UploadView = \"full\" | \"compact\" | \"button\";\nexport type UploadItemStatus = \"checking\" | \"ready\" | \"uploading\" | \"done\" | \"error\";\n\n/**\n * Per-format limits, keyed by extension: `{ pdf: { maxPages: 10 } }`.\n *\n * `maxPages` and `allowProtected` need the file's bytes read, which only\n * works for `pdf`, `docx`, `pptx` and `xlsx`; the size bounds apply to any\n * extension and override the element-wide ones for that kind.\n */\nexport interface FileRule {\n maxPages?: number;\n maxSize?: string | number;\n minSize?: string | number;\n /** Set false to refuse password-protected files. Default: allowed. */\n allowProtected?: boolean;\n}\n\nexport type FileRules = Record<string, FileRule>;\n\nexport interface UploadItem {\n /** Identity for de-duplication: name, size and mtime. */\n key: string;\n file: File;\n /** The saved name, which the user may have edited. */\n name: string;\n status: UploadItemStatus;\n percent: number;\n error: string;\n /** The stored file record, once the upload completes. */\n record: unknown;\n /** Pages (slides for pptx) when they could be read, else null. */\n pages: number | null;\n /** Whether the file is encrypted, when that could be determined. */\n encrypted: boolean | null;\n /** A local object URL for image thumbnails; \"\" for everything else. */\n preview: string;\n}\n\n/**\n * Every setting in one object, for configuring an element from script. Keys\n * are the element's property names.\n */\nexport interface UploaderConfig {\n view: UploadView;\n dropzone: boolean;\n allowRename: boolean;\n autoUpload: boolean;\n branding: boolean;\n logoUrl: string;\n logoText: string;\n heading: string;\n description: string;\n maxFiles: number;\n maxSize: string | number;\n minSize: string | number;\n accept: string;\n rules: FileRules;\n bucket: string;\n publicRead: boolean;\n redirectUrl: string;\n metadata: Record<string, unknown>;\n options: Record<string, unknown>;\n messages: Partial<SinglebaseUploadMessages>;\n theme: \"light\" | \"dark\";\n density: \"comfortable\" | \"compact\";\n onComplete: SinglebaseUploader[\"onComplete\"];\n onError: SinglebaseUploader[\"onError\"];\n}\n\nconst CONFIG_KEYS: readonly (keyof UploaderConfig)[] = [\n \"view\",\n \"dropzone\",\n \"allowRename\",\n \"autoUpload\",\n \"branding\",\n \"logoUrl\",\n \"logoText\",\n \"heading\",\n \"description\",\n \"maxFiles\",\n \"maxSize\",\n \"minSize\",\n \"accept\",\n \"rules\",\n \"bucket\",\n \"publicRead\",\n \"redirectUrl\",\n \"metadata\",\n \"options\",\n \"messages\",\n \"theme\",\n \"density\",\n \"onComplete\",\n \"onError\"\n];\n\n/**\n * A file picker that uploads straight to storage.\n *\n * <singlebase-uploader></singlebase-uploader>\n * <singlebase-uploader view=\"compact\" accept=\".pdf,image/*\"></singlebase-uploader>\n * <singlebase-uploader view=\"button\" max-files=\"1\"></singlebase-uploader>\n *\n * It owns the staging list — picking, renaming, removing, validating, and the\n * progress of each file — and nothing else. When the batch finishes it emits\n * the stored records and stops; what the application does with them (attach\n * them to a record, show a gallery, save an avatar) is the application's\n * decision, not the widget's.\n *\n * Failures are per file. One rejected upload leaves the rest completed and\n * offers that row a retry, mirroring the SDK's own behaviour.\n */\n@customElement(\"singlebase-uploader\")\nexport class SinglebaseUploader extends LitElement {\n static styles = [\n tokenDefaults,\n sharedStyles,\n css`\n .card {\n display: flex;\n flex-direction: column;\n gap: 14px;\n box-sizing: border-box;\n padding: var(--sb-pad, 20px);\n background: var(--sb-surface, #ffffff);\n color: var(--sb-ink, #16181a);\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: calc(var(--sb-radius, 4px) + 4px);\n }\n\n .logo-img {\n display: block;\n align-self: flex-start;\n height: var(--sb-logo-height, 20px);\n width: auto;\n max-width: 100%;\n }\n\n .brand-mark {\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 13px;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--sb-ink, #16181a);\n }\n\n .head-block {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .count {\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 11.5px;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--sb-muted-ink, #61666c);\n }\n\n /* ── dropzone ─────────────────────────────────────── */\n .drop {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n padding: 30px 20px;\n text-align: center;\n border: 1px dashed var(--sb-border-strong, #cdd1d6);\n border-radius: calc(var(--sb-radius, 4px) + 2px);\n background: var(--sb-surface, #ffffff);\n transition:\n border-color 0.15s,\n background 0.15s;\n }\n\n .drop[data-drag=\"true\"] {\n border-color: var(--sb-accent, #111111);\n background: var(--sb-surface-alt, #fafafa);\n }\n\n .arrow {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 42px;\n height: 42px;\n margin-bottom: 4px;\n font-size: 18px;\n line-height: 1;\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: 50%;\n color: var(--sb-ink, #16181a);\n }\n\n .drop-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--sb-ink, #16181a);\n }\n\n /* the compact single-line dropzone */\n .strip {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 10px 12px;\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: calc(var(--sb-radius, 4px) + 2px);\n background: var(--sb-surface-alt, #fafafa);\n transition:\n border-color 0.15s,\n background 0.15s;\n }\n\n .strip[data-drag=\"true\"] {\n border-color: var(--sb-accent, #111111);\n }\n\n .strip-label {\n font-size: 14px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n /* ── file rows ────────────────────────────────────── */\n .rows {\n display: flex;\n flex-direction: column;\n }\n\n .row {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 0;\n border-top: 1px solid var(--sb-border, #e4e6e9);\n }\n\n .rows .row:first-child {\n border-top: none;\n }\n\n .chip {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: 46px;\n height: 46px;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 10.5px;\n letter-spacing: 0.04em;\n color: var(--sb-muted-ink, #61666c);\n background: var(--sb-surface-alt, #fafafa);\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: var(--sb-radius, 4px);\n overflow: hidden;\n }\n\n .thumb {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .meta {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .name {\n font-size: 14px;\n font-weight: 500;\n color: var(--sb-ink, #16181a);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n button.name {\n align-self: flex-start;\n max-width: 100%;\n padding: 0;\n border: none;\n background: none;\n text-align: left;\n border-radius: 0;\n }\n\n button.name:hover {\n text-decoration: underline;\n text-underline-offset: 3px;\n }\n\n .name-input {\n font-size: 14px;\n padding: 6px 8px;\n }\n\n .sz {\n font-size: 12px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .sz[data-state=\"error\"] {\n color: var(--sb-danger, #b4231a);\n }\n\n .sz[data-state=\"done\"] {\n color: var(--sb-ok, #0f6b4a);\n }\n\n .bar {\n height: 3px;\n margin-top: 2px;\n border-radius: 999px;\n background: var(--sb-border, #e4e6e9);\n overflow: hidden;\n }\n\n .bar-fill {\n height: 100%;\n background: var(--sb-accent, #111111);\n transition: width 0.2s linear;\n }\n\n .row-act {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n /* ── the dashed \"add more\" affordance ─────────────── */\n button.add-more {\n width: 100%;\n padding: 14px;\n color: var(--sb-ink, #16181a);\n background: none;\n border: 1px dashed var(--sb-border-strong, #cdd1d6);\n border-radius: calc(var(--sb-radius, 4px) + 2px);\n }\n\n button.add-more:hover:not(:disabled) {\n background: var(--sb-surface-alt, #fafafa);\n }\n\n button.wide {\n width: 100%;\n padding: 13px;\n font-size: 14px;\n }\n\n .branding {\n text-align: center;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 10.5px;\n letter-spacing: 0.06em;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .branding a {\n color: inherit;\n text-decoration: none;\n }\n\n .branding a:hover {\n color: var(--sb-ink, #16181a);\n text-decoration: underline;\n text-underline-offset: 3px;\n }\n\n /* the button view is just a control, not a card */\n :host([view=\"button\"]) {\n display: inline-block;\n }\n\n .button-view {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n `\n ];\n\n // ── wiring ────────────────────────────────────────────────\n /** An explicit client. Omit it and the page's SinglebaseClient() is used. */\n @property({ attribute: false })\n accessor client: UploaderClient | null = null;\n\n @property({ attribute: false })\n accessor messages: Partial<SinglebaseUploadMessages> = {};\n\n @property({ reflect: true })\n accessor theme: \"light\" | \"dark\" | undefined = undefined;\n\n @property({ reflect: true })\n accessor density: \"comfortable\" | \"compact\" | undefined = undefined;\n\n // ── shape ─────────────────────────────────────────────────\n /**\n * `full` is the card with a dropzone and a reviewable list, `compact` the\n * one-line attachments row, `button` a single control that uploads as soon\n * as a file is chosen.\n */\n @property({ reflect: true })\n accessor view: UploadView = \"full\";\n\n /** Show the drop target. Off leaves the picker button on its own. */\n @property({ converter: flagAttr })\n accessor dropzone = true;\n\n /** Let the user edit the saved filename before uploading. */\n @property({ converter: flagAttr, attribute: \"allow-rename\" })\n accessor allowRename = true;\n\n /** Upload as soon as files are picked, with no review step. */\n @property({ type: Boolean, attribute: \"auto-upload\" })\n accessor autoUpload = false;\n\n /** The \"Files by Singlebase\" credit. A plain link — it makes no request. */\n @property({ converter: flagAttr })\n accessor branding = true;\n\n @property({ attribute: \"logo-url\" }) accessor logoUrl = \"\";\n @property({ attribute: \"logo-text\" }) accessor logoText = \"\";\n @property() accessor heading = \"\";\n @property() accessor description = \"\";\n\n // ── limits ────────────────────────────────────────────────\n @property({ type: Number, attribute: \"max-files\" }) accessor maxFiles = 10;\n\n /** Bytes, or a human size like \"25MB\". 0 or \"\" means no limit. */\n @property({ attribute: \"max-size\" }) accessor maxSize: string | number = \"25MB\";\n @property({ attribute: \"min-size\" }) accessor minSize: string | number = 0;\n\n /** Same vocabulary as `<input type=\"file\" accept>`. */\n @property() accessor accept = \"\";\n\n /**\n * Per-format limits, as JSON in markup or an object in JavaScript:\n *\n * rules='{\"pdf\":{\"maxPages\":10,\"allowProtected\":false}}'\n *\n * Checking pages and encryption means reading the file in the browser, so\n * it is a convenience for the person picking files — never a substitute\n * for the server enforcing the same limits.\n */\n @property({ converter: jsonAttr })\n accessor rules: FileRules = {};\n\n // ── destination ───────────────────────────────────────────\n @property() accessor bucket = \"default\";\n\n /** Metadata attached to every file this element uploads. */\n @property({ converter: jsonAttr })\n accessor metadata: Record<string, unknown> = {};\n\n /**\n * `options` sent with every file's upload request — for instance\n * `{ profile_photo: true }`, which makes the upload the account's photo.\n */\n @property({ converter: jsonAttr })\n accessor options: Record<string, unknown> = {};\n @property({ type: Boolean, attribute: \"public-read\" }) accessor publicRead = false;\n\n /** Where to go once every file has uploaded. Same-origin only. */\n @property({ attribute: \"redirect-url\" }) accessor redirectUrl = \"\";\n\n /** Callback forms of the two events, for frameworks that prefer props. */\n @property({ attribute: false })\n accessor onComplete:\n ((detail: { completed: UploadItem[]; failed: UploadItem[] }) => void) | null = null;\n\n @property({ attribute: false })\n accessor onError: ((detail: { message: string }) => void) | null = null;\n\n // ── state ─────────────────────────────────────────────────\n @state() private accessor items: UploadItem[] = [];\n @state() private accessor notice = \"\";\n @state() private accessor busy = false;\n @state() private accessor dragging = false;\n @state() private accessor editing = \"\";\n\n get msg(): SinglebaseUploadMessages {\n return resolveUploadMessages(this.messages);\n }\n\n /** An explicit `.client`, else the page default. */\n get resolvedClient(): UploaderClient | null {\n return this.client ?? getDefaultClient<SinglebaseClientInstance>() ?? null;\n }\n\n /** The staging list, for host code that wants to inspect or persist it. */\n get files(): readonly UploadItem[] {\n return this.items;\n }\n\n /** Overall progress across the current batch, 0–100. */\n get percent(): number {\n const active = this.items.filter((item) => item.status !== \"ready\");\n if (!active.length) return 0;\n return Math.round(active.reduce((sum, item) => sum + item.percent, 0) / active.length);\n }\n\n // ── public API ────────────────────────────────────────────\n /** Opens the file picker. */\n open(): void {\n this.renderRoot.querySelector<HTMLInputElement>(\"input[type=file]\")?.click();\n }\n\n /**\n * Applies several settings at once:\n *\n * document.getElementById(\"docs\").config = { maxFiles: 5, metadata: { folder: \"q3\" } };\n *\n * Unknown keys are ignored. Reading it returns the current settings.\n */\n set config(value: Partial<UploaderConfig>) {\n const target = this as unknown as Record<string, unknown>;\n for (const key of CONFIG_KEYS) {\n if (value && key in value) target[key] = value[key];\n }\n }\n\n get config(): Partial<UploaderConfig> {\n const source = this as unknown as Record<string, unknown>;\n return Object.fromEntries(CONFIG_KEYS.map((key) => [key, source[key]]));\n }\n\n /** Drops every staged file and any notice. */\n clear(): void {\n this.items.forEach(releasePreview);\n this.items = [];\n this.notice = \"\";\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.items.forEach(releasePreview);\n }\n\n /** Uploads everything staged. Rows that already succeeded are left alone. */\n async upload(): Promise<void> {\n if (this.busy) return;\n const pending = this.items.filter((item) => item.status === \"ready\" || item.status === \"error\");\n if (!pending.length) return;\n\n const client = this.resolvedClient;\n if (!client) {\n this.fail(this.msg.errNoClient);\n return;\n }\n\n this.busy = true;\n this.notice = \"\";\n for (const item of pending) {\n item.status = \"uploading\";\n item.percent = 0;\n item.error = \"\";\n }\n this.items = [...this.items];\n\n // The SDK hands each progress and result entry back the very input object\n // it was given, so identity is all that is needed to find the row again.\n const rowOf = new Map<FileUploadInput, UploadItem>();\n const inputs = pending.map((item) => {\n const input: FileUploadInput = { file: item.file, filename: item.file.name };\n if (this.bucket) input.bucket = this.bucket;\n if (this.publicRead) input.publicRead = true;\n if (item.name !== item.file.name) input.newName = item.name;\n if (Object.keys(this.metadata ?? {}).length) input.metadata = { ...this.metadata };\n if (Object.keys(this.options ?? {}).length) input.options = { ...this.options };\n rowOf.set(input, item);\n return input;\n });\n\n try {\n const result = await client.files.upload(inputs, {\n onProgress: (progress: UploadProgress) => {\n const row = rowOf.get(progress.input);\n if (!row) return;\n row.percent = progress.percent;\n this.items = [...this.items];\n this.emit(\"singlebase-upload-progress\", { file: row, percent: this.percent });\n }\n });\n\n for (const entry of result.completed) {\n const row = rowOf.get(entry.input);\n if (!row) continue;\n row.status = \"done\";\n row.percent = 100;\n row.record = entry.file;\n }\n for (const entry of result.failed) {\n const row = rowOf.get(entry.input);\n if (!row) continue;\n row.status = \"error\";\n row.error = entry.error.message || entry.error.code;\n }\n this.items = [...this.items];\n\n const completed = result.completed\n .map((entry) => rowOf.get(entry.input))\n .filter(Boolean) as UploadItem[];\n const failed = result.failed\n .map((entry) => rowOf.get(entry.input))\n .filter(Boolean) as UploadItem[];\n\n this.emit(\"singlebase-upload-complete\", { completed, failed });\n this.onComplete?.({ completed, failed });\n\n if (failed.length) {\n this.notice = this.msg.errUpload;\n } else {\n this.redirect();\n }\n } catch (error) {\n // Initiation failed for the whole batch — nothing reached storage.\n for (const item of pending) {\n item.status = \"error\";\n item.error = \"\";\n }\n this.items = [...this.items];\n this.fail(errorMessage(error) || this.msg.errUpload);\n } finally {\n this.busy = false;\n }\n }\n\n // ── staging ───────────────────────────────────────────────\n /** The rule for this filename's extension, if the host set one. */\n private ruleFor(filename: string): FileRule | null {\n const extension = fileExtension(filename);\n if (!extension) return null;\n for (const [key, rule] of Object.entries(this.rules ?? {})) {\n if (key.toLowerCase().replace(/^\\./, \"\") === extension) return rule;\n }\n return null;\n }\n\n private async add(list: ArrayLike<File>): Promise<void> {\n // The button view is a one-shot control: a new pick replaces whatever\n // finished last time, so a max-files=\"1\" button can be used again.\n if (this.view === \"button\") {\n const finished = this.items.filter((i) => i.status === \"done\" || i.status === \"error\");\n finished.forEach(releasePreview);\n this.items = this.items.filter((i) => !finished.includes(i));\n }\n const limit = this.maxFiles > 0 ? this.maxFiles : Number.POSITIVE_INFINITY;\n const next = [...this.items];\n const before = next.length;\n const staged: UploadItem[] = [];\n let problem = \"\";\n\n for (const file of Array.from(list)) {\n if (next.length >= limit) {\n problem = fill(this.msg.errTooMany, { max: limit });\n break;\n }\n if (this.accept && !acceptsFile(this.accept, file.name, file.type)) {\n problem = fill(this.msg.errType, { name: file.name });\n continue;\n }\n\n // A rule's own size bounds win over the element-wide ones for its kind.\n const rule = this.ruleFor(file.name);\n const maxBytes = parseSize(rule?.maxSize ?? this.maxSize);\n const minBytes = parseSize(rule?.minSize ?? this.minSize);\n if (maxBytes && file.size > maxBytes) {\n problem = fill(this.msg.errTooLarge, { name: file.name, size: formatSize(maxBytes) });\n continue;\n }\n if (minBytes && file.size < minBytes) {\n problem = fill(this.msg.errTooSmall, { name: file.name, size: formatSize(minBytes) });\n continue;\n }\n const key = fileKey(file);\n if (next.some((item) => item.key === key)) {\n problem = fill(this.msg.errDuplicate, { name: file.name });\n continue;\n }\n\n const item: UploadItem = {\n key,\n file,\n name: file.name,\n // Reading bytes takes a moment, so the row appears immediately as\n // \"checking\" rather than the widget freezing on a picked file.\n status: this.needsInspection(rule, file.name) ? \"checking\" : \"ready\",\n percent: 0,\n error: \"\",\n record: null,\n pages: null,\n encrypted: null,\n preview: previewFor(file)\n };\n next.push(item);\n staged.push(item);\n }\n\n this.notice = problem;\n if (problem) this.emit(\"singlebase-upload-rejected\", { message: problem });\n if (next.length === before) return;\n\n this.items = next;\n this.emit(\"singlebase-upload-selected\", { files: this.items });\n\n await Promise.all(\n staged\n .filter((item) => item.status === \"checking\")\n .map((item) => this.inspect(item, this.ruleFor(item.file.name)!))\n );\n\n if (this.autoUpload || this.view === \"button\") void this.upload();\n }\n\n private needsInspection(rule: FileRule | null, filename: string): boolean {\n if (!rule) return false;\n if (!isInspectable(fileExtension(filename))) return false;\n return rule.maxPages !== undefined || rule.allowProtected === false;\n }\n\n /**\n * Reads the file and applies the rule. A fact the reader could not\n * determine is not grounds for rejection — an unreadable page count means\n * the page rule simply doesn't apply to that file.\n */\n private async inspect(item: UploadItem, rule: FileRule): Promise<void> {\n const facts = await inspectFile(item.file, fileExtension(item.file.name));\n item.pages = facts.pages;\n item.encrypted = facts.encrypted;\n\n let problem = \"\";\n if (rule.allowProtected === false && facts.encrypted === true) {\n problem = fill(this.msg.errProtected, { name: item.name });\n } else if (rule.maxPages && facts.pages !== null && facts.pages > rule.maxPages) {\n problem = fill(this.msg.errTooManyPages, {\n name: item.name,\n pages: facts.pages,\n max: rule.maxPages\n });\n }\n\n if (problem) {\n releasePreview(item);\n this.items = this.items.filter((staged) => staged !== item);\n this.notice = problem;\n this.emit(\"singlebase-upload-rejected\", { message: problem });\n } else {\n item.status = \"ready\";\n this.items = [...this.items];\n }\n }\n\n /** Drops one staged file. Named for the row action, not Element.remove(). */\n private removeItem(key: string): void {\n this.items.filter((item) => item.key === key).forEach(releasePreview);\n this.items = this.items.filter((item) => item.key !== key);\n this.notice = \"\";\n }\n\n private commitRename(item: UploadItem, typed: string): void {\n item.name = renameKeepingExtension(item.file.name, typed);\n this.editing = \"\";\n this.items = [...this.items];\n }\n\n private fail(message: string): void {\n this.notice = message;\n this.emit(\"singlebase-upload-error\", { message });\n this.onError?.({ message });\n }\n\n private emit(name: string, detail: unknown): void {\n this.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true }));\n }\n\n private redirect(): void {\n if (!this.redirectUrl || typeof location === \"undefined\") return;\n const target = resolveRedirectTarget(this.redirectUrl, location.href, (reason) =>\n console.warn(`[singlebase-uploader] ${reason}`)\n );\n if (target) location.assign(target);\n }\n\n // ── events ────────────────────────────────────────────────\n private onPick(event: Event): void {\n const input = event.target as HTMLInputElement;\n if (input.files?.length) this.add(input.files);\n // Reset, or picking the same file twice in a row fires no change event.\n input.value = \"\";\n }\n\n private onDrop(event: DragEvent): void {\n event.preventDefault();\n this.dragging = false;\n const dropped = event.dataTransfer?.files;\n if (dropped?.length) this.add(dropped);\n }\n\n private onDragOver(event: DragEvent): void {\n event.preventDefault();\n this.dragging = true;\n }\n\n private onDragLeave(): void {\n this.dragging = false;\n }\n\n // ── rendering ─────────────────────────────────────────────\n private get canAddMore(): boolean {\n return this.maxFiles <= 0 || this.items.length < this.maxFiles;\n }\n\n /** True while any staged file is still being read. */\n private get checking(): boolean {\n return this.items.some((item) => item.status === \"checking\");\n }\n\n private get pendingCount(): number {\n return this.items.filter((item) => item.status === \"ready\" || item.status === \"error\").length;\n }\n\n private get hint(): string {\n const kinds = acceptSummary(this.accept);\n const maxBytes = parseSize(this.maxSize);\n const size = maxBytes ? fill(this.msg.hintUpTo, { size: formatSize(maxBytes) }) : \"\";\n return [kinds, size].filter(Boolean).join(\" · \");\n }\n\n private renderInput() {\n return html`<input\n class=\"sr-only\"\n type=\"file\"\n ?multiple=${this.maxFiles !== 1}\n accept=${this.accept || nothing}\n @change=${this.onPick}\n />`;\n }\n\n private renderLogo() {\n if (this.logoUrl) {\n return html`<img\n class=\"logo-img\"\n src=${this.logoUrl}\n alt=${this.logoText || \"Logo\"}\n part=\"logo\"\n />`;\n }\n if (this.logoText) return html`<div class=\"brand-mark\" part=\"logo\">${this.logoText}</div>`;\n return nothing;\n }\n\n private renderBranding() {\n if (!this.branding) return nothing;\n return html`<div class=\"branding\" part=\"branding\">\n <a href=\"https://singlebase.cloud\" target=\"_blank\" rel=\"noopener noreferrer\"\n >${this.msg.brandingLabel}</a\n >\n </div>`;\n }\n\n private renderNotice() {\n if (!this.notice) return nothing;\n return html`<div class=\"banner\" role=\"alert\" part=\"error\">${this.notice}</div>`;\n }\n\n private renderCount() {\n if (!this.items.length) return nothing;\n const template = this.items.length === 1 ? this.msg.countOne : this.msg.countMany;\n return html`<div class=\"count\" part=\"count\">\n ${fill(template, { n: this.items.length, max: this.maxFiles })}\n </div>`;\n }\n\n private renderStatus(item: UploadItem): string {\n const size = formatSize(item.file.size);\n if (item.status === \"checking\") return `${size} · ${this.msg.checking}`;\n if (item.status === \"uploading\") return `${size} · ${this.msg.uploading}`;\n if (item.status === \"done\") return `${size} · ${this.msg.uploaded}`;\n if (item.status === \"error\") {\n return `${size} · ${item.error || this.msg.failedLabel}`;\n }\n // A page count is only shown once it has actually been read.\n const pages = item.pages ? ` · ${fill(this.msg.pagesLabel, { n: item.pages })}` : \"\";\n return size + pages;\n }\n\n private renderRow(item: UploadItem) {\n const editable = this.allowRename && item.status === \"ready\";\n const busyRow = item.status === \"uploading\" || item.status === \"done\";\n return html`<div class=\"row\" part=\"file\">\n <div class=\"chip\" part=\"file-type\">\n ${\n item.preview\n ? html`<img class=\"thumb\" src=${item.preview} alt=\"\" part=\"preview\" />`\n : extensionOf(item.name) || \"FILE\"\n }\n </div>\n <div class=\"meta\">\n ${\n this.editing === item.key\n ? html`<input\n class=\"name-input\"\n .value=${item.name}\n autofocus\n @keydown=${(event: KeyboardEvent) => {\n if (event.key === \"Enter\") {\n this.commitRename(item, (event.target as HTMLInputElement).value);\n } else if (event.key === \"Escape\") {\n this.editing = \"\";\n }\n }}\n @blur=${(event: FocusEvent) =>\n this.commitRename(item, (event.target as HTMLInputElement).value)}\n />`\n : editable\n ? html`<button\n class=\"name\"\n title=${this.msg.rename}\n @click=${() => {\n this.editing = item.key;\n }}\n >\n ${item.name}\n </button>`\n : html`<div class=\"name\">${item.name}</div>`\n }\n <div class=\"sz\" data-state=${item.status}>${this.renderStatus(item)}</div>\n ${\n item.status === \"uploading\"\n ? html`<div class=\"bar\" part=\"progress\">\n <div class=\"bar-fill\" style=\"width:${item.percent}%\"></div>\n </div>`\n : nothing\n }\n </div>\n <div class=\"row-act\">\n ${\n item.status === \"error\"\n ? html`<button class=\"link-sm\" @click=${() => void this.upload()}>\n ${this.msg.retry}\n </button>`\n : nothing\n }\n ${\n item.status === \"uploading\" || item.status === \"done\"\n ? nothing\n : html`<button class=\"link-sm\" @click=${() => this.removeItem(item.key)}>\n ${this.msg.remove}\n </button>`\n }\n </div>\n </div>`;\n }\n\n private renderRows() {\n if (!this.items.length) return nothing;\n return html`<div class=\"rows\" part=\"files\">\n ${this.items.map((item) => this.renderRow(item))}\n </div>`;\n }\n\n private renderDropzone() {\n return html`<div class=\"drop\" part=\"dropzone\" data-drag=${String(this.dragging)}>\n <div class=\"arrow\" aria-hidden=\"true\">↑</div>\n <div class=\"drop-title\">${this.msg.dropTitle}</div>\n <button class=\"link\" @click=${this.open}>${this.msg.dropSub}</button>\n ${this.hint ? html`<div class=\"hint\">${this.hint}</div>` : nothing}\n </div>`;\n }\n\n private renderUploadCta() {\n const n = this.pendingCount;\n // Kept on screen while busy: a primary button that vanishes mid-upload\n // makes the card jump just as the user is watching it.\n if (this.autoUpload || (!n && !this.busy)) return nothing;\n const template = n === 1 ? this.msg.uploadCtaOne : this.msg.uploadCtaMany;\n return html`<button\n class=\"primary wide\"\n part=\"submit\"\n ?disabled=${this.busy || this.checking}\n @click=${() => void this.upload()}\n >\n ${this.busy ? this.msg.uploading : fill(template, { n })}\n </button>`;\n }\n\n /**\n * The whole card is the drop surface. Once files are staged the big zone is\n * replaced by the \"add more\" control, and a drop should still land.\n */\n private renderFull() {\n const showDrop = this.dropzone && !this.items.length && this.canAddMore;\n return html`<div\n class=\"card\"\n part=\"card\"\n @dragover=${this.onDragOver}\n @dragleave=${this.onDragLeave}\n @drop=${this.onDrop}\n >\n ${\n this.logoUrl || this.logoText || this.heading || this.description\n ? html`<div class=\"head-block\">\n ${this.renderLogo()}\n ${this.heading ? html`<div class=\"title\">${this.heading}</div>` : nothing}\n ${this.description ? html`<div class=\"sub\">${this.description}</div>` : nothing}\n </div>`\n : nothing\n }\n ${this.renderCount()} ${this.renderNotice()} ${this.renderRows()}\n ${showDrop ? this.renderDropzone() : nothing}\n ${\n !showDrop && this.canAddMore\n ? html`<button class=\"add-more\" @click=${this.open}>${this.msg.addMore}</button>`\n : nothing\n }\n ${this.renderUploadCta()} ${this.renderBranding()}\n </div>`;\n }\n\n private renderCompact() {\n return html`<div\n class=\"card\"\n part=\"card\"\n @dragover=${this.onDragOver}\n @dragleave=${this.onDragLeave}\n @drop=${this.onDrop}\n >\n <div class=\"between\">\n <span class=\"sec-title\">${this.heading || this.msg.attachments}</span>\n <span class=\"count\">${this.items.length} / ${this.maxFiles}</span>\n </div>\n ${\n this.dropzone\n ? html`<div class=\"strip\" part=\"dropzone\" data-drag=${String(this.dragging)}>\n <span class=\"strip-label\">${this.msg.dropOrChoose}</span>\n <button class=\"secondary\" ?disabled=${!this.canAddMore} @click=${this.open}>\n ${this.msg.chooseFiles}\n </button>\n </div>`\n : html`<button class=\"secondary\" ?disabled=${!this.canAddMore} @click=${this.open}>\n ${this.msg.chooseFiles}\n </button>`\n }\n ${this.hint ? html`<div class=\"hint\">${this.hint}</div>` : nothing} ${this.renderNotice()}\n ${this.renderRows()} ${this.renderUploadCta()} ${this.renderBranding()}\n </div>`;\n }\n\n private renderButton() {\n const active = this.items[this.items.length - 1];\n return html`<div class=\"button-view\">\n <button class=\"primary\" ?disabled=${this.busy || !this.canAddMore} @click=${this.open}>\n ${this.busy ? this.msg.uploading : this.msg.chooseFile}\n </button>\n ${\n active && active.status !== \"ready\"\n ? html`<div class=\"sz\" data-state=${active.status}>${this.renderStatus(active)}</div>`\n : nothing\n }\n ${this.renderNotice()}\n </div>`;\n }\n\n override render() {\n return html`${this.renderInput()}${\n this.view === \"button\"\n ? this.renderButton()\n : this.view === \"compact\"\n ? this.renderCompact()\n : this.renderFull()\n }`;\n }\n}\n\n/**\n * A local thumbnail for images. The object URL points at the bytes already in\n * memory — nothing is uploaded to draw it — and it is revoked when the row\n * goes away so a long session doesn't leak blobs.\n */\nfunction previewFor(file: File): string {\n if (!file.type.startsWith(\"image/\") || typeof URL.createObjectURL !== \"function\") return \"\";\n return URL.createObjectURL(file);\n}\n\nfunction releasePreview(item: UploadItem): void {\n if (item.preview) URL.revokeObjectURL(item.preview);\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : \"\";\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"singlebase-uploader\": SinglebaseUploader;\n }\n}\n"],"names":["sharedStyles","css","resolveRedirectTarget","candidate","currentHref","onRefused","here","target","UNKNOWN","PDF_HEAD","PDF_TAIL","MAX_STREAMS","MAX_INFLATED","OOXML","inspectFile","file","extension","inspectPdf","inspectOoxml","isInspectable","head","bytesOf","tail","text","latin1","encrypted","pages","pageCountIn","pageCountInStreams","max","match","direct","bytes","inflated","streams","start","end","out","inflate","magic","isCompoundFile","app","readZipEntry","tag","byte","i","wanted","tailSize","eocd","size","offset","cd","decoder","p","method","compressed","nameLength","extraLength","commentLength","localOffset","local","data","blob","format","stream","jsonAttr","value","parsed","flagAttr","CONFIG_KEYS","SinglebaseUploader","_a","LitElement","__privateAdd","_client","_messages","_theme","_density","_view","_dropzone","_allowRename","_autoUpload","_branding","_logoUrl","_logoText","_heading","_description","_maxFiles","_maxSize","_minSize","_accept","_rules","_bucket","_metadata","_options","_publicRead","_redirectUrl","_onComplete","_onError","_items","_notice","_busy","_dragging","_editing","__privateGet","_","__privateSet","resolveUploadMessages","getDefaultClient","active","item","sum","key","source","releasePreview","pending","client","rowOf","inputs","input","result","progress","row","entry","completed","failed","error","errorMessage","filename","fileExtension","rule","list","finished","limit","next","before","staged","problem","fill","acceptsFile","maxBytes","parseSize","minBytes","formatSize","fileKey","previewFor","facts","typed","renameKeepingExtension","message","name","detail","reason","event","dropped","kinds","acceptSummary","html","nothing","template","editable","extensionOf","n","showDrop","__publicField","tokenDefaults","__decorateClass","property","state","customElement"],"mappings":"qdASaA,GAAeC,EAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,ECKrB,SAASC,GACdC,EACAC,EACAC,EACe,CACf,GAAI,CAACF,GAAa,CAACC,EAAa,OAAO,KAEvC,IAAIE,EACJ,GAAI,CACFA,EAAO,IAAI,IAAIF,CAAW,CAC5B,MAAQ,CACN,OAAO,IACT,CAEA,IAAIG,EACJ,GAAI,CACFA,EAAS,IAAI,IAAIJ,EAAWG,EAAK,IAAI,CACvC,MAAQ,CACN,OAAAD,GAAA,MAAAA,EAAY,IAAIF,CAAS,wBAClB,IACT,CAIA,OAAII,EAAO,WAAa,SAAWA,EAAO,WAAa,UACrDF,GAAA,MAAAA,EAAY,4CAA4CE,EAAO,QAAQ,KAChE,MAGLA,EAAO,SAAWD,EAAK,QACzBD,GAAA,MAAAA,EAAY,qCAAqCE,EAAO,MAAM,sBACvD,MAILA,EAAO,OAASD,EAAK,KAAa,KAE/BC,EAAO,IAChB,CC/BA,MAAMC,GAAqB,CAAE,MAAO,KAAM,UAAW,IAAA,EAG/CC,GAAW,GAAK,KAAO,KACvBC,GAAW,EAAI,KAAO,KAGtBC,GAAc,GACdC,GAAe,EAAI,KAAO,KAE1BC,GAAQ,IAAI,IAAI,CAAC,OAAQ,OAAQ,MAAM,CAAC,EAG9C,eAAsBC,GAAYC,EAAYC,EAAuC,CACnF,GAAI,CACF,GAAIA,IAAc,MAAO,OAAO,MAAMC,GAAWF,CAAI,EACrD,GAAIF,GAAM,IAAIG,CAAS,SAAU,MAAME,GAAaH,EAAMC,CAAS,CACrE,MAAQ,CAER,CACA,OAAOR,EACT,CAGO,SAASW,GAAcH,EAA4B,CACxD,OAAOA,IAAc,OAASH,GAAM,IAAIG,CAAS,CACnD,CAIA,eAAeC,GAAWF,EAAgC,CACxD,MAAMK,EAAO,MAAMC,EAAQN,EAAK,MAAM,EAAGN,EAAQ,CAAC,EAC5Ca,EACJP,EAAK,KAAON,GAAW,MAAMY,EAAQN,EAAK,MAAM,KAAK,IAAI,EAAGA,EAAK,KAAOL,EAAQ,CAAC,CAAC,EAAI,KAElFa,EAAOC,EAAOJ,CAAI,GAAKE,EAAOE,EAAOF,CAAI,EAAI,IAK7CG,EAAY,qBAAqB,KAAKF,CAAI,EAEhD,IAAIG,EAAQC,GAAYJ,CAAI,EAC5B,OAAIG,IAAU,OAAMA,EAAQ,MAAME,GAAmBR,CAAI,GAElD,CAAE,MAAAM,EAAO,UAAAD,CAAA,CAClB,CAOA,SAASE,GAAYJ,EAA6B,CAChD,GAAI,mBAAmB,KAAKA,CAAI,EAAG,CACjC,IAAIM,EAAM,EACV,UAAWC,KAASP,EAAK,SAAS,kBAAkB,EAClDM,EAAM,KAAK,IAAIA,EAAK,OAAOC,EAAM,CAAC,CAAC,CAAC,EAEtC,GAAID,EAAM,EAAG,OAAOA,CACtB,CACA,MAAME,EAASR,EAAK,MAAM,sBAAsB,EAChD,OAAOQ,GAAA,MAAAA,EAAQ,OAASA,EAAO,OAAS,IAC1C,CAOA,eAAeH,GAAmBI,EAA2C,CAC3E,GAAI,OAAO,oBAAwB,IAAa,OAAO,KAEvD,MAAMT,EAAOC,EAAOQ,CAAK,EACzB,IAAIC,EAAW,GACXC,EAAU,EAEd,UAAWJ,KAASP,EAAK,SAAS,cAAc,EAAG,CACjD,GAAIW,GAAWvB,IAAesB,EAAS,QAAUrB,GAAc,MAC/D,MAAMuB,EAAQL,EAAM,MAASA,EAAM,CAAC,EAAE,OACtC,IAAIM,EAAMb,EAAK,QAAQ,YAAaY,CAAK,EACzC,GAAIC,EAAM,EAAG,MAGb,KAAOA,EAAMD,IAAUZ,EAAKa,EAAM,CAAC,IAAM;AAAA,GAAQb,EAAKa,EAAM,CAAC,IAAM,OAAOA,GAAO,EACjFF,GAAW,EACX,GAAI,CACF,MAAMG,EAAM,MAAMC,GAAQN,EAAM,SAASG,EAAOC,CAAG,EAAG,SAAS,EAC/DH,GAAYT,EAAOa,CAAG,CACxB,MAAQ,CAER,CACF,CAEA,OAAOJ,EAAWN,GAAYM,CAAQ,EAAI,IAC5C,CAIA,eAAef,GAAaH,EAAYC,EAAuC,CAC7E,MAAMuB,EAAQ,MAAMlB,EAAQN,EAAK,MAAM,EAAG,CAAC,CAAC,EAK5C,GAAIyB,GAAeD,CAAK,EAAG,MAAO,CAAE,MAAO,KAAM,UAAW,EAAA,EAC5D,GAAIA,EAAM,CAAC,IAAM,IAAQA,EAAM,CAAC,IAAM,GAAM,OAAO/B,GAEnD,MAAMiC,EAAM,MAAMC,GAAa3B,EAAM,kBAAkB,EACvD,GAAI,CAAC0B,EAAK,MAAO,CAAE,MAAO,KAAM,UAAW,EAAA,EAG3C,MAAME,EAAM3B,IAAc,OAAS,SAAW,QACxCc,EAAQ,IAAI,YAAA,EAAc,OAAOW,CAAG,EAAE,MAAM,IAAI,OAAO,IAAIE,CAAG,YAAYA,CAAG,GAAG,CAAC,EACvF,MAAO,CAAE,MAAOb,EAAQ,OAAOA,EAAM,CAAC,CAAC,EAAI,KAAM,UAAW,EAAA,CAC9D,CAEA,SAASU,GAAeD,EAA4B,CAElD,MADkB,CAAC,IAAM,IAAM,GAAM,IAAM,IAAM,IAAM,GAAM,GAAI,EAChD,MAAM,CAACK,EAAMC,IAAMN,EAAMM,CAAC,IAAMD,CAAI,CACvD,CAOA,eAAeF,GAAa3B,EAAY+B,EAA4C,CAClF,MAAMC,EAAW,KAAK,IAAIhC,EAAK,KAAM,IAAM,EACrCO,EAAO,IAAI,SAAS,MAAMP,EAAK,MAAMA,EAAK,KAAOgC,CAAQ,EAAE,aAAa,EAE9E,IAAIC,EAAO,GACX,QAASH,EAAIvB,EAAK,WAAa,GAAIuB,GAAK,EAAGA,IACzC,GAAIvB,EAAK,UAAUuB,EAAG,EAAI,IAAM,UAAY,CAC1CG,EAAOH,EACP,KACF,CAEF,GAAIG,EAAO,EAAG,OAAO,KAErB,MAAMC,EAAO3B,EAAK,UAAU0B,EAAO,GAAI,EAAI,EACrCE,EAAS5B,EAAK,UAAU0B,EAAO,GAAI,EAAI,EAC7C,GAAI,CAACC,GAAQC,IAAW,WAAY,OAAO,KAE3C,MAAMC,EAAK,IAAI,SAAS,MAAMpC,EAAK,MAAMmC,EAAQA,EAASD,CAAI,EAAE,aAAa,EACvEG,EAAU,IAAI,YACpB,IAAIC,EAAI,EAER,KAAOA,EAAI,IAAMF,EAAG,YAAcA,EAAG,UAAUE,EAAG,EAAI,IAAM,UAAY,CACtE,MAAMC,EAASH,EAAG,UAAUE,EAAI,GAAI,EAAI,EAClCE,EAAaJ,EAAG,UAAUE,EAAI,GAAI,EAAI,EACtCG,EAAaL,EAAG,UAAUE,EAAI,GAAI,EAAI,EACtCI,EAAcN,EAAG,UAAUE,EAAI,GAAI,EAAI,EACvCK,GAAgBP,EAAG,UAAUE,EAAI,GAAI,EAAI,EACzCM,GAAcR,EAAG,UAAUE,EAAI,GAAI,EAAI,EAG7C,GAFaD,EAAQ,OAAO,IAAI,WAAWD,EAAG,OAAQA,EAAG,WAAaE,EAAI,GAAIG,CAAU,CAAC,IAE5EV,EAAQ,CAGnB,MAAMc,GAAQ,IAAI,SAAS,MAAM7C,EAAK,MAAM4C,GAAaA,GAAc,EAAE,EAAE,aAAa,EAClFxB,GAAQwB,GAAc,GAAKC,GAAM,UAAU,GAAI,EAAI,EAAIA,GAAM,UAAU,GAAI,EAAI,EAC/EC,GAAO,MAAMxC,EAAQN,EAAK,MAAMoB,GAAOA,GAAQoB,CAAU,CAAC,EAChE,OAAID,IAAW,EAAUO,GACrBP,IAAW,GAAK,OAAO,oBAAwB,IAC1C,MAAMhB,GAAQuB,GAAM,aAAa,EAEnC,IACT,CAEAR,GAAK,GAAKG,EAAaC,EAAcC,EACvC,CACA,OAAO,IACT,CAIA,eAAerC,EAAQyC,EAAiC,CACtD,OAAO,IAAI,WAAW,MAAMA,EAAK,aAAa,CAChD,CAEA,eAAexB,GAAQuB,EAAkBE,EAAwD,CAC/F,MAAMC,EAAS,IAAI,KAAK,CAACH,CAAgB,CAAC,EAAE,OAAA,EAAS,YAAY,IAAI,oBAAoBE,CAAM,CAAC,EAChG,OAAO,IAAI,WAAW,MAAM,IAAI,SAASC,CAAM,EAAE,aAAa,CAChE,CAGA,SAASxC,EAAOQ,EAA2B,CACzC,IAAIK,EAAM,GAEV,QAASQ,EAAI,EAAGA,EAAIb,EAAM,OAAQa,GAAK,MACrCR,GAAO,OAAO,aAAa,GAAGL,EAAM,SAASa,EAAGA,EAAI,KAAK,CAAC,EAE5D,OAAOR,CACT,oTC1LA,MAAM4B,GAAW,CACf,cAAgBC,GAAyB,CACvC,GAAI,CAACA,EAAO,MAAO,CAAA,EACnB,GAAI,CACF,MAAMC,EAAS,KAAK,MAAMD,CAAK,EAC/B,OAAOC,GAAU,OAAOA,GAAW,SAAWA,EAAS,CAAA,CACzD,MAAQ,CACN,eAAQ,KAAK,oEAAoE,EAC1E,CAAA,CACT,CACF,EACA,YAAcD,GAAmB,KAAK,UAAUA,GAAS,CAAA,CAAE,CAC7D,EAGME,GAAW,CACf,cAAgBF,GAA0BA,IAAU,KAAO,GAAOA,IAAU,QAC5E,YAAcA,GAAoBA,EAAQ,KAAO,OACnD,EAwEMG,GAAiD,CACrD,OACA,WACA,cACA,aACA,WACA,UACA,WACA,UACA,cACA,WACA,UACA,UACA,SACA,QACA,SACA,aACA,cACA,WACA,UACA,WACA,QACA,UACA,aACA,SACF,qEAmBaC,QAAAA,oBAANC,GAAA,cAAiCC,EAAAA,UAAW,CAA5C,kCAwRIC,EAAA,KAAAC,EAAgC,MAGhCD,EAAA,KAAAE,EAA8C,CAAA,GAG9CF,EAAA,KAAAG,GAGAH,EAAA,KAAAI,GASAJ,EAAA,KAAAK,EAAmB,QAInBL,EAAA,KAAAM,EAAW,IAIXN,EAAA,KAAAO,EAAc,IAIdP,EAAA,KAAAQ,EAAa,IAIbR,EAAA,KAAAS,EAAW,IAE0BT,EAAA,KAAAU,EAAU,IACTV,EAAA,KAAAW,EAAW,IACrCX,EAAA,KAAAY,EAAU,IACVZ,EAAA,KAAAa,EAAc,IAG0Bb,EAAA,KAAAc,EAAW,IAG1Bd,EAAA,KAAAe,EAA2B,QAC3Bf,EAAA,KAAAgB,EAA2B,GAGpDhB,EAAA,KAAAiB,EAAS,IAYrBjB,EAAA,KAAAkB,EAAmB,CAAA,GAGPlB,EAAA,KAAAmB,EAAS,WAIrBnB,EAAA,KAAAoB,EAAoC,CAAA,GAOpCpB,EAAA,KAAAqB,EAAmC,CAAA,GACoBrB,EAAA,KAAAsB,EAAa,IAG3BtB,EAAA,KAAAuB,EAAc,IAIvDvB,EAAA,KAAAwB,EACwE,MAGxExB,EAAA,KAAAyB,EAA0D,MAGzCzB,EAAA,KAAA0B,EAAsB,CAAA,GACtB1B,EAAA,KAAA2B,EAAS,IACT3B,EAAA,KAAA4B,EAAO,IACP5B,EAAA,KAAA6B,EAAW,IACX7B,EAAA,KAAA8B,EAAU,IA9FpC,IAAS,QAAA,CAAA,OAAAC,EAAA,KAAA9B,EAAA,CAAT,IAAS,OAAA+B,EAAA,CAAAC,EAAA,KAAAhC,EAAA+B,EAAA,CAGT,IAAS,UAAA,CAAA,OAAAD,EAAA,KAAA7B,EAAA,CAAT,IAAS,SAAA8B,EAAA,CAAAC,EAAA,KAAA/B,EAAA8B,EAAA,CAGT,IAAS,OAAA,CAAA,OAAAD,EAAA,KAAA5B,EAAA,CAAT,IAAS,MAAA6B,EAAA,CAAAC,EAAA,KAAA9B,EAAA6B,EAAA,CAGT,IAAS,SAAA,CAAA,OAAAD,EAAA,KAAA3B,EAAA,CAAT,IAAS,QAAA4B,EAAA,CAAAC,EAAA,KAAA7B,EAAA4B,EAAA,CAST,IAAS,MAAA,CAAA,OAAAD,EAAA,KAAA1B,EAAA,CAAT,IAAS,KAAA2B,EAAA,CAAAC,EAAA,KAAA5B,EAAA2B,EAAA,CAIT,IAAS,UAAA,CAAA,OAAAD,EAAA,KAAAzB,EAAA,CAAT,IAAS,SAAA0B,EAAA,CAAAC,EAAA,KAAA3B,EAAA0B,EAAA,CAIT,IAAS,aAAA,CAAA,OAAAD,EAAA,KAAAxB,EAAA,CAAT,IAAS,YAAAyB,EAAA,CAAAC,EAAA,KAAA1B,EAAAyB,EAAA,CAIT,IAAS,YAAA,CAAA,OAAAD,EAAA,KAAAvB,EAAA,CAAT,IAAS,WAAAwB,EAAA,CAAAC,EAAA,KAAAzB,EAAAwB,EAAA,CAIT,IAAS,UAAA,CAAA,OAAAD,EAAA,KAAAtB,EAAA,CAAT,IAAS,SAAAuB,EAAA,CAAAC,EAAA,KAAAxB,EAAAuB,EAAA,CAE4B,IAAS,SAAA,CAAA,OAAAD,EAAA,KAAArB,EAAA,CAAT,IAAS,QAAAsB,EAAA,CAAAC,EAAA,KAAAvB,EAAAsB,EAAA,CACR,IAAS,UAAA,CAAA,OAAAD,EAAA,KAAApB,EAAA,CAAT,IAAS,SAAAqB,EAAA,CAAAC,EAAA,KAAAtB,EAAAqB,EAAA,CACnC,IAAS,SAAA,CAAA,OAAAD,EAAA,KAAAnB,EAAA,CAAT,IAAS,QAAAoB,EAAA,CAAAC,EAAA,KAAArB,EAAAoB,EAAA,CACT,IAAS,aAAA,CAAA,OAAAD,EAAA,KAAAlB,EAAA,CAAT,IAAS,YAAAmB,EAAA,CAAAC,EAAA,KAAApB,EAAAmB,EAAA,CAG+B,IAAS,UAAA,CAAA,OAAAD,EAAA,KAAAjB,EAAA,CAAT,IAAS,SAAAkB,EAAA,CAAAC,EAAA,KAAAnB,EAAAkB,EAAA,CAGxB,IAAS,SAAA,CAAA,OAAAD,EAAA,KAAAhB,EAAA,CAAT,IAAS,QAAAiB,EAAA,CAAAC,EAAA,KAAAlB,EAAAiB,EAAA,CACT,IAAS,SAAA,CAAA,OAAAD,EAAA,KAAAf,EAAA,CAAT,IAAS,QAAAgB,EAAA,CAAAC,EAAA,KAAAjB,EAAAgB,EAAA,CAGlC,IAAS,QAAA,CAAA,OAAAD,EAAA,KAAAd,EAAA,CAAT,IAAS,OAAAe,EAAA,CAAAC,EAAA,KAAAhB,EAAAe,EAAA,CAYrB,IAAS,OAAA,CAAA,OAAAD,EAAA,KAAAb,EAAA,CAAT,IAAS,MAAAc,EAAA,CAAAC,EAAA,KAAAf,EAAAc,EAAA,CAGG,IAAS,QAAA,CAAA,OAAAD,EAAA,KAAAZ,EAAA,CAAT,IAAS,OAAAa,EAAA,CAAAC,EAAA,KAAAd,EAAAa,EAAA,CAIrB,IAAS,UAAA,CAAA,OAAAD,EAAA,KAAAX,EAAA,CAAT,IAAS,SAAAY,EAAA,CAAAC,EAAA,KAAAb,EAAAY,EAAA,CAOT,IAAS,SAAA,CAAA,OAAAD,EAAA,KAAAV,EAAA,CAAT,IAAS,QAAAW,EAAA,CAAAC,EAAA,KAAAZ,EAAAW,EAAA,CAC8C,IAAS,YAAA,CAAA,OAAAD,EAAA,KAAAT,EAAA,CAAT,IAAS,WAAAU,EAAA,CAAAC,EAAA,KAAAX,EAAAU,EAAA,CAGvB,IAAS,aAAA,CAAA,OAAAD,EAAA,KAAAR,EAAA,CAAT,IAAS,YAAAS,EAAA,CAAAC,EAAA,KAAAV,EAAAS,EAAA,CAIlD,IAAS,YAAA,CAAA,OAAAD,EAAA,KAAAP,EAAA,CAAT,IAAS,WAAAQ,EAAA,CAAAC,EAAA,KAAAT,EAAAQ,EAAA,CAIT,IAAS,SAAA,CAAA,OAAAD,EAAA,KAAAN,EAAA,CAAT,IAAS,QAAAO,EAAA,CAAAC,EAAA,KAAAR,EAAAO,EAAA,CAGA,IAAiB,OAAA,CAAA,OAAAD,EAAA,KAAAL,EAAA,CAAjB,IAAiB,MAAAM,EAAA,CAAAC,EAAA,KAAAP,EAAAM,EAAA,CACjB,IAAiB,QAAA,CAAA,OAAAD,EAAA,KAAAJ,EAAA,CAAjB,IAAiB,OAAAK,EAAA,CAAAC,EAAA,KAAAN,EAAAK,EAAA,CACjB,IAAiB,MAAA,CAAA,OAAAD,EAAA,KAAAH,EAAA,CAAjB,IAAiB,KAAAI,EAAA,CAAAC,EAAA,KAAAL,EAAAI,EAAA,CACjB,IAAiB,UAAA,CAAA,OAAAD,EAAA,KAAAF,EAAA,CAAjB,IAAiB,SAAAG,EAAA,CAAAC,EAAA,KAAAJ,EAAAG,EAAA,CACjB,IAAiB,SAAA,CAAA,OAAAD,EAAA,KAAAD,EAAA,CAAjB,IAAiB,QAAAE,EAAA,CAAAC,EAAA,KAAAH,EAAAE,EAAA,CAE1B,IAAI,KAAgC,CAClC,OAAOE,EAAAA,sBAAsB,KAAK,QAAQ,CAC5C,CAGA,IAAI,gBAAwC,CAC1C,OAAO,KAAK,QAAUC,GAAAA,iBAAA,GAAgD,IACxE,CAGA,IAAI,OAA+B,CACjC,OAAO,KAAK,KACd,CAGA,IAAI,SAAkB,CACpB,MAAMC,EAAS,KAAK,MAAM,OAAQC,GAASA,EAAK,SAAW,OAAO,EAClE,OAAKD,EAAO,OACL,KAAK,MAAMA,EAAO,OAAO,CAACE,EAAKD,IAASC,EAAMD,EAAK,QAAS,CAAC,EAAID,EAAO,MAAM,EAD1D,CAE7B,CAIA,MAAa,QACXtC,EAAA,KAAK,WAAW,cAAgC,kBAAkB,IAAlE,MAAAA,EAAqE,OACvE,CASA,IAAI,OAAOL,EAAgC,CACzC,MAAM3D,EAAS,KACf,UAAWyG,KAAO3C,GACZH,GAAS8C,KAAO9C,MAAc8C,CAAG,EAAI9C,EAAM8C,CAAG,EAEtD,CAEA,IAAI,QAAkC,CACpC,MAAMC,EAAS,KACf,OAAO,OAAO,YAAY5C,GAAY,IAAK2C,GAAQ,CAACA,EAAKC,EAAOD,CAAG,CAAC,CAAC,CAAC,CACxE,CAGA,OAAc,CACZ,KAAK,MAAM,QAAQE,CAAc,EACjC,KAAK,MAAQ,CAAA,EACb,KAAK,OAAS,EAChB,CAES,sBAA6B,CACpC,MAAM,qBAAA,EACN,KAAK,MAAM,QAAQA,CAAc,CACnC,CAGA,MAAM,QAAwB,OAC5B,GAAI,KAAK,KAAM,OACf,MAAMC,EAAU,KAAK,MAAM,OAAQL,GAASA,EAAK,SAAW,SAAWA,EAAK,SAAW,OAAO,EAC9F,GAAI,CAACK,EAAQ,OAAQ,OAErB,MAAMC,EAAS,KAAK,eACpB,GAAI,CAACA,EAAQ,CACX,KAAK,KAAK,KAAK,IAAI,WAAW,EAC9B,MACF,CAEA,KAAK,KAAO,GACZ,KAAK,OAAS,GACd,UAAWN,KAAQK,EACjBL,EAAK,OAAS,YACdA,EAAK,QAAU,EACfA,EAAK,MAAQ,GAEf,KAAK,MAAQ,CAAC,GAAG,KAAK,KAAK,EAI3B,MAAMO,MAAY,IACZC,EAASH,EAAQ,IAAKL,GAAS,CACnC,MAAMS,EAAyB,CAAE,KAAMT,EAAK,KAAM,SAAUA,EAAK,KAAK,IAAA,EACtE,OAAI,KAAK,SAAQS,EAAM,OAAS,KAAK,QACjC,KAAK,aAAYA,EAAM,WAAa,IACpCT,EAAK,OAASA,EAAK,KAAK,OAAMS,EAAM,QAAUT,EAAK,MACnD,OAAO,KAAK,KAAK,UAAY,CAAA,CAAE,EAAE,SAAQS,EAAM,SAAW,CAAE,GAAG,KAAK,QAAA,GACpE,OAAO,KAAK,KAAK,SAAW,CAAA,CAAE,EAAE,SAAQA,EAAM,QAAU,CAAE,GAAG,KAAK,OAAA,GACtEF,EAAM,IAAIE,EAAOT,CAAI,EACdS,CACT,CAAC,EAED,GAAI,CACF,MAAMC,EAAS,MAAMJ,EAAO,MAAM,OAAOE,EAAQ,CAC/C,WAAaG,GAA6B,CACxC,MAAMC,EAAML,EAAM,IAAII,EAAS,KAAK,EAC/BC,IACLA,EAAI,QAAUD,EAAS,QACvB,KAAK,MAAQ,CAAC,GAAG,KAAK,KAAK,EAC3B,KAAK,KAAK,6BAA8B,CAAE,KAAMC,EAAK,QAAS,KAAK,QAAS,EAC9E,CAAA,CACD,EAED,UAAWC,KAASH,EAAO,UAAW,CACpC,MAAME,EAAML,EAAM,IAAIM,EAAM,KAAK,EAC5BD,IACLA,EAAI,OAAS,OACbA,EAAI,QAAU,IACdA,EAAI,OAASC,EAAM,KACrB,CACA,UAAWA,KAASH,EAAO,OAAQ,CACjC,MAAME,EAAML,EAAM,IAAIM,EAAM,KAAK,EAC5BD,IACLA,EAAI,OAAS,QACbA,EAAI,MAAQC,EAAM,MAAM,SAAWA,EAAM,MAAM,KACjD,CACA,KAAK,MAAQ,CAAC,GAAG,KAAK,KAAK,EAE3B,MAAMC,EAAYJ,EAAO,UACtB,IAAKG,GAAUN,EAAM,IAAIM,EAAM,KAAK,CAAC,EACrC,OAAO,OAAO,EACXE,EAASL,EAAO,OACnB,IAAKG,GAAUN,EAAM,IAAIM,EAAM,KAAK,CAAC,EACrC,OAAO,OAAO,EAEjB,KAAK,KAAK,6BAA8B,CAAE,UAAAC,EAAW,OAAAC,EAAQ,GAC7DtD,EAAA,KAAK,aAAL,MAAAA,EAAA,UAAkB,CAAE,UAAAqD,EAAW,OAAAC,CAAA,GAE3BA,EAAO,OACT,KAAK,OAAS,KAAK,IAAI,UAEvB,KAAK,SAAA,CAET,OAASC,EAAO,CAEd,UAAWhB,KAAQK,EACjBL,EAAK,OAAS,QACdA,EAAK,MAAQ,GAEf,KAAK,MAAQ,CAAC,GAAG,KAAK,KAAK,EAC3B,KAAK,KAAKiB,GAAaD,CAAK,GAAK,KAAK,IAAI,SAAS,CACrD,QAAA,CACE,KAAK,KAAO,EACd,CACF,CAIQ,QAAQE,EAAmC,CACjD,MAAMhH,EAAYiH,EAAAA,cAAcD,CAAQ,EACxC,GAAI,CAAChH,EAAW,OAAO,KACvB,SAAW,CAACgG,EAAKkB,CAAI,IAAK,OAAO,QAAQ,KAAK,OAAS,CAAA,CAAE,EACvD,GAAIlB,EAAI,cAAc,QAAQ,MAAO,EAAE,IAAMhG,EAAW,OAAOkH,EAEjE,OAAO,IACT,CAEA,MAAc,IAAIC,EAAsC,CAGtD,GAAI,KAAK,OAAS,SAAU,CAC1B,MAAMC,EAAW,KAAK,MAAM,OAAQvF,GAAMA,EAAE,SAAW,QAAUA,EAAE,SAAW,OAAO,EACrFuF,EAAS,QAAQlB,CAAc,EAC/B,KAAK,MAAQ,KAAK,MAAM,OAAQrE,GAAM,CAACuF,EAAS,SAASvF,CAAC,CAAC,CAC7D,CACA,MAAMwF,EAAQ,KAAK,SAAW,EAAI,KAAK,SAAW,OAAO,kBACnDC,EAAO,CAAC,GAAG,KAAK,KAAK,EACrBC,EAASD,EAAK,OACdE,EAAuB,CAAA,EAC7B,IAAIC,EAAU,GAEd,UAAW1H,KAAQ,MAAM,KAAKoH,CAAI,EAAG,CACnC,GAAIG,EAAK,QAAUD,EAAO,CACxBI,EAAUC,EAAAA,KAAK,KAAK,IAAI,WAAY,CAAE,IAAKL,EAAO,EAClD,KACF,CACA,GAAI,KAAK,QAAU,CAACM,EAAAA,YAAY,KAAK,OAAQ5H,EAAK,KAAMA,EAAK,IAAI,EAAG,CAClE0H,EAAUC,EAAAA,KAAK,KAAK,IAAI,QAAS,CAAE,KAAM3H,EAAK,KAAM,EACpD,QACF,CAGA,MAAMmH,EAAO,KAAK,QAAQnH,EAAK,IAAI,EAC7B6H,EAAWC,EAAAA,WAAUX,GAAA,YAAAA,EAAM,UAAW,KAAK,OAAO,EAClDY,EAAWD,EAAAA,WAAUX,GAAA,YAAAA,EAAM,UAAW,KAAK,OAAO,EACxD,GAAIU,GAAY7H,EAAK,KAAO6H,EAAU,CACpCH,EAAUC,EAAAA,KAAK,KAAK,IAAI,YAAa,CAAE,KAAM3H,EAAK,KAAM,KAAMgI,aAAWH,CAAQ,CAAA,CAAG,EACpF,QACF,CACA,GAAIE,GAAY/H,EAAK,KAAO+H,EAAU,CACpCL,EAAUC,EAAAA,KAAK,KAAK,IAAI,YAAa,CAAE,KAAM3H,EAAK,KAAM,KAAMgI,aAAWD,CAAQ,CAAA,CAAG,EACpF,QACF,CACA,MAAM9B,EAAMgC,EAAAA,QAAQjI,CAAI,EACxB,GAAIuH,EAAK,KAAMxB,IAASA,GAAK,MAAQE,CAAG,EAAG,CACzCyB,EAAUC,EAAAA,KAAK,KAAK,IAAI,aAAc,CAAE,KAAM3H,EAAK,KAAM,EACzD,QACF,CAEA,MAAM+F,EAAmB,CACvB,IAAAE,EACA,KAAAjG,EACA,KAAMA,EAAK,KAGX,OAAQ,KAAK,gBAAgBmH,EAAMnH,EAAK,IAAI,EAAI,WAAa,QAC7D,QAAS,EACT,MAAO,GACP,OAAQ,KACR,MAAO,KACP,UAAW,KACX,QAASkI,GAAWlI,CAAI,CAAA,EAE1BuH,EAAK,KAAKxB,CAAI,EACd0B,EAAO,KAAK1B,CAAI,CAClB,CAEA,KAAK,OAAS2B,EACVA,GAAS,KAAK,KAAK,6BAA8B,CAAE,QAASA,EAAS,EACrEH,EAAK,SAAWC,IAEpB,KAAK,MAAQD,EACb,KAAK,KAAK,6BAA8B,CAAE,MAAO,KAAK,MAAO,EAE7D,MAAM,QAAQ,IACZE,EACG,OAAQ1B,GAASA,EAAK,SAAW,UAAU,EAC3C,IAAKA,GAAS,KAAK,QAAQA,EAAM,KAAK,QAAQA,EAAK,KAAK,IAAI,CAAE,CAAC,CAAA,GAGhE,KAAK,YAAc,KAAK,OAAS,WAAe,KAAK,OAAA,EAC3D,CAEQ,gBAAgBoB,EAAuBF,EAA2B,CAExE,MADI,CAACE,GACD,CAAC/G,GAAc8G,EAAAA,cAAcD,CAAQ,CAAC,EAAU,GAC7CE,EAAK,WAAa,QAAaA,EAAK,iBAAmB,EAChE,CAOA,MAAc,QAAQpB,EAAkBoB,EAA+B,CACrE,MAAMgB,EAAQ,MAAMpI,GAAYgG,EAAK,KAAMmB,EAAAA,cAAcnB,EAAK,KAAK,IAAI,CAAC,EACxEA,EAAK,MAAQoC,EAAM,MACnBpC,EAAK,UAAYoC,EAAM,UAEvB,IAAIT,EAAU,GACVP,EAAK,iBAAmB,IAASgB,EAAM,YAAc,GACvDT,EAAUC,EAAAA,KAAK,KAAK,IAAI,aAAc,CAAE,KAAM5B,EAAK,KAAM,EAChDoB,EAAK,UAAYgB,EAAM,QAAU,MAAQA,EAAM,MAAQhB,EAAK,WACrEO,EAAUC,EAAAA,KAAK,KAAK,IAAI,gBAAiB,CACvC,KAAM5B,EAAK,KACX,MAAOoC,EAAM,MACb,IAAKhB,EAAK,QAAA,CACX,GAGCO,GACFvB,EAAeJ,CAAI,EACnB,KAAK,MAAQ,KAAK,MAAM,OAAQ0B,GAAWA,IAAW1B,CAAI,EAC1D,KAAK,OAAS2B,EACd,KAAK,KAAK,6BAA8B,CAAE,QAASA,EAAS,IAE5D3B,EAAK,OAAS,QACd,KAAK,MAAQ,CAAC,GAAG,KAAK,KAAK,EAE/B,CAGQ,WAAWE,EAAmB,CACpC,KAAK,MAAM,OAAQF,GAASA,EAAK,MAAQE,CAAG,EAAE,QAAQE,CAAc,EACpE,KAAK,MAAQ,KAAK,MAAM,OAAQJ,GAASA,EAAK,MAAQE,CAAG,EACzD,KAAK,OAAS,EAChB,CAEQ,aAAaF,EAAkBqC,EAAqB,CAC1DrC,EAAK,KAAOsC,EAAAA,uBAAuBtC,EAAK,KAAK,KAAMqC,CAAK,EACxD,KAAK,QAAU,GACf,KAAK,MAAQ,CAAC,GAAG,KAAK,KAAK,CAC7B,CAEQ,KAAKE,EAAuB,OAClC,KAAK,OAASA,EACd,KAAK,KAAK,0BAA2B,CAAE,QAAAA,CAAA,CAAS,GAChD9E,EAAA,KAAK,UAAL,MAAAA,EAAA,UAAe,CAAE,QAAA8E,GACnB,CAEQ,KAAKC,EAAcC,EAAuB,CAChD,KAAK,cAAc,IAAI,YAAYD,EAAM,CAAE,OAAAC,EAAQ,QAAS,GAAM,SAAU,EAAA,CAAM,CAAC,CACrF,CAEQ,UAAiB,CACvB,GAAI,CAAC,KAAK,aAAe,OAAO,SAAa,IAAa,OAC1D,MAAMhJ,EAASL,GAAsB,KAAK,YAAa,SAAS,KAAOsJ,GACrE,QAAQ,KAAK,yBAAyBA,CAAM,EAAE,CAAA,EAE5CjJ,GAAQ,SAAS,OAAOA,CAAM,CACpC,CAGQ,OAAOkJ,EAAoB,OACjC,MAAMlC,EAAQkC,EAAM,QAChBlF,EAAAgD,EAAM,QAAN,MAAAhD,EAAa,QAAQ,KAAK,IAAIgD,EAAM,KAAK,EAE7CA,EAAM,MAAQ,EAChB,CAEQ,OAAOkC,EAAwB,OACrCA,EAAM,eAAA,EACN,KAAK,SAAW,GAChB,MAAMC,GAAUnF,EAAAkF,EAAM,eAAN,YAAAlF,EAAoB,MAChCmF,GAAA,MAAAA,EAAS,QAAQ,KAAK,IAAIA,CAAO,CACvC,CAEQ,WAAWD,EAAwB,CACzCA,EAAM,eAAA,EACN,KAAK,SAAW,EAClB,CAEQ,aAAoB,CAC1B,KAAK,SAAW,EAClB,CAGA,IAAY,YAAsB,CAChC,OAAO,KAAK,UAAY,GAAK,KAAK,MAAM,OAAS,KAAK,QACxD,CAGA,IAAY,UAAoB,CAC9B,OAAO,KAAK,MAAM,KAAM3C,GAASA,EAAK,SAAW,UAAU,CAC7D,CAEA,IAAY,cAAuB,CACjC,OAAO,KAAK,MAAM,OAAQA,GAASA,EAAK,SAAW,SAAWA,EAAK,SAAW,OAAO,EAAE,MACzF,CAEA,IAAY,MAAe,CACzB,MAAM6C,EAAQC,EAAAA,cAAc,KAAK,MAAM,EACjChB,EAAWC,EAAAA,UAAU,KAAK,OAAO,EACjC5F,EAAO2F,EAAWF,EAAAA,KAAK,KAAK,IAAI,SAAU,CAAE,KAAMK,EAAAA,WAAWH,CAAQ,CAAA,CAAG,EAAI,GAClF,MAAO,CAACe,EAAO1G,CAAI,EAAE,OAAO,OAAO,EAAE,KAAK,KAAK,CACjD,CAEQ,aAAc,CACpB,OAAO4G;;;kBAGO,KAAK,WAAa,CAAC;AAAA,eACtB,KAAK,QAAUC,EAAAA,OAAO;AAAA,gBACrB,KAAK,MAAM;AAAA,OAEzB,CAEQ,YAAa,CACnB,OAAI,KAAK,QACAD;;cAEC,KAAK,OAAO;AAAA,cACZ,KAAK,UAAY,MAAM;AAAA;AAAA,UAI7B,KAAK,SAAiBA,EAAAA,2CAA2C,KAAK,QAAQ,SAC3EC,EAAAA,OACT,CAEQ,gBAAiB,CACvB,OAAK,KAAK,SACHD;;WAEA,KAAK,IAAI,aAAa;AAAA;AAAA,YAHFC,EAAAA,OAM7B,CAEQ,cAAe,CACrB,OAAK,KAAK,OACHD,EAAAA,qDAAqD,KAAK,MAAM,SAD9CC,EAAAA,OAE3B,CAEQ,aAAc,CACpB,GAAI,CAAC,KAAK,MAAM,OAAQ,OAAOA,EAAAA,QAC/B,MAAMC,EAAW,KAAK,MAAM,SAAW,EAAI,KAAK,IAAI,SAAW,KAAK,IAAI,UACxE,OAAOF;QACHnB,OAAKqB,EAAU,CAAE,EAAG,KAAK,MAAM,OAAQ,IAAK,KAAK,SAAU,CAAC;AAAA,WAElE,CAEQ,aAAajD,EAA0B,CAC7C,MAAM7D,EAAO8F,EAAAA,WAAWjC,EAAK,KAAK,IAAI,EACtC,GAAIA,EAAK,SAAW,WAAY,MAAO,GAAG7D,CAAI,MAAM,KAAK,IAAI,QAAQ,GACrE,GAAI6D,EAAK,SAAW,YAAa,MAAO,GAAG7D,CAAI,MAAM,KAAK,IAAI,SAAS,GACvE,GAAI6D,EAAK,SAAW,OAAQ,MAAO,GAAG7D,CAAI,MAAM,KAAK,IAAI,QAAQ,GACjE,GAAI6D,EAAK,SAAW,QAClB,MAAO,GAAG7D,CAAI,MAAM6D,EAAK,OAAS,KAAK,IAAI,WAAW,GAGxD,MAAMpF,EAAQoF,EAAK,MAAQ,MAAM4B,EAAAA,KAAK,KAAK,IAAI,WAAY,CAAE,EAAG5B,EAAK,KAAA,CAAO,CAAC,GAAK,GAClF,OAAO7D,EAAOvB,CAChB,CAEQ,UAAUoF,EAAkB,CAClC,MAAMkD,EAAW,KAAK,aAAelD,EAAK,SAAW,QACrC,OAAAA,EAAK,SAAW,aAAeA,EAAK,OAC7C+C;;UAGD/C,EAAK,QACD+C,EAAAA,8BAA8B/C,EAAK,OAAO,4BAC1CmD,EAAAA,YAAYnD,EAAK,IAAI,GAAK,MAChC;AAAA;AAAA;AAAA,UAIE,KAAK,UAAYA,EAAK,IAClB+C,EAAAA;AAAAA;AAAAA,yBAEW/C,EAAK,IAAI;AAAA;AAAA,2BAEN2C,GAAyB,CAC/BA,EAAM,MAAQ,QAChB,KAAK,aAAa3C,EAAO2C,EAAM,OAA4B,KAAK,EACvDA,EAAM,MAAQ,WACvB,KAAK,QAAU,GAEnB,CAAC;AAAA,wBACQA,GACP,KAAK,aAAa3C,EAAO2C,EAAM,OAA4B,KAAK,CAAC;AAAA,kBAErEO,EACEH;;0BAEU,KAAK,IAAI,MAAM;AAAA,2BACd,IAAM,CACb,KAAK,QAAU/C,EAAK,GACtB,CAAC;AAAA;AAAA,oBAECA,EAAK,IAAI;AAAA,2BAEb+C,EAAAA,yBAAyB/C,EAAK,IAAI,QAC1C;AAAA,qCAC6BA,EAAK,MAAM,IAAI,KAAK,aAAaA,CAAI,CAAC;AAAA,UAEjEA,EAAK,SAAW,YACZ+C;qDACuC/C,EAAK,OAAO;AAAA,sBAEnDgD,EAAAA,OACN;AAAA;AAAA;AAAA,UAIEhD,EAAK,SAAW,QACZ+C,EAAAA,sCAAsC,IAAM,KAAK,KAAK,QAAQ;AAAA,kBAC1D,KAAK,IAAI,KAAK;AAAA,yBAElBC,EAAAA,OACN;AAAA,UAEEhD,EAAK,SAAW,aAAeA,EAAK,SAAW,OAC3CgD,EAAAA,QACAD,EAAAA,sCAAsC,IAAM,KAAK,WAAW/C,EAAK,GAAG,CAAC;AAAA,kBACjE,KAAK,IAAI,MAAM;AAAA,wBAEzB;AAAA;AAAA,WAGN,CAEQ,YAAa,CACnB,OAAK,KAAK,MAAM,OACT+C;QACH,KAAK,MAAM,IAAK/C,GAAS,KAAK,UAAUA,CAAI,CAAC,CAAC;AAAA,YAFnBgD,EAAAA,OAIjC,CAEQ,gBAAiB,CACvB,OAAOD,EAAAA,mDAAmD,OAAO,KAAK,QAAQ,CAAC;AAAA;AAAA,gCAEnD,KAAK,IAAI,SAAS;AAAA,oCACd,KAAK,IAAI,IAAI,KAAK,IAAI,OAAO;AAAA,QACzD,KAAK,KAAOA,2BAAyB,KAAK,IAAI,SAAWC,EAAAA,OAAO;AAAA,WAEtE,CAEQ,iBAAkB,CACxB,MAAMI,EAAI,KAAK,aAGf,GAAI,KAAK,YAAe,CAACA,GAAK,CAAC,KAAK,KAAO,OAAOJ,EAAAA,QAClD,MAAMC,EAAWG,IAAM,EAAI,KAAK,IAAI,aAAe,KAAK,IAAI,cAC5D,OAAOL;;;kBAGO,KAAK,MAAQ,KAAK,QAAQ;AAAA,eAC7B,IAAM,KAAK,KAAK,OAAA,CAAQ;AAAA;AAAA,QAE/B,KAAK,KAAO,KAAK,IAAI,UAAYnB,OAAKqB,EAAU,CAAE,EAAAG,EAAG,CAAC;AAAA,cAE5D,CAMQ,YAAa,CACnB,MAAMC,EAAW,KAAK,UAAY,CAAC,KAAK,MAAM,QAAU,KAAK,WAC7D,OAAON;;;kBAGO,KAAK,UAAU;AAAA,mBACd,KAAK,WAAW;AAAA,cACrB,KAAK,MAAM;AAAA;AAAA,QAGjB,KAAK,SAAW,KAAK,UAAY,KAAK,SAAW,KAAK,YAClDA;gBACI,KAAK,YAAY;AAAA,gBACjB,KAAK,QAAUA,4BAA0B,KAAK,OAAO,SAAWC,EAAAA,OAAO;AAAA,gBACvE,KAAK,YAAcD,0BAAwB,KAAK,WAAW,SAAWC,EAAAA,OAAO;AAAA,oBAEjFA,EAAAA,OACN;AAAA,QACE,KAAK,YAAA,CAAa,IAAI,KAAK,cAAc,IAAI,KAAK,WAAA,CAAY;AAAA,QAC9DK,EAAW,KAAK,eAAA,EAAmBL,EAAAA,OAAO;AAAA,QAE1C,CAACK,GAAY,KAAK,WACdN,EAAAA,uCAAuC,KAAK,IAAI,IAAI,KAAK,IAAI,OAAO,YACpEC,EAAAA,OACN;AAAA,QACE,KAAK,gBAAA,CAAiB,IAAI,KAAK,gBAAgB;AAAA,WAErD,CAEQ,eAAgB,CACtB,OAAOD;;;kBAGO,KAAK,UAAU;AAAA,mBACd,KAAK,WAAW;AAAA,cACrB,KAAK,MAAM;AAAA;AAAA;AAAA,kCAGS,KAAK,SAAW,KAAK,IAAI,WAAW;AAAA,8BACxC,KAAK,MAAM,MAAM,MAAM,KAAK,QAAQ;AAAA;AAAA,QAG1D,KAAK,SACDA,EAAAA,oDAAoD,OAAO,KAAK,QAAQ,CAAC;AAAA,0CAC3C,KAAK,IAAI,YAAY;AAAA,oDACX,CAAC,KAAK,UAAU,WAAW,KAAK,IAAI;AAAA,kBACtE,KAAK,IAAI,WAAW;AAAA;AAAA,oBAG1BA,EAAAA,2CAA2C,CAAC,KAAK,UAAU,WAAW,KAAK,IAAI;AAAA,gBAC3E,KAAK,IAAI,WAAW;AAAA,sBAE9B;AAAA,QACE,KAAK,KAAOA,EAAAA,yBAAyB,KAAK,IAAI,SAAWC,EAAAA,OAAO,IAAI,KAAK,aAAA,CAAc;AAAA,QACvF,KAAK,WAAA,CAAY,IAAI,KAAK,iBAAiB,IAAI,KAAK,eAAA,CAAgB;AAAA,WAE1E,CAEQ,cAAe,CACrB,MAAMjD,EAAS,KAAK,MAAM,KAAK,MAAM,OAAS,CAAC,EAC/C,OAAOgD;0CAC+B,KAAK,MAAQ,CAAC,KAAK,UAAU,WAAW,KAAK,IAAI;AAAA,UACjF,KAAK,KAAO,KAAK,IAAI,UAAY,KAAK,IAAI,UAAU;AAAA;AAAA,QAGtDhD,GAAUA,EAAO,SAAW,QACxBgD,EAAAA,kCAAkChD,EAAO,MAAM,IAAI,KAAK,aAAaA,CAAM,CAAC,SAC5EiD,EAAAA,OACN;AAAA,QACE,KAAK,cAAc;AAAA,WAEzB,CAES,QAAS,CAChB,OAAOD,EAAAA,OAAO,KAAK,YAAA,CAAa,GAC9B,KAAK,OAAS,SACV,KAAK,eACL,KAAK,OAAS,UACZ,KAAK,gBACL,KAAK,YACb,EACF,CACF,EAhrBWnF,EAAA,YAGAC,EAAA,YAGAC,EAAA,YAGAC,EAAA,YASAC,EAAA,YAIAC,EAAA,YAIAC,EAAA,YAIAC,EAAA,YAIAC,EAAA,YAEqCC,EAAA,YACCC,EAAA,YAC1BC,EAAA,YACAC,EAAA,YAGwCC,EAAA,YAGfC,EAAA,YACAC,EAAA,YAGzBC,EAAA,YAYZC,EAAA,YAGYC,EAAA,YAIZC,EAAA,YAOAC,EAAA,YACuDC,EAAA,YAGdC,EAAA,YAIzCC,EAAA,YAIAC,EAAA,YAGiBC,EAAA,YACAC,EAAA,YACAC,EAAA,YACAC,EAAA,YACAC,EAAA,YAtXrBhC,IACL6F,GADW9F,QAAAA,mBACJ,SAAS,CACd+F,EAAAA,cACArK,GACAC,EAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;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"}
|