@optionfactory/ful 0.32.0 → 0.34.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.
@@ -1 +1 @@
1
- {"version":3,"file":"ful.min.mjs","sources":["../src/encodings.mjs","../src/observable.mjs","../src/http-client.mjs","../src/storage.mjs","../src/oauth-authorization-code.mjs","../src/timing.mjs","../src/elements/elements.mjs","../src/elements/errors.mjs","../src/elements/form.mjs","../src/elements/input.mjs","../src/elements/select.mjs","../src/elements/radio.mjs","../src/elements/spinner.mjs","../src/elements/wizard.mjs","../src/app.mjs"],"sourcesContent":["\n\nclass Base64 {\n static encode(arrayBuffer, dialect) {\n const d = dialect || Base64.URL_SAFE;\n const len = arrayBuffer.byteLength;\n const view = new Uint8Array(arrayBuffer);\n let res = '';\n for (let i = 0; i < len; i += 3) {\n const v1 = d[view[i] >> 2];\n const v2 = d[((view[i] & 3) << 4) | (view[i + 1] >> 4)];\n const v3 = d[((view[i + 1] & 15) << 2) | (view[i + 2] >> 6)];\n const v4 = d[view[i + 2] & 63];\n res += v1 + v2 + v3 + v4;\n }\n if (len % 3 === 2) {\n res = res.substring(0, res.length - 1);\n } else if (len % 3 === 1) {\n res = res.substring(0, res.length - 2);\n }\n return res;\n }\n static decode(str, dialect) {\n const d = dialect || Base64.URL_SAFE;\n let nbytes = Math.floor(str.length * 0.75);\n for (let i = 0; i !== str.length; ++i) {\n if (str[str.length - i - 1] !== '=') {\n break;\n }\n --nbytes;\n }\n const view = new Uint8Array(nbytes);\n\n let vi = 0;\n let si = 0;\n while (vi < str.length * 0.75) {\n const v1 = d.indexOf(str.charAt(si++));\n const v2 = d.indexOf(str.charAt(si++));\n const v3 = d.indexOf(str.charAt(si++));\n const v4 = d.indexOf(str.charAt(si++));\n view[vi++] = (v1 << 2) | (v2 >> 4);\n view[vi++] = ((v2 & 15) << 4) | (v3 >> 2);\n view[vi++] = ((v3 & 3) << 6) | v4;\n }\n\n return view.buffer;\n }\n}\n\nBase64.STANDARD = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nBase64.URL_SAFE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\n\n\nclass Hex {\n static decode(hex) {\n if (hex.length % 2 !== 0) {\n throw new Error(\"invalid length\");\n }\n const lenInBytes = hex.length / 2;\n return new Uint8Array(lenInBytes).map((e, i) => {\n const offset = i * 2;\n const octet = hex.substring(offset, offset + 2);\n return parseInt(octet, 16);\n });\n }\n static encode(bytes, upper) {\n return Array.from(bytes)\n .map(b => b.toString(16))\n .map(b => upper ? b.toUpperCase() : b)\n .map(o => o.padStart(2, 0))\n .join('');\n }\n}\n\nexport { Base64, Hex };","\nconst Observable = (SuperClass) => class extends SuperClass {\n constructor(...args) {\n super(...args)\n this.listeners = {};\n }\n fireSync(event, data, initialAcc) {\n const listeners = this.listeners[event] || [];\n let acc = initialAcc;\n for (const l of listeners) {\n acc = l(data, this, acc);\n }\n return acc;\n }\n async fire(event, data, initialAcc) {\n const listeners = this.listeners[event] || [];\n let acc = initialAcc;\n for (const l of listeners) {\n acc = await l(data, this, acc);\n }\n return acc;\n }\n on(event, listener) {\n this.listeners[event] = this.listeners[event] || [];\n this.listeners[event].push(listener);\n }\n un(event, listener) {\n const listeners = this.listeners[event] || [];\n const idx = listeners.indexOf(listener);\n return idx === -1 ? [] : listeners.splice(idx, 1);\n } \n}\n\n\nexport { Observable };","class ContextInterceptor {\n constructor() {\n const context = document.querySelector(\"meta[name='context']\").getAttribute(\"content\");\n this.context = context.endsWith(\"/\") ? context.substring(0, context.length - 1) : context;\n }\n async intercept(request, chain){\n const separator = request.resource.startsWith(\"/\") ? \"\" : \"/\";\n request.resource = this.context + separator + request.resource;\n return await chain.proceed(request);\n }\n}\n\nclass CsrfTokenInterceptor {\n constructor() {\n this.k = document.querySelector(\"meta[name='_csrf_header']\").getAttribute(\"content\");\n this.v = document.querySelector(\"meta[name='_csrf']\").getAttribute(\"content\");\n }\n async intercept(request, chain){\n const headers = new Headers(request.options.headers);\n headers.set(this.k, this.v);\n request.options.headers = headers;\n return await chain.proceed(request);\n }\n}\n\nclass RedirectOnUnauthorizedInterceptor {\n constructor(redirectUri) {\n this.redirectUri = redirectUri;\n }\n async intercept(request, chain){\n const response = await chain.proceed(request);\n if (response.status !== 401) {\n return response;\n }\n window.location.href = this.redirectUri;\n }\n}\n\nclass Failure extends Error {\n static parseProblems(status, text) {\n const def = [{\n type: \"GENERIC_PROBLEM\",\n context: null,\n reason: `${status}: ${text}`,\n details: null\n }];\n try {\n return text ? JSON.parse(text) : def;\n } catch (e) {\n return def;\n }\n }\n static fromResponse(status, text) {\n return new Failure(status, Failure.parseProblems(status, text));\n }\n constructor(status, problems) {\n super(JSON.stringify(problems));\n this.name = `Failure:${status}`;\n this.status = status;\n this.problems = problems;\n }\n}\n\nclass HttpClientBuilder {\n constructor() {\n this.interceptors = [];\n }\n withContext() {\n this.interceptors.push(new ContextInterceptor());\n return this;\n }\n withCsrfToken() {\n this.interceptors.push(new CsrfTokenInterceptor());\n return this;\n }\n withRedirectOnUnauthorized(redirectUri) {\n this.interceptors.push(new RedirectOnUnauthorizedInterceptor(redirectUri));\n return this;\n }\n withInterceptors(...interceptors) {\n this.interceptors.push(...interceptors);\n return this;\n }\n build() {\n const interceptors = this.interceptors;\n return new HttpClient({interceptors});\n }\n}\n\nclass HttpCall {\n async intercept(request, chain){\n return await fetch(request.resource, request.options);\n } \n}\n\nclass HttpInterceptorChain {\n constructor(interceptors, current){\n this.interceptors = interceptors;\n this.current = current;\n }\n async proceed(request){\n const interceptor = this.interceptors[this.current];\n return await interceptor.intercept(request, new HttpInterceptorChain(this.interceptors, this.current + 1));\n }\n}\n\n\nclass HttpClient {\n static builder() {\n return new HttpClientBuilder();\n }\n constructor({interceptors}){\n this.interceptors = interceptors || [];\n }\n async exchange(resource, options) {\n const opts = options || {};\n const interceptors = [...this.interceptors, ...opts.interceptors || [], new HttpCall()];\n const chain = new HttpInterceptorChain(interceptors, 0);\n return await chain.proceed({resource, options: opts});\n }\n async fetch(resource, options) {\n const response = await this.exchange(resource, options);\n if (!response.ok) {\n const message = await response.text();\n throw Failure.fromResponse(response.status, message);\n } \n return response;\n }\n async json(resource, options) {\n try {\n const response = await this.fetch(resource, options);\n const text = await response.text();\n return text ? JSON.parse(text) : undefined;\n } catch (e) {\n if (e instanceof Failure) {\n throw e;\n }\n throw new Failure(0, [{\n type: \"CONNECTION_PROBLEM\",\n context: null,\n reason: e.message,\n details: null\n }]);\n }\n }\n}\n\nfunction jsonRequest(method, body, headers){\n return {\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers\n },\n method: method,\n body: JSON.stringify(body) \n }\n}\nfunction jsonPost(body, headers){\n return jsonRequest('POST', body, headers);\n}\nfunction jsonPut(body, headers){\n return jsonRequest('PUT', body, headers);\n}\nfunction jsonPatch(body, headers){\n return jsonRequest('PATCH', body, headers);\n}\n\n\nexport { HttpClient, Failure, jsonRequest, jsonPost, jsonPut, jsonPatch };\n","\nclass Storage {\n constructor(prefix, storage) {\n this.prefix = prefix;\n this.storage = storage;\n }\n save(k, v) {\n this.storage.setItem(`${this.prefix}-${k}`, JSON.stringify(v));\n }\n load(k) {\n const got = this.storage.getItem(`${this.prefix}-${k}`);\n return got === undefined ? undefined : JSON.parse(got);\n }\n remove(k) {\n this.storage.removeItem(`${this.prefix}-${k}`);\n }\n pop(k) {\n const decoded = this.load(k);\n this.remove(k);\n return decoded;\n }\n}\n\nclass LocalStorage extends Storage {\n constructor(prefix) {\n super(prefix, localStorage);\n }\n}\n\nclass SessionStorage extends Storage {\n constructor(prefix) {\n super(prefix, sessionStorage);\n }\n}\n\nclass VersionedStorage {\n constructor(storage, key, dataSupplier){\n this.storage = storage;\n this.key = key;\n this.dataSupplier = dataSupplier;\n this.cache = null;\n \n }\n async load(revision){\n const saved = this.storage.load(this.key);\n if (!!saved && saved.revision === revision) {\n this.cache = saved.value;\n return;\n }\n const freshData = await this.dataSupplier(revision, this.key);\n this.storage.save(this.key, {\n revision: revision,\n value: freshData\n });\n this.cache = freshData;\n }\n data(){\n return this.cache;\n }\n}\n\n\n\nexport {LocalStorage, SessionStorage, VersionedStorage};","import { Base64 } from \"./encodings.mjs\";\nimport { SessionStorage } from \"./storage.mjs\";\n\n\nclass AuthorizationCodeFlow {\n static forKeycloak(clientId, realmBaseUrl, redirectUri){\n const scope = \"openid profile\";\n return new AuthorizationCodeFlow(clientId, scope, {\n auth: new URL(\"protocol/openid-connect/auth\", realmBaseUrl),\n token: new URL(\"protocol/openid-connect/token\", realmBaseUrl),\n logout: new URL(\"protocol/openid-connect/logout\", realmBaseUrl),\n registration: new URL(\"protocol/openid-connect/registrations\", realmBaseUrl),\n redirect: redirectUri\n }); \n }\n constructor(clientId, scope, {auth, token, registration, logout, redirect}) {\n this.storage = new SessionStorage(clientId);\n this.clientId = clientId;\n this.scope = scope;\n this.uri = {auth, token, registration, logout, redirect};\n }\n async action(uri, additionalParams){\n const pkceVerifier = Base64.encode(crypto.getRandomValues(new Uint8Array(32)).buffer);\n const pkceChallenge = Base64.encode(await crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(pkceVerifier)));\n const state = this.clientId + Base64.encode(crypto.getRandomValues(new Uint8Array(16)).buffer);\n this.storage.save(AuthorizationCodeFlow.PKCE_AND_STATE_KEY, {\n state: state,\n verifier: pkceVerifier\n });\n const url = new URL(uri);\n url.searchParams.set(\"client_id\", this.clientId);\n url.searchParams.set(\"redirect_uri\", this.uri.redirect);\n url.searchParams.set(\"response_type\", 'code');\n url.searchParams.set(\"scope\", this.scope);\n url.searchParams.set(\"state\", state);\n url.searchParams.set(\"code_challenge\", pkceChallenge);\n url.searchParams.set(\"code_challenge_method\", 'S256');\n Object.entries(additionalParams || {}).forEach(kv => {\n url.searchParams.set(kv[0], kv[1]);\n });\n window.location = url;\n }\n async registration(additionalParams){\n await this.action(this.uri.registration, additionalParams);\n }\n async applicationInitiatedAction(kcAction){\n await this.action(this.uri.auth, {\n kc_action: kcAction\n });\n }\n async _tokenExchange(code, state) {\n window.history.replaceState('', \"\", this.uri.redirect);\n const stateAndVerifier = this.storage.pop(AuthorizationCodeFlow.PKCE_AND_STATE_KEY);\n if (stateAndVerifier.state !== state) {\n throw new Error(\"State mismatch\");\n }\n const response = await fetch(this.uri.token, {\n method: \"POST\",\n headers: {\n \"Content-Type\": 'application/x-www-form-urlencoded'\n },\n body: new URLSearchParams([\n [\"client_id\", this.clientId],\n [\"code\", code],\n [\"grant_type\", \"authorization_code\"],\n [\"code_verifier\", stateAndVerifier.verifier],\n [\"state\", stateAndVerifier.state],\n [\"redirect_uri\", this.uri.redirect]\n ])\n });\n if (!response.ok) {\n const text = await response.text();\n throw new Error(\"Error:\" + response.status + \": \" + text);\n }\n const token = await response.json();\n return new AuthorizationCodeFlowSession(this.clientId, token, this.uri);\n }\n async ensureLoggedIn() {\n const url = new URL(window.location.href);\n const code = url.searchParams.get(\"code\");\n if (code && this.storage.load(AuthorizationCodeFlow.PKCE_AND_STATE_KEY)) {\n //if callback from keycloak and we have our state still stored\n const state = url.searchParams.get(\"state\");\n return await this._tokenExchange(code, state);\n }\n //if not authorized\n await this.action(this.uri.auth, {});\n return null;\n }\n}\nAuthorizationCodeFlow.PKCE_AND_STATE_KEY = \"state-and-verifier\";\n\nclass AuthorizationCodeFlowSession {\n static parseToken(token) {\n const [rawHeader, rawPayload, signature] = token.split(\".\");\n const ut8decoder = new TextDecoder(\"utf-8\");\n return {\n header: JSON.parse(ut8decoder.decode(Base64.decode(rawHeader, Base64.STANDARD))),\n payload: JSON.parse(ut8decoder.decode(Base64.decode(rawPayload, Base64.STANDARD))),\n signature: signature\n };\n } \n constructor(clientId, t, {token, logout, redirect}) {\n this.clientId = clientId;\n this.token = t;\n this.accessToken = AuthorizationCodeFlowSession.parseToken(t.access_token);\n this.refreshToken = AuthorizationCodeFlowSession.parseToken(t.refresh_token);\n this.uri = { token, logout, redirect }\n this.refreshCallback = null;\n }\n onRefresh(callback) {\n this.refreshCallback = callback;\n }\n async refresh() {\n const response = await fetch(this.uri.token, {\n method: \"POST\",\n headers: {\n \"Content-Type\": 'application/x-www-form-urlencoded'\n },\n body: new URLSearchParams([\n [\"client_id\", this.clientId],\n [\"grant_type\", \"refresh_token\"],\n [\"refresh_token\", this.token.refresh_token]\n ])\n });\n if (!response.ok) {\n throw new Error(\"Error:\" + response.status + \": \" + response.text());\n }\n const token = await response.json();\n this.token = token;\n this.accessToken = AuthorizationCodeFlowSession.parseToken(token.access_token);\n this.refreshToken = AuthorizationCodeFlowSession.parseToken(token.refresh_token);\n if (this.refreshCallback) {\n this.refreshCallback(this.token, this.accessToken, this.refreshToken);\n }\n }\n shouldBeRefreshed(gracePeriod) {\n const now = new Date().getTime();\n const refreshTokenExpiresAt = this.refreshToken.payload.exp * 1000;\n const expired = now > refreshTokenExpiresAt;\n const shouldRefresh = now - gracePeriod > refreshTokenExpiresAt;\n return !expired && shouldRefresh;\n }\n async refreshIf(gracePeriod) {\n if (!this.shouldBeRefreshed(gracePeriod)) {\n return;\n }\n await this.refresh();\n }\n logout() {\n const url = new URL(this.uri.logout);\n url.searchParams.set(\"post_logout_redirect_uri\", this.uri.redirect);\n url.searchParams.set(\"id_token_hint\", this.token.id_token);\n window.location = url;\n }\n\n bearerToken() {\n return `Bearer ${this.token.access_token}`;\n }\n \n interceptor(gracePeriodBefore, gracePeriodAfter){\n return new AuthorizationCodeFlowInterceptor(this, gracePeriodBefore, gracePeriodAfter); \n }\n}\n\nclass AuthorizationCodeFlowInterceptor {\n constructor(session, gracePeriodBefore, gracePeriodAfter) {\n this.session = session;\n this.gracePeriodBefore = gracePeriodBefore || 2000;\n this.gracePeriodAfter = gracePeriodAfter || 30000;\n }\n async intercept(request, chain) {\n await this.session.refreshIf(this.gracePeriodBefore);\n const headers = new Headers(request.options.headers);\n headers.set(\"Authorization\", this.session.bearerToken());\n request.options.headers = headers;\n const response = await chain.proceed(request);\n await this.session.refreshIf(this.gracePeriodAfter);\n return response;\n }\n}\n\n\nexport {AuthorizationCodeFlow, AuthorizationCodeFlowSession, AuthorizationCodeFlowInterceptor };","\nconst timing = {\n sleep(ms) {\n return new Promise(resolve => setTimeout(resolve, ms));\n },\n DEBOUNCE_DEFAULT: 0,\n DEBOUNCE_IMMEDIATE: 1,\n debounce(timeoutMs, func, options) {\n let tid = null;\n let args = [];\n let previousTimestamp = 0;\n let opts = options || timing.DEBOUNCE_DEFAULT;\n\n const later = () => {\n const elapsed = new Date().getTime() - previousTimestamp;\n if (timeoutMs > elapsed) {\n tid = setTimeout(later, timeoutMs - elapsed);\n return;\n }\n tid = null;\n if (opts !== timing.DEBOUNCE_IMMEDIATE) {\n func(...args);\n }\n // This check is needed because `func` can recursively invoke `debounced`.\n if (tid === null) {\n args = [];\n }\n };\n\n return function () {\n args = arguments;\n previousTimestamp = new Date().getTime();\n if (tid === null) {\n tid = setTimeout(later, timeoutMs);\n if (opts === timing.DEBOUNCE_IMMEDIATE) {\n func(...args);\n }\n }\n };\n },\n THROTTLE_DEFAULT: 0,\n THROTTLE_NO_LEADING: 1,\n THROTTLE_NO_TRAILING: 2,\n throttle(timeoutMs, func, options) {\n let tid = null;\n let args = [];\n let previousTimestamp = 0;\n let opts = options || timing.THROTTLE_DEFAULT;\n\n const later = () => {\n previousTimestamp = (opts & timing.THROTTLE_NO_LEADING) ? 0 : new Date().getTime();\n tid = null;\n func(...args);\n if (tid === null) {\n args = [];\n }\n };\n\n return function () {\n const now = new Date().getTime();\n if (!previousTimestamp && (opts & timing.THROTTLE_NO_LEADING)) {\n previousTimestamp = now;\n }\n const remaining = timeoutMs - (now - previousTimestamp);\n args = arguments;\n if (remaining <= 0 || remaining > timeoutMs) {\n if (tid !== null) {\n clearTimeout(tid);\n tid = null;\n }\n previousTimestamp = now;\n func(...args);\n if (tid === null) {\n args = [];\n }\n } else if (tid === null && !(opts & timing.THROTTLE_NO_TRAILING)) {\n tid = setTimeout(later, remaining);\n }\n };\n\n }\n};\n\n\nexport { timing };","class Fragments {\n static fromHtml(...html) {\n const el = document.createElement('div');\n el.innerHTML = html.join(\"\");\n const fragment = new DocumentFragment();\n Array.from(el.childNodes).forEach(node => {\n fragment.appendChild(node);\n });\n return fragment;\n } \n static toHtml(fragment) {\n var r = document.createElement(\"root\");\n r.appendChild(fragment);\n return r.innerHTML;\n }\n static from(...nodes) {\n const fragment = new DocumentFragment();\n for (let i = 0; i !== nodes.length; ++i) {\n fragment.appendChild(nodes[i]);\n }\n return fragment;\n }\n static fromChildNodes(el) {\n const nodes = Array.from(el.childNodes);\n const fragment = new DocumentFragment();\n for (let i = 0; i !== nodes.length; ++i) {\n fragment.appendChild(nodes[i]);\n }\n return fragment;\n }\n}\n\nclass Attributes {\n static id = 0;\n static uid(prefix) {\n return `${prefix}-${++Attributes.id}`;\n }\n static asBoolean(value) {\n return value !== null && value !== undefined && value !== false;\n }\n static defaultValue(el, k, v) {\n if (!el.hasAttribute(k)) {\n el.setAttribute(k, v);\n }\n return el.getAttribute(k);\n }\n static forward(prefix, from, to) {\n from.getAttributeNames()\n .filter(a => a.startsWith(prefix))\n .forEach(a => {\n const target = a.substring(prefix.length);\n if (target === 'class') {\n to.classList.add(...from.getAttribute(prefix + \"class\").split(\" \").filter(a => a.length));\n return;\n }\n to.setAttribute(target, from.getAttribute(a))\n });\n }\n}\n\nclass Slots {\n static from(el) {\n const namedSlots = Array.from(el.childNodes)\n .filter(el => el.matches && el.matches('[slot]'))\n .map(el => {\n el.remove();\n const slot = el.getAttribute(\"slot\");\n el.removeAttribute(\"slot\");\n return [slot, el];\n });\n const slotted = Object.fromEntries(namedSlots);\n slotted.default = new DocumentFragment();\n slotted.default.append(...el.childNodes);\n return slotted;\n }\n}\n\nconst Templated = (SuperClass, template) => {\n return class extends SuperClass {\n rendered_;\n get rendered() {\n return this.rendered_;\n }\n async connectedCallback() {\n if (this.rendered_) {\n return;\n }\n const slotted = Slots.from(this);\n const fragment = await Promise.resolve(this.render(slotted, template));\n this.innerHTML = '';\n if (fragment) {\n this.appendChild(fragment);\n }\n this.rendered_ = true;\n }\n };\n}\n\nconst Stateful = (SuperClass, flags, others) => {\n\n const all = [].concat(flags).concat(others || []);\n\n return class extends SuperClass {\n static get observedAttributes() {\n return all;\n }\n constructor(...args) {\n super(...args);\n this.internals_ = this.internals_ || this.attachInternals();\n for (const flag of flags) {\n Object.defineProperty(this, flag, {\n get() {\n return this.hasAttribute(flag);\n },\n set(value) {\n //see https://developer.mozilla.org/en-US/docs/Web/API/CustomStateSet#using_double_dash_prefixed_idents\n if (Attributes.asBoolean(value)) {\n this.internals_.states.add(`--${flag}`);\n this.setAttribute(flag, '');\n return;\n }\n this.internals_.states.delete(`--${flag}`);\n this.removeAttribute(flag);\n }\n });\n }\n }\n attributeChangedCallback(name, oldValue, newValue) {\n if (oldValue === newValue) {\n return;\n }\n this[name] = newValue;\n const method = this[`on${name.charAt(0).toUpperCase()}${name.substr(1).toLowerCase()}Changed`];\n method?.call(this, newValue, oldValue);\n }\n };\n}\n\nexport { Fragments, Attributes, Slots, Templated, Stateful };\n","\nimport { Templated } from \"./elements.mjs\"\n\n\nclass FieldError extends Templated(HTMLElement) {\n render(slotted, template) {\n this.classList.add('invalid-feedback');\n }\n static configure() {\n customElements.define('ful-field-error', FieldError);\n }\n}\n\nclass Errors extends Templated(HTMLElement) {\n render(slotted, template) {\n this.classList.add('alert', 'alert-danger', 'd-none');\n }\n static configure() {\n customElements.define('ful-errors', Errors);\n }\n\n}\n\n\nexport { FieldError, Errors }","/* global Infinity, CSS */\n\nimport { Failure } from \"../http-client.mjs\";\nimport { Observable } from \"../observable.mjs\";\nimport { Templated } from \"./elements.mjs\"\n\nclass Form extends Templated(Observable(HTMLElement)) {\n constructor({ mutators, extractors, valueHoldersSelector, ignoredChildrenSelector }) {\n super();\n this.mutators = mutators || {}\n this.extractors = extractors || {}\n this.valueHoldersSelector = valueHoldersSelector || '[name]';\n this.ignoredChildrenSelector = ignoredChildrenSelector || '.d-none';\n }\n render(slotted, template) {\n const form = document.createElement('form');\n form.append(slotted.default);\n form.addEventListener('submit', async (e) => {\n e.preventDefault();\n this.spinner(true);\n try {\n await this.fire('submit', this.getValues(), this);\n } catch (e) {\n if (e instanceof Failure) {\n this.setErrors(e.problems);\n return;\n }\n throw e;\n } finally {\n this.spinner(false)\n }\n })\n return form;\n }\n spinner(spin) {\n this.querySelectorAll('ful-spinner').forEach(el => {\n el.hidden = !spin;\n })\n this.querySelectorAll('[type=submit],[type=reset]').forEach(el => {\n el.disabled = spin;\n })\n }\n setValues(values) {\n for (let k in values) {\n if (!values.hasOwnProperty(k)) {\n continue;\n }\n Array.from(this.querySelectorAll(`[name='${CSS.escape(k)}']`)).forEach((el) => {\n Form.mutate(this.mutators, el, values[k], k, values);\n });\n }\n }\n getValues() {\n return Array.from(this.querySelectorAll(this.valueHoldersSelector))\n .filter((el) => {\n if (el.dataset['fulBindInclude'] === 'never') {\n return false;\n }\n return el.dataset['fulBindInclude'] === 'always' || el.closest(this.ignoredChildrenSelector) === null;\n })\n .reduce((result, el) => {\n return Form.providePath(result, el.getAttribute('name'), Form.extract(this.extractors, el));\n }, {});\n }\n setErrors(errors, scroll) {\n this.clearErrors();\n errors\n .filter((e) => e.type === 'FIELD_ERROR' || e.type === 'INVALID_FORMAT')\n .forEach((e) => {\n const name = e.context.replace(\"[\", \".\").replace(\"].\", \".\");\n this.querySelectorAll(`[name='${CSS.escape(name)}']`)\n .forEach(input => {\n input.classList.add('is-invalid')\n if (input.parentElement.classList.contains(\"form-floating\")) {\n input.parentElement.classList.add('is-invalid')\n }\n });\n this.querySelectorAll(`ful-field-error[field='${CSS.escape(name)}']`)\n .forEach(el => el.innerText = e.reason);\n });\n this.querySelectorAll(\"ful-errors\")\n .forEach(el => {\n const globalErrors = errors.filter((e) => e.type !== 'FIELD_ERROR' && e.type !== 'INVALID_FORMAT');\n el.innerHTML = globalErrors.map(e => e.reason).join(\"\\n\");\n if (globalErrors.length !== 0) {\n el.classList.remove('d-none');\n }\n })\n\n if (!scroll) {\n return;\n }\n const ys = Array.from(this.querySelectorAll('ful-field-error:not(.d-none)'))\n .map(el => el.getBoundingClientRect().y + window.scrollY)\n const miny = Math.min(...ys);\n if (miny !== Infinity) {\n window.scroll(window.scrollX, miny > 100 ? miny - 100 : 0);\n }\n }\n clearErrors() {\n this.querySelectorAll('[name].is-invalid, .form-floating.is-invalid')\n .forEach(el => el.classList.remove('is-invalid'));\n this.querySelectorAll(\"ful-errors\")\n .forEach(el => {\n el.innerHTML = '';\n el.classList.add('d-none');\n });\n }\n static extract(extractors, el) {\n const maybeExtractor = extractors[el.dataset['fulBindExtractor']] || extractors[el.dataset['fulBindProvide']];\n if (maybeExtractor) {\n return maybeExtractor(el);\n }\n if (el.getAttribute('type') === 'radio') {\n if (!el.checked) {\n return undefined;\n }\n return el.dataset['fulBindType'] === 'boolean' ? el.value === 'true' : el.value;\n }\n if (el.getAttribute('type') === 'checkbox') {\n return el.checked;\n }\n if (el.dataset['fulBindType'] === 'boolean') {\n return !el.value ? null : el.value === 'true';\n }\n if (el.getValue) {\n return el.getValue();\n }\n return el.value || null;\n }\n static mutate(mutators, el, raw, key, values) {\n const maybeMutator = mutators[el.dataset['fulBindMutator']] || mutators[el.dataset['fulBindProvide']];\n if (maybeMutator) {\n maybeMutator(el, raw, key, values);\n return;\n }\n if (el.getAttribute('type') === 'radio') {\n el.checked = el.getAttribute('value') === raw;\n return;\n }\n if (el.getAttribute('type') === 'checkbox') {\n el.checked = raw;\n return;\n }\n if (el.setValue) {\n el.setValue(raw);\n return;\n }\n el.value = raw;\n }\n\n static providePath(result, path, value) {\n const keys = path.split(\".\").map((k) => k.match(/^[0-9]+$/) ? +k : k);\n let current = result;\n let previous = null;\n for (let i = 0; ; ++i) {\n const ckey = keys[i];\n const pkey = keys[i - 1];\n if (Number.isInteger(ckey) && !Array.isArray(current)) {\n if (previous !== null) {\n previous[pkey] = current = [];\n } else {\n result = current = [];\n }\n }\n if (i === keys.length - 1) {\n //when value is undefined we only want to define the property if it's not defined \n current[ckey] = value !== undefined ? value : (ckey in current ? current[ckey] : null);\n return result;\n }\n if (current[ckey] === undefined) {\n current[ckey] = {};\n }\n previous = current;\n current = current[ckey];\n }\n }\n static custom(tagName, configuration) {\n customElements.define(tagName, class extends Form {\n constructor() {\n super(configuration);\n }\n });\n }\n}\n\nexport { Form };\n","import { Attributes, Templated } from \"./elements.mjs\"\n\nconst ful_input_ec = globalThis.ec || ftl.EvaluationContext.configure({\n\n});\n\nconst ful_input_template_ = globalThis.ful_input_template || ftl.Template.fromHtml(`\n <div data-tpl-if=\"floating\" class=\"input-group has-validation\">\n <span data-tpl-if=\"slotted.ibefore\" class=\"input-group-text\">{{{{ slotted.ibefore }}}}</span>\n <div data-tpl-if=\"slotted.before\" data-tpl-remove=\"tag\">{{{{ slotted.before }}}}</div>\n <div class=\"form-floating\">\n {{{{ slotted.input }}}} \n <label data-tpl-for=\"name\" class=\"form-label\">{{{{ slotted.default }}}}</label>\n </div>\n <div data-tpl-if=\"slotted.after\" data-tpl-remove=\"tag\">{{{{ slotted.after }}}}</div>\n <span data-tpl-if=\"slotted.iafter\" class=\"input-group-text\">{{{{ slotted.iafter }}}}</span>\n <ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error>\n </div>\n <div data-tpl-if=\"!floating\" data-tpl-remove=\"tag\">\n <label data-tpl-for=\"id\" class=\"form-label\">{{{{ slotted.default }}}}</label>\n <div class=\"input-group has-validation\">\n <span data-tpl-if=\"slotted.ibefore\" class=\"input-group-text\">{{{{ slotted.ibefore }}}}</span>\n <div data-tpl-if=\"slotted.before\" data-tpl-remove=\"tag\">{{{{ slotted.before }}}}</div>\n {{{{ slotted.input }}}} \n <div data-tpl-if=\"slotted.after\" data-tpl-remove=\"tag\">{{{{ slotted.after }}}}</div>\n <span data-tpl-if=\"slotted.iafter\" class=\"input-group-text\">{{{{ slotted.iafter }}}}</span>\n <ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error>\n </div>\n </div>\n`, ful_input_ec);\n\n\n\nclass Input extends Templated(HTMLElement, ful_input_template_) {\n render(slotted, template) {\n const floating = this.hasAttribute('floating');\n const input = slotted.input = slotted.input || (() => {\n const el = document.createElement(\"input\")\n el.classList.add(\"form-control\");\n return el;\n })();\n const id = input.getAttribute('id') || this.getAttribute('input-id') || Attributes.uid('ful-input');\n Attributes.forward('input-', this, slotted.input)\n Attributes.defaultValue(slotted.input, \"id\", id);\n Attributes.defaultValue(slotted.input, \"type\", \"text\");\n Attributes.defaultValue(slotted.input, \"placeholder\", \" \");\n const name = input.getAttribute('name');\n return template.render({ id, name, floating, slotted });\n }\n static configure() {\n customElements.define('ful-input', Input);\n }\n}\n\n\n\n\nexport { Input };\n","import { Fragments, Attributes, Templated } from \"./elements.mjs\"\nimport { Observable } from \"../observable.mjs\";\n/**\n * <script src=\"tom-select.complete.js\"></script>\n * <link href=\"tom-select.bootstrap5.css\" rel=\"stylesheet\" />\n */\nconst ful_select_ec = globalThis.ec || ftl.EvaluationContext.configure({\n\n});\n\nconst ful_select_template_ = globalThis.ful_select_template || ftl.Template.fromHtml(`\n <div data-tpl-if=\"floating\" class=\"input-group has-validation\">\n <span data-tpl-if=\"slotted.ibefore\" class=\"input-group-text\">{{{{ slotted.ibefore }}}}</span>\n <div data-tpl-if=\"slotted.before\" data-tpl-remove=\"tag\">{{{{ slotted.before }}}}</div>\n <div class=\"form-floating\">\n {{{{ slotted.input }}}} \n <label data-tpl-for=\"name\" class=\"form-label\">{{{{ slotted.default }}}}</label>\n </div>\n <div data-tpl-if=\"slotted.after\" data-tpl-remove=\"tag\">{{{{ slotted.after }}}}</div>\n <span data-tpl-if=\"slotted.iafter\" class=\"input-group-text\">{{{{ slotted.iafter }}}}</span>\n <ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error>\n </div>\n <div data-tpl-if=\"!floating\" data-tpl-remove=\"tag\">\n <label data-tpl-for=\"id\" class=\"form-label\">{{{{ slotted.default }}}}</label>\n <div class=\"input-group has-validation\">\n <span data-tpl-if=\"slotted.ibefore\" class=\"input-group-text\">{{{{ slotted.ibefore }}}}</span>\n <div data-tpl-if=\"slotted.before\" data-tpl-remove=\"tag\">{{{{ slotted.before }}}}</div>\n {{{{ slotted.input }}}} \n <div data-tpl-if=\"slotted.after\" data-tpl-remove=\"tag\">{{{{ slotted.after }}}}</div>\n <span data-tpl-if=\"slotted.iafter\" class=\"input-group-text\">{{{{ slotted.iafter }}}}</span>\n <ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error> \n </div>\n </div>\n`, ful_select_ec);\n\n\nclass Select extends Templated(Observable(HTMLElement), ful_select_template_) {\n constructor(tsConfig) {\n super();\n this.tsConfig = tsConfig;\n }\n render(slotted, template) {\n const floating = this.hasAttribute('floating');\n const remote = this.hasAttribute('remote');\n const input = slotted.input = slotted.input || (() => {\n return document.createElement(\"select\");\n })();\n const id = input.getAttribute('id') || this.getAttribute('input-id') || Attributes.uid('ful-select');\n Attributes.forward('input-', this, input)\n Attributes.defaultValue(input, \"id\", id);\n Attributes.defaultValue(input, \"placeholder\", \" \");\n const name = input.getAttribute('name');\n input.setValue = this.setValue.bind(this);\n input.getValue = this.getValue.bind(this);\n\n //tomselect needs the input to have a parent.\n //se we move the input to a fragment\n slotted.input = Fragments.from(input);\n\n this.loaded = !remote;\n this.ts = new TomSelect(input, Object.assign(remote ? {\n preload: 'focus',\n load: async (query, callback) => {\n if (this.loaded) {\n callback();\n return;\n }\n const data = await this.fire('load', query, [])\n this.loaded = true;\n callback(data);\n }\n } : {}, this.tsConfig));\n\n return template.render({ id, name, floating, slotted });\n }\n async setValue(v) {\n if (!this.loaded) {\n await this.ts.load();\n }\n this.ts.setValue(v);\n }\n getValue() {\n const v = this.ts.getValue();\n return v === '' ? null : v;\n }\n static custom(tagName, configuration) {\n customElements.define(tagName, class extends Select {\n constructor() {\n super(configuration);\n }\n });\n }\n static configure() {\n return Select.custom('ful-select');\n }\n\n}\n\nexport { Select };\n","import { Attributes, Fragments, Stateful, Templated } from \"./elements.mjs\"\n\n\n\n\n\nconst ful_radiogroup_ec = globalThis.ec || ftl.EvaluationContext.configure({\n\n});\n\nconst ful_radiougroup_template_ = globalThis.ful_radiogroup_template || ftl.Template.fromHtml(`\n <fieldset>\n <legend class=\"form-label\">\n {{{{ slotted.default }}}}\n </legend>\n <section>\n <label data-tpl-each=\"inputsAndLabels\" data-tpl-var=\"ial\">\n {{{{ ial[0] }}}}\n {{{{ ial[1] }}}}\n </label>\n </section>\n <ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error>\n </fieldset>\n`, ful_radiogroup_ec);\n\n\nclass RadioGroup extends Stateful(Templated(HTMLElement, ful_radiougroup_template_), ['readonly']) {\n render(slotted, template) { \n const name = this.getAttribute('input-name') || Attributes.uid('ful-radiogroup');\n const radioEls = Array.from(slotted.default.querySelectorAll('ful-radio'));\n const inputsAndLabels = radioEls.map(el => {\n const input = document.createElement('input');\n input.setAttribute('type', 'radio');\n Attributes.forward('input-', this, input);\n Attributes.forward('', el, input);\n Attributes.defaultValue(input, 'name', name);\n const label = Fragments.fromChildNodes(el);\n return [input, label];\n });\n radioEls.forEach(el => el.remove());\n \n const fragment = template.render({\n name: name,\n slotted: slotted,\n inputsAndLabels: inputsAndLabels\n });\n return fragment;\n }\n static configure() {\n customElements.define('ful-radio-group', RadioGroup);\n } \n}\n\n\nexport { RadioGroup };","import { Fragments, Templated } from \"./elements.mjs\"\n\nclass Spinner extends Templated(HTMLElement) {\n render(slotted, template) {\n return Fragments.fromHtml(`\n <div class=\"spinner-border spinner-border-sm\" aria-hidden=\"true\"></div>\n `);\n }\n static configure() {\n customElements.define('ful-spinner', Spinner);\n }\n}\n\nexport { Spinner };","class Wizard extends HTMLElement {\n constructor() {\n super();\n this.progress = [...this.children].filter(e => e.matches(\"header,ol,ul\"));\n\n this.progress.forEach(p => {\n const children = [...p.children];\n const current = children.filter(e => e.matches(\".active\"))[0];\n if (current === undefined && children.length > 0) {\n children[0].classList.add('active');\n }\n });\n if (this.querySelector('section.current') === null) {\n const firstSection = this.querySelector('section:first-of-type');\n if (firstSection !== null) {\n firstSection.classList.add('current');\n }\n }\n }\n next() {\n this.progress.forEach(p => {\n const children = [...p.children];\n const current = children.filter(e => e.matches(\".active\"))[0];\n current?.classList.remove('active');\n current?.nextElementSibling?.classList.add('active');\n });\n const currentSection = this.querySelector('section.current');\n currentSection.classList.remove(\"current\");\n currentSection.nextElementSibling.classList.add('current');\n\n this.dispatchEvent(new CustomEvent('wizard:activate', {\n bubbles: true,\n cancelable: true\n }));\n\n }\n prev() {\n this.progress.forEach(p => {\n const children = [...p.children];\n const current = children.filter(e => e.matches(\".active\"))[0];\n current?.classList.remove('active');\n current?.previousElementSibling?.classList.add('active');\n });\n const currentSection = this.querySelector('section.current');\n currentSection.classList.remove(\"current\");\n currentSection.previousElementSibling.classList.add('current');\n this.dispatchEvent(new CustomEvent('wizard:activate', {\n bubbles: true,\n cancelable: true\n }));\n }\n moveTo = function (n) {\n this.progress.forEach(p => {\n const children = [...p.children];\n const current = children.filter(e => e.matches(\".active\"))[0];\n current?.classList.remove('active');\n p.children[+n]?.classList.add('active');\n });\n const currentSection = this.querySelector('section.current');\n currentSection?.classList.remove(\"current\");\n const nthSection = this.querySelector(`section:nth-child(${+n})`);\n nthSection.classList.add('current');\n this.dispatchEvent(new CustomEvent('wizard:activate', {\n bubbles: true,\n cancelable: true\n }));\n }\n static custom(tagName, configuration) {\n customElements.define(tagName, class extends Wizard {\n constructor() {\n super(configuration);\n }\n });\n }\n static configure() {\n return Wizard.custom('ful-wizard');\n }\n}\n\n\n\n\nexport { Wizard };\n","class App {\n constructor() {\n this.configurers = [];\n this.initializers = [];\n this.handlers = [];\n this.running = false;\n document.addEventListener(\"DOMContentLoaded\", async () => {\n await Promise.all(this.configurers);\n await Promise.all(this.initializers.map(h => Promise.resolve(h())));\n await Promise.all(this.handlers.map(h => Promise.resolve(h())));\n });\n }\n configure(cb) {\n this.configurers.push(Promise.resolve(cb()));\n return this;\n }\n initialize(cb) {\n this.initializers.push(cb);\n return this;\n }\n ready(cb) {\n this.handlers.push(cb);\n return this;\n }\n}\n\nexport { App };\n"],"names":["Base64","encode","arrayBuffer","dialect","d","URL_SAFE","len","byteLength","view","Uint8Array","res","i","substring","length","decode","str","nbytes","Math","floor","vi","si","v1","indexOf","charAt","v2","v3","v4","buffer","STANDARD","Hex","hex","Error","lenInBytes","map","e","offset","octet","parseInt","bytes","upper","Array","from","b","toString","toUpperCase","o","padStart","join","Observable","SuperClass","constructor","args","super","this","listeners","fireSync","event","data","initialAcc","acc","l","fire","on","listener","push","un","idx","splice","ContextInterceptor","context","document","querySelector","getAttribute","endsWith","intercept","request","chain","separator","resource","startsWith","proceed","CsrfTokenInterceptor","k","v","headers","Headers","options","set","RedirectOnUnauthorizedInterceptor","redirectUri","response","status","window","location","href","Failure","parseProblems","text","def","type","reason","details","JSON","parse","fromResponse","problems","stringify","name","HttpClientBuilder","interceptors","withContext","withCsrfToken","withRedirectOnUnauthorized","withInterceptors","build","HttpClient","HttpCall","fetch","HttpInterceptorChain","current","interceptor","builder","exchange","opts","ok","message","json","undefined","jsonRequest","method","body","jsonPost","jsonPut","jsonPatch","Storage","prefix","storage","save","setItem","load","got","getItem","remove","removeItem","pop","decoded","LocalStorage","localStorage","SessionStorage","sessionStorage","VersionedStorage","key","dataSupplier","cache","revision","saved","value","freshData","AuthorizationCodeFlow","forKeycloak","clientId","realmBaseUrl","auth","URL","token","logout","registration","redirect","scope","uri","action","additionalParams","pkceVerifier","crypto","getRandomValues","pkceChallenge","subtle","digest","TextEncoder","state","PKCE_AND_STATE_KEY","verifier","url","searchParams","Object","entries","forEach","kv","applicationInitiatedAction","kcAction","kc_action","_tokenExchange","code","history","replaceState","stateAndVerifier","URLSearchParams","AuthorizationCodeFlowSession","ensureLoggedIn","get","parseToken","rawHeader","rawPayload","signature","split","ut8decoder","TextDecoder","header","payload","t","accessToken","access_token","refreshToken","refresh_token","refreshCallback","onRefresh","callback","refresh","shouldBeRefreshed","gracePeriod","now","Date","getTime","refreshTokenExpiresAt","exp","refreshIf","id_token","bearerToken","gracePeriodBefore","gracePeriodAfter","AuthorizationCodeFlowInterceptor","session","timing","sleep","ms","Promise","resolve","setTimeout","DEBOUNCE_DEFAULT","DEBOUNCE_IMMEDIATE","debounce","timeoutMs","func","tid","previousTimestamp","later","elapsed","arguments","THROTTLE_DEFAULT","THROTTLE_NO_LEADING","THROTTLE_NO_TRAILING","throttle","remaining","clearTimeout","Fragments","fromHtml","html","el","createElement","innerHTML","fragment","DocumentFragment","childNodes","node","appendChild","toHtml","r","nodes","fromChildNodes","Attributes","static","uid","id","asBoolean","defaultValue","hasAttribute","setAttribute","forward","to","getAttributeNames","filter","a","target","classList","add","Slots","namedSlots","matches","slot","removeAttribute","slotted","fromEntries","default","append","Templated","template","rendered_","rendered","connectedCallback","render","Stateful","flags","others","all","concat","observedAttributes","internals_","attachInternals","flag","defineProperty","states","delete","attributeChangedCallback","oldValue","newValue","substr","toLowerCase","call","FieldError","HTMLElement","configure","customElements","define","Errors","Form","mutators","extractors","valueHoldersSelector","ignoredChildrenSelector","form","addEventListener","async","preventDefault","spinner","getValues","setErrors","spin","querySelectorAll","hidden","disabled","setValues","values","hasOwnProperty","CSS","escape","mutate","dataset","closest","reduce","result","providePath","extract","errors","scroll","clearErrors","replace","input","parentElement","contains","innerText","globalErrors","ys","getBoundingClientRect","y","scrollY","miny","min","Infinity","scrollX","maybeExtractor","checked","getValue","raw","maybeMutator","setValue","path","keys","match","previous","ckey","pkey","Number","isInteger","isArray","custom","tagName","configuration","ful_input_ec","globalThis","ec","ftl","EvaluationContext","ful_input_template_","ful_input_template","Template","Input","floating","ful_select_ec","ful_select_template_","ful_select_template","Select","tsConfig","remote","bind","loaded","ts","TomSelect","assign","preload","query","ful_radiogroup_ec","ful_radiougroup_template_","ful_radiogroup_template","RadioGroup","radioEls","inputsAndLabels","Spinner","Wizard","progress","children","p","firstSection","next","nextElementSibling","currentSection","dispatchEvent","CustomEvent","bubbles","cancelable","prev","previousElementSibling","moveTo","n","App","configurers","initializers","handlers","running","h","cb","initialize","ready"],"mappings":"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"}
1
+ {"version":3,"file":"ful.min.mjs","sources":["../src/encodings.mjs","../src/observable.mjs","../src/http-client.mjs","../src/storage.mjs","../src/oauth-authorization-code.mjs","../src/timing.mjs","../src/elements/elements.mjs","../src/elements/errors.mjs","../src/elements/form.mjs","../src/elements/input.mjs","../src/elements/select.mjs","../src/elements/radio.mjs","../src/elements/spinner.mjs","../src/elements/wizard.mjs","../src/app.mjs"],"sourcesContent":["\n\nclass Base64 {\n static encode(arrayBuffer, dialect) {\n const d = dialect || Base64.URL_SAFE;\n const len = arrayBuffer.byteLength;\n const view = new Uint8Array(arrayBuffer);\n let res = '';\n for (let i = 0; i < len; i += 3) {\n const v1 = d[view[i] >> 2];\n const v2 = d[((view[i] & 3) << 4) | (view[i + 1] >> 4)];\n const v3 = d[((view[i + 1] & 15) << 2) | (view[i + 2] >> 6)];\n const v4 = d[view[i + 2] & 63];\n res += v1 + v2 + v3 + v4;\n }\n if (len % 3 === 2) {\n res = res.substring(0, res.length - 1);\n } else if (len % 3 === 1) {\n res = res.substring(0, res.length - 2);\n }\n return res;\n }\n static decode(str, dialect) {\n const d = dialect || Base64.URL_SAFE;\n let nbytes = Math.floor(str.length * 0.75);\n for (let i = 0; i !== str.length; ++i) {\n if (str[str.length - i - 1] !== '=') {\n break;\n }\n --nbytes;\n }\n const view = new Uint8Array(nbytes);\n\n let vi = 0;\n let si = 0;\n while (vi < str.length * 0.75) {\n const v1 = d.indexOf(str.charAt(si++));\n const v2 = d.indexOf(str.charAt(si++));\n const v3 = d.indexOf(str.charAt(si++));\n const v4 = d.indexOf(str.charAt(si++));\n view[vi++] = (v1 << 2) | (v2 >> 4);\n view[vi++] = ((v2 & 15) << 4) | (v3 >> 2);\n view[vi++] = ((v3 & 3) << 6) | v4;\n }\n\n return view.buffer;\n }\n}\n\nBase64.STANDARD = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nBase64.URL_SAFE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\n\n\nclass Hex {\n static decode(hex) {\n if (hex.length % 2 !== 0) {\n throw new Error(\"invalid length\");\n }\n const lenInBytes = hex.length / 2;\n return new Uint8Array(lenInBytes).map((e, i) => {\n const offset = i * 2;\n const octet = hex.substring(offset, offset + 2);\n return parseInt(octet, 16);\n });\n }\n static encode(bytes, upper) {\n return Array.from(bytes)\n .map(b => b.toString(16))\n .map(b => upper ? b.toUpperCase() : b)\n .map(o => o.padStart(2, 0))\n .join('');\n }\n}\n\nexport { Base64, Hex };","\nconst Observable = (SuperClass) => class extends SuperClass {\n constructor(...args) {\n super(...args)\n this.listeners = {};\n }\n fireSync(event, data, initialAcc) {\n const listeners = this.listeners[event] || [];\n let acc = initialAcc;\n for (const l of listeners) {\n acc = l(data, this, acc);\n }\n return acc;\n }\n async fire(event, data, initialAcc) {\n const listeners = this.listeners[event] || [];\n let acc = initialAcc;\n for (const l of listeners) {\n acc = await l(data, this, acc);\n }\n return acc;\n }\n on(event, listener) {\n this.listeners[event] = this.listeners[event] || [];\n this.listeners[event].push(listener);\n }\n un(event, listener) {\n const listeners = this.listeners[event] || [];\n const idx = listeners.indexOf(listener);\n return idx === -1 ? [] : listeners.splice(idx, 1);\n } \n}\n\n\nexport { Observable };","class ContextInterceptor {\n constructor() {\n const context = document.querySelector(\"meta[name='context']\").getAttribute(\"content\");\n this.context = context.endsWith(\"/\") ? context.substring(0, context.length - 1) : context;\n }\n async intercept(request, chain){\n const separator = request.resource.startsWith(\"/\") ? \"\" : \"/\";\n request.resource = this.context + separator + request.resource;\n return await chain.proceed(request);\n }\n}\n\nclass CsrfTokenInterceptor {\n constructor() {\n this.k = document.querySelector(\"meta[name='_csrf_header']\").getAttribute(\"content\");\n this.v = document.querySelector(\"meta[name='_csrf']\").getAttribute(\"content\");\n }\n async intercept(request, chain){\n const headers = new Headers(request.options.headers);\n headers.set(this.k, this.v);\n request.options.headers = headers;\n return await chain.proceed(request);\n }\n}\n\nclass RedirectOnUnauthorizedInterceptor {\n constructor(redirectUri) {\n this.redirectUri = redirectUri;\n }\n async intercept(request, chain){\n const response = await chain.proceed(request);\n if (response.status !== 401) {\n return response;\n }\n window.location.href = this.redirectUri;\n }\n}\n\nclass Failure extends Error {\n static parseProblems(status, text) {\n const def = [{\n type: \"GENERIC_PROBLEM\",\n context: null,\n reason: `${status}: ${text}`,\n details: null\n }];\n try {\n return text ? JSON.parse(text) : def;\n } catch (e) {\n return def;\n }\n }\n static fromResponse(status, text) {\n return new Failure(status, Failure.parseProblems(status, text));\n }\n constructor(status, problems) {\n super(JSON.stringify(problems));\n this.name = `Failure:${status}`;\n this.status = status;\n this.problems = problems;\n }\n}\n\nclass HttpClientBuilder {\n constructor() {\n this.interceptors = [];\n }\n withContext() {\n this.interceptors.push(new ContextInterceptor());\n return this;\n }\n withCsrfToken() {\n this.interceptors.push(new CsrfTokenInterceptor());\n return this;\n }\n withRedirectOnUnauthorized(redirectUri) {\n this.interceptors.push(new RedirectOnUnauthorizedInterceptor(redirectUri));\n return this;\n }\n withInterceptors(...interceptors) {\n this.interceptors.push(...interceptors);\n return this;\n }\n build() {\n const interceptors = this.interceptors;\n return new HttpClient({interceptors});\n }\n}\n\nclass HttpCall {\n async intercept(request, chain){\n return await fetch(request.resource, request.options);\n } \n}\n\nclass HttpInterceptorChain {\n constructor(interceptors, current){\n this.interceptors = interceptors;\n this.current = current;\n }\n async proceed(request){\n const interceptor = this.interceptors[this.current];\n return await interceptor.intercept(request, new HttpInterceptorChain(this.interceptors, this.current + 1));\n }\n}\n\n\nclass HttpClient {\n static builder() {\n return new HttpClientBuilder();\n }\n constructor({interceptors}){\n this.interceptors = interceptors || [];\n }\n async exchange(resource, options) {\n const opts = options || {};\n const interceptors = [...this.interceptors, ...opts.interceptors || [], new HttpCall()];\n const chain = new HttpInterceptorChain(interceptors, 0);\n return await chain.proceed({resource, options: opts});\n }\n async fetch(resource, options) {\n const response = await this.exchange(resource, options);\n if (!response.ok) {\n const message = await response.text();\n throw Failure.fromResponse(response.status, message);\n } \n return response;\n }\n async json(resource, options) {\n try {\n const response = await this.fetch(resource, options);\n const text = await response.text();\n return text ? JSON.parse(text) : undefined;\n } catch (e) {\n if (e instanceof Failure) {\n throw e;\n }\n throw new Failure(0, [{\n type: \"CONNECTION_PROBLEM\",\n context: null,\n reason: e.message,\n details: null\n }]);\n }\n }\n}\n\nfunction jsonRequest(method, body, headers){\n return {\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers\n },\n method: method,\n body: JSON.stringify(body) \n }\n}\nfunction jsonPost(body, headers){\n return jsonRequest('POST', body, headers);\n}\nfunction jsonPut(body, headers){\n return jsonRequest('PUT', body, headers);\n}\nfunction jsonPatch(body, headers){\n return jsonRequest('PATCH', body, headers);\n}\n\n\nexport { HttpClient, Failure, jsonRequest, jsonPost, jsonPut, jsonPatch };\n","\nclass Storage {\n constructor(prefix, storage) {\n this.prefix = prefix;\n this.storage = storage;\n }\n save(k, v) {\n this.storage.setItem(`${this.prefix}-${k}`, JSON.stringify(v));\n }\n load(k) {\n const got = this.storage.getItem(`${this.prefix}-${k}`);\n return got === undefined ? undefined : JSON.parse(got);\n }\n remove(k) {\n this.storage.removeItem(`${this.prefix}-${k}`);\n }\n pop(k) {\n const decoded = this.load(k);\n this.remove(k);\n return decoded;\n }\n}\n\nclass LocalStorage extends Storage {\n constructor(prefix) {\n super(prefix, localStorage);\n }\n}\n\nclass SessionStorage extends Storage {\n constructor(prefix) {\n super(prefix, sessionStorage);\n }\n}\n\nclass VersionedStorage {\n constructor(storage, key, dataSupplier){\n this.storage = storage;\n this.key = key;\n this.dataSupplier = dataSupplier;\n this.cache = null;\n \n }\n async load(revision){\n const saved = this.storage.load(this.key);\n if (!!saved && saved.revision === revision) {\n this.cache = saved.value;\n return;\n }\n const freshData = await this.dataSupplier(revision, this.key);\n this.storage.save(this.key, {\n revision: revision,\n value: freshData\n });\n this.cache = freshData;\n }\n data(){\n return this.cache;\n }\n}\n\n\n\nexport {LocalStorage, SessionStorage, VersionedStorage};","import { Base64 } from \"./encodings.mjs\";\nimport { SessionStorage } from \"./storage.mjs\";\n\n\nclass AuthorizationCodeFlow {\n static forKeycloak(clientId, realmBaseUrl, redirectUri){\n const scope = \"openid profile\";\n return new AuthorizationCodeFlow(clientId, scope, {\n auth: new URL(\"protocol/openid-connect/auth\", realmBaseUrl),\n token: new URL(\"protocol/openid-connect/token\", realmBaseUrl),\n logout: new URL(\"protocol/openid-connect/logout\", realmBaseUrl),\n registration: new URL(\"protocol/openid-connect/registrations\", realmBaseUrl),\n redirect: redirectUri\n }); \n }\n constructor(clientId, scope, {auth, token, registration, logout, redirect}) {\n this.storage = new SessionStorage(clientId);\n this.clientId = clientId;\n this.scope = scope;\n this.uri = {auth, token, registration, logout, redirect};\n }\n async action(uri, additionalParams){\n const pkceVerifier = Base64.encode(crypto.getRandomValues(new Uint8Array(32)).buffer);\n const pkceChallenge = Base64.encode(await crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(pkceVerifier)));\n const state = this.clientId + Base64.encode(crypto.getRandomValues(new Uint8Array(16)).buffer);\n this.storage.save(AuthorizationCodeFlow.PKCE_AND_STATE_KEY, {\n state: state,\n verifier: pkceVerifier\n });\n const url = new URL(uri);\n url.searchParams.set(\"client_id\", this.clientId);\n url.searchParams.set(\"redirect_uri\", this.uri.redirect);\n url.searchParams.set(\"response_type\", 'code');\n url.searchParams.set(\"scope\", this.scope);\n url.searchParams.set(\"state\", state);\n url.searchParams.set(\"code_challenge\", pkceChallenge);\n url.searchParams.set(\"code_challenge_method\", 'S256');\n Object.entries(additionalParams || {}).forEach(kv => {\n url.searchParams.set(kv[0], kv[1]);\n });\n window.location = url;\n }\n async registration(additionalParams){\n await this.action(this.uri.registration, additionalParams);\n }\n async applicationInitiatedAction(kcAction){\n await this.action(this.uri.auth, {\n kc_action: kcAction\n });\n }\n async _tokenExchange(code, state) {\n window.history.replaceState('', \"\", this.uri.redirect);\n const stateAndVerifier = this.storage.pop(AuthorizationCodeFlow.PKCE_AND_STATE_KEY);\n if (stateAndVerifier.state !== state) {\n throw new Error(\"State mismatch\");\n }\n const response = await fetch(this.uri.token, {\n method: \"POST\",\n headers: {\n \"Content-Type\": 'application/x-www-form-urlencoded'\n },\n body: new URLSearchParams([\n [\"client_id\", this.clientId],\n [\"code\", code],\n [\"grant_type\", \"authorization_code\"],\n [\"code_verifier\", stateAndVerifier.verifier],\n [\"state\", stateAndVerifier.state],\n [\"redirect_uri\", this.uri.redirect]\n ])\n });\n if (!response.ok) {\n const text = await response.text();\n throw new Error(\"Error:\" + response.status + \": \" + text);\n }\n const token = await response.json();\n return new AuthorizationCodeFlowSession(this.clientId, token, this.uri);\n }\n async ensureLoggedIn() {\n const url = new URL(window.location.href);\n const code = url.searchParams.get(\"code\");\n if (code && this.storage.load(AuthorizationCodeFlow.PKCE_AND_STATE_KEY)) {\n //if callback from keycloak and we have our state still stored\n const state = url.searchParams.get(\"state\");\n return await this._tokenExchange(code, state);\n }\n //if not authorized\n await this.action(this.uri.auth, {});\n return null;\n }\n}\nAuthorizationCodeFlow.PKCE_AND_STATE_KEY = \"state-and-verifier\";\n\nclass AuthorizationCodeFlowSession {\n static parseToken(token) {\n const [rawHeader, rawPayload, signature] = token.split(\".\");\n const ut8decoder = new TextDecoder(\"utf-8\");\n return {\n header: JSON.parse(ut8decoder.decode(Base64.decode(rawHeader, Base64.STANDARD))),\n payload: JSON.parse(ut8decoder.decode(Base64.decode(rawPayload, Base64.STANDARD))),\n signature: signature\n };\n } \n constructor(clientId, t, {token, logout, redirect}) {\n this.clientId = clientId;\n this.token = t;\n this.accessToken = AuthorizationCodeFlowSession.parseToken(t.access_token);\n this.refreshToken = AuthorizationCodeFlowSession.parseToken(t.refresh_token);\n this.uri = { token, logout, redirect }\n this.refreshCallback = null;\n }\n onRefresh(callback) {\n this.refreshCallback = callback;\n }\n async refresh() {\n const response = await fetch(this.uri.token, {\n method: \"POST\",\n headers: {\n \"Content-Type\": 'application/x-www-form-urlencoded'\n },\n body: new URLSearchParams([\n [\"client_id\", this.clientId],\n [\"grant_type\", \"refresh_token\"],\n [\"refresh_token\", this.token.refresh_token]\n ])\n });\n if (!response.ok) {\n throw new Error(\"Error:\" + response.status + \": \" + response.text());\n }\n const token = await response.json();\n this.token = token;\n this.accessToken = AuthorizationCodeFlowSession.parseToken(token.access_token);\n this.refreshToken = AuthorizationCodeFlowSession.parseToken(token.refresh_token);\n if (this.refreshCallback) {\n this.refreshCallback(this.token, this.accessToken, this.refreshToken);\n }\n }\n shouldBeRefreshed(gracePeriod) {\n const now = new Date().getTime();\n const refreshTokenExpiresAt = this.refreshToken.payload.exp * 1000;\n const expired = now > refreshTokenExpiresAt;\n const shouldRefresh = now - gracePeriod > refreshTokenExpiresAt;\n return !expired && shouldRefresh;\n }\n async refreshIf(gracePeriod) {\n if (!this.shouldBeRefreshed(gracePeriod)) {\n return;\n }\n await this.refresh();\n }\n logout() {\n const url = new URL(this.uri.logout);\n url.searchParams.set(\"post_logout_redirect_uri\", this.uri.redirect);\n url.searchParams.set(\"id_token_hint\", this.token.id_token);\n window.location = url;\n }\n\n bearerToken() {\n return `Bearer ${this.token.access_token}`;\n }\n \n interceptor(gracePeriodBefore, gracePeriodAfter){\n return new AuthorizationCodeFlowInterceptor(this, gracePeriodBefore, gracePeriodAfter); \n }\n}\n\nclass AuthorizationCodeFlowInterceptor {\n constructor(session, gracePeriodBefore, gracePeriodAfter) {\n this.session = session;\n this.gracePeriodBefore = gracePeriodBefore || 2000;\n this.gracePeriodAfter = gracePeriodAfter || 30000;\n }\n async intercept(request, chain) {\n await this.session.refreshIf(this.gracePeriodBefore);\n const headers = new Headers(request.options.headers);\n headers.set(\"Authorization\", this.session.bearerToken());\n request.options.headers = headers;\n const response = await chain.proceed(request);\n await this.session.refreshIf(this.gracePeriodAfter);\n return response;\n }\n}\n\n\nexport {AuthorizationCodeFlow, AuthorizationCodeFlowSession, AuthorizationCodeFlowInterceptor };","\nconst timing = {\n sleep(ms) {\n return new Promise(resolve => setTimeout(resolve, ms));\n },\n DEBOUNCE_DEFAULT: 0,\n DEBOUNCE_IMMEDIATE: 1,\n debounce(timeoutMs, func, options) {\n let tid = null;\n let args = [];\n let previousTimestamp = 0;\n let opts = options || timing.DEBOUNCE_DEFAULT;\n\n const later = () => {\n const elapsed = new Date().getTime() - previousTimestamp;\n if (timeoutMs > elapsed) {\n tid = setTimeout(later, timeoutMs - elapsed);\n return;\n }\n tid = null;\n if (opts !== timing.DEBOUNCE_IMMEDIATE) {\n func(...args);\n }\n // This check is needed because `func` can recursively invoke `debounced`.\n if (tid === null) {\n args = [];\n }\n };\n\n return function () {\n args = arguments;\n previousTimestamp = new Date().getTime();\n if (tid === null) {\n tid = setTimeout(later, timeoutMs);\n if (opts === timing.DEBOUNCE_IMMEDIATE) {\n func(...args);\n }\n }\n };\n },\n THROTTLE_DEFAULT: 0,\n THROTTLE_NO_LEADING: 1,\n THROTTLE_NO_TRAILING: 2,\n throttle(timeoutMs, func, options) {\n let tid = null;\n let args = [];\n let previousTimestamp = 0;\n let opts = options || timing.THROTTLE_DEFAULT;\n\n const later = () => {\n previousTimestamp = (opts & timing.THROTTLE_NO_LEADING) ? 0 : new Date().getTime();\n tid = null;\n func(...args);\n if (tid === null) {\n args = [];\n }\n };\n\n return function () {\n const now = new Date().getTime();\n if (!previousTimestamp && (opts & timing.THROTTLE_NO_LEADING)) {\n previousTimestamp = now;\n }\n const remaining = timeoutMs - (now - previousTimestamp);\n args = arguments;\n if (remaining <= 0 || remaining > timeoutMs) {\n if (tid !== null) {\n clearTimeout(tid);\n tid = null;\n }\n previousTimestamp = now;\n func(...args);\n if (tid === null) {\n args = [];\n }\n } else if (tid === null && !(opts & timing.THROTTLE_NO_TRAILING)) {\n tid = setTimeout(later, remaining);\n }\n };\n\n }\n};\n\n\nexport { timing };","class Fragments {\n static fromHtml(...html) {\n const el = document.createElement('div');\n el.innerHTML = html.join(\"\");\n const fragment = new DocumentFragment();\n Array.from(el.childNodes).forEach(node => {\n fragment.appendChild(node);\n });\n return fragment;\n } \n static toHtml(fragment) {\n var r = document.createElement(\"root\");\n r.appendChild(fragment);\n return r.innerHTML;\n }\n static from(...nodes) {\n const fragment = new DocumentFragment();\n for (let i = 0; i !== nodes.length; ++i) {\n fragment.appendChild(nodes[i]);\n }\n return fragment;\n }\n static fromChildNodes(el) {\n const nodes = Array.from(el.childNodes);\n const fragment = new DocumentFragment();\n for (let i = 0; i !== nodes.length; ++i) {\n fragment.appendChild(nodes[i]);\n }\n return fragment;\n }\n}\n\nclass Attributes {\n static id = 0;\n static uid(prefix) {\n return `${prefix}-${++Attributes.id}`;\n }\n static asBoolean(value) {\n return value !== null && value !== undefined && value !== false;\n }\n static defaultValue(el, k, v) {\n if (!el.hasAttribute(k)) {\n el.setAttribute(k, v);\n }\n return el.getAttribute(k);\n }\n static forward(prefix, from, to) {\n from.getAttributeNames()\n .filter(a => a.startsWith(prefix))\n .forEach(a => {\n const target = a.substring(prefix.length);\n if (target === 'class') {\n to.classList.add(...from.getAttribute(prefix + \"class\").split(\" \").filter(a => a.length));\n return;\n }\n to.setAttribute(target, from.getAttribute(a))\n });\n }\n}\n\nclass Slots {\n static from(el) {\n const namedSlots = Array.from(el.childNodes)\n .filter(el => el.matches && el.matches('[slot]'))\n .map(el => {\n el.remove();\n const slot = el.getAttribute(\"slot\");\n el.removeAttribute(\"slot\");\n return [slot, el];\n });\n const slotted = Object.fromEntries(namedSlots);\n slotted.default = new DocumentFragment();\n slotted.default.append(...el.childNodes);\n return slotted;\n }\n}\n\nconst Templated = (SuperClass, template) => {\n return class extends SuperClass {\n rendered_;\n get rendered() {\n return this.rendered_;\n }\n async connectedCallback() {\n if (this.rendered_) {\n return;\n }\n const slotted = Slots.from(this);\n const fragment = await Promise.resolve(this.render(slotted, template));\n this.innerHTML = '';\n if (fragment) {\n this.appendChild(fragment);\n }\n this.rendered_ = true;\n }\n };\n}\n\nconst Stateful = (SuperClass, flags, others) => {\n\n const all = [].concat(flags).concat(others || []);\n\n return class extends SuperClass {\n static get observedAttributes() {\n return all;\n }\n constructor(...args) {\n super(...args);\n this.internals_ = this.internals_ || this.attachInternals();\n for (const flag of flags) {\n Object.defineProperty(this, flag, {\n get() {\n return this.hasAttribute(flag);\n },\n set(value) {\n //see https://developer.mozilla.org/en-US/docs/Web/API/CustomStateSet#using_double_dash_prefixed_idents\n if (Attributes.asBoolean(value)) {\n this.internals_.states.add(`--${flag}`);\n this.setAttribute(flag, '');\n return;\n }\n this.internals_.states.delete(`--${flag}`);\n this.removeAttribute(flag);\n }\n });\n }\n }\n attributeChangedCallback(name, oldValue, newValue) {\n if (oldValue === newValue) {\n return;\n }\n this[name] = newValue;\n const method = this[`on${name.charAt(0).toUpperCase()}${name.substr(1).toLowerCase()}Changed`];\n method?.call(this, newValue, oldValue);\n }\n };\n}\n\nexport { Fragments, Attributes, Slots, Templated, Stateful };\n","\nimport { Templated } from \"./elements.mjs\"\n\n\nclass FieldError extends Templated(HTMLElement) {\n render(slotted, template) {\n this.classList.add('invalid-feedback');\n }\n static configure() {\n customElements.define('ful-field-error', FieldError);\n }\n}\n\nclass Errors extends Templated(HTMLElement) {\n render(slotted, template) {\n this.classList.add('alert', 'alert-danger', 'd-none');\n }\n static configure() {\n customElements.define('ful-errors', Errors);\n }\n\n}\n\n\nexport { FieldError, Errors }","/* global Infinity, CSS */\n\nimport { Failure } from \"../http-client.mjs\";\nimport { Observable } from \"../observable.mjs\";\nimport { Templated } from \"./elements.mjs\"\n\nclass Form extends Templated(Observable(HTMLElement)) {\n constructor({ mutators, extractors, valueHoldersSelector, ignoredChildrenSelector }) {\n super();\n this.mutators = mutators || {}\n this.extractors = extractors || {}\n this.valueHoldersSelector = valueHoldersSelector || '[name]';\n this.ignoredChildrenSelector = ignoredChildrenSelector || '.d-none, [hidden]';\n }\n render(slotted, template) {\n const form = document.createElement('form');\n form.append(slotted.default);\n form.addEventListener('submit', async (e) => {\n e.preventDefault();\n this.spinner(true);\n try {\n await this.fire('submit', this.getValues(), this);\n } catch (e) {\n if (e instanceof Failure) {\n this.setErrors(e.problems);\n return;\n }\n throw e;\n } finally {\n this.spinner(false)\n }\n })\n return form;\n }\n spinner(spin) {\n this.querySelectorAll('ful-spinner').forEach(el => {\n el.hidden = !spin;\n })\n this.querySelectorAll('[type=submit],[type=reset]').forEach(el => {\n el.disabled = spin;\n })\n }\n setValues(values) {\n for (let k in values) {\n if (!values.hasOwnProperty(k)) {\n continue;\n }\n Array.from(this.querySelectorAll(`[name='${CSS.escape(k)}']`)).forEach((el) => {\n Form.mutate(this.mutators, el, values[k], k, values);\n });\n }\n }\n getValues() {\n return Array.from(this.querySelectorAll(this.valueHoldersSelector))\n .filter((el) => {\n if (el.dataset['fulBindInclude'] === 'never') {\n return false;\n }\n return el.dataset['fulBindInclude'] === 'always' || el.closest(this.ignoredChildrenSelector) === null;\n })\n .reduce((result, el) => {\n return Form.providePath(result, el.getAttribute('name'), Form.extract(this.extractors, el));\n }, {});\n }\n setErrors(errors, scroll) {\n this.clearErrors();\n errors\n .filter((e) => e.type === 'FIELD_ERROR' || e.type === 'INVALID_FORMAT')\n .forEach((e) => {\n const name = e.context.replace(\"[\", \".\").replace(\"].\", \".\");\n this.querySelectorAll(`[name='${CSS.escape(name)}']`)\n .forEach(input => {\n input.classList.add('is-invalid')\n if (input.parentElement.classList.contains(\"form-floating\")) {\n input.parentElement.classList.add('is-invalid')\n }\n });\n this.querySelectorAll(`ful-field-error[field='${CSS.escape(name)}']`)\n .forEach(el => el.innerText = e.reason);\n });\n this.querySelectorAll(\"ful-errors\")\n .forEach(el => {\n const globalErrors = errors.filter((e) => e.type !== 'FIELD_ERROR' && e.type !== 'INVALID_FORMAT');\n el.innerHTML = globalErrors.map(e => e.reason).join(\"\\n\");\n if (globalErrors.length !== 0) {\n el.classList.remove('d-none');\n }\n })\n\n if (!scroll) {\n return;\n }\n const ys = Array.from(this.querySelectorAll('ful-field-error:not(.d-none)'))\n .map(el => el.getBoundingClientRect().y + window.scrollY)\n const miny = Math.min(...ys);\n if (miny !== Infinity) {\n window.scroll(window.scrollX, miny > 100 ? miny - 100 : 0);\n }\n }\n clearErrors() {\n this.querySelectorAll('[name].is-invalid, .form-floating.is-invalid')\n .forEach(el => el.classList.remove('is-invalid'));\n this.querySelectorAll(\"ful-errors\")\n .forEach(el => {\n el.innerHTML = '';\n el.classList.add('d-none');\n });\n }\n static extract(extractors, el) {\n const maybeExtractor = extractors[el.dataset['fulBindExtractor']] || extractors[el.dataset['fulBindProvide']];\n if (maybeExtractor) {\n return maybeExtractor(el);\n }\n if (el.getAttribute('type') === 'radio') {\n if (!el.checked) {\n return undefined;\n }\n return el.dataset['fulBindType'] === 'boolean' ? el.value === 'true' : el.value;\n }\n if (el.getAttribute('type') === 'checkbox') {\n return el.checked;\n }\n if (el.dataset['fulBindType'] === 'boolean') {\n return !el.value ? null : el.value === 'true';\n }\n if (el.getValue) {\n return el.getValue();\n }\n return el.value || null;\n }\n static mutate(mutators, el, raw, key, values) {\n const maybeMutator = mutators[el.dataset['fulBindMutator']] || mutators[el.dataset['fulBindProvide']];\n if (maybeMutator) {\n maybeMutator(el, raw, key, values);\n return;\n }\n if (el.getAttribute('type') === 'radio') {\n el.checked = el.getAttribute('value') === raw;\n return;\n }\n if (el.getAttribute('type') === 'checkbox') {\n el.checked = raw;\n return;\n }\n if (el.setValue) {\n el.setValue(raw);\n return;\n }\n el.value = raw;\n }\n\n static providePath(result, path, value) {\n const keys = path.split(\".\").map((k) => k.match(/^[0-9]+$/) ? +k : k);\n let current = result;\n let previous = null;\n for (let i = 0; ; ++i) {\n const ckey = keys[i];\n const pkey = keys[i - 1];\n if (Number.isInteger(ckey) && !Array.isArray(current)) {\n if (previous !== null) {\n previous[pkey] = current = [];\n } else {\n result = current = [];\n }\n }\n if (i === keys.length - 1) {\n //when value is undefined we only want to define the property if it's not defined \n current[ckey] = value !== undefined ? value : (ckey in current ? current[ckey] : null);\n return result;\n }\n if (current[ckey] === undefined) {\n current[ckey] = {};\n }\n previous = current;\n current = current[ckey];\n }\n }\n static custom(tagName, configuration) {\n customElements.define(tagName, class extends Form {\n constructor() {\n super(configuration);\n }\n });\n }\n}\n\nexport { Form };\n","import { Attributes, Templated } from \"./elements.mjs\"\n\nconst ful_input_ec = globalThis.ec || ftl.EvaluationContext.configure({\n\n});\n\nconst ful_input_template_ = globalThis.ful_input_template || ftl.Template.fromHtml(`\n <div data-tpl-if=\"floating\" class=\"input-group has-validation\">\n <span data-tpl-if=\"slotted.ibefore\" class=\"input-group-text\">{{{{ slotted.ibefore }}}}</span>\n <div data-tpl-if=\"slotted.before\" data-tpl-remove=\"tag\">{{{{ slotted.before }}}}</div>\n <div class=\"form-floating\">\n {{{{ slotted.input }}}} \n <label data-tpl-for=\"name\" class=\"form-label\">{{{{ slotted.default }}}}</label>\n </div>\n <div data-tpl-if=\"slotted.after\" data-tpl-remove=\"tag\">{{{{ slotted.after }}}}</div>\n <span data-tpl-if=\"slotted.iafter\" class=\"input-group-text\">{{{{ slotted.iafter }}}}</span>\n <ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error>\n </div>\n <div data-tpl-if=\"!floating\" data-tpl-remove=\"tag\">\n <label data-tpl-for=\"id\" class=\"form-label\">{{{{ slotted.default }}}}</label>\n <div class=\"input-group has-validation\">\n <span data-tpl-if=\"slotted.ibefore\" class=\"input-group-text\">{{{{ slotted.ibefore }}}}</span>\n <div data-tpl-if=\"slotted.before\" data-tpl-remove=\"tag\">{{{{ slotted.before }}}}</div>\n {{{{ slotted.input }}}} \n <div data-tpl-if=\"slotted.after\" data-tpl-remove=\"tag\">{{{{ slotted.after }}}}</div>\n <span data-tpl-if=\"slotted.iafter\" class=\"input-group-text\">{{{{ slotted.iafter }}}}</span>\n <ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error>\n </div>\n </div>\n`, ful_input_ec);\n\n\n\nclass Input extends Templated(HTMLElement, ful_input_template_) {\n render(slotted, template) {\n const floating = this.hasAttribute('floating');\n const input = slotted.input = slotted.input || (() => {\n const el = document.createElement(\"input\")\n el.classList.add(\"form-control\");\n return el;\n })();\n const id = input.getAttribute('id') || this.getAttribute('input-id') || Attributes.uid('ful-input');\n Attributes.forward('input-', this, slotted.input)\n Attributes.defaultValue(slotted.input, \"id\", id);\n Attributes.defaultValue(slotted.input, \"type\", \"text\");\n Attributes.defaultValue(slotted.input, \"placeholder\", \" \");\n const name = input.getAttribute('name');\n return template.render({ id, name, floating, slotted });\n }\n static configure() {\n customElements.define('ful-input', Input);\n }\n}\n\n\n\n\nexport { Input };\n","import { Fragments, Attributes, Templated } from \"./elements.mjs\"\nimport { Observable } from \"../observable.mjs\";\n/**\n * <script src=\"tom-select.complete.js\"></script>\n * <link href=\"tom-select.bootstrap5.css\" rel=\"stylesheet\" />\n */\nconst ful_select_ec = globalThis.ec || ftl.EvaluationContext.configure({\n\n});\n\nconst ful_select_template_ = globalThis.ful_select_template || ftl.Template.fromHtml(`\n <div data-tpl-if=\"floating\" class=\"input-group has-validation\">\n <span data-tpl-if=\"slotted.ibefore\" class=\"input-group-text\">{{{{ slotted.ibefore }}}}</span>\n <div data-tpl-if=\"slotted.before\" data-tpl-remove=\"tag\">{{{{ slotted.before }}}}</div>\n <div class=\"form-floating\">\n {{{{ slotted.input }}}} \n <label data-tpl-for=\"name\" class=\"form-label\">{{{{ slotted.default }}}}</label>\n </div>\n <div data-tpl-if=\"slotted.after\" data-tpl-remove=\"tag\">{{{{ slotted.after }}}}</div>\n <span data-tpl-if=\"slotted.iafter\" class=\"input-group-text\">{{{{ slotted.iafter }}}}</span>\n <ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error>\n </div>\n <div data-tpl-if=\"!floating\" data-tpl-remove=\"tag\">\n <label data-tpl-for=\"id\" class=\"form-label\">{{{{ slotted.default }}}}</label>\n <div class=\"input-group has-validation\">\n <span data-tpl-if=\"slotted.ibefore\" class=\"input-group-text\">{{{{ slotted.ibefore }}}}</span>\n <div data-tpl-if=\"slotted.before\" data-tpl-remove=\"tag\">{{{{ slotted.before }}}}</div>\n {{{{ slotted.input }}}} \n <div data-tpl-if=\"slotted.after\" data-tpl-remove=\"tag\">{{{{ slotted.after }}}}</div>\n <span data-tpl-if=\"slotted.iafter\" class=\"input-group-text\">{{{{ slotted.iafter }}}}</span>\n <ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error> \n </div>\n </div>\n`, ful_select_ec);\n\n\nclass Select extends Templated(HTMLElement, ful_select_template_) {\n constructor(tsConfig) {\n super();\n this.tsConfig = tsConfig;\n }\n render(slotted, template) {\n const floating = this.hasAttribute('floating');\n\n const type = this.getAttribute(\"type\") || 'local';\n const remote = type != 'local';\n const loadOnce = this.getAttribute('load') != 'always';\n\n const input = slotted.input = slotted.input || (() => {\n return document.createElement(\"select\");\n })();\n const id = input.getAttribute('id') || this.getAttribute('input-id') || Attributes.uid('ful-select');\n Attributes.forward('input-', this, input)\n Attributes.defaultValue(input, \"id\", id);\n Attributes.defaultValue(input, \"placeholder\", \" \");\n const name = input.getAttribute('name');\n input.setValue = this.setValue.bind(this);\n input.getValue = this.getValue.bind(this);\n\n //tomselect needs the input to have a parent.\n //se we move the input to a fragment\n slotted.input = Fragments.from(input);\n\n this.loaded = !remote;\n\n const tsDefaultConfig = {\n render: {\n loading: () => '<ful-spinner class=\"centered p-2\"></ful-spinner>'\n }\n }\n\n this.ts = new TomSelect(input, Object.assign(remote ? {\n preload: 'focus',\n load: async (query, callback) => {\n if (!remote || remote && loadOnce && this.loaded) {\n callback();\n return;\n }\n const data = await this.load(query);\n this.loaded = true;\n callback(data);\n },\n shouldLoad: (query) => this.shouldLoad(query)\n } : {}, tsDefaultConfig, this.tsConfig));\n\n return template.render({ id, name, floating, slotted });\n }\n shouldLoad(q){\n return true;\n }\n load(q){\n return []\n }\n async setValue(v) {\n if (!this.loaded) {\n await this.ts.load();\n }\n this.ts.setValue(v);\n }\n getValue() {\n const v = this.ts.getValue();\n return v === '' ? null : v;\n }\n static custom(tagName, configuration) {\n customElements.define(tagName, class extends Select {\n constructor() {\n super(configuration);\n }\n });\n }\n static configure() {\n return Select.custom('ful-select');\n }\n\n}\n\nexport { Select };\n","import { Attributes, Fragments, Stateful, Templated } from \"./elements.mjs\"\n\n\n\n\n\nconst ful_radiogroup_ec = globalThis.ec || ftl.EvaluationContext.configure({\n\n});\n\nconst ful_radiougroup_template_ = globalThis.ful_radiogroup_template || ftl.Template.fromHtml(`\n <fieldset>\n <legend class=\"form-label\">\n {{{{ slotted.default }}}}\n </legend>\n <header data-tpl-if=\"slotted.header\">\n {{{{ slotted.header }}}}\n </header>\n <section>\n <label data-tpl-each=\"inputsAndLabels\" data-tpl-var=\"ial\">\n {{{{ ial[0] }}}}\n {{{{ ial[1] }}}}\n </label>\n </section>\n <ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error>\n </fieldset>\n`, ful_radiogroup_ec);\n\n\nclass RadioGroup extends Stateful(Templated(HTMLElement, ful_radiougroup_template_), ['disabled']) {\n render(slotted, template) { \n const name = this.getAttribute('input-name') || Attributes.uid('ful-radiogroup');\n const radioEls = Array.from(slotted.default.querySelectorAll('ful-radio'));\n const inputsAndLabels = radioEls.map(el => {\n const input = document.createElement('input');\n input.setAttribute('type', 'radio');\n Attributes.forward('input-', this, input);\n Attributes.forward('', el, input);\n Attributes.defaultValue(input, 'name', name);\n const label = Fragments.fromChildNodes(el);\n return [input, label];\n });\n radioEls.forEach(el => el.remove());\n \n const fragment = template.render({\n name: name,\n slotted: slotted,\n inputsAndLabels: inputsAndLabels\n });\n return fragment;\n }\n static configure() {\n customElements.define('ful-radio-group', RadioGroup);\n } \n}\n\n\nexport { RadioGroup };","import { Attributes, Fragments, Templated } from \"./elements.mjs\"\n\n\n\nconst ful_spinner_ec = globalThis.ec || ftl.EvaluationContext.configure({\n\n});\n\nconst ful_spinner_template_ = globalThis.ful_spinner_template || ftl.Template.fromHtml(`\n <div class=\"ful-spinner-wrapper\">\n <div class=\"ful-spinner-text\">{{{{ slotted.default }}}}</div>\n <div class=\"ful-spinner-icon\"></div>\n </div>\n`, ful_spinner_ec);\n\n\nclass Spinner extends Templated(HTMLElement, ful_spinner_template_) {\n render(slotted, template) {\n return template.render({ slotted });\n }\n static configure() {\n customElements.define('ful-spinner', Spinner);\n }\n}\n\nexport { Spinner };","class Wizard extends HTMLElement {\n constructor() {\n super();\n this.progress = [...this.children].filter(e => e.matches(\"header,ol,ul\"));\n\n this.progress.forEach(p => {\n const children = [...p.children];\n const current = children.filter(e => e.matches(\".active\"))[0];\n if (current === undefined && children.length > 0) {\n children[0].classList.add('active');\n }\n });\n if (this.querySelector('section.current') === null) {\n const firstSection = this.querySelector('section:first-of-type');\n if (firstSection !== null) {\n firstSection.classList.add('current');\n }\n }\n }\n next() {\n this.progress.forEach(p => {\n const children = [...p.children];\n const current = children.filter(e => e.matches(\".active\"))[0];\n current?.classList.remove('active');\n current?.nextElementSibling?.classList.add('active');\n });\n const currentSection = this.querySelector('section.current');\n currentSection.classList.remove(\"current\");\n currentSection.nextElementSibling.classList.add('current');\n\n this.dispatchEvent(new CustomEvent('wizard:activate', {\n bubbles: true,\n cancelable: true\n }));\n\n }\n prev() {\n this.progress.forEach(p => {\n const children = [...p.children];\n const current = children.filter(e => e.matches(\".active\"))[0];\n current?.classList.remove('active');\n current?.previousElementSibling?.classList.add('active');\n });\n const currentSection = this.querySelector('section.current');\n currentSection.classList.remove(\"current\");\n currentSection.previousElementSibling.classList.add('current');\n this.dispatchEvent(new CustomEvent('wizard:activate', {\n bubbles: true,\n cancelable: true\n }));\n }\n moveTo = function (n) {\n this.progress.forEach(p => {\n const children = [...p.children];\n const current = children.filter(e => e.matches(\".active\"))[0];\n current?.classList.remove('active');\n p.children[+n]?.classList.add('active');\n });\n const currentSection = this.querySelector('section.current');\n currentSection?.classList.remove(\"current\");\n const nthSection = this.querySelector(`section:nth-child(${+n})`);\n nthSection.classList.add('current');\n this.dispatchEvent(new CustomEvent('wizard:activate', {\n bubbles: true,\n cancelable: true\n }));\n }\n static custom(tagName, configuration) {\n customElements.define(tagName, class extends Wizard {\n constructor() {\n super(configuration);\n }\n });\n }\n static configure() {\n return Wizard.custom('ful-wizard');\n }\n}\n\n\n\n\nexport { Wizard };\n","class App {\n constructor() {\n this.configurers = [];\n this.initializers = [];\n this.handlers = [];\n this.running = false;\n document.addEventListener(\"DOMContentLoaded\", async () => {\n await Promise.all(this.configurers);\n await Promise.all(this.initializers.map(h => Promise.resolve(h())));\n await Promise.all(this.handlers.map(h => Promise.resolve(h())));\n });\n }\n configure(cb) {\n this.configurers.push(Promise.resolve(cb()));\n return this;\n }\n initialize(cb) {\n this.initializers.push(cb);\n return this;\n }\n ready(cb) {\n this.handlers.push(cb);\n return this;\n }\n}\n\nexport { App };\n"],"names":["Base64","encode","arrayBuffer","dialect","d","URL_SAFE","len","byteLength","view","Uint8Array","res","i","substring","length","decode","str","nbytes","Math","floor","vi","si","v1","indexOf","charAt","v2","v3","v4","buffer","STANDARD","Hex","hex","Error","lenInBytes","map","e","offset","octet","parseInt","bytes","upper","Array","from","b","toString","toUpperCase","o","padStart","join","Observable","SuperClass","constructor","args","super","this","listeners","fireSync","event","data","initialAcc","acc","l","fire","on","listener","push","un","idx","splice","ContextInterceptor","context","document","querySelector","getAttribute","endsWith","intercept","request","chain","separator","resource","startsWith","proceed","CsrfTokenInterceptor","k","v","headers","Headers","options","set","RedirectOnUnauthorizedInterceptor","redirectUri","response","status","window","location","href","Failure","parseProblems","text","def","type","reason","details","JSON","parse","fromResponse","problems","stringify","name","HttpClientBuilder","interceptors","withContext","withCsrfToken","withRedirectOnUnauthorized","withInterceptors","build","HttpClient","HttpCall","fetch","HttpInterceptorChain","current","interceptor","builder","exchange","opts","ok","message","json","undefined","jsonRequest","method","body","jsonPost","jsonPut","jsonPatch","Storage","prefix","storage","save","setItem","load","got","getItem","remove","removeItem","pop","decoded","LocalStorage","localStorage","SessionStorage","sessionStorage","VersionedStorage","key","dataSupplier","cache","revision","saved","value","freshData","AuthorizationCodeFlow","forKeycloak","clientId","realmBaseUrl","auth","URL","token","logout","registration","redirect","scope","uri","action","additionalParams","pkceVerifier","crypto","getRandomValues","pkceChallenge","subtle","digest","TextEncoder","state","PKCE_AND_STATE_KEY","verifier","url","searchParams","Object","entries","forEach","kv","applicationInitiatedAction","kcAction","kc_action","_tokenExchange","code","history","replaceState","stateAndVerifier","URLSearchParams","AuthorizationCodeFlowSession","ensureLoggedIn","get","parseToken","rawHeader","rawPayload","signature","split","ut8decoder","TextDecoder","header","payload","t","accessToken","access_token","refreshToken","refresh_token","refreshCallback","onRefresh","callback","refresh","shouldBeRefreshed","gracePeriod","now","Date","getTime","refreshTokenExpiresAt","exp","refreshIf","id_token","bearerToken","gracePeriodBefore","gracePeriodAfter","AuthorizationCodeFlowInterceptor","session","timing","sleep","ms","Promise","resolve","setTimeout","DEBOUNCE_DEFAULT","DEBOUNCE_IMMEDIATE","debounce","timeoutMs","func","tid","previousTimestamp","later","elapsed","arguments","THROTTLE_DEFAULT","THROTTLE_NO_LEADING","THROTTLE_NO_TRAILING","throttle","remaining","clearTimeout","Fragments","fromHtml","html","el","createElement","innerHTML","fragment","DocumentFragment","childNodes","node","appendChild","toHtml","r","nodes","fromChildNodes","Attributes","static","uid","id","asBoolean","defaultValue","hasAttribute","setAttribute","forward","to","getAttributeNames","filter","a","target","classList","add","Slots","namedSlots","matches","slot","removeAttribute","slotted","fromEntries","default","append","Templated","template","rendered_","rendered","connectedCallback","render","Stateful","flags","others","all","concat","observedAttributes","internals_","attachInternals","flag","defineProperty","states","delete","attributeChangedCallback","oldValue","newValue","substr","toLowerCase","call","FieldError","HTMLElement","configure","customElements","define","Errors","Form","mutators","extractors","valueHoldersSelector","ignoredChildrenSelector","form","addEventListener","async","preventDefault","spinner","getValues","setErrors","spin","querySelectorAll","hidden","disabled","setValues","values","hasOwnProperty","CSS","escape","mutate","dataset","closest","reduce","result","providePath","extract","errors","scroll","clearErrors","replace","input","parentElement","contains","innerText","globalErrors","ys","getBoundingClientRect","y","scrollY","miny","min","Infinity","scrollX","maybeExtractor","checked","getValue","raw","maybeMutator","setValue","path","keys","match","previous","ckey","pkey","Number","isInteger","isArray","custom","tagName","configuration","ful_input_ec","globalThis","ec","ftl","EvaluationContext","ful_input_template_","ful_input_template","Template","Input","floating","ful_select_ec","ful_select_template_","ful_select_template","Select","tsConfig","remote","loadOnce","bind","loaded","ts","TomSelect","assign","preload","query","shouldLoad","loading","q","ful_radiogroup_ec","ful_radiougroup_template_","ful_radiogroup_template","RadioGroup","radioEls","inputsAndLabels","ful_spinner_ec","ful_spinner_template_","ful_spinner_template","Spinner","Wizard","progress","children","p","firstSection","next","nextElementSibling","currentSection","dispatchEvent","CustomEvent","bubbles","cancelable","prev","previousElementSibling","moveTo","n","App","configurers","initializers","handlers","running","h","cb","initialize","ready"],"mappings":"AAEA,MAAMA,EACF,aAAOC,CAAOC,EAAaC,GACvB,MAAMC,EAAID,GAAWH,EAAOK,SACtBC,EAAMJ,EAAYK,WAClBC,EAAO,IAAIC,WAAWP,GAC5B,IAAIQ,EAAM,GACV,IAAK,IAAIC,EAAI,EAAGA,EAAIL,EAAKK,GAAK,EAAG,CAK7BD,GAJWN,EAAEI,EAAKG,IAAM,GACbP,GAAc,EAAVI,EAAKG,KAAW,EAAMH,EAAKG,EAAI,IAAM,GACzCP,GAAkB,GAAdI,EAAKG,EAAI,KAAY,EAAMH,EAAKG,EAAI,IAAM,GAC9CP,EAAgB,GAAdI,EAAKG,EAAI,GAEzB,CAMD,OALIL,EAAM,GAAM,EACZI,EAAMA,EAAIE,UAAU,EAAGF,EAAIG,OAAS,GAC7BP,EAAM,GAAM,IACnBI,EAAMA,EAAIE,UAAU,EAAGF,EAAIG,OAAS,IAEjCH,CACV,CACD,aAAOI,CAAOC,EAAKZ,GACf,MAAMC,EAAID,GAAWH,EAAOK,SAC5B,IAAIW,EAASC,KAAKC,MAAmB,IAAbH,EAAIF,QAC5B,IAAK,IAAIF,EAAI,EAAGA,IAAMI,EAAIF,QACU,MAA5BE,EAAIA,EAAIF,OAASF,EAAI,KADOA,IAI9BK,EAEN,MAAMR,EAAO,IAAIC,WAAWO,GAE5B,IAAIG,EAAK,EACLC,EAAK,EACT,KAAOD,EAAkB,IAAbJ,EAAIF,QAAe,CAC3B,MAAMQ,EAAKjB,EAAEkB,QAAQP,EAAIQ,OAAOH,MAC1BI,EAAKpB,EAAEkB,QAAQP,EAAIQ,OAAOH,MAC1BK,EAAKrB,EAAEkB,QAAQP,EAAIQ,OAAOH,MAC1BM,EAAKtB,EAAEkB,QAAQP,EAAIQ,OAAOH,MAChCZ,EAAKW,KAASE,GAAM,EAAMG,GAAM,EAChChB,EAAKW,MAAe,GAALK,IAAY,EAAMC,GAAM,EACvCjB,EAAKW,MAAe,EAALM,IAAW,EAAKC,CAClC,CAED,OAAOlB,EAAKmB,MACf,EAGL3B,EAAO4B,SAAW,mEAClB5B,EAAOK,SAAW,mEAGlB,MAAMwB,EACF,aAAOf,CAAOgB,GACV,GAAIA,EAAIjB,OAAS,GAAM,EACnB,MAAM,IAAIkB,MAAM,kBAEpB,MAAMC,EAAaF,EAAIjB,OAAS,EAChC,OAAO,IAAIJ,WAAWuB,GAAYC,KAAI,CAACC,EAAGvB,KACtC,MAAMwB,EAAa,EAAJxB,EACTyB,EAAQN,EAAIlB,UAAUuB,EAAQA,EAAS,GAC7C,OAAOE,SAASD,EAAO,GAAG,GAEjC,CACD,aAAOnC,CAAOqC,EAAOC,GACjB,OAAOC,MAAMC,KAAKH,GACTL,KAAIS,GAAKA,EAAEC,SAAS,MACpBV,KAAIS,GAAKH,EAAQG,EAAEE,cAAgBF,IACnCT,KAAIY,GAAKA,EAAEC,SAAS,EAAG,KACvBC,KAAK,GACjB,ECtEA,MAACC,EAAcC,GAAe,cAAcA,EAC7C,WAAAC,IAAeC,GACXC,SAASD,GACTE,KAAKC,UAAY,EACpB,CACD,QAAAC,CAASC,EAAOC,EAAMC,GAClB,MAAMJ,EAAYD,KAAKC,UAAUE,IAAU,GAC3C,IAAIG,EAAMD,EACV,IAAK,MAAME,KAAKN,EACZK,EAAMC,EAAEH,EAAMJ,KAAMM,GAExB,OAAOA,CACV,CACD,UAAME,CAAKL,EAAOC,EAAMC,GACpB,MAAMJ,EAAYD,KAAKC,UAAUE,IAAU,GAC3C,IAAIG,EAAMD,EACV,IAAK,MAAME,KAAKN,EACZK,QAAYC,EAAEH,EAAMJ,KAAMM,GAE9B,OAAOA,CACV,CACD,EAAAG,CAAGN,EAAOO,GACNV,KAAKC,UAAUE,GAASH,KAAKC,UAAUE,IAAU,GACjDH,KAAKC,UAAUE,GAAOQ,KAAKD,EAC9B,CACD,EAAAE,CAAGT,EAAOO,GACN,MAAMT,EAAYD,KAAKC,UAAUE,IAAU,GACrCU,EAAMZ,EAAUhC,QAAQyC,GAC9B,OAAgB,IAATG,EAAa,GAAKZ,EAAUa,OAAOD,EAAK,EAClD,GC9BL,MAAME,EACF,WAAAlB,GACI,MAAMmB,EAAUC,SAASC,cAAc,wBAAwBC,aAAa,WAC5EnB,KAAKgB,QAAUA,EAAQI,SAAS,KAAOJ,EAAQzD,UAAU,EAAGyD,EAAQxD,OAAS,GAAKwD,CACrF,CACD,eAAMK,CAAUC,EAASC,GACrB,MAAMC,EAAYF,EAAQG,SAASC,WAAW,KAAO,GAAK,IAE1D,OADAJ,EAAQG,SAAWzB,KAAKgB,QAAUQ,EAAYF,EAAQG,eACzCF,EAAMI,QAAQL,EAC9B,EAGL,MAAMM,EACF,WAAA/B,GACIG,KAAK6B,EAAIZ,SAASC,cAAc,6BAA6BC,aAAa,WAC1EnB,KAAK8B,EAAIb,SAASC,cAAc,sBAAsBC,aAAa,UACtE,CACD,eAAME,CAAUC,EAASC,GACrB,MAAMQ,EAAU,IAAIC,QAAQV,EAAQW,QAAQF,SAG5C,OAFAA,EAAQG,IAAIlC,KAAK6B,EAAG7B,KAAK8B,GACzBR,EAAQW,QAAQF,QAAUA,QACbR,EAAMI,QAAQL,EAC9B,EAGL,MAAMa,EACF,WAAAtC,CAAYuC,GACRpC,KAAKoC,YAAcA,CACtB,CACD,eAAMf,CAAUC,EAASC,GACrB,MAAMc,QAAkBd,EAAMI,QAAQL,GACtC,GAAwB,MAApBe,EAASC,OACT,OAAOD,EAEXE,OAAOC,SAASC,KAAOzC,KAAKoC,WAC/B,EAGL,MAAMM,UAAgBhE,MAClB,oBAAOiE,CAAcL,EAAQM,GACzB,MAAMC,EAAM,CAAC,CACLC,KAAM,kBACN9B,QAAS,KACT+B,OAAQ,GAAGT,MAAWM,IACtBI,QAAS,OAEjB,IACI,OAAOJ,EAAOK,KAAKC,MAAMN,GAAQC,CACpC,CAAC,MAAOhE,GACL,OAAOgE,CACV,CACJ,CACD,mBAAOM,CAAab,EAAQM,GACxB,OAAO,IAAIF,EAAQJ,EAAQI,EAAQC,cAAcL,EAAQM,GAC5D,CACD,WAAA/C,CAAYyC,EAAQc,GAChBrD,MAAMkD,KAAKI,UAAUD,IACrBpD,KAAKsD,KAAO,WAAWhB,IACvBtC,KAAKsC,OAASA,EACdtC,KAAKoD,SAAWA,CACnB,EAGL,MAAMG,EACF,WAAA1D,GACIG,KAAKwD,aAAe,EACvB,CACD,WAAAC,GAEI,OADAzD,KAAKwD,aAAa7C,KAAK,IAAII,GACpBf,IACV,CACD,aAAA0D,GAEI,OADA1D,KAAKwD,aAAa7C,KAAK,IAAIiB,GACpB5B,IACV,CACD,0BAAA2D,CAA2BvB,GAEvB,OADApC,KAAKwD,aAAa7C,KAAK,IAAIwB,EAAkCC,IACtDpC,IACV,CACD,gBAAA4D,IAAoBJ,GAEhB,OADAxD,KAAKwD,aAAa7C,QAAQ6C,GACnBxD,IACV,CACD,KAAA6D,GACI,MAAML,EAAexD,KAAKwD,aAC1B,OAAO,IAAIM,EAAW,CAACN,gBAC1B,EAGL,MAAMO,EACF,eAAM1C,CAAUC,EAASC,GACrB,aAAayC,MAAM1C,EAAQG,SAAUH,EAAQW,QAChD,EAGL,MAAMgC,EACF,WAAApE,CAAY2D,EAAcU,GACtBlE,KAAKwD,aAAeA,EACpBxD,KAAKkE,QAAUA,CAClB,CACD,aAAMvC,CAAQL,GACV,MAAM6C,EAAcnE,KAAKwD,aAAaxD,KAAKkE,SAC3C,aAAaC,EAAY9C,UAAUC,EAAS,IAAI2C,EAAqBjE,KAAKwD,aAAcxD,KAAKkE,QAAU,GAC1G,EAIL,MAAMJ,EACF,cAAOM,GACH,OAAO,IAAIb,CACd,CACD,WAAA1D,EAAY2D,aAACA,IACTxD,KAAKwD,aAAeA,GAAgB,EACvC,CACD,cAAMa,CAAS5C,EAAUQ,GACrB,MAAMqC,EAAOrC,GAAW,GAClBuB,EAAe,IAAIxD,KAAKwD,gBAAiBc,EAAKd,cAAgB,GAAI,IAAIO,GACtExC,EAAQ,IAAI0C,EAAqBT,EAAc,GACrD,aAAajC,EAAMI,QAAQ,CAACF,WAAUQ,QAASqC,GAClD,CACD,WAAMN,CAAMvC,EAAUQ,GAClB,MAAMI,QAAiBrC,KAAKqE,SAAS5C,EAAUQ,GAC/C,IAAKI,EAASkC,GAAI,CACd,MAAMC,QAAgBnC,EAASO,OAC/B,MAAMF,EAAQS,aAAad,EAASC,OAAQkC,EAC/C,CACD,OAAOnC,CACV,CACD,UAAMoC,CAAKhD,EAAUQ,GACjB,IACI,MAAMI,QAAiBrC,KAAKgE,MAAMvC,EAAUQ,GACtCW,QAAaP,EAASO,OAC5B,OAAOA,EAAOK,KAAKC,MAAMN,QAAQ8B,CACpC,CAAC,MAAO7F,GACL,GAAIA,aAAa6D,EACb,MAAM7D,EAEV,MAAM,IAAI6D,EAAQ,EAAG,CAAC,CACdI,KAAM,qBACN9B,QAAS,KACT+B,OAAQlE,EAAE2F,QACVxB,QAAS,OAEpB,CACJ,EAGL,SAAS2B,EAAYC,EAAQC,EAAM9C,GAC/B,MAAO,CACHA,QAAS,CACL,eAAgB,sBACbA,GAEP6C,OAAQA,EACRC,KAAM5B,KAAKI,UAAUwB,GAE7B,CACA,SAASC,EAASD,EAAM9C,GACpB,OAAO4C,EAAY,OAAQE,EAAM9C,EACrC,CACA,SAASgD,EAAQF,EAAM9C,GACnB,OAAO4C,EAAY,MAAOE,EAAM9C,EACpC,CACA,SAASiD,EAAUH,EAAM9C,GACrB,OAAO4C,EAAY,QAASE,EAAM9C,EACtC,CCpKA,MAAMkD,EACF,WAAApF,CAAYqF,EAAQC,GAChBnF,KAAKkF,OAASA,EACdlF,KAAKmF,QAAUA,CAClB,CACD,IAAAC,CAAKvD,EAAGC,GACJ9B,KAAKmF,QAAQE,QAAQ,GAAGrF,KAAKkF,UAAUrD,IAAKoB,KAAKI,UAAUvB,GAC9D,CACD,IAAAwD,CAAKzD,GACD,MAAM0D,EAAMvF,KAAKmF,QAAQK,QAAQ,GAAGxF,KAAKkF,UAAUrD,KACnD,YAAe6C,IAARa,OAAoBb,EAAYzB,KAAKC,MAAMqC,EACrD,CACD,MAAAE,CAAO5D,GACH7B,KAAKmF,QAAQO,WAAW,GAAG1F,KAAKkF,UAAUrD,IAC7C,CACD,GAAA8D,CAAI9D,GACA,MAAM+D,EAAU5F,KAAKsF,KAAKzD,GAE1B,OADA7B,KAAKyF,OAAO5D,GACL+D,CACV,EAGL,MAAMC,UAAqBZ,EACvB,WAAApF,CAAYqF,GACRnF,MAAMmF,EAAQY,aACjB,EAGL,MAAMC,UAAuBd,EACzB,WAAApF,CAAYqF,GACRnF,MAAMmF,EAAQc,eACjB,EAGL,MAAMC,EACF,WAAApG,CAAYsF,EAASe,EAAKC,GACtBnG,KAAKmF,QAAUA,EACfnF,KAAKkG,IAAMA,EACXlG,KAAKmG,aAAeA,EACpBnG,KAAKoG,MAAQ,IAEhB,CACD,UAAMd,CAAKe,GACP,MAAMC,EAAQtG,KAAKmF,QAAQG,KAAKtF,KAAKkG,KACrC,GAAMI,GAASA,EAAMD,WAAaA,EAE9B,YADArG,KAAKoG,MAAQE,EAAMC,OAGvB,MAAMC,QAAkBxG,KAAKmG,aAAaE,EAAUrG,KAAKkG,KACzDlG,KAAKmF,QAAQC,KAAKpF,KAAKkG,IAAK,CACxBG,SAAUA,EACVE,MAAOC,IAEXxG,KAAKoG,MAAQI,CAChB,CACD,IAAApG,GACI,OAAOJ,KAAKoG,KACf,ECtDL,MAAMK,EACF,kBAAOC,CAAYC,EAAUC,EAAcxE,GAEvC,OAAO,IAAIqE,EAAsBE,EADnB,iBACoC,CAC9CE,KAAM,IAAIC,IAAI,+BAAgCF,GAC9CG,MAAO,IAAID,IAAI,gCAAiCF,GAChDI,OAAQ,IAAIF,IAAI,iCAAkCF,GAClDK,aAAc,IAAIH,IAAI,wCAAyCF,GAC/DM,SAAU9E,GAEjB,CACD,WAAAvC,CAAY8G,EAAUQ,GAAON,KAACA,EAAIE,MAAEA,EAAKE,aAAEA,EAAYD,OAAEA,EAAME,SAAEA,IAC7DlH,KAAKmF,QAAU,IAAIY,EAAeY,GAClC3G,KAAK2G,SAAWA,EAChB3G,KAAKmH,MAAQA,EACbnH,KAAKoH,IAAM,CAACP,OAAME,QAAOE,eAAcD,SAAQE,WAClD,CACD,YAAMG,CAAOD,EAAKE,GACd,MAAMC,EAAe5K,EAAOC,OAAO4K,OAAOC,gBAAgB,IAAIrK,WAAW,KAAKkB,QACxEoJ,EAAgB/K,EAAOC,aAAa4K,OAAOG,OAAOC,OAAO,WAAW,IAAIC,aAAcjL,OAAO2K,KAC7FO,EAAQ9H,KAAK2G,SAAWhK,EAAOC,OAAO4K,OAAOC,gBAAgB,IAAIrK,WAAW,KAAKkB,QACvF0B,KAAKmF,QAAQC,KAAKqB,EAAsBsB,mBAAoB,CACxDD,MAAOA,EACPE,SAAUT,IAEd,MAAMU,EAAM,IAAInB,IAAIM,GACpBa,EAAIC,aAAahG,IAAI,YAAalC,KAAK2G,UACvCsB,EAAIC,aAAahG,IAAI,eAAgBlC,KAAKoH,IAAIF,UAC9Ce,EAAIC,aAAahG,IAAI,gBAAiB,QACtC+F,EAAIC,aAAahG,IAAI,QAASlC,KAAKmH,OACnCc,EAAIC,aAAahG,IAAI,QAAS4F,GAC9BG,EAAIC,aAAahG,IAAI,iBAAkBwF,GACvCO,EAAIC,aAAahG,IAAI,wBAAyB,QAC9CiG,OAAOC,QAAQd,GAAoB,CAAE,GAAEe,SAAQC,IAC3CL,EAAIC,aAAahG,IAAIoG,EAAG,GAAIA,EAAG,GAAG,IAEtC/F,OAAOC,SAAWyF,CACrB,CACD,kBAAMhB,CAAaK,SACTtH,KAAKqH,OAAOrH,KAAKoH,IAAIH,aAAcK,EAC5C,CACD,gCAAMiB,CAA2BC,SACvBxI,KAAKqH,OAAOrH,KAAKoH,IAAIP,KAAM,CAC7B4B,UAAWD,GAElB,CACD,oBAAME,CAAeC,EAAMb,GACvBvF,OAAOqG,QAAQC,aAAa,GAAI,GAAI7I,KAAKoH,IAAIF,UAC7C,MAAM4B,EAAmB9I,KAAKmF,QAAQQ,IAAIc,EAAsBsB,oBAChE,GAAIe,EAAiBhB,QAAUA,EAC3B,MAAM,IAAIpJ,MAAM,kBAEpB,MAAM2D,QAAiB2B,MAAMhE,KAAKoH,IAAIL,MAAO,CACzCnC,OAAQ,OACR7C,QAAS,CACL,eAAgB,qCAEpB8C,KAAM,IAAIkE,gBAAgB,CACtB,CAAC,YAAa/I,KAAK2G,UACnB,CAAC,OAAQgC,GACT,CAAC,aAAc,sBACf,CAAC,gBAAiBG,EAAiBd,UACnC,CAAC,QAASc,EAAiBhB,OAC3B,CAAC,eAAgB9H,KAAKoH,IAAIF,cAGlC,IAAK7E,EAASkC,GAAI,CACd,MAAM3B,QAAaP,EAASO,OAC5B,MAAM,IAAIlE,MAAM,SAAW2D,EAASC,OAAS,KAAOM,EACvD,CACD,MAAMmE,QAAc1E,EAASoC,OAC7B,OAAO,IAAIuE,EAA6BhJ,KAAK2G,SAAUI,EAAO/G,KAAKoH,IACtE,CACD,oBAAM6B,GACF,MAAMhB,EAAM,IAAInB,IAAIvE,OAAOC,SAASC,MAC9BkG,EAAOV,EAAIC,aAAagB,IAAI,QAClC,GAAIP,GAAQ3I,KAAKmF,QAAQG,KAAKmB,EAAsBsB,oBAAqB,CAErE,MAAMD,EAAQG,EAAIC,aAAagB,IAAI,SACnC,aAAalJ,KAAK0I,eAAeC,EAAMb,EAC1C,CAGD,aADM9H,KAAKqH,OAAOrH,KAAKoH,IAAIP,KAAM,CAAA,GAC1B,IACV,EAELJ,EAAsBsB,mBAAqB,qBAE3C,MAAMiB,EACF,iBAAOG,CAAWpC,GACd,MAAOqC,EAAWC,EAAYC,GAAavC,EAAMwC,MAAM,KACjDC,EAAa,IAAIC,YAAY,SACnC,MAAO,CACHC,OAAQzG,KAAKC,MAAMsG,EAAW/L,OAAOd,EAAOc,OAAO2L,EAAWzM,EAAO4B,YACrEoL,QAAS1G,KAAKC,MAAMsG,EAAW/L,OAAOd,EAAOc,OAAO4L,EAAY1M,EAAO4B,YACvE+K,UAAWA,EAElB,CACD,WAAAzJ,CAAY8G,EAAUiD,GAAG7C,MAACA,EAAKC,OAAEA,EAAME,SAAEA,IACrClH,KAAK2G,SAAWA,EAChB3G,KAAK+G,MAAQ6C,EACb5J,KAAK6J,YAAcb,EAA6BG,WAAWS,EAAEE,cAC7D9J,KAAK+J,aAAef,EAA6BG,WAAWS,EAAEI,eAC9DhK,KAAKoH,IAAM,CAAEL,QAAOC,SAAQE,YAC5BlH,KAAKiK,gBAAkB,IAC1B,CACD,SAAAC,CAAUC,GACNnK,KAAKiK,gBAAkBE,CAC1B,CACD,aAAMC,GACF,MAAM/H,QAAiB2B,MAAMhE,KAAKoH,IAAIL,MAAO,CACzCnC,OAAQ,OACR7C,QAAS,CACL,eAAgB,qCAEpB8C,KAAM,IAAIkE,gBAAgB,CACtB,CAAC,YAAa/I,KAAK2G,UACnB,CAAC,aAAc,iBACf,CAAC,gBAAiB3G,KAAK+G,MAAMiD,mBAGrC,IAAK3H,EAASkC,GACV,MAAM,IAAI7F,MAAM,SAAW2D,EAASC,OAAS,KAAOD,EAASO,QAEjE,MAAMmE,QAAc1E,EAASoC,OAC7BzE,KAAK+G,MAAQA,EACb/G,KAAK6J,YAAcb,EAA6BG,WAAWpC,EAAM+C,cACjE9J,KAAK+J,aAAef,EAA6BG,WAAWpC,EAAMiD,eAC9DhK,KAAKiK,iBACLjK,KAAKiK,gBAAgBjK,KAAK+G,MAAO/G,KAAK6J,YAAa7J,KAAK+J,aAE/D,CACD,iBAAAM,CAAkBC,GACd,MAAMC,GAAM,IAAIC,MAAOC,UACjBC,EAAwD,IAAhC1K,KAAK+J,aAAaJ,QAAQgB,IAGxD,QAFgBJ,EAAMG,IACAH,EAAMD,EAAcI,CAE7C,CACD,eAAME,CAAUN,GACPtK,KAAKqK,kBAAkBC,UAGtBtK,KAAKoK,SACd,CACD,MAAApD,GACI,MAAMiB,EAAM,IAAInB,IAAI9G,KAAKoH,IAAIJ,QAC7BiB,EAAIC,aAAahG,IAAI,2BAA4BlC,KAAKoH,IAAIF,UAC1De,EAAIC,aAAahG,IAAI,gBAAiBlC,KAAK+G,MAAM8D,UACjDtI,OAAOC,SAAWyF,CACrB,CAED,WAAA6C,GACI,MAAO,UAAU9K,KAAK+G,MAAM+C,cAC/B,CAED,WAAA3F,CAAY4G,EAAmBC,GAC3B,OAAO,IAAIC,EAAiCjL,KAAM+K,EAAmBC,EACxE,EAGL,MAAMC,EACF,WAAApL,CAAYqL,EAASH,EAAmBC,GACpChL,KAAKkL,QAAUA,EACflL,KAAK+K,kBAAoBA,GAAqB,IAC9C/K,KAAKgL,iBAAmBA,GAAoB,GAC/C,CACD,eAAM3J,CAAUC,EAASC,SACfvB,KAAKkL,QAAQN,UAAU5K,KAAK+K,mBAClC,MAAMhJ,EAAU,IAAIC,QAAQV,EAAQW,QAAQF,SAC5CA,EAAQG,IAAI,gBAAiBlC,KAAKkL,QAAQJ,eAC1CxJ,EAAQW,QAAQF,QAAUA,EAC1B,MAAMM,QAAiBd,EAAMI,QAAQL,GAErC,aADMtB,KAAKkL,QAAQN,UAAU5K,KAAKgL,kBAC3B3I,CACV,EClLA,MAAC8I,EAAS,CACXC,MAAMC,GACK,IAAIC,SAAQC,GAAWC,WAAWD,EAASF,KAEtDI,iBAAkB,EAClBC,mBAAoB,EACpB,QAAAC,CAASC,EAAWC,EAAM5J,GACtB,IAAI6J,EAAM,KACNhM,EAAO,GACPiM,EAAoB,EACpBzH,EAAOrC,GAAWkJ,EAAOM,iBAE7B,MAAMO,EAAQ,KACV,MAAMC,GAAU,IAAIzB,MAAOC,UAAYsB,EACnCH,EAAYK,EACZH,EAAMN,WAAWQ,EAAOJ,EAAYK,IAGxCH,EAAM,KACFxH,IAAS6G,EAAOO,oBAChBG,KAAQ/L,GAGA,OAARgM,IACAhM,EAAO,IACV,EAGL,OAAO,WACHA,EAAOoM,UACPH,GAAoB,IAAIvB,MAAOC,UACnB,OAARqB,IACAA,EAAMN,WAAWQ,EAAOJ,GACpBtH,IAAS6G,EAAOO,oBAChBG,KAAQ/L,GAG5B,CACK,EACDqM,iBAAkB,EAClBC,oBAAqB,EACrBC,qBAAsB,EACtB,QAAAC,CAASV,EAAWC,EAAM5J,GACtB,IAAI6J,EAAM,KACNhM,EAAO,GACPiM,EAAoB,EACpBzH,EAAOrC,GAAWkJ,EAAOgB,iBAE7B,MAAMH,EAAQ,KACVD,EAAqBzH,EAAO6G,EAAOiB,oBAAuB,GAAI,IAAI5B,MAAOC,UACzEqB,EAAM,KACND,KAAQ/L,GACI,OAARgM,IACAhM,EAAO,GACV,EAGL,OAAO,WACH,MAAMyK,GAAM,IAAIC,MAAOC,WAClBsB,GAAsBzH,EAAO6G,EAAOiB,sBACrCL,EAAoBxB,GAExB,MAAMgC,EAAYX,GAAarB,EAAMwB,GACrCjM,EAAOoM,UACHK,GAAa,GAAKA,EAAYX,GAClB,OAARE,IACAU,aAAaV,GACbA,EAAM,MAEVC,EAAoBxB,EACpBsB,KAAQ/L,GACI,OAARgM,IACAhM,EAAO,KAEI,OAARgM,GAAkBxH,EAAO6G,EAAOkB,uBACvCP,EAAMN,WAAWQ,EAAOO,GAExC,CAEK,GChFL,MAAME,EACF,eAAOC,IAAYC,GACf,MAAMC,EAAK3L,SAAS4L,cAAc,OAClCD,EAAGE,UAAYH,EAAKjN,KAAK,IACzB,MAAMqN,EAAW,IAAIC,iBAIrB,OAHA7N,MAAMC,KAAKwN,EAAGK,YAAY5E,SAAQ6E,IAC9BH,EAASI,YAAYD,EAAK,IAEvBH,CACV,CACD,aAAOK,CAAOL,GACV,IAAIM,EAAIpM,SAAS4L,cAAc,QAE/B,OADAQ,EAAEF,YAAYJ,GACPM,EAAEP,SACZ,CACD,WAAO1N,IAAQkO,GACX,MAAMP,EAAW,IAAIC,iBACrB,IAAK,IAAI1P,EAAI,EAAGA,IAAMgQ,EAAM9P,SAAUF,EAClCyP,EAASI,YAAYG,EAAMhQ,IAE/B,OAAOyP,CACV,CACD,qBAAOQ,CAAeX,GAClB,MAAMU,EAAQnO,MAAMC,KAAKwN,EAAGK,YACtBF,EAAW,IAAIC,iBACrB,IAAK,IAAI1P,EAAI,EAAGA,IAAMgQ,EAAM9P,SAAUF,EAClCyP,EAASI,YAAYG,EAAMhQ,IAE/B,OAAOyP,CACV,EAGL,MAAMS,EACFC,UAAY,EACZ,UAAOC,CAAIxI,GACP,MAAO,GAAGA,OAAYsI,EAAWG,IACpC,CACD,gBAAOC,CAAUrH,GACb,OAAOA,UAAmD,IAAVA,CACnD,CACD,mBAAOsH,CAAajB,EAAI/K,EAAGC,GAIvB,OAHK8K,EAAGkB,aAAajM,IACjB+K,EAAGmB,aAAalM,EAAGC,GAEhB8K,EAAGzL,aAAaU,EAC1B,CACD,cAAOmM,CAAQ9I,EAAQ9F,EAAM6O,GACzB7O,EAAK8O,oBACAC,QAAOC,GAAKA,EAAE1M,WAAWwD,KACzBmD,SAAQ+F,IACL,MAAMC,EAASD,EAAE7Q,UAAU2H,EAAO1H,QACnB,UAAX6Q,EAIJJ,EAAGF,aAAaM,EAAQjP,EAAK+B,aAAaiN,IAHtCH,EAAGK,UAAUC,OAAOnP,EAAK+B,aAAa+D,EAAS,SAASqE,MAAM,KAAK4E,QAAOC,GAAKA,EAAE5Q,SAGxC,GAExD,EAGL,MAAMgR,EACF,WAAOpP,CAAKwN,GACR,MAAM6B,EAAatP,MAAMC,KAAKwN,EAAGK,YAC5BkB,QAAOvB,GAAMA,EAAG8B,SAAW9B,EAAG8B,QAAQ,YACtC9P,KAAIgO,IACDA,EAAGnH,SACH,MAAMkJ,EAAO/B,EAAGzL,aAAa,QAE7B,OADAyL,EAAGgC,gBAAgB,QACZ,CAACD,EAAM/B,EAAG,IAEnBiC,EAAU1G,OAAO2G,YAAYL,GAGnC,OAFAI,EAAQE,QAAU,IAAI/B,iBACtB6B,EAAQE,QAAQC,UAAUpC,EAAGK,YACtB4B,CACV,EAGA,MAACI,EAAY,CAACrP,EAAYsP,IACpB,cAActP,EACjBuP,UACA,YAAIC,GACA,OAAOpP,KAAKmP,SACf,CACD,uBAAME,GACF,GAAIrP,KAAKmP,UACL,OAEJ,MAAMN,EAAUL,EAAMpP,KAAKY,MACrB+M,QAAiBzB,QAAQC,QAAQvL,KAAKsP,OAAOT,EAASK,IAC5DlP,KAAK8M,UAAY,GACbC,GACA/M,KAAKmN,YAAYJ,GAErB/M,KAAKmP,WAAY,CACpB,GAIHI,EAAW,CAAC3P,EAAY4P,EAAOC,KAEjC,MAAMC,EAAM,GAAGC,OAAOH,GAAOG,OAAOF,GAAU,IAE9C,OAAO,cAAc7P,EACjB,6BAAWgQ,GACP,OAAOF,CACV,CACD,WAAA7P,IAAeC,GACXC,SAASD,GACTE,KAAK6P,WAAa7P,KAAK6P,YAAc7P,KAAK8P,kBAC1C,IAAK,MAAMC,KAAQP,EACfrH,OAAO6H,eAAehQ,KAAM+P,EAAM,CAC9B,GAAA7G,GACI,OAAOlJ,KAAK8N,aAAaiC,EAC5B,EACD,GAAA7N,CAAIqE,GAEA,GAAIiH,EAAWI,UAAUrH,GAGrB,OAFAvG,KAAK6P,WAAWI,OAAO1B,IAAI,KAAKwB,UAChC/P,KAAK+N,aAAagC,EAAM,IAG5B/P,KAAK6P,WAAWI,OAAOC,OAAO,KAAKH,KACnC/P,KAAK4O,gBAAgBmB,EACxB,GAGZ,CACD,wBAAAI,CAAyB7M,EAAM8M,EAAUC,GACrC,GAAID,IAAaC,EACb,OAEJrQ,KAAKsD,GAAQ+M,EACb,MAAMzL,EAAS5E,KAAK,KAAKsD,EAAKpF,OAAO,GAAGqB,gBAAgB+D,EAAKgN,OAAO,GAAGC,wBACvE3L,GAAQ4L,KAAKxQ,KAAMqQ,EAAUD,EAChC,EACJ,ECnIL,MAAMK,UAAmBxB,EAAUyB,cAC/B,MAAApB,CAAOT,EAASK,GACZlP,KAAKsO,UAAUC,IAAI,mBACtB,CACD,gBAAOoC,GACHC,eAAeC,OAAO,kBAAmBJ,EAC5C,EAGL,MAAMK,UAAe7B,EAAUyB,cAC3B,MAAApB,CAAOT,EAASK,GACZlP,KAAKsO,UAAUC,IAAI,QAAS,eAAgB,SAC/C,CACD,gBAAOoC,GACHC,eAAeC,OAAO,aAAcC,EACvC,ECbL,MAAMC,UAAa9B,EAAUtP,EAAW+Q,eACpC,WAAA7Q,EAAYmR,SAAEA,EAAQC,WAAEA,EAAUC,qBAAEA,EAAoBC,wBAAEA,IACtDpR,QACAC,KAAKgR,SAAWA,GAAY,CAAE,EAC9BhR,KAAKiR,WAAaA,GAAc,CAAE,EAClCjR,KAAKkR,qBAAuBA,GAAwB,SACpDlR,KAAKmR,wBAA0BA,GAA2B,mBAC7D,CACD,MAAA7B,CAAOT,EAASK,GACZ,MAAMkC,EAAOnQ,SAAS4L,cAAc,QAiBpC,OAhBAuE,EAAKpC,OAAOH,EAAQE,SACpBqC,EAAKC,iBAAiB,UAAUC,MAAOzS,IACnCA,EAAE0S,iBACFvR,KAAKwR,SAAQ,GACb,UACUxR,KAAKQ,KAAK,SAAUR,KAAKyR,YAAazR,KAC/C,CAAC,MAAOnB,GACL,GAAIA,aAAa6D,EAEb,YADA1C,KAAK0R,UAAU7S,EAAEuE,UAGrB,MAAMvE,CACtB,CAAsB,QACNmB,KAAKwR,SAAQ,EAChB,KAEEJ,CACV,CACD,OAAAI,CAAQG,GACJ3R,KAAK4R,iBAAiB,eAAevJ,SAAQuE,IACzCA,EAAGiF,QAAUF,CAAI,IAErB3R,KAAK4R,iBAAiB,8BAA8BvJ,SAAQuE,IACxDA,EAAGkF,SAAWH,CAAI,GAEzB,CACD,SAAAI,CAAUC,GACN,IAAK,IAAInQ,KAAKmQ,EACLA,EAAOC,eAAepQ,IAG3B1C,MAAMC,KAAKY,KAAK4R,iBAAiB,UAAUM,IAAIC,OAAOtQ,SAASwG,SAASuE,IACpEmE,EAAKqB,OAAOpS,KAAKgR,SAAUpE,EAAIoF,EAAOnQ,GAAIA,EAAGmQ,EAAO,GAG/D,CACD,SAAAP,GACI,OAAOtS,MAAMC,KAAKY,KAAK4R,iBAAiB5R,KAAKkR,uBACxC/C,QAAQvB,GACgC,UAAjCA,EAAGyF,QAAwB,iBAGS,WAAjCzF,EAAGyF,QAAwB,gBAA+D,OAA7CzF,EAAG0F,QAAQtS,KAAKmR,4BAEvEoB,QAAO,CAACC,EAAQ5F,IACNmE,EAAK0B,YAAYD,EAAQ5F,EAAGzL,aAAa,QAAS4P,EAAK2B,QAAQ1S,KAAKiR,WAAYrE,KACxF,CAAE,EACZ,CACD,SAAA8E,CAAUiB,EAAQC,GAyBd,GAxBA5S,KAAK6S,cACLF,EACKxE,QAAQtP,GAAiB,gBAAXA,EAAEiE,MAAqC,mBAAXjE,EAAEiE,OAC5CuF,SAASxJ,IACN,MAAMyE,EAAOzE,EAAEmC,QAAQ8R,QAAQ,IAAK,KAAKA,QAAQ,KAAM,KACvD9S,KAAK4R,iBAAiB,UAAUM,IAAIC,OAAO7O,QACtC+E,SAAQ0K,IACLA,EAAMzE,UAAUC,IAAI,cAChBwE,EAAMC,cAAc1E,UAAU2E,SAAS,kBACvCF,EAAMC,cAAc1E,UAAUC,IAAI,aACrC,IAETvO,KAAK4R,iBAAiB,0BAA0BM,IAAIC,OAAO7O,QACtD+E,SAAQuE,GAAMA,EAAGsG,UAAYrU,EAAEkE,QAAO,IAEnD/C,KAAK4R,iBAAiB,cACjBvJ,SAAQuE,IACL,MAAMuG,EAAeR,EAAOxE,QAAQtP,GAAiB,gBAAXA,EAAEiE,MAAqC,mBAAXjE,EAAEiE,OACxE8J,EAAGE,UAAYqG,EAAavU,KAAIC,GAAKA,EAAEkE,SAAQrD,KAAK,MACxB,IAAxByT,EAAa3V,QACboP,EAAG0B,UAAU7I,OAAO,SACvB,KAGJmN,EACD,OAEJ,MAAMQ,EAAKjU,MAAMC,KAAKY,KAAK4R,iBAAiB,iCACvChT,KAAIgO,GAAMA,EAAGyG,wBAAwBC,EAAI/Q,OAAOgR,UAC/CC,EAAO5V,KAAK6V,OAAOL,GACrBI,IAASE,KACTnR,OAAOqQ,OAAOrQ,OAAOoR,QAASH,EAAO,IAAMA,EAAO,IAAM,EAE/D,CACD,WAAAX,GACI7S,KAAK4R,iBAAiB,gDACjBvJ,SAAQuE,GAAMA,EAAG0B,UAAU7I,OAAO,gBACvCzF,KAAK4R,iBAAiB,cACjBvJ,SAAQuE,IACLA,EAAGE,UAAY,GACfF,EAAG0B,UAAUC,IAAI,SAAS,GAErC,CACD,cAAOmE,CAAQzB,EAAYrE,GACvB,MAAMgH,EAAiB3C,EAAWrE,EAAGyF,QAA0B,mBAAMpB,EAAWrE,EAAGyF,QAAwB,gBAC3G,GAAIuB,EACA,OAAOA,EAAehH,GAE1B,GAAgC,UAA5BA,EAAGzL,aAAa,QAAqB,CACrC,IAAKyL,EAAGiH,QACJ,OAEJ,MAAqC,YAA9BjH,EAAGyF,QAAqB,YAA+B,SAAbzF,EAAGrG,MAAmBqG,EAAGrG,KAC7E,CACD,MAAgC,aAA5BqG,EAAGzL,aAAa,QACTyL,EAAGiH,QAEoB,YAA9BjH,EAAGyF,QAAqB,YAChBzF,EAAGrG,MAA4B,SAAbqG,EAAGrG,MAAV,KAEnBqG,EAAGkH,SACIlH,EAAGkH,WAEPlH,EAAGrG,OAAS,IACtB,CACD,aAAO6L,CAAOpB,EAAUpE,EAAImH,EAAK7N,EAAK8L,GAClC,MAAMgC,EAAehD,EAASpE,EAAGyF,QAAwB,iBAAMrB,EAASpE,EAAGyF,QAAwB,gBAC/F2B,EACAA,EAAapH,EAAImH,EAAK7N,EAAK8L,GAGC,UAA5BpF,EAAGzL,aAAa,QAIY,aAA5ByL,EAAGzL,aAAa,QAIhByL,EAAGqH,SACHrH,EAAGqH,SAASF,GAGhBnH,EAAGrG,MAAQwN,EAPPnH,EAAGiH,QAAUE,EAJbnH,EAAGiH,QAAUjH,EAAGzL,aAAa,WAAa4S,CAYjD,CAED,kBAAOtB,CAAYD,EAAQ0B,EAAM3N,GAC7B,MAAM4N,EAAOD,EAAK3K,MAAM,KAAK3K,KAAKiD,GAAMA,EAAEuS,MAAM,aAAevS,EAAIA,IACnE,IAAIqC,EAAUsO,EACV6B,EAAW,KACf,IAAK,IAAI/W,EAAI,KAAOA,EAAG,CACnB,MAAMgX,EAAOH,EAAK7W,GACZiX,EAAOJ,EAAK7W,EAAI,GAQtB,GAPIkX,OAAOC,UAAUH,KAAUnV,MAAMuV,QAAQxQ,KACxB,OAAbmQ,EACAA,EAASE,GAAQrQ,EAAU,GAE3BsO,EAAStO,EAAU,IAGvB5G,IAAM6W,EAAK3W,OAAS,EAGpB,OADA0G,EAAQoQ,QAAkB5P,IAAV6B,EAAsBA,EAAS+N,KAAQpQ,EAAUA,EAAQoQ,GAAQ,KAC1E9B,OAEW9N,IAAlBR,EAAQoQ,KACRpQ,EAAQoQ,GAAQ,IAEpBD,EAAWnQ,EACXA,EAAUA,EAAQoQ,EACrB,CACJ,CACD,aAAOK,CAAOC,EAASC,GACnBjE,eAAeC,OAAO+D,EAAS,cAAc7D,EACzC,WAAAlR,GACIE,MAAM8U,EACT,GAER,ECrLL,MAAMC,EAAeC,WAAWC,IAAMC,IAAIC,kBAAkBvE,UAAU,CAEtE,GAEMwE,EAAsBJ,WAAWK,oBAAsBH,IAAII,SAAS3I,SAAS,s+CAuBhFoI,GAIH,MAAMQ,UAAcrG,EAAUyB,YAAayE,IACvC,MAAA7F,CAAOT,EAASK,GACZ,MAAMqG,EAAWvV,KAAK8N,aAAa,YAC7BiF,EAAQlE,EAAQkE,MAAQlE,EAAQkE,OAAS,MAC3C,MAAMnG,EAAK3L,SAAS4L,cAAc,SAElC,OADAD,EAAG0B,UAAUC,IAAI,gBACV3B,CACV,EAJ8C,GAKzCe,EAAKoF,EAAM5R,aAAa,OAASnB,KAAKmB,aAAa,aAAeqM,EAAWE,IAAI,aACvFF,EAAWQ,QAAQ,SAAUhO,KAAM6O,EAAQkE,OAC3CvF,EAAWK,aAAagB,EAAQkE,MAAO,KAAMpF,GAC7CH,EAAWK,aAAagB,EAAQkE,MAAO,OAAQ,QAC/CvF,EAAWK,aAAagB,EAAQkE,MAAO,cAAe,KACtD,MAAMzP,EAAOyP,EAAM5R,aAAa,QAChC,OAAO+N,EAASI,OAAO,CAAE3B,KAAIrK,OAAMiS,WAAU1G,WAChD,CACD,gBAAO8B,GACHC,eAAeC,OAAO,YAAayE,EACtC,EC7CL,MAAME,EAAgBT,WAAWC,IAAMC,IAAIC,kBAAkBvE,UAAU,CAEvE,GAEM8E,EAAuBV,WAAWW,qBAAuBT,IAAII,SAAS3I,SAAS,k/CAuBlF8I,GAGH,MAAMG,UAAe1G,EAAUyB,YAAa+E,IACxC,WAAA5V,CAAY+V,GACR7V,QACAC,KAAK4V,SAAWA,CACnB,CACD,MAAAtG,CAAOT,EAASK,GACZ,MAAMqG,EAAWvV,KAAK8N,aAAa,YAG7B+H,EAAiB,UADV7V,KAAKmB,aAAa,SAAW,SAEpC2U,EAAwC,UAA7B9V,KAAKmB,aAAa,QAE7B4R,EAAQlE,EAAQkE,MAAQlE,EAAQkE,OAC3B9R,SAAS4L,cAAc,UAE5Bc,EAAKoF,EAAM5R,aAAa,OAASnB,KAAKmB,aAAa,aAAeqM,EAAWE,IAAI,cACvFF,EAAWQ,QAAQ,SAAUhO,KAAM+S,GACnCvF,EAAWK,aAAakF,EAAO,KAAMpF,GACrCH,EAAWK,aAAakF,EAAO,cAAe,KAC9C,MAAMzP,EAAOyP,EAAM5R,aAAa,QAChC4R,EAAMkB,SAAWjU,KAAKiU,SAAS8B,KAAK/V,MACpC+S,EAAMe,SAAW9T,KAAK8T,SAASiC,KAAK/V,MAIpC6O,EAAQkE,MAAQtG,EAAUrN,KAAK2T,GAE/B/S,KAAKgW,QAAUH,EAsBf,OAdA7V,KAAKiW,GAAK,IAAIC,UAAUnD,EAAO5K,OAAOgO,OAAON,EAAS,CAClDO,QAAS,QACT9Q,KAAMgM,MAAO+E,EAAOlM,KAChB,IAAK0L,GAAUA,GAAUC,GAAY9V,KAAKgW,OAEtC,YADA7L,IAGJ,MAAM/J,QAAaJ,KAAKsF,KAAK+Q,GAC7BrW,KAAKgW,QAAS,EACd7L,EAAS/J,EAAK,EAElBkW,WAAaD,GAAUrW,KAAKsW,WAAWD,IACvC,CAAE,EAlBkB,CACpB/G,OAAQ,CACJiH,QAAS,IAAM,qDAgBEvW,KAAK4V,WAEvB1G,EAASI,OAAO,CAAE3B,KAAIrK,OAAMiS,WAAU1G,WAChD,CACD,UAAAyH,CAAWE,GACP,OAAO,CACV,CACD,IAAAlR,CAAKkR,GACD,MAAO,EACV,CACD,cAAMvC,CAASnS,GACN9B,KAAKgW,cACAhW,KAAKiW,GAAG3Q,OAElBtF,KAAKiW,GAAGhC,SAASnS,EACpB,CACD,QAAAgS,GACI,MAAMhS,EAAI9B,KAAKiW,GAAGnC,WAClB,MAAa,KAANhS,EAAW,KAAOA,CAC5B,CACD,aAAO6S,CAAOC,EAASC,GACnBjE,eAAeC,OAAO+D,EAAS,cAAce,EACzC,WAAA9V,GACIE,MAAM8U,EACT,GAER,CACD,gBAAOlE,GACH,OAAOgF,EAAOhB,OAAO,aACxB,EC1GL,MAAM8B,EAAoB1B,WAAWC,IAAMC,IAAIC,kBAAkBvE,UAAU,CAE3E,GAEM+F,EAA4B3B,WAAW4B,yBAA2B1B,IAAII,SAAS3I,SAAS,4gBAgB3F+J,GAGH,MAAMG,UAAmBrH,EAASN,EAAUyB,YAAagG,GAA4B,CAAC,cAClF,MAAApH,CAAOT,EAASK,GACZ,MAAM5L,EAAOtD,KAAKmB,aAAa,eAAiBqM,EAAWE,IAAI,kBACzDmJ,EAAW1X,MAAMC,KAAKyP,EAAQE,QAAQ6C,iBAAiB,cACvDkF,EAAkBD,EAASjY,KAAIgO,IACjC,MAAMmG,EAAQ9R,SAAS4L,cAAc,SACrCkG,EAAMhF,aAAa,OAAQ,SAC3BP,EAAWQ,QAAQ,SAAUhO,KAAM+S,GACnCvF,EAAWQ,QAAQ,GAAIpB,EAAImG,GAC3BvF,EAAWK,aAAakF,EAAO,OAAQzP,GAEvC,MAAO,CAACyP,EADMtG,EAAUc,eAAeX,GAClB,IAEzBiK,EAASxO,SAAQuE,GAAMA,EAAGnH,WAO1B,OALiByJ,EAASI,OAAO,CAC7BhM,KAAMA,EACNuL,QAASA,EACTiI,gBAAiBA,GAGxB,CACD,gBAAOnG,GACHC,eAAeC,OAAO,kBAAmB+F,EAC5C,ECjDL,MAAMG,EAAiBhC,WAAWC,IAAMC,IAAIC,kBAAkBvE,UAAU,CAExE,GAEMqG,EAAwBjC,WAAWkC,sBAAwBhC,IAAII,SAAS3I,SAAS,6KAKpFqK,GAGH,MAAMG,UAAgBjI,EAAUyB,YAAasG,IACzC,MAAA1H,CAAOT,EAASK,GACZ,OAAOA,EAASI,OAAO,CAAET,WAC5B,CACD,gBAAO8B,GACHC,eAAeC,OAAO,cAAeqG,EACxC,ECtBL,MAAMC,UAAezG,YACjB,WAAA7Q,GAWI,GAVAE,QACAC,KAAKoX,SAAW,IAAIpX,KAAKqX,UAAUlJ,QAAOtP,GAAKA,EAAE6P,QAAQ,kBAEzD1O,KAAKoX,SAAS/O,SAAQiP,IAClB,MAAMD,EAAW,IAAIC,EAAED,eAEP3S,IADA2S,EAASlJ,QAAOtP,GAAKA,EAAE6P,QAAQ,aAAY,IAC9B2I,EAAS7Z,OAAS,GAC3C6Z,EAAS,GAAG/I,UAAUC,IAAI,SAC7B,IAEyC,OAA1CvO,KAAKkB,cAAc,mBAA6B,CAChD,MAAMqW,EAAevX,KAAKkB,cAAc,yBACnB,OAAjBqW,GACAA,EAAajJ,UAAUC,IAAI,UAElC,CACJ,CACD,IAAAiJ,GACIxX,KAAKoX,SAAS/O,SAAQiP,IAClB,MACMpT,EADW,IAAIoT,EAAED,UACElJ,QAAOtP,GAAKA,EAAE6P,QAAQ,aAAY,GAC3DxK,GAASoK,UAAU7I,OAAO,UAC1BvB,GAASuT,oBAAoBnJ,UAAUC,IAAI,SAAS,IAExD,MAAMmJ,EAAiB1X,KAAKkB,cAAc,mBAC1CwW,EAAepJ,UAAU7I,OAAO,WAChCiS,EAAeD,mBAAmBnJ,UAAUC,IAAI,WAEhDvO,KAAK2X,cAAc,IAAIC,YAAY,kBAAmB,CAClDC,SAAS,EACTC,YAAY,IAGnB,CACD,IAAAC,GACI/X,KAAKoX,SAAS/O,SAAQiP,IAClB,MACMpT,EADW,IAAIoT,EAAED,UACElJ,QAAOtP,GAAKA,EAAE6P,QAAQ,aAAY,GAC3DxK,GAASoK,UAAU7I,OAAO,UAC1BvB,GAAS8T,wBAAwB1J,UAAUC,IAAI,SAAS,IAE5D,MAAMmJ,EAAiB1X,KAAKkB,cAAc,mBAC1CwW,EAAepJ,UAAU7I,OAAO,WAChCiS,EAAeM,uBAAuB1J,UAAUC,IAAI,WACpDvO,KAAK2X,cAAc,IAAIC,YAAY,kBAAmB,CAClDC,SAAS,EACTC,YAAY,IAEnB,CACDG,OAAS,SAAUC,GACflY,KAAKoX,SAAS/O,SAAQiP,IAClB,MACMpT,EADW,IAAIoT,EAAED,UACElJ,QAAOtP,GAAKA,EAAE6P,QAAQ,aAAY,GAC3DxK,GAASoK,UAAU7I,OAAO,UAC1B6R,EAAED,UAAUa,IAAI5J,UAAUC,IAAI,SAAS,IAE3C,MAAMmJ,EAAiB1X,KAAKkB,cAAc,mBAC1CwW,GAAgBpJ,UAAU7I,OAAO,WACdzF,KAAKkB,cAAc,sBAAsBgX,MACjD5J,UAAUC,IAAI,WACzBvO,KAAK2X,cAAc,IAAIC,YAAY,kBAAmB,CAClDC,SAAS,EACTC,YAAY,IAEnB,EACD,aAAOnD,CAAOC,EAASC,GACnBjE,eAAeC,OAAO+D,EAAS,cAAcuC,EACzC,WAAAtX,GACIE,MAAM8U,EACT,GAER,CACD,gBAAOlE,GACH,OAAOwG,EAAOxC,OAAO,aACxB,EC5EL,MAAMwD,EACF,WAAAtY,GACIG,KAAKoY,YAAc,GACnBpY,KAAKqY,aAAe,GACpBrY,KAAKsY,SAAW,GAChBtY,KAAKuY,SAAU,EACftX,SAASoQ,iBAAiB,oBAAoBC,gBACpChG,QAAQoE,IAAI1P,KAAKoY,mBACjB9M,QAAQoE,IAAI1P,KAAKqY,aAAazZ,KAAI4Z,GAAKlN,QAAQC,QAAQiN,cACvDlN,QAAQoE,IAAI1P,KAAKsY,SAAS1Z,KAAI4Z,GAAKlN,QAAQC,QAAQiN,OAAM,GAEtE,CACD,SAAA7H,CAAU8H,GAEN,OADAzY,KAAKoY,YAAYzX,KAAK2K,QAAQC,QAAQkN,MAC/BzY,IACV,CACD,UAAA0Y,CAAWD,GAEP,OADAzY,KAAKqY,aAAa1X,KAAK8X,GAChBzY,IACV,CACD,KAAA2Y,CAAMF,GAEF,OADAzY,KAAKsY,SAAS3X,KAAK8X,GACZzY,IACV"}
package/dist/ful.mjs CHANGED
@@ -754,7 +754,7 @@ class Form extends Templated(Observable(HTMLElement)) {
754
754
  this.mutators = mutators || {};
755
755
  this.extractors = extractors || {};
756
756
  this.valueHoldersSelector = valueHoldersSelector || '[name]';
757
- this.ignoredChildrenSelector = ignoredChildrenSelector || '.d-none';
757
+ this.ignoredChildrenSelector = ignoredChildrenSelector || '.d-none, [hidden]';
758
758
  }
759
759
  render(slotted, template) {
760
760
  const form = document.createElement('form');
@@ -1014,14 +1014,18 @@ const ful_select_template_ = globalThis.ful_select_template || ftl.Template.from
1014
1014
  `, ful_select_ec);
1015
1015
 
1016
1016
 
1017
- class Select extends Templated(Observable(HTMLElement), ful_select_template_) {
1017
+ class Select extends Templated(HTMLElement, ful_select_template_) {
1018
1018
  constructor(tsConfig) {
1019
1019
  super();
1020
1020
  this.tsConfig = tsConfig;
1021
1021
  }
1022
1022
  render(slotted, template) {
1023
1023
  const floating = this.hasAttribute('floating');
1024
- const remote = this.hasAttribute('remote');
1024
+
1025
+ const type = this.getAttribute("type") || 'local';
1026
+ const remote = type != 'local';
1027
+ const loadOnce = this.getAttribute('load') != 'always';
1028
+
1025
1029
  const input = slotted.input = slotted.input || (() => {
1026
1030
  return document.createElement("select");
1027
1031
  })();
@@ -1038,21 +1042,35 @@ class Select extends Templated(Observable(HTMLElement), ful_select_template_) {
1038
1042
  slotted.input = Fragments.from(input);
1039
1043
 
1040
1044
  this.loaded = !remote;
1045
+
1046
+ const tsDefaultConfig = {
1047
+ render: {
1048
+ loading: () => '<ful-spinner class="centered p-2"></ful-spinner>'
1049
+ }
1050
+ };
1051
+
1041
1052
  this.ts = new TomSelect(input, Object.assign(remote ? {
1042
1053
  preload: 'focus',
1043
1054
  load: async (query, callback) => {
1044
- if (this.loaded) {
1055
+ if (!remote || remote && loadOnce && this.loaded) {
1045
1056
  callback();
1046
1057
  return;
1047
1058
  }
1048
- const data = await this.fire('load', query, []);
1059
+ const data = await this.load(query);
1049
1060
  this.loaded = true;
1050
1061
  callback(data);
1051
- }
1052
- } : {}, this.tsConfig));
1062
+ },
1063
+ shouldLoad: (query) => this.shouldLoad(query)
1064
+ } : {}, tsDefaultConfig, this.tsConfig));
1053
1065
 
1054
1066
  return template.render({ id, name, floating, slotted });
1055
1067
  }
1068
+ shouldLoad(q){
1069
+ return true;
1070
+ }
1071
+ load(q){
1072
+ return []
1073
+ }
1056
1074
  async setValue(v) {
1057
1075
  if (!this.loaded) {
1058
1076
  await this.ts.load();
@@ -1085,6 +1103,9 @@ const ful_radiougroup_template_ = globalThis.ful_radiogroup_template || ftl.Temp
1085
1103
  <legend class="form-label">
1086
1104
  {{{{ slotted.default }}}}
1087
1105
  </legend>
1106
+ <header data-tpl-if="slotted.header">
1107
+ {{{{ slotted.header }}}}
1108
+ </header>
1088
1109
  <section>
1089
1110
  <label data-tpl-each="inputsAndLabels" data-tpl-var="ial">
1090
1111
  {{{{ ial[0] }}}}
@@ -1096,7 +1117,7 @@ const ful_radiougroup_template_ = globalThis.ful_radiogroup_template || ftl.Temp
1096
1117
  `, ful_radiogroup_ec);
1097
1118
 
1098
1119
 
1099
- class RadioGroup extends Stateful(Templated(HTMLElement, ful_radiougroup_template_), ['readonly']) {
1120
+ class RadioGroup extends Stateful(Templated(HTMLElement, ful_radiougroup_template_), ['disabled']) {
1100
1121
  render(slotted, template) {
1101
1122
  const name = this.getAttribute('input-name') || Attributes.uid('ful-radiogroup');
1102
1123
  const radioEls = Array.from(slotted.default.querySelectorAll('ful-radio'));
@@ -1123,11 +1144,21 @@ class RadioGroup extends Stateful(Templated(HTMLElement, ful_radiougroup_templat
1123
1144
  }
1124
1145
  }
1125
1146
 
1126
- class Spinner extends Templated(HTMLElement) {
1147
+ const ful_spinner_ec = globalThis.ec || ftl.EvaluationContext.configure({
1148
+
1149
+ });
1150
+
1151
+ const ful_spinner_template_ = globalThis.ful_spinner_template || ftl.Template.fromHtml(`
1152
+ <div class="ful-spinner-wrapper">
1153
+ <div class="ful-spinner-text">{{{{ slotted.default }}}}</div>
1154
+ <div class="ful-spinner-icon"></div>
1155
+ </div>
1156
+ `, ful_spinner_ec);
1157
+
1158
+
1159
+ class Spinner extends Templated(HTMLElement, ful_spinner_template_) {
1127
1160
  render(slotted, template) {
1128
- return Fragments.fromHtml(`
1129
- <div class="spinner-border spinner-border-sm" aria-hidden="true"></div>
1130
- `);
1161
+ return template.render({ slotted });
1131
1162
  }
1132
1163
  static configure() {
1133
1164
  customElements.define('ful-spinner', Spinner);