{"version":3,"file":"gridjs.mjs","sources":["../node_modules/preact/dist/preact.module.js","../src/util/id.ts","../src/base.ts","../src/i18n/en_US.ts","../src/pipeline/processor.ts","../src/i18n/language.ts","../src/view/base.tsx","../src/util/getConfig.ts","../src/view/htmlElement.tsx","../src/util/html.ts","../src/cell.ts","../src/row.ts","../src/tabular.ts","../src/util/array.ts","../src/util/eventEmitter.ts","../src/pipeline/filter/globalSearch.ts","../src/operator/search.ts","../src/util/className.ts","../src/view/base/store.ts","../src/view/plugin/search/store.ts","../src/view/base/actions.ts","../src/view/plugin/search/actions.ts","../src/pipeline/filter/serverGlobalSearch.ts","../src/util/log.ts","../src/plugin.ts","../src/types.ts","../src/view/plugin/search/search.tsx","../src/util/debounce.ts","../src/pipeline/limit/pagination.ts","../src/pipeline/limit/serverPagination.ts","../src/view/plugin/pagination.tsx","../src/util/width.ts","../src/view/table/shadow.tsx","../src/util/string.ts","../src/header.ts","../src/util/dispatcher.ts","../src/storage/storage.ts","../src/storage/memory.ts","../src/storage/server.ts","../src/storage/storageUtils.ts","../src/pipeline/pipeline.ts","../src/pipeline/extractor/storage.ts","../src/pipeline/transformer/arrayToTabular.ts","../src/pipeline/initiator/server.ts","../src/pipeline/transformer/storageResponseToArray.ts","../src/pipeline/pipelineUtils.ts","../src/config.ts","../src/view/table/td.tsx","../src/view/table/tr.tsx","../src/view/table/messageRow.tsx","../src/view/table/tbody.tsx","../src/pipeline/sort/native.ts","../src/view/plugin/sort/store.ts","../src/view/plugin/sort/actions.ts","../src/pipeline/sort/server.ts","../src/view/plugin/sort/sort.tsx","../src/view/plugin/resize/resize.tsx","../src/util/throttle.ts","../src/view/table/th.tsx","../src/view/table/thead.tsx","../src/util/table.ts","../src/view/table/table.tsx","../src/view/headerContainer.tsx","../src/view/footerContainer.tsx","../src/view/container.tsx","../src/grid.ts","../node_modules/preact/hooks/dist/hooks.module.js"],"sourcesContent":["var n,l,u,i,t,o,r,f={},e=[],c=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function s(n,l){for(var u in l)n[u]=l[u];return n}function a(n){var l=n.parentNode;l&&l.removeChild(n)}function h(l,u,i){var t,o,r,f={};for(r in u)\"key\"==r?t=u[r]:\"ref\"==r?o=u[r]:f[r]=u[r];if(arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):i),\"function\"==typeof l&&null!=l.defaultProps)for(r in l.defaultProps)void 0===f[r]&&(f[r]=l.defaultProps[r]);return v(l,f,t,o,null)}function v(n,i,t,o,r){var f={type:n,props:i,key:t,ref:o,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==r?++u:r};return null==r&&null!=l.vnode&&l.vnode(f),f}function y(){return{current:null}}function p(n){return n.children}function d(n,l){this.props=n,this.context=l}function _(n,l){if(null==l)return n.__?_(n.__,n.__.__k.indexOf(n)+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return\"function\"==typeof n.type?_(n):null}function k(n){var l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,l=0;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e){n.__e=n.__c.base=u.__e;break}return k(n)}}function b(n){(!n.__d&&(n.__d=!0)&&t.push(n)&&!g.__r++||o!==l.debounceRendering)&&((o=l.debounceRendering)||setTimeout)(g)}function g(){for(var n;g.__r=t.length;)n=t.sort(function(n,l){return n.__v.__b-l.__v.__b}),t=[],n.some(function(n){var l,u,i,t,o,r;n.__d&&(o=(t=(l=n).__v).__e,(r=l.__P)&&(u=[],(i=s({},t)).__v=t.__v+1,j(r,t,i,l.__n,void 0!==r.ownerSVGElement,null!=t.__h?[o]:null,u,null==o?_(t):o,t.__h),z(u,t),t.__e!=o&&k(t)))})}function w(n,l,u,i,t,o,r,c,s,a){var h,y,d,k,b,g,w,x=i&&i.__k||e,C=x.length;for(u.__k=[],h=0;h<l.length;h++)if(null!=(k=u.__k[h]=null==(k=l[h])||\"boolean\"==typeof k?null:\"string\"==typeof k||\"number\"==typeof k||\"bigint\"==typeof k?v(null,k,null,null,k):Array.isArray(k)?v(p,{children:k},null,null,null):k.__b>0?v(k.type,k.props,k.key,null,k.__v):k)){if(k.__=u,k.__b=u.__b+1,null===(d=x[h])||d&&k.key==d.key&&k.type===d.type)x[h]=void 0;else for(y=0;y<C;y++){if((d=x[y])&&k.key==d.key&&k.type===d.type){x[y]=void 0;break}d=null}j(n,k,d=d||f,t,o,r,c,s,a),b=k.__e,(y=k.ref)&&d.ref!=y&&(w||(w=[]),d.ref&&w.push(d.ref,null,k),w.push(y,k.__c||b,k)),null!=b?(null==g&&(g=b),\"function\"==typeof k.type&&k.__k===d.__k?k.__d=s=m(k,s,n):s=A(n,k,d,x,b,s),\"function\"==typeof u.type&&(u.__d=s)):s&&d.__e==s&&s.parentNode!=n&&(s=_(d))}for(u.__e=g,h=C;h--;)null!=x[h]&&(\"function\"==typeof u.type&&null!=x[h].__e&&x[h].__e==u.__d&&(u.__d=_(i,h+1)),N(x[h],x[h]));if(w)for(h=0;h<w.length;h++)M(w[h],w[++h],w[++h])}function m(n,l,u){for(var i,t=n.__k,o=0;t&&o<t.length;o++)(i=t[o])&&(i.__=n,l=\"function\"==typeof i.type?m(i,l,u):A(u,i,i,t,i.__e,l));return l}function x(n,l){return l=l||[],null==n||\"boolean\"==typeof n||(Array.isArray(n)?n.some(function(n){x(n,l)}):l.push(n)),l}function A(n,l,u,i,t,o){var r,f,e;if(void 0!==l.__d)r=l.__d,l.__d=void 0;else if(null==u||t!=o||null==t.parentNode)n:if(null==o||o.parentNode!==n)n.appendChild(t),r=null;else{for(f=o,e=0;(f=f.nextSibling)&&e<i.length;e+=2)if(f==t)break n;n.insertBefore(t,o),r=o}return void 0!==r?r:t.nextSibling}function C(n,l,u,i,t){var o;for(o in u)\"children\"===o||\"key\"===o||o in l||H(n,o,null,u[o],i);for(o in l)t&&\"function\"!=typeof l[o]||\"children\"===o||\"key\"===o||\"value\"===o||\"checked\"===o||u[o]===l[o]||H(n,o,l[o],u[o],i)}function $(n,l,u){\"-\"===l[0]?n.setProperty(l,u):n[l]=null==u?\"\":\"number\"!=typeof u||c.test(l)?u:u+\"px\"}function H(n,l,u,i,t){var o;n:if(\"style\"===l)if(\"string\"==typeof u)n.style.cssText=u;else{if(\"string\"==typeof i&&(n.style.cssText=i=\"\"),i)for(l in i)u&&l in u||$(n.style,l,\"\");if(u)for(l in u)i&&u[l]===i[l]||$(n.style,l,u[l])}else if(\"o\"===l[0]&&\"n\"===l[1])o=l!==(l=l.replace(/Capture$/,\"\")),l=l.toLowerCase()in n?l.toLowerCase().slice(2):l.slice(2),n.l||(n.l={}),n.l[l+o]=u,u?i||n.addEventListener(l,o?T:I,o):n.removeEventListener(l,o?T:I,o);else if(\"dangerouslySetInnerHTML\"!==l){if(t)l=l.replace(/xlink(H|:h)/,\"h\").replace(/sName$/,\"s\");else if(\"href\"!==l&&\"list\"!==l&&\"form\"!==l&&\"tabIndex\"!==l&&\"download\"!==l&&l in n)try{n[l]=null==u?\"\":u;break n}catch(n){}\"function\"==typeof u||(null!=u&&(!1!==u||\"a\"===l[0]&&\"r\"===l[1])?n.setAttribute(l,u):n.removeAttribute(l))}}function I(n){this.l[n.type+!1](l.event?l.event(n):n)}function T(n){this.l[n.type+!0](l.event?l.event(n):n)}function j(n,u,i,t,o,r,f,e,c){var a,h,v,y,_,k,b,g,m,x,A,C,$,H=u.type;if(void 0!==u.constructor)return null;null!=i.__h&&(c=i.__h,e=u.__e=i.__e,u.__h=null,r=[e]),(a=l.__b)&&a(u);try{n:if(\"function\"==typeof H){if(g=u.props,m=(a=H.contextType)&&t[a.__c],x=a?m?m.props.value:a.__:t,i.__c?b=(h=u.__c=i.__c).__=h.__E:(\"prototype\"in H&&H.prototype.render?u.__c=h=new H(g,x):(u.__c=h=new d(g,x),h.constructor=H,h.render=O),m&&m.sub(h),h.props=g,h.state||(h.state={}),h.context=x,h.__n=t,v=h.__d=!0,h.__h=[]),null==h.__s&&(h.__s=h.state),null!=H.getDerivedStateFromProps&&(h.__s==h.state&&(h.__s=s({},h.__s)),s(h.__s,H.getDerivedStateFromProps(g,h.__s))),y=h.props,_=h.state,v)null==H.getDerivedStateFromProps&&null!=h.componentWillMount&&h.componentWillMount(),null!=h.componentDidMount&&h.__h.push(h.componentDidMount);else{if(null==H.getDerivedStateFromProps&&g!==y&&null!=h.componentWillReceiveProps&&h.componentWillReceiveProps(g,x),!h.__e&&null!=h.shouldComponentUpdate&&!1===h.shouldComponentUpdate(g,h.__s,x)||u.__v===i.__v){h.props=g,h.state=h.__s,u.__v!==i.__v&&(h.__d=!1),h.__v=u,u.__e=i.__e,u.__k=i.__k,u.__k.forEach(function(n){n&&(n.__=u)}),h.__h.length&&f.push(h);break n}null!=h.componentWillUpdate&&h.componentWillUpdate(g,h.__s,x),null!=h.componentDidUpdate&&h.__h.push(function(){h.componentDidUpdate(y,_,k)})}if(h.context=x,h.props=g,h.__v=u,h.__P=n,A=l.__r,C=0,\"prototype\"in H&&H.prototype.render)h.state=h.__s,h.__d=!1,A&&A(u),a=h.render(h.props,h.state,h.context);else do{h.__d=!1,A&&A(u),a=h.render(h.props,h.state,h.context),h.state=h.__s}while(h.__d&&++C<25);h.state=h.__s,null!=h.getChildContext&&(t=s(s({},t),h.getChildContext())),v||null==h.getSnapshotBeforeUpdate||(k=h.getSnapshotBeforeUpdate(y,_)),$=null!=a&&a.type===p&&null==a.key?a.props.children:a,w(n,Array.isArray($)?$:[$],u,i,t,o,r,f,e,c),h.base=u.__e,u.__h=null,h.__h.length&&f.push(h),b&&(h.__E=h.__=null),h.__e=!1}else null==r&&u.__v===i.__v?(u.__k=i.__k,u.__e=i.__e):u.__e=L(i.__e,u,i,t,o,r,f,c);(a=l.diffed)&&a(u)}catch(n){u.__v=null,(c||null!=r)&&(u.__e=e,u.__h=!!c,r[r.indexOf(e)]=null),l.__e(n,u,i)}}function z(n,u){l.__c&&l.__c(u,n),n.some(function(u){try{n=u.__h,u.__h=[],n.some(function(n){n.call(u)})}catch(n){l.__e(n,u.__v)}})}function L(l,u,i,t,o,r,e,c){var s,h,v,y=i.props,p=u.props,d=u.type,k=0;if(\"svg\"===d&&(o=!0),null!=r)for(;k<r.length;k++)if((s=r[k])&&\"setAttribute\"in s==!!d&&(d?s.localName===d:3===s.nodeType)){l=s,r[k]=null;break}if(null==l){if(null===d)return document.createTextNode(p);l=o?document.createElementNS(\"http://www.w3.org/2000/svg\",d):document.createElement(d,p.is&&p),r=null,c=!1}if(null===d)y===p||c&&l.data===p||(l.data=p);else{if(r=r&&n.call(l.childNodes),h=(y=i.props||f).dangerouslySetInnerHTML,v=p.dangerouslySetInnerHTML,!c){if(null!=r)for(y={},k=0;k<l.attributes.length;k++)y[l.attributes[k].name]=l.attributes[k].value;(v||h)&&(v&&(h&&v.__html==h.__html||v.__html===l.innerHTML)||(l.innerHTML=v&&v.__html||\"\"))}if(C(l,p,y,o,c),v)u.__k=[];else if(k=u.props.children,w(l,Array.isArray(k)?k:[k],u,i,t,o&&\"foreignObject\"!==d,r,e,r?r[0]:i.__k&&_(i,0),c),null!=r)for(k=r.length;k--;)null!=r[k]&&a(r[k]);c||(\"value\"in p&&void 0!==(k=p.value)&&(k!==l.value||\"progress\"===d&&!k||\"option\"===d&&k!==y.value)&&H(l,\"value\",k,y.value,!1),\"checked\"in p&&void 0!==(k=p.checked)&&k!==l.checked&&H(l,\"checked\",k,y.checked,!1))}return l}function M(n,u,i){try{\"function\"==typeof n?n(u):n.current=u}catch(n){l.__e(n,i)}}function N(n,u,i){var t,o;if(l.unmount&&l.unmount(n),(t=n.ref)&&(t.current&&t.current!==n.__e||M(t,null,u)),null!=(t=n.__c)){if(t.componentWillUnmount)try{t.componentWillUnmount()}catch(n){l.__e(n,u)}t.base=t.__P=null}if(t=n.__k)for(o=0;o<t.length;o++)t[o]&&N(t[o],u,\"function\"!=typeof n.type);i||null==n.__e||a(n.__e),n.__e=n.__d=void 0}function O(n,l,u){return this.constructor(n,u)}function P(u,i,t){var o,r,e;l.__&&l.__(u,i),r=(o=\"function\"==typeof t)?null:t&&t.__k||i.__k,e=[],j(i,u=(!o&&t||i).__k=h(p,null,[u]),r||f,f,void 0!==i.ownerSVGElement,!o&&t?[t]:r?null:i.firstChild?n.call(i.childNodes):null,e,!o&&t?t:r?r.__e:i.firstChild,o),z(e,u)}function S(n,l){P(n,l,S)}function q(l,u,i){var t,o,r,f=s({},l.props);for(r in u)\"key\"==r?t=u[r]:\"ref\"==r?o=u[r]:f[r]=u[r];return arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):i),v(l.type,f,t||l.key,o||l.ref,null)}function B(n,l){var u={__c:l=\"__cC\"+r++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var u,i;return this.getChildContext||(u=[],(i={})[l]=this,this.getChildContext=function(){return i},this.shouldComponentUpdate=function(n){this.props.value!==n.value&&u.some(b)},this.sub=function(n){u.push(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u.splice(u.indexOf(n),1),l&&l.call(n)}}),n.children}};return u.Provider.__=u.Consumer.contextType=u}n=e.slice,l={__e:function(n,l,u,i){for(var t,o,r;l=l.__;)if((t=l.__c)&&!t.__)try{if((o=t.constructor)&&null!=o.getDerivedStateFromError&&(t.setState(o.getDerivedStateFromError(n)),r=t.__d),null!=t.componentDidCatch&&(t.componentDidCatch(n,i||{}),r=t.__d),r)return t.__E=t}catch(l){n=l}throw n}},u=0,i=function(n){return null!=n&&void 0===n.constructor},d.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=s({},this.state),\"function\"==typeof n&&(n=n(s({},u),this.props)),n&&s(u,n),null!=n&&this.__v&&(l&&this.__h.push(l),b(this))},d.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),b(this))},d.prototype.render=p,t=[],g.__r=0,r=0;export{P as render,S as hydrate,h as createElement,h,p as Fragment,y as createRef,i as isValidElement,d as Component,q as cloneElement,B as createContext,x as toChildArray,l as options};\n//# sourceMappingURL=preact.module.js.map\n","export type ID = string;\n\nexport function generateUUID(): ID {\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n    const r = (Math.random() * 16) | 0,\n      v = c == 'x' ? r : (r & 0x3) | 0x8;\n    return v.toString(16);\n  });\n}\n","import { generateUUID, ID } from './util/id';\n\nclass Base {\n  private readonly _id: ID;\n\n  constructor(id?: ID) {\n    this._id = id || generateUUID();\n  }\n\n  get id(): ID {\n    return this._id;\n  }\n}\n\nexport default Base;\n","export default {\n  search: {\n    placeholder: 'Type a keyword...',\n  },\n  sort: {\n    sortAsc: 'Sort column ascending',\n    sortDesc: 'Sort column descending',\n  },\n  pagination: {\n    previous: 'Previous',\n    next: 'Next',\n    navigate: (page, pages) => `Page ${page} of ${pages}`,\n    page: (page) => `Page ${page}`,\n    showing: 'Showing',\n    of: 'of',\n    to: 'to',\n    results: 'results',\n  },\n  loading: 'Loading...',\n  noRecordsFound: 'No matching records found',\n  error: 'An error happened while fetching the data',\n};\n","// The order of enum items define the processing order of the processor type\n// e.g. Extractor = 0 will be processed before Transformer = 1\nimport { generateUUID, ID } from '../util/id';\nimport { EventEmitter } from '../util/eventEmitter';\n\nexport enum ProcessorType {\n  Initiator,\n  ServerFilter,\n  ServerSort,\n  ServerLimit,\n  Extractor,\n  Transformer,\n  Filter,\n  Sort,\n  Limit,\n}\n\ninterface PipelineProcessorEvents<T, P> {\n  propsUpdated: (processor: PipelineProcessor<T, P>) => void;\n  beforeProcess: (...args) => void;\n  afterProcess: (...args) => void;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface PipelineProcessorProps {}\n\nexport abstract class PipelineProcessor<\n  T,\n  P extends Partial<PipelineProcessorProps>,\n> extends EventEmitter<PipelineProcessorEvents<T, P>> {\n  public readonly id: ID;\n  private readonly _props: P;\n\n  abstract get type(): ProcessorType;\n  protected abstract _process(...args): T | Promise<T>;\n  protected validateProps?(...args): void;\n\n  constructor(props?: Partial<P>) {\n    super();\n\n    this._props = {} as P;\n    this.id = generateUUID();\n\n    if (props) this.setProps(props);\n  }\n\n  /**\n   * process is used to call beforeProcess and afterProcess callbacks\n   * This function is just a wrapper that calls _process()\n   *\n   * @param args\n   */\n  process(...args): T | Promise<T> {\n    if (this.validateProps instanceof Function) {\n      this.validateProps(...args);\n    }\n\n    this.emit('beforeProcess', ...args);\n    const result = this._process(...args);\n    this.emit('afterProcess', ...args);\n    return result;\n  }\n\n  setProps(props: Partial<P>): this {\n    Object.assign(this._props, props);\n    this.emit('propsUpdated', this);\n    return this;\n  }\n\n  get props(): P {\n    return this._props;\n  }\n}\n","import enUS from './en_US';\ntype MessageFormat = (...args) => string;\ntype Message = string | MessageFormat;\nexport type Language = { [key: string]: Message | Language };\n\nexport class Translator {\n  private readonly _language: Language;\n  private readonly _defaultLanguage: Language;\n\n  constructor(language?: Language) {\n    this._language = language;\n    this._defaultLanguage = enUS;\n  }\n\n  /**\n   * Tries to split the message with \".\" and find\n   * the key in the given language\n   *\n   * @param message\n   * @param lang\n   */\n  getString(message: string, lang: Language): MessageFormat {\n    if (!lang || !message) return null;\n\n    const splitted = message.split('.');\n    const key = splitted[0];\n\n    if (lang[key]) {\n      const val = lang[key];\n\n      if (typeof val === 'string') {\n        return (): string => val;\n      } else if (typeof val === 'function') {\n        return val;\n      } else {\n        return this.getString(splitted.slice(1).join('.'), val);\n      }\n    }\n\n    return null;\n  }\n\n  translate(message: string, ...args): string {\n    const translated = this.getString(message, this._language);\n    let messageFormat;\n\n    if (translated) {\n      messageFormat = translated;\n    } else {\n      messageFormat = this.getString(message, this._defaultLanguage);\n    }\n\n    if (messageFormat) {\n      return messageFormat(...args);\n    }\n\n    return message;\n  }\n}\n\nexport function useTranslator(translator: Translator) {\n  return function (message: string, ...args): string {\n    return translator.translate(message, ...args);\n  };\n}\n","import { Component } from 'preact';\nimport { Config } from '../config';\nimport getConfig from '../util/getConfig';\nimport { useTranslator } from '../i18n/language';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface BaseProps {}\n\nexport abstract class BaseComponent<\n  P extends BaseProps = unknown,\n  S = unknown,\n> extends Component<P, S> {\n  protected config: Config;\n  protected _: (message: string, ...args) => string;\n\n  constructor(props: P, context: any) {\n    super(props, context);\n    this.config = getConfig(context);\n\n    if (this.config) {\n      this._ = useTranslator(this.config.translator);\n    }\n  }\n}\n\nexport interface BaseComponent<P> {\n  new (props: P, context?: any): Component<P>;\n}\n","import { Context } from 'preact';\nimport { Config } from '../config';\n\n/**\n * This is a hack to get the current global config from Preact context.\n * My assumption is that we only need one global context which is the ConfigContext\n *\n * @param context\n */\nexport default function getConfig(context: {\n  [key: string]: Context<any>;\n}): Config {\n  if (!context) return null;\n\n  const keys = Object.keys(context);\n\n  if (keys.length) {\n    // TODO: can we use a better way to capture and return the Config context?\n    const ctx: any = context[keys[0]];\n    return ctx.props.value;\n  }\n\n  return null;\n}\n","import { h } from 'preact';\n\nimport { BaseComponent, BaseProps } from './base';\n\nexport interface HTMLContentProps extends BaseProps {\n  content: string;\n  parentElement?: string;\n}\n\nexport class HTMLElement extends BaseComponent<HTMLContentProps> {\n  static defaultProps = {\n    parentElement: 'span',\n  };\n\n  render() {\n    return h(this.props.parentElement, {\n      dangerouslySetInnerHTML: { __html: this.props.content },\n    });\n  }\n}\n","import { h, VNode } from 'preact';\nimport { HTMLElement } from '../view/htmlElement';\n\nexport function decode(content: string): string {\n  const value = new DOMParser().parseFromString(content, 'text/html');\n  return value.documentElement.textContent;\n}\n\nexport function html(content: string, parentElement?: string): VNode {\n  return h(HTMLElement, { content: content, parentElement: parentElement });\n}\n","import Base from './base';\nimport { TCell } from './types';\nimport { html } from './util/html';\nimport { ComponentChild } from 'preact';\n\nclass Cell extends Base {\n  // because a Cell is a subset of TCell type\n  public data: number | string | boolean | ComponentChild;\n\n  constructor(data: TCell) {\n    super();\n\n    this.update(data);\n  }\n\n  private cast(data: TCell): number | string | boolean | ComponentChild {\n    if (data instanceof HTMLElement) {\n      return html(data.outerHTML);\n    }\n\n    return data;\n  }\n\n  /**\n   * Updates the Cell's data\n   *\n   * @param data\n   */\n  public update(data: TCell): Cell {\n    this.data = this.cast(data);\n    return this;\n  }\n}\n\nexport default Cell;\n","import Cell from './cell';\nimport Base from './base';\nimport { TCell } from './types';\n\nclass Row extends Base {\n  private _cells: Cell[];\n\n  constructor(cells?: Cell[]) {\n    super();\n\n    this.cells = cells || [];\n  }\n\n  public cell(index: number): Cell {\n    return this._cells[index];\n  }\n\n  public get cells(): Cell[] {\n    return this._cells;\n  }\n\n  public set cells(cells: Cell[]) {\n    this._cells = cells;\n  }\n\n  public toArray(): TCell[] {\n    return this.cells.map((cell) => cell.data);\n  }\n\n  /**\n   * Creates a new Row from an array of Cell(s)\n   * This method generates a new ID for the Row and all nested elements\n   *\n   * @param cells\n   * @returns Row\n   */\n  static fromCells(cells: Cell[]): Row {\n    return new Row(cells.map((cell) => new Cell(cell.data)));\n  }\n\n  get length(): number {\n    return this.cells.length;\n  }\n}\n\nexport default Row;\n","import Base from './base';\nimport Row from './row';\nimport Cell from './cell';\nimport { OneDArray, TCell, TwoDArray } from './types';\nimport { oneDtoTwoD } from './util/array';\n\nclass Tabular extends Base {\n  private _rows: Row[];\n  private _length: number;\n\n  constructor(rows?: Row[] | Row) {\n    super();\n\n    if (rows instanceof Array) {\n      this.rows = rows;\n    } else if (rows instanceof Row) {\n      this.rows = [rows];\n    } else {\n      this.rows = [];\n    }\n  }\n\n  get rows(): Row[] {\n    return this._rows;\n  }\n\n  set rows(rows: Row[]) {\n    this._rows = rows;\n  }\n\n  get length(): number {\n    return this._length || this.rows.length;\n  }\n\n  // we want to sent the length when storage is ServerStorage\n  set length(len: number) {\n    this._length = len;\n  }\n\n  public toArray(): TCell[][] {\n    return this.rows.map((row) => row.toArray());\n  }\n\n  /**\n   * Creates a new Tabular from an array of Row(s)\n   * This method generates a new ID for the Tabular and all nested elements\n   *\n   * @param rows\n   * @returns Tabular\n   */\n  static fromRows(rows: Row[]): Tabular {\n    return new Tabular(rows.map((row) => Row.fromCells(row.cells)));\n  }\n\n  /**\n   * Creates a new Tabular from a 2D array\n   * This method generates a new ID for the Tabular and all nested elements\n   *\n   * @param data\n   * @returns Tabular\n   */\n  static fromArray<T extends TCell>(\n    data: OneDArray<T> | TwoDArray<T>,\n  ): Tabular {\n    data = oneDtoTwoD(data);\n\n    return new Tabular(\n      data.map((row) => new Row(row.map((cell) => new Cell(cell)))),\n    );\n  }\n}\n\nexport default Tabular;\n","import { OneDArray, TwoDArray } from '../types';\n\nexport function oneDtoTwoD<T>(data: OneDArray<T> | TwoDArray<T>): TwoDArray<T> {\n  if (data[0] && !(data[0] instanceof Array)) {\n    return [data] as TwoDArray<T>;\n  }\n\n  return data as TwoDArray<T>;\n}\n\nexport function flatten<T>(arrays: TwoDArray<T>): OneDArray<T> {\n  return arrays.reduce((prev, x) => prev.concat(x), []);\n}\n","type EventArgs<T> = [T] extends [(...args: infer U) => any]\n  ? U\n  : [T] extends [void]\n  ? []\n  : [T];\n\n/**\n * Example:\n *\n * export interface BaseEvents<P, S> {\n *   SET_STATE: (component: BaseComponent<P, S>, state: S) => void;\n * }\n */\n\nexport interface EventEmitter<EventTypes> {\n  addListener<EventName extends keyof EventTypes>(\n    event: EventName,\n    listener: (...args: EventArgs<EventTypes[EventName]>) => void,\n  ): EventEmitter<EventTypes>;\n\n  on<EventName extends keyof EventTypes>(\n    event: EventName,\n    listener: (...args: EventArgs<EventTypes[EventName]>) => void,\n  ): EventEmitter<EventTypes>;\n\n  off<EventName extends keyof EventTypes>(\n    event: EventName,\n    listener: (...args: EventArgs<EventTypes[EventName]>) => void,\n  ): EventEmitter<EventTypes>;\n\n  emit<EventName extends keyof EventTypes>(\n    event: EventName,\n    ...args: EventArgs<EventTypes[EventName]>\n  ): boolean;\n}\n\nexport class EventEmitter<EventTypes> {\n  private callbacks: { [event: string]: ((...args) => void)[] };\n\n  // because we are using EventEmitter as a mixin and the\n  // constructor won't be called by the applyMixins function\n  // see src/base.ts and src/util/applyMixin.ts\n  private init(event?: string): void {\n    if (!this.callbacks) {\n      this.callbacks = {};\n    }\n\n    if (event && !this.callbacks[event]) {\n      this.callbacks[event] = [];\n    }\n  }\n\n  on<EventName extends keyof EventTypes>(\n    event: EventName,\n    listener: (...args: EventArgs<EventTypes[EventName]>) => void,\n  ): EventEmitter<EventTypes> {\n    this.init(event as string);\n    this.callbacks[event as string].push(listener);\n    return this;\n  }\n\n  off<EventName extends keyof EventTypes>(\n    event: EventName,\n    listener: (...args: EventArgs<EventTypes[EventName]>) => void,\n  ): EventEmitter<EventTypes> {\n    const eventName = event as string;\n\n    this.init();\n\n    if (!this.callbacks[eventName] || this.callbacks[eventName].length === 0) {\n      // there is no callbacks with this key\n      return this;\n    }\n\n    this.callbacks[eventName] = this.callbacks[eventName].filter(\n      (value) => value != listener,\n    );\n\n    return this;\n  }\n\n  emit<EventName extends keyof EventTypes>(\n    event: EventName,\n    ...args: EventArgs<EventTypes[EventName]>\n  ): boolean {\n    const eventName = event as string;\n\n    this.init(eventName);\n\n    if (this.callbacks[eventName].length > 0) {\n      this.callbacks[eventName].forEach((value) => value(...args));\n      return true;\n    }\n\n    return false;\n  }\n}\n","import search from '../../operator/search';\nimport Tabular from '../../tabular';\nimport {\n  PipelineProcessor,\n  PipelineProcessorProps,\n  ProcessorType,\n} from '../processor';\nimport { OneDArray, TCell, TColumn } from '../../types';\n\ninterface GlobalSearchFilterProps extends PipelineProcessorProps {\n  keyword: string;\n  columns: OneDArray<TColumn>;\n  ignoreHiddenColumns: boolean;\n  selector?: (cell: TCell, rowIndex: number, cellIndex: number) => string;\n}\n\nclass GlobalSearchFilter extends PipelineProcessor<\n  Tabular,\n  GlobalSearchFilterProps\n> {\n  get type(): ProcessorType {\n    return ProcessorType.Filter;\n  }\n\n  _process(data: Tabular): Tabular {\n    if (this.props.keyword) {\n      return search(\n        String(this.props.keyword).trim(),\n        this.props.columns,\n        this.props.ignoreHiddenColumns,\n        data,\n        this.props.selector,\n      );\n    }\n\n    return data;\n  }\n}\n\nexport default GlobalSearchFilter;\n","import Tabular from '../tabular';\nimport { VNode } from 'preact';\nimport { HTMLContentProps } from '../view/htmlElement';\nimport { OneDArray, TCell, TColumn } from '../types';\n\nexport default function (\n  keyword: string,\n  columns: OneDArray<TColumn>,\n  ignoreHiddenColumns: boolean,\n  tabular: Tabular,\n  selector?: (cell: TCell, rowIndex: number, cellIndex: number) => string,\n): Tabular {\n  // escape special regex chars\n  keyword = keyword.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n\n  return new Tabular(\n    tabular.rows.filter((row, rowIndex) =>\n      row.cells.some((cell, cellIndex) => {\n        if (!cell) {\n          return false;\n        }\n\n        if (ignoreHiddenColumns) {\n          if (\n            columns &&\n            columns[cellIndex] &&\n            typeof columns[cellIndex] === 'object'\n          ) {\n            const typedColumn = columns[cellIndex] as TColumn;\n            if (typedColumn.hidden) {\n              return false;\n            }\n          }\n        }\n\n        let data = '';\n\n        if (typeof selector === 'function') {\n          data = selector(cell.data, rowIndex, cellIndex);\n        } else if (typeof cell.data === 'object') {\n          // HTMLContent element\n          const element = cell.data as VNode<HTMLContentProps>;\n          if (element && element.props && element.props.content) {\n            // TODO: we should only search in the content of the element. props.content is the entire HTML element\n            data = element.props.content;\n          }\n        } else {\n          // primitive types\n          data = String(cell.data);\n        }\n\n        return new RegExp(keyword, 'gi').test(data);\n      }),\n    ),\n  );\n}\n","export function className(...args: string[]): string {\n  const prefix = 'gridjs';\n\n  return `${prefix}${args.reduce(\n    (prev: string, cur: string) => `${prev}-${cur}`,\n    '',\n  )}`;\n}\n\nexport function classJoin(...classNames: string[]): string {\n  return (\n    classNames\n      .filter((x) => x)\n      .reduce((className, prev) => `${className || ''} ${prev}`, '')\n      .trim() || null\n  );\n}\n","import { EventEmitter } from '../../util/eventEmitter';\nimport Dispatcher from '../../util/dispatcher';\n\ninterface BaseStoreEvents<STATE> {\n  updated: (newState: STATE, prevState?: STATE) => void;\n}\n\nexport default abstract class BaseStore<STATE, ACTIONS> extends EventEmitter<\n  BaseStoreEvents<STATE>\n> {\n  private _state: STATE;\n  protected readonly dispatcher: Dispatcher<any>;\n\n  constructor(dispatcher: Dispatcher<any>) {\n    super();\n    this.dispatcher = dispatcher;\n    this._state = this.getInitialState();\n    dispatcher.register(this._handle.bind(this));\n  }\n\n  abstract handle<K extends keyof ACTIONS>(type: K, payload: ACTIONS[K]): void;\n  abstract getInitialState(): STATE;\n\n  private _handle(action): void {\n    this.handle(action.type, action.payload);\n  }\n\n  setState(newState: STATE): void {\n    const prevState = this._state;\n    this._state = newState;\n    this.emit('updated', newState, prevState);\n  }\n\n  get state(): STATE {\n    return this._state;\n  }\n}\n","import BaseStore from '../../base/store';\nimport { SearchActionsType } from './actions';\n\nexport type SearchStoreState = { keyword: string | null };\n\nexport class SearchStore extends BaseStore<\n  SearchStoreState,\n  SearchActionsType\n> {\n  getInitialState(): SearchStoreState {\n    return { keyword: null };\n  }\n\n  handle(type, payload): void {\n    if (type === 'SEARCH_KEYWORD') {\n      const { keyword } = payload;\n      this.search(keyword);\n    }\n  }\n\n  private search(keyword: string): void {\n    this.setState({ keyword: keyword });\n  }\n}\n","import Dispatcher from '../../util/dispatcher';\n\nexport abstract class BaseActions<ACTIONS> {\n  private readonly dispatcher: Dispatcher<any>;\n\n  constructor(dispatcher: Dispatcher<any>) {\n    this.dispatcher = dispatcher;\n  }\n\n  protected dispatch<K extends keyof ACTIONS>(\n    type: K,\n    payload: ACTIONS[K],\n  ): void {\n    this.dispatcher.dispatch({\n      type: type,\n      payload: payload,\n    });\n  }\n}\n","import { BaseActions } from '../../base/actions';\n\nexport interface SearchActionsType {\n  SEARCH_KEYWORD: {\n    keyword: string;\n  };\n}\n\nexport class SearchActions extends BaseActions<SearchActionsType> {\n  search(keyword: string): void {\n    this.dispatch('SEARCH_KEYWORD', {\n      keyword: keyword,\n    });\n  }\n}\n","import {\n  PipelineProcessor,\n  PipelineProcessorProps,\n  ProcessorType,\n} from '../processor';\nimport { ServerStorageOptions } from '../../storage/server';\n\ninterface ServerGlobalSearchFilterProps extends PipelineProcessorProps {\n  keyword?: string;\n  url?: (prevUrl: string, keyword: string) => string;\n  body?: (prevBody: BodyInit, keyword: string) => BodyInit;\n}\n\nclass ServerGlobalSearchFilter extends PipelineProcessor<\n  ServerStorageOptions,\n  ServerGlobalSearchFilterProps\n> {\n  get type(): ProcessorType {\n    return ProcessorType.ServerFilter;\n  }\n\n  _process(options?: ServerStorageOptions): ServerStorageOptions {\n    if (!this.props.keyword) return options;\n\n    const updates = {};\n\n    if (this.props.url) {\n      updates['url'] = this.props.url(options.url, this.props.keyword);\n    }\n\n    if (this.props.body) {\n      updates['body'] = this.props.body(options.body, this.props.keyword);\n    }\n\n    return {\n      ...options,\n      ...updates,\n    };\n  }\n}\n\nexport default ServerGlobalSearchFilter;\n","/**\n * Centralized logging lib\n *\n * This class needs some improvements but so far it has been used to have a coherent way to log\n */\nclass Logger {\n  private format(message: string, type: string): string {\n    return `[Grid.js] [${type.toUpperCase()}]: ${message}`;\n  }\n\n  error(message: string, throwException = false): void {\n    const msg = this.format(message, 'error');\n\n    if (throwException) {\n      throw Error(msg);\n    } else {\n      console.error(msg);\n    }\n  }\n\n  warn(message: string): void {\n    console.warn(this.format(message, 'warn'));\n  }\n\n  info(message: string): void {\n    console.info(this.format(message, 'info'));\n  }\n}\n\nexport default new Logger();\n","import { BaseComponent, BaseProps } from './view/base';\nimport { Component, ComponentProps, Fragment, h } from 'preact';\nimport log from './util/log';\n\n/**\n * BaseProps for all plugins\n */\nexport interface PluginBaseProps<T extends PluginBaseComponentCtor> {\n  plugin: Plugin<T>;\n}\n\n/**\n * BaseComponent for all plugins\n */\nexport abstract class PluginBaseComponent<\n  P extends PluginBaseProps<any> = any,\n  S = unknown,\n> extends BaseComponent<P, S> {}\n\nexport interface PluginBaseComponentCtor<\n  P extends PluginBaseProps<any> = any,\n  S = unknown,\n> {\n  new (props: P, context?: any): Component<P, S>;\n}\n\nexport enum PluginPosition {\n  Header,\n  Footer,\n  Cell,\n}\n\nexport interface Plugin<T extends PluginBaseComponentCtor> {\n  id: string;\n  position: PluginPosition;\n  component: T;\n  props?: Partial<ComponentProps<T>>;\n  order?: number;\n}\n\nexport class PluginManager {\n  private readonly plugins: Plugin<any>[];\n\n  constructor() {\n    this.plugins = [];\n  }\n\n  get<T extends PluginBaseComponentCtor>(id: string): Plugin<T> | null {\n    const plugins = this.plugins.filter((p) => p.id === id);\n\n    if (plugins.length > 0) {\n      return plugins[0];\n    }\n\n    return null;\n  }\n\n  add<T extends PluginBaseComponentCtor>(plugin: Plugin<T>): this {\n    if (!plugin.id) {\n      log.error('Plugin ID cannot be empty');\n      return this;\n    }\n\n    if (this.get(plugin.id) !== null) {\n      log.error(`Duplicate plugin ID: ${plugin.id}`);\n      return this;\n    }\n\n    this.plugins.push(plugin);\n    return this;\n  }\n\n  remove(id: string): this {\n    this.plugins.splice(this.plugins.indexOf(this.get(id)), 1);\n    return this;\n  }\n\n  list<T extends PluginBaseComponentCtor>(\n    position?: PluginPosition,\n  ): Plugin<T>[] {\n    let plugins: Plugin<T>[];\n\n    if (position != null || position != undefined) {\n      plugins = this.plugins.filter((p) => p.position === position);\n    } else {\n      plugins = this.plugins;\n    }\n\n    return plugins.sort((a, b) => a.order - b.order);\n  }\n}\n\nexport interface PluginRendererProps extends BaseProps {\n  props?: any;\n  // to render a single plugin\n  pluginId?: string;\n  // to render all plugins in this PluginPosition\n  position?: PluginPosition;\n}\n\nexport class PluginRenderer extends BaseComponent<PluginRendererProps> {\n  render() {\n    if (this.props.pluginId) {\n      // render a single plugin\n      const plugin = this.config.plugin.get(this.props.pluginId);\n\n      if (!plugin) return null;\n\n      return h(\n        Fragment,\n        {},\n        h(plugin.component, {\n          plugin: plugin,\n          ...plugin.props,\n          ...this.props.props,\n        }),\n      );\n    } else if (this.props.position !== undefined) {\n      // render using a specific plugin position\n      return h(\n        Fragment,\n        {},\n        this.config.plugin\n          .list(this.props.position)\n          .map((p) =>\n            h(p.component, { plugin: p, ...p.props, ...this.props.props }),\n          ),\n      );\n    }\n\n    return null;\n  }\n}\n","import { ComponentChild } from 'preact';\nimport Row from './row';\nimport { SortConfig } from './view/plugin/sort/sort';\nimport { JSXInternal } from 'preact/src/jsx';\nimport { Plugin } from './plugin';\n\nexport type ProtoExtends<T, U> = U & Omit<T, keyof U>;\n\nexport type OneDArray<T> = T[];\nexport type TwoDArray<T> = T[][];\n\n/**\n * Table cell types\n */\nexport type TCell = number | string | boolean | ComponentChild | HTMLElement;\n// Array of Arrays\nexport type TDataArrayRow = OneDArray<TCell>;\nexport type TDataArray = OneDArray<TDataArrayRow>;\n// Array of Objects\nexport type TDataObjectRow = { [key: string]: TCell };\nexport type TDataObject = OneDArray<TDataObjectRow>;\n// (Array of Arrays) and (Array of Objects)\nexport type TData = TDataArray | TDataObject;\n\n// Table header cell type\nexport interface TColumn {\n  id?: string;\n  // default data for all columns\n  data?: ((row: TDataArrayRow | TDataObjectRow) => TCell) | TCell;\n  // column label\n  name?: string | ComponentChild;\n  plugin?: Plugin<any>;\n  // column width\n  width?: string;\n  minWidth?: string;\n  sort?: SortConfig;\n  columns?: OneDArray<TColumn>;\n  fixedHeader?: boolean;\n  resizable?: boolean;\n  hidden?: boolean;\n  formatter?: (cell: TCell, row: Row, column: TColumn) => ComponentChild;\n  // HTML attributes to be added to all cells and header of this column\n  attributes?:\n    | ((\n        // this is null when `attributes` is called for a th\n        cell: TCell | null,\n        row: Row | null,\n        column: TColumn,\n      ) => JSXInternal.HTMLAttributes<HTMLTableCellElement>)\n    | JSXInternal.HTMLAttributes<HTMLTableCellElement>;\n}\n\n// Comparator function for the sorting plugin\nexport type Comparator<T> = (a: T, b: T) => number;\n\nexport interface TColumnSort {\n  index: number;\n  // 1 ascending, -1 descending\n  direction?: 1 | -1;\n}\n\n// container status\nexport enum Status {\n  Init,\n  Loading,\n  Loaded,\n  Rendered,\n  Error,\n}\n\nexport type CSSDeclaration = {\n  [key: string]: string | number;\n};\n","import { h } from 'preact';\nimport GlobalSearchFilter from '../../../pipeline/filter/globalSearch';\nimport { classJoin, className } from '../../../util/className';\nimport { SearchStore, SearchStoreState } from './store';\nimport { SearchActions } from './actions';\nimport ServerGlobalSearchFilter from '../../../pipeline/filter/serverGlobalSearch';\nimport { debounce } from '../../../util/debounce';\nimport { TCell } from '../../../types';\nimport { PluginBaseComponent, PluginBaseProps } from '../../../plugin';\n\nexport interface SearchConfig {\n  keyword?: string;\n  enabled?: boolean;\n  ignoreHiddenColumns?: boolean;\n  debounceTimeout?: number;\n  selector?: (cell: TCell, rowIndex: number, cellIndex: number) => string;\n  server?: {\n    url?: (prevUrl: string, keyword: string) => string;\n    body?: (prevBody: BodyInit, keyword: string) => BodyInit;\n  };\n}\n\nexport class Search extends PluginBaseComponent<\n  SearchConfig & PluginBaseProps<Search>\n> {\n  private readonly searchProcessor:\n    | GlobalSearchFilter\n    | ServerGlobalSearchFilter;\n  private readonly actions: SearchActions;\n  private readonly store: SearchStore;\n  private readonly storeUpdatedFn: (...args) => void;\n\n  static defaultProps = {\n    debounceTimeout: 250,\n  };\n\n  constructor(props, context) {\n    super(props, context);\n\n    this.actions = new SearchActions(this.config.dispatcher);\n    this.store = new SearchStore(this.config.dispatcher);\n    const { enabled, keyword } = props;\n\n    if (enabled) {\n      // initial search\n      if (keyword) this.actions.search(keyword);\n\n      this.storeUpdatedFn = this.storeUpdated.bind(this);\n      this.store.on('updated', this.storeUpdatedFn);\n\n      let searchProcessor;\n      if (props.server) {\n        searchProcessor = new ServerGlobalSearchFilter({\n          keyword: props.keyword,\n          url: props.server.url,\n          body: props.server.body,\n        });\n      } else {\n        searchProcessor = new GlobalSearchFilter({\n          keyword: props.keyword,\n          columns: this.config.header && this.config.header.columns,\n          ignoreHiddenColumns:\n            props.ignoreHiddenColumns ||\n            props.ignoreHiddenColumns === undefined,\n          selector: props.selector,\n        });\n      }\n\n      this.searchProcessor = searchProcessor;\n\n      // adds a new processor to the pipeline\n      this.config.pipeline.register(searchProcessor);\n    }\n  }\n\n  componentWillUnmount(): void {\n    this.config.pipeline.unregister(this.searchProcessor);\n    this.store.off('updated', this.storeUpdatedFn);\n  }\n\n  private storeUpdated(state: SearchStoreState): void {\n    // updates the processor state\n    this.searchProcessor.setProps({\n      keyword: state.keyword,\n    });\n  }\n\n  private onChange(event): void {\n    const keyword = event.target.value;\n    this.actions.search(keyword);\n  }\n\n  render() {\n    if (!this.props.enabled) return null;\n\n    let onInput = this.onChange.bind(this);\n\n    // add debounce to input only if it's a server-side search\n    if (this.searchProcessor instanceof ServerGlobalSearchFilter) {\n      onInput = debounce(onInput, this.props.debounceTimeout);\n    }\n\n    return (\n      <div\n        className={className(classJoin('search', this.config.className.search))}\n      >\n        <input\n          type=\"search\"\n          placeholder={this._('search.placeholder')}\n          aria-label={this._('search.placeholder')}\n          onInput={onInput}\n          className={classJoin(\n            className('input'),\n            className('search', 'input'),\n          )}\n          value={this.store.state.keyword}\n        />\n      </div>\n    );\n  }\n}\n","export const debounce = <F extends (...args: any[]) => any>(\n  func: F,\n  waitFor: number,\n) => {\n  let timeout;\n\n  return (...args: Parameters<F>): Promise<ReturnType<F>> =>\n    new Promise((resolve) => {\n      if (timeout) {\n        clearTimeout(timeout);\n      }\n\n      timeout = setTimeout(() => resolve(func(...args)), waitFor);\n    });\n};\n","import Tabular from '../../tabular';\nimport {\n  PipelineProcessor,\n  PipelineProcessorProps,\n  ProcessorType,\n} from '../processor';\n\ninterface PaginationLimitProps extends PipelineProcessorProps {\n  page: number;\n  limit: number;\n}\n\nclass PaginationLimit extends PipelineProcessor<Tabular, PaginationLimitProps> {\n  protected validateProps(): void {\n    if (isNaN(Number(this.props.limit)) || isNaN(Number(this.props.page))) {\n      throw Error('Invalid parameters passed');\n    }\n  }\n\n  get type(): ProcessorType {\n    return ProcessorType.Limit;\n  }\n\n  protected _process(data: Tabular): Tabular {\n    const page = this.props.page;\n    const start = page * this.props.limit;\n    const end = (page + 1) * this.props.limit;\n\n    return new Tabular(data.rows.slice(start, end));\n  }\n}\n\nexport default PaginationLimit;\n","import {\n  PipelineProcessor,\n  PipelineProcessorProps,\n  ProcessorType,\n} from '../processor';\nimport { ServerStorageOptions } from '../../storage/server';\n\ninterface ServerPaginationLimitProps extends PipelineProcessorProps {\n  page: number;\n  limit: number;\n  url?: (prevUrl: string, page: number, limit: number) => string;\n  body?: (prevBody: BodyInit, page: number, limit: number) => BodyInit;\n}\n\nclass ServerPaginationLimit extends PipelineProcessor<\n  ServerStorageOptions,\n  ServerPaginationLimitProps\n> {\n  get type(): ProcessorType {\n    return ProcessorType.ServerLimit;\n  }\n\n  _process(options?: ServerStorageOptions): ServerStorageOptions {\n    const updates = {};\n\n    if (this.props.url) {\n      updates['url'] = this.props.url(\n        options.url,\n        this.props.page,\n        this.props.limit,\n      );\n    }\n\n    if (this.props.body) {\n      updates['body'] = this.props.body(\n        options.body,\n        this.props.page,\n        this.props.limit,\n      );\n    }\n\n    return {\n      ...options,\n      ...updates,\n    };\n  }\n}\n\nexport default ServerPaginationLimit;\n","import { h, Fragment } from 'preact';\nimport PaginationLimit from '../../pipeline/limit/pagination';\nimport { classJoin, className } from '../../util/className';\nimport ServerPaginationLimit from '../../pipeline/limit/serverPagination';\nimport Tabular from '../../tabular';\nimport { PipelineProcessor } from '../../pipeline/processor';\nimport { PluginBaseComponent, PluginBaseProps } from '../../plugin';\n\ninterface PaginationState {\n  page: number;\n  limit?: number;\n  total: number;\n}\n\nexport interface PaginationConfig {\n  enabled: boolean;\n  limit?: number;\n  page?: number;\n  summary?: boolean;\n  nextButton?: boolean;\n  prevButton?: boolean;\n  buttonsCount?: number;\n  resetPageOnUpdate?: boolean;\n  server?: {\n    url?: (prevUrl: string, page: number, limit: number) => string;\n    body?: (prevBody: BodyInit, page: number, limit: number) => BodyInit;\n  };\n}\n\nexport class Pagination extends PluginBaseComponent<\n  PluginBaseProps<Pagination> & PaginationConfig,\n  PaginationState\n> {\n  private processor: PaginationLimit | ServerPaginationLimit;\n  private onUpdateFn: (processor: PipelineProcessor<any, any>) => void;\n  private setTotalFromTabularFn: (tabular: Tabular) => void;\n\n  static defaultProps = {\n    summary: true,\n    nextButton: true,\n    prevButton: true,\n    buttonsCount: 3,\n    limit: 10,\n    resetPageOnUpdate: true,\n  };\n\n  constructor(props, context) {\n    super(props, context);\n\n    this.state = {\n      limit: props.limit,\n      page: props.page || 0,\n      total: 0,\n    };\n  }\n\n  componentWillMount(): void {\n    if (this.props.enabled) {\n      let processor;\n\n      this.setTotalFromTabularFn = this.setTotalFromTabular.bind(this);\n\n      if (this.props.server) {\n        processor = new ServerPaginationLimit({\n          limit: this.state.limit,\n          page: this.state.page,\n          url: this.props.server.url,\n          body: this.props.server.body,\n        });\n\n        this.config.pipeline.on('afterProcess', this.setTotalFromTabularFn);\n      } else {\n        processor = new PaginationLimit({\n          limit: this.state.limit,\n          page: this.state.page,\n        });\n\n        // Pagination (all Limit processors) is the last step in the pipeline\n        // and we assume that at this stage, we have the rows that we care about.\n        // Let's grab the rows before processing Pagination and set total number of rows\n        processor.on('beforeProcess', this.setTotalFromTabularFn);\n      }\n\n      this.processor = processor;\n      this.config.pipeline.register(processor);\n\n      // we need to make sure that the state is set\n      // to the default props when an error happens\n      this.config.pipeline.on('error', () => {\n        this.setState({\n          total: 0,\n          page: 0,\n        });\n      });\n    }\n  }\n\n  private setTotalFromTabular(tabular: Tabular): void {\n    this.setTotal(tabular.length);\n  }\n\n  private onUpdate(processor): void {\n    // this is to ensure that the current page is set to 0\n    // when a processor is updated for some reason\n    if (this.props.resetPageOnUpdate && processor !== this.processor) {\n      this.setPage(0);\n    }\n  }\n\n  componentDidMount(): void {\n    this.onUpdateFn = this.onUpdate.bind(this);\n    this.config.pipeline.on('updated', this.onUpdateFn);\n  }\n\n  componentWillUnmount() {\n    this.config.pipeline.unregister(this.processor);\n    this.config.pipeline.off('updated', this.onUpdateFn);\n  }\n\n  private get pages(): number {\n    return Math.ceil(this.state.total / this.state.limit);\n  }\n\n  private setPage(page: number): void {\n    if (page >= this.pages || page < 0 || page === this.state.page) {\n      return null;\n    }\n\n    this.setState({\n      page: page,\n    });\n\n    this.processor.setProps({\n      page: page,\n    });\n  }\n\n  private setTotal(totalRows: number): void {\n    // to set the correct total number of rows\n    // when running in-memory operations\n    this.setState({\n      total: totalRows,\n    });\n  }\n\n  renderPages() {\n    if (this.props.buttonsCount <= 0) {\n      return null;\n    }\n\n    // how many pagination buttons to render?\n    const maxCount: number = Math.min(this.pages, this.props.buttonsCount);\n\n    let pagePivot = Math.min(this.state.page, Math.floor(maxCount / 2));\n    if (this.state.page + Math.floor(maxCount / 2) >= this.pages) {\n      pagePivot = maxCount - (this.pages - this.state.page);\n    }\n\n    return (\n      <Fragment>\n        {this.pages > maxCount && this.state.page - pagePivot > 0 && (\n          <Fragment>\n            <button\n              tabIndex={0}\n              role=\"button\"\n              onClick={this.setPage.bind(this, 0)}\n              title={this._('pagination.firstPage')}\n              aria-label={this._('pagination.firstPage')}\n              className={this.config.className.paginationButton}\n            >\n              {this._('1')}\n            </button>\n            <button\n              tabIndex={-1}\n              className={classJoin(\n                className('spread'),\n                this.config.className.paginationButton,\n              )}\n            >\n              ...\n            </button>\n          </Fragment>\n        )}\n\n        {Array.from(Array(maxCount).keys())\n          .map((i) => this.state.page + (i - pagePivot))\n          .map((i) => (\n            <button\n              tabIndex={0}\n              role=\"button\"\n              onClick={this.setPage.bind(this, i)}\n              className={classJoin(\n                this.state.page === i\n                  ? classJoin(\n                      className('currentPage'),\n                      this.config.className.paginationButtonCurrent,\n                    )\n                  : null,\n                this.config.className.paginationButton,\n              )}\n              title={this._('pagination.page', i + 1)}\n              aria-label={this._('pagination.page', i + 1)}\n            >\n              {this._(`${i + 1}`)}\n            </button>\n          ))}\n\n        {this.pages > maxCount && this.pages > this.state.page + pagePivot + 1 && (\n          <Fragment>\n            <button\n              tabIndex={-1}\n              className={classJoin(\n                className('spread'),\n                this.config.className.paginationButton,\n              )}\n            >\n              ...\n            </button>\n            <button\n              tabIndex={0}\n              role=\"button\"\n              onClick={this.setPage.bind(this, this.pages - 1)}\n              title={this._('pagination.page', this.pages)}\n              aria-label={this._('pagination.page', this.pages)}\n              className={this.config.className.paginationButton}\n            >\n              {this._(`${this.pages}`)}\n            </button>\n          </Fragment>\n        )}\n      </Fragment>\n    );\n  }\n\n  renderSummary() {\n    return (\n      <Fragment>\n        {this.props.summary && this.state.total > 0 && (\n          <div\n            role=\"status\"\n            aria-live=\"polite\"\n            className={classJoin(\n              className('summary'),\n              this.config.className.paginationSummary,\n            )}\n            title={this._(\n              'pagination.navigate',\n              this.state.page + 1,\n              this.pages,\n            )}\n          >\n            {this._('pagination.showing')}{' '}\n            <b>{this._(`${this.state.page * this.state.limit + 1}`)}</b>{' '}\n            {this._('pagination.to')}{' '}\n            <b>\n              {this._(\n                `${Math.min(\n                  (this.state.page + 1) * this.state.limit,\n                  this.state.total,\n                )}`,\n              )}\n            </b>{' '}\n            {this._('pagination.of')} <b>{this._(`${this.state.total}`)}</b>{' '}\n            {this._('pagination.results')}\n          </div>\n        )}\n      </Fragment>\n    );\n  }\n\n  render() {\n    if (!this.props.enabled) return null;\n\n    return (\n      <div\n        className={classJoin(\n          className('pagination'),\n          this.config.className.pagination,\n        )}\n      >\n        {this.renderSummary()}\n\n        <div className={className('pages')}>\n          {this.props.prevButton && (\n            <button\n              tabIndex={0}\n              role=\"button\"\n              disabled={this.state.page === 0}\n              onClick={this.setPage.bind(this, this.state.page - 1)}\n              title={this._('pagination.previous')}\n              aria-label={this._('pagination.previous')}\n              className={classJoin(\n                this.config.className.paginationButton,\n                this.config.className.paginationButtonPrev,\n              )}\n            >\n              {this._('pagination.previous')}\n            </button>\n          )}\n\n          {this.renderPages()}\n\n          {this.props.nextButton && (\n            <button\n              tabIndex={0}\n              role=\"button\"\n              disabled={this.pages === this.state.page + 1 || this.pages === 0}\n              onClick={this.setPage.bind(this, this.state.page + 1)}\n              title={this._('pagination.next')}\n              aria-label={this._('pagination.next')}\n              className={classJoin(\n                this.config.className.paginationButton,\n                this.config.className.paginationButtonNext,\n              )}\n            >\n              {this._('pagination.next')}\n            </button>\n          )}\n        </div>\n      </div>\n    );\n  }\n}\n","export function width(width: string | number, containerWidth?: number): number {\n  if (typeof width == 'string') {\n    if (width.indexOf('%') > -1) {\n      return (containerWidth / 100) * parseInt(width, 10);\n    } else {\n      return parseInt(width, 10);\n    }\n  }\n\n  return width;\n}\n\nexport function px(width: number): string {\n  if (!width) return '';\n  return `${Math.floor(width)}px`;\n}\n","import { Component, h, RefObject } from 'preact';\nimport { BaseComponent, BaseProps } from '../base';\nimport { className } from '../../util/className';\n\ninterface ShadowTableProps extends BaseProps {\n  tableRef?: RefObject<Component>;\n}\n\n/**\n * ShadowTable renders a hidden table and is used to calculate the column's width\n * when autoWidth option is enabled\n */\nexport class ShadowTable extends BaseComponent<ShadowTableProps> {\n  private tableElement: HTMLTableElement;\n  private tableClassName: string;\n  private tableStyle: string;\n\n  constructor(props, context) {\n    super(props, context);\n\n    const tableRef = this.props.tableRef;\n    this.tableElement = tableRef.current.base.cloneNode(\n      true,\n    ) as HTMLTableElement;\n\n    this.tableElement.style.position = 'absolute';\n    this.tableElement.style.width = '100%';\n    this.tableElement.style.zIndex = '-2147483640';\n    this.tableElement.style.visibility = 'hidden';\n\n    this.tableClassName = this.tableElement.className;\n    this.tableStyle = this.tableElement.style.cssText;\n  }\n\n  public widths(): { [columnId: string]: { minWidth: number; width: number } } {\n    this.tableElement.className = `${this.tableClassName} ${className(\n      'shadowTable',\n    )}`;\n\n    this.tableElement.style.tableLayout = 'auto';\n    this.tableElement.style.width = 'auto';\n    this.tableElement.style.padding = '0';\n    this.tableElement.style.margin = '0';\n    this.tableElement.style.border = 'none';\n    this.tableElement.style.outline = 'none';\n\n    let obj = Array.from(\n      this.base.parentNode.querySelectorAll<HTMLElement>('thead th'),\n    ).reduce((prev, current) => {\n      current.style.width = `${current.clientWidth}px`;\n\n      return {\n        [current.getAttribute('data-column-id')]: {\n          minWidth: current.clientWidth,\n        },\n        ...prev,\n      };\n    }, {});\n\n    this.tableElement.className = this.tableClassName;\n    this.tableElement.style.cssText = this.tableStyle;\n    this.tableElement.style.tableLayout = 'auto';\n\n    obj = Array.from(\n      this.base.parentNode.querySelectorAll<HTMLElement>('thead th'),\n    ).reduce((prev, current) => {\n      prev[current.getAttribute('data-column-id')]['width'] =\n        current.clientWidth;\n\n      return prev;\n    }, obj);\n\n    return obj;\n  }\n\n  render() {\n    if (this.props.tableRef.current) {\n      return (\n        <div\n          ref={(nodeElement) => {\n            nodeElement && nodeElement.appendChild(this.tableElement);\n          }}\n        />\n      );\n    }\n\n    return null;\n  }\n}\n","export function camelCase(str: string): string {\n  if (!str) return '';\n\n  const words = str.split(' ');\n\n  // do not convert strings that are already in camelCase format\n  if (words.length === 1 && /([a-z][A-Z])+/g.test(str)) {\n    return str;\n  }\n\n  return words\n    .map(function (word, index) {\n      // if it is the first word, lowercase all the chars\n      if (index == 0) {\n        return word.toLowerCase();\n      }\n\n      // if it is not the first word only upper case the first char and lowercase the rest\n      return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n    })\n    .join('');\n}\n","import { OneDArray, TColumn, TwoDArray } from './types';\nimport Base from './base';\nimport { Config, UserConfig } from './config';\nimport { px, width } from './util/width';\nimport { ShadowTable } from './view/table/shadow';\nimport {\n  Component,\n  ComponentChild,\n  createRef,\n  h,\n  isValidElement,\n  RefObject,\n  render,\n} from 'preact';\nimport { camelCase } from './util/string';\nimport { flatten } from './util/array';\nimport logger from './util/log';\nimport { PluginPosition } from './plugin';\n\nclass Header extends Base {\n  private _columns: OneDArray<TColumn>;\n\n  constructor() {\n    super();\n\n    this._columns = [];\n  }\n\n  get columns(): OneDArray<TColumn> {\n    return this._columns;\n  }\n\n  set columns(columns) {\n    this._columns = columns;\n  }\n\n  get visibleColumns(): OneDArray<TColumn> {\n    return this._columns.filter((c) => !c.hidden);\n  }\n\n  /**\n   * Tries to automatically adjust the width of columns based on:\n   *    - Header cell content\n   *    - Cell content of the first row\n   *    - Cell content of the last row\n   *\n   * @param config\n   */\n  adjustWidth(config: Config): this {\n    const container: Element = config.container;\n    const tableRef: RefObject<Component> = config.tableRef;\n    const tempRef: RefObject<HTMLDivElement> = config.tempRef;\n    const autoWidth = config.tempRef || true;\n\n    if (!container) {\n      // we can't calculate the width because the container\n      // is unknown at this stage\n      return this;\n    }\n\n    // pixels\n    const containerWidth = container.clientWidth;\n\n    // let's create a shadow table with the first 10 rows of the data\n    // and let the browser to render the table with table-layout: auto\n    // no padding, margin or border to get the minimum space required\n    // to render columns. One the table is rendered and widths are known,\n    // we unmount the shadow table from the DOM and set the correct width\n    const shadowTable = createRef();\n    let widths = {};\n\n    if (tableRef.current && autoWidth) {\n      // render a ShadowTable with the first 10 rows\n      const el = h(ShadowTable, {\n        tableRef: tableRef,\n      });\n      el.ref = shadowTable;\n\n      render(el, tempRef.current);\n\n      widths = shadowTable.current.widths();\n    }\n\n    for (const column of flatten(Header.tabularFormat(this.columns))) {\n      // because we don't want to set the width of parent THs\n      if (column.columns && column.columns.length > 0) {\n        continue;\n      }\n\n      if (!column.width && autoWidth) {\n        // tries to find the corresponding cell\n        // from the ShadowTable and set the correct width\n\n        if (column.id in widths) {\n          // because a column can be hidden, too\n          column.width = px(widths[column.id]['width']);\n          column.minWidth = px(widths[column.id]['minWidth']);\n        }\n      } else {\n        // column width is already defined\n        // sets the column with based on the width of its container\n        column.width = px(width(column.width, containerWidth));\n      }\n    }\n\n    if (tableRef.current && autoWidth) {\n      // unmount the shadow table from temp\n      render(null, tempRef.current);\n    }\n\n    return this;\n  }\n\n  private setSort(userConfig: UserConfig, columns?: OneDArray<TColumn>): void {\n    const cols = columns || this.columns || [];\n\n    for (const column of cols) {\n      // sorting can only be enabled for columns without any children\n      if (column.columns && column.columns.length > 0) {\n        column.sort = {\n          enabled: false,\n        };\n      }\n\n      // implicit userConfig.sort flag\n      if (column.sort === undefined && userConfig.sort) {\n        column.sort = {\n          enabled: true,\n        };\n      }\n\n      // false, null, etc.\n      if (!column.sort) {\n        column.sort = {\n          enabled: false,\n        };\n      } else if (typeof column.sort === 'object') {\n        column.sort = {\n          enabled: true,\n          ...column.sort,\n        };\n      }\n\n      if (column.columns) {\n        this.setSort(userConfig, column.columns);\n      }\n    }\n  }\n\n  private setFixedHeader(\n    userConfig: UserConfig,\n    columns?: OneDArray<TColumn>,\n  ): void {\n    const cols = columns || this.columns || [];\n\n    for (const column of cols) {\n      if (column.fixedHeader === undefined) {\n        column.fixedHeader = userConfig.fixedHeader;\n      }\n\n      if (column.columns) {\n        this.setFixedHeader(userConfig, column.columns);\n      }\n    }\n  }\n\n  private setResizable(\n    userConfig: UserConfig,\n    columns?: OneDArray<TColumn>,\n  ): void {\n    const cols = columns || this.columns || [];\n\n    for (const column of cols) {\n      if (column.resizable === undefined) {\n        column.resizable = userConfig.resizable;\n      }\n\n      if (column.columns) {\n        this.setResizable(userConfig, column.columns);\n      }\n    }\n  }\n\n  private setID(columns?: OneDArray<TColumn>): void {\n    const cols = columns || this.columns || [];\n\n    for (const column of cols) {\n      if (!column.id && typeof column.name === 'string') {\n        // let's guess the column ID if it's undefined\n        column.id = camelCase(column.name);\n      }\n\n      if (!column.id) {\n        logger.error(\n          `Could not find a valid ID for one of the columns. Make sure a valid \"id\" is set for all columns.`,\n        );\n      }\n\n      // nested columns\n      if (column.columns) {\n        this.setID(column.columns);\n      }\n    }\n  }\n\n  private populatePlugins(\n    userConfig: UserConfig,\n    columns: OneDArray<TColumn>,\n  ): void {\n    // populate the cell columns\n    for (const column of columns) {\n      if (column.plugin !== undefined) {\n        userConfig.plugin.add({\n          id: column.id,\n          props: {},\n          ...column.plugin,\n          position: PluginPosition.Cell,\n        });\n      }\n    }\n  }\n\n  static fromColumns(\n    columns: OneDArray<TColumn | string | ComponentChild>,\n  ): Header {\n    const header = new Header();\n\n    for (const column of columns) {\n      if (typeof column === 'string' || isValidElement(column)) {\n        header.columns.push({\n          name: column,\n        });\n      } else if (typeof column === 'object') {\n        const typedColumn = column as TColumn;\n\n        if (typedColumn.columns) {\n          typedColumn.columns = Header.fromColumns(typedColumn.columns).columns;\n        }\n\n        // because the data for that cell is null\n        // if we are trying to render a plugin\n        if (typeof typedColumn.plugin === 'object') {\n          if (typedColumn.data === undefined) {\n            typedColumn.data = null;\n          }\n        }\n\n        // TColumn type\n        header.columns.push(column as TColumn);\n      }\n    }\n\n    return header;\n  }\n\n  static fromUserConfig(userConfig: UserConfig): Header | null {\n    const header = new Header();\n\n    // TODO: this part needs some refactoring\n    if (userConfig.from) {\n      header.columns = Header.fromHTMLTable(userConfig.from).columns;\n    } else if (userConfig.columns) {\n      header.columns = Header.fromColumns(userConfig.columns).columns;\n    } else if (\n      userConfig.data &&\n      typeof userConfig.data[0] === 'object' &&\n      !(userConfig.data[0] instanceof Array)\n    ) {\n      // if data[0] is an object but not an Array\n      // used for when a JSON payload is provided\n      header.columns = Object.keys(userConfig.data[0]).map((name) => {\n        return { name: name };\n      });\n    }\n\n    if (header.columns.length) {\n      header.setID();\n      header.setSort(userConfig);\n      header.setFixedHeader(userConfig);\n      header.setResizable(userConfig);\n      header.populatePlugins(userConfig, header.columns);\n      return header;\n    }\n\n    return null;\n  }\n\n  static fromHTMLTable(element: HTMLElement): Header {\n    const header = new Header();\n    const thead = element.querySelector('thead');\n    const ths = thead.querySelectorAll('th');\n\n    for (const th of ths as any) {\n      header.columns.push({\n        name: th.innerHTML,\n        width: th.width,\n      });\n    }\n\n    return header;\n  }\n\n  /**\n   * Converts the tree-like format of Header to a tabular format\n   *\n   * Example:\n   *\n   *    H1\n   *      H1-H1\n   *      H1-H2\n   *    H2\n   *      H2-H1\n   *\n   *    becomes:\n   *      [\n   *        [H1, H2],\n   *        [H1-H1, H1-H2, H2-H1]\n   *      ]\n   *\n   * @param columns\n   */\n  static tabularFormat(columns: OneDArray<TColumn>): TwoDArray<TColumn> {\n    let result: TwoDArray<TColumn> = [];\n    const cols = columns || [];\n    let nextRow = [];\n\n    if (cols && cols.length) {\n      result.push(cols);\n\n      for (const col of cols) {\n        if (col.columns && col.columns.length) {\n          nextRow = nextRow.concat(col.columns);\n        }\n      }\n\n      if (nextRow.length) {\n        result = result.concat(this.tabularFormat(nextRow));\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * Returns an array of leaf columns (last columns in the tree)\n   *\n   * @param columns\n   */\n  static leafColumns(columns: OneDArray<TColumn>): OneDArray<TColumn> {\n    let result: OneDArray<TColumn> = [];\n    const cols = columns || [];\n\n    if (cols && cols.length) {\n      for (const col of cols) {\n        if (!col.columns || col.columns.length === 0) {\n          result.push(col);\n        }\n\n        if (col.columns) {\n          result = result.concat(this.leafColumns(col.columns));\n        }\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * Returns the maximum depth of a column tree\n   * @param column\n   */\n  static maximumDepth(column: TColumn): number {\n    return this.tabularFormat([column]).length - 1;\n  }\n}\n\nexport default Header;\n","const _prefix = 'ID_';\n\n/**\n * This class is mostly based on Flux's Dispatcher by Facebook\n * https://github.com/facebook/flux/blob/master/src/Dispatcher.js\n */\nexport default class Dispatcher<TPayload> {\n  _callbacks: { [key: string]: (payload: TPayload) => void };\n  _isDispatching: boolean;\n  _isHandled: { [key: string]: boolean };\n  _isPending: { [key: string]: boolean };\n  _lastID: number;\n  _pendingPayload: TPayload;\n\n  constructor() {\n    this._callbacks = {};\n    this._isDispatching = false;\n    this._isHandled = {};\n    this._isPending = {};\n    this._lastID = 1;\n  }\n  /**\n   * Registers a callback to be invoked with every dispatched payload. Returns\n   * a token that can be used with `waitFor()`.\n   */\n  register(callback: (payload: TPayload) => void): string {\n    const id = _prefix + this._lastID++;\n    this._callbacks[id] = callback;\n    return id;\n  }\n  /**\n   * Removes a callback based on its token.\n   */\n  unregister(id: string): void {\n    if (!this._callbacks[id]) {\n      throw Error(\n        `Dispatcher.unregister(...): ${id} does not map to a registered callback.`,\n      );\n    }\n\n    delete this._callbacks[id];\n  }\n  /**\n   * Waits for the callbacks specified to be invoked before continuing execution\n   * of the current callback. This method should only be used by a callback in\n   * response to a dispatched payload.\n   */\n  waitFor(ids: Array<string>): void {\n    if (!this._isDispatching) {\n      throw Error(\n        'Dispatcher.waitFor(...): Must be invoked while dispatching.',\n      );\n    }\n\n    for (let ii = 0; ii < ids.length; ii++) {\n      const id = ids[ii];\n      if (this._isPending[id]) {\n        if (!this._isHandled[id]) {\n          throw Error(`Dispatcher.waitFor(...): Circular dependency detected while ' +\n            'waiting for ${id}.`);\n        }\n        continue;\n      }\n      if (!this._callbacks[id]) {\n        throw Error(\n          `Dispatcher.waitFor(...): ${id} does not map to a registered callback.`,\n        );\n      }\n\n      this._invokeCallback(id);\n    }\n  }\n  /**\n   * Dispatches a payload to all registered callbacks.\n   */\n  dispatch(payload: TPayload): void {\n    if (this._isDispatching) {\n      throw Error(\n        'Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.',\n      );\n    }\n\n    this._startDispatching(payload);\n    try {\n      for (const id in this._callbacks) {\n        if (this._isPending[id]) {\n          continue;\n        }\n        this._invokeCallback(id);\n      }\n    } finally {\n      this._stopDispatching();\n    }\n  }\n  /**\n   * Is this Dispatcher currently dispatching.\n   */\n  isDispatching(): boolean {\n    return this._isDispatching;\n  }\n  /**\n   * Call the callback stored with the given id. Also do some internal\n   * bookkeeping.\n   *\n   * @internal\n   */\n  private _invokeCallback(id: string): void {\n    this._isPending[id] = true;\n    this._callbacks[id](this._pendingPayload);\n    this._isHandled[id] = true;\n  }\n  /**\n   * Set up bookkeeping needed when dispatching.\n   *\n   * @internal\n   */\n  private _startDispatching(payload: TPayload): void {\n    for (const id in this._callbacks) {\n      this._isPending[id] = false;\n      this._isHandled[id] = false;\n    }\n    this._pendingPayload = payload;\n    this._isDispatching = true;\n  }\n  /**\n   * Clear bookkeeping used for dispatching.\n   *\n   * @internal\n   */\n  private _stopDispatching(): void {\n    delete this._pendingPayload;\n    this._isDispatching = false;\n  }\n}\n","/**\n * Base Storage class. All storage implementation must inherit this class\n */\nimport { TData } from '../types';\n\nabstract class Storage<I> {\n  /**\n   * Returns all rows based on ...args\n   * @param args\n   */\n  abstract get(...args): Promise<StorageResponse>;\n\n  /**\n   * To set all rows\n   *\n   * @param data\n   */\n  set?(data: I | ((...args) => void)): this;\n}\n\nexport interface StorageResponse {\n  data: TData;\n  total: number;\n}\n\nexport default Storage;\n","import Storage, { StorageResponse } from './storage';\nimport { TData } from '../types';\n\nclass MemoryStorage extends Storage<TData> {\n  private data: (() => TData) | (() => Promise<TData>);\n\n  constructor(data: TData | (() => TData) | (() => Promise<TData>)) {\n    super();\n    this.set(data);\n  }\n\n  public async get(): Promise<StorageResponse> {\n    const data = await this.data();\n\n    return {\n      data: data,\n      total: data.length,\n    };\n  }\n\n  public set(data: TData | (() => TData) | (() => Promise<TData>)): this {\n    if (data instanceof Array) {\n      this.data = (): TData => data;\n    } else if (data instanceof Function) {\n      this.data = data;\n    }\n\n    return this;\n  }\n}\n\nexport default MemoryStorage;\n","import Storage, { StorageResponse } from './storage';\nimport log from '../util/log';\n\nexport interface ServerStorageOptions extends RequestInit {\n  url: string;\n  // to format the data and columns\n  then?: (data: any) => any[][];\n  // to handle the response from the server. `handle` will\n  // be called first and then `then` callback will be invoked\n  // The purpose of this function is to handle the behaviour\n  // of server and either reject and resolve the initial response\n  // before calling the `then` function\n  handle?: (response: Response) => Promise<any>;\n  total?: (data: any) => number;\n  // to bypass the current implementation of ServerStorage and process the\n  // request manually (e.g. when user wants to connect their own SDK/HTTP Client)\n  data?: (opts: ServerStorageOptions) => Promise<StorageResponse>;\n}\n\nclass ServerStorage extends Storage<ServerStorageOptions> {\n  private readonly options: ServerStorageOptions;\n\n  constructor(options: ServerStorageOptions) {\n    super();\n    this.options = options;\n  }\n\n  private handler(response: Response): Promise<any> {\n    if (typeof this.options.handle === 'function') {\n      return this.options.handle(response);\n    }\n\n    if (response.ok) {\n      return response.json();\n    } else {\n      log.error(\n        `Could not fetch data: ${response.status} - ${response.statusText}`,\n        true,\n      );\n      return null;\n    }\n  }\n\n  public get(options?: ServerStorageOptions): Promise<StorageResponse> {\n    // this.options is the initial config object\n    // options is the runtime config passed by the pipeline (e.g. search component)\n    const opts = {\n      ...this.options,\n      ...options,\n    };\n\n    // if `options.data` is provided, the current ServerStorage\n    // implementation will be ignored and we let options.data to\n    // handle the request. Useful when HTTP client needs to be\n    // replaced with something else\n    if (typeof opts.data === 'function') {\n      return opts.data(opts);\n    }\n\n    return fetch(opts.url, opts)\n      .then(this.handler.bind(this))\n      .then((res) => {\n        return {\n          data: opts.then(res),\n          total: typeof opts.total === 'function' ? opts.total(res) : undefined,\n        };\n      });\n  }\n}\n\nexport default ServerStorage;\n","import { UserConfig } from '../config';\nimport MemoryStorage from './memory';\nimport Storage from './storage';\nimport ServerStorage from './server';\nimport log from '../util/log';\nimport { decode, html } from '../util/html';\n\nclass StorageUtils {\n  /**\n   * Accepts the userConfig dict and tries to guess and return a Storage type\n   *\n   * @param userConfig\n   */\n  public static createFromUserConfig(userConfig: UserConfig): Storage<any> {\n    let storage = null;\n    // `data` array is provided\n    if (userConfig.data) {\n      storage = new MemoryStorage(userConfig.data);\n    }\n\n    if (userConfig.from) {\n      storage = new MemoryStorage(this.tableElementToArray(userConfig.from));\n      // remove the source table element from the DOM\n      userConfig.from.style.display = 'none';\n    }\n\n    if (userConfig.server) {\n      storage = new ServerStorage(userConfig.server);\n    }\n\n    if (!storage) {\n      log.error('Could not determine the storage type', true);\n    }\n\n    return storage;\n  }\n\n  /**\n   * Accepts a HTML table element and converts it into a 2D array of data\n   *\n   * TODO: This function can be a step in the pipeline: Convert Table -> Load into a memory storage -> ...\n   *\n   * @param element\n   */\n  static tableElementToArray(element: HTMLElement): any[][] {\n    const arr = [];\n    const tbody = element.querySelector('tbody');\n    const rows = tbody.querySelectorAll('tr');\n\n    for (const row of rows as any) {\n      const cells: HTMLElement[] = row.querySelectorAll('td');\n      const parsedRow = [];\n\n      for (const cell of cells) {\n        // try to capture a TD with single text element first\n        if (\n          cell.childNodes.length === 1 &&\n          cell.childNodes[0].nodeType === Node.TEXT_NODE\n        ) {\n          parsedRow.push(decode(cell.innerHTML));\n        } else {\n          parsedRow.push(html(cell.innerHTML));\n        }\n      }\n\n      arr.push(parsedRow);\n    }\n\n    return arr;\n  }\n}\n\nexport default StorageUtils;\n","import { PipelineProcessor, ProcessorType } from './processor';\nimport { ID } from '../util/id';\nimport log from '../util/log';\nimport { EventEmitter } from '../util/eventEmitter';\n\ninterface PipelineEvents<T> {\n  /**\n   * Generic updated event. Triggers the callback function when the pipeline\n   * is updated, including when a new processor is registered, a processor's props\n   * get updated, etc.\n   */\n  updated: (processor: PipelineProcessor<any, any>) => void;\n  /**\n   * Triggers the callback function when a new\n   * processor is registered successfully\n   */\n  afterRegister: () => void;\n  /**\n   * Triggers the callback when a registered\n   * processor's property is updated\n   */\n  propsUpdated: () => void;\n  /**\n   * Triggers the callback function when the pipeline\n   * is fully processed, before returning the results\n   *\n   * afterProcess will not be called if there is an\n   * error in the pipeline (i.e a step throw an Error)\n   */\n  afterProcess: (prev: T) => void;\n  /**\n   * Triggers the callback function when the pipeline\n   * fails to process all steps or at least one step\n   * throws an Error\n   */\n  error: (prev: T) => void;\n}\n\nclass Pipeline<T, P = unknown> extends EventEmitter<PipelineEvents<T>> {\n  // available steps for this pipeline\n  private readonly _steps: Map<ProcessorType, PipelineProcessor<T, P>[]> =\n    new Map<ProcessorType, PipelineProcessor<T, P>[]>();\n  // used to cache the results of processors using their id field\n  private cache: Map<string, any> = new Map<string, any>();\n  // keeps the index of the last updated processor in the registered\n  // processors list and will be used to invalidate the cache\n  // -1 means all new processors should be processed\n  private lastProcessorIndexUpdated = -1;\n\n  constructor(steps?: PipelineProcessor<any, any>[]) {\n    super();\n\n    if (steps) {\n      steps.forEach((step) => this.register(step));\n    }\n  }\n\n  /**\n   * Clears the `cache` array\n   */\n  clearCache(): void {\n    this.cache = new Map<string, any>();\n    this.lastProcessorIndexUpdated = -1;\n  }\n\n  /**\n   * Registers a new processor\n   *\n   * @param processor\n   * @param priority\n   */\n  register(\n    processor: PipelineProcessor<any, any>,\n    priority: number = null,\n  ): void {\n    if (processor.type === null) {\n      throw Error('Processor type is not defined');\n    }\n\n    // binding the propsUpdated callback to the Pipeline\n    processor.on('propsUpdated', this.processorPropsUpdated.bind(this));\n\n    this.addProcessorByPriority(processor, priority);\n    this.afterRegistered(processor);\n  }\n\n  /**\n   * Removes a processor from the list\n   *\n   * @param processor\n   */\n  unregister(processor: PipelineProcessor<any, any>): void {\n    if (!processor) return;\n\n    const subSteps = this._steps.get(processor.type);\n\n    if (subSteps && subSteps.length) {\n      this._steps.set(\n        processor.type,\n        subSteps.filter((proc) => proc != processor),\n      );\n      this.emit('updated', processor);\n    }\n  }\n\n  /**\n   * Registers a new processor\n   *\n   * @param processor\n   * @param priority\n   */\n  private addProcessorByPriority(\n    processor: PipelineProcessor<T, P>,\n    priority: number,\n  ): void {\n    let subSteps = this._steps.get(processor.type);\n\n    if (!subSteps) {\n      const newSubStep = [];\n      this._steps.set(processor.type, newSubStep);\n      subSteps = newSubStep;\n    }\n\n    if (priority === null || priority < 0) {\n      subSteps.push(processor);\n    } else {\n      if (!subSteps[priority]) {\n        // slot is empty\n        subSteps[priority] = processor;\n      } else {\n        // slot is NOT empty\n        const first = subSteps.slice(0, priority - 1);\n        const second = subSteps.slice(priority + 1);\n\n        this._steps.set(processor.type, first.concat(processor).concat(second));\n      }\n    }\n  }\n\n  /**\n   * Flattens the _steps Map and returns a list of steps with their correct priorities\n   */\n  get steps(): PipelineProcessor<T, P>[] {\n    let steps: PipelineProcessor<T, P>[] = [];\n\n    for (const type of this.getSortedProcessorTypes()) {\n      const subSteps = this._steps.get(type);\n\n      if (subSteps && subSteps.length) {\n        steps = steps.concat(subSteps);\n      }\n    }\n\n    // to remove any undefined elements\n    return steps.filter((s) => s);\n  }\n\n  /**\n   * Accepts ProcessType and returns an array of the registered processes\n   * with the give type\n   *\n   * @param type\n   */\n  getStepsByType(type: ProcessorType): PipelineProcessor<T, P>[] {\n    return this.steps.filter((process) => process.type === type);\n  }\n\n  /**\n   * Returns a list of ProcessorType according to their priority\n   */\n  private getSortedProcessorTypes(): ProcessorType[] {\n    return Object.keys(ProcessorType)\n      .filter((key) => !isNaN(Number(key)))\n      .map((key) => Number(key));\n  }\n\n  /**\n   * Runs all registered processors based on their correct priority\n   * and returns the final output after running all steps\n   *\n   * @param data\n   */\n  async process(data?: T): Promise<T> {\n    const lastProcessorIndexUpdated = this.lastProcessorIndexUpdated;\n    const steps = this.steps;\n\n    let prev = data;\n\n    try {\n      for (const processor of steps) {\n        const processorIndex = this.findProcessorIndexByID(processor.id);\n\n        if (processorIndex >= lastProcessorIndexUpdated) {\n          // we should execute process() here since the last\n          // updated processor was before \"processor\".\n          // This is to ensure that we always have correct and up to date\n          // data from processors and also to skip them when necessary\n          prev = await processor.process(prev);\n          this.cache.set(processor.id, prev);\n        } else {\n          // cached results already exist\n          prev = this.cache.get(processor.id);\n        }\n      }\n    } catch (e) {\n      log.error(e);\n      // trigger the onError callback\n      this.emit('error', prev);\n\n      // rethrow\n      throw e;\n    }\n\n    // means the pipeline is up to date\n    this.lastProcessorIndexUpdated = steps.length;\n\n    // triggers the afterProcess callbacks with the results\n    this.emit('afterProcess', prev);\n\n    return prev;\n  }\n\n  /**\n   * Returns the registered processor's index in _steps array\n   *\n   * @param processorID\n   */\n  private findProcessorIndexByID(processorID: ID): number {\n    return this.steps.findIndex((p) => p.id == processorID);\n  }\n\n  /**\n   * Sets the last updates processors index locally\n   * This is used to invalid or skip a processor in\n   * the process() method\n   */\n  private setLastProcessorIndex(processor: PipelineProcessor<T, P>): void {\n    const processorIndex = this.findProcessorIndexByID(processor.id);\n\n    if (this.lastProcessorIndexUpdated > processorIndex) {\n      this.lastProcessorIndexUpdated = processorIndex;\n    }\n  }\n\n  private processorPropsUpdated(processor): void {\n    this.setLastProcessorIndex(processor);\n    this.emit('propsUpdated');\n    this.emit('updated', processor);\n  }\n\n  private afterRegistered(processor): void {\n    this.setLastProcessorIndex(processor);\n    this.emit('afterRegister');\n    this.emit('updated', processor);\n  }\n}\n\nexport default Pipeline;\n","import Storage, { StorageResponse } from '../../storage/storage';\nimport {\n  PipelineProcessor,\n  PipelineProcessorProps,\n  ProcessorType,\n} from '../processor';\n\ninterface StorageExtractorProps extends PipelineProcessorProps {\n  storage: Storage<any>;\n}\n\nclass StorageExtractor extends PipelineProcessor<\n  Promise<StorageResponse>,\n  StorageExtractorProps\n> {\n  get type(): ProcessorType {\n    return ProcessorType.Extractor;\n  }\n\n  async _process(opts: any): Promise<StorageResponse> {\n    return await this.props.storage.get(opts);\n  }\n}\n\nexport default StorageExtractor;\n","import { PipelineProcessor, ProcessorType } from '../processor';\nimport Tabular from '../../tabular';\nimport { ArrayResponse } from './storageResponseToArray';\n\nclass ArrayToTabularTransformer extends PipelineProcessor<\n  Tabular,\n  Record<string, any>\n> {\n  get type(): ProcessorType {\n    return ProcessorType.Transformer;\n  }\n\n  _process(arrayResponse: ArrayResponse): Tabular {\n    const tabular = Tabular.fromArray(arrayResponse.data);\n\n    // for server-side storage\n    tabular.length = arrayResponse.total;\n\n    return tabular;\n  }\n}\n\nexport default ArrayToTabularTransformer;\n","import {\n  PipelineProcessor,\n  PipelineProcessorProps,\n  ProcessorType,\n} from '../processor';\nimport { ServerStorageOptions } from '../../storage/server';\n\ninterface ServerInitiatorProps extends PipelineProcessorProps {\n  serverStorageOptions: ServerStorageOptions;\n}\n\nclass ServerInitiator extends PipelineProcessor<\n  ServerStorageOptions,\n  ServerInitiatorProps\n> {\n  get type(): ProcessorType {\n    return ProcessorType.Initiator;\n  }\n\n  _process(): ServerStorageOptions {\n    return Object.entries(this.props.serverStorageOptions)\n      .filter(([_, val]) => typeof val !== 'function')\n      .reduce(\n        (acc, [k, v]) => ({ ...acc, [k]: v }),\n        {},\n      ) as ServerStorageOptions;\n  }\n}\n\nexport default ServerInitiator;\n","import {\n  PipelineProcessor,\n  PipelineProcessorProps,\n  ProcessorType,\n} from '../processor';\nimport { StorageResponse } from '../../storage/storage';\nimport { TCell, TData, TDataArray, TDataObject, TwoDArray } from '../../types';\nimport Header from '../../header';\nimport logger from '../../util/log';\n\nexport interface ArrayResponse {\n  data: TwoDArray<TCell>;\n  total: number;\n}\n\ninterface StorageResponseToArrayTransformerProps\n  extends PipelineProcessorProps {\n  header: Header;\n}\n\nclass StorageResponseToArrayTransformer extends PipelineProcessor<\n  ArrayResponse,\n  StorageResponseToArrayTransformerProps\n> {\n  get type(): ProcessorType {\n    return ProcessorType.Transformer;\n  }\n\n  private castData(data: TData): TwoDArray<TCell> {\n    if (!data || !data.length) {\n      return [];\n    }\n\n    if (!this.props.header || !this.props.header.columns) {\n      return data as TwoDArray<TCell>;\n    }\n\n    const columns = Header.leafColumns(this.props.header.columns);\n\n    // if it's a 2d array already\n    if (data[0] instanceof Array) {\n      return (data as TDataArray).map((row) => {\n        let pad = 0;\n\n        return columns.map((column, i) => {\n          // default `data` is provided for this column\n          if (column.data !== undefined) {\n            pad++;\n\n            if (typeof column.data === 'function') {\n              return column.data(row);\n            } else {\n              return column.data;\n            }\n          }\n\n          return row[i - pad];\n        });\n      });\n    }\n\n    // if it's an array of objects (but not array of arrays, i.e JSON payload)\n    if (typeof data[0] === 'object' && !(data[0] instanceof Array)) {\n      return (data as TDataObject).map((row) =>\n        columns.map((column, i) => {\n          if (column.data !== undefined) {\n            if (typeof column.data === 'function') {\n              return column.data(row);\n            } else {\n              return column.data;\n            }\n          } else if (column.id) {\n            return row[column.id];\n          } else {\n            logger.error(`Could not find the correct cell for column at position ${i}.\n                          Make sure either 'id' or 'selector' is defined for all columns.`);\n            return null;\n          }\n        }),\n      );\n    }\n\n    return [];\n  }\n\n  _process(storageResponse: StorageResponse): ArrayResponse {\n    return {\n      data: this.castData(storageResponse.data),\n      total: storageResponse.total,\n    };\n  }\n}\n\nexport default StorageResponseToArrayTransformer;\n","import { Config } from '../config';\nimport Pipeline from './pipeline';\nimport Tabular from '../tabular';\nimport StorageExtractor from './extractor/storage';\nimport ArrayToTabularTransformer from './transformer/arrayToTabular';\nimport ServerStorage from '../storage/server';\nimport ServerInitiator from './initiator/server';\nimport StorageResponseToArrayTransformer from './transformer/storageResponseToArray';\n\nclass PipelineUtils {\n  static createFromConfig(config: Config): Pipeline<Tabular> {\n    const pipeline = new Pipeline<Tabular>();\n\n    if (config.storage instanceof ServerStorage) {\n      pipeline.register(\n        new ServerInitiator({\n          serverStorageOptions: config.server,\n        }),\n      );\n    }\n\n    pipeline.register(new StorageExtractor({ storage: config.storage }));\n    pipeline.register(\n      new StorageResponseToArrayTransformer({ header: config.header }),\n    );\n    pipeline.register(new ArrayToTabularTransformer());\n\n    return pipeline;\n  }\n}\n\nexport default PipelineUtils;\n","import {\n  CSSDeclaration,\n  OneDArray,\n  ProtoExtends,\n  TColumn,\n  TData,\n} from './types';\nimport Storage from './storage/storage';\nimport Pipeline from './pipeline/pipeline';\nimport Tabular from './tabular';\nimport { Search, SearchConfig } from './view/plugin/search/search';\nimport { Pagination, PaginationConfig } from './view/plugin/pagination';\nimport Header from './header';\nimport { ServerStorageOptions } from './storage/server';\nimport Dispatcher from './util/dispatcher';\nimport { GenericSortConfig } from './view/plugin/sort/sort';\nimport { Language, Translator } from './i18n/language';\nimport { Component, ComponentChild, createRef, RefObject } from 'preact';\nimport StorageUtils from './storage/storageUtils';\nimport PipelineUtils from './pipeline/pipelineUtils';\nimport { EventEmitter } from './util/eventEmitter';\nimport { GridEvents } from './events';\nimport { PluginManager, PluginPosition, Plugin } from './plugin';\nimport Grid from './grid';\n\n// Config type used internally\nexport interface Config {\n  // a reference to the current Grid.js instance\n  instance: Grid;\n  eventEmitter: EventEmitter<GridEvents>;\n  dispatcher: Dispatcher<any>;\n  plugin: PluginManager;\n  /** container element that is used to mount the Grid.js to */\n  // TODO: change this to an element reference\n  container?: Element;\n  /** pointer to the main table element */\n  tableRef?: RefObject<Component>;\n  /** gridjs-temp div which is used internally */\n  tempRef?: RefObject<HTMLDivElement>;\n  data?: TData | (() => TData) | (() => Promise<TData>);\n  server?: ServerStorageOptions;\n  header?: Header;\n  /** to parse a HTML table and load the data */\n  from: HTMLElement;\n  storage: Storage<any>;\n  pipeline: Pipeline<Tabular>;\n  /** to automatically calculate the columns width */\n  autoWidth: boolean;\n  /** sets the width of the container and table */\n  width: string;\n  /** sets the height of the table */\n  height: string;\n  pagination: PaginationConfig;\n  sort: GenericSortConfig;\n  translator: Translator;\n  style?: Partial<{\n    table: CSSDeclaration;\n    td: CSSDeclaration;\n    th: CSSDeclaration;\n    container: CSSDeclaration;\n    header: CSSDeclaration;\n    footer: CSSDeclaration;\n  }>;\n  className?: Partial<{\n    table: string;\n    th: string;\n    thead: string;\n    tbody: string;\n    tr: string;\n    td: string;\n    container: string;\n    footer: string;\n    header: string;\n    search: string;\n    sort: string;\n    pagination: string;\n    paginationSummary: string;\n    paginationButton: string;\n    paginationButtonNext: string;\n    paginationButtonCurrent: string;\n    paginationButtonPrev: string;\n    loading: string;\n    notfound: string;\n    error: string;\n  }>;\n}\n\n// Config type used by the consumers\ninterface UserConfigExtend {\n  /** fixes the table header to the top of the table */\n  fixedHeader: boolean;\n  /** Resizable columns? */\n  resizable: boolean;\n  columns: OneDArray<TColumn | string | ComponentChild>;\n  search: SearchConfig | boolean;\n  pagination: PaginationConfig | boolean;\n  // implicit option to enable the sort plugin globally\n  sort: GenericSortConfig | boolean;\n  language: Language;\n  plugins?: Plugin<any>[];\n}\n\nexport type UserConfig = ProtoExtends<\n  Partial<Config>,\n  Partial<UserConfigExtend>\n>;\n\nexport class Config {\n  // this is the config file passed by the user\n  // we need this for Config.update()\n  private _userConfig: UserConfig;\n\n  constructor(config?: Partial<Config>) {\n    Object.assign(this, {\n      ...Config.defaultConfig(),\n      ...config,\n    });\n\n    this._userConfig = {};\n  }\n\n  /**\n   * Assigns `updatedConfig` keys to the current config file\n   *\n   * @param updatedConfig\n   */\n  assign(updatedConfig: Partial<Config>): Config {\n    for (const key of Object.keys(updatedConfig)) {\n      // because we don't want to update the _userConfig cache\n      if (key === '_userConfig') continue;\n\n      this[key] = updatedConfig[key];\n    }\n\n    return this;\n  }\n\n  /**\n   * Updates the config from a UserConfig\n   *\n   * @param userConfig\n   */\n  update(userConfig: Partial<UserConfig>): Config {\n    if (!userConfig) return this;\n\n    this._userConfig = {\n      ...this._userConfig,\n      ...userConfig,\n    };\n\n    this.assign(Config.fromUserConfig(this._userConfig));\n\n    return this;\n  }\n\n  static defaultConfig(): Config {\n    return {\n      plugin: new PluginManager(),\n      dispatcher: new Dispatcher<any>(),\n      tableRef: createRef(),\n      tempRef: createRef(),\n      width: '100%',\n      height: 'auto',\n      autoWidth: true,\n      style: {},\n      className: {},\n    } as Config;\n  }\n\n  static fromUserConfig(userConfig: UserConfig): Config {\n    const config = new Config(userConfig as Config);\n\n    // to set the initial _userConfig object\n    config._userConfig = userConfig;\n\n    // Sort\n    if (typeof userConfig.sort === 'boolean' && userConfig.sort) {\n      config.assign({\n        sort: {\n          multiColumn: true,\n        },\n      });\n    }\n\n    // Header\n    config.assign({\n      header: Header.fromUserConfig(config),\n    });\n\n    config.assign({\n      storage: StorageUtils.createFromUserConfig(userConfig),\n    });\n\n    config.assign({\n      pipeline: PipelineUtils.createFromConfig(config),\n    });\n\n    // Translator\n    config.assign({\n      translator: new Translator(userConfig.language),\n    });\n\n    // Search\n    config.plugin.add({\n      id: 'search',\n      position: PluginPosition.Header,\n      component: Search,\n      props: {\n        enabled:\n          userConfig.search === true || userConfig.search instanceof Object,\n        ...(userConfig.search as SearchConfig),\n      },\n    });\n\n    // Pagination\n    config.plugin.add({\n      id: 'pagination',\n      position: PluginPosition.Footer,\n      component: Pagination,\n      props: {\n        enabled:\n          userConfig.pagination === true ||\n          userConfig.pagination instanceof Object,\n        ...(userConfig.pagination as PaginationConfig),\n      },\n    });\n\n    // Additional plugins\n    if (userConfig.plugins) {\n      userConfig.plugins.forEach((p) => config.plugin.add(p));\n    }\n\n    return config;\n  }\n}\n","import { ComponentChild, h, JSX } from 'preact';\n\nimport Cell from '../../cell';\nimport { BaseComponent, BaseProps } from '../base';\nimport { classJoin, className } from '../../util/className';\nimport { CSSDeclaration, TColumn } from '../../types';\nimport Row from '../../row';\nimport { JSXInternal } from 'preact/src/jsx';\nimport { PluginRenderer } from '../../plugin';\n\nexport interface TDProps\n  extends BaseProps,\n    JSX.HTMLAttributes<HTMLTableCellElement> {\n  cell: Cell;\n  row?: Row;\n  column?: TColumn;\n  style?: CSSDeclaration;\n  messageCell?: boolean;\n}\n\nexport class TD extends BaseComponent<TDProps> {\n  private content(): ComponentChild {\n    if (\n      this.props.column &&\n      typeof this.props.column.formatter === 'function'\n    ) {\n      return this.props.column.formatter(\n        this.props.cell.data,\n        this.props.row,\n        this.props.column,\n      );\n    }\n\n    if (this.props.column && this.props.column.plugin) {\n      return (\n        <PluginRenderer\n          pluginId={this.props.column.id}\n          props={{\n            column: this.props.column,\n            cell: this.props.cell,\n            row: this.props.row,\n          }}\n        />\n      );\n    }\n\n    return this.props.cell.data;\n  }\n\n  private handleClick(e: JSX.TargetedMouseEvent<HTMLTableCellElement>): void {\n    if (this.props.messageCell) return;\n    this.config.eventEmitter.emit(\n      'cellClick',\n      e,\n      this.props.cell,\n      this.props.column,\n      this.props.row,\n    );\n  }\n\n  private getCustomAttributes(\n    column: TColumn | null,\n  ): JSXInternal.HTMLAttributes<HTMLTableCellElement> {\n    if (!column) return {};\n\n    if (typeof column.attributes === 'function') {\n      return column.attributes(\n        this.props.cell.data,\n        this.props.row,\n        this.props.column,\n      );\n    } else {\n      return column.attributes;\n    }\n  }\n\n  render() {\n    return (\n      <td\n        role={this.props.role}\n        colSpan={this.props.colSpan}\n        data-column-id={this.props.column && this.props.column.id}\n        className={classJoin(\n          className('td'),\n          this.props.className,\n          this.config.className.td,\n        )}\n        style={{\n          ...this.props.style,\n          ...this.config.style.td,\n        }}\n        onClick={this.handleClick.bind(this)}\n        {...this.getCustomAttributes(this.props.column)}\n      >\n        {this.content()}\n      </td>\n    );\n  }\n}\n","import { h, JSX, Fragment, ComponentChildren } from 'preact';\n\nimport Row from '../../row';\nimport Cell from '../../cell';\nimport { BaseComponent, BaseProps } from '../base';\nimport { classJoin, className } from '../../util/className';\nimport { TColumn } from '../../types';\nimport { TD } from './td';\nimport Header from '../../header';\n\nexport interface TRProps extends BaseProps {\n  row?: Row;\n  header?: Header;\n  messageRow?: boolean;\n}\n\nexport class TR extends BaseComponent<TRProps> {\n  private getColumn(cellIndex: number): TColumn {\n    if (this.props.header) {\n      const cols = Header.leafColumns(this.props.header.columns);\n\n      if (cols) {\n        return cols[cellIndex];\n      }\n    }\n\n    return null;\n  }\n\n  private handleClick(e: JSX.TargetedMouseEvent<HTMLTableRowElement>): void {\n    if (this.props.messageRow) return;\n    this.config.eventEmitter.emit('rowClick', e, this.props.row);\n  }\n\n  private getChildren(): ComponentChildren {\n    if (this.props.children) {\n      return this.props.children;\n    } else {\n      return (\n        <Fragment>\n          {this.props.row.cells.map((cell: Cell, i) => {\n            const column = this.getColumn(i);\n\n            if (column && column.hidden) return null;\n\n            return (\n              <TD\n                key={cell.id}\n                cell={cell}\n                row={this.props.row}\n                column={column}\n              />\n            );\n          })}\n        </Fragment>\n      );\n    }\n  }\n\n  render() {\n    return (\n      <tr\n        className={classJoin(className('tr'), this.config.className.tr)}\n        onClick={this.handleClick.bind(this)}\n      >\n        {this.getChildren()}\n      </tr>\n    );\n  }\n}\n","import { h } from 'preact';\n\nimport Cell from '../../cell';\nimport { BaseComponent, BaseProps } from '../base';\nimport { classJoin, className } from '../../util/className';\nimport { TR } from './tr';\nimport { TD } from './td';\n\nexport interface MessageRowProps extends BaseProps {\n  message: string;\n  colSpan?: number;\n  className?: string;\n}\n\nexport class MessageRow extends BaseComponent<MessageRowProps> {\n  render() {\n    return (\n      <TR messageRow={true}>\n        <TD\n          role=\"alert\"\n          colSpan={this.props.colSpan}\n          messageCell={true}\n          cell={new Cell(this.props.message)}\n          className={classJoin(\n            className('message'),\n            this.props.className ? this.props.className : null,\n          )}\n        />\n      </TR>\n    );\n  }\n}\n","import { h } from 'preact';\n\nimport Row from '../../row';\nimport { TR } from './tr';\nimport Tabular from '../../tabular';\nimport { BaseComponent, BaseProps } from '../base';\nimport { classJoin, className } from '../../util/className';\nimport { Status } from '../../types';\nimport Header from '../../header';\nimport { MessageRow } from './messageRow';\n\ninterface TBodyProps extends BaseProps {\n  data: Tabular;\n  status: Status;\n  header?: Header;\n}\n\nexport class TBody extends BaseComponent<TBodyProps> {\n  private headerLength(): number {\n    if (this.props.header) {\n      return this.props.header.visibleColumns.length;\n    }\n    return 0;\n  }\n\n  render() {\n    return (\n      <tbody\n        className={classJoin(className('tbody'), this.config.className.tbody)}\n      >\n        {this.props.data &&\n          this.props.data.rows.map((row: Row) => {\n            return <TR key={row.id} row={row} header={this.props.header} />;\n          })}\n\n        {this.props.status === Status.Loading &&\n          (!this.props.data || this.props.data.length === 0) && (\n            <MessageRow\n              message={this._('loading')}\n              colSpan={this.headerLength()}\n              className={classJoin(\n                className('loading'),\n                this.config.className.loading,\n              )}\n            />\n          )}\n\n        {this.props.status === Status.Rendered &&\n          this.props.data &&\n          this.props.data.length === 0 && (\n            <MessageRow\n              message={this._('noRecordsFound')}\n              colSpan={this.headerLength()}\n              className={classJoin(\n                className('notfound'),\n                this.config.className.notfound,\n              )}\n            />\n          )}\n\n        {this.props.status === Status.Error && (\n          <MessageRow\n            message={this._('error')}\n            colSpan={this.headerLength()}\n            className={classJoin(\n              className('error'),\n              this.config.className.error,\n            )}\n          />\n        )}\n      </tbody>\n    );\n  }\n}\n","import { Comparator, TCell } from '../../types';\nimport Tabular from '../../tabular';\nimport {\n  PipelineProcessor,\n  PipelineProcessorProps,\n  ProcessorType,\n} from '../processor';\nimport Row from '../../row';\nimport log from '../../util/log';\n\ninterface NativeSortProps extends PipelineProcessorProps {\n  columns: {\n    index: number;\n    // 1 ascending, -1 descending\n    direction?: 1 | -1;\n    compare?: Comparator<TCell>;\n  }[];\n}\n\nclass NativeSort extends PipelineProcessor<Tabular, NativeSortProps> {\n  protected validateProps(): void {\n    for (const condition of this.props.columns) {\n      if (condition.direction === undefined) {\n        condition.direction = 1;\n      }\n\n      if (condition.direction !== 1 && condition.direction !== -1) {\n        log.error(`Invalid sort direction ${condition.direction}`);\n      }\n    }\n  }\n\n  get type(): ProcessorType {\n    return ProcessorType.Sort;\n  }\n\n  private compare(cellA: TCell, cellB: TCell): number {\n    if (cellA > cellB) {\n      return 1;\n    } else if (cellA < cellB) {\n      return -1;\n    }\n\n    return 0;\n  }\n\n  private compareWrapper(a: Row, b: Row): number {\n    let cmp = 0;\n\n    for (const column of this.props.columns) {\n      if (cmp === 0) {\n        const cellA = a.cells[column.index].data;\n        const cellB = b.cells[column.index].data;\n\n        if (typeof column.compare === 'function') {\n          cmp |= column.compare(cellA, cellB) * column.direction;\n        } else {\n          cmp |= this.compare(cellA, cellB) * column.direction;\n        }\n      } else {\n        break;\n      }\n    }\n\n    return cmp;\n  }\n\n  protected _process(data: Tabular): Tabular {\n    const sortedRows = [...data.rows];\n    sortedRows.sort(this.compareWrapper.bind(this));\n\n    const sorted = new Tabular(sortedRows);\n    // we have to set the tabular length manually\n    // because of the server-side storage\n    sorted.length = data.length;\n\n    return sorted;\n  }\n}\n\nexport default NativeSort;\n","import BaseStore from '../../base/store';\nimport { SortActionsType } from './actions';\nimport { Comparator, TCell } from '../../../types';\n\nexport type SortStoreState = {\n  index: number;\n  direction: 1 | -1;\n  compare?: Comparator<TCell>;\n}[];\n\nexport class SortStore extends BaseStore<SortStoreState, SortActionsType> {\n  getInitialState(): SortStoreState {\n    return [];\n  }\n\n  handle(type, payload): void {\n    if (type === 'SORT_COLUMN') {\n      const { index, direction, multi, compare } = payload;\n      this.sortColumn(index, direction, multi, compare);\n    } else if (type === 'SORT_COLUMN_TOGGLE') {\n      const { index, multi, compare } = payload;\n      this.sortToggle(index, multi, compare);\n    }\n  }\n\n  private sortToggle(\n    index: number,\n    multi: boolean,\n    compare: Comparator<TCell>,\n  ): void {\n    const columns = [...this.state];\n    const column = columns.find((x) => x.index === index);\n\n    if (!column) {\n      this.sortColumn(index, 1, multi, compare);\n    } else {\n      this.sortColumn(index, column.direction === 1 ? -1 : 1, multi, compare);\n    }\n  }\n\n  private sortColumn(\n    index: number,\n    direction: 1 | -1,\n    multi: boolean,\n    compare: Comparator<TCell>,\n  ): void {\n    let columns = [...this.state];\n    const count = columns.length;\n    const column = columns.find((x) => x.index === index);\n    const exists = column !== undefined;\n\n    let add = false;\n    let reset = false;\n    let remove = false;\n    let update = false;\n\n    if (!exists) {\n      // the column has not been sorted\n      if (count === 0) {\n        // the first column to be sorted\n        add = true;\n      } else if (count > 0 && !multi) {\n        // remove the previously sorted column\n        // and sort the current column\n        add = true;\n        reset = true;\n      } else if (count > 0 && multi) {\n        // multi-sorting\n        // sort this column as well\n        add = true;\n      }\n    } else {\n      // the column has been sorted before\n      if (!multi) {\n        // single column sorting\n        if (count === 1) {\n          update = true;\n        } else if (count > 1) {\n          // this situation happens when we have already entered\n          // multi-sorting mode but then user tries to sort a single column\n          reset = true;\n          add = true;\n        }\n      } else {\n        // multi sorting\n        if (column.direction === -1) {\n          // remove the current column from the\n          // sorted columns array\n          remove = true;\n        } else {\n          update = true;\n        }\n      }\n    }\n\n    if (reset) {\n      // resetting the sorted columns\n      columns = [];\n    }\n\n    if (add) {\n      columns.push({\n        index: index,\n        direction: direction,\n        compare: compare,\n      });\n    } else if (update) {\n      const index = columns.indexOf(column);\n      columns[index].direction = direction;\n    } else if (remove) {\n      const index = columns.indexOf(column);\n      columns.splice(index, 1);\n    }\n\n    this.setState(columns);\n  }\n}\n","import { BaseActions } from '../../base/actions';\nimport { Comparator, TCell } from '../../../types';\n\nexport interface SortActionsType {\n  SORT_COLUMN: {\n    index: number;\n    direction: 1 | -1;\n    multi?: boolean;\n    compare?: Comparator<TCell>;\n  };\n\n  SORT_COLUMN_TOGGLE: {\n    index: number;\n    multi?: boolean;\n    compare?: Comparator<TCell>;\n  };\n}\n\nexport class SortActions extends BaseActions<SortActionsType> {\n  sortColumn(\n    index: number,\n    direction: 1 | -1,\n    multi?: boolean,\n    compare?: Comparator<TCell>,\n  ): void {\n    this.dispatch('SORT_COLUMN', {\n      index: index,\n      direction: direction,\n      multi: multi,\n      compare: compare,\n    });\n  }\n\n  sortToggle(\n    index: number,\n    multi?: boolean,\n    compare?: Comparator<TCell>,\n  ): void {\n    this.dispatch('SORT_COLUMN_TOGGLE', {\n      index: index,\n      multi: multi,\n      compare: compare,\n    });\n  }\n}\n","import {\n  PipelineProcessor,\n  PipelineProcessorProps,\n  ProcessorType,\n} from '../processor';\nimport { ServerStorageOptions } from '../../storage/server';\nimport { TColumnSort } from '../../types';\n\ninterface ServerSortProps extends PipelineProcessorProps {\n  columns: TColumnSort[];\n  url?: (prevUrl: string, columns: TColumnSort[]) => string;\n  body?: (prevBody: BodyInit, columns: TColumnSort[]) => BodyInit;\n}\n\nclass ServerSort extends PipelineProcessor<\n  ServerStorageOptions,\n  ServerSortProps\n> {\n  get type(): ProcessorType {\n    return ProcessorType.ServerSort;\n  }\n\n  _process(options?: ServerStorageOptions): ServerStorageOptions {\n    const updates = {};\n\n    if (this.props.url) {\n      updates['url'] = this.props.url(options.url, this.props.columns);\n    }\n\n    if (this.props.body) {\n      updates['body'] = this.props.body(options.body, this.props.columns);\n    }\n\n    return {\n      ...options,\n      ...updates,\n    };\n  }\n}\n\nexport default ServerSort;\n","import { h, JSX } from 'preact';\n\nimport { BaseComponent, BaseProps } from '../../base';\nimport { classJoin, className } from '../../../util/className';\nimport { ProcessorType } from '../../../pipeline/processor';\nimport NativeSort from '../../../pipeline/sort/native';\nimport { SortStore, SortStoreState } from './store';\nimport { Comparator, TCell, TColumnSort } from '../../../types';\nimport { SortActions } from './actions';\nimport ServerSort from '../../../pipeline/sort/server';\n\n// column specific config\nexport interface SortConfig {\n  enabled?: boolean;\n  compare?: Comparator<TCell>;\n}\n\n// generic sort config:\n//\n// Config {\n//    sort: GenericSortConfig\n// }\n//\nexport interface GenericSortConfig {\n  multiColumn?: boolean;\n  server?: {\n    url?: (prevUrl: string, columns: TColumnSort[]) => string;\n    body?: (prevBody: BodyInit, columns: TColumnSort[]) => BodyInit;\n  };\n}\n\nexport interface SortProps extends BaseProps {\n  // column index\n  index: number;\n}\n\ninterface SortState {\n  direction: 1 | -1 | 0;\n}\n\nexport class Sort extends BaseComponent<SortProps & SortConfig, SortState> {\n  private readonly sortProcessor: NativeSort | ServerSort;\n  private readonly actions: SortActions;\n  private readonly store: SortStore;\n  private readonly updateStateFn: (...args) => void;\n  private updateSortProcessorFn: (sortedColumns: SortStoreState) => void;\n\n  constructor(props: SortProps & SortConfig, context) {\n    super(props, context);\n\n    this.actions = new SortActions(this.config.dispatcher);\n    this.store = new SortStore(this.config.dispatcher);\n\n    if (props.enabled) {\n      this.sortProcessor = this.getOrCreateSortProcessor();\n      this.updateStateFn = this.updateState.bind(this);\n      this.store.on('updated', this.updateStateFn);\n      this.state = { direction: 0 };\n    }\n  }\n\n  componentWillUnmount(): void {\n    this.config.pipeline.unregister(this.sortProcessor);\n\n    this.store.off('updated', this.updateStateFn);\n    if (this.updateSortProcessorFn)\n      this.store.off('updated', this.updateSortProcessorFn);\n  }\n\n  /**\n   * Sets the internal state of component\n   */\n  private updateState(): void {\n    const currentColumn = this.store.state.find(\n      (x) => x.index === this.props.index,\n    );\n\n    if (!currentColumn) {\n      this.setState({\n        direction: 0,\n      });\n    } else {\n      this.setState({\n        direction: currentColumn.direction,\n      });\n    }\n  }\n\n  private updateSortProcessor(sortedColumns: SortStoreState) {\n    // updates the Sorting processor\n    this.sortProcessor.setProps({\n      columns: sortedColumns,\n    });\n  }\n\n  private getOrCreateSortProcessor(): NativeSort {\n    let processorType = ProcessorType.Sort;\n\n    if (this.config.sort && typeof this.config.sort.server === 'object') {\n      processorType = ProcessorType.ServerSort;\n    }\n\n    const processors = this.config.pipeline.getStepsByType(processorType);\n\n    // my assumption is that we only have ONE sorting processor in the\n    // entire pipeline and that's why I'm displaying a warning here\n    let processor;\n\n    // A sort process is already registered\n    if (processors.length > 0) {\n      processor = processors[0];\n    } else {\n      // let's create a new sort processor\n\n      // this event listener is here because\n      // we want to subscribe to the sort store only once\n      this.updateSortProcessorFn = this.updateSortProcessor.bind(this);\n      this.store.on('updated', this.updateSortProcessorFn);\n\n      if (processorType === ProcessorType.ServerSort) {\n        processor = new ServerSort({\n          columns: this.store.state,\n          ...this.config.sort.server,\n        });\n      } else {\n        processor = new NativeSort({\n          columns: this.store.state,\n        });\n      }\n\n      this.config.pipeline.register(processor);\n    }\n\n    return processor;\n  }\n\n  changeDirection(e: JSX.TargetedMouseEvent<HTMLButtonElement>): void {\n    e.preventDefault();\n    e.stopPropagation();\n\n    // to sort two or more columns at the same time\n    this.actions.sortToggle(\n      this.props.index,\n      e.shiftKey === true && this.config.sort.multiColumn,\n      this.props.compare,\n    );\n  }\n\n  render() {\n    if (!this.props.enabled) {\n      return null;\n    }\n\n    const direction = this.state.direction;\n    let sortClassName = 'neutral';\n\n    if (direction === 1) {\n      sortClassName = 'asc';\n    } else if (direction === -1) {\n      sortClassName = 'desc';\n    }\n\n    return (\n      <button\n        // because the corresponding <th> has tabIndex=0\n        tabIndex={-1}\n        aria-label={this._(`sort.sort${direction === 1 ? 'Desc' : 'Asc'}`)}\n        title={this._(`sort.sort${direction === 1 ? 'Desc' : 'Asc'}`)}\n        className={classJoin(\n          className('sort'),\n          className('sort', sortClassName),\n          this.config.className.sort,\n        )}\n        onClick={this.changeDirection.bind(this)}\n      />\n    );\n  }\n}\n","import { h, RefObject } from 'preact';\nimport { classJoin, className } from '../../../util/className';\nimport { BaseComponent } from '../../base';\nimport { TColumn } from '../../../types';\nimport { TH } from '../../table/th';\nimport { throttle } from '../../../util/throttle';\n\ntype ResizeProps = {\n  column: TColumn;\n  thRef: RefObject<TH>;\n};\n\ntype ResizeState = {\n  width: string;\n  offsetStart: number;\n};\n\nexport class Resize extends BaseComponent<ResizeProps, ResizeState> {\n  private moveFn: (e) => void;\n  private upFn: (e) => void;\n\n  private getPageX(e: MouseEvent | TouchEvent): number {\n    if (e instanceof MouseEvent) {\n      return Math.floor(e.pageX);\n    } else {\n      return Math.floor(e.changedTouches[0].pageX);\n    }\n  }\n\n  private start(e: MouseEvent | TouchEvent): void {\n    e.stopPropagation();\n\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore\n    const thElement: HTMLElement = this.props.thRef.current;\n\n    this.setState({\n      offsetStart: parseInt(thElement.style.width, 10) - this.getPageX(e),\n    });\n\n    this.upFn = this.end.bind(this);\n    this.moveFn = throttle(this.move.bind(this), 10);\n\n    document.addEventListener('mouseup', this.upFn);\n    document.addEventListener('touchend', this.upFn);\n    document.addEventListener('mousemove', this.moveFn);\n    document.addEventListener('touchmove', this.moveFn);\n  }\n\n  private move(e: MouseEvent | TouchEvent): void {\n    e.stopPropagation();\n\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore\n    const thElement: HTMLElement = this.props.thRef.current;\n\n    if (\n      this.state.offsetStart + this.getPageX(e) >=\n      parseInt(thElement.style.minWidth, 10)\n    ) {\n      thElement.style.width = `${this.state.offsetStart + this.getPageX(e)}px`;\n    }\n  }\n\n  private end(e: MouseEvent | TouchEvent): void {\n    e.stopPropagation();\n\n    document.removeEventListener('mouseup', this.upFn);\n    document.removeEventListener('mousemove', this.moveFn);\n    document.removeEventListener('touchmove', this.moveFn);\n    document.removeEventListener('touchend', this.upFn);\n  }\n\n  render() {\n    return (\n      <div\n        className={classJoin(className('th'), className('resizable'))}\n        onMouseDown={this.start.bind(this)}\n        onTouchStart={this.start.bind(this)}\n        onClick={(e) => e.stopPropagation()}\n      />\n    );\n  }\n}\n","export const throttle = (fn: (...args) => void, wait = 100) => {\n  let inThrottle: boolean;\n  let lastFn: ReturnType<typeof setTimeout>;\n  let lastTime: number;\n\n  return (...args) => {\n    if (!inThrottle) {\n      fn(...args);\n      lastTime = Date.now();\n      inThrottle = true;\n    } else {\n      clearTimeout(lastFn);\n      lastFn = setTimeout(() => {\n        if (Date.now() - lastTime >= wait) {\n          fn(...args);\n          lastTime = Date.now();\n        }\n      }, Math.max(wait - (Date.now() - lastTime), 0));\n    }\n  };\n};\n","import { ComponentChild, createRef, h, JSX } from 'preact';\n\nimport { BaseComponent, BaseProps } from '../base';\nimport { classJoin, className } from '../../util/className';\nimport { CSSDeclaration, TColumn } from '../../types';\nimport { Sort } from '../plugin/sort/sort';\nimport { PluginRenderer } from '../../plugin';\nimport { JSXInternal } from 'preact/src/jsx';\nimport { Resize } from '../plugin/resize/resize';\n\nexport interface THProps\n  extends BaseProps,\n    JSX.HTMLAttributes<HTMLTableCellElement> {\n  index: number;\n  column: TColumn;\n  style?: CSSDeclaration;\n}\n\nexport interface THState {\n  style: CSSDeclaration;\n}\n\nexport class TH extends BaseComponent<THProps, THState> {\n  private sortRef = createRef();\n  private thRef = createRef();\n\n  constructor(props, context) {\n    super(props, context);\n\n    this.state = {\n      style: {},\n    };\n  }\n\n  private isSortable(): boolean {\n    return this.props.column.sort.enabled;\n  }\n\n  private isResizable(): boolean {\n    return this.props.column.resizable;\n  }\n\n  private onClick(e: JSX.TargetedMouseEvent<HTMLInputElement>): void {\n    e.stopPropagation();\n\n    if (this.isSortable()) {\n      this.sortRef.current.changeDirection(e);\n    }\n  }\n\n  private keyDown(e: JSX.TargetedMouseEvent<HTMLInputElement>): void {\n    if (this.isSortable() && e.which === 13) {\n      this.onClick(e);\n    }\n  }\n\n  componentDidMount(): void {\n    setTimeout(() => {\n      // sets the `top` style if the current TH is fixed\n      if (this.props.column.fixedHeader && this.thRef.current) {\n        const offsetTop = this.thRef.current.offsetTop;\n\n        if (typeof offsetTop === 'number') {\n          this.setState({\n            style: {\n              top: offsetTop,\n            },\n          });\n        }\n      }\n    }, 0);\n  }\n\n  private content(): ComponentChild {\n    if (this.props.column.name !== undefined) {\n      return this.props.column.name;\n    }\n\n    if (this.props.column.plugin !== undefined) {\n      return (\n        <PluginRenderer\n          pluginId={this.props.column.plugin.id}\n          props={{\n            column: this.props.column,\n          }}\n        />\n      );\n    }\n\n    return null;\n  }\n\n  private getCustomAttributes(): JSXInternal.HTMLAttributes<HTMLTableCellElement> {\n    const column = this.props.column;\n\n    if (!column) return {};\n\n    if (typeof column.attributes === 'function') {\n      return column.attributes(null, null, this.props.column);\n    } else {\n      return column.attributes;\n    }\n  }\n\n  render() {\n    const props = {};\n\n    if (this.isSortable()) {\n      props['tabIndex'] = 0;\n    }\n\n    return (\n      <th\n        ref={this.thRef}\n        data-column-id={this.props.column && this.props.column.id}\n        className={classJoin(\n          className('th'),\n          this.isSortable() ? className('th', 'sort') : null,\n          this.props.column.fixedHeader ? className('th', 'fixed') : null,\n          this.config.className.th,\n        )}\n        onClick={this.onClick.bind(this)}\n        style={{\n          ...this.config.style.th,\n          ...{\n            minWidth: this.props.column.minWidth,\n            width: this.props.column.width,\n          },\n          ...this.state.style,\n          ...this.props.style,\n        }}\n        onKeyDown={this.keyDown.bind(this)}\n        rowSpan={this.props.rowSpan > 1 ? this.props.rowSpan : undefined}\n        colSpan={this.props.colSpan > 1 ? this.props.colSpan : undefined}\n        {...this.getCustomAttributes()}\n        {...props}\n      >\n        <div className={className('th', 'content')}>{this.content()}</div>\n        {this.isSortable() && (\n          <Sort\n            ref={this.sortRef}\n            index={this.props.index}\n            {...this.props.column.sort}\n          />\n        )}\n        {this.isResizable() &&\n          this.props.index < this.config.header.visibleColumns.length - 1 && (\n            <Resize column={this.props.column} thRef={this.thRef} />\n          )}\n      </th>\n    );\n  }\n}\n","import { ComponentChild, h } from 'preact';\n\nimport { TR } from './tr';\nimport { BaseComponent, BaseProps } from '../base';\nimport { TH } from './th';\nimport { classJoin, className } from '../../util/className';\nimport Header from '../../header';\nimport { TColumn } from '../../types';\nimport { calculateRowColSpans } from '../../util/table';\n\ninterface THeadProps extends BaseProps {\n  header: Header;\n}\n\nexport class THead extends BaseComponent<THeadProps> {\n  private renderColumn(\n    column: TColumn,\n    rowIndex: number,\n    columnIndex: number,\n    totalRows: number,\n  ): ComponentChild {\n    const { rowSpan, colSpan } = calculateRowColSpans(\n      column,\n      rowIndex,\n      totalRows,\n    );\n\n    return (\n      <TH\n        column={column}\n        index={columnIndex}\n        colSpan={colSpan}\n        rowSpan={rowSpan}\n      />\n    );\n  }\n\n  private renderRow(\n    row: TColumn[],\n    rowIndex: number,\n    totalRows: number,\n  ): ComponentChild {\n    // because the only sortable columns are leaf columns (not parents)\n    const leafColumns = Header.leafColumns(this.props.header.columns);\n\n    return (\n      <TR>\n        {row.map((col) => {\n          if (col.hidden) return null;\n\n          return this.renderColumn(\n            col,\n            rowIndex,\n            leafColumns.indexOf(col),\n            totalRows,\n          );\n        })}\n      </TR>\n    );\n  }\n\n  private renderRows(): ComponentChild {\n    const rows = Header.tabularFormat(this.props.header.columns);\n\n    return rows.map((row, rowIndex) =>\n      this.renderRow(row, rowIndex, rows.length),\n    );\n  }\n\n  render() {\n    if (this.props.header) {\n      return (\n        <thead\n          key={this.props.header.id}\n          className={classJoin(className('thead'), this.config.className.thead)}\n        >\n          {this.renderRows()}\n        </thead>\n      );\n    }\n\n    return null;\n  }\n}\n","import { TColumn } from '../types';\nimport Header from '../header';\n\nexport function calculateRowColSpans(\n  column: TColumn,\n  rowIndex: number,\n  totalRows: number,\n): { rowSpan: number; colSpan: number } {\n  const depth = Header.maximumDepth(column);\n  const remainingRows = totalRows - rowIndex;\n  const rowSpan = Math.floor(remainingRows - depth - depth / remainingRows);\n  const colSpan = (column.columns && column.columns.length) || 1;\n\n  return {\n    rowSpan: rowSpan,\n    colSpan: colSpan,\n  };\n}\n","import { h } from 'preact';\n\nimport Tabular from '../../tabular';\nimport { TBody } from './tbody';\nimport { THead } from './thead';\nimport { BaseComponent, BaseProps } from '../base';\nimport Header from '../../header';\nimport { classJoin, className } from '../../util/className';\nimport { Status } from '../../types';\n\ninterface TableProps extends BaseProps {\n  data: Tabular;\n  status: Status;\n  header?: Header;\n  width: string;\n  height: string;\n}\n\nexport class Table extends BaseComponent<TableProps> {\n  render() {\n    return (\n      <table\n        role=\"grid\"\n        className={classJoin(className('table'), this.config.className.table)}\n        style={{\n          ...this.config.style.table,\n          ...{\n            height: this.props.height,\n          },\n        }}\n      >\n        <THead header={this.props.header} />\n        <TBody\n          data={this.props.data}\n          status={this.props.status}\n          header={this.props.header}\n        />\n      </table>\n    );\n  }\n}\n","import { createRef, h } from 'preact';\n\nimport { BaseComponent } from './base';\nimport { classJoin, className } from '../util/className';\nimport { PluginPosition, PluginRenderer } from '../plugin';\n\ninterface HeaderContainerState {\n  isActive: boolean;\n}\n\nexport class HeaderContainer extends BaseComponent<\n  Record<string, any>,\n  HeaderContainerState\n> {\n  private headerRef = createRef();\n\n  constructor(props, context) {\n    super(props, context);\n\n    this.state = {\n      isActive: true,\n    };\n  }\n\n  componentDidMount() {\n    if (this.headerRef.current.children.length === 0) {\n      this.setState({\n        isActive: false,\n      });\n    }\n  }\n\n  render() {\n    if (this.state.isActive) {\n      return (\n        <div\n          ref={this.headerRef}\n          className={classJoin(className('head'), this.config.className.header)}\n          style={{ ...this.config.style.header }}\n        >\n          <PluginRenderer position={PluginPosition.Header} />\n        </div>\n      );\n    }\n\n    return null;\n  }\n}\n","import { createRef, h } from 'preact';\n\nimport { BaseComponent } from './base';\nimport { classJoin, className } from '../util/className';\nimport { PluginPosition, PluginRenderer } from '../plugin';\n\ninterface FooterContainerState {\n  isActive: boolean;\n}\n\nexport class FooterContainer extends BaseComponent<\n  Record<string, any>,\n  FooterContainerState\n> {\n  private footerRef = createRef();\n\n  constructor(props, context) {\n    super(props, context);\n\n    this.state = {\n      isActive: true,\n    };\n  }\n\n  componentDidMount() {\n    if (this.footerRef.current.children.length === 0) {\n      this.setState({\n        isActive: false,\n      });\n    }\n  }\n\n  render() {\n    if (this.state.isActive) {\n      return (\n        <div\n          ref={this.footerRef}\n          className={classJoin(\n            className('footer'),\n            this.config.className.footer,\n          )}\n          style={{ ...this.config.style.footer }}\n        >\n          <PluginRenderer position={PluginPosition.Footer} />\n        </div>\n      );\n    }\n\n    return null;\n  }\n}\n","import { h, createContext, Context } from 'preact';\n\nimport Tabular from '../tabular';\nimport { BaseComponent, BaseProps } from './base';\nimport { classJoin, className } from '../util/className';\nimport { Status } from '../types';\nimport { Table } from './table/table';\nimport { HeaderContainer } from './headerContainer';\nimport { FooterContainer } from './footerContainer';\nimport Pipeline from '../pipeline/pipeline';\nimport Header from '../header';\nimport { Config } from '../config';\nimport log from '../util/log';\nimport { PipelineProcessor } from '../pipeline/processor';\n\ninterface ContainerProps extends BaseProps {\n  config: Config;\n  pipeline: Pipeline<Tabular>;\n  header?: Header;\n  width: string;\n  height: string;\n}\n\ninterface ContainerState {\n  status: Status;\n  header?: Header;\n  data?: Tabular;\n}\n\nexport class Container extends BaseComponent<ContainerProps, ContainerState> {\n  private readonly configContext: Context<Config>;\n  private processPipelineFn: (processor: PipelineProcessor<any, any>) => void;\n\n  constructor(props, context) {\n    super(props, context);\n\n    // global Config context which is passed to all components\n    this.configContext = createContext(null);\n\n    this.state = {\n      status: Status.Loading,\n      header: props.header,\n      data: null,\n    };\n  }\n\n  private async processPipeline() {\n    this.props.config.eventEmitter.emit('beforeLoad');\n\n    this.setState({\n      status: Status.Loading,\n    });\n\n    try {\n      const data = await this.props.pipeline.process();\n      this.setState({\n        data: data,\n        status: Status.Loaded,\n      });\n\n      this.props.config.eventEmitter.emit('load', data);\n    } catch (e) {\n      log.error(e);\n\n      this.setState({\n        status: Status.Error,\n        data: null,\n      });\n    }\n  }\n\n  async componentDidMount() {\n    const config = this.props.config;\n\n    // for the initial load\n    await this.processPipeline();\n\n    if (config.header && this.state.data && this.state.data.length) {\n      // now that we have the data, let's adjust columns width\n      // NOTE: that we only calculate the columns width once\n      this.setState({\n        header: config.header.adjustWidth(config),\n      });\n    }\n\n    this.processPipelineFn = this.processPipeline.bind(this);\n    this.props.pipeline.on('updated', this.processPipelineFn);\n  }\n\n  componentWillUnmount(): void {\n    this.props.pipeline.off('updated', this.processPipelineFn);\n  }\n\n  componentDidUpdate(\n    _: Readonly<ContainerProps>,\n    previousState: Readonly<ContainerState>,\n  ): void {\n    // we can't jump to the Status.Rendered if previous status is not Status.Loaded\n    if (\n      previousState.status != Status.Rendered &&\n      this.state.status == Status.Loaded\n    ) {\n      this.setState({\n        status: Status.Rendered,\n      });\n\n      this.props.config.eventEmitter.emit('ready');\n    }\n  }\n\n  render() {\n    const configContext = this.configContext;\n\n    return (\n      <configContext.Provider value={this.props.config}>\n        <div\n          role=\"complementary\"\n          className={classJoin(\n            'gridjs',\n            className('container'),\n            this.state.status === Status.Loading ? className('loading') : null,\n            this.props.config.className.container,\n          )}\n          style={{\n            ...this.props.config.style.container,\n            ...{\n              width: this.props.width,\n            },\n          }}\n        >\n          {this.state.status === Status.Loading && (\n            <div className={className('loading-bar')} />\n          )}\n\n          <HeaderContainer />\n\n          <div\n            className={className('wrapper')}\n            style={{ height: this.props.height }}\n          >\n            <Table\n              ref={this.props.config.tableRef}\n              data={this.state.data}\n              header={this.state.header}\n              width={this.props.width}\n              height={this.props.height}\n              status={this.state.status}\n            />\n          </div>\n\n          <FooterContainer />\n\n          <div\n            ref={this.props.config.tempRef}\n            id=\"gridjs-temp\"\n            className={className('temp')}\n          />\n        </div>\n      </configContext.Provider>\n    );\n  }\n}\n","import { Config, UserConfig } from './config';\nimport { h, render, VNode } from 'preact';\nimport { Container } from './view/container';\nimport log from './util/log';\nimport { EventEmitter } from './util/eventEmitter';\nimport { GridEvents } from './events';\nimport { PluginManager } from './plugin';\n\nclass Grid extends EventEmitter<GridEvents> {\n  public config: Config;\n  public plugin: PluginManager;\n\n  constructor(userConfig?: UserConfig) {\n    super();\n    this.config = new Config({ instance: this, eventEmitter: this }).update(\n      userConfig,\n    );\n    this.plugin = this.config.plugin;\n  }\n\n  public updateConfig(userConfig: Partial<UserConfig>): this {\n    this.config.update(userConfig);\n    return this;\n  }\n\n  createElement(): VNode {\n    return h(Container, {\n      config: this.config,\n      pipeline: this.config.pipeline,\n      header: this.config.header,\n      width: this.config.width,\n      height: this.config.height,\n    });\n  }\n\n  /**\n   * Uses the existing container and tries to clear the cache\n   * and re-render the existing Grid.js instance again. This is\n   * useful when a new config is set/updated.\n   *\n   */\n  forceRender(): this {\n    if (!this.config || !this.config.container) {\n      log.error(\n        'Container is empty. Make sure you call render() before forceRender()',\n        true,\n      );\n    }\n\n    // clear the pipeline cache\n    this.config.pipeline.clearCache();\n\n    // TODO: not sure if it's a good idea to render a null element but I couldn't find a better way\n    render(null, this.config.container);\n    render(this.createElement(), this.config.container);\n\n    return this;\n  }\n\n  /**\n   * Mounts the Grid.js instance to the container\n   * and renders the instance\n   *\n   * @param container\n   */\n  render(container: Element): this {\n    if (!container) {\n      log.error('Container element cannot be null', true);\n    }\n\n    if (container.childNodes.length > 0) {\n      log.error(\n        `The container element ${container} is not empty. Make sure the container is empty and call render() again`,\n      );\n      return this;\n    }\n\n    this.config.container = container;\n    render(this.createElement(), container);\n\n    return this;\n  }\n}\n\nexport default Grid;\n","import{options as n}from\"preact\";var t,r,u,i,o=0,c=[],f=[],e=n.__b,a=n.__r,v=n.diffed,l=n.__c,m=n.unmount;function d(t,u){n.__h&&n.__h(r,t,o||u),o=0;var i=r.__H||(r.__H={__:[],__h:[]});return t>=i.__.length&&i.__.push({__V:f}),i.__[t]}function p(n){return o=1,y(z,n)}function y(n,u,i){var o=d(t++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):z(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}))}],o.__c=r,!r.u)){r.u=!0;var c=r.shouldComponentUpdate;r.shouldComponentUpdate=function(n,t,r){if(!o.__c.__H)return!0;var u=o.__c.__H.__.filter(function(n){return n.__c});if(u.every(function(n){return!n.__N}))return!c||c.call(this,n,t,r);var i=!1;return u.forEach(function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0)}}),!!i&&(!c||c.call(this,n,t,r))}}return o.__N||o.__}function h(u,i){var o=d(t++,3);!n.__s&&w(o.__H,i)&&(o.__=u,o.i=i,r.__H.__h.push(o))}function s(u,i){var o=d(t++,4);!n.__s&&w(o.__H,i)&&(o.__=u,o.i=i,r.__h.push(o))}function _(n){return o=5,F(function(){return{current:n}},[])}function A(n,t,r){o=6,s(function(){return\"function\"==typeof n?(n(t()),function(){return n(null)}):n?(n.current=t(),function(){return n.current=null}):void 0},null==r?r:r.concat(n))}function F(n,r){var u=d(t++,7);return w(u.__H,r)?(u.__V=n(),u.i=r,u.__h=n,u.__V):u.__}function T(n,t){return o=8,F(function(){return n},t)}function q(n){var u=r.context[n.__c],i=d(t++,9);return i.c=n,u?(null==i.__&&(i.__=!0,u.sub(r)),u.props.value):n.__}function x(t,r){n.useDebugValue&&n.useDebugValue(r?r(t):t)}function V(n){var u=d(t++,10),i=p();return u.__=n,r.componentDidCatch||(r.componentDidCatch=function(n){u.__&&u.__(n),i[1](n)}),[i[0],function(){i[1](void 0)}]}function b(){for(var t;t=c.shift();)if(t.__P&&t.__H)try{t.__H.__h.forEach(j),t.__H.__h.forEach(k),t.__H.__h=[]}catch(r){t.__H.__h=[],n.__e(r,t.__v)}}n.__b=function(n){r=null,e&&e(n)},n.__r=function(n){a&&a(n),t=0;var i=(r=n.__c).__H;i&&(u===r?(i.__h=[],r.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.__V=f,n.__N=n.i=void 0})):(i.__h.forEach(j),i.__h.forEach(k),i.__h=[])),u=r},n.diffed=function(t){v&&v(t);var o=t.__c;o&&o.__H&&(o.__H.__h.length&&(1!==c.push(o)&&i===n.requestAnimationFrame||((i=n.requestAnimationFrame)||function(n){var t,r=function(){clearTimeout(u),g&&cancelAnimationFrame(t),setTimeout(n)},u=setTimeout(r,100);g&&(t=requestAnimationFrame(r))})(b)),o.__H.__.forEach(function(n){n.i&&(n.__H=n.i),n.__V!==f&&(n.__=n.__V),n.i=void 0,n.__V=f})),u=r=null},n.__c=function(t,r){r.some(function(t){try{t.__h.forEach(j),t.__h=t.__h.filter(function(n){return!n.__||k(n)})}catch(u){r.some(function(n){n.__h&&(n.__h=[])}),r=[],n.__e(u,t.__v)}}),l&&l(t,r)},n.unmount=function(t){m&&m(t);var r,u=t.__c;u&&u.__H&&(u.__H.__.forEach(function(n){try{j(n)}catch(n){r=n}}),r&&n.__e(r,u.__v))};var g=\"function\"==typeof requestAnimationFrame;function j(n){var t=r,u=n.__c;\"function\"==typeof u&&(n.__c=void 0,u()),r=t}function k(n){var t=r;n.__c=n.__(),r=t}function w(n,t){return!n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function z(n,t){return\"function\"==typeof t?t(n):t}export{p as useState,y as useReducer,h as useEffect,s as useLayoutEffect,_ as useRef,A as useImperativeHandle,F as useMemo,T as useCallback,q as useContext,x as useDebugValue,V as useErrorBoundary};\n//# sourceMappingURL=hooks.module.js.map\n"],"names":["n","l","u","i","t","o","r","f","e","c","s","a","parentNode","removeChild","h","arguments","length","children","call","defaultProps","v","type","props","key","ref","__k","__","__b","__e","__d","__c","__h","constructor","__v","vnode","y","current","p","d","this","context","_","indexOf","k","base","b","push","g","__r","debounceRendering","setTimeout","sort","some","__P","j","__n","ownerSVGElement","z","w","x","C","Array","isArray","m","A","N","M","appendChild","nextSibling","insertBefore","$","setProperty","test","H","style","cssText","replace","toLowerCase","slice","addEventListener","T","I","removeEventListener","setAttribute","removeAttribute","event","contextType","value","__E","prototype","render","O","sub","state","__s","getDerivedStateFromProps","componentWillMount","componentDidMount","componentWillReceiveProps","shouldComponentUpdate","forEach","componentWillUpdate","componentDidUpdate","getChildContext","getSnapshotBeforeUpdate","L","diffed","localName","nodeType","document","createTextNode","createElementNS","createElement","is","data","childNodes","dangerouslySetInnerHTML","attributes","name","__html","innerHTML","checked","unmount","componentWillUnmount","P","firstChild","generateUUID","Math","random","toString","getDerivedStateFromError","setState","componentDidCatch","forceUpdate","Base","id","_id","ProcessorType","search","placeholder","sortAsc","sortDesc","pagination","previous","next","navigate","page","pages","showing","of","to","results","loading","noRecordsFound","error","Translator","language","_language","_defaultLanguage","enUS","getString","message","lang","splitted","split","val","join","translate","args","messageFormat","BaseComponent","Component","translator","super","config","keys","Object","getConfig","HTMLElement","parentElement","content","html","Cell","update","cast","outerHTML","Row","cells","_cells","cell","index","toArray","map","static","Tabular","rows","_rows","_length","len","row","fromCells","oneDtoTwoD","EventEmitter","callbacks","init","on","listener","off","eventName","filter","emit","PipelineProcessor","_props","setProps","process","validateProps","Function","result","_process","assign","GlobalSearchFilter","Filter","keyword","String","trim","columns","ignoreHiddenColumns","tabular","selector","rowIndex","cellIndex","hidden","element","RegExp","className","reduce","prev","cur","classJoin","classNames","BaseStore","dispatcher","_state","getInitialState","register","_handle","bind","action","handle","payload","newState","prevState","SearchStore","BaseActions","dispatch","SearchActions","ServerGlobalSearchFilter","ServerFilter","options","updates","url","body","PluginPosition","Status","format","toUpperCase","throwException","msg","Error","console","warn","info","PluginBaseComponent","PluginManager","plugins","get","add","plugin","log","remove","splice","list","position","undefined","order","PluginRenderer","pluginId","Fragment","component","Search","searchProcessor","actions","store","storeUpdatedFn","enabled","storeUpdated","server","header","pipeline","unregister","onChange","target","onInput","func","waitFor","timeout","Promise","resolve","clearTimeout","debounce","debounceTimeout","PaginationLimit","isNaN","Number","limit","Limit","ServerPaginationLimit","ServerLimit","Pagination","processor","onUpdateFn","setTotalFromTabularFn","total","setTotalFromTabular","setTotal","onUpdate","resetPageOnUpdate","setPage","ceil","totalRows","renderPages","buttonsCount","maxCount","min","pagePivot","floor","tabIndex","role","onClick","title","paginationButton","from","paginationButtonCurrent","renderSummary","summary","paginationSummary","prevButton","disabled","paginationButtonPrev","nextButton","paginationButtonNext","width","containerWidth","parseInt","px","ShadowTable","tableElement","tableClassName","tableStyle","tableRef","cloneNode","zIndex","visibility","widths","tableLayout","padding","margin","border","outline","obj","querySelectorAll","clientWidth","getAttribute","minWidth","nodeElement","camelCase","str","words","word","charAt","Header","_columns","visibleColumns","adjustWidth","container","tempRef","autoWidth","shadowTable","el","column","tabularFormat","concat","setSort","userConfig","cols","setFixedHeader","fixedHeader","setResizable","resizable","setID","logger","populatePlugins","isValidElement","typedColumn","fromColumns","fromHTMLTable","ths","querySelector","th","nextRow","col","leafColumns","Dispatcher","_callbacks","_isDispatching","_isHandled","_isPending","_lastID","_pendingPayload","callback","ids","ii","_invokeCallback","_startDispatching","_stopDispatching","isDispatching","Storage","MemoryStorage","set","async","ServerStorage","handler","response","ok","json","status","statusText","opts","fetch","then","res","StorageUtils","storage","tableElementToArray","display","arr","parsedRow","Node","TEXT_NODE","DOMParser","parseFromString","documentElement","textContent","Pipeline","steps","_steps","Map","cache","lastProcessorIndexUpdated","step","clearCache","priority","processorPropsUpdated","addProcessorByPriority","afterRegistered","subSteps","proc","newSubStep","first","second","getSortedProcessorTypes","getStepsByType","findProcessorIndexByID","processorID","findIndex","setLastProcessorIndex","processorIndex","StorageExtractor","Extractor","ArrayToTabularTransformer","Transformer","arrayResponse","fromArray","ServerInitiator","Initiator","entries","serverStorageOptions","acc","StorageResponseToArrayTransformer","castData","pad","storageResponse","PipelineUtils","Config","_userConfig","defaultConfig","updatedConfig","fromUserConfig","height","multiColumn","createFromUserConfig","createFromConfig","Footer","TD","formatter","handleClick","messageCell","eventEmitter","getCustomAttributes","colSpan","td","TR","getColumn","messageRow","getChildren","tr","MessageRow","TBody","headerLength","tbody","Loading","Rendered","notfound","NativeSort","condition","direction","Sort","compare","cellA","cellB","compareWrapper","cmp","sortedRows","sorted","SortStore","multi","sortColumn","sortToggle","find","count","reset","SortActions","ServerSort","sortProcessor","updateStateFn","updateSortProcessorFn","getOrCreateSortProcessor","updateState","currentColumn","updateSortProcessor","sortedColumns","processorType","processors","changeDirection","preventDefault","stopPropagation","shiftKey","sortClassName","Resize","moveFn","upFn","getPageX","MouseEvent","pageX","changedTouches","start","offsetStart","thRef","end","fn","wait","inThrottle","lastFn","lastTime","Date","now","max","throttle","move","thElement","onMouseDown","onTouchStart","TH","sortRef","isSortable","isResizable","keyDown","which","offsetTop","top","onKeyDown","rowSpan","THead","renderColumn","columnIndex","depth","maximumDepth","remainingRows","calculateRowColSpans","renderRow","renderRows","thead","Table","table","HeaderContainer","headerRef","isActive","FooterContainer","footerRef","footer","Container","configContext","processPipelineFn","Consumer","Provider","createContext","Loaded","processPipeline","previousState","Grid","instance","updateConfig","forceRender","__H","__V","F","shift","__N","requestAnimationFrame","cancelAnimationFrame"],"mappings":"gNAAA,IAAIA,EAAEC,EAAEC,EAAEC,EAAEC,EAAEC,EAAEC,EAAEC,EAAE,GAAGC,EAAE,GAAGC,EAAE,oEAAoE,SAASC,EAAEV,EAAEC,GAAG,IAAI,IAAIC,KAAKD,EAAED,EAAEE,GAAGD,EAAEC,GAAG,OAAOF,CAAC,CAAC,SAASW,EAAEX,GAAG,IAAIC,EAAED,EAAEY,WAAWX,GAAGA,EAAEY,YAAYb,EAAE,CAAC,SAASc,EAAEb,EAAEC,EAAEC,GAAG,IAAIC,EAAEC,EAAEC,EAAEC,EAAE,GAAG,IAAID,KAAKJ,EAAE,OAAOI,EAAEF,EAAEF,EAAEI,GAAG,OAAOA,EAAED,EAAEH,EAAEI,GAAGC,EAAED,GAAGJ,EAAEI,GAAG,GAAGS,UAAUC,OAAO,IAAIT,EAAEU,SAASF,UAAUC,OAAO,EAAEhB,EAAEkB,KAAKH,UAAU,GAAGZ,GAAG,mBAAmBF,GAAG,MAAMA,EAAEkB,aAAa,IAAIb,KAAKL,EAAEkB,kBAAa,IAASZ,EAAED,KAAKC,EAAED,GAAGL,EAAEkB,aAAab,IAAI,OAAOc,EAAEnB,EAAEM,EAAEH,EAAEC,EAAE,KAAK,CAAC,SAASe,EAAEpB,EAAEG,EAAEC,EAAEC,EAAEC,GAAG,IAAIC,EAAE,CAACc,KAAKrB,EAAEsB,MAAMnB,EAAEoB,IAAInB,EAAEoB,IAAInB,EAAEoB,IAAI,KAAKC,GAAG,KAAKC,IAAI,EAAEC,IAAI,KAAKC,SAAI,EAAOC,IAAI,KAAKC,IAAI,KAAKC,iBAAY,EAAOC,IAAI,MAAM3B,IAAIJ,EAAEI,GAAG,OAAO,MAAMA,GAAG,MAAML,EAAEiC,OAAOjC,EAAEiC,MAAM3B,GAAGA,CAAC,CAAC,SAAS4B,IAAI,MAAM,CAACC,QAAQ,KAAK,CAAC,SAASC,EAAErC,GAAG,OAAOA,EAAEiB,QAAQ,CAAC,SAASqB,EAAEtC,EAAEC,GAAGsC,KAAKjB,MAAMtB,EAAEuC,KAAKC,QAAQvC,CAAC,CAAC,SAASwC,EAAEzC,EAAEC,GAAG,GAAG,MAAMA,EAAE,OAAOD,EAAE0B,GAAGe,EAAEzC,EAAE0B,GAAG1B,EAAE0B,GAAGD,IAAIiB,QAAQ1C,GAAG,GAAG,KAAK,IAAI,IAAIE,EAAED,EAAED,EAAEyB,IAAIT,OAAOf,IAAI,GAAG,OAAOC,EAAEF,EAAEyB,IAAIxB,KAAK,MAAMC,EAAE0B,IAAI,OAAO1B,EAAE0B,IAAI,MAAM,mBAAmB5B,EAAEqB,KAAKoB,EAAEzC,GAAG,IAAI,CAAC,SAAS2C,EAAE3C,GAAG,IAAIC,EAAEC,EAAE,GAAG,OAAOF,EAAEA,EAAE0B,KAAK,MAAM1B,EAAE8B,IAAI,CAAC,IAAI9B,EAAE4B,IAAI5B,EAAE8B,IAAIc,KAAK,KAAK3C,EAAE,EAAEA,EAAED,EAAEyB,IAAIT,OAAOf,IAAI,GAAG,OAAOC,EAAEF,EAAEyB,IAAIxB,KAAK,MAAMC,EAAE0B,IAAI,CAAC5B,EAAE4B,IAAI5B,EAAE8B,IAAIc,KAAK1C,EAAE0B,IAAI,KAAK,CAAC,OAAOe,EAAE3C,EAAE,CAAC,CAAC,SAAS6C,EAAE7C,KAAKA,EAAE6B,MAAM7B,EAAE6B,KAAI,IAAKzB,EAAE0C,KAAK9C,KAAK+C,EAAEC,OAAO3C,IAAIJ,EAAEgD,sBAAsB5C,EAAEJ,EAAEgD,oBAAoBC,YAAYH,EAAE,CAAC,SAASA,IAAI,IAAI,IAAI/C,EAAE+C,EAAEC,IAAI5C,EAAEY,QAAQhB,EAAEI,EAAE+C,KAAK,SAASnD,EAAEC,GAAG,OAAOD,EAAEiC,IAAIN,IAAI1B,EAAEgC,IAAIN,GAAG,GAAGvB,EAAE,GAAGJ,EAAEoD,KAAK,SAASpD,GAAG,IAAIC,EAAEC,EAAEC,EAAEC,EAAEC,EAAEC,EAAEN,EAAE6B,MAAMxB,GAAGD,GAAGH,EAAED,GAAGiC,KAAKL,KAAKtB,EAAEL,EAAEoD,OAAOnD,EAAE,IAAIC,EAAEO,EAAE,GAAGN,IAAI6B,IAAI7B,EAAE6B,IAAI,EAAEqB,EAAEhD,EAAEF,EAAED,EAAEF,EAAEsD,SAAI,IAASjD,EAAEkD,gBAAgB,MAAMpD,EAAE2B,IAAI,CAAC1B,GAAG,KAAKH,EAAE,MAAMG,EAAEoC,EAAErC,GAAGC,EAAED,EAAE2B,KAAK0B,EAAEvD,EAAEE,GAAGA,EAAEwB,KAAKvB,GAAGsC,EAAEvC,IAAI,EAAE,CAAC,SAASsD,EAAE1D,EAAEC,EAAEC,EAAEC,EAAEC,EAAEC,EAAEC,EAAEG,EAAEC,EAAEC,GAAG,IAAIG,EAAEqB,EAAEG,EAAEK,EAAEE,EAAEE,EAAEW,EAAEC,EAAExD,GAAGA,EAAEsB,KAAKjB,EAAEoD,EAAED,EAAE3C,OAAO,IAAId,EAAEuB,IAAI,GAAGX,EAAE,EAAEA,EAAEb,EAAEe,OAAOF,IAAI,GAAG,OAAO6B,EAAEzC,EAAEuB,IAAIX,GAAG,OAAO6B,EAAE1C,EAAEa,KAAK,kBAAkB6B,EAAE,KAAK,iBAAiBA,GAAG,iBAAiBA,GAAG,iBAAiBA,EAAEvB,EAAE,KAAKuB,EAAE,KAAK,KAAKA,GAAGkB,MAAMC,QAAQnB,GAAGvB,EAAEiB,EAAE,CAACpB,SAAS0B,GAAG,KAAK,KAAK,MAAMA,EAAEhB,IAAI,EAAEP,EAAEuB,EAAEtB,KAAKsB,EAAErB,MAAMqB,EAAEpB,IAAI,KAAKoB,EAAEV,KAAKU,GAAG,CAAC,GAAGA,EAAEjB,GAAGxB,EAAEyC,EAAEhB,IAAIzB,EAAEyB,IAAI,EAAE,QAAQW,EAAEqB,EAAE7C,KAAKwB,GAAGK,EAAEpB,KAAKe,EAAEf,KAAKoB,EAAEtB,OAAOiB,EAAEjB,KAAKsC,EAAE7C,QAAG,OAAY,IAAIqB,EAAE,EAAEA,EAAEyB,EAAEzB,IAAI,CAAC,IAAIG,EAAEqB,EAAExB,KAAKQ,EAAEpB,KAAKe,EAAEf,KAAKoB,EAAEtB,OAAOiB,EAAEjB,KAAK,CAACsC,EAAExB,QAAG,EAAO,KAAK,CAACG,EAAE,IAAI,CAACgB,EAAEtD,EAAE2C,EAAEL,EAAEA,GAAG/B,EAAEH,EAAEC,EAAEC,EAAEG,EAAEC,EAAEC,GAAGkC,EAAEF,EAAEf,KAAKO,EAAEQ,EAAEnB,MAAMc,EAAEd,KAAKW,IAAIuB,IAAIA,EAAE,IAAIpB,EAAEd,KAAKkC,EAAEZ,KAAKR,EAAEd,IAAI,KAAKmB,GAAGe,EAAEZ,KAAKX,EAAEQ,EAAEb,KAAKe,EAAEF,IAAI,MAAME,GAAG,MAAME,IAAIA,EAAEF,GAAG,mBAAmBF,EAAEtB,MAAMsB,EAAElB,MAAMa,EAAEb,IAAIkB,EAAEd,IAAInB,EAAEqD,EAAEpB,EAAEjC,EAAEV,GAAGU,EAAEsD,EAAEhE,EAAE2C,EAAEL,EAAEqB,EAAEd,EAAEnC,GAAG,mBAAmBR,EAAEmB,OAAOnB,EAAE2B,IAAInB,IAAIA,GAAG4B,EAAEV,KAAKlB,GAAGA,EAAEE,YAAYZ,IAAIU,EAAE+B,EAAEH,GAAG,CAAC,IAAIpC,EAAE0B,IAAImB,EAAEjC,EAAE8C,EAAE9C,KAAK,MAAM6C,EAAE7C,KAAK,mBAAmBZ,EAAEmB,MAAM,MAAMsC,EAAE7C,GAAGc,KAAK+B,EAAE7C,GAAGc,KAAK1B,EAAE2B,MAAM3B,EAAE2B,IAAIY,EAAEtC,EAAEW,EAAE,IAAImD,EAAEN,EAAE7C,GAAG6C,EAAE7C,KAAK,GAAG4C,EAAE,IAAI5C,EAAE,EAAEA,EAAE4C,EAAE1C,OAAOF,IAAIoD,EAAER,EAAE5C,GAAG4C,IAAI5C,GAAG4C,IAAI5C,GAAG,CAAC,SAASiD,EAAE/D,EAAEC,EAAEC,GAAG,IAAI,IAAIC,EAAEC,EAAEJ,EAAEyB,IAAIpB,EAAE,EAAED,GAAGC,EAAED,EAAEY,OAAOX,KAAKF,EAAEC,EAAEC,MAAMF,EAAEuB,GAAG1B,EAAEC,EAAE,mBAAmBE,EAAEkB,KAAK0C,EAAE5D,EAAEF,EAAEC,GAAG8D,EAAE9D,EAAEC,EAAEA,EAAEC,EAAED,EAAEyB,IAAI3B,IAAI,OAAOA,CAAC,CAAyH,SAAS+D,EAAEhE,EAAEC,EAAEC,EAAEC,EAAEC,EAAEC,GAAG,IAAIC,EAAEC,EAAEC,EAAE,QAAG,IAASP,EAAE4B,IAAIvB,EAAEL,EAAE4B,IAAI5B,EAAE4B,SAAI,OAAY,GAAG,MAAM3B,GAAGE,GAAGC,GAAG,MAAMD,EAAEQ,WAAWZ,EAAE,GAAG,MAAMK,GAAGA,EAAEO,aAAaZ,EAAEA,EAAEmE,YAAY/D,GAAGE,EAAE,SAAS,CAAC,IAAIC,EAAEF,EAAEG,EAAE,GAAGD,EAAEA,EAAE6D,cAAc5D,EAAEL,EAAEa,OAAOR,GAAG,EAAE,GAAGD,GAAGH,EAAE,MAAMJ,EAAEA,EAAEqE,aAAajE,EAAEC,GAAGC,EAAED,CAAC,CAAC,YAAO,IAASC,EAAEA,EAAEF,EAAEgE,WAAW,CAA4N,SAASE,EAAEtE,EAAEC,EAAEC,GAAG,MAAMD,EAAE,GAAGD,EAAEuE,YAAYtE,EAAEC,GAAGF,EAAEC,GAAG,MAAMC,EAAE,GAAG,iBAAiBA,GAAGO,EAAE+D,KAAKvE,GAAGC,EAAEA,EAAE,IAAI,CAAC,SAASuE,EAAEzE,EAAEC,EAAEC,EAAEC,EAAEC,GAAG,IAAIC,EAAEL,EAAE,GAAG,UAAUC,EAAE,GAAG,iBAAiBC,EAAEF,EAAE0E,MAAMC,QAAQzE,MAAM,CAAC,GAAG,iBAAiBC,IAAIH,EAAE0E,MAAMC,QAAQxE,EAAE,IAAIA,EAAE,IAAIF,KAAKE,EAAED,GAAGD,KAAKC,GAAGoE,EAAEtE,EAAE0E,MAAMzE,EAAE,IAAI,GAAGC,EAAE,IAAID,KAAKC,EAAEC,GAAGD,EAAED,KAAKE,EAAEF,IAAIqE,EAAEtE,EAAE0E,MAAMzE,EAAEC,EAAED,GAAG,MAAM,GAAG,MAAMA,EAAE,IAAI,MAAMA,EAAE,GAAGI,EAAEJ,KAAKA,EAAEA,EAAE2E,QAAQ,WAAW,KAAK3E,EAAEA,EAAE4E,gBAAgB7E,EAAEC,EAAE4E,cAAcC,MAAM,GAAG7E,EAAE6E,MAAM,GAAG9E,EAAEC,IAAID,EAAEC,EAAE,IAAID,EAAEC,EAAEA,EAAEI,GAAGH,EAAEA,EAAEC,GAAGH,EAAE+E,iBAAiB9E,EAAEI,EAAE2E,EAAEC,EAAE5E,GAAGL,EAAEkF,oBAAoBjF,EAAEI,EAAE2E,EAAEC,EAAE5E,QAAQ,GAAG,4BAA4BJ,EAAE,CAAC,GAAGG,EAAEH,EAAEA,EAAE2E,QAAQ,cAAc,KAAKA,QAAQ,SAAS,UAAU,GAAG,SAAS3E,GAAG,SAASA,GAAG,SAASA,GAAG,aAAaA,GAAG,aAAaA,GAAGA,KAAKD,EAAE,IAAIA,EAAEC,GAAG,MAAMC,EAAE,GAAGA,EAAE,MAAMF,EAAE,MAAMA,IAAI,mBAAmBE,IAAI,MAAMA,KAAI,IAAKA,GAAG,MAAMD,EAAE,IAAI,MAAMA,EAAE,IAAID,EAAEmF,aAAalF,EAAEC,GAAGF,EAAEoF,gBAAgBnF,GAAG,CAAC,CAAC,SAASgF,EAAEjF,GAAGuC,KAAKtC,EAAED,EAAEqB,MAAK,GAAIpB,EAAEoF,MAAMpF,EAAEoF,MAAMrF,GAAGA,EAAE,CAAC,SAASgF,EAAEhF,GAAGuC,KAAKtC,EAAED,EAAEqB,MAAK,GAAIpB,EAAEoF,MAAMpF,EAAEoF,MAAMrF,GAAGA,EAAE,CAAC,SAASsD,EAAEtD,EAAEE,EAAEC,EAAEC,EAAEC,EAAEC,EAAEC,EAAEC,EAAEC,GAAG,IAAIE,EAAEG,EAAEM,EAAEe,EAAEM,EAAEE,EAAEE,EAAEE,EAAEgB,EAAEJ,EAAEK,EAAEJ,EAAEU,EAAEG,EAAEvE,EAAEmB,KAAK,QAAG,IAASnB,EAAE8B,YAAY,OAAO,KAAK,MAAM7B,EAAE4B,MAAMtB,EAAEN,EAAE4B,IAAIvB,EAAEN,EAAE0B,IAAIzB,EAAEyB,IAAI1B,EAAE6B,IAAI,KAAKzB,EAAE,CAACE,KAAKG,EAAEV,EAAE0B,MAAMhB,EAAET,GAAG,IAAIF,EAAE,GAAG,mBAAmByE,EAAE,CAAC,GAAG1B,EAAE7C,EAAEoB,MAAMyC,GAAGpD,EAAE8D,EAAEa,cAAclF,EAAEO,EAAEmB,KAAK6B,EAAEhD,EAAEoD,EAAEA,EAAEzC,MAAMiE,MAAM5E,EAAEe,GAAGtB,EAAED,EAAE2B,IAAIe,GAAG/B,EAAEZ,EAAE4B,IAAI3B,EAAE2B,KAAKJ,GAAGZ,EAAE0E,KAAK,cAAcf,GAAGA,EAAEgB,UAAUC,OAAOxF,EAAE4B,IAAIhB,EAAE,IAAI2D,EAAE1B,EAAEY,IAAIzD,EAAE4B,IAAIhB,EAAE,IAAIwB,EAAES,EAAEY,GAAG7C,EAAEkB,YAAYyC,EAAE3D,EAAE4E,OAAOC,GAAG5B,GAAGA,EAAE6B,IAAI9E,GAAGA,EAAEQ,MAAMyB,EAAEjC,EAAE+E,QAAQ/E,EAAE+E,MAAM,IAAI/E,EAAE0B,QAAQmB,EAAE7C,EAAEyC,IAAInD,EAAEgB,EAAEN,EAAEe,KAAI,EAAGf,EAAEiB,IAAI,IAAI,MAAMjB,EAAEgF,MAAMhF,EAAEgF,IAAIhF,EAAE+E,OAAO,MAAMpB,EAAEsB,2BAA2BjF,EAAEgF,KAAKhF,EAAE+E,QAAQ/E,EAAEgF,IAAIpF,EAAE,GAAGI,EAAEgF,MAAMpF,EAAEI,EAAEgF,IAAIrB,EAAEsB,yBAAyBhD,EAAEjC,EAAEgF,OAAO3D,EAAErB,EAAEQ,MAAMmB,EAAE3B,EAAE+E,MAAMzE,EAAE,MAAMqD,EAAEsB,0BAA0B,MAAMjF,EAAEkF,oBAAoBlF,EAAEkF,qBAAqB,MAAMlF,EAAEmF,mBAAmBnF,EAAEiB,IAAIe,KAAKhC,EAAEmF,uBAAuB,CAAC,GAAG,MAAMxB,EAAEsB,0BAA0BhD,IAAIZ,GAAG,MAAMrB,EAAEoF,2BAA2BpF,EAAEoF,0BAA0BnD,EAAEY,IAAI7C,EAAEc,KAAK,MAAMd,EAAEqF,wBAAuB,IAAKrF,EAAEqF,sBAAsBpD,EAAEjC,EAAEgF,IAAInC,IAAIzD,EAAE+B,MAAM9B,EAAE8B,IAAI,CAACnB,EAAEQ,MAAMyB,EAAEjC,EAAE+E,MAAM/E,EAAEgF,IAAI5F,EAAE+B,MAAM9B,EAAE8B,MAAMnB,EAAEe,KAAI,GAAIf,EAAEmB,IAAI/B,EAAEA,EAAE0B,IAAIzB,EAAEyB,IAAI1B,EAAEuB,IAAItB,EAAEsB,IAAIvB,EAAEuB,IAAI2E,QAAQ,SAASpG,GAAGA,IAAIA,EAAE0B,GAAGxB,EAAE,GAAGY,EAAEiB,IAAIf,QAAQT,EAAEuC,KAAKhC,GAAG,MAAMd,CAAC,CAAC,MAAMc,EAAEuF,qBAAqBvF,EAAEuF,oBAAoBtD,EAAEjC,EAAEgF,IAAInC,GAAG,MAAM7C,EAAEwF,oBAAoBxF,EAAEiB,IAAIe,KAAK,WAAWhC,EAAEwF,mBAAmBnE,EAAEM,EAAEE,EAAE,EAAE,CAAC,GAAG7B,EAAE0B,QAAQmB,EAAE7C,EAAEQ,MAAMyB,EAAEjC,EAAEmB,IAAI/B,EAAEY,EAAEuC,IAAIrD,EAAEgE,EAAE/D,EAAE+C,IAAIY,EAAE,EAAE,cAAca,GAAGA,EAAEgB,UAAUC,OAAO5E,EAAE+E,MAAM/E,EAAEgF,IAAIhF,EAAEe,KAAI,EAAGmC,GAAGA,EAAE9D,GAAGS,EAAEG,EAAE4E,OAAO5E,EAAEQ,MAAMR,EAAE+E,MAAM/E,EAAE0B,cAAc,GAAG1B,EAAEe,KAAI,EAAGmC,GAAGA,EAAE9D,GAAGS,EAAEG,EAAE4E,OAAO5E,EAAEQ,MAAMR,EAAE+E,MAAM/E,EAAE0B,SAAS1B,EAAE+E,MAAM/E,EAAEgF,UAAUhF,EAAEe,OAAO+B,EAAE,IAAI9C,EAAE+E,MAAM/E,EAAEgF,IAAI,MAAMhF,EAAEyF,kBAAkBnG,EAAEM,EAAEA,EAAE,GAAGN,GAAGU,EAAEyF,oBAAoBnF,GAAG,MAAMN,EAAE0F,0BAA0B7D,EAAE7B,EAAE0F,wBAAwBrE,EAAEM,IAAI6B,EAAE,MAAM3D,GAAGA,EAAEU,OAAOgB,GAAG,MAAM1B,EAAEY,IAAIZ,EAAEW,MAAML,SAASN,EAAE+C,EAAE1D,EAAE6D,MAAMC,QAAQQ,GAAGA,EAAE,CAACA,GAAGpE,EAAEC,EAAEC,EAAEC,EAAEC,EAAEC,EAAEC,EAAEC,GAAGK,EAAE8B,KAAK1C,EAAE0B,IAAI1B,EAAE6B,IAAI,KAAKjB,EAAEiB,IAAIf,QAAQT,EAAEuC,KAAKhC,GAAG+B,IAAI/B,EAAE0E,IAAI1E,EAAEY,GAAG,MAAMZ,EAAEc,KAAI,CAAE,MAAM,MAAMtB,GAAGJ,EAAE+B,MAAM9B,EAAE8B,KAAK/B,EAAEuB,IAAItB,EAAEsB,IAAIvB,EAAE0B,IAAIzB,EAAEyB,KAAK1B,EAAE0B,IAAI6E,EAAEtG,EAAEyB,IAAI1B,EAAEC,EAAEC,EAAEC,EAAEC,EAAEC,EAAEE,IAAIE,EAAEV,EAAEyG,SAAS/F,EAAET,EAA0F,CAAvF,MAAMF,GAAGE,EAAE+B,IAAI,MAAMxB,GAAG,MAAMH,KAAKJ,EAAE0B,IAAIpB,EAAEN,EAAE6B,MAAMtB,EAAEH,EAAEA,EAAEoC,QAAQlC,IAAI,MAAMP,EAAE2B,IAAI5B,EAAEE,EAAEC,EAAE,CAAC,CAAC,SAASsD,EAAEzD,EAAEE,GAAGD,EAAE6B,KAAK7B,EAAE6B,IAAI5B,EAAEF,GAAGA,EAAEoD,KAAK,SAASlD,GAAG,IAAIF,EAAEE,EAAE6B,IAAI7B,EAAE6B,IAAI,GAAG/B,EAAEoD,KAAK,SAASpD,GAAGA,EAAEkB,KAAKhB,EAAE,EAA0B,CAAvB,MAAMF,GAAGC,EAAE2B,IAAI5B,EAAEE,EAAE+B,IAAI,CAAC,EAAE,CAAC,SAASwE,EAAExG,EAAEC,EAAEC,EAAEC,EAAEC,EAAEC,EAAEE,EAAEC,GAAG,IAAIC,EAAEI,EAAEM,EAAEe,EAAEhC,EAAEmB,MAAMe,EAAEnC,EAAEoB,MAAMgB,EAAEpC,EAAEmB,KAAKsB,EAAE,EAAE,GAAG,QAAQL,IAAIjC,GAAE,GAAI,MAAMC,EAAE,KAAKqC,EAAErC,EAAEU,OAAO2B,IAAI,IAAIjC,EAAEJ,EAAEqC,KAAK,iBAAiBjC,KAAK4B,IAAIA,EAAE5B,EAAEiG,YAAYrE,EAAE,IAAI5B,EAAEkG,UAAU,CAAC3G,EAAES,EAAEJ,EAAEqC,GAAG,KAAK,KAAK,CAAC,GAAG,MAAM1C,EAAE,CAAC,GAAG,OAAOqC,EAAE,OAAOuE,SAASC,eAAezE,GAAGpC,EAAEI,EAAEwG,SAASE,gBAAgB,6BAA6BzE,GAAGuE,SAASG,cAAc1E,EAAED,EAAE4E,IAAI5E,GAAG/B,EAAE,KAAKG,GAAE,CAAE,CAAC,GAAG,OAAO6B,EAAEH,IAAIE,GAAG5B,GAAGR,EAAEiH,OAAO7E,IAAIpC,EAAEiH,KAAK7E,OAAO,CAAC,GAAG/B,EAAEA,GAAGN,EAAEkB,KAAKjB,EAAEkH,YAAYrG,GAAGqB,EAAEhC,EAAEmB,OAAOf,GAAG6G,wBAAwBhG,EAAEiB,EAAE+E,yBAAyB3G,EAAE,CAAC,GAAG,MAAMH,EAAE,IAAI6B,EAAE,GAAGQ,EAAE,EAAEA,EAAE1C,EAAEoH,WAAWrG,OAAO2B,IAAIR,EAAElC,EAAEoH,WAAW1E,GAAG2E,MAAMrH,EAAEoH,WAAW1E,GAAG4C,OAAOnE,GAAGN,KAAKM,IAAIN,GAAGM,EAAEmG,QAAQzG,EAAEyG,QAAQnG,EAAEmG,SAAStH,EAAEuH,aAAavH,EAAEuH,UAAUpG,GAAGA,EAAEmG,QAAQ,IAAI,CAAC,GAA5iI,SAAWvH,EAAEC,EAAEC,EAAEC,EAAEC,GAAG,IAAIC,EAAE,IAAIA,KAAKH,EAAE,aAAaG,GAAG,QAAQA,GAAGA,KAAKJ,GAAGwE,EAAEzE,EAAEK,EAAE,KAAKH,EAAEG,GAAGF,GAAG,IAAIE,KAAKJ,EAAEG,GAAG,mBAAmBH,EAAEI,IAAI,aAAaA,GAAG,QAAQA,GAAG,UAAUA,GAAG,YAAYA,GAAGH,EAAEG,KAAKJ,EAAEI,IAAIoE,EAAEzE,EAAEK,EAAEJ,EAAEI,GAAGH,EAAEG,GAAGF,EAAE,CAAq1HyD,CAAE3D,EAAEoC,EAAEF,EAAE9B,EAAEI,GAAGW,EAAElB,EAAEuB,IAAI,QAAQ,GAAGkB,EAAEzC,EAAEoB,MAAML,SAASyC,EAAEzD,EAAE4D,MAAMC,QAAQnB,GAAGA,EAAE,CAACA,GAAGzC,EAAEC,EAAEC,EAAEC,GAAG,kBAAkBiC,EAAEhC,EAAEE,EAAEF,EAAEA,EAAE,GAAGH,EAAEsB,KAAKgB,EAAEtC,EAAE,GAAGM,GAAG,MAAMH,EAAE,IAAIqC,EAAErC,EAAEU,OAAO2B,KAAK,MAAMrC,EAAEqC,IAAIhC,EAAEL,EAAEqC,IAAIlC,IAAI,UAAU4B,QAAG,KAAUM,EAAEN,EAAEkD,SAAS5C,IAAI1C,EAAEsF,OAAO,aAAajD,IAAIK,GAAG,WAAWL,GAAGK,IAAIR,EAAEoD,QAAQd,EAAExE,EAAE,QAAQ0C,EAAER,EAAEoD,OAAM,GAAI,YAAYlD,QAAG,KAAUM,EAAEN,EAAEoF,UAAU9E,IAAI1C,EAAEwH,SAAShD,EAAExE,EAAE,UAAU0C,EAAER,EAAEsF,SAAQ,GAAI,CAAC,OAAOxH,CAAC,CAAC,SAASiE,EAAElE,EAAEE,EAAEC,GAAG,IAAI,mBAAmBH,EAAEA,EAAEE,GAAGF,EAAEoC,QAAQlC,CAAqB,CAAnB,MAAMF,GAAGC,EAAE2B,IAAI5B,EAAEG,EAAE,CAAC,CAAC,SAAS8D,EAAEjE,EAAEE,EAAEC,GAAG,IAAIC,EAAEC,EAAE,GAAGJ,EAAEyH,SAASzH,EAAEyH,QAAQ1H,IAAII,EAAEJ,EAAEwB,OAAOpB,EAAEgC,SAAShC,EAAEgC,UAAUpC,EAAE4B,KAAKsC,EAAE9D,EAAE,KAAKF,IAAI,OAAOE,EAAEJ,EAAE8B,KAAK,CAAC,GAAG1B,EAAEuH,qBAAqB,IAAIvH,EAAEuH,sBAA0C,CAAnB,MAAM3H,GAAGC,EAAE2B,IAAI5B,EAAEE,EAAE,CAACE,EAAEwC,KAAKxC,EAAEiD,IAAI,IAAI,CAAC,GAAGjD,EAAEJ,EAAEyB,IAAI,IAAIpB,EAAE,EAAEA,EAAED,EAAEY,OAAOX,IAAID,EAAEC,IAAI4D,EAAE7D,EAAEC,GAAGH,EAAE,mBAAmBF,EAAEqB,MAAMlB,GAAG,MAAMH,EAAE4B,KAAKjB,EAAEX,EAAE4B,KAAK5B,EAAE4B,IAAI5B,EAAE6B,SAAI,CAAM,CAAC,SAAS8D,EAAE3F,EAAEC,EAAEC,GAAG,OAAOqC,KAAKP,YAAYhC,EAAEE,EAAE,CAAC,SAAS0H,EAAE1H,EAAEC,EAAEC,GAAG,IAAIC,EAAEC,EAAEE,EAAEP,EAAEyB,IAAIzB,EAAEyB,GAAGxB,EAAEC,GAAGG,GAAGD,EAAE,mBAAmBD,GAAG,KAAKA,GAAGA,EAAEqB,KAAKtB,EAAEsB,IAAIjB,EAAE,GAAG8C,EAAEnD,EAAED,IAAIG,GAAGD,GAAGD,GAAGsB,IAAIX,EAAEuB,EAAE,KAAK,CAACnC,IAAII,GAAGC,EAAEA,OAAE,IAASJ,EAAEqD,iBAAiBnD,GAAGD,EAAE,CAACA,GAAGE,EAAE,KAAKH,EAAE0H,WAAW7H,EAAEkB,KAAKf,EAAEgH,YAAY,KAAK3G,GAAGH,GAAGD,EAAEA,EAAEE,EAAEA,EAAEsB,IAAIzB,EAAE0H,WAAWxH,GAAGoD,EAAEjD,EAAEN,EAAE,UCEpuQ4H,IACd,MAAO,uCAAuClD,QAAQ,QAAS,SAAUnE,GACvE,MAAMH,EAAqB,GAAhByH,KAAKC,SAAiB,EAEjC,OADW,KAALvH,EAAWH,EAAS,EAAJA,EAAW,GACxB2H,SAAS,GACnB,EACF,CDRq8RjI,EAAEQ,EAAEsE,MAAM7E,EAAE,CAAC2B,IAAI,SAAS5B,EAAEC,EAAEC,EAAEC,GAAG,IAAI,IAAIC,EAAEC,EAAEC,EAAEL,EAAEA,EAAEyB,IAAI,IAAItB,EAAEH,EAAE6B,OAAO1B,EAAEsB,GAAG,IAAI,IAAIrB,EAAED,EAAE4B,cAAc,MAAM3B,EAAE6H,2BAA2B9H,EAAE+H,SAAS9H,EAAE6H,yBAAyBlI,IAAIM,EAAEF,EAAEyB,KAAK,MAAMzB,EAAEgI,oBAAoBhI,EAAEgI,kBAAkBpI,EAAEG,GAAG,IAAIG,EAAEF,EAAEyB,KAAKvB,EAAE,OAAOF,EAAEoF,IAAIpF,CAAc,CAAZ,MAAMH,GAAGD,EAAEC,CAAC,CAAC,MAAMD,CAAC,GAAGE,EAAE,EAAEC,EAAE,SAASH,GAAG,OAAO,MAAMA,QAAG,IAASA,EAAEgC,WAAW,EAAEM,EAAEmD,UAAU0C,SAAS,SAASnI,EAAEC,GAAG,IAAIC,EAAEA,EAAE,MAAMqC,KAAKuD,KAAKvD,KAAKuD,MAAMvD,KAAKsD,MAAMtD,KAAKuD,IAAIvD,KAAKuD,IAAIpF,EAAE,GAAG6B,KAAKsD,OAAO,mBAAmB7F,IAAIA,EAAEA,EAAEU,EAAE,GAAGR,GAAGqC,KAAKjB,QAAQtB,GAAGU,EAAER,EAAEF,GAAG,MAAMA,GAAGuC,KAAKN,MAAMhC,GAAGsC,KAAKR,IAAIe,KAAK7C,GAAG4C,EAAEN,MAAM,EAAED,EAAEmD,UAAU4C,YAAY,SAASrI,GAAGuC,KAAKN,MAAMM,KAAKX,KAAI,EAAG5B,GAAGuC,KAAKR,IAAIe,KAAK9C,GAAG6C,EAAEN,MAAM,EAAED,EAAEmD,UAAUC,OAAOrD,EAAEjC,EAAE,GAAG2C,EAAEC,IAAI,EAAE1C,EAAE,EEEpoT,MAAMgI,EAGJtG,YAAYuG,QAFKC,WAGfjG,KAAKiG,IAAMD,GAAMT,GAClB,CAEGS,SACF,YAAYC,GACb,ECXH,ICKYC,IDLG,CACbC,OAAQ,CACNC,YAAa,qBAEfxF,KAAM,CACJyF,QAAS,wBACTC,SAAU,0BAEZC,WAAY,CACVC,SAAU,WACVC,KAAM,OACNC,SAAU,CAACC,EAAMC,YAAkBD,QAAWC,IAC9CD,KAAOA,WAAiBA,IACxBE,QAAS,UACTC,GAAI,KACJC,GAAI,KACJC,QAAS,WAEXC,QAAS,aACTC,eAAgB,4BAChBC,MAAO,mDEfIC,EAIX3H,YAAY4H,QAHKC,sBACAC,wBAGfvH,KAAKsH,UAAYD,EACjBrH,KAAKuH,iBAAmBC,CACzB,CASDC,UAAUC,EAAiBC,GACzB,IAAKA,IAASD,EAAS,YAEvB,MAAME,EAAWF,EAAQG,MAAM,KACzB7I,EAAM4I,EAAS,GAErB,GAAID,EAAK3I,GAAM,CACb,MAAM8I,EAAMH,EAAK3I,GAEjB,MAAmB,iBAAR8I,EACF,IAAcA,EACG,mBAARA,EACTA,OAEKL,UAAUG,EAASrF,MAAM,GAAGwF,KAAK,KAAMD,EAEtD,CAED,WACD,CAEDE,UAAUN,KAAoBO,GAE5B,IAAIC,EAQJ,OALEA,EAJiBlI,KAAKyH,UAAUC,EAAS1H,KAAKsH,YAM9BtH,KAAKyH,UAAUC,EAAS1H,KAAKuH,kBAG3CW,EACKA,KAAiBD,GAGnBP,CACR,QCjDmBS,UAGZC,EAIR3I,YAAYV,EAAUkB,OD6CMoI,EC5C1BC,MAAMvJ,EAAOkB,QAJLsI,mBACArI,SAIRF,KAAKuI,gBCRyBtI,GAGhC,IAAKA,EAAS,YAEd,MAAMuI,EAAOC,OAAOD,KAAKvI,GAEzB,OAAIuI,EAAK/J,OAEUwB,EAAQuI,EAAK,IACnBzJ,MAAMiE,UAIpB,CDNiB0F,CAAUzI,GAEpBD,KAAKuI,SACPvI,KAAKE,GDwCmBmI,ECxCDrI,KAAKuI,OAAOF,oBDyCtBX,KAAoBO,GACnC,OAAOI,EAAWL,UAAUN,KAAYO,EACzC,GCzCA,QEbUU,UAAoBR,EAK/BhF,SACE,OAAO5E,EAAEyB,KAAKjB,MAAM6J,cAAe,CACjC/D,wBAAyB,CAAEG,OAAQhF,KAAKjB,MAAM8J,UAEjD,WCVaC,EAAKD,EAAiBD,GACpC,OAAOrK,EAAEoK,EAAa,CAAEE,QAASA,EAASD,cAAeA,GAC1D,CDDYD,EACJ/J,aAAe,CACpBgK,cAAe,QENnB,MAAMG,UAAahD,EAIjBtG,YAAYkF,GACV2D,aAHK3D,YAKL3E,KAAKgJ,OAAOrE,EACb,CAEOsE,KAAKtE,GACX,OAAIA,aAAgBgE,YACXG,EAAKnE,EAAKuE,WAGZvE,CACR,CAOMqE,OAAOrE,GAEZ,OADA3E,KAAK2E,KAAO3E,KAAKiJ,KAAKtE,OAEvB,EC3BH,MAAMwE,UAAYpD,EAGhBtG,YAAY2J,GACVd,aAHMe,cAKNrJ,KAAKoJ,MAAQA,GAAS,EACvB,CAEME,KAAKC,GACV,YAAYF,OAAOE,EACpB,CAEUH,YACT,YAAYC,MACb,CAEUD,UAAMA,GACfpJ,KAAKqJ,OAASD,CACf,CAEMI,UACL,YAAYJ,MAAMK,IAAKH,GAASA,EAAK3E,KACtC,CASe+E,iBAACN,GACf,WAAWD,EAAIC,EAAMK,IAAKH,GAAS,IAAIP,EAAKO,EAAK3E,OAClD,CAEGlG,aACF,YAAY2K,MAAM3K,MACnB,ECpCH,MAAMkL,UAAgB5D,EAIpBtG,YAAYmK,GACVtB,aAJMuB,kBACAC,eAMJ9J,KAAK4J,KADHA,aAAgBtI,MACNsI,EACHA,aAAgBT,EACb,CAACS,GAED,EAEf,CAEGA,WACF,YAAYC,KACb,CAEGD,SAAKA,GACP5J,KAAK6J,MAAQD,CACd,CAEGnL,aACF,YAAYqL,SAAW9J,KAAK4J,KAAKnL,MAClC,CAGGA,WAAOsL,GACT/J,KAAK8J,QAAUC,CAChB,CAEMP,UACL,YAAYI,KAAKH,IAAKO,GAAQA,EAAIR,UACnC,CAScE,gBAACE,GACd,WAAWD,EAAQC,EAAKH,IAAKO,GAAQb,EAAIc,UAAUD,EAAIZ,QACxD,CASeM,iBACd/E,GAIA,OAFAA,WC9D0BA,GAC5B,OAAIA,EAAK,IAAQA,EAAK,aAAcrD,MAI7BqD,EAHE,CAACA,EAIX,CDwDUuF,CAAWvF,OAEPgF,EACThF,EAAK8E,IAAKO,GAAQ,IAAIb,EAAIa,EAAIP,IAAKH,GAAS,IAAIP,EAAKO,MAExD,QEjCUa,qBACHC,iBAKAC,KAAKvH,GACN9C,KAAKoK,YACRpK,KAAKoK,UAAY,IAGftH,IAAU9C,KAAKoK,UAAUtH,KAC3B9C,KAAKoK,UAAUtH,GAAS,GAE3B,CAEDwH,GACExH,EACAyH,GAIA,OAFAvK,KAAKqK,KAAKvH,GACV9C,KAAKoK,UAAUtH,GAAiBvC,KAAKgK,OAEtC,CAEDC,IACE1H,EACAyH,GAEA,MAAME,EAAY3H,EAIlB,OAFA9C,KAAKqK,OAEArK,KAAKoK,UAAUK,IAAmD,IAArCzK,KAAKoK,UAAUK,GAAWhM,QAK5DuB,KAAKoK,UAAUK,GAAazK,KAAKoK,UAAUK,GAAWC,OACnD1H,GAAUA,GAASuH,aAIvB,CAEDI,KACE7H,KACGmF,GAEH,MAAMwC,EAAY3H,EAIlB,OAFA9C,KAAKqK,KAAKI,GAENzK,KAAKoK,UAAUK,GAAWhM,OAAS,IACrCuB,KAAKoK,UAAUK,GAAW5G,QAASb,GAAUA,KAASiF,OAKzD,GV1FH,SAAY/B,GACVA,6BACAA,mCACAA,+BACAA,iCACAA,6BACAA,iCACAA,uBACAA,mBACAA,oBATF,CAAA,CAAYA,IAAAA,aAqBU0E,UAGZT,EAQR1K,YAAYV,GACVuJ,aARctC,eACC6E,cASf7K,KAAK6K,OAAS,GACd7K,KAAKgG,GAAKT,IAENxG,GAAOiB,KAAK8K,SAAS/L,EAC1B,CAQDgM,WAAW9C,GACLjI,KAAKgL,yBAAyBC,UAChCjL,KAAKgL,iBAAiB/C,GAGxBjI,KAAK2K,KAAK,mBAAoB1C,GAC9B,MAAMiD,EAASlL,KAAKmL,YAAYlD,GAEhC,OADAjI,KAAK2K,KAAK,kBAAmB1C,GACtBiD,CACR,CAEDJ,SAAS/L,GAGP,OAFA0J,OAAO2C,OAAOpL,KAAK6K,OAAQ9L,GAC3BiB,KAAK2K,KAAK,eAAgB3K,UAE3B,CAEGjB,YACF,YAAY8L,MACb,EWvDH,MAAMQ,UAA2BT,EAI3B9L,WACF,OAAOoH,EAAcoF,MACtB,CAEDH,SAASxG,GACP,OAAI3E,KAAKjB,MAAMwM,SCnBjBA,EDqBMC,OAAOxL,KAAKjB,MAAMwM,SAASE,OCpBjCC,EDqBM1L,KAAKjB,MAAM2M,QCpBjBC,EDqBM3L,KAAKjB,MAAM4M,oBCpBjBC,EDqBMjH,ECpBNkH,EDqBM7L,KAAKjB,MAAM8M,SClBjBN,EAAUA,EAAQlJ,QAAQ,2BAA4B,YAE3CsH,EACTiC,EAAQhC,KAAKc,OAAO,CAACV,EAAK8B,IACxB9B,EAAIZ,MAAMvI,KAAK,CAACyI,EAAMyC,KACpB,IAAKzC,EACH,SAGF,GAAIqC,GAEAD,GACAA,EAAQK,IACsB,iBAAvBL,EAAQK,IAEKL,EAAQK,GACZC,OACd,SAKN,IAAIrH,EAAO,GAEX,GAAwB,mBAAbkH,EACTlH,EAAOkH,EAASvC,EAAK3E,KAAMmH,EAAUC,WACP,iBAAdzC,EAAK3E,KAAmB,CAExC,MAAMsH,EAAU3C,EAAK3E,KACjBsH,GAAWA,EAAQlN,OAASkN,EAAQlN,MAAM8J,UAE5ClE,EAAOsH,EAAQlN,MAAM8J,QAExB,MAEClE,EAAO6G,OAAOlC,EAAK3E,MAGrB,WAAWuH,OAAOX,EAAS,MAAMtJ,KAAK0C,EAA/B,MDhBJA,MC7BT4G,EACAG,EACAC,EACAC,EACAC,CD0BC,WEpCaM,KAAalE,GAG3B,eAAmBA,EAAKmE,OACtB,CAACC,EAAcC,OAAmBD,KAAQC,IAC1C,KAEH,UAEeC,KAAaC,GAC3B,OACEA,EACG9B,OAAQtJ,GAAMA,GACdgL,OAAO,CAACD,EAAWE,OAAYF,GAAa,MAAME,IAAQ,IAC1DZ,QAAU,IAEhB,OCT6BgB,UAAkCtC,EAM9D1K,YAAYiN,GACVpE,aAJMqE,mBACWD,kBAIjB1M,KAAK0M,WAAaA,EAClB1M,KAAK2M,OAAS3M,KAAK4M,kBACnBF,EAAWG,SAAS7M,KAAK8M,QAAQC,KAAK/M,MACvC,CAKO8M,QAAQE,GACdhN,KAAKiN,OAAOD,EAAOlO,KAAMkO,EAAOE,QACjC,CAEDtH,SAASuH,GACP,MAAMC,EAAYpN,KAAK2M,OACvB3M,KAAK2M,OAASQ,EACdnN,KAAK2K,KAAK,UAAWwC,EAAUC,EAChC,CAEG9J,YACF,YAAYqJ,MACb,QC9BUU,UAAoBZ,EAI/BG,kBACE,MAAO,CAAErB,QAAS,KACnB,CAED0B,OAAOnO,EAAMoO,GACX,GAAa,mBAATpO,EAA2B,CAC7B,MAAMyM,QAAEA,GAAY2B,EACpBlN,KAAKmG,OAAOoF,EACb,CACF,CAEOpF,OAAOoF,GACbvL,KAAK4F,SAAS,CAAE2F,QAASA,GAC1B,QCpBmB+B,GAGpB7N,YAAYiN,QAFKA,kBAGf1M,KAAK0M,WAAaA,CACnB,CAESa,SACRzO,EACAoO,GAEAlN,KAAK0M,WAAWa,SAAS,CACvBzO,KAAMA,EACNoO,QAASA,GAEZ,QCTUM,WAAsBF,GACjCnH,OAAOoF,GACLvL,KAAKuN,SAAS,iBAAkB,CAC9BhC,QAASA,GAEZ,ECAH,MAAMkC,WAAiC7C,EAIjC9L,WACF,OAAOoH,EAAcwH,YACtB,CAEDvC,SAASwC,GACP,IAAK3N,KAAKjB,MAAMwM,QAAS,OAAOoC,EAEhC,MAAMC,EAAU,GAUhB,OARI5N,KAAKjB,MAAM8O,MACbD,EAAO,IAAU5N,KAAKjB,MAAM8O,IAAIF,EAAQE,IAAK7N,KAAKjB,MAAMwM,UAGtDvL,KAAKjB,MAAM+O,OACbF,EAAO,KAAW5N,KAAKjB,MAAM+O,KAAKH,EAAQG,KAAM9N,KAAKjB,MAAMwM,eAIxDoC,EACAC,EAEN,ECTH,ICHYG,GCoCAC,UFzDZ,MACUC,OAAOvG,EAAiB5I,GAC9B,oBAAqBA,EAAKoP,mBAAmBxG,GAC9C,CAEDP,MAAMO,EAAiByG,GAAiB,GACtC,MAAMC,EAAMpO,KAAKiO,OAAOvG,EAAS,SAEjC,GAAIyG,EACF,MAAME,MAAMD,GAEZE,QAAQnH,MAAMiH,EAEjB,CAEDG,KAAK7G,GACH4G,QAAQC,KAAKvO,KAAKiO,OAAOvG,EAAS,QACnC,CAED8G,KAAK9G,GACH4G,QAAQE,KAAKxO,KAAKiO,OAAOvG,EAAS,QACnC,SCZmB+G,WAGZtG,IASV,SAAY4F,GACVA,uBACAA,uBACAA,kBAHF,CAAA,CAAYA,KAAAA,cAcCW,GAGXjP,mBAFiBkP,eAGf3O,KAAK2O,QAAU,EAChB,CAEDC,IAAuC5I,GACrC,MAAM2I,EAAU3O,KAAK2O,QAAQjE,OAAQ5K,GAAMA,EAAEkG,KAAOA,GAEpD,OAAI2I,EAAQlQ,OAAS,EACZkQ,EAAQ,OAIlB,CAEDE,IAAuCC,GACrC,OAAKA,EAAO9I,GAKgB,OAAxBhG,KAAK4O,IAAIE,EAAO9I,KAClB+I,GAAI5H,8BAA8B2H,EAAO9I,aAI3ChG,KAAK2O,QAAQpO,KAAKuO,UAThBC,GAAI5H,MAAM,kCAWb,CAED6H,OAAOhJ,GAEL,OADAhG,KAAK2O,QAAQM,OAAOjP,KAAK2O,QAAQxO,QAAQH,KAAK4O,IAAI5I,IAAM,OAEzD,CAEDkJ,KACEC,GAEA,IAAIR,EAQJ,OALEA,EADc,MAAZQ,GAAgCC,MAAZD,EACZnP,KAAK2O,QAAQjE,OAAQ5K,GAAMA,EAAEqP,WAAaA,GAE1CnP,KAAK2O,QAGVA,EAAQ/N,KAAK,CAACxC,EAAGkC,IAAMlC,EAAEiR,MAAQ/O,EAAE+O,MAC3C,QAWUC,WAAuBnH,EAClChF,SACE,GAAInD,KAAKjB,MAAMwQ,SAAU,CAEvB,MAAMT,EAAS9O,KAAKuI,OAAOuG,OAAOF,IAAI5O,KAAKjB,MAAMwQ,UAEjD,OAAKT,EAEEvQ,EACLiR,EACA,GACAjR,EAAEuQ,EAAOW,aACPX,OAAQA,GACLA,EAAO/P,MACPiB,KAAKjB,MAAMA,aAGnB,aAAkCqQ,IAAxBpP,KAAKjB,MAAMoQ,SAEb5Q,EACLiR,EACA,GACAxP,KAAKuI,OAAOuG,OACTI,KAAKlP,KAAKjB,MAAMoQ,UAChB1F,IAAK3J,GACJvB,EAAEuB,EAAE2P,aAAaX,OAAQhP,GAAMA,EAAEf,MAAUiB,KAAKjB,MAAMA,cAM/D,QE7GU2Q,WAAejB,GAc1BhP,YAAYV,EAAOkB,GACjBqI,MAAMvJ,EAAOkB,QAZE0P,4BAGAC,oBACAC,kBACAC,sBASf9P,KAAK4P,QAAU,IAAIpC,GAAcxN,KAAKuI,OAAOmE,YAC7C1M,KAAK6P,MAAQ,IAAIxC,EAAYrN,KAAKuI,OAAOmE,YACzC,MAAMqD,QAAEA,EAAFxE,QAAWA,GAAYxM,EAE7B,GAAIgR,EAAS,CAOX,IAAIJ,EALApE,GAASvL,KAAK4P,QAAQzJ,OAAOoF,GAEjCvL,KAAK8P,eAAiB9P,KAAKgQ,aAAajD,KAAK/M,MAC7CA,KAAK6P,MAAMvF,GAAG,UAAWtK,KAAK8P,gBAI5BH,EADE5Q,EAAMkR,OACU,IAAIxC,GAAyB,CAC7ClC,QAASxM,EAAMwM,QACfsC,IAAK9O,EAAMkR,OAAOpC,IAClBC,KAAM/O,EAAMkR,OAAOnC,OAGH,IAAIzC,EAAmB,CACvCE,QAASxM,EAAMwM,QACfG,QAAS1L,KAAKuI,OAAO2H,QAAUlQ,KAAKuI,OAAO2H,OAAOxE,QAClDC,oBACE5M,EAAM4M,0BACwByD,IAA9BrQ,EAAM4M,oBACRE,SAAU9M,EAAM8M,WAIpB7L,KAAK2P,gBAAkBA,EAGvB3P,KAAKuI,OAAO4H,SAAStD,SAAS8C,EAC/B,CACF,CAEDvK,uBACEpF,KAAKuI,OAAO4H,SAASC,WAAWpQ,KAAK2P,iBACrC3P,KAAK6P,MAAMrF,IAAI,UAAWxK,KAAK8P,eAChC,CAEOE,aAAa1M,GAEnBtD,KAAK2P,gBAAgB7E,SAAS,CAC5BS,QAASjI,EAAMiI,SAElB,CAEO8E,SAASvN,GAEf9C,KAAK4P,QAAQzJ,OADGrD,EAAMwN,OAAOtN,MAE9B,CAEDG,SACE,IAAKnD,KAAKjB,MAAMgR,QAAS,YAEzB,IAAIQ,EAAUvQ,KAAKqQ,SAAStD,KAAK/M,MAOjC,OAJIA,KAAK2P,2BAA2BlC,KAClC8C,ECnGkB,EACtBC,EACAC,KAEA,IAAIC,EAEJ,MAAO,IAAIzI,IACT,IAAI0I,QAASC,IACPF,GACFG,aAAaH,GAGfA,EAAU/P,WAAW,IAAMiQ,EAAQJ,KAAQvI,IAAQwI,IALrD,ED4FYK,CAASP,EAASvQ,KAAKjB,MAAMgS,2BAKrC5E,UAAWA,EAAUI,EAAU,SAAUvM,KAAKuI,OAAO4D,UAAUhG,UAE/D5H,WACEO,KAAK,SACLsH,YAAapG,KAAKE,EAAE,sBACpB,aAAYF,KAAKE,EAAE,sBACnBqQ,QAASA,EACTpE,UAAWI,EACTJ,EAAU,SACVA,EAAU,SAAU,UAEtBnJ,MAAOhD,KAAK6P,MAAMvM,MAAMiI,UAI/B,EAjGUmE,GAUJ9Q,aAAe,CACpBmS,gBAAiB,KErBrB,MAAMC,WAAwBpG,EAClBI,gBACR,GAAIiG,MAAMC,OAAOlR,KAAKjB,MAAMoS,SAAWF,MAAMC,OAAOlR,KAAKjB,MAAM4H,OAC7D,MAAM0H,MAAM,4BAEf,CAEGvP,WACF,OAAOoH,EAAckL,KACtB,CAESjG,SAASxG,GACjB,MAAMgC,EAAO3G,KAAKjB,MAAM4H,KAIxB,WAAWgD,EAAQhF,EAAKiF,KAAKrH,MAHfoE,EAAO3G,KAAKjB,MAAMoS,OACnBxK,EAAO,GAAK3G,KAAKjB,MAAMoS,OAGrC,ECfH,MAAME,WAA8BzG,EAI9B9L,WACF,OAAOoH,EAAcoL,WACtB,CAEDnG,SAASwC,GACP,MAAMC,EAAU,GAkBhB,OAhBI5N,KAAKjB,MAAM8O,MACbD,EAAO,IAAU5N,KAAKjB,MAAM8O,IAC1BF,EAAQE,IACR7N,KAAKjB,MAAM4H,KACX3G,KAAKjB,MAAMoS,QAIXnR,KAAKjB,MAAM+O,OACbF,EAAO,KAAW5N,KAAKjB,MAAM+O,KAC3BH,EAAQG,KACR9N,KAAKjB,MAAM4H,KACX3G,KAAKjB,MAAMoS,aAKVxD,EACAC,EAEN,QChBU2D,WAAmB9C,GAiB9BhP,YAAYV,EAAOkB,GACjBqI,MAAMvJ,EAAOkB,QAdPuR,sBACAC,uBACAC,6BAcN1R,KAAKsD,MAAQ,CACX6N,MAAOpS,EAAMoS,MACbxK,KAAM5H,EAAM4H,MAAQ,EACpBgL,MAAO,EAEV,CAEDlO,qBACE,GAAIzD,KAAKjB,MAAMgR,QAAS,CACtB,IAAIyB,EAEJxR,KAAK0R,sBAAwB1R,KAAK4R,oBAAoB7E,KAAK/M,MAEvDA,KAAKjB,MAAMkR,QACbuB,EAAY,IAAIH,GAAsB,CACpCF,MAAOnR,KAAKsD,MAAM6N,MAClBxK,KAAM3G,KAAKsD,MAAMqD,KACjBkH,IAAK7N,KAAKjB,MAAMkR,OAAOpC,IACvBC,KAAM9N,KAAKjB,MAAMkR,OAAOnC,OAG1B9N,KAAKuI,OAAO4H,SAAS7F,GAAG,eAAgBtK,KAAK0R,yBAE7CF,EAAY,IAAIR,GAAgB,CAC9BG,MAAOnR,KAAKsD,MAAM6N,MAClBxK,KAAM3G,KAAKsD,MAAMqD,OAMnB6K,EAAUlH,GAAG,gBAAiBtK,KAAK0R,wBAGrC1R,KAAKwR,UAAYA,EACjBxR,KAAKuI,OAAO4H,SAAStD,SAAS2E,GAI9BxR,KAAKuI,OAAO4H,SAAS7F,GAAG,QAAS,KAC/BtK,KAAK4F,SAAS,CACZ+L,MAAO,EACPhL,KAAM,KAGX,CACF,CAEOiL,oBAAoBhG,GAC1B5L,KAAK6R,SAASjG,EAAQnN,OACvB,CAEOqT,SAASN,GAGXxR,KAAKjB,MAAMgT,mBAAqBP,IAAcxR,KAAKwR,WACrDxR,KAAKgS,QAAQ,EAEhB,CAEDtO,oBACE1D,KAAKyR,WAAazR,KAAK8R,SAAS/E,KAAK/M,MACrCA,KAAKuI,OAAO4H,SAAS7F,GAAG,UAAWtK,KAAKyR,WACzC,CAEDrM,uBACEpF,KAAKuI,OAAO4H,SAASC,WAAWpQ,KAAKwR,WACrCxR,KAAKuI,OAAO4H,SAAS3F,IAAI,UAAWxK,KAAKyR,WAC1C,CAEW7K,YACV,OAAOpB,KAAKyM,KAAKjS,KAAKsD,MAAMqO,MAAQ3R,KAAKsD,MAAM6N,MAChD,CAEOa,QAAQrL,GACd,GAAIA,GAAQ3G,KAAK4G,OAASD,EAAO,GAAKA,IAAS3G,KAAKsD,MAAMqD,KACxD,YAGF3G,KAAK4F,SAAS,CACZe,KAAMA,IAGR3G,KAAKwR,UAAU1G,SAAS,CACtBnE,KAAMA,GAET,CAEOkL,SAASK,GAGflS,KAAK4F,SAAS,CACZ+L,MAAOO,GAEV,CAEDC,cACE,GAAInS,KAAKjB,MAAMqT,cAAgB,EAC7B,YAIF,MAAMC,EAAmB7M,KAAK8M,IAAItS,KAAK4G,MAAO5G,KAAKjB,MAAMqT,cAEzD,IAAIG,EAAY/M,KAAK8M,IAAItS,KAAKsD,MAAMqD,KAAMnB,KAAKgN,MAAMH,EAAW,IAKhE,OAJIrS,KAAKsD,MAAMqD,KAAOnB,KAAKgN,MAAMH,EAAW,IAAMrS,KAAK4G,QACrD2L,EAAYF,GAAYrS,KAAK4G,MAAQ5G,KAAKsD,MAAMqD,SAI/C6I,OACExP,KAAK4G,MAAQyL,GAAYrS,KAAKsD,MAAMqD,KAAO4L,EAAY,GACtDhU,EAACiR,OACCjR,YACEkU,SAAU,EACVC,KAAK,SACLC,QAAS3S,KAAKgS,QAAQjF,KAAK/M,KAAM,GACjC4S,MAAO5S,KAAKE,EAAE,wBACd,aAAYF,KAAKE,EAAE,wBACnBiM,UAAWnM,KAAKuI,OAAO4D,UAAU0G,kBAEhC7S,KAAKE,EAAE,MAEV3B,YACEkU,UAAW,EACXtG,UAAWI,EACTJ,EAAU,UACVnM,KAAKuI,OAAO4D,UAAU0G,2BAQ7BvR,MAAMwR,KAAKxR,MAAM+Q,GAAU7J,QACzBiB,IAAK7L,GAAMoC,KAAKsD,MAAMqD,MAAQ/I,EAAI2U,IAClC9I,IAAK7L,GACJW,YACEkU,SAAU,EACVC,KAAK,SACLC,QAAS3S,KAAKgS,QAAQjF,KAAK/M,KAAMpC,GACjCuO,UAAWI,EACTvM,KAAKsD,MAAMqD,OAAS/I,EAChB2O,EACEJ,EAAU,eACVnM,KAAKuI,OAAO4D,UAAU4G,yBAExB,KACJ/S,KAAKuI,OAAO4D,UAAU0G,kBAExBD,MAAO5S,KAAKE,EAAE,kBAAmBtC,EAAI,GACrC,aAAYoC,KAAKE,EAAE,kBAAmBtC,EAAI,IAEzCoC,KAAKE,KAAKtC,EAAI,OAIpBoC,KAAK4G,MAAQyL,GAAYrS,KAAK4G,MAAQ5G,KAAKsD,MAAMqD,KAAO4L,EAAY,GACnEhU,EAACiR,OACCjR,YACEkU,UAAW,EACXtG,UAAWI,EACTJ,EAAU,UACVnM,KAAKuI,OAAO4D,UAAU0G,0BAK1BtU,YACEkU,SAAU,EACVC,KAAK,SACLC,QAAS3S,KAAKgS,QAAQjF,KAAK/M,KAAMA,KAAK4G,MAAQ,GAC9CgM,MAAO5S,KAAKE,EAAE,kBAAmBF,KAAK4G,OACtC,aAAY5G,KAAKE,EAAE,kBAAmBF,KAAK4G,OAC3CuF,UAAWnM,KAAKuI,OAAO4D,UAAU0G,kBAEhC7S,KAAKE,KAAKF,KAAK4G,WAM3B,CAEDoM,gBACE,SACGxD,OACExP,KAAKjB,MAAMkU,SAAWjT,KAAKsD,MAAMqO,MAAQ,GACxCpT,SACEmU,KAAK,SACL,YAAU,SACVvG,UAAWI,EACTJ,EAAU,WACVnM,KAAKuI,OAAO4D,UAAU+G,mBAExBN,MAAO5S,KAAKE,EACV,sBACAF,KAAKsD,MAAMqD,KAAO,EAClB3G,KAAK4G,QAGN5G,KAAKE,EAAE,sBAAuB,IAC/B3B,WAAIyB,KAAKE,MAAKF,KAAKsD,MAAMqD,KAAO3G,KAAKsD,MAAM6N,MAAQ,KAAU,IAC5DnR,KAAKE,EAAE,iBAAkB,IAC1B3B,WACGyB,KAAKE,KACDsF,KAAK8M,KACLtS,KAAKsD,MAAMqD,KAAO,GAAK3G,KAAKsD,MAAM6N,MACnCnR,KAAKsD,MAAMqO,WAGZ,IACJ3R,KAAKE,EAAE,qBAAkB3B,WAAIyB,KAAKE,KAAKF,KAAKsD,MAAMqO,UAAc,IAChE3R,KAAKE,EAAE,uBAKjB,CAEDiD,SACE,OAAKnD,KAAKjB,MAAMgR,iBAIZ5D,UAAWI,EACTJ,EAAU,cACVnM,KAAKuI,OAAO4D,UAAU5F,aAGvBvG,KAAKgT,gBAENzU,SAAK4N,UAAWA,EAAU,UACvBnM,KAAKjB,MAAMoU,YACV5U,YACEkU,SAAU,EACVC,KAAK,SACLU,SAA8B,IAApBpT,KAAKsD,MAAMqD,KACrBgM,QAAS3S,KAAKgS,QAAQjF,KAAK/M,KAAMA,KAAKsD,MAAMqD,KAAO,GACnDiM,MAAO5S,KAAKE,EAAE,uBACd,aAAYF,KAAKE,EAAE,uBACnBiM,UAAWI,EACTvM,KAAKuI,OAAO4D,UAAU0G,iBACtB7S,KAAKuI,OAAO4D,UAAUkH,uBAGvBrT,KAAKE,EAAE,wBAIXF,KAAKmS,cAELnS,KAAKjB,MAAMuU,YACV/U,YACEkU,SAAU,EACVC,KAAK,SACLU,SAAUpT,KAAK4G,QAAU5G,KAAKsD,MAAMqD,KAAO,GAAoB,IAAf3G,KAAK4G,MACrD+L,QAAS3S,KAAKgS,QAAQjF,KAAK/M,KAAMA,KAAKsD,MAAMqD,KAAO,GACnDiM,MAAO5S,KAAKE,EAAE,mBACd,aAAYF,KAAKE,EAAE,mBACnBiM,UAAWI,EACTvM,KAAKuI,OAAO4D,UAAU0G,iBACtB7S,KAAKuI,OAAO4D,UAAUoH,uBAGvBvT,KAAKE,EAAE,0BAMnB,WCjUasT,GAAMA,EAAwBC,GAC5C,MAAoB,iBAATD,EACLA,EAAMrT,QAAQ,MAAQ,EAChBsT,EAAiB,IAAOC,SAASF,EAAO,IAEzCE,SAASF,EAAO,IAIpBA,CACR,UAEeG,GAAGH,GACjB,OAAKA,KACKhO,KAAKgN,MAAMgB,OADF,EAEpB,CDcYjC,GAQJ3S,aAAe,CACpBqU,SAAS,EACTK,YAAY,EACZH,YAAY,EACZf,aAAc,EACdjB,MAAO,GACPY,mBAAmB,SE/BV6B,WAAoBzL,EAK/B1I,YAAYV,EAAOkB,GACjBqI,MAAMvJ,EAAOkB,QALP4T,yBACAC,2BACAC,kBAMN/T,KAAK6T,aADY7T,KAAKjB,MAAMiV,SACCnU,QAAQQ,KAAK4T,WACxC,GAGFjU,KAAK6T,aAAa1R,MAAMgN,SAAW,WACnCnP,KAAK6T,aAAa1R,MAAMqR,MAAQ,OAChCxT,KAAK6T,aAAa1R,MAAM+R,OAAS,cACjClU,KAAK6T,aAAa1R,MAAMgS,WAAa,SAErCnU,KAAK8T,eAAiB9T,KAAK6T,aAAa1H,UACxCnM,KAAK+T,WAAa/T,KAAK6T,aAAa1R,MAAMC,OAC3C,CAEMgS,SACLpU,KAAK6T,aAAa1H,aAAenM,KAAK8T,kBAAkB3H,EACtD,iBAGFnM,KAAK6T,aAAa1R,MAAMkS,YAAc,OACtCrU,KAAK6T,aAAa1R,MAAMqR,MAAQ,OAChCxT,KAAK6T,aAAa1R,MAAMmS,QAAU,IAClCtU,KAAK6T,aAAa1R,MAAMoS,OAAS,IACjCvU,KAAK6T,aAAa1R,MAAMqS,OAAS,OACjCxU,KAAK6T,aAAa1R,MAAMsS,QAAU,OAElC,IAAIC,EAAMpT,MAAMwR,KACd9S,KAAKK,KAAKhC,WAAWsW,iBAA8B,aACnDvI,OAAO,CAACC,EAAMxM,KACdA,EAAQsC,MAAMqR,SAAW3T,EAAQ+U,mBAG/B,CAAC/U,EAAQgV,aAAa,mBAAoB,CACxCC,SAAUjV,EAAQ+U,cAEjBvI,IAEJ,IAeH,OAbArM,KAAK6T,aAAa1H,UAAYnM,KAAK8T,eACnC9T,KAAK6T,aAAa1R,MAAMC,QAAUpC,KAAK+T,WACvC/T,KAAK6T,aAAa1R,MAAMkS,YAAc,OAEtCK,EAAMpT,MAAMwR,KACV9S,KAAKK,KAAKhC,WAAWsW,iBAA8B,aACnDvI,OAAO,CAACC,EAAMxM,KACdwM,EAAKxM,EAAQgV,aAAa,mBAA1B,MACEhV,EAAQ+U,YAEHvI,GACNqI,GAEIA,CACR,CAEDvR,SACE,OAAInD,KAAKjB,MAAMiV,SAASnU,iBAGlBZ,IAAM8V,IACJA,GAAeA,EAAYnT,YAAY5B,KAAK6T,qBAOrD,WCvFamB,GAAUC,GACxB,IAAKA,EAAK,MAAO,GAEjB,MAAMC,EAAQD,EAAIpN,MAAM,KAGxB,OAAqB,IAAjBqN,EAAMzW,QAAgB,iBAAiBwD,KAAKgT,GACvCA,EAGFC,EACJzL,IAAI,SAAU0L,EAAM5L,GAEnB,OAAa,GAATA,EACK4L,EAAK7S,cAIP6S,EAAKC,OAAO,GAAGlH,cAAgBiH,EAAK5S,MAAM,GAAGD,aACrD,GACAyF,KAAK,GACT,CCFD,MAAMsN,WAAetP,EAGnBtG,cACE6I,aAHMgN,gBAKNtV,KAAKsV,SAAW,EACjB,CAEG5J,cACF,YAAY4J,QACb,CAEG5J,YAAQA,GACV1L,KAAKsV,SAAW5J,CACjB,CAEG6J,qBACF,YAAYD,SAAS5K,OAAQxM,IAAOA,EAAE8N,OACvC,CAUDwJ,YAAYjN,GACV,MAAMkN,EAAqBlN,EAAOkN,UAC5BzB,EAAiCzL,EAAOyL,SACxC0B,EAAqCnN,EAAOmN,QAC5CC,EAAYpN,EAAOmN,UAAW,EAEpC,IAAKD,EAGH,YAIF,MAAMhC,EAAiBgC,EAAUb,YAO3BgB,ElCpE8rB,CAAC/V,QAAQ,MkCqE7sB,IAAIuU,EAAS,GAEb,GAAIJ,EAASnU,SAAW8V,EAAW,CAEjC,MAAME,EAAKtX,EAAEqV,GAAa,CACxBI,SAAUA,IAEZ6B,EAAG5W,IAAM2W,EAETzS,EAAO0S,EAAIH,EAAQ7V,SAEnBuU,EAASwB,EAAY/V,QAAQuU,QAC9B,CAED,IAAK,MAAM0B,KAAkBT,GAAOU,cAAc/V,KAAK0L,SrBxE3CU,OAAO,CAACC,EAAMjL,IAAMiL,EAAK2J,OAAO5U,GAAI,IqB0E1C0U,EAAOpK,SAAWoK,EAAOpK,QAAQjN,OAAS,KAIzCqX,EAAOtC,OAASmC,EAIfG,EAAO9P,MAAMoO,IAEf0B,EAAOtC,MAAQG,GAAGS,EAAO0B,EAAO9P,IAAd,OAClB8P,EAAOhB,SAAWnB,GAAGS,EAAO0B,EAAO9P,IAAd,WAKvB8P,EAAOtC,MAAQG,GAAGH,GAAMsC,EAAOtC,MAAOC,KAS1C,OALIO,EAASnU,SAAW8V,GAEtBxS,EAAO,KAAMuS,EAAQ7V,aAIxB,CAEOoW,QAAQC,EAAwBxK,GACtC,MAAMyK,EAAOzK,GAAW1L,KAAK0L,SAAW,GAExC,IAAK,MAAMoK,KAAUK,EAEfL,EAAOpK,SAAWoK,EAAOpK,QAAQjN,OAAS,IAC5CqX,EAAOlV,KAAO,CACZmP,SAAS,SAKOX,IAAhB0G,EAAOlV,MAAsBsV,EAAWtV,OAC1CkV,EAAOlV,KAAO,CACZmP,SAAS,IAKR+F,EAAOlV,KAIsB,iBAAhBkV,EAAOlV,OACvBkV,EAAOlV,QACLmP,SAAS,GACN+F,EAAOlV,OANZkV,EAAOlV,KAAO,CACZmP,SAAS,GAST+F,EAAOpK,SACT1L,KAAKiW,QAAQC,EAAYJ,EAAOpK,QAGrC,CAEO0K,eACNF,EACAxK,GAEA,MAAMyK,EAAOzK,GAAW1L,KAAK0L,SAAW,GAExC,IAAK,MAAMoK,KAAUK,OACQ/G,IAAvB0G,EAAOO,cACTP,EAAOO,YAAcH,EAAWG,aAG9BP,EAAOpK,SACT1L,KAAKoW,eAAeF,EAAYJ,EAAOpK,QAG5C,CAEO4K,aACNJ,EACAxK,GAEA,MAAMyK,EAAOzK,GAAW1L,KAAK0L,SAAW,GAExC,IAAK,MAAMoK,KAAUK,OACM/G,IAArB0G,EAAOS,YACTT,EAAOS,UAAYL,EAAWK,WAG5BT,EAAOpK,SACT1L,KAAKsW,aAAaJ,EAAYJ,EAAOpK,QAG1C,CAEO8K,MAAM9K,GACZ,MAAMyK,EAAOzK,GAAW1L,KAAK0L,SAAW,GAExC,IAAK,MAAMoK,KAAUK,EACdL,EAAO9P,IAA6B,iBAAhB8P,EAAO/Q,OAE9B+Q,EAAO9P,GAAKgP,GAAUc,EAAO/Q,OAG1B+Q,EAAO9P,IACVyQ,GAAOtP,0GAML2O,EAAOpK,SACT1L,KAAKwW,MAAMV,EAAOpK,QAGvB,CAEOgL,gBACNR,EACAxK,GAGA,IAAK,MAAMoK,KAAUpK,OACG0D,IAAlB0G,EAAOhH,QACToH,EAAWpH,OAAOD,OAChB7I,GAAI8P,EAAO9P,GACXjH,MAAO,IACJ+W,EAAOhH,QACVK,SAAUpB,GAAehF,OAIhC,CAEiBW,mBAChBgC,GAEA,MAAMwE,EAAS,IAAImF,GAEnB,IAAK,MAAMS,KAAUpK,EACnB,GAAsB,iBAAXoK,GAAuBa,EAAeb,GAC/C5F,EAAOxE,QAAQnL,KAAK,CAClBwE,KAAM+Q,YAEmB,iBAAXA,EAAqB,CACrC,MAAMc,EAAcd,EAEhBc,EAAYlL,UACdkL,EAAYlL,QAAU2J,GAAOwB,YAAYD,EAAYlL,SAASA,SAK9B,iBAAvBkL,EAAY9H,aACIM,IAArBwH,EAAYjS,OACdiS,EAAYjS,KAAO,MAKvBuL,EAAOxE,QAAQnL,KAAKuV,EACrB,CAGH,OAAO5F,CACR,CAEoBxG,sBAACwM,GACpB,MAAMhG,EAAS,IAAImF,GAmBnB,OAhBIa,EAAWpD,KACb5C,EAAOxE,QAAU2J,GAAOyB,cAAcZ,EAAWpD,MAAMpH,QAC9CwK,EAAWxK,QACpBwE,EAAOxE,QAAU2J,GAAOwB,YAAYX,EAAWxK,SAASA,SAExDwK,EAAWvR,MACmB,iBAAvBuR,EAAWvR,KAAK,IACrBuR,EAAWvR,KAAK,aAAcrD,QAIhC4O,EAAOxE,QAAUjD,OAAOD,KAAK0N,EAAWvR,KAAK,IAAI8E,IAAK1E,IAC7C,CAAEA,KAAMA,MAIfmL,EAAOxE,QAAQjN,QACjByR,EAAOsG,QACPtG,EAAO+F,QAAQC,GACfhG,EAAOkG,eAAeF,GACtBhG,EAAOoG,aAAaJ,GACpBhG,EAAOwG,gBAAgBR,EAAYhG,EAAOxE,SACnCwE,OAIV,CAEmBxG,qBAACuC,GACnB,MAAMiE,EAAS,IAAImF,GAEb0B,EADQ9K,EAAQ+K,cAAc,SAClBrC,iBAAiB,MAEnC,IAAK,MAAMsC,KAAMF,EACf7G,EAAOxE,QAAQnL,KAAK,CAClBwE,KAAMkS,EAAGhS,UACTuO,MAAOyD,EAAGzD,QAId,OAAOtD,CACR,CAqBmBxG,qBAACgC,GACnB,IAAIR,EAA6B,GACjC,MAAMiL,EAAOzK,GAAW,GACxB,IAAIwL,EAAU,GAEd,GAAIf,GAAQA,EAAK1X,OAAQ,CACvByM,EAAO3K,KAAK4V,GAEZ,IAAK,MAAMgB,KAAOhB,EACZgB,EAAIzL,SAAWyL,EAAIzL,QAAQjN,SAC7ByY,EAAUA,EAAQlB,OAAOmB,EAAIzL,UAI7BwL,EAAQzY,SACVyM,EAASA,EAAO8K,OAAOhW,KAAK+V,cAAcmB,IAE7C,CAED,OAAOhM,CACR,CAOiBxB,mBAACgC,GACjB,IAAIR,EAA6B,GACjC,MAAMiL,EAAOzK,GAAW,GAExB,GAAIyK,GAAQA,EAAK1X,OACf,IAAK,MAAM0Y,KAAOhB,EACXgB,EAAIzL,SAAkC,IAAvByL,EAAIzL,QAAQjN,QAC9ByM,EAAO3K,KAAK4W,GAGVA,EAAIzL,UACNR,EAASA,EAAO8K,OAAOhW,KAAKoX,YAAYD,EAAIzL,WAKlD,OAAOR,CACR,CAMkBxB,oBAACoM,GAClB,YAAYC,cAAc,CAACD,IAASrX,OAAS,CAC9C,QC/WkB4Y,GAQnB5X,mBAPA6X,uBACAC,2BACAC,uBACAC,uBACAC,oBACAC,uBAGE3X,KAAKsX,WAAa,GAClBtX,KAAKuX,gBAAiB,EACtBvX,KAAKwX,WAAa,GAClBxX,KAAKyX,WAAa,GAClBzX,KAAK0X,QAAU,CAChB,CAKD7K,SAAS+K,GACP,MAAM5R,EA1BM,MA0BShG,KAAK0X,UAE1B,OADA1X,KAAKsX,WAAWtR,GAAM4R,EACf5R,CACR,CAIDoK,WAAWpK,GACT,IAAKhG,KAAKsX,WAAWtR,GACnB,MAAMqI,qCAC2BrI,wDAIvBsR,WAAWtR,EACxB,CAMDyK,QAAQoH,GACN,IAAK7X,KAAKuX,eACR,MAAMlJ,MACJ,+DAIJ,IAAK,IAAIyJ,EAAK,EAAGA,EAAKD,EAAIpZ,OAAQqZ,IAAM,CACtC,MAAM9R,EAAK6R,EAAIC,GACf,GAAI9X,KAAKyX,WAAWzR,IAClB,IAAKhG,KAAKwX,WAAWxR,GACnB,MAAMqI,mGACWrI,UAHrB,CAOA,IAAKhG,KAAKsX,WAAWtR,GACnB,MAAMqI,kCACwBrI,4CAIhChG,KAAK+X,gBAAgB/R,EAPpB,CAQF,CACF,CAIDuH,SAASL,GACP,GAAIlN,KAAKuX,eACP,MAAMlJ,MACJ,wEAIJrO,KAAKgY,kBAAkB9K,GACvB,IACE,IAAK,MAAMlH,UAAWsR,WAChBtX,KAAKyX,WAAWzR,IAGpBhG,KAAK+X,gBAAgB/R,EAIxB,CATD,QAQEhG,KAAKiY,kBACN,CACF,CAIDC,gBACE,YAAYX,cACb,CAOOQ,gBAAgB/R,GACtBhG,KAAKyX,WAAWzR,IAAM,EACtBhG,KAAKsX,WAAWtR,GAAIhG,KAAK2X,iBACzB3X,KAAKwX,WAAWxR,IAAM,CACvB,CAMOgS,kBAAkB9K,GACxB,IAAK,MAAMlH,UAAWsR,WACpBtX,KAAKyX,WAAWzR,IAAM,EACtBhG,KAAKwX,WAAWxR,IAAM,EAExBhG,KAAK2X,gBAAkBzK,EACvBlN,KAAKuX,gBAAiB,CACvB,CAMOU,+BACMN,gBACZ3X,KAAKuX,gBAAiB,CACvB,EC/HH,MAAeY,ICFf,MAAMC,WAAsBD,GAG1B1Y,YAAYkF,GACV2D,aAHM3D,YAIN3E,KAAKqY,IAAI1T,EACV,CAEe2T,YACd,MAAM3T,aAAkBA,OAExB,MAAO,CACLA,KAAMA,EACNgN,MAAOhN,EAAKlG,OAEf,CAEM4Z,IAAI1T,GAOT,OANIA,aAAgBrD,MAClBtB,KAAK2E,KAAO,IAAaA,EAChBA,aAAgBsG,WACzBjL,KAAK2E,KAAOA,OAIf,ECTH,MAAM4T,WAAsBJ,GAG1B1Y,YAAYkO,GACVrF,aAHeqF,eAIf3N,KAAK2N,QAAUA,CAChB,CAEO6K,QAAQC,GACd,MAAmC,wBAAnB9K,QAAQV,YACVU,QAAQV,OAAOwL,GAGzBA,EAASC,GACJD,EAASE,QAEhB5J,GAAI5H,+BACuBsR,EAASG,YAAYH,EAASI,cACvD,QAIL,CAEMjK,IAAIjB,GAGT,MAAMmL,OACD9Y,KAAK2N,QACLA,GAOL,MAAyB,mBAAdmL,EAAKnU,KACPmU,EAAKnU,KAAKmU,GAGZC,MAAMD,EAAKjL,IAAKiL,GACpBE,KAAKhZ,KAAKwY,QAAQzL,KAAK/M,OACvBgZ,KAAMC,IACE,CACLtU,KAAMmU,EAAKE,KAAKC,GAChBtH,MAA6B,mBAAfmH,EAAKnH,MAAuBmH,EAAKnH,MAAMsH,QAAO7J,IAGnE,EC5DH,MAAM8J,GAM8BxP,4BAACwM,GACjC,IAAIiD,EAAU,KAoBd,OAlBIjD,EAAWvR,OACbwU,EAAU,IAAIf,GAAclC,EAAWvR,OAGrCuR,EAAWpD,OACbqG,EAAU,IAAIf,GAAcpY,KAAKoZ,oBAAoBlD,EAAWpD,OAEhEoD,EAAWpD,KAAK3Q,MAAMkX,QAAU,QAG9BnD,EAAWjG,SACbkJ,EAAU,IAAIZ,GAAcrC,EAAWjG,SAGpCkJ,GACHpK,GAAI5H,MAAM,wCAAwC,GAG7CgS,CACR,CASyBzP,2BAACuC,GACzB,MAAMqN,EAAM,GAEN1P,EADQqC,EAAQ+K,cAAc,SACjBrC,iBAAiB,MAEpC,IAAK,MAAM3K,KAAOJ,EAAa,CAC7B,MAAMR,EAAuBY,EAAI2K,iBAAiB,MAC5C4E,EAAY,GAElB,IAAK,MAAMjQ,KAAQF,EAGY,IAA3BE,EAAK1E,WAAWnG,QAChB6K,EAAK1E,WAAW,GAAGP,WAAamV,KAAKC,UAErCF,EAAUhZ,M9BxDGsI,E8BwDSS,EAAKrE,W9BvDrB,IAAIyU,WAAYC,gBAAgB9Q,EAAS,aAC1C+Q,gBAAgBC,c8BwDrBN,EAAUhZ,KAAKuI,EAAKQ,EAAKrE,YAI7BqU,EAAI/Y,KAAKgZ,EACV,K9B/DkB1Q,E8BiEnB,OAAOyQ,CACR,EC/BH,MAAMQ,WAAiC3P,EAWrC1K,YAAYsa,GACVzR,aAVe0R,OACf,IAAIC,SAEEC,MAA0B,IAAID,SAI9BE,2BAA6B,EAK/BJ,GACFA,EAAMlW,QAASuW,GAASpa,KAAK6M,SAASuN,GAEzC,CAKDC,aACEra,KAAKka,MAAQ,IAAID,IACjBja,KAAKma,2BAA6B,CACnC,CAQDtN,SACE2E,EACA8I,EAAmB,MAEnB,GAAuB,OAAnB9I,EAAU1S,KACZ,MAAMuP,MAAM,iCAIdmD,EAAUlH,GAAG,eAAgBtK,KAAKua,sBAAsBxN,KAAK/M,OAE7DA,KAAKwa,uBAAuBhJ,EAAW8I,GACvCta,KAAKya,gBAAgBjJ,EACtB,CAODpB,WAAWoB,GACT,IAAKA,EAAW,OAEhB,MAAMkJ,EAAW1a,KAAKga,OAAOpL,IAAI4C,EAAU1S,MAEvC4b,GAAYA,EAASjc,SACvBuB,KAAKga,OAAO3B,IACV7G,EAAU1S,KACV4b,EAAShQ,OAAQiQ,GAASA,GAAQnJ,IAEpCxR,KAAK2K,KAAK,UAAW6G,GAExB,CAQOgJ,uBACNhJ,EACA8I,GAEA,IAAII,EAAW1a,KAAKga,OAAOpL,IAAI4C,EAAU1S,MAEzC,IAAK4b,EAAU,CACb,MAAME,EAAa,GACnB5a,KAAKga,OAAO3B,IAAI7G,EAAU1S,KAAM8b,GAChCF,EAAWE,CACZ,CAED,GAAiB,OAAbN,GAAqBA,EAAW,EAClCI,EAASna,KAAKiR,QAEd,GAAKkJ,EAASJ,GAGP,CAEL,MAAMO,EAAQH,EAASnY,MAAM,EAAG+X,EAAW,GACrCQ,EAASJ,EAASnY,MAAM+X,EAAW,GAEzCta,KAAKga,OAAO3B,IAAI7G,EAAU1S,KAAM+b,EAAM7E,OAAOxE,GAAWwE,OAAO8E,GAChE,MAPCJ,EAASJ,GAAY9I,CAS1B,CAKGuI,YACF,IAAIA,EAAmC,GAEvC,IAAK,MAAMjb,UAAaic,0BAA2B,CACjD,MAAML,EAAW1a,KAAKga,OAAOpL,IAAI9P,GAE7B4b,GAAYA,EAASjc,SACvBsb,EAAQA,EAAM/D,OAAO0E,GAExB,CAGD,OAAOX,EAAMrP,OAAQvM,GAAMA,EAC5B,CAQD6c,eAAelc,GACb,YAAYib,MAAMrP,OAAQK,GAAYA,EAAQjM,OAASA,EACxD,CAKOic,0BACN,OAAOtS,OAAOD,KAAKtC,GAChBwE,OAAQ1L,IAASiS,MAAMC,OAAOlS,KAC9ByK,IAAKzK,GAAQkS,OAAOlS,GACxB,CAQYsZ,cAAC3T,GACZ,MAAMwV,EAA4Bna,KAAKma,0BACjCJ,EAAQ/Z,KAAK+Z,MAEnB,IAAI1N,EAAO1H,EAEX,IACE,IAAK,MAAM6M,KAAauI,EACC/Z,KAAKib,uBAAuBzJ,EAAUxL,KAEvCmU,GAKpB9N,QAAamF,EAAUzG,QAAQsB,GAC/BrM,KAAKka,MAAM7B,IAAI7G,EAAUxL,GAAIqG,IAG7BA,EAAOrM,KAAKka,MAAMtL,IAAI4C,EAAUxL,GAUrC,CAPC,MAAO/H,GAMP,MALA8Q,GAAI5H,MAAMlJ,GAEV+B,KAAK2K,KAAK,QAAS0B,GAGbpO,CACP,CAQD,OALA+B,KAAKma,0BAA4BJ,EAAMtb,OAGvCuB,KAAK2K,KAAK,eAAgB0B,GAEnBA,CACR,CAOO4O,uBAAuBC,GAC7B,YAAYnB,MAAMoB,UAAWrb,GAAMA,EAAEkG,IAAMkV,EAC5C,CAOOE,sBAAsB5J,GAC5B,MAAM6J,EAAiBrb,KAAKib,uBAAuBzJ,EAAUxL,IAEzDhG,KAAKma,0BAA4BkB,IACnCrb,KAAKma,0BAA4BkB,EAEpC,CAEOd,sBAAsB/I,GAC5BxR,KAAKob,sBAAsB5J,GAC3BxR,KAAK2K,KAAK,gBACV3K,KAAK2K,KAAK,UAAW6G,EACtB,CAEOiJ,gBAAgBjJ,GACtBxR,KAAKob,sBAAsB5J,GAC3BxR,KAAK2K,KAAK,iBACV3K,KAAK2K,KAAK,UAAW6G,EACtB,ECnPH,MAAM8J,WAAyB1Q,EAIzB9L,WACF,OAAOoH,EAAcqV,SACtB,CAEajD,eAACQ,GACb,kBAAkB/Z,MAAMoa,QAAQvK,IAAIkK,EACrC,ECjBH,MAAM0C,WAAkC5Q,EAIlC9L,WACF,OAAOoH,EAAcuV,WACtB,CAEDtQ,SAASuQ,GACP,MAAM9P,EAAUjC,EAAQgS,UAAUD,EAAc/W,MAKhD,OAFAiH,EAAQnN,OAASid,EAAc/J,MAExB/F,CACR,ECRH,MAAMgQ,WAAwBhR,EAIxB9L,WACF,OAAOoH,EAAc2V,SACtB,CAED1Q,WACE,OAAO1C,OAAOqT,QAAQ9b,KAAKjB,MAAMgd,sBAC9BrR,OAAO,EAAExK,EAAG4H,KAAwB,mBAARA,GAC5BsE,OACC,CAAC4P,GAAM5b,EAAGvB,UAAamd,GAAK5b,CAACA,GAAIvB,IACjC,GAEL,ECNH,MAAMod,WAA0CrR,EAI1C9L,WACF,OAAOoH,EAAcuV,WACtB,CAEOS,SAASvX,GACf,IAAKA,IAASA,EAAKlG,OACjB,MAAO,GAGT,IAAKuB,KAAKjB,MAAMmR,SAAWlQ,KAAKjB,MAAMmR,OAAOxE,QAC3C,OAAO/G,EAGT,MAAM+G,EAAU2J,GAAO+B,YAAYpX,KAAKjB,MAAMmR,OAAOxE,SAGrD,OAAI/G,EAAK,aAAcrD,MACbqD,EAAoB8E,IAAKO,IAC/B,IAAImS,EAAM,EAEV,OAAOzQ,EAAQjC,IAAI,CAACqM,EAAQlY,SAENwR,IAAhB0G,EAAOnR,MACTwX,IAE2B,mBAAhBrG,EAAOnR,KACTmR,EAAOnR,KAAKqF,GAEZ8L,EAAOnR,MAIXqF,EAAIpM,EAAIue,GAZV,GAkBY,iBAAZxX,EAAK,IAAqBA,EAAK,aAAcrD,MAoBjD,GAnBGqD,EAAqB8E,IAAKO,GAChC0B,EAAQjC,IAAI,CAACqM,EAAQlY,SACCwR,IAAhB0G,EAAOnR,KACkB,mBAAhBmR,EAAOnR,KACTmR,EAAOnR,KAAKqF,GAEZ8L,EAAOnR,KAEPmR,EAAO9P,GACTgE,EAAI8L,EAAO9P,KAElByQ,GAAOtP,gEAAgEvJ,wGAShF,CAEDuN,SAASiR,GACP,MAAO,CACLzX,KAAM3E,KAAKkc,SAASE,EAAgBzX,MACpCgN,MAAOyK,EAAgBzK,MAE1B,ECjFH,MAAM0K,GACmB3S,wBAACnB,GACtB,MAAM4H,EAAW,IAAI2J,GAgBrB,OAdIvR,EAAO4Q,mBAAmBZ,IAC5BpI,EAAStD,SACP,IAAI+O,GAAgB,CAClBG,qBAAsBxT,EAAO0H,UAKnCE,EAAStD,SAAS,IAAIyO,GAAiB,CAAEnC,QAAS5Q,EAAO4Q,WACzDhJ,EAAStD,SACP,IAAIoP,GAAkC,CAAE/L,OAAQ3H,EAAO2H,UAEzDC,EAAStD,SAAS,IAAI2O,IAEfrL,CACR,QC+EUmM,GAKX7c,YAAY8I,QAFJgU,mBAGN9T,OAAO2C,OAAOpL,UACTsc,GAAOE,gBACPjU,IAGLvI,KAAKuc,YAAc,EACpB,CAODnR,OAAOqR,GACL,IAAK,MAAMzd,KAAOyJ,OAAOD,KAAKiU,GAEhB,gBAARzd,IAEJgB,KAAKhB,GAAOyd,EAAczd,IAG5B,WACD,CAODgK,OAAOkN,GACL,OAAKA,GAELlW,KAAKuc,iBACAvc,KAAKuc,YACLrG,GAGLlW,KAAKoL,OAAOkR,GAAOI,eAAe1c,KAAKuc,wBAGxC,CAEmB7S,uBAClB,MAAO,CACLoF,OAAQ,IAAIJ,GACZhC,WAAY,IAAI2K,GAChBrD,S9C/JksB,CAACnU,QAAQ,M8CgK3sB6V,Q9ChKksB,CAAC7V,QAAQ,M8CiK3sB2T,MAAO,OACPmJ,OAAQ,OACRhH,WAAW,EACXxT,MAAO,GACPgK,UAAW,GAEd,CAEoBzC,sBAACwM,GACpB,MAAM3N,EAAS,IAAI+T,GAAOpG,GA8D1B,OA3DA3N,EAAOgU,YAAcrG,EAGU,kBAApBA,EAAWtV,MAAsBsV,EAAWtV,MACrD2H,EAAO6C,OAAO,CACZxK,KAAM,CACJgc,aAAa,KAMnBrU,EAAO6C,OAAO,CACZ8E,OAAQmF,GAAOqH,eAAenU,KAGhCA,EAAO6C,OAAO,CACZ+N,QAASD,GAAa2D,qBAAqB3G,KAG7C3N,EAAO6C,OAAO,CACZ+E,SAAUkM,GAAcS,iBAAiBvU,KAI3CA,EAAO6C,OAAO,CACZ/C,WAAY,IAAIjB,EAAW8O,EAAW7O,YAIxCkB,EAAOuG,OAAOD,IAAI,CAChB7I,GAAI,SACJmJ,SAAUpB,GAAesH,OACzB5F,UAAWC,GACX3Q,SACEgR,SACwB,IAAtBmG,EAAW/P,QAAmB+P,EAAW/P,kBAAkBsC,QACzDyN,EAAW/P,UAKnBoC,EAAOuG,OAAOD,IAAI,CAChB7I,GAAI,aACJmJ,SAAUpB,GAAegP,OACzBtN,UAAW8B,GACXxS,SACEgR,SAC4B,IAA1BmG,EAAW3P,YACX2P,EAAW3P,sBAAsBkC,QAC/ByN,EAAW3P,cAKf2P,EAAWvH,SACbuH,EAAWvH,QAAQ9K,QAAS/D,GAAMyI,EAAOuG,OAAOD,IAAI/O,IAG/CyI,CACR,GrB3KH,SAAYyF,GACVA,mBACAA,yBACAA,uBACAA,2BACAA,oBALF,CAAA,CAAYA,KAAAA,csB1CCgP,WAAW7U,EACdU,UACN,OACE7I,KAAKjB,MAAM+W,QAC4B,wBAA3B/W,MAAM+W,OAAOmH,eAEble,MAAM+W,OAAOmH,UACvBjd,KAAKjB,MAAMuK,KAAK3E,KAChB3E,KAAKjB,MAAMiL,IACXhK,KAAKjB,MAAM+W,QAIX9V,KAAKjB,MAAM+W,QAAU9V,KAAKjB,MAAM+W,OAAOhH,SAEtCQ,IACCC,SAAUvP,KAAKjB,MAAM+W,OAAO9P,GAC5BjH,MAAO,CACL+W,OAAQ9V,KAAKjB,MAAM+W,OACnBxM,KAAMtJ,KAAKjB,MAAMuK,KACjBU,IAAKhK,KAAKjB,MAAMiL,YAMZjL,MAAMuK,KAAK3E,IACxB,CAEOuY,YAAYjf,GACd+B,KAAKjB,MAAMoe,aACfnd,KAAKuI,OAAO6U,aAAazS,KACvB,YACA1M,EACA+B,KAAKjB,MAAMuK,KACXtJ,KAAKjB,MAAM+W,OACX9V,KAAKjB,MAAMiL,IAEd,CAEOqT,oBACNvH,GAEA,OAAKA,EAE4B,mBAAtBA,EAAOhR,WACTgR,EAAOhR,WACZ9E,KAAKjB,MAAMuK,KAAK3E,KAChB3E,KAAKjB,MAAMiL,IACXhK,KAAKjB,MAAM+W,QAGNA,EAAOhR,WATI,EAWrB,CAED3B,SACE,iBAEIuP,KAAM1S,KAAKjB,MAAM2T,KACjB4K,QAAStd,KAAKjB,MAAMue,QACpB,iBAAgBtd,KAAKjB,MAAM+W,QAAU9V,KAAKjB,MAAM+W,OAAO9P,GACvDmG,UAAWI,EACTJ,EAAU,MACVnM,KAAKjB,MAAMoN,UACXnM,KAAKuI,OAAO4D,UAAUoR,IAExBpb,WACKnC,KAAKjB,MAAMoD,MACXnC,KAAKuI,OAAOpG,MAAMob,IAEvB5K,QAAS3S,KAAKkd,YAAYnQ,KAAK/M,OAC3BA,KAAKqd,oBAAoBrd,KAAKjB,MAAM+W,SAEvC9V,KAAK6I,UAGX,QCjFU2U,WAAWrV,EACdsV,UAAU1R,GAChB,GAAI/L,KAAKjB,MAAMmR,OAAQ,CACrB,MAAMiG,EAAOd,GAAO+B,YAAYpX,KAAKjB,MAAMmR,OAAOxE,SAElD,GAAIyK,EACF,OAAOA,EAAKpK,EAEf,CAED,WACD,CAEOmR,YAAYjf,GACd+B,KAAKjB,MAAM2e,YACf1d,KAAKuI,OAAO6U,aAAazS,KAAK,WAAY1M,EAAG+B,KAAKjB,MAAMiL,IACzD,CAEO2T,cACN,OAAI3d,KAAKjB,MAAML,cACDK,MAAML,WAGf8Q,OACExP,KAAKjB,MAAMiL,IAAIZ,MAAMK,IAAI,CAACH,EAAY1L,KACrC,MAAMkY,EAAS9V,KAAKyd,UAAU7f,GAE9B,OAAIkY,GAAUA,EAAO9J,cAGlBgR,IACChe,IAAKsK,EAAKtD,GACVsD,KAAMA,EACNU,IAAKhK,KAAKjB,MAAMiL,IAChB8L,OAAQA,MAOrB,CAED3S,SACE,eAEIgJ,UAAWI,EAAUJ,EAAU,MAAOnM,KAAKuI,OAAO4D,UAAUyR,IAC5DjL,QAAS3S,KAAKkd,YAAYnQ,KAAK/M,OAE9BA,KAAK2d,cAGX,QCtDUE,WAAmB1V,EAC9BhF,SACE,SACGqa,IAAGE,YAAY,GACdnf,EAACye,IACCtK,KAAK,QACL4K,QAAStd,KAAKjB,MAAMue,QACpBH,aAAa,EACb7T,KAAM,IAAIP,EAAK/I,KAAKjB,MAAM2I,SAC1ByE,UAAWI,EACTJ,EAAU,WACVnM,KAAKjB,MAAMoN,UAAYnM,KAAKjB,MAAMoN,UAAY,QAKvD,QCbU2R,WAAc3V,EACjB4V,eACN,OAAI/d,KAAKjB,MAAMmR,YACDnR,MAAMmR,OAAOqF,eAAe9W,QAG3C,CAED0E,SACE,kBAEIgJ,UAAWI,EAAUJ,EAAU,SAAUnM,KAAKuI,OAAO4D,UAAU6R,QAE9Dhe,KAAKjB,MAAM4F,MACV3E,KAAKjB,MAAM4F,KAAKiF,KAAKH,IAAKO,KAChBwT,IAAGxe,IAAKgL,EAAIhE,GAAIgE,IAAKA,EAAKkG,OAAQlQ,KAAKjB,MAAMmR,UAGxDlQ,KAAKjB,MAAM6Z,SAAW5K,GAAOiQ,WAC1Bje,KAAKjB,MAAM4F,MAAmC,IAA3B3E,KAAKjB,MAAM4F,KAAKlG,SACnCF,EAACsf,IACCnW,QAAS1H,KAAKE,EAAE,WAChBod,QAAStd,KAAK+d,eACd5R,UAAWI,EACTJ,EAAU,WACVnM,KAAKuI,OAAO4D,UAAUlF,WAK7BjH,KAAKjB,MAAM6Z,SAAW5K,GAAOkQ,UAC5Ble,KAAKjB,MAAM4F,MACgB,IAA3B3E,KAAKjB,MAAM4F,KAAKlG,QACdF,EAACsf,IACCnW,QAAS1H,KAAKE,EAAE,kBAChBod,QAAStd,KAAK+d,eACd5R,UAAWI,EACTJ,EAAU,YACVnM,KAAKuI,OAAO4D,UAAUgS,YAK7Bne,KAAKjB,MAAM6Z,SAAW5K,GAAOK,OAC5B9P,EAACsf,IACCnW,QAAS1H,KAAKE,EAAE,SAChBod,QAAStd,KAAK+d,eACd5R,UAAWI,EACTJ,EAAU,SACVnM,KAAKuI,OAAO4D,UAAUhF,SAMjC,ECrDH,MAAMiX,WAAmBxT,EACbI,gBACR,IAAK,MAAMqT,UAAkBtf,MAAM2M,aACL0D,IAAxBiP,EAAUC,YACZD,EAAUC,UAAY,GAGI,IAAxBD,EAAUC,YAA4C,IAAzBD,EAAUC,WACzCvP,GAAI5H,gCAAgCkX,EAAUC,YAGnD,CAEGxf,WACF,OAAOoH,EAAcqY,IACtB,CAEOC,QAAQC,EAAcC,GAC5B,OAAID,EAAQC,IAEDD,EAAQC,GACT,GAIX,CAEOC,eAAevgB,EAAQkC,GAC7B,IAAIse,EAAM,EAEV,IAAK,MAAM9I,UAAe/W,MAAM2M,QAAS,CACvC,GAAY,IAARkT,EAUF,MAVa,CACb,MAAMH,EAAQrgB,EAAEgL,MAAM0M,EAAOvM,OAAO5E,KAC9B+Z,EAAQpe,EAAE8I,MAAM0M,EAAOvM,OAAO5E,KAGlCia,GAD4B,mBAAnB9I,EAAO0I,QACT1I,EAAO0I,QAAQC,EAAOC,GAAS5I,EAAOwI,UAEtCte,KAAKwe,QAAQC,EAAOC,GAAS5I,EAAOwI,SAE9C,CAGF,CAED,OAAOM,CACR,CAESzT,SAASxG,GACjB,MAAMka,EAAa,IAAIla,EAAKiF,MAC5BiV,EAAWje,KAAKZ,KAAK2e,eAAe5R,KAAK/M,OAEzC,MAAM8e,EAAS,IAAInV,EAAQkV,GAK3B,OAFAC,EAAOrgB,OAASkG,EAAKlG,OAEdqgB,CACR,QCnEUC,WAAkBtS,EAC7BG,kBACE,MAAO,EACR,CAEDK,OAAOnO,EAAMoO,GACX,GAAa,gBAATpO,EAAwB,CAC1B,MAAMyK,MAAEA,EAAF+U,UAASA,EAATU,MAAoBA,EAApBR,QAA2BA,GAAYtR,EAC7ClN,KAAKif,WAAW1V,EAAO+U,EAAWU,EAAOR,EAC1C,SAAmB,uBAAT1f,EAA+B,CACxC,MAAMyK,MAAEA,EAAFyV,MAASA,EAATR,QAAgBA,GAAYtR,EAClClN,KAAKkf,WAAW3V,EAAOyV,EAAOR,EAC/B,CACF,CAEOU,WACN3V,EACAyV,EACAR,GAEA,MACM1I,EADU,IAAI9V,KAAKsD,OACF6b,KAAM/d,GAAMA,EAAEmI,QAAUA,GAK7CvJ,KAAKif,WAAW1V,EAHbuM,GAGyC,IAArBA,EAAOwI,WAAmB,EAF1B,EAEiCU,EAAOR,EAElE,CAEOS,WACN1V,EACA+U,EACAU,EACAR,GAEA,IAAI9S,EAAU,IAAI1L,KAAKsD,OACvB,MAAM8b,EAAQ1T,EAAQjN,OAChBqX,EAASpK,EAAQyT,KAAM/d,GAAMA,EAAEmI,QAAUA,GAG/C,IAAIsF,GAAM,EACNwQ,GAAQ,EACRrQ,GAAS,EACThG,GAAS,EA8Cb,QAnD0BoG,IAAX0G,EAwBRkJ,GAYuB,IAAtBlJ,EAAOwI,UAGTtP,GAAS,EAEThG,GAAS,EAfG,IAAVoW,EACFpW,GAAS,EACAoW,EAAQ,IAGjBC,GAAQ,EACRxQ,GAAM,GAvBI,IAAVuQ,EAEFvQ,GAAM,EACGuQ,EAAQ,IAAMJ,GAGvBnQ,GAAM,EACNwQ,GAAQ,GACCD,EAAQ,GAAKJ,IAGtBnQ,GAAM,GA0BNwQ,IAEF3T,EAAU,IAGRmD,EACFnD,EAAQnL,KAAK,CACXgJ,MAAOA,EACP+U,UAAWA,EACXE,QAASA,YAEFxV,EAAQ,CACjB,MAAMO,EAAQmC,EAAQvL,QAAQ2V,GAC9BpK,EAAQnC,GAAO+U,UAAYA,CAC5B,SAAUtP,EAAQ,CACjB,MAAMzF,EAAQmC,EAAQvL,QAAQ2V,GAC9BpK,EAAQuD,OAAO1F,EAAO,EACvB,CAEDvJ,KAAK4F,SAAS8F,EACf,QCjGU4T,WAAoBhS,GAC/B2R,WACE1V,EACA+U,EACAU,EACAR,GAEAxe,KAAKuN,SAAS,cAAe,CAC3BhE,MAAOA,EACP+U,UAAWA,EACXU,MAAOA,EACPR,QAASA,GAEZ,CAEDU,WACE3V,EACAyV,EACAR,GAEAxe,KAAKuN,SAAS,qBAAsB,CAClChE,MAAOA,EACPyV,MAAOA,EACPR,QAASA,GAEZ,EC7BH,MAAMe,WAAmB3U,EAInB9L,WACF,OAAOoH,EAAcqZ,UACtB,CAEDpU,SAASwC,GACP,MAAMC,EAAU,GAUhB,OARI5N,KAAKjB,MAAM8O,MACbD,EAAO,IAAU5N,KAAKjB,MAAM8O,IAAIF,EAAQE,IAAK7N,KAAKjB,MAAM2M,UAGtD1L,KAAKjB,MAAM+O,OACbF,EAAO,KAAW5N,KAAKjB,MAAM+O,KAAKH,EAAQG,KAAM9N,KAAKjB,MAAM2M,eAIxDiC,EACAC,EAEN,QCGU2Q,WAAapW,EAOxB1I,YAAYV,EAA+BkB,GACzCqI,MAAMvJ,EAAOkB,QAPEuf,0BACA5P,oBACAC,kBACA4P,0BACTC,6BAKN1f,KAAK4P,QAAU,IAAI0P,GAAYtf,KAAKuI,OAAOmE,YAC3C1M,KAAK6P,MAAQ,IAAIkP,GAAU/e,KAAKuI,OAAOmE,YAEnC3N,EAAMgR,UACR/P,KAAKwf,cAAgBxf,KAAK2f,2BAC1B3f,KAAKyf,cAAgBzf,KAAK4f,YAAY7S,KAAK/M,MAC3CA,KAAK6P,MAAMvF,GAAG,UAAWtK,KAAKyf,eAC9Bzf,KAAKsD,MAAQ,CAAEgb,UAAW,GAE7B,CAEDlZ,uBACEpF,KAAKuI,OAAO4H,SAASC,WAAWpQ,KAAKwf,eAErCxf,KAAK6P,MAAMrF,IAAI,UAAWxK,KAAKyf,eAC3Bzf,KAAK0f,uBACP1f,KAAK6P,MAAMrF,IAAI,UAAWxK,KAAK0f,sBAClC,CAKOE,cACN,MAAMC,EAAgB7f,KAAK6P,MAAMvM,MAAM6b,KACpC/d,GAAMA,EAAEmI,QAAUvJ,KAAKjB,MAAMwK,OAQ9BvJ,KAAK4F,SALFia,EAKW,CACZvB,UAAWuB,EAAcvB,WALb,CACZA,UAAW,GAOhB,CAEOwB,oBAAoBC,GAE1B/f,KAAKwf,cAAc1U,SAAS,CAC1BY,QAASqU,GAEZ,CAEOJ,2BACN,IAAIK,EAAgB9Z,EAAcqY,KAE9Bve,KAAKuI,OAAO3H,MAA2C,sBAAvB2H,OAAO3H,KAAKqP,SAC9C+P,EAAgB9Z,EAAcqZ,YAGhC,MAAMU,EAAajgB,KAAKuI,OAAO4H,SAAS6K,eAAegF,GAIvD,IAAIxO,EA2BJ,OAxBIyO,EAAWxhB,OAAS,EACtB+S,EAAYyO,EAAW,IAMvBjgB,KAAK0f,sBAAwB1f,KAAK8f,oBAAoB/S,KAAK/M,MAC3DA,KAAK6P,MAAMvF,GAAG,UAAWtK,KAAK0f,uBAG5BlO,EADEwO,IAAkB9Z,EAAcqZ,WACtB,IAAIA,MACd7T,QAAS1L,KAAK6P,MAAMvM,OACjBtD,KAAKuI,OAAO3H,KAAKqP,SAGV,IAAImO,GAAW,CACzB1S,QAAS1L,KAAK6P,MAAMvM,QAIxBtD,KAAKuI,OAAO4H,SAAStD,SAAS2E,IAGzBA,CACR,CAED0O,gBAAgBjiB,GACdA,EAAEkiB,iBACFliB,EAAEmiB,kBAGFpgB,KAAK4P,QAAQsP,WACXlf,KAAKjB,MAAMwK,OACI,IAAftL,EAAEoiB,UAAqBrgB,KAAKuI,OAAO3H,KAAKgc,YACxC5c,KAAKjB,MAAMyf,QAEd,CAEDrb,SACE,IAAKnD,KAAKjB,MAAMgR,QACd,YAGF,MAAMuO,EAAYte,KAAKsD,MAAMgb,UAC7B,IAAIgC,EAAgB,UAQpB,OANkB,IAAdhC,EACFgC,EAAgB,OACQ,IAAfhC,IACTgC,EAAgB,oBAMd7N,UAAW,EACX,aAAYzS,KAAKE,eAA4B,IAAdoe,EAAkB,OAAS,QAC1D1L,MAAO5S,KAAKE,eAA4B,IAAdoe,EAAkB,OAAS,QACrDnS,UAAWI,EACTJ,EAAU,QACVA,EAAU,OAAQmU,GAClBtgB,KAAKuI,OAAO4D,UAAUvL,MAExB+R,QAAS3S,KAAKkgB,gBAAgBnT,KAAK/M,OAGxC,QC/JUugB,WAAepY,qCAClBqY,mBACAC,YAEAC,SAASziB,GACf,OAAIA,aAAa0iB,WACRnb,KAAKgN,MAAMvU,EAAE2iB,OAEbpb,KAAKgN,MAAMvU,EAAE4iB,eAAe,GAAGD,MAEzC,CAEOE,MAAM7iB,GACZA,EAAEmiB,kBAMFpgB,KAAK4F,SAAS,CACZmb,YAAarN,SAHgB1T,KAAKjB,MAAMiiB,MAAMnhB,QAGdsC,MAAMqR,MAAO,IAAMxT,KAAK0gB,SAASziB,KAGnE+B,KAAKygB,KAAOzgB,KAAKihB,IAAIlU,KAAK/M,MAC1BA,KAAKwgB,OCzCe,EAACU,EAAuBC,EAAO,OACrD,IAAIC,EACAC,EACAC,EAEJ,MAAO,IAAIrZ,KACJmZ,GAKHvQ,aAAawQ,GACbA,EAAS1gB,WAAW,KACd4gB,KAAKC,MAAQF,GAAYH,IAC3BD,KAAMjZ,GACNqZ,EAAWC,KAAKC,MACjB,EACAhc,KAAKic,IAAIN,GAAQI,KAAKC,MAAQF,GAAW,MAV5CJ,KAAMjZ,GACNqZ,EAAWC,KAAKC,MAChBJ,GAAa,EASd,CACF,EDsBeM,CAAS1hB,KAAK2hB,KAAK5U,KAAK/M,MAAO,IAE7CsE,SAAS9B,iBAAiB,UAAWxC,KAAKygB,MAC1Cnc,SAAS9B,iBAAiB,WAAYxC,KAAKygB,MAC3Cnc,SAAS9B,iBAAiB,YAAaxC,KAAKwgB,QAC5Clc,SAAS9B,iBAAiB,YAAaxC,KAAKwgB,OAC7C,CAEOmB,KAAK1jB,GACXA,EAAEmiB,kBAIF,MAAMwB,EAAyB5hB,KAAKjB,MAAMiiB,MAAMnhB,QAG9CG,KAAKsD,MAAMyd,YAAc/gB,KAAK0gB,SAASziB,IACvCyV,SAASkO,EAAUzf,MAAM2S,SAAU,MAEnC8M,EAAUzf,MAAMqR,SAAWxT,KAAKsD,MAAMyd,YAAc/gB,KAAK0gB,SAASziB,OAErE,CAEOgjB,IAAIhjB,GACVA,EAAEmiB,kBAEF9b,SAAS3B,oBAAoB,UAAW3C,KAAKygB,MAC7Cnc,SAAS3B,oBAAoB,YAAa3C,KAAKwgB,QAC/Clc,SAAS3B,oBAAoB,YAAa3C,KAAKwgB,QAC/Clc,SAAS3B,oBAAoB,WAAY3C,KAAKygB,KAC/C,CAEDtd,SACE,gBAEIgJ,UAAWI,EAAUJ,EAAU,MAAOA,EAAU,cAChD0V,YAAa7hB,KAAK8gB,MAAM/T,KAAK/M,MAC7B8hB,aAAc9hB,KAAK8gB,MAAM/T,KAAK/M,MAC9B2S,QAAU1U,GAAMA,EAAEmiB,mBAGvB,QE5DU2B,WAAW5Z,EAItB1I,YAAYV,EAAOkB,GACjBqI,MAAMvJ,EAAOkB,QAJP+hB,Q1DvB8rB,CAACniB,QAAQ,W0DwBvsBmhB,M1DxB8rB,CAACnhB,QAAQ,M0D6B7sBG,KAAKsD,MAAQ,CACXnB,MAAO,GAEV,CAEO8f,aACN,YAAYljB,MAAM+W,OAAOlV,KAAKmP,OAC/B,CAEOmS,cACN,YAAYnjB,MAAM+W,OAAOS,SAC1B,CAEO5D,QAAQ1U,GACdA,EAAEmiB,kBAEEpgB,KAAKiiB,cACPjiB,KAAKgiB,QAAQniB,QAAQqgB,gBAAgBjiB,EAExC,CAEOkkB,QAAQlkB,GACV+B,KAAKiiB,cAA4B,KAAZhkB,EAAEmkB,OACzBpiB,KAAK2S,QAAQ1U,EAEhB,CAEDyF,oBACE/C,WAAW,KAET,GAAIX,KAAKjB,MAAM+W,OAAOO,aAAerW,KAAKghB,MAAMnhB,QAAS,CACvD,MAAMwiB,EAAYriB,KAAKghB,MAAMnhB,QAAQwiB,UAEZ,iBAAdA,GACTriB,KAAK4F,SAAS,CACZzD,MAAO,CACLmgB,IAAKD,IAIZ,GACA,EACJ,CAEOxZ,UACN,YAA+BuG,IAA3BpP,KAAKjB,MAAM+W,OAAO/Q,UACRhG,MAAM+W,OAAO/Q,UAGMqK,IAA7BpP,KAAKjB,MAAM+W,OAAOhH,SAEjBQ,IACCC,SAAUvP,KAAKjB,MAAM+W,OAAOhH,OAAO9I,GACnCjH,MAAO,CACL+W,OAAQ9V,KAAKjB,MAAM+W,cAO5B,CAEOuH,sBACN,MAAMvH,EAAS9V,KAAKjB,MAAM+W,OAE1B,OAAKA,EAE4B,mBAAtBA,EAAOhR,WACTgR,EAAOhR,WAAW,KAAM,KAAM9E,KAAKjB,MAAM+W,QAEzCA,EAAOhR,WALI,EAOrB,CAED3B,SACE,MAAMpE,EAAQ,GAMd,OAJIiB,KAAKiiB,eACPljB,EAAK,SAAe,aAKlBE,IAAKe,KAAKghB,MACV,iBAAgBhhB,KAAKjB,MAAM+W,QAAU9V,KAAKjB,MAAM+W,OAAO9P,GACvDmG,UAAWI,EACTJ,EAAU,MACVnM,KAAKiiB,aAAe9V,EAAU,KAAM,QAAU,KAC9CnM,KAAKjB,MAAM+W,OAAOO,YAAclK,EAAU,KAAM,SAAW,KAC3DnM,KAAKuI,OAAO4D,UAAU8K,IAExBtE,QAAS3S,KAAK2S,QAAQ5F,KAAK/M,MAC3BmC,WACKnC,KAAKuI,OAAOpG,MAAM8U,GAClB,CACDnC,SAAU9U,KAAKjB,MAAM+W,OAAOhB,SAC5BtB,MAAOxT,KAAKjB,MAAM+W,OAAOtC,OAExBxT,KAAKsD,MAAMnB,MACXnC,KAAKjB,MAAMoD,OAEhBogB,UAAWviB,KAAKmiB,QAAQpV,KAAK/M,MAC7BwiB,QAASxiB,KAAKjB,MAAMyjB,QAAU,EAAIxiB,KAAKjB,MAAMyjB,aAAUpT,EACvDkO,QAAStd,KAAKjB,MAAMue,QAAU,EAAItd,KAAKjB,MAAMue,aAAUlO,GACnDpP,KAAKqd,sBACLte,GAEJR,SAAK4N,UAAWA,EAAU,KAAM,YAAanM,KAAK6I,WACjD7I,KAAKiiB,cACJ1jB,EAACggB,MACCtf,IAAKe,KAAKgiB,QACVzY,MAAOvJ,KAAKjB,MAAMwK,OACdvJ,KAAKjB,MAAM+W,OAAOlV,OAGzBZ,KAAKkiB,eACJliB,KAAKjB,MAAMwK,MAAQvJ,KAAKuI,OAAO2H,OAAOqF,eAAe9W,OAAS,GAC5DF,EAACgiB,IAAOzK,OAAQ9V,KAAKjB,MAAM+W,OAAQkL,MAAOhhB,KAAKghB,QAIxD,QCzIUyB,WAActa,EACjBua,aACN5M,EACAhK,EACA6W,EACAzQ,GAEA,MAAMsQ,QAAEA,EAAFlF,QAAWA,YCjBnBxH,EACAhK,EACAoG,GAEA,MAAM0Q,EAAQvN,GAAOwN,aAAa/M,GAC5BgN,EAAgB5Q,EAAYpG,EAIlC,MAAO,CACL0W,QAJchd,KAAKgN,MAAMsQ,EAAgBF,EAAQA,EAAQE,GAKzDxF,QAJexH,EAAOpK,SAAWoK,EAAOpK,QAAQjN,QAAW,EAM9D,CDIgCskB,CAC3BjN,EACAhK,EACAoG,GAGF,SACG6P,IACCjM,OAAQA,EACRvM,MAAOoZ,EACPrF,QAASA,EACTkF,QAASA,GAGd,CAEOQ,UACNhZ,EACA8B,EACAoG,GAGA,MAAMkF,EAAc/B,GAAO+B,YAAYpX,KAAKjB,MAAMmR,OAAOxE,SAEzD,SACG8R,QACExT,EAAIP,IAAK0N,GACJA,EAAInL,iBAEI0W,aACVvL,EACArL,EACAsL,EAAYjX,QAAQgX,GACpBjF,IAKT,CAEO+Q,aACN,MAAMrZ,EAAOyL,GAAOU,cAAc/V,KAAKjB,MAAMmR,OAAOxE,SAEpD,OAAO9B,EAAKH,IAAI,CAACO,EAAK8B,IACpB9L,KAAKgjB,UAAUhZ,EAAK8B,EAAUlC,EAAKnL,QAEtC,CAED0E,SACE,OAAInD,KAAKjB,MAAMmR,kBAGTlR,IAAKgB,KAAKjB,MAAMmR,OAAOlK,GACvBmG,UAAWI,EAAUJ,EAAU,SAAUnM,KAAKuI,OAAO4D,UAAU+W,QAE9DljB,KAAKijB,kBAMb,QEhEUE,WAAchb,EACzBhF,SACE,kBAEIuP,KAAK,OACLvG,UAAWI,EAAUJ,EAAU,SAAUnM,KAAKuI,OAAO4D,UAAUiX,OAC/DjhB,WACKnC,KAAKuI,OAAOpG,MAAMihB,MAClB,CACDzG,OAAQ3c,KAAKjB,MAAM4d,UAIvBpe,EAACkkB,IAAMvS,OAAQlQ,KAAKjB,MAAMmR,SAC1B3R,EAACuf,IACCnZ,KAAM3E,KAAKjB,MAAM4F,KACjBiU,OAAQ5Y,KAAKjB,MAAM6Z,OACnB1I,OAAQlQ,KAAKjB,MAAMmR,SAI1B,QC7BUmT,WAAwBlb,EAMnC1I,YAAYV,EAAOkB,GACjBqI,MAAMvJ,EAAOkB,QAHPqjB,U9Dd8rB,CAACzjB,QAAQ,M8DmB7sBG,KAAKsD,MAAQ,CACXigB,UAAU,EAEb,CAED7f,oBACiD,IAA3C1D,KAAKsjB,UAAUzjB,QAAQnB,SAASD,QAClCuB,KAAK4F,SAAS,CACZ2d,UAAU,GAGf,CAEDpgB,SACE,OAAInD,KAAKsD,MAAMigB,kBAGTtkB,IAAKe,KAAKsjB,UACVnX,UAAWI,EAAUJ,EAAU,QAASnM,KAAKuI,OAAO4D,UAAU+D,QAC9D/N,WAAYnC,KAAKuI,OAAOpG,MAAM+N,SAE9B3R,EAAC+Q,IAAeH,SAAUpB,GAAesH,cAMhD,QCpCUmO,WAAwBrb,EAMnC1I,YAAYV,EAAOkB,GACjBqI,MAAMvJ,EAAOkB,QAHPwjB,U/Dd8rB,CAAC5jB,QAAQ,M+DmB7sBG,KAAKsD,MAAQ,CACXigB,UAAU,EAEb,CAED7f,oBACiD,IAA3C1D,KAAKyjB,UAAU5jB,QAAQnB,SAASD,QAClCuB,KAAK4F,SAAS,CACZ2d,UAAU,GAGf,CAEDpgB,SACE,OAAInD,KAAKsD,MAAMigB,kBAGTtkB,IAAKe,KAAKyjB,UACVtX,UAAWI,EACTJ,EAAU,UACVnM,KAAKuI,OAAO4D,UAAUuX,QAExBvhB,WAAYnC,KAAKuI,OAAOpG,MAAMuhB,SAE9BnlB,EAAC+Q,IAAeH,SAAUpB,GAAegP,cAMhD,QCpBU4G,WAAkBxb,EAI7B1I,YAAYV,EAAOkB,GACjBqI,MAAMvJ,EAAOkB,QAJE2jB,0BACTC,yBAMN7jB,KAAK4jB,chErC09Q,SAAWnmB,EAAEC,GAAG,IAAIC,EAAE,CAAC4B,IAAI7B,EAAE,OAAOK,IAAIoB,GgEqCp+Q,KhErCy+Q2kB,SAAS,SAASrmB,EAAEC,GAAG,OAAOD,EAAEiB,SAAShB,EAAE,EAAEqmB,SAAS,SAAStmB,GAAG,IAAIE,EAAEC,EAAE,OAAOoC,KAAKgE,kBAAkBrG,EAAE,IAAIC,EAAE,IAAIF,GAAGsC,KAAKA,KAAKgE,gBAAgB,WAAW,OAAOpG,CAAC,EAAEoC,KAAK4D,sBAAsB,SAASnG,GAAGuC,KAAKjB,MAAMiE,QAAQvF,EAAEuF,OAAOrF,EAAEkD,KAAKP,EAAE,EAAEN,KAAKqD,IAAI,SAAS5F,GAAGE,EAAE4C,KAAK9C,GAAG,IAAIC,EAAED,EAAE2H,qBAAqB3H,EAAE2H,qBAAqB,WAAWzH,EAAEsR,OAAOtR,EAAEwC,QAAQ1C,GAAG,GAAGC,GAAGA,EAAEiB,KAAKlB,EAAE,CAAC,GAAGA,EAAEiB,QAAQ,GAAG,OAAOf,EAAEomB,SAAS5kB,GAAGxB,EAAEmmB,SAAS/gB,YAAYpF,CAAC,CgEqC56RqmB,GAErBhkB,KAAKsD,MAAQ,CACXsV,OAAQ5K,GAAOiQ,QACf/N,OAAQnR,EAAMmR,OACdvL,KAAM,KAET,CAE4B2T,wBAC3BtY,KAAKjB,MAAMwJ,OAAO6U,aAAazS,KAAK,cAEpC3K,KAAK4F,SAAS,CACZgT,OAAQ5K,GAAOiQ,UAGjB,IACE,MAAMtZ,aAAkB5F,MAAMoR,SAASpF,UACvC/K,KAAK4F,SAAS,CACZjB,KAAMA,EACNiU,OAAQ5K,GAAOiW,SAGjBjkB,KAAKjB,MAAMwJ,OAAO6U,aAAazS,KAAK,OAAQhG,EAQ7C,CAPC,MAAO1G,GACP8Q,GAAI5H,MAAMlJ,GAEV+B,KAAK4F,SAAS,CACZgT,OAAQ5K,GAAOK,MACf1J,KAAM,MAET,CACF,CAEsB2T,0BACrB,MAAM/P,EAASvI,KAAKjB,MAAMwJ,kBAGf2b,kBAEP3b,EAAO2H,QAAUlQ,KAAKsD,MAAMqB,MAAQ3E,KAAKsD,MAAMqB,KAAKlG,QAGtDuB,KAAK4F,SAAS,CACZsK,OAAQ3H,EAAO2H,OAAOsF,YAAYjN,KAItCvI,KAAK6jB,kBAAoB7jB,KAAKkkB,gBAAgBnX,KAAK/M,MACnDA,KAAKjB,MAAMoR,SAAS7F,GAAG,UAAWtK,KAAK6jB,kBACxC,CAEDze,uBACEpF,KAAKjB,MAAMoR,SAAS3F,IAAI,UAAWxK,KAAK6jB,kBACzC,CAED9f,mBACE7D,EACAikB,GAIEA,EAAcvL,QAAU5K,GAAOkQ,UAC/Ble,KAAKsD,MAAMsV,QAAU5K,GAAOiW,SAE5BjkB,KAAK4F,SAAS,CACZgT,OAAQ5K,GAAOkQ,WAGjBle,KAAKjB,MAAMwJ,OAAO6U,aAAazS,KAAK,SAEvC,CAEDxH,SAGE,SAFsBnD,KAAK4jB,cAGVG,UAAS/gB,MAAOhD,KAAKjB,MAAMwJ,QACxChK,SACEmU,KAAK,gBACLvG,UAAWI,EACT,SACAJ,EAAU,aACVnM,KAAKsD,MAAMsV,SAAW5K,GAAOiQ,QAAU9R,EAAU,WAAa,KAC9DnM,KAAKjB,MAAMwJ,OAAO4D,UAAUsJ,WAE9BtT,WACKnC,KAAKjB,MAAMwJ,OAAOpG,MAAMsT,UACxB,CACDjC,MAAOxT,KAAKjB,MAAMyU,SAIrBxT,KAAKsD,MAAMsV,SAAW5K,GAAOiQ,SAC5B1f,SAAK4N,UAAWA,EAAU,iBAG5B5N,EAAC8kB,SAED9kB,SACE4N,UAAWA,EAAU,WACrBhK,MAAO,CAAEwa,OAAQ3c,KAAKjB,MAAM4d,SAE5Bpe,EAAC4kB,IACClkB,IAAKe,KAAKjB,MAAMwJ,OAAOyL,SACvBrP,KAAM3E,KAAKsD,MAAMqB,KACjBuL,OAAQlQ,KAAKsD,MAAM4M,OACnBsD,MAAOxT,KAAKjB,MAAMyU,MAClBmJ,OAAQ3c,KAAKjB,MAAM4d,OACnB/D,OAAQ5Y,KAAKsD,MAAMsV,UAIvBra,EAACilB,SAEDjlB,SACEU,IAAKe,KAAKjB,MAAMwJ,OAAOmN,QACvB1P,GAAG,cACHmG,UAAWA,EAAU,WAK9B,ECxJH,MAAMiY,WAAaja,EAIjB1K,YAAYyW,GACV5N,aAJKC,mBACAuG,cAIL9O,KAAKuI,OAAS,IAAI+T,GAAO,CAAE+H,SAAUrkB,KAAMod,aAAcpd,OAAQgJ,OAC/DkN,GAEFlW,KAAK8O,OAAS9O,KAAKuI,OAAOuG,MAC3B,CAEMwV,aAAapO,GAElB,OADAlW,KAAKuI,OAAOS,OAAOkN,OAEpB,CAEDzR,gBACE,OAAOlG,EAAEolB,GAAW,CAClBpb,OAAQvI,KAAKuI,OACb4H,SAAUnQ,KAAKuI,OAAO4H,SACtBD,OAAQlQ,KAAKuI,OAAO2H,OACpBsD,MAAOxT,KAAKuI,OAAOiL,MACnBmJ,OAAQ3c,KAAKuI,OAAOoU,QAEvB,CAQD4H,cAeE,OAdKvkB,KAAKuI,QAAWvI,KAAKuI,OAAOkN,WAC/B1G,GAAI5H,MACF,wEACA,GAKJnH,KAAKuI,OAAO4H,SAASkK,aAGrBlX,EAAO,KAAMnD,KAAKuI,OAAOkN,WACzBtS,EAAOnD,KAAKyE,gBAAiBzE,KAAKuI,OAAOkN,eAG1C,CAQDtS,OAAOsS,GAKL,OAJKA,GACH1G,GAAI5H,MAAM,oCAAoC,GAG5CsO,EAAU7Q,WAAWnG,OAAS,GAChCsQ,GAAI5H,+BACuBsO,mFAK7BzV,KAAKuI,OAAOkN,UAAYA,EACxBtS,EAAOnD,KAAKyE,gBAAiBgR,QAG9B,ECjF8B,IAAI5X,GAAEE,GAAEJ,GAAEC,GAAEE,GAAE,EAAEI,GAAE,GAAGF,GAAE,GAAGC,GAAER,EAAE2B,IAAIhB,GAAEX,EAAEgD,IAAI5B,GAAEpB,EAAE0G,OAAOzG,GAAED,EAAE8B,IAAIiC,GAAE/D,EAAE0H,QAAQ,SAASpF,GAAElC,EAAEF,GAAGF,EAAE+B,KAAK/B,EAAE+B,IAAIzB,GAAEF,EAAEC,IAAGH,GAAGG,GAAE,EAAE,IAAIF,EAAEG,GAAEymB,MAAMzmB,GAAEymB,IAAI,CAACrlB,GAAG,GAAGK,IAAI,KAAK,OAAO3B,GAAGD,EAAEuB,GAAGV,QAAQb,EAAEuB,GAAGoB,KAAK,CAACkkB,IAAIzmB,KAAIJ,EAAEuB,GAAGtB,EAAE,CAA2lB,SAASU,GAAEZ,EAAEC,GAAG,IAAIE,EAAEiC,GAAElC,KAAI,IAAIJ,EAAE8F,KAAKpC,GAAErD,EAAE0mB,IAAI5mB,KAAKE,EAAEqB,GAAGxB,EAAEG,EAAEF,EAAEA,EAAEG,GAAEymB,IAAIhlB,IAAIe,KAAKzC,GAAG,CAAiF,SAASoC,GAAEzC,GAAG,OAAOK,GAAE,EAA2N,SAAWL,EAAEM,GAAG,IAAIJ,EAAEoC,GAAElC,KAAI,GAAG,OAAOsD,GAAExD,EAAE6mB,IAAIzmB,IAAIJ,EAAE8mB,IAAIhnB,IAAIE,EAAEC,EAAEG,EAAEJ,EAAE6B,IAAI/B,EAAEE,EAAE8mB,KAAK9mB,EAAEwB,EAAE,CAA9SulB,CAAE,WAAW,MAAM,CAAC7kB,QAAQpC,EAAE,EAAE,GAAG,CAA+oB,SAAS6C,KAAI,IAAI,IAAIzC,EAAEA,EAAEK,GAAEymB,SAAS,GAAG9mB,EAAEiD,KAAKjD,EAAE2mB,IAAI,IAAI3mB,EAAE2mB,IAAIhlB,IAAIqE,QAAQ9C,IAAGlD,EAAE2mB,IAAIhlB,IAAIqE,QAAQzD,IAAGvC,EAAE2mB,IAAIhlB,IAAI,EAAuC,CAApC,MAAMzB,GAAGF,EAAE2mB,IAAIhlB,IAAI,GAAG/B,EAAE4B,IAAItB,EAAEF,EAAE6B,IAAI,CAAC,CAACjC,EAAE2B,IAAI,SAAS3B,GAAGM,GAAE,KAAKE,IAAGA,GAAER,EAAE,EAAEA,EAAEgD,IAAI,SAAShD,GAAGW,IAAGA,GAAEX,GAAGI,GAAE,EAAE,IAAID,GAAGG,GAAEN,EAAE8B,KAAKilB,IAAI5mB,IAAID,KAAII,IAAGH,EAAE4B,IAAI,GAAGzB,GAAEyB,IAAI,GAAG5B,EAAEuB,GAAG0E,QAAQ,SAASpG,GAAGA,EAAEmnB,MAAMnnB,EAAE0B,GAAG1B,EAAEmnB,KAAKnnB,EAAEgnB,IAAIzmB,GAAEP,EAAEmnB,IAAInnB,EAAEG,OAAE,CAAM,KAAKA,EAAE4B,IAAIqE,QAAQ9C,IAAGnD,EAAE4B,IAAIqE,QAAQzD,IAAGxC,EAAE4B,IAAI,KAAK7B,GAAEI,EAAC,EAAEN,EAAE0G,OAAO,SAAStG,GAAGgB,IAAGA,GAAEhB,GAAG,IAAIC,EAAED,EAAE0B,IAAIzB,GAAGA,EAAE0mB,MAAM1mB,EAAE0mB,IAAIhlB,IAAIf,SAAS,IAAIP,GAAEqC,KAAKzC,IAAIF,KAAIH,EAAEonB,yBAAyBjnB,GAAEH,EAAEonB,wBAAwB,SAASpnB,GAAG,IAAII,EAAEE,EAAE,WAAW8S,aAAalT,GAAG6C,IAAGskB,qBAAqBjnB,GAAG8C,WAAWlD,EAAE,EAAEE,EAAEgD,WAAW5C,EAAE,KAAKyC,KAAI3C,EAAEgnB,sBAAsB9mB,GAAG,GAAGuC,KAAIxC,EAAE0mB,IAAIrlB,GAAG0E,QAAQ,SAASpG,GAAGA,EAAEG,IAAIH,EAAE+mB,IAAI/mB,EAAEG,GAAGH,EAAEgnB,MAAMzmB,KAAIP,EAAE0B,GAAG1B,EAAEgnB,KAAKhnB,EAAEG,OAAE,EAAOH,EAAEgnB,IAAIzmB,EAAC,IAAIL,GAAEI,GAAE,IAAI,EAAEN,EAAE8B,IAAI,SAAS1B,EAAEE,GAAGA,EAAE8C,KAAK,SAAShD,GAAG,IAAIA,EAAE2B,IAAIqE,QAAQ9C,IAAGlD,EAAE2B,IAAI3B,EAAE2B,IAAIkL,OAAO,SAASjN,GAAG,OAAOA,EAAE0B,IAAIiB,GAAE3C,EAAE,EAAsE,CAAnE,MAAME,GAAGI,EAAE8C,KAAK,SAASpD,GAAGA,EAAE+B,MAAM/B,EAAE+B,IAAI,GAAG,GAAGzB,EAAE,GAAGN,EAAE4B,IAAI1B,EAAEE,EAAE6B,IAAI,CAAC,GAAGhC,IAAGA,GAAEG,EAAEE,EAAE,EAAEN,EAAE0H,QAAQ,SAAStH,GAAG2D,IAAGA,GAAE3D,GAAG,IAAIE,EAAEJ,EAAEE,EAAE0B,IAAI5B,GAAGA,EAAE6mB,MAAM7mB,EAAE6mB,IAAIrlB,GAAG0E,QAAQ,SAASpG,GAAG,IAAIsD,GAAEtD,EAAe,CAAZ,MAAMA,GAAGM,EAAEN,CAAC,CAAC,GAAGM,GAAGN,EAAE4B,IAAItB,EAAEJ,EAAE+B,KAAK,EAAE,IAAIc,GAAE,mBAAmBqkB,sBAAsB,SAAS9jB,GAAEtD,GAAG,IAAII,EAAEE,GAAEJ,EAAEF,EAAE8B,IAAI,mBAAmB5B,IAAIF,EAAE8B,SAAI,EAAO5B,KAAKI,GAAEF,CAAC,CAAC,SAASuC,GAAE3C,GAAG,IAAII,EAAEE,GAAEN,EAAE8B,IAAI9B,EAAE0B,KAAKpB,GAAEF,CAAC,CAAC,SAASsD,GAAE1D,EAAEI,GAAG,OAAOJ,GAAGA,EAAEgB,SAASZ,EAAEY,QAAQZ,EAAEgD,KAAK,SAAShD,EAAEE,GAAG,OAAOF,IAAIJ,EAAEM,EAAE,EAAE"}