@optionfactory/ful 0.24.0 → 0.25.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/forms.mjs","../src/storage.mjs","../src/oauth-authorization-code.mjs","../src/timing.mjs","../src/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 };","\nclass Observable {\n constructor() {\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 static mixin(self) {\n self.listeners = {}\n self.fireSync = Observable.prototype.fireSync;\n self.fire = Observable.prototype.fire;\n self.on = Observable.prototype.on;\n self.un = Observable.prototype.un;\n }\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","/* global Infinity, CSS */\n\nimport { Failure } from \"./http-client.mjs\";\nimport { Observable } from \"./observable.mjs\";\n\nclass CustomElements {\n static id = 0;\n static uid(prefix) {\n return `${prefix}-${++CustomElements.id}`;\n }\n static forwardAttributes(from, to, except) {\n const ans = from.getAttributeNames().filter(a => except.indexOf(a) === -1)\n .filter(a => a[0] === '@')\n .forEach(a => {\n if (a === '@class') {\n to.classList.add(...from.getAttribute(\"@class\").split(\" \").filter(a => a.length));\n return;\n }\n to.setAttribute(a.substring(1), from.getAttribute(a))\n });\n }\n static extractSlots(el) {\n const slotted = Object.fromEntries([...el.querySelectorAll(\"[slot]\")].map(el => {\n el.parentElement.removeChild(el);\n const slot = el.getAttribute(\"slot\");\n el.removeAttribute(\"slot\");\n return [slot, el];\n }));\n slotted.default = new DocumentFragment();\n slotted.default.append(...el.childNodes);\n return slotted;\n }\n static labelAndInputGroup(id, name, isFloating, slotted) {\n if (isFloating) {\n /**\n * <div class=\"input-group has-validation\">\n * <span data-tpl-if=\"slotted.before\" class=\"input-group-text\">{{{{ slotted.before }}}}</span>\n * <div class=\"form-floating\">\n * {{{{ slotted.input }}}} \n * <label data-tpl-for=\"name\" class=\"form-label\">{{{{ slotted.default }}}}</label>\n * </div>\n * <span data-tpl-if=\"slotted.after\" class=\"input-group-text\">{{{{ slotted.after }}}}</span>\n * <ful-field-error data-tpl-field=\"name\"></ful-field-error> \n * </div> \n */\n const label = document.createElement(\"label\");\n label.setAttribute(\"for\", id);\n label.classList.add('form-label');\n label.append(slotted.default);\n\n const ff = document.createElement('div');\n ff.classList.add(\"form-floating\");\n ff.append(slotted.input, label);\n\n const ffe = document.createElement('ful-field-error');\n ffe.setAttribute(\"field\", name);\n\n const ig = document.createElement(\"div\");\n ig.classList.add('input-group', 'has-validtion');\n\n if (slotted.before) {\n ig.append(slotted.before);\n } else if (slotted.ibefore) {\n const igt = document.createElement('div');\n igt.classList.add('input-group-text')\n igt.append(slotted.ibefore)\n ig.append(igt);\n }\n ig.append(ff);\n if (slotted.after) {\n ig.append(slotted.after);\n } else if (slotted.iafter) {\n const igt = document.createElement('div');\n igt.classList.add('input-group-text')\n igt.append(slotted.iafter)\n ig.append(igt);\n }\n ig.append(ffe);\n return ig;\n }\n /**\n <label data-tpl-for=\"name\" class=\"form-label\">{{{{ slotted.default }}}}</label>\n <div class=\"input-group has-validation\">\n <span data-tpl-if=\"slotted.before\" class=\"input-group-text\">{{{{ slotted.before }}}}</span>\n {{{{ slotted.input }}}} \n <span data-tpl-if=\"slotted.after\" class=\"input-group-text\">{{{{ slotted.after }}}}</span>\n <ful-field-error data-tpl-field=\"name\"></ful-field-error> \n </div> \n */\n\n const label = document.createElement(\"label\");\n label.setAttribute(\"for\", name);\n label.classList.add('form-label');\n label.append(slotted.default);\n\n const ffe = document.createElement('ful-field-error');\n ffe.setAttribute(\"field\", name);\n\n const ig = document.createElement(\"div\");\n ig.classList.add('input-group', 'has-validation');\n\n if (slotted.before) {\n ig.append(slotted.before);\n } else if (slotted.ibefore) {\n const igt = document.createElement('div');\n igt.classList.add('input-group-text')\n igt.append(slotted.ibefore)\n ig.append(igt);\n }\n ig.append(slotted.input);\n if (slotted.after) {\n ig.append(slotted.after);\n } else if (slotted.iafter) {\n const igt = document.createElement('div');\n igt.classList.add('input-group-text')\n igt.append(slotted.iafter)\n ig.append(igt);\n }\n ig.append(ffe);\n\n const fragment = new DocumentFragment();\n fragment.append(label, ig)\n return fragment;\n }\n\n}\n\n\nclass FieldError extends HTMLElement {\n constructor() {\n super();\n }\n connectedCallback() {\n this.classList.add('invalid-feedback');\n }\n static configure() {\n customElements.define('ful-field-error', FieldError);\n }\n}\n\nclass Errors extends HTMLElement {\n constructor() {\n super();\n }\n connectedCallback() {\n this.classList.add('alert', 'alert-danger', 'd-none');\n }\n static configure() {\n customElements.define('ful-errors', Errors);\n }\n\n}\n\nclass Spinner extends HTMLElement {\n constructor() {\n super();\n }\n connectedCallback() {\n this.classList.add('spinner-border', 'spinner-border-sm', 'd-none');\n this.setAttribute(\"aria-hidden\", \"true\");\n }\n show() {\n this.classList.remove(\"d-none\");\n }\n hide() {\n this.classList.add(\"d-none\");\n }\n static configure() {\n customElements.define('ful-spinner', Spinner);\n }\n}\n\n\n\nclass Input extends HTMLElement {\n constructor() {\n super();\n const id = CustomElements.uid('ful-input');\n const name = this.getAttribute('@name');\n const floating = this.hasAttribute('@floating');\n const slotted = CustomElements.extractSlots(this);\n slotted.input = slotted.input || (() => {\n const el = document.createElement(\"input\")\n el.classList.add(\"form-control\");\n return el;\n })();\n CustomElements.forwardAttributes(this, slotted.input, ['@floating'])\n const attrIfMissing = (el, k, v) => !el.hasAttribute(k) && el.setAttribute(k, v);\n attrIfMissing(slotted.input, \"name\", id);\n attrIfMissing(slotted.input, \"id\", id);\n attrIfMissing(slotted.input, \"type\", \"text\");\n attrIfMissing(slotted.input, \"placeholder\", \" \");\n this.innerHTML = '';\n this.append(CustomElements.labelAndInputGroup(id, name || id, floating, slotted));\n }\n static configure() {\n customElements.define('ful-input', Input);\n }\n}\n\n\n\n/**\n * <script src=\"tom-select.complete.js\"></script>\n * <link href=\"tom-select.bootstrap5.css\" rel=\"stylesheet\" />\n */\nclass Select extends HTMLElement {\n constructor(tsConfig) {\n super();\n Observable.mixin(this);\n const id = CustomElements.uid('ful-select');\n const name = this.getAttribute('@name');\n const floating = this.hasAttribute('@floating');\n const remote = this.hasAttribute('@remote');\n const slotted = CustomElements.extractSlots(this);\n slotted.input = slotted.input || (() => {\n return document.createElement(\"select\");\n })();\n CustomElements.forwardAttributes(this, slotted.input, ['@floating', '@remote'])\n const attrIfMissing = (el, k, v) => !el.hasAttribute(k) && el.setAttribute(k, v);\n attrIfMissing(slotted.input, \"name\", id);\n attrIfMissing(slotted.input, \"id\", id);\n attrIfMissing(slotted.input, \"placeholder\", \" \");\n this.innerHTML = '';\n this.append(CustomElements.labelAndInputGroup(id, name || id, floating, slotted));\n this.loaded = !remote;\n this.ts = new TomSelect(slotted.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 } : {}, tsConfig));\n slotted.input.setValue = this.setValue.bind(this);\n slotted.input.getValue = this.getValue.bind(this);\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\nclass Form extends HTMLElement {\n constructor({ mutators, extractors, valueHoldersSelector, ignoredChildrenSelector }) {\n super();\n Observable.mixin(this);\n this.mutators = mutators || {}\n this.extractors = extractors || {}\n this.valueHoldersSelector = valueHoldersSelector || '[name]';\n this.ignoredChildrenSelector = ignoredChildrenSelector || '.d-none';\n\n const form = document.createElement('form');\n form.append(...this.childNodes);\n this.appendChild(form);\n\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 }\n spinner(spin) {\n this.querySelectorAll('ful-spinner').forEach(el => {\n el[spin ? 'show' : 'hide']();\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 static configure(configuration) {\n FieldError.configure();\n Errors.configure();\n Spinner.configure();\n Input.configure();\n Select.configure();\n Form.custom('ful-form', configuration || {});\n }\n}\n\n\n\n\nexport { CustomElements, FieldError, Errors, Spinner, Input, Select, Form };\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 = this._parseToken(token.access_token);\n this.refreshToken = this._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 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","constructor","this","listeners","fireSync","event","data","initialAcc","acc","l","fire","on","listener","push","un","idx","splice","mixin","self","prototype","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","super","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","CustomElements","static","uid","prefix","id","forwardAttributes","to","except","getAttributeNames","filter","a","forEach","setAttribute","classList","add","split","extractSlots","el","slotted","Object","fromEntries","querySelectorAll","parentElement","removeChild","slot","removeAttribute","default","DocumentFragment","append","childNodes","labelAndInputGroup","isFloating","label","createElement","ff","input","ffe","ig","before","ibefore","igt","after","iafter","fragment","FieldError","HTMLElement","connectedCallback","configure","customElements","define","Errors","Spinner","show","remove","hide","Input","floating","hasAttribute","attrIfMissing","innerHTML","Select","tsConfig","remote","loaded","ts","TomSelect","assign","preload","load","async","query","callback","setValue","bind","getValue","custom","tagName","configuration","Form","mutators","extractors","valueHoldersSelector","ignoredChildrenSelector","form","appendChild","addEventListener","preventDefault","spinner","getValues","setErrors","spin","disabled","setValues","values","hasOwnProperty","CSS","escape","mutate","dataset","closest","reduce","result","providePath","extract","errors","scroll","clearErrors","replace","contains","innerText","globalErrors","ys","getBoundingClientRect","y","scrollY","miny","min","Infinity","scrollX","maybeExtractor","checked","value","raw","key","maybeMutator","path","keys","match","previous","ckey","pkey","Number","isInteger","isArray","Storage","storage","save","setItem","got","getItem","removeItem","pop","decoded","LocalStorage","localStorage","SessionStorage","sessionStorage","VersionedStorage","dataSupplier","cache","revision","saved","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","entries","kv","applicationInitiatedAction","kcAction","kc_action","_tokenExchange","code","history","replaceState","stateAndVerifier","URLSearchParams","AuthorizationCodeFlowSession","ensureLoggedIn","get","parseToken","rawHeader","rawPayload","signature","ut8decoder","TextDecoder","header","payload","t","accessToken","access_token","refreshToken","refresh_token","refreshCallback","onRefresh","refresh","_parseToken","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","args","previousTimestamp","later","elapsed","arguments","THROTTLE_DEFAULT","THROTTLE_NO_LEADING","THROTTLE_NO_TRAILING","throttle","remaining","clearTimeout","Wizard","progress","children","matches","p","firstSection","next","nextElementSibling","currentSection","dispatchEvent","CustomEvent","bubbles","cancelable","prev","previousElementSibling","moveTo","n","App","configurers","initializers","handlers","running","all","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/forms.mjs","../src/storage.mjs","../src/oauth-authorization-code.mjs","../src/timing.mjs","../src/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 };","\nclass Observable {\n constructor() {\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 static init(self){\n self.listeners = {};\n }\n static mixin(ctor) {\n ctor.prototype.fireSync = Observable.prototype.fireSync;\n ctor.prototype.fire = Observable.prototype.fire;\n ctor.prototype.on = Observable.prototype.on;\n ctor.prototype.un = Observable.prototype.un;\n }\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","/* global Infinity, CSS */\n\nimport { Failure } from \"./http-client.mjs\";\nimport { Observable } from \"./observable.mjs\";\n\nclass CustomElements {\n static id = 0;\n static uid(prefix) {\n return `${prefix}-${++CustomElements.id}`;\n }\n static forwardAttributes(from, to, except) {\n const ans = from.getAttributeNames()\n .filter(a => except.indexOf(a) === -1)\n .filter(a => a[0] === '@')\n .forEach(a => {\n if (a === '@class') {\n to.classList.add(...from.getAttribute(\"@class\").split(\" \").filter(a => a.length));\n return;\n }\n to.setAttribute(a.substring(1), from.getAttribute(a))\n });\n }\n static extractSlots(el) {\n const slotted = Object.fromEntries([...el.querySelectorAll(\"[slot]\")].map(el => {\n el.parentElement.removeChild(el);\n const slot = el.getAttribute(\"slot\");\n el.removeAttribute(\"slot\");\n return [slot, el];\n }));\n slotted.default = new DocumentFragment();\n slotted.default.append(...el.childNodes);\n return slotted;\n }\n static labelAndInputGroup(id, name, isFloating, slotted) {\n if (isFloating) {\n /**\n * <div class=\"input-group has-validation\">\n * <span data-tpl-if=\"slotted.before\" class=\"input-group-text\">{{{{ slotted.before }}}}</span>\n * <div class=\"form-floating\">\n * {{{{ slotted.input }}}} \n * <label data-tpl-for=\"name\" class=\"form-label\">{{{{ slotted.default }}}}</label>\n * </div>\n * <span data-tpl-if=\"slotted.after\" class=\"input-group-text\">{{{{ slotted.after }}}}</span>\n * <ful-field-error data-tpl-field=\"name\"></ful-field-error> \n * </div> \n */\n const label = document.createElement(\"label\");\n label.setAttribute(\"for\", id);\n label.classList.add('form-label');\n label.append(slotted.default);\n\n const ff = document.createElement('div');\n ff.classList.add(\"form-floating\");\n ff.append(slotted.input, label);\n\n const ffe = document.createElement('ful-field-error');\n ffe.setAttribute(\"field\", name);\n\n const ig = document.createElement(\"div\");\n ig.classList.add('input-group', 'has-validtion');\n\n if (slotted.before) {\n ig.append(slotted.before);\n } else if (slotted.ibefore) {\n const igt = document.createElement('div');\n igt.classList.add('input-group-text')\n igt.append(slotted.ibefore)\n ig.append(igt);\n }\n ig.append(ff);\n if (slotted.after) {\n ig.append(slotted.after);\n } else if (slotted.iafter) {\n const igt = document.createElement('div');\n igt.classList.add('input-group-text')\n igt.append(slotted.iafter)\n ig.append(igt);\n }\n ig.append(ffe);\n return ig;\n }\n /**\n <label data-tpl-for=\"name\" class=\"form-label\">{{{{ slotted.default }}}}</label>\n <div class=\"input-group has-validation\">\n <span data-tpl-if=\"slotted.before\" class=\"input-group-text\">{{{{ slotted.before }}}}</span>\n {{{{ slotted.input }}}} \n <span data-tpl-if=\"slotted.after\" class=\"input-group-text\">{{{{ slotted.after }}}}</span>\n <ful-field-error data-tpl-field=\"name\"></ful-field-error> \n </div> \n */\n\n const label = document.createElement(\"label\");\n label.setAttribute(\"for\", name);\n label.classList.add('form-label');\n label.append(slotted.default);\n\n const ffe = document.createElement('ful-field-error');\n ffe.setAttribute(\"field\", name);\n\n const ig = document.createElement(\"div\");\n ig.classList.add('input-group', 'has-validation');\n\n if (slotted.before) {\n ig.append(slotted.before);\n } else if (slotted.ibefore) {\n const igt = document.createElement('div');\n igt.classList.add('input-group-text')\n igt.append(slotted.ibefore)\n ig.append(igt);\n }\n ig.append(slotted.input);\n if (slotted.after) {\n ig.append(slotted.after);\n } else if (slotted.iafter) {\n const igt = document.createElement('div');\n igt.classList.add('input-group-text')\n igt.append(slotted.iafter)\n ig.append(igt);\n }\n ig.append(ffe);\n\n const fragment = new DocumentFragment();\n fragment.append(label, ig)\n return fragment;\n }\n\n}\n\n\nclass FieldError extends HTMLElement {\n constructor() {\n super();\n }\n connectedCallback() {\n this.classList.add('invalid-feedback');\n }\n static configure() {\n customElements.define('ful-field-error', FieldError);\n }\n}\n\nclass Errors extends HTMLElement {\n constructor() {\n super();\n }\n connectedCallback() {\n this.classList.add('alert', 'alert-danger', 'd-none');\n }\n static configure() {\n customElements.define('ful-errors', Errors);\n }\n\n}\n\nclass Spinner extends HTMLElement {\n constructor() {\n super();\n }\n connectedCallback() {\n this.classList.add('spinner-border', 'spinner-border-sm', 'd-none');\n this.setAttribute(\"aria-hidden\", \"true\");\n }\n show() {\n this.classList.remove(\"d-none\");\n }\n hide() {\n this.classList.add(\"d-none\");\n }\n static configure() {\n customElements.define('ful-spinner', Spinner);\n }\n}\n\n\n\nclass Input extends HTMLElement {\n constructor() {\n super();\n const id = CustomElements.uid('ful-input');\n const name = this.getAttribute('@name');\n const floating = this.hasAttribute('@floating');\n const slotted = CustomElements.extractSlots(this);\n slotted.input = slotted.input || (() => {\n const el = document.createElement(\"input\")\n el.classList.add(\"form-control\");\n return el;\n })();\n CustomElements.forwardAttributes(this, slotted.input, ['@floating'])\n const attrIfMissing = (el, k, v) => !el.hasAttribute(k) && el.setAttribute(k, v);\n attrIfMissing(slotted.input, \"name\", id);\n attrIfMissing(slotted.input, \"id\", id);\n attrIfMissing(slotted.input, \"type\", \"text\");\n attrIfMissing(slotted.input, \"placeholder\", \" \");\n this.innerHTML = '';\n this.append(CustomElements.labelAndInputGroup(id, name || id, floating, slotted));\n }\n static configure() {\n customElements.define('ful-input', Input);\n }\n}\n\n\n\n/**\n * <script src=\"tom-select.complete.js\"></script>\n * <link href=\"tom-select.bootstrap5.css\" rel=\"stylesheet\" />\n */\nclass Select extends HTMLElement {\n constructor(tsConfig) {\n super();\n Observable.init(this);\n const id = CustomElements.uid('ful-select');\n const name = this.getAttribute('@name');\n const floating = this.hasAttribute('@floating');\n const remote = this.hasAttribute('@remote');\n const slotted = CustomElements.extractSlots(this);\n slotted.input = slotted.input || (() => {\n return document.createElement(\"select\");\n })();\n CustomElements.forwardAttributes(this, slotted.input, ['@floating', '@remote'])\n const attrIfMissing = (el, k, v) => !el.hasAttribute(k) && el.setAttribute(k, v);\n attrIfMissing(slotted.input, \"name\", id);\n attrIfMissing(slotted.input, \"id\", id);\n attrIfMissing(slotted.input, \"placeholder\", \" \");\n this.innerHTML = '';\n this.append(CustomElements.labelAndInputGroup(id, name || id, floating, slotted));\n this.loaded = !remote;\n this.ts = new TomSelect(slotted.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 } : {}, tsConfig));\n slotted.input.setValue = this.setValue.bind(this);\n slotted.input.getValue = this.getValue.bind(this);\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\nObservable.mixin(Select);\n\n\n\nclass Form extends HTMLElement {\n constructor({ mutators, extractors, valueHoldersSelector, ignoredChildrenSelector }) {\n super();\n Observable.init(this);\n this.mutators = mutators || {}\n this.extractors = extractors || {}\n this.valueHoldersSelector = valueHoldersSelector || '[name]';\n this.ignoredChildrenSelector = ignoredChildrenSelector || '.d-none';\n\n const form = document.createElement('form');\n form.append(...this.childNodes);\n this.appendChild(form);\n\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 }\n spinner(spin) {\n this.querySelectorAll('ful-spinner').forEach(el => {\n el[spin ? 'show' : 'hide']();\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 static configure(configuration) {\n FieldError.configure();\n Errors.configure();\n Spinner.configure();\n Input.configure();\n Select.configure();\n Form.custom('ful-form', configuration || {});\n }\n}\n\nObservable.mixin(Form);\n\n\n\nexport { CustomElements, FieldError, Errors, Spinner, Input, Select, Form };\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 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","constructor","this","listeners","fireSync","event","data","initialAcc","acc","l","fire","on","listener","push","un","idx","splice","init","self","mixin","ctor","prototype","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","super","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","CustomElements","static","uid","prefix","id","forwardAttributes","to","except","getAttributeNames","filter","a","forEach","setAttribute","classList","add","split","extractSlots","el","slotted","Object","fromEntries","querySelectorAll","parentElement","removeChild","slot","removeAttribute","default","DocumentFragment","append","childNodes","labelAndInputGroup","isFloating","label","createElement","ff","input","ffe","ig","before","ibefore","igt","after","iafter","fragment","FieldError","HTMLElement","connectedCallback","configure","customElements","define","Errors","Spinner","show","remove","hide","Input","floating","hasAttribute","attrIfMissing","innerHTML","Select","tsConfig","remote","loaded","ts","TomSelect","assign","preload","load","async","query","callback","setValue","bind","getValue","custom","tagName","configuration","Form","mutators","extractors","valueHoldersSelector","ignoredChildrenSelector","form","appendChild","addEventListener","preventDefault","spinner","getValues","setErrors","spin","disabled","setValues","values","hasOwnProperty","CSS","escape","mutate","dataset","closest","reduce","result","providePath","extract","errors","scroll","clearErrors","replace","contains","innerText","globalErrors","ys","getBoundingClientRect","y","scrollY","miny","min","Infinity","scrollX","maybeExtractor","checked","value","raw","key","maybeMutator","path","keys","match","previous","ckey","pkey","Number","isInteger","isArray","Storage","storage","save","setItem","got","getItem","removeItem","pop","decoded","LocalStorage","localStorage","SessionStorage","sessionStorage","VersionedStorage","dataSupplier","cache","revision","saved","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","entries","kv","applicationInitiatedAction","kcAction","kc_action","_tokenExchange","code","history","replaceState","stateAndVerifier","URLSearchParams","AuthorizationCodeFlowSession","ensureLoggedIn","get","parseToken","rawHeader","rawPayload","signature","ut8decoder","TextDecoder","header","payload","t","accessToken","access_token","refreshToken","refresh_token","refreshCallback","onRefresh","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","args","previousTimestamp","later","elapsed","arguments","THROTTLE_DEFAULT","THROTTLE_NO_LEADING","THROTTLE_NO_TRAILING","throttle","remaining","clearTimeout","Wizard","progress","children","matches","p","firstSection","next","nextElementSibling","currentSection","dispatchEvent","CustomEvent","bubbles","cancelable","prev","previousElementSibling","moveTo","n","App","configurers","initializers","handlers","running","all","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,ECtEL,MAAMC,EACF,WAAAC,GACIC,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,EAAU7B,QAAQsC,GAC9B,OAAgB,IAATG,EAAa,GAAKZ,EAAUa,OAAOD,EAAK,EAClD,CACD,WAAOE,CAAKC,GACRA,EAAKf,UAAY,EACpB,CACD,YAAOgB,CAAMC,GACTA,EAAKC,UAAUjB,SAAWJ,EAAWqB,UAAUjB,SAC/CgB,EAAKC,UAAUX,KAAOV,EAAWqB,UAAUX,KAC3CU,EAAKC,UAAUV,GAAKX,EAAWqB,UAAUV,GACzCS,EAAKC,UAAUP,GAAKd,EAAWqB,UAAUP,EAC5C,ECtCL,MAAMQ,EACF,WAAArB,GACI,MAAMsB,EAAUC,SAASC,cAAc,wBAAwBC,aAAa,WAC5ExB,KAAKqB,QAAUA,EAAQI,SAAS,KAAOJ,EAAQ3D,UAAU,EAAG2D,EAAQ1D,OAAS,GAAK0D,CACrF,CACD,eAAMK,CAAUC,EAASC,GACrB,MAAMC,EAAYF,EAAQG,SAASC,WAAW,KAAO,GAAK,IAE1D,OADAJ,EAAQG,SAAW9B,KAAKqB,QAAUQ,EAAYF,EAAQG,eACzCF,EAAMI,QAAQL,EAC9B,EAGL,MAAMM,EACF,WAAAlC,GACIC,KAAKkC,EAAIZ,SAASC,cAAc,6BAA6BC,aAAa,WAC1ExB,KAAKmC,EAAIb,SAASC,cAAc,sBAAsBC,aAAa,UACtE,CACD,eAAME,CAAUC,EAASC,GACrB,MAAMQ,EAAU,IAAIC,QAAQV,EAAQW,QAAQF,SAG5C,OAFAA,EAAQG,IAAIvC,KAAKkC,EAAGlC,KAAKmC,GACzBR,EAAQW,QAAQF,QAAUA,QACbR,EAAMI,QAAQL,EAC9B,EAGL,MAAMa,EACF,WAAAzC,CAAY0C,GACRzC,KAAKyC,YAAcA,CACtB,CACD,eAAMf,CAAUC,EAASC,GACrB,MAAMc,QAAkBd,EAAMI,QAAQL,GACtC,GAAwB,MAApBe,EAASC,OACT,OAAOD,EAEXE,OAAOC,SAASC,KAAO9C,KAAKyC,WAC/B,EAGL,MAAMM,UAAgBlE,MAClB,oBAAOmE,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,MAAOlE,GACL,OAAOkE,CACV,CACJ,CACD,mBAAOM,CAAab,EAAQM,GACxB,OAAO,IAAIF,EAAQJ,EAAQI,EAAQC,cAAcL,EAAQM,GAC5D,CACD,WAAAlD,CAAY4C,EAAQc,GAChBC,MAAMJ,KAAKK,UAAUF,IACrBzD,KAAK4D,KAAO,WAAWjB,IACvB3C,KAAK2C,OAASA,EACd3C,KAAKyD,SAAWA,CACnB,EAGL,MAAMI,EACF,WAAA9D,GACIC,KAAK8D,aAAe,EACvB,CACD,WAAAC,GAEI,OADA/D,KAAK8D,aAAanD,KAAK,IAAIS,GACpBpB,IACV,CACD,aAAAgE,GAEI,OADAhE,KAAK8D,aAAanD,KAAK,IAAIsB,GACpBjC,IACV,CACD,0BAAAiE,CAA2BxB,GAEvB,OADAzC,KAAK8D,aAAanD,KAAK,IAAI6B,EAAkCC,IACtDzC,IACV,CACD,gBAAAkE,IAAoBJ,GAEhB,OADA9D,KAAK8D,aAAanD,QAAQmD,GACnB9D,IACV,CACD,KAAAmE,GACI,MAAML,EAAe9D,KAAK8D,aAC1B,OAAO,IAAIM,EAAW,CAACN,gBAC1B,EAGL,MAAMO,EACF,eAAM3C,CAAUC,EAASC,GACrB,aAAa0C,MAAM3C,EAAQG,SAAUH,EAAQW,QAChD,EAGL,MAAMiC,EACF,WAAAxE,CAAY+D,EAAcU,GACtBxE,KAAK8D,aAAeA,EACpB9D,KAAKwE,QAAUA,CAClB,CACD,aAAMxC,CAAQL,GACV,MAAM8C,EAAczE,KAAK8D,aAAa9D,KAAKwE,SAC3C,aAAaC,EAAY/C,UAAUC,EAAS,IAAI4C,EAAqBvE,KAAK8D,aAAc9D,KAAKwE,QAAU,GAC1G,EAIL,MAAMJ,EACF,cAAOM,GACH,OAAO,IAAIb,CACd,CACD,WAAA9D,EAAY+D,aAACA,IACT9D,KAAK8D,aAAeA,GAAgB,EACvC,CACD,cAAMa,CAAS7C,EAAUQ,GACrB,MAAMsC,EAAOtC,GAAW,GAClBwB,EAAe,IAAI9D,KAAK8D,gBAAiBc,EAAKd,cAAgB,GAAI,IAAIO,GACtEzC,EAAQ,IAAI2C,EAAqBT,EAAc,GACrD,aAAalC,EAAMI,QAAQ,CAACF,WAAUQ,QAASsC,GAClD,CACD,WAAMN,CAAMxC,EAAUQ,GAClB,MAAMI,QAAiB1C,KAAK2E,SAAS7C,EAAUQ,GAC/C,IAAKI,EAASmC,GAAI,CACd,MAAMC,QAAgBpC,EAASO,OAC/B,MAAMF,EAAQS,aAAad,EAASC,OAAQmC,EAC/C,CACD,OAAOpC,CACV,CACD,UAAMqC,CAAKjD,EAAUQ,GACjB,IACI,MAAMI,QAAiB1C,KAAKsE,MAAMxC,EAAUQ,GACtCW,QAAaP,EAASO,OAC5B,OAAOA,EAAOK,KAAKC,MAAMN,QAAQ+B,CACpC,CAAC,MAAOhG,GACL,GAAIA,aAAa+D,EACb,MAAM/D,EAEV,MAAM,IAAI+D,EAAQ,EAAG,CAAC,CACdI,KAAM,qBACN9B,QAAS,KACT+B,OAAQpE,EAAE8F,QACVzB,QAAS,OAEpB,CACJ,EAGL,SAAS4B,EAAYC,EAAQC,EAAM/C,GAC/B,MAAO,CACHA,QAAS,CACL,eAAgB,sBACbA,GAEP8C,OAAQA,EACRC,KAAM7B,KAAKK,UAAUwB,GAE7B,CACA,SAASC,EAASD,EAAM/C,GACpB,OAAO6C,EAAY,OAAQE,EAAM/C,EACrC,CACA,SAASiD,EAAQF,EAAM/C,GACnB,OAAO6C,EAAY,MAAOE,EAAM/C,EACpC,CACA,SAASkD,EAAUH,EAAM/C,GACrB,OAAO6C,EAAY,QAASE,EAAM/C,EACtC,CChKA,MAAMmD,EACFC,UAAY,EACZ,UAAOC,CAAIC,GACP,MAAO,GAAGA,OAAYH,EAAeI,IACxC,CACD,wBAAOC,CAAkBrG,EAAMsG,EAAIC,GACnBvG,EAAKwG,oBACZC,QAAOC,IAA4B,IAAvBH,EAAO1H,QAAQ6H,KAC3BD,QAAOC,GAAc,MAATA,EAAE,KACdC,SAAQD,IACK,WAANA,EAIJJ,EAAGM,aAAaF,EAAEvI,UAAU,GAAI6B,EAAKiC,aAAayE,IAH9CJ,EAAGO,UAAUC,OAAO9G,EAAKiC,aAAa,UAAU8E,MAAM,KAAKN,QAAOC,GAAKA,EAAEtI,SAGxB,GAEhE,CACD,mBAAO4I,CAAaC,GAChB,MAAMC,EAAUC,OAAOC,YAAY,IAAIH,EAAGI,iBAAiB,WAAW7H,KAAIyH,IACtEA,EAAGK,cAAcC,YAAYN,GAC7B,MAAMO,EAAOP,EAAGhF,aAAa,QAE7B,OADAgF,EAAGQ,gBAAgB,QACZ,CAACD,EAAMP,EAAG,KAIrB,OAFAC,EAAQQ,QAAU,IAAIC,iBACtBT,EAAQQ,QAAQE,UAAUX,EAAGY,YACtBX,CACV,CACD,yBAAOY,CAAmB1B,EAAI/B,EAAM0D,EAAYb,GAC5C,GAAIa,EAAY,CAYZ,MAAMC,EAAQjG,SAASkG,cAAc,SACrCD,EAAMpB,aAAa,MAAOR,GAC1B4B,EAAMnB,UAAUC,IAAI,cACpBkB,EAAMJ,OAAOV,EAAQQ,SAErB,MAAMQ,EAAKnG,SAASkG,cAAc,OAClCC,EAAGrB,UAAUC,IAAI,iBACjBoB,EAAGN,OAAOV,EAAQiB,MAAOH,GAEzB,MAAMI,EAAMrG,SAASkG,cAAc,mBACnCG,EAAIxB,aAAa,QAASvC,GAE1B,MAAMgE,EAAKtG,SAASkG,cAAc,OAGlC,GAFAI,EAAGxB,UAAUC,IAAI,cAAe,iBAE5BI,EAAQoB,OACRD,EAAGT,OAAOV,EAAQoB,aACf,GAAIpB,EAAQqB,QAAS,CACxB,MAAMC,EAAMzG,SAASkG,cAAc,OACnCO,EAAI3B,UAAUC,IAAI,oBAClB0B,EAAIZ,OAAOV,EAAQqB,SACnBF,EAAGT,OAAOY,EACb,CAED,GADAH,EAAGT,OAAOM,GACNhB,EAAQuB,MACRJ,EAAGT,OAAOV,EAAQuB,YACf,GAAIvB,EAAQwB,OAAQ,CACvB,MAAMF,EAAMzG,SAASkG,cAAc,OACnCO,EAAI3B,UAAUC,IAAI,oBAClB0B,EAAIZ,OAAOV,EAAQwB,QACnBL,EAAGT,OAAOY,EACb,CAED,OADAH,EAAGT,OAAOQ,GACHC,CACV,CAWD,MAAML,EAAQjG,SAASkG,cAAc,SACrCD,EAAMpB,aAAa,MAAOvC,GAC1B2D,EAAMnB,UAAUC,IAAI,cACpBkB,EAAMJ,OAAOV,EAAQQ,SAErB,MAAMU,EAAMrG,SAASkG,cAAc,mBACnCG,EAAIxB,aAAa,QAASvC,GAE1B,MAAMgE,EAAKtG,SAASkG,cAAc,OAGlC,GAFAI,EAAGxB,UAAUC,IAAI,cAAe,kBAE5BI,EAAQoB,OACRD,EAAGT,OAAOV,EAAQoB,aACf,GAAIpB,EAAQqB,QAAS,CACxB,MAAMC,EAAMzG,SAASkG,cAAc,OACnCO,EAAI3B,UAAUC,IAAI,oBAClB0B,EAAIZ,OAAOV,EAAQqB,SACnBF,EAAGT,OAAOY,EACb,CAED,GADAH,EAAGT,OAAOV,EAAQiB,OACdjB,EAAQuB,MACRJ,EAAGT,OAAOV,EAAQuB,YACf,GAAIvB,EAAQwB,OAAQ,CACvB,MAAMF,EAAMzG,SAASkG,cAAc,OACnCO,EAAI3B,UAAUC,IAAI,oBAClB0B,EAAIZ,OAAOV,EAAQwB,QACnBL,EAAGT,OAAOY,EACb,CACDH,EAAGT,OAAOQ,GAEV,MAAMO,EAAW,IAAIhB,iBAErB,OADAgB,EAASf,OAAOI,EAAOK,GAChBM,CACV,EAKL,MAAMC,UAAmBC,YACrB,WAAArI,GACI2D,OACH,CACD,iBAAA2E,GACIrI,KAAKoG,UAAUC,IAAI,mBACtB,CACD,gBAAOiC,GACHC,eAAeC,OAAO,kBAAmBL,EAC5C,EAGL,MAAMM,UAAeL,YACjB,WAAArI,GACI2D,OACH,CACD,iBAAA2E,GACIrI,KAAKoG,UAAUC,IAAI,QAAS,eAAgB,SAC/C,CACD,gBAAOiC,GACHC,eAAeC,OAAO,aAAcC,EACvC,EAIL,MAAMC,UAAgBN,YAClB,WAAArI,GACI2D,OACH,CACD,iBAAA2E,GACIrI,KAAKoG,UAAUC,IAAI,iBAAkB,oBAAqB,UAC1DrG,KAAKmG,aAAa,cAAe,OACpC,CACD,IAAAwC,GACI3I,KAAKoG,UAAUwC,OAAO,SACzB,CACD,IAAAC,GACI7I,KAAKoG,UAAUC,IAAI,SACtB,CACD,gBAAOiC,GACHC,eAAeC,OAAO,cAAeE,EACxC,EAKL,MAAMI,UAAcV,YAChB,WAAArI,GACI2D,QACA,MAAMiC,EAAKJ,EAAeE,IAAI,aACxB7B,EAAO5D,KAAKwB,aAAa,SACzBuH,EAAW/I,KAAKgJ,aAAa,aAC7BvC,EAAUlB,EAAegB,aAAavG,MAC5CyG,EAAQiB,MAAQjB,EAAQiB,OAAS,MAC7B,MAAMlB,EAAKlF,SAASkG,cAAc,SAElC,OADAhB,EAAGJ,UAAUC,IAAI,gBACVG,CACV,EAJgC,GAKjCjB,EAAeK,kBAAkB5F,KAAMyG,EAAQiB,MAAO,CAAC,cACvD,MAAMuB,EAAgB,CAACzC,EAAItE,EAAGC,KAAOqE,EAAGwC,aAAa9G,IAAMsE,EAAGL,aAAajE,EAAGC,GAC9E8G,EAAcxC,EAAQiB,MAAO,OAAQ/B,GACrCsD,EAAcxC,EAAQiB,MAAO,KAAM/B,GACnCsD,EAAcxC,EAAQiB,MAAO,OAAQ,QACrCuB,EAAcxC,EAAQiB,MAAO,cAAe,KAC5C1H,KAAKkJ,UAAY,GACjBlJ,KAAKmH,OAAO5B,EAAe8B,mBAAmB1B,EAAI/B,GAAQ+B,EAAIoD,EAAUtC,GAC3E,CACD,gBAAO6B,GACHC,eAAeC,OAAO,YAAaM,EACtC,EASL,MAAMK,UAAef,YACjB,WAAArI,CAAYqJ,GACR1F,QACA5D,EAAWiB,KAAKf,MAChB,MAAM2F,EAAKJ,EAAeE,IAAI,cACxB7B,EAAO5D,KAAKwB,aAAa,SACzBuH,EAAW/I,KAAKgJ,aAAa,aAC7BK,EAASrJ,KAAKgJ,aAAa,WAC3BvC,EAAUlB,EAAegB,aAAavG,MAC5CyG,EAAQiB,MAAQjB,EAAQiB,OACbpG,SAASkG,cAAc,UAElCjC,EAAeK,kBAAkB5F,KAAMyG,EAAQiB,MAAO,CAAC,YAAa,YACpE,MAAMuB,EAAgB,CAACzC,EAAItE,EAAGC,KAAOqE,EAAGwC,aAAa9G,IAAMsE,EAAGL,aAAajE,EAAGC,GAC9E8G,EAAcxC,EAAQiB,MAAO,OAAQ/B,GACrCsD,EAAcxC,EAAQiB,MAAO,KAAM/B,GACnCsD,EAAcxC,EAAQiB,MAAO,cAAe,KAC5C1H,KAAKkJ,UAAY,GACjBlJ,KAAKmH,OAAO5B,EAAe8B,mBAAmB1B,EAAI/B,GAAQ+B,EAAIoD,EAAUtC,IACxEzG,KAAKsJ,QAAUD,EACfrJ,KAAKuJ,GAAK,IAAIC,UAAU/C,EAAQiB,MAAOhB,OAAO+C,OAAOJ,EAAS,CAC1DK,QAAS,QACTC,KAAMC,MAAOC,EAAOC,KAChB,GAAI9J,KAAKsJ,OAEL,YADAQ,IAGJ,MAAM1J,QAAaJ,KAAKQ,KAAK,OAAQqJ,EAAO,IAC5C7J,KAAKsJ,QAAS,EACdQ,EAAS1J,EAAK,GAElB,CAAE,EAAEgJ,IACR3C,EAAQiB,MAAMqC,SAAW/J,KAAK+J,SAASC,KAAKhK,MAC5CyG,EAAQiB,MAAMuC,SAAWjK,KAAKiK,SAASD,KAAKhK,KAC/C,CACD,cAAM+J,CAAS5H,GACPnC,KAAKsJ,cACCtJ,KAAKuJ,GAAGI,OAElB3J,KAAKuJ,GAAGQ,SAAS5H,EACpB,CACD,QAAA8H,GACI,MAAM9H,EAAInC,KAAKuJ,GAAGU,WAClB,MAAa,KAAN9H,EAAW,KAAOA,CAC5B,CACD,aAAO+H,CAAOC,EAASC,GACnB7B,eAAeC,OAAO2B,EAAS,cAAchB,EACzC,WAAApJ,GACI2D,MAAM0G,EACT,GAER,CACD,gBAAO9B,GACH,OAAOa,EAAOe,OAAO,aACxB,EAILpK,EAAWmB,MAAMkI,GAIjB,MAAMkB,UAAajC,YACf,WAAArI,EAAYuK,SAAEA,EAAQC,WAAEA,EAAUC,qBAAEA,EAAoBC,wBAAEA,IACtD/G,QACA5D,EAAWiB,KAAKf,MAChBA,KAAKsK,SAAWA,GAAY,CAAE,EAC9BtK,KAAKuK,WAAaA,GAAc,CAAE,EAClCvK,KAAKwK,qBAAuBA,GAAwB,SACpDxK,KAAKyK,wBAA0BA,GAA2B,UAE1D,MAAMC,EAAOpJ,SAASkG,cAAc,QACpCkD,EAAKvD,UAAUnH,KAAKoH,YACpBpH,KAAK2K,YAAYD,GAEjBA,EAAKE,iBAAiB,UAAUhB,MAAO5K,IACnCA,EAAE6L,iBACF7K,KAAK8K,SAAQ,GACb,UACU9K,KAAKQ,KAAK,SAAUR,KAAK+K,YAAa/K,KAC/C,CAAC,MAAOhB,GACL,GAAIA,aAAa+D,EAEb,YADA/C,KAAKgL,UAAUhM,EAAEyE,UAGrB,MAAMzE,CACtB,CAAsB,QACNgB,KAAK8K,SAAQ,EAChB,IAER,CACD,OAAAA,CAAQG,GACJjL,KAAK4G,iBAAiB,eAAeV,SAAQM,IACzCA,EAAGyE,EAAO,OAAS,SAAS,IAEhCjL,KAAK4G,iBAAiB,8BAA8BV,SAAQM,IACxDA,EAAG0E,SAAWD,CAAI,GAEzB,CACD,SAAAE,CAAUC,GACN,IAAK,IAAIlJ,KAAKkJ,EACLA,EAAOC,eAAenJ,IAG3B5C,MAAMC,KAAKS,KAAK4G,iBAAiB,UAAU0E,IAAIC,OAAOrJ,SAASgE,SAASM,IACpE6D,EAAKmB,OAAOxL,KAAKsK,SAAU9D,EAAI4E,EAAOlJ,GAAIA,EAAGkJ,EAAO,GAG/D,CACD,SAAAL,GACI,OAAOzL,MAAMC,KAAKS,KAAK4G,iBAAiB5G,KAAKwK,uBACxCxE,QAAQQ,GACgC,UAAjCA,EAAGiF,QAAwB,iBAGS,WAAjCjF,EAAGiF,QAAwB,gBAA+D,OAA7CjF,EAAGkF,QAAQ1L,KAAKyK,4BAEvEkB,QAAO,CAACC,EAAQpF,IACN6D,EAAKwB,YAAYD,EAAQpF,EAAGhF,aAAa,QAAS6I,EAAKyB,QAAQ9L,KAAKuK,WAAY/D,KACxF,CAAE,EACZ,CACD,SAAAwE,CAAUe,EAAQC,GAyBd,GAxBAhM,KAAKiM,cACLF,EACK/F,QAAQhH,GAAiB,gBAAXA,EAAEmE,MAAqC,mBAAXnE,EAAEmE,OAC5C+C,SAASlH,IACN,MAAM4E,EAAO5E,EAAEqC,QAAQ6K,QAAQ,IAAK,KAAKA,QAAQ,KAAM,KACvDlM,KAAK4G,iBAAiB,UAAU0E,IAAIC,OAAO3H,QACtCsC,SAAQwB,IACLA,EAAMtB,UAAUC,IAAI,cAChBqB,EAAMb,cAAcT,UAAU+F,SAAS,kBACvCzE,EAAMb,cAAcT,UAAUC,IAAI,aACrC,IAETrG,KAAK4G,iBAAiB,0BAA0B0E,IAAIC,OAAO3H,QACtDsC,SAAQM,GAAMA,EAAG4F,UAAYpN,EAAEoE,QAAO,IAEnDpD,KAAK4G,iBAAiB,cACjBV,SAAQM,IACL,MAAM6F,EAAeN,EAAO/F,QAAQhH,GAAiB,gBAAXA,EAAEmE,MAAqC,mBAAXnE,EAAEmE,OACxEqD,EAAG0C,UAAYmD,EAAatN,KAAIC,GAAKA,EAAEoE,SAAQvD,KAAK,MACxB,IAAxBwM,EAAa1O,QACb6I,EAAGJ,UAAUwC,OAAO,SACvB,KAGJoD,EACD,OAEJ,MAAMM,EAAKhN,MAAMC,KAAKS,KAAK4G,iBAAiB,iCACvC7H,KAAIyH,GAAMA,EAAG+F,wBAAwBC,EAAI5J,OAAO6J,UAC/CC,EAAO3O,KAAK4O,OAAOL,GACrBI,IAASE,KACThK,OAAOoJ,OAAOpJ,OAAOiK,QAASH,EAAO,IAAMA,EAAO,IAAM,EAE/D,CACD,WAAAT,GACIjM,KAAK4G,iBAAiB,gDACjBV,SAAQM,GAAMA,EAAGJ,UAAUwC,OAAO,gBACvC5I,KAAK4G,iBAAiB,cACjBV,SAAQM,IACLA,EAAG0C,UAAY,GACf1C,EAAGJ,UAAUC,IAAI,SAAS,GAErC,CACD,cAAOyF,CAAQvB,EAAY/D,GACvB,MAAMsG,EAAiBvC,EAAW/D,EAAGiF,QAA0B,mBAAMlB,EAAW/D,EAAGiF,QAAwB,gBAC3G,GAAIqB,EACA,OAAOA,EAAetG,GAE1B,GAAgC,UAA5BA,EAAGhF,aAAa,QAAqB,CACrC,IAAKgF,EAAGuG,QACJ,OAEJ,MAAqC,YAA9BvG,EAAGiF,QAAqB,YAA+B,SAAbjF,EAAGwG,MAAmBxG,EAAGwG,KAC7E,CACD,MAAgC,aAA5BxG,EAAGhF,aAAa,QACTgF,EAAGuG,QAEoB,YAA9BvG,EAAGiF,QAAqB,YAChBjF,EAAGwG,MAA4B,SAAbxG,EAAGwG,MAAV,KAEnBxG,EAAGyD,SACIzD,EAAGyD,WAEPzD,EAAGwG,OAAS,IACtB,CACD,aAAOxB,CAAOlB,EAAU9D,EAAIyG,EAAKC,EAAK9B,GAClC,MAAM+B,EAAe7C,EAAS9D,EAAGiF,QAAwB,iBAAMnB,EAAS9D,EAAGiF,QAAwB,gBAC/F0B,EACAA,EAAa3G,EAAIyG,EAAKC,EAAK9B,GAGC,UAA5B5E,EAAGhF,aAAa,QAIY,aAA5BgF,EAAGhF,aAAa,QAIhBgF,EAAGuD,SACHvD,EAAGuD,SAASkD,GAGhBzG,EAAGwG,MAAQC,EAPPzG,EAAGuG,QAAUE,EAJbzG,EAAGuG,QAAUvG,EAAGhF,aAAa,WAAayL,CAYjD,CAED,kBAAOpB,CAAYD,EAAQwB,EAAMJ,GAC7B,MAAMK,EAAOD,EAAK9G,MAAM,KAAKvH,KAAKmD,GAAMA,EAAEoL,MAAM,aAAepL,EAAIA,IACnE,IAAIsC,EAAUoH,EACV2B,EAAW,KACf,IAAK,IAAI9P,EAAI,KAAOA,EAAG,CACnB,MAAM+P,EAAOH,EAAK5P,GACZgQ,EAAOJ,EAAK5P,EAAI,GAQtB,GAPIiQ,OAAOC,UAAUH,KAAUlO,MAAMsO,QAAQpJ,KACxB,OAAb+I,EACAA,EAASE,GAAQjJ,EAAU,GAE3BoH,EAASpH,EAAU,IAGvB/G,IAAM4P,EAAK1P,OAAS,EAGpB,OADA6G,EAAQgJ,QAAkBxI,IAAVgI,EAAsBA,EAASQ,KAAQhJ,EAAUA,EAAQgJ,GAAQ,KAC1E5B,OAEW5G,IAAlBR,EAAQgJ,KACRhJ,EAAQgJ,GAAQ,IAEpBD,EAAW/I,EACXA,EAAUA,EAAQgJ,EACrB,CACJ,CACD,aAAOtD,CAAOC,EAASC,GACnB7B,eAAeC,OAAO2B,EAAS,cAAcE,EACzC,WAAAtK,GACI2D,MAAM0G,EACT,GAER,CACD,gBAAO9B,CAAU8B,GACbjC,EAAWG,YACXG,EAAOH,YACPI,EAAQJ,YACRQ,EAAMR,YACNa,EAAOb,YACP+B,EAAKH,OAAO,WAAYE,GAAiB,CAAE,EAC9C,EAGLtK,EAAWmB,MAAMoJ,GCzcjB,MAAMwD,EACF,WAAA9N,CAAY2F,EAAQoI,GAChB9N,KAAK0F,OAASA,EACd1F,KAAK8N,QAAUA,CAClB,CACD,IAAAC,CAAK7L,EAAGC,GACJnC,KAAK8N,QAAQE,QAAQ,GAAGhO,KAAK0F,UAAUxD,IAAKoB,KAAKK,UAAUxB,GAC9D,CACD,IAAAwH,CAAKzH,GACD,MAAM+L,EAAMjO,KAAK8N,QAAQI,QAAQ,GAAGlO,KAAK0F,UAAUxD,KACnD,YAAe8C,IAARiJ,OAAoBjJ,EAAY1B,KAAKC,MAAM0K,EACrD,CACD,MAAArF,CAAO1G,GACHlC,KAAK8N,QAAQK,WAAW,GAAGnO,KAAK0F,UAAUxD,IAC7C,CACD,GAAAkM,CAAIlM,GACA,MAAMmM,EAAUrO,KAAK2J,KAAKzH,GAE1B,OADAlC,KAAK4I,OAAO1G,GACLmM,CACV,EAGL,MAAMC,UAAqBT,EACvB,WAAA9N,CAAY2F,GACRhC,MAAMgC,EAAQ6I,aACjB,EAGL,MAAMC,UAAuBX,EACzB,WAAA9N,CAAY2F,GACRhC,MAAMgC,EAAQ+I,eACjB,EAGL,MAAMC,EACF,WAAA3O,CAAY+N,EAASZ,EAAKyB,GACtB3O,KAAK8N,QAAUA,EACf9N,KAAKkN,IAAMA,EACXlN,KAAK2O,aAAeA,EACpB3O,KAAK4O,MAAQ,IAEhB,CACD,UAAMjF,CAAKkF,GACP,MAAMC,EAAQ9O,KAAK8N,QAAQnE,KAAK3J,KAAKkN,KACrC,GAAM4B,GAASA,EAAMD,WAAaA,EAE9B,YADA7O,KAAK4O,MAAQE,EAAM9B,OAGvB,MAAM+B,QAAkB/O,KAAK2O,aAAaE,EAAU7O,KAAKkN,KACzDlN,KAAK8N,QAAQC,KAAK/N,KAAKkN,IAAK,CACxB2B,SAAUA,EACV7B,MAAO+B,IAEX/O,KAAK4O,MAAQG,CAChB,CACD,IAAA3O,GACI,OAAOJ,KAAK4O,KACf,ECtDL,MAAMI,EACF,kBAAOC,CAAYC,EAAUC,EAAc1M,GAEvC,OAAO,IAAIuM,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,SAAUhN,GAEjB,CACD,WAAA1C,CAAYmP,EAAUQ,GAAON,KAACA,EAAIE,MAAEA,EAAKE,aAAEA,EAAYD,OAAEA,EAAME,SAAEA,IAC7DzP,KAAK8N,QAAU,IAAIU,EAAeU,GAClClP,KAAKkP,SAAWA,EAChBlP,KAAK0P,MAAQA,EACb1P,KAAK2P,IAAM,CAACP,OAAME,QAAOE,eAAcD,SAAQE,WAClD,CACD,YAAMG,CAAOD,EAAKE,GACd,MAAMC,EAAehT,EAAOC,OAAOgT,OAAOC,gBAAgB,IAAIzS,WAAW,KAAKkB,QACxEwR,EAAgBnT,EAAOC,aAAagT,OAAOG,OAAOC,OAAO,WAAW,IAAIC,aAAcrT,OAAO+S,KAC7FO,EAAQrQ,KAAKkP,SAAWpS,EAAOC,OAAOgT,OAAOC,gBAAgB,IAAIzS,WAAW,KAAKkB,QACvFuB,KAAK8N,QAAQC,KAAKiB,EAAsBsB,mBAAoB,CACxDD,MAAOA,EACPE,SAAUT,IAEd,MAAMU,EAAM,IAAInB,IAAIM,GACpBa,EAAIC,aAAalO,IAAI,YAAavC,KAAKkP,UACvCsB,EAAIC,aAAalO,IAAI,eAAgBvC,KAAK2P,IAAIF,UAC9Ce,EAAIC,aAAalO,IAAI,gBAAiB,QACtCiO,EAAIC,aAAalO,IAAI,QAASvC,KAAK0P,OACnCc,EAAIC,aAAalO,IAAI,QAAS8N,GAC9BG,EAAIC,aAAalO,IAAI,iBAAkB0N,GACvCO,EAAIC,aAAalO,IAAI,wBAAyB,QAC9CmE,OAAOgK,QAAQb,GAAoB,CAAE,GAAE3J,SAAQyK,IAC3CH,EAAIC,aAAalO,IAAIoO,EAAG,GAAIA,EAAG,GAAG,IAEtC/N,OAAOC,SAAW2N,CACrB,CACD,kBAAMhB,CAAaK,SACT7P,KAAK4P,OAAO5P,KAAK2P,IAAIH,aAAcK,EAC5C,CACD,gCAAMe,CAA2BC,SACvB7Q,KAAK4P,OAAO5P,KAAK2P,IAAIP,KAAM,CAC7B0B,UAAWD,GAElB,CACD,oBAAME,CAAeC,EAAMX,GACvBzN,OAAOqO,QAAQC,aAAa,GAAI,GAAIlR,KAAK2P,IAAIF,UAC7C,MAAM0B,EAAmBnR,KAAK8N,QAAQM,IAAIY,EAAsBsB,oBAChE,GAAIa,EAAiBd,QAAUA,EAC3B,MAAM,IAAIxR,MAAM,kBAEpB,MAAM6D,QAAiB4B,MAAMtE,KAAK2P,IAAIL,MAAO,CACzCpK,OAAQ,OACR9C,QAAS,CACL,eAAgB,qCAEpB+C,KAAM,IAAIiM,gBAAgB,CACtB,CAAC,YAAapR,KAAKkP,UACnB,CAAC,OAAQ8B,GACT,CAAC,aAAc,sBACf,CAAC,gBAAiBG,EAAiBZ,UACnC,CAAC,QAASY,EAAiBd,OAC3B,CAAC,eAAgBrQ,KAAK2P,IAAIF,cAGlC,IAAK/M,EAASmC,GAAI,CACd,MAAM5B,QAAaP,EAASO,OAC5B,MAAM,IAAIpE,MAAM,SAAW6D,EAASC,OAAS,KAAOM,EACvD,CACD,MAAMqM,QAAc5M,EAASqC,OAC7B,OAAO,IAAIsM,EAA6BrR,KAAKkP,SAAUI,EAAOtP,KAAK2P,IACtE,CACD,oBAAM2B,GACF,MAAMd,EAAM,IAAInB,IAAIzM,OAAOC,SAASC,MAC9BkO,EAAOR,EAAIC,aAAac,IAAI,QAClC,GAAIP,GAAQhR,KAAK8N,QAAQnE,KAAKqF,EAAsBsB,oBAAqB,CAErE,MAAMD,EAAQG,EAAIC,aAAac,IAAI,SACnC,aAAavR,KAAK+Q,eAAeC,EAAMX,EAC1C,CAGD,aADMrQ,KAAK4P,OAAO5P,KAAK2P,IAAIP,KAAM,CAAA,GAC1B,IACV,EAELJ,EAAsBsB,mBAAqB,qBAE3C,MAAMe,EACF,iBAAOG,CAAWlC,GACd,MAAOmC,EAAWC,EAAYC,GAAarC,EAAMhJ,MAAM,KACjDsL,EAAa,IAAIC,YAAY,SACnC,MAAO,CACHC,OAAQxO,KAAKC,MAAMqO,EAAWhU,OAAOd,EAAOc,OAAO6T,EAAW3U,EAAO4B,YACrEqT,QAASzO,KAAKC,MAAMqO,EAAWhU,OAAOd,EAAOc,OAAO8T,EAAY5U,EAAO4B,YACvEiT,UAAWA,EAElB,CACD,WAAA5R,CAAYmP,EAAU8C,GAAG1C,MAACA,EAAKC,OAAEA,EAAME,SAAEA,IACrCzP,KAAKkP,SAAWA,EAChBlP,KAAKsP,MAAQ0C,EACbhS,KAAKiS,YAAcZ,EAA6BG,WAAWQ,EAAEE,cAC7DlS,KAAKmS,aAAed,EAA6BG,WAAWQ,EAAEI,eAC9DpS,KAAK2P,IAAM,CAAEL,QAAOC,SAAQE,YAC5BzP,KAAKqS,gBAAkB,IAC1B,CACD,SAAAC,CAAUxI,GACN9J,KAAKqS,gBAAkBvI,CAC1B,CACD,aAAMyI,GACF,MAAM7P,QAAiB4B,MAAMtE,KAAK2P,IAAIL,MAAO,CACzCpK,OAAQ,OACR9C,QAAS,CACL,eAAgB,qCAEpB+C,KAAM,IAAIiM,gBAAgB,CACtB,CAAC,YAAapR,KAAKkP,UACnB,CAAC,aAAc,iBACf,CAAC,gBAAiBlP,KAAKsP,MAAM8C,mBAGrC,IAAK1P,EAASmC,GACV,MAAM,IAAIhG,MAAM,SAAW6D,EAASC,OAAS,KAAOD,EAASO,QAEjE,MAAMqM,QAAc5M,EAASqC,OAC7B/E,KAAKsP,MAAQA,EACbtP,KAAKiS,YAAcZ,EAA6BG,WAAWlC,EAAM4C,cACjElS,KAAKmS,aAAed,EAA6BG,WAAWlC,EAAM8C,eAC9DpS,KAAKqS,iBACLrS,KAAKqS,gBAAgBrS,KAAKsP,MAAOtP,KAAKiS,YAAajS,KAAKmS,aAE/D,CACD,iBAAAK,CAAkBC,GACd,MAAMC,GAAM,IAAIC,MAAOC,UACjBC,EAAwD,IAAhC7S,KAAKmS,aAAaJ,QAAQe,IAGxD,QAFgBJ,EAAMG,IACAH,EAAMD,EAAcI,CAE7C,CACD,eAAME,CAAUN,GACPzS,KAAKwS,kBAAkBC,UAGtBzS,KAAKuS,SACd,CACD,MAAAhD,GACI,MAAMiB,EAAM,IAAInB,IAAIrP,KAAK2P,IAAIJ,QAC7BiB,EAAIC,aAAalO,IAAI,2BAA4BvC,KAAK2P,IAAIF,UAC1De,EAAIC,aAAalO,IAAI,gBAAiBvC,KAAKsP,MAAM0D,UACjDpQ,OAAOC,SAAW2N,CACrB,CAED,WAAAyC,GACI,MAAO,UAAUjT,KAAKsP,MAAM4C,cAC/B,CAED,WAAAzN,CAAYyO,EAAmBC,GAC3B,OAAO,IAAIC,EAAiCpT,KAAMkT,EAAmBC,EACxE,EAGL,MAAMC,EACF,WAAArT,CAAYsT,EAASH,EAAmBC,GACpCnT,KAAKqT,QAAUA,EACfrT,KAAKkT,kBAAoBA,GAAqB,IAC9ClT,KAAKmT,iBAAmBA,GAAoB,GAC/C,CACD,eAAMzR,CAAUC,EAASC,SACf5B,KAAKqT,QAAQN,UAAU/S,KAAKkT,mBAClC,MAAM9Q,EAAU,IAAIC,QAAQV,EAAQW,QAAQF,SAC5CA,EAAQG,IAAI,gBAAiBvC,KAAKqT,QAAQJ,eAC1CtR,EAAQW,QAAQF,QAAUA,EAC1B,MAAMM,QAAiBd,EAAMI,QAAQL,GAErC,aADM3B,KAAKqT,QAAQN,UAAU/S,KAAKmT,kBAC3BzQ,CACV,EClLA,MAAC4Q,EAAS,CACXC,MAAMC,GACK,IAAIC,SAAQC,GAAWC,WAAWD,EAASF,KAEtDI,iBAAkB,EAClBC,mBAAoB,EACpB,QAAAC,CAASC,EAAWC,EAAM1R,GACtB,IAAI2R,EAAM,KACNC,EAAO,GACPC,EAAoB,EACpBvP,EAAOtC,GAAWgR,EAAOM,iBAE7B,MAAMQ,EAAQ,KACV,MAAMC,GAAU,IAAI1B,MAAOC,UAAYuB,EACnCJ,EAAYM,EACZJ,EAAMN,WAAWS,EAAOL,EAAYM,IAGxCJ,EAAM,KACFrP,IAAS0O,EAAOO,oBAChBG,KAAQE,GAGA,OAARD,IACAC,EAAO,IACV,EAGL,OAAO,WACHA,EAAOI,UACPH,GAAoB,IAAIxB,MAAOC,UACnB,OAARqB,IACAA,EAAMN,WAAWS,EAAOL,GACpBnP,IAAS0O,EAAOO,oBAChBG,KAAQE,GAG5B,CACK,EACDK,iBAAkB,EAClBC,oBAAqB,EACrBC,qBAAsB,EACtB,QAAAC,CAASX,EAAWC,EAAM1R,GACtB,IAAI2R,EAAM,KACNC,EAAO,GACPC,EAAoB,EACpBvP,EAAOtC,GAAWgR,EAAOiB,iBAE7B,MAAMH,EAAQ,KACVD,EAAqBvP,EAAO0O,EAAOkB,oBAAuB,GAAI,IAAI7B,MAAOC,UACzEqB,EAAM,KACND,KAAQE,GACI,OAARD,IACAC,EAAO,GACV,EAGL,OAAO,WACH,MAAMxB,GAAM,IAAIC,MAAOC,WAClBuB,GAAsBvP,EAAO0O,EAAOkB,sBACrCL,EAAoBzB,GAExB,MAAMiC,EAAYZ,GAAarB,EAAMyB,GACrCD,EAAOI,UACHK,GAAa,GAAKA,EAAYZ,GAClB,OAARE,IACAW,aAAaX,GACbA,EAAM,MAEVE,EAAoBzB,EACpBsB,KAAQE,GACI,OAARD,IACAC,EAAO,KAEI,OAARD,GAAkBrP,EAAO0O,EAAOmB,uBACvCR,EAAMN,WAAWS,EAAOO,GAExC,CAEK,GChFL,MAAME,UAAezM,YACjB,WAAArI,GAWI,GAVA2D,QACA1D,KAAK8U,SAAW,IAAI9U,KAAK+U,UAAU/O,QAAOhH,GAAKA,EAAEgW,QAAQ,kBAEzDhV,KAAK8U,SAAS5O,SAAQ+O,IAClB,MAAMF,EAAW,IAAIE,EAAEF,eAEP/P,IADA+P,EAAS/O,QAAOhH,GAAKA,EAAEgW,QAAQ,aAAY,IAC9BD,EAASpX,OAAS,GAC3CoX,EAAS,GAAG3O,UAAUC,IAAI,SAC7B,IAEyC,OAA1CrG,KAAKuB,cAAc,mBAA6B,CAChD,MAAM2T,EAAelV,KAAKuB,cAAc,yBACnB,OAAjB2T,GACAA,EAAa9O,UAAUC,IAAI,UAElC,CACJ,CACD,IAAA8O,GACInV,KAAK8U,SAAS5O,SAAQ+O,IAClB,MACMzQ,EADW,IAAIyQ,EAAEF,UACE/O,QAAOhH,GAAKA,EAAEgW,QAAQ,aAAY,GAC3DxQ,GAAS4B,UAAUwC,OAAO,UAC1BpE,GAAS4Q,oBAAoBhP,UAAUC,IAAI,SAAS,IAExD,MAAMgP,EAAiBrV,KAAKuB,cAAc,mBAC1C8T,EAAejP,UAAUwC,OAAO,WAChCyM,EAAeD,mBAAmBhP,UAAUC,IAAI,WAEhDrG,KAAKsV,cAAc,IAAIC,YAAY,kBAAmB,CAClDC,SAAS,EACTC,YAAY,IAGnB,CACD,IAAAC,GACI1V,KAAK8U,SAAS5O,SAAQ+O,IAClB,MACMzQ,EADW,IAAIyQ,EAAEF,UACE/O,QAAOhH,GAAKA,EAAEgW,QAAQ,aAAY,GAC3DxQ,GAAS4B,UAAUwC,OAAO,UAC1BpE,GAASmR,wBAAwBvP,UAAUC,IAAI,SAAS,IAE5D,MAAMgP,EAAiBrV,KAAKuB,cAAc,mBAC1C8T,EAAejP,UAAUwC,OAAO,WAChCyM,EAAeM,uBAAuBvP,UAAUC,IAAI,WACpDrG,KAAKsV,cAAc,IAAIC,YAAY,kBAAmB,CAClDC,SAAS,EACTC,YAAY,IAEnB,CACDG,OAAS,SAAUC,GACf7V,KAAK8U,SAAS5O,SAAQ+O,IAClB,MACMzQ,EADW,IAAIyQ,EAAEF,UACE/O,QAAOhH,GAAKA,EAAEgW,QAAQ,aAAY,GAC3DxQ,GAAS4B,UAAUwC,OAAO,UAC1BqM,EAAEF,UAAUc,IAAIzP,UAAUC,IAAI,SAAS,IAE3C,MAAMgP,EAAiBrV,KAAKuB,cAAc,mBAC1C8T,GAAgBjP,UAAUwC,OAAO,WACd5I,KAAKuB,cAAc,sBAAsBsU,MACjDzP,UAAUC,IAAI,WACzBrG,KAAKsV,cAAc,IAAIC,YAAY,kBAAmB,CAClDC,SAAS,EACTC,YAAY,IAEnB,EACD,aAAOvL,CAAOC,EAASC,GACnB7B,eAAeC,OAAO2B,EAAS,cAAc0K,EACzC,WAAA9U,GACI2D,MAAM0G,EACT,GAER,CACD,gBAAO9B,GACH,OAAOuM,EAAO3K,OAAO,aACxB,EC5EL,MAAM4L,EACF,WAAA/V,GACIC,KAAK+V,YAAc,GACnB/V,KAAKgW,aAAe,GACpBhW,KAAKiW,SAAW,GAChBjW,KAAKkW,SAAU,EACf5U,SAASsJ,iBAAiB,oBAAoBhB,gBACpC6J,QAAQ0C,IAAInW,KAAK+V,mBACjBtC,QAAQ0C,IAAInW,KAAKgW,aAAajX,KAAIqX,GAAK3C,QAAQC,QAAQ0C,cACvD3C,QAAQ0C,IAAInW,KAAKiW,SAASlX,KAAIqX,GAAK3C,QAAQC,QAAQ0C,OAAM,GAEtE,CACD,SAAA9N,CAAU+N,GAEN,OADArW,KAAK+V,YAAYpV,KAAK8S,QAAQC,QAAQ2C,MAC/BrW,IACV,CACD,UAAAsW,CAAWD,GAEP,OADArW,KAAKgW,aAAarV,KAAK0V,GAChBrW,IACV,CACD,KAAAuW,CAAMF,GAEF,OADArW,KAAKiW,SAAStV,KAAK0V,GACZrW,IACV"}
package/dist/ful.mjs CHANGED
@@ -99,12 +99,14 @@ class Observable {
99
99
  const idx = listeners.indexOf(listener);
100
100
  return idx === -1 ? [] : listeners.splice(idx, 1);
101
101
  }
102
- static mixin(self) {
102
+ static init(self){
103
103
  self.listeners = {};
104
- self.fireSync = Observable.prototype.fireSync;
105
- self.fire = Observable.prototype.fire;
106
- self.on = Observable.prototype.on;
107
- self.un = Observable.prototype.un;
104
+ }
105
+ static mixin(ctor) {
106
+ ctor.prototype.fireSync = Observable.prototype.fireSync;
107
+ ctor.prototype.fire = Observable.prototype.fire;
108
+ ctor.prototype.on = Observable.prototype.on;
109
+ ctor.prototype.un = Observable.prototype.un;
108
110
  }
109
111
 
110
112
  }
@@ -284,7 +286,8 @@ class CustomElements {
284
286
  return `${prefix}-${++CustomElements.id}`;
285
287
  }
286
288
  static forwardAttributes(from, to, except) {
287
- from.getAttributeNames().filter(a => except.indexOf(a) === -1)
289
+ from.getAttributeNames()
290
+ .filter(a => except.indexOf(a) === -1)
288
291
  .filter(a => a[0] === '@')
289
292
  .forEach(a => {
290
293
  if (a === '@class') {
@@ -482,7 +485,7 @@ class Input extends HTMLElement {
482
485
  class Select extends HTMLElement {
483
486
  constructor(tsConfig) {
484
487
  super();
485
- Observable.mixin(this);
488
+ Observable.init(this);
486
489
  const id = CustomElements.uid('ful-select');
487
490
  const name = this.getAttribute('@name');
488
491
  const floating = this.hasAttribute('@floating');
@@ -537,10 +540,14 @@ class Select extends HTMLElement {
537
540
 
538
541
  }
539
542
 
543
+ Observable.mixin(Select);
544
+
545
+
546
+
540
547
  class Form extends HTMLElement {
541
548
  constructor({ mutators, extractors, valueHoldersSelector, ignoredChildrenSelector }) {
542
549
  super();
543
- Observable.mixin(this);
550
+ Observable.init(this);
544
551
  this.mutators = mutators || {};
545
552
  this.extractors = extractors || {};
546
553
  this.valueHoldersSelector = valueHoldersSelector || '[name]';
@@ -726,6 +733,8 @@ class Form extends HTMLElement {
726
733
  }
727
734
  }
728
735
 
736
+ Observable.mixin(Form);
737
+
729
738
  class Storage {
730
739
  constructor(prefix, storage) {
731
740
  this.prefix = prefix;
@@ -912,8 +921,8 @@ class AuthorizationCodeFlowSession {
912
921
  }
913
922
  const token = await response.json();
914
923
  this.token = token;
915
- this.accessToken = this._parseToken(token.access_token);
916
- this.refreshToken = this._parseToken(token.refresh_token);
924
+ this.accessToken = AuthorizationCodeFlowSession.parseToken(token.access_token);
925
+ this.refreshToken = AuthorizationCodeFlowSession.parseToken(token.refresh_token);
917
926
  if (this.refreshCallback) {
918
927
  this.refreshCallback(this.token, this.accessToken, this.refreshToken);
919
928
  }