{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/main/typescript/api/Jsf.ts","webpack:///./src/main/typescript/api/Myfaces.ts","webpack:///./src/main/typescript/ext/monadish/DomQuery.ts","webpack:///./src/main/typescript/ext/monadish/Lang.ts","webpack:///./src/main/typescript/ext/monadish/Monad.ts","webpack:///./src/main/typescript/ext/monadish/SourcesCollectors.ts","webpack:///./src/main/typescript/ext/monadish/Stream.ts","webpack:///./src/main/typescript/ext/monadish/XmlQuery.ts","webpack:///./src/main/typescript/ext/monadish/index.ts","webpack:///./src/main/typescript/impl/AjaxImpl.ts","webpack:///./src/main/typescript/impl/PushImpl.ts","webpack:///./src/main/typescript/impl/core/Const.ts","webpack:///./src/main/typescript/impl/core/ImplTypes.ts","webpack:///./src/main/typescript/impl/i18n/Messages.ts","webpack:///./src/main/typescript/impl/util/Assertions.ts","webpack:///./src/main/typescript/impl/util/AsyncQueue.ts","webpack:///./src/main/typescript/impl/util/ExtDomQuery.ts","webpack:///./src/main/typescript/impl/util/Lang.ts","webpack:///./src/main/typescript/impl/xhrCore/ErrorData.ts","webpack:///./src/main/typescript/impl/xhrCore/EventData.ts","webpack:///./src/main/typescript/impl/xhrCore/RequestDataResolver.ts","webpack:///./src/main/typescript/impl/xhrCore/ResonseDataResolver.ts","webpack:///./src/main/typescript/impl/xhrCore/Response.ts","webpack:///./src/main/typescript/impl/xhrCore/ResponseProcessor.ts","webpack:///./src/main/typescript/impl/xhrCore/XhrFormData.ts","webpack:///./src/main/typescript/impl/xhrCore/XhrRequest.ts"],"names":[],"mappings":"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","file":"jsf-development.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./src/main/typescript/api/Jsf.ts\");\n","/* Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n///<reference path='./ApiInterfaces.ts'/>\n///<reference types='../../types/typedefs'/>\n\nimport {Implementation} from \"../impl/AjaxImpl\";\nimport {PushImpl} from \"../impl/PushImpl\";\n\ndeclare let window: any;\ndeclare type Context = { [key: string]: any };\n\nlet mf_impl = window?.myfaces?._impl ?? {};\n\nexport module jsf {\n    \"use strict\";\n\n    /*\n     * Version of the implementation for the jsf.js.\n     * <p />\n     * as specified within the jsf specifications jsf.html:\n     * <ul>\n     * <li>left two digits major release number</li>\n     * <li>middle two digits minor spec release number</li>\n     * <li>right two digits bug release number</li>\n     * </ul>\n     * @constant\n     */\n    export var specversion = 220000;\n    /**\n     * Implementation version as specified within the jsf specification.\n     * <p />\n     * A number increased with every implementation version\n     * and reset by moving to a new spec release number\n     *\n     * @constant\n     */\n    export var implversion = 0;\n\n    /**\n     * SeparatorChar as defined by UINamingContainer.getNamingContainerSeparatorChar()\n     * @type {Char}\n     */\n    export var separatorchar = getSeparatorChar();\n\n    /**\n     * This method is responsible for the return of a given project stage as defined\n     * by the jsf specification.\n     * <p/>\n     * Valid return values are:\n     * <ul>\n     *     <li>&quot;Production&quot;</li>\n     *     <li>&quot;Development&quot;</li>\n     *     <li>&quot;SystemTest&quot;</li>\n     *     <li>&quot;UnitTest&quot;</li>\n     * </li>\n     *\n     * @return {String} the current project state emitted by the server side method:\n     * <i>javax.faces.application.Application.getProjectStage()</i>\n     */\n    export function getProjectStage(): string {\n        return Implementation.getProjectStage();\n    }\n\n    /**\n     * collect and encode data for a given form element (must be of type form)\n     * find the javax.faces.ViewState element and encode its value as well!\n     * return a concatenated string of the encoded values!\n     *\n     * @throws an exception in case of the given element not being of type form!\n     * https://issues.apache.org/jira/browse/MYFACES-2110\n     */\n    export function getViewState(formElement: Element | string): string {\n        return Implementation.getViewState(formElement);\n    }\n\n    /**\n     * returns the window identifier for the given node / window\n     * @param {optional String | DomNode}  the node for which the client identifier has to be determined\n     * @return the window identifier or null if none is found\n     */\n    export function getClientWindow(rootNode?: Element | string): string {\n        return Implementation.getClientWindow(rootNode);\n    }\n\n    //private helper functions\n    function getSeparatorChar() {\n        return Implementation.getSeparatorChar();\n    }\n\n\n    export module ajax {\n        \"use strict\";\n\n        /**\n         * this function has to send the ajax requests\n         *\n         * following requestInternal conditions must be met:\n         * <ul>\n         *  <li> the requestInternal must be sent asynchronously! </li>\n         *  <li> the requestInternal must be a POST!!! requestInternal </li>\n         *  <li> the requestInternal url must be the form action attribute </li>\n         *  <li> all requests must be queued with a client side requestInternal queue to ensure the requestInternal ordering!</li>\n         * </ul>\n         *\n         * @param {String|Node} element: any dom element no matter being it html or jsf, from which the event is emitted\n         * @param {EVENT} event: any javascript event supported by that object\n         * @param {Map} options : map of options being pushed into the ajax cycle\n         */\n        export function request(element: Element, event?: Event, options?: Context) {\n            Implementation.request(element, event, options)\n            //Implementation.getInstance().requestInternal(element, event, options);\n        }\n\n        /**\n         * response handler\n         * @param request the request object having triggered this response\n         * @param context the request context\n         *\n         * TODO add info on what can be in the context\n         */\n        export function response(request: XMLHttpRequest, context?: Context) {\n            Implementation.response(request, context);\n        }\n\n        /**\n         * Adds an error handler to our global error queue.\n         * the error handler must be of the format <i>function errorListener(&lt;errorData&gt;)</i>\n         * with errorData being of following format:\n         * <ul>\n         *     <li> errorData.type : &quot;error&quot;</li>\n         *     <li> errorData.status : the error status message</li>\n         *     <li> errorData.serverErrorName : the server error name in case of a server error</li>\n         *     <li> errorData.serverErrorMessage : the server error message in case of a server error</li>\n         *     <li> errorData.source  : the issuing source element which triggered the requestInternal </li>\n         *     <li> eventData.responseCode: the response code (aka http requestInternal response code, 401 etc...) </li>\n         *     <li> eventData.responseText: the requestInternal response text </li>\n         *     <li> eventData.responseXML: the requestInternal response xml </li>\n         * </ul>\n         *\n         * @param {function} errorListener error handler must be of the format <i>function errorListener(&lt;errorData&gt;)</i>\n         */\n        export function addOnError(errorFunc: (data: _apiInterfaces.ErrorData) => void) {\n            Implementation.addOnError(<any>errorFunc);\n        }\n\n        /**\n         * Adds a global event listener to the ajax event queue. The event listener must be a function\n         * of following format: <i>function eventListener(&lt;eventData&gt;)</i>\n         *\n         * @param {function} eventListener event must be of the format <i>function eventListener(&lt;eventData&gt;)</i>\n         */\n        export function addOnEvent(eventFunc: (data: _apiInterfaces.EventData) => void) {\n            Implementation.addOnEvent(<any>eventFunc);\n        }\n    }\n\n    export module util {\n\n        /**\n         * varargs function which executes a chain of code (functions or any other code)\n         *\n         * if any of the code returns false, the execution\n         * is terminated prematurely skipping the rest of the code!\n         *\n         * @param {DomNode} source, the callee object\n         * @param {Event} event, the event object of the callee event triggering this function\n         * @param funcs ... arbitrary array of functions or strings\n         * @returns true if the chain has succeeded false otherwise\n         */\n        export function chain(source, event, ...funcs: Array<Function | string>): boolean {\n            return Implementation.chain(source, event, ...funcs);\n        }\n    }\n\n    export module push {\n        /**\n         * @param {function} onopen The function to be invoked when the web socket is opened.\n         * @param {function} onmessage The function to be invoked when a message is received.\n         * @param {function} onclose The function to be invoked when the web socket is closed.\n         * @param {boolean} autoconnect Whether or not to immediately open the socket. Defaults to <code>false</code>.\n         */\n        export function init(socketClientId: string,\n                    uri: string,\n                    channel: string,\n                    onopen: Function,\n                    onmessage: Function,\n                    onclose: Function,\n                    behaviorScripts: any,\n                    autoconnect: boolean) {\n            PushImpl.init(socketClientId, uri, channel, onopen, onmessage, onclose, behaviorScripts, autoconnect);\n        }\n\n        /**\n         * Open the web socket on the given channel.\n         * @param {string} channel The name of the web socket channel.\n         * @throws {Error} When channel is unknown.\n         */\n        export function open(socketClientId: string) {\n            PushImpl.open(socketClientId);\n        }\n\n        /**\n         * Close the web socket on the given channel.\n         * @param {string} channel The name of the web socket channel.\n         * @throws {Error} When channel is unknown.\n         */\n        export function close(socketClientId: string) {\n            PushImpl.close(socketClientId);\n        }\n\n    }\n\n    //We hook the old namespace system into our npm system\n    //if (\"undefined\" == window.jsf) {\n    //    window.jsf = jsf;\n    //}\n\n\n}\n\n\n\n//fullfill the window contract\nexport module myfaces {\n\n    //legacy compatibility\n    export var _impl = mf_impl;\n\n    /**\n     * AB function similar to mojarra and Primefaces\n     * not part of the spec but a convenience accessor method\n     * Code provided by Thomas Andraschko\n     *\n     * @param source the event source\n     * @param event the event\n     * @param eventName event name for java.javax.faces.behavior.evemnt\n     * @param execute execute list as passed down in jsf.ajax.request\n     * @param render\n     * @param options\n     */\n    export function ab(source: Element, event: Event, eventName: string, execute: string, render: string, options: Context = {}) {\n        if (eventName) {\n            options[\"javax.faces.behavior.event\"] = eventName;\n        }\n        if (execute) {\n            options[\"execute\"] = execute;\n        }\n        if (render) {\n            options[\"render\"] = render;\n        }\n\n        jsf.ajax.request(source, event, options);\n    }\n\n    //We hook the old namespace system into our npm system\n    if (\"undefined\" == window?.myfaces?.ab) {\n        window[\"myfaces\"] = window.myfaces ?? {} ;\n        window.myfaces[\"ab\"] = ab;\n    }\n}\n\n\n","/* Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * internal myfaces config override params\n */\ndeclare var window: any;\nexport module myfaces {\n\n    export class ConfigHolder {\n        projectStage: string = null;\n        separator: string = null;\n    }\n\n    export var config = new ConfigHolder();\n\n    //if (window && \"undefined\" == typeof window.myfaces) {\n    //    window.myfaces = myfaces;\n    //}\n}\n","/* Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {Config, Optional, ValueEmbedder} from \"./Monad\";\nimport {XMLQuery} from \"./XmlQuery\";\nimport {IStream, LazyStream, Stream} from \"./Stream\";\nimport {ICollector, IStreamDataSource} from \"./SourcesCollectors\";\nimport {Lang} from \"./Lang\";\nimport trim = Lang.trim;\nimport objToArray = Lang.objToArray;\nimport isString = Lang.isString;\nimport equalsIgnoreCase = Lang.equalsIgnoreCase;\n\n// @ts-ignore supression needed here due to fromnullable\nexport class ElementAttribute extends ValueEmbedder<string> {\n\n    constructor(private element: DomQuery, private name: string, private defaultVal: string = null) {\n        super(element, name);\n    }\n\n    get value(): string {\n        let val: Element[] = this.element.get(0).orElse(...[]).values;\n        if (!val.length) {\n            return this.defaultVal;\n        }\n        return val[0].getAttribute(this.name);\n    }\n\n    set value(value: string) {\n        let val: Element[] = this.element.get(0).orElse(...[]).values;\n        for (let cnt = 0; cnt < val.length; cnt++) {\n            val[cnt].setAttribute(this.name, value);\n        }\n        val[0].setAttribute(this.name, value);\n    }\n\n    protected getClass(): any {\n        return ElementAttribute;\n    }\n\n    static fromNullable(value?: any, valueKey: string = \"value\"): ElementAttribute {\n        return new ElementAttribute(value, valueKey);\n    }\n\n}\n\n/**\n * small helper for the specialized jsf case\n * @param src\n * @constructor\n */\nconst DEFAULT_JSF_WHITELIST = (src: string) => {\n    return (src.indexOf(\"ln=scripts\") == -1 &&\n        src.indexOf(\"ln=javax.faces\") == -1) ||\n        (src.indexOf(\"/jsf.js\") == -1 &&\n            src.indexOf(\"/jsf-uncompressed.js\") == -1);\n};\n\ninterface IDomQuery {\n    /**\n     * reads the first element if it exists and returns an optional\n     */\n    readonly value: Optional<Element>;\n    /**\n     * All elements as array\n     */\n    readonly values: Element[];\n    /**\n     * returns the id as settable value (See also ValueEmbedder)\n     */\n    readonly id: ValueEmbedder<string>;\n    /**\n     * returns the length of embedded nodes (top level)\n     */\n    readonly length: number;\n    /**\n     * the tag name of the first element\n     */\n    readonly tagName: Optional<string>;\n    /**\n     * the node name of the first element\n     */\n    readonly nodeName: Optional<string>;\n    /**\n     * the type of the first element\n     */\n    readonly type: Optional<string>;\n    /**\n     * The name as changeable value\n     */\n    readonly name: ValueEmbedder<string>;\n    /**\n     * The the value in case of inputs as changeable value\n     */\n    readonly inputValue: ValueEmbedder<string | boolean>;\n    /**\n     * the underlying form elements as domquery object\n     */\n    readonly elements: DomQuery;\n    /**\n     * settable flag for disabled\n     */\n    disabled: boolean;\n    /**\n     * The child nodes of this node collection as readonly attribute\n     */\n    readonly childNodes: DomQuery;\n    /**\n     * an early stream representation for this DomQuery\n     */\n    readonly stream: Stream<DomQuery>;\n    /**\n     * lazy stream representation for this DomQuery\n     */\n    readonly lazyStream: LazyStream<DomQuery>;\n    /**\n     * transform this node collection to an array\n     */\n    readonly asArray: Array<DomQuery>;\n\n    /**\n     * returns true if the elements have the tag *tagName* as tag embedded (highest level)\n     * @param tagName\n     */\n    isTag(tagName: string): boolean;\n\n    /**\n     * returns the nth element as domquery\n     * from the internal elements\n     * note if you try to reach a non existing element position\n     * you will get back an absent entry\n     *\n     * @param index the nth index\n     */\n    get(index: number): DomQuery;\n\n    /**\n     * returns the nth element as optional of an Element object\n     * @param index the number from the index\n     * @param defaults the default value if the index is overrun default Optional.absent\n     */\n    getAsElem(index: number, defaults: Optional<any>): Optional<Element>;\n\n    /**\n     * returns the value array< of all elements\n     */\n    allElems(): Array<Element>;\n\n    /**\n     * absent no values reached?\n     */\n    isAbsent(): boolean;\n\n    /**\n     * should make the code clearer\n     * note if you pass a function\n     * this refers to the active dopmquery object\n     */\n    isPresent(presentRunnable ?: (elem ?: DomQuery) => void): boolean;\n\n    /**\n     * should make the code clearer\n     * note if you pass a function\n     * this refers to the active dopmquery object\n     *\n     *\n     * @param presentRunnable\n     */\n    ifPresentLazy(presentRunnable: (elem ?: DomQuery) => void): DomQuery;\n\n    /**\n     * remove all affected nodes from this query object from the dom tree\n     */\n    delete(): void;\n\n    /**\n     * query selector all on the existing dom query object\n     *\n     * @param selector the standard selector\n     * @return a DomQuery with the results\n     */\n    querySelectorAll(selector): DomQuery;\n\n    /**\n     * core byId method\n     * @param id the id to search for\n     * @param includeRoot also match the root element?\n     */\n    byId(id: string, includeRoot?: boolean): DomQuery;\n\n    /**\n     * same as byId just for the tag name\n     * @param tagName\n     * @param includeRoot\n     */\n    byTagName(tagName: string, includeRoot ?: boolean): DomQuery;\n\n    /**\n     * attr accessor, usage myQuery.attr(\"class\").value = \"bla\"\n     * or let value myQuery.attr(\"class\").value\n     * @param attr the attribute to set\n     * @param defaultValue the default value in case nothing is presented (defaults to null)\n     */\n    attr(attr: string, defaultValue: string): ElementAttribute;\n\n    /**\n     * hasclass, checks for an existing class in the class attributes\n     *\n     * @param clazz the class to search for\n     */\n    hasClass(clazz: string): boolean;\n\n    /**\n     * appends a class string if not already in the element(s)\n     *\n     * @param clazz the style class to append\n     */\n    addClass(clazz: string): DomQuery;\n\n    /**\n     * remove the style class if in the class definitions\n     *\n     * @param clazz\n     */\n    removeClass(clazz: string): DomQuery;\n\n    /**\n     * checks whether we have a multipart element in our children\n     */\n    isMultipartCandidate(): boolean;\n\n    /**\n     * innerHtml equivalkent\n     * equivalent to jqueries html\n     * as setter the html is set and the\n     * DomQuery is given back\n     * as getter the html string is returned\n     *\n     * @param inval\n     */\n    html(inval?: string): DomQuery | Optional<string>;\n\n    /**\n     * easy node traversal, you can pass\n     * a set of node selectors which are joined as direct childs\n     *\n     * not the rootnodes are not in the getIf, those are always the child nodes\n     *\n     * @param nodeSelector\n     */\n    getIf(...nodeSelector: Array<string>): DomQuery;\n\n    /**\n     * iterate over each element and perform something on the element\n     * (Dom element is passed instead of DomQuery)\n     * @param func\n     */\n    eachElem(func: (item: Element, cnt?: number) => any): DomQuery;\n\n    /**\n     * perform an operation on the first element\n     * returns a DomQuery on the first element only\n     * @param func\n     */\n    firstElem(func: (item: Element, cnt?: number) => any): DomQuery;\n\n    /**\n     * same as eachElem, but a DomQuery object is passed down\n     *\n     * @param func\n     */\n    each(func: (item: DomQuery, cnt?: number) => any): DomQuery;\n\n    /**\n     * returns a new dom query containing only the first element max\n     *\n     * @param func a an optional callback function to perform an operation on the first element\n     */\n    first(func: (item: DomQuery, cnt?: number) => any): DomQuery;\n\n    /**\n     * filter function which filters a subset\n     *\n     * @param func\n     */\n    filter(func: (item: DomQuery) => boolean): DomQuery;\n\n    /**\n     * global eval head appendix method\n     * no other methods are supported anymore\n     * @param code the code to be evaled\n     * @param  nonce optional  nonce key for higher security\n     */\n    globalEval(code: string, nonce ?: string): DomQuery;\n\n    /**\n     * detaches a set of nodes from their parent elements\n     * in a browser independend manner\n     * @param {Object} items the items which need to be detached\n     * @return {Array} an array of nodes with the detached dom nodes\n     */\n    detach(): DomQuery;\n\n    /**\n     * appends the current set of elements\n     * to the element or first element passed via elem\n     * @param elem\n     */\n    appendTo(elem: DomQuery): void;\n\n    /**\n     * loads and evals a script from a source uri\n     *\n     * @param src the source to be loaded and evaled\n     * @param defer in miliseconds execution default (0 == no defer)\n     * @param charSet\n     */\n    loadScriptEval(src: string, defer: number, charSet: string): void;\n\n    /**\n     * insert toInsert after the current element\n     *\n     * @param toInsert an array of DomQuery objects\n     */\n    insertAfter(...toInsert: Array<DomQuery>): DomQuery;\n\n    /**\n     * inserts the elements before the current element\n     *\n     * @param toInsert\n     */\n    insertBefore(...toInsert: Array<DomQuery>): DomQuery;\n\n    /**\n     * in case the domquery is pointing to nothing the else value is taken into consideration\n     * als alternative\n     *\n     * @param elseValue the else value\n     */\n    orElse(...elseValue: any): DomQuery;\n\n    /**\n     * the same with lazy evaluation for cases where getting the else value\n     * is a heavy operation\n     *\n     * @param func the else provider function\n     */\n    orElseLazy(func: () => any): DomQuery;\n\n    /**\n     * all parents with TagName\n     * @param tagName\n     */\n    parents(tagName: string): DomQuery;\n\n    /**\n     * copy all attributes of sourceItem to this DomQuery items\n     *\n     * @param sourceItem the source item to copy over (can be another domquery or a parsed XML Query item)\n     */\n    copyAttrs(sourceItem: DomQuery | XMLQuery): DomQuery;\n\n    /**\n     * outerhtml convenience method\n     * browsers only support innerHTML but\n     * for instance for your jsf.js we have a full\n     * replace pattern which needs outerHTML processing\n     *\n     * @param markup\n     * @param runEmbeddedScripts\n     * @param runEmbeddedCss\n     */\n    outerHTML(markup: string, runEmbeddedScripts ?: boolean, runEmbeddedCss ?: boolean): DomQuery;\n\n    /**\n     * Run through the given nodes in the DomQuery execute the inline scripts\n     * @param whilteListed: optional whitelist function which can filter out script tags which are not processed\n     * defaults to the standard jsf.js exclusion (we use this code for myfaces)\n     */\n    runScripts(whilteListed: (val: string) => boolean): DomQuery;\n\n    /**\n     * runs the embedded css\n     */\n    runCss(): DomQuery;\n\n    /**\n     * fires a click event on the underlying dom elements\n     */\n    click(): DomQuery;\n\n    /**\n     * adds an event listener\n     *\n     * @param type\n     * @param listener\n     * @param options\n     */\n    addEventListener(type: string, listener: (evt: Event) => void, options?: boolean | EventListenerOptions): DomQuery;\n\n    /**\n     * removes an event listener\n     *\n     * @param type\n     * @param listener\n     * @param options\n     */\n    removeEventListener(type: string, listener: (evt: Event) => void, options?: boolean | EventListenerOptions): DomQuery;\n\n    /**\n     * fires an event\n     */\n    fireEvent(eventName: string): void;\n\n    /*\n     * pushes  in optionally a new textContent, and/or returns the current text content\n     */\n    textContent(joinstr?: string): string;\n\n    /*\n     * pushes  in optionally a new innerText, and/or returns the current innerText\n     */\n    innerText(joinstr?: string): string;\n\n    /**\n     * encodes all input elements properly into respective\n     * config entries, this can be used\n     * for legacy systems, for newer usecases, use the\n     * HTML5 Form class which all newer browsers provide\n     *\n     * @param toMerge optional config which can be merged in\n     * @return a copy pf\n     */\n    encodeFormElement(toMerge): Config;\n\n    /**\n     * fetches the subnodes from ... to..\n     * @param from\n     * @param to\n     */\n    subNodes(from: number, to?: number): DomQuery;\n}\n\n/**\n * Monadic DomNode representation, ala jquery\n * This is a thin wrapper over querySelectorAll\n * to get slim monadic support\n * to reduce implementation code on the users side.\n * This is vital for frameworks which want to rely on\n * plain dom but still do not want to lose\n * the reduced code footprint of querying dom trees and traversing\n * by using functional patterns.\n *\n * Also a few convenience methods are added to reduce\n * the code footprint of standard dom processing\n * operations like eval\n *\n * TODO add jquery fallback support, since it is supported\n * in most older systems\n * Note parts of this code still stem from the Dom.js I have written 10 years\n * ago, those parts look a little bit ancient and will be replaced over time.\n *\n */\nexport class DomQuery implements IDomQuery, IStreamDataSource<DomQuery> {\n\n    static absent = new DomQuery();\n\n    private rootNode: Array<Element> = [];\n\n    pos = -1;\n\n    constructor(...rootNode: Array<Element | DomQuery | Document | Array<any> | string>) {\n\n        if (Optional.fromNullable(rootNode).isAbsent() || !rootNode.length) {\n            return;\n        } else {\n            //we need to flatten out the arrays\n\n            for (let cnt = 0; cnt < rootNode.length; cnt++) {\n                if (isString(rootNode[cnt])) {\n                    let foundElement = DomQuery.querySelectorAll(<string>rootNode[cnt]);\n                    if (!foundElement.isAbsent()) {\n                        rootNode.push(...foundElement.values)\n                    }\n                } else if (rootNode[cnt] instanceof DomQuery) {\n                    this.rootNode.push(...(<any>rootNode[cnt]).values);\n                } else {\n                    this.rootNode.push(<any>rootNode[cnt]);\n                }\n            }\n        }\n    }\n\n    /**\n     * returns the first element\n     */\n    get value(): Optional<Element> {\n        return this.getAsElem(0);\n    }\n\n    get values(): Element[] {\n        return this.allElems();\n    }\n\n    /**\n     * returns the id of the first element\n     */\n    get id(): ValueEmbedder<string> {\n        return new ElementAttribute(this.get(0), \"id\");\n    }\n\n    /**\n     * length of the entire query set\n     */\n    get length(): number {\n        return this.rootNode.length\n    }\n\n    /**\n     * convenience method for tagName\n     */\n    get tagName(): Optional<string> {\n        return <Optional<string>>this.getAsElem(0).getIf(\"tagName\");\n    }\n\n    /**\n     * convenience method for nodeName\n     */\n    get nodeName(): Optional<string> {\n        return <Optional<string>>this.getAsElem(0).getIf(\"nodeName\");\n    }\n\n    isTag(tagName: string): boolean {\n        return !this.isAbsent()\n            && (this.nodeName.orElse(\"__none___\")\n                    .value.toLowerCase() == tagName.toLowerCase()\n                || this.tagName.orElse(\"__none___\")\n                    .value.toLowerCase() == tagName.toLowerCase()\n            )\n    }\n\n    /**\n     * convenience property for type\n     *\n     * returns null in case of no type existing otherwise\n     * the type of the first element\n     */\n    get type(): Optional<string> {\n        return this.getAsElem(0).getIf(\"type\");\n    }\n\n    /**\n     * convenience property for name\n     *\n     * returns null in case of no type existing otherwise\n     * the name of the first element\n     */\n    get name(): ValueEmbedder<string> {\n        return new ValueEmbedder(this.getAsElem(0).value, \"name\");\n    }\n\n    /**\n     * convenience property for value\n     *\n     * returns null in case of no type existing otherwise\n     * the value of the first element\n     */\n    get inputValue(): ValueEmbedder<string | boolean> {\n        if (this.getAsElem(0).getIf(\"value\").isPresent()) {\n            return new ValueEmbedder<string>(this.getAsElem(0).value);\n        } else {\n            return <any>ValueEmbedder.absent;\n        }\n    }\n\n    get checked(): boolean {\n        return Stream.of(...this.values).allMatch(el => !!(<any>el).checked);\n    }\n\n    set checked(newChecked: boolean) {\n        this.eachElem(el => (<any>el).checked = newChecked);\n    }\n\n    get elements(): DomQuery {\n        let elements: DomQuery = this.stream.flatMap((item: DomQuery) => {\n            let formElement: HTMLFormElement = <HTMLFormElement>item.value.value;\n            return new Stream(formElement.elements ? objToArray(formElement.elements) : []);\n        }).filter(item => !!item).collect(new DomQueryCollector());\n\n        return elements\n            .orElseLazy(() => this.querySelectorAll(\"input, select, textarea, fieldset\"));\n    }\n\n    /**\n     * todo align this api with the rest of the apis\n     */\n    get disabled(): boolean {\n        return this.attr(\"disabled\").isPresent();\n    }\n\n    set disabled(disabled: boolean) {\n        // this.attr(\"disabled\").value = disabled + \"\";\n        if (!disabled) {\n            this.removeAttribute(\"disabled\");\n        } else {\n            this.attr(\"disabled\").value = \"disabled\";\n        }\n\n    }\n\n    removeAttribute(name: string) {\n        this.eachElem(item => item.removeAttribute(name));\n    }\n\n    get childNodes(): DomQuery {\n        let childNodeArr: Array<Element> = [];\n        this.eachElem((item: Element) => {\n            childNodeArr = childNodeArr.concat(objToArray(item.childNodes));\n        });\n        return new DomQuery(...childNodeArr);\n    }\n\n    /**\n     * binding into stream\n     */\n    get stream(): Stream<DomQuery> {\n        return new Stream<DomQuery>(...this.asArray);\n    }\n\n    /**\n     * fetches a lazy stream representation\n     * lazy should be applied if you have some filters etc\n     * in between, this can reduce the number of post filter operations\n     * and ram usage\n     * significantly because the operations are done lazily and stop\n     * once they hit a dead end.\n     */\n    get lazyStream(): LazyStream<DomQuery> {\n        return LazyStream.ofStreamDataSource(this);\n    }\n\n    get asArray(): Array<DomQuery> {\n        let ret: Array<DomQuery> = [];\n        this.each((item) => {\n            ret.push(item);\n        });\n        return ret;\n    }\n\n    /**\n     * easy query selector all producer\n     *\n     * @param selector the selector\n     * @returns a results dom query object\n     */\n    static querySelectorAll(selector: string): DomQuery {\n        return new DomQuery(document).querySelectorAll(selector);\n    }\n\n    /**\n     * byId producer\n     *\n     * @param selector id\n     * @return a DomQuery containing the found elements\n     */\n    static byId(selector: string | DomQuery | Element): DomQuery {\n        if (isString(selector)) {\n            return new DomQuery(document).byId(<string>selector);\n        } else {\n            return new DomQuery(<any>selector);\n        }\n    }\n\n    /**\n     * byTagName producer\n     *\n     * @param selector name\n     * @return a DomQuery containing the found elements\n     */\n    static byTagName(selector: string | DomQuery | Element): DomQuery {\n        if (isString(selector)) {\n            return new DomQuery(document).byTagName(<string>selector);\n        } else {\n            return new DomQuery(<any>selector);\n        }\n    }\n\n    static globalEval(code: string, nonce?: string): DomQuery {\n        return new DomQuery(document).globalEval(code, nonce);\n    }\n\n    /**\n     * builds the ie nodes properly in a placeholder\n     * and bypasses a non script insert bug that way\n     * @param markup the marku code\n     */\n    static fromMarkup(markup: string): DomQuery {\n\n        //https://developer.mozilla.org/de/docs/Web/API/DOMParser license creative commons\n        const doc = document.implementation.createHTMLDocument(\"\");\n        markup = trim(markup);\n        let lowerMarkup = markup.toLowerCase();\n        if (lowerMarkup.indexOf('<!doctype') != -1 ||\n            lowerMarkup.indexOf('<html') != -1 ||\n            lowerMarkup.indexOf('<head') != -1 || //TODO proper regexps here to avoid embedded tags with same element names to be triggered\n            lowerMarkup.indexOf('<body') != -1) {\n            doc.documentElement.innerHTML = markup;\n            return new DomQuery(doc.documentElement);\n        } else {\n            let startsWithTag = function (str: string, tagName: string) {\n                let tag1 = [\"<\", tagName, \">\"].join(\"\");\n                let tag2 = [\"<\", tagName, \" \"].join(\"\");\n                return (str.indexOf(tag1) == 0) || (str.indexOf(tag2) == 0);\n            };\n\n            let dummyPlaceHolder = new DomQuery(document.createElement(\"div\"));\n\n            //table needs special treatment due to the browsers auto creation\n            if (startsWithTag(lowerMarkup, \"thead\") || startsWithTag(lowerMarkup, \"tbody\")) {\n                dummyPlaceHolder.html(`<table>${markup}</table>`);\n                return dummyPlaceHolder.querySelectorAll(\"table\").get(0).childNodes.detach();\n            } else if (startsWithTag(lowerMarkup, \"tfoot\")) {\n                dummyPlaceHolder.html(`<table><thead></thead><tbody><tbody${markup}</table>`);\n                return dummyPlaceHolder.querySelectorAll(\"table\").get(2).childNodes.detach();\n            } else if (startsWithTag(lowerMarkup, \"tr\")) {\n                dummyPlaceHolder.html(`<table><tbody>${markup}</tbody></table>`);\n                return dummyPlaceHolder.querySelectorAll(\"tbody\").get(0).childNodes.detach();\n            } else if (startsWithTag(lowerMarkup, \"td\")) {\n                dummyPlaceHolder.html(`<table><tbody><tr>${markup}</tr></tbody></table>`);\n                return dummyPlaceHolder.querySelectorAll(\"tr\").get(0).childNodes.detach();\n            }\n\n            dummyPlaceHolder.html(markup);\n            return dummyPlaceHolder.childNodes.detach();\n        }\n\n    }\n\n    /**\n     * returns the nth element as domquery\n     * from the internal elements\n     * note if you try to reach a non existing element position\n     * you will get back an absent entry\n     *\n     * @param index the nth index\n     */\n    get(index: number): DomQuery {\n        return (index < this.rootNode.length) ? new DomQuery(this.rootNode[index]) : DomQuery.absent;\n    }\n\n    /**\n     * returns the nth element as optional of an Element object\n     * @param index the number from the index\n     * @param defaults the default value if the index is overrun default Optional.absent\n     */\n    getAsElem(index: number, defaults: Optional<any> = Optional.absent): Optional<Element> {\n        return (index < this.rootNode.length) ? Optional.fromNullable(this.rootNode[index]) : defaults;\n    }\n\n    /**\n     * returns the value array< of all elements\n     */\n    allElems(): Array<Element> {\n        return this.rootNode;\n    }\n\n    /**\n     * absent no values reached?\n     */\n    isAbsent(): boolean {\n        return this.length == 0;\n    }\n\n    /**\n     * should make the code clearer\n     * note if you pass a function\n     * this refers to the active dopmquery object\n     */\n    isPresent(presentRunnable ?: (elem ?: DomQuery) => void): boolean {\n        let absent = this.isAbsent();\n        if (!absent && presentRunnable) {\n            presentRunnable.call(this, this)\n        }\n        return !absent;\n    }\n\n    /**\n     * should make the code clearer\n     * note if you pass a function\n     * this refers to the active dopmquery object\n     *\n     *\n     * @param presentRunnable\n     */\n    ifPresentLazy(presentRunnable: (elem ?: DomQuery) => void = function () {\n    }): DomQuery {\n        this.isPresent.call(this, presentRunnable);\n        return this;\n    }\n\n    /**\n     * remove all affected nodes from this query object from the dom tree\n     */\n    delete() {\n        this.eachElem((node: Element) => {\n            if (node.parentNode) {\n                node.parentNode.removeChild(node);\n            }\n        });\n    }\n\n    /**\n     * query selector all on the existing dom query object\n     *\n     * @param selector the standard selector\n     * @return a DomQuery with the results\n     */\n    querySelectorAll(selector): DomQuery {\n        if (!this?.rootNode?.length) {\n            return this;\n        }\n        let nodes = [];\n        for (let cnt = 0; cnt < this.rootNode.length; cnt++) {\n            if (!this.rootNode[cnt]?.querySelectorAll) {\n                continue;\n            }\n            let res = this.rootNode[cnt].querySelectorAll(selector);\n            nodes = nodes.concat(objToArray(res));\n        }\n\n        return new DomQuery(...nodes);\n    }\n\n    /**\n     * core byId method\n     * @param id the id to search for\n     * @param includeRoot also match the root element?\n     */\n    byId(id: string, includeRoot?: boolean): DomQuery {\n        let res: Array<DomQuery> = [];\n        for (let cnt = 0; includeRoot && cnt < this.rootNode.length; cnt++) {\n            if (this.rootNode[cnt]?.id == id) {\n                res.push(new DomQuery(this.rootNode[cnt]));\n            }\n        }\n        //for some strange kind of reason the # selector fails\n        //on hidden elements we use the attributes match selector\n        //that works\n        res = res.concat(this.querySelectorAll(`[id=\"${id}\"]`));\n        return new DomQuery(...res);\n    }\n\n    /**\n     * same as byId just for the tag name\n     * @param tagName\n     * @param includeRoot\n     */\n    byTagName(tagName: string, includeRoot ?: boolean): DomQuery {\n        let res = [];\n        for (let cnt = 0; includeRoot && cnt < this.rootNode.length; cnt++) {\n            if (this.rootNode[cnt]?.tagName == tagName) {\n                res.push(new DomQuery(this.rootNode[cnt]));\n            }\n        }\n        res = res.concat(this.querySelectorAll(tagName));\n        return new DomQuery(...res);\n    }\n\n    /**\n     * attr accessor, usage myQuery.attr(\"class\").value = \"bla\"\n     * or let value myQuery.attr(\"class\").value\n     * @param attr the attribute to set\n     * @param defaultValue the default value in case nothing is presented (defaults to null)\n     */\n    attr(attr: string, defaultValue: string = null): ElementAttribute {\n        return new ElementAttribute(this, attr, defaultValue);\n    }\n\n    /**\n     * hasclass, checks for an existing class in the class attributes\n     *\n     * @param clazz the class to search for\n     */\n    hasClass(clazz: string) {\n        let hasIt = false;\n\n        this.each((item) => {\n            let oldClass = item.attr(\"class\").value || \"\";\n            if (oldClass.toLowerCase().indexOf(clazz.toLowerCase()) == -1) {\n                return;\n            } else {\n                let oldClasses = oldClass.split(/\\s+/gi);\n                let found = false;\n                for (let cnt = 0; cnt < oldClasses.length && !found; cnt++) {\n                    found = oldClasses[cnt].toLowerCase() == clazz.toLowerCase();\n                }\n                hasIt = hasIt || found;\n                if (hasIt) {\n                    return false;\n                }\n            }\n        });\n        return hasIt;\n    }\n\n    /**\n     * appends a class string if not already in the element(s)\n     *\n     * @param clazz the style class to append\n     */\n    addClass(clazz: string): DomQuery {\n        this.each((item) => {\n            let oldClass = item.attr(\"class\").value || \"\";\n            if (!this.hasClass(clazz)) {\n                item.attr(\"class\").value = trim(oldClass + \" \" + clazz);\n                return;\n            }\n        });\n        return this;\n    }\n\n    /**\n     * remove the style class if in the class definitions\n     *\n     * @param clazz\n     */\n    removeClass(clazz: string): DomQuery {\n        this.each((item) => {\n            if (this.hasClass(clazz)) {\n                let oldClass = item.attr(\"class\").value || \"\";\n                let newClasses = [];\n                let oldClasses = oldClass.split(/\\s+/gi);\n                for (let cnt = 0; cnt < oldClasses.length; cnt++) {\n                    if (oldClasses[cnt].toLowerCase() != clazz.toLowerCase()) {\n                        newClasses.push(oldClasses[cnt]);\n                    }\n                }\n                item.attr(\"class\").value = newClasses.join(\" \");\n            }\n        });\n        return this;\n    }\n\n    /**\n     * checks whether we have a multipart element in our children\n     */\n    isMultipartCandidate(): boolean {\n        return this.querySelectorAll(\"input[type='file']\").firstElem().isPresent();\n    }\n\n    /**\n     * innerHtml equivalkent\n     * equivalent to jqueries html\n     * as setter the html is set and the\n     * DomQuery is given back\n     * as getter the html string is returned\n     *\n     * @param inval\n     */\n    html(inval?: string): DomQuery | Optional<string> {\n        if (Optional.fromNullable(inval).isAbsent()) {\n            return this.isPresent() ? Optional.fromNullable(this.innerHtml) : Optional.absent;\n        }\n        this.innerHtml = inval;\n\n        return this;\n    }\n\n    set innerHtml(inVal: string) {\n        this.eachElem(elem => elem.innerHTML = inVal);\n    }\n\n    get innerHtml(): string {\n        let retArr = [];\n        this.eachElem(elem => retArr.push(elem.innerHTML));\n        return retArr.join(\"\");\n    }\n\n    //source: https://developer.mozilla.org/en-US/docs/Web/API/Element/matches\n    //code snippet license: https://creativecommons.org/licenses/by-sa/2.5/\n    private _mozMatchesSelector(toMatch: Element, selector: string): boolean {\n        let prot: { [key: string]: Function } = (<any>toMatch);\n        let matchesSelector: Function = prot.matchesSelector ||\n            prot.mozMatchesSelector ||\n            prot.msMatchesSelector ||\n            prot.oMatchesSelector ||\n            prot.webkitMatchesSelector ||\n            function (s: string) {\n                let matches: NodeListOf<HTMLElement> = (document || (<any>window).ownerDocument).querySelectorAll(s),\n                    i = matches.length;\n                while (--i >= 0 && matches.item(i) !== toMatch) {\n                }\n                return i > -1;\n            };\n        return matchesSelector.call(toMatch, selector);\n    }\n\n    /**\n     * filters the current dom query elements\n     * upon a given selector\n     *\n     * @param selector\n     */\n    filterSelector(selector: string): DomQuery {\n        let matched = [];\n\n        this.eachElem(item => {\n            if (this._mozMatchesSelector(item, selector)) {\n                matched.push(item)\n            }\n        });\n        return new DomQuery(...matched);\n    }\n\n    matchesSelector(selector: string): boolean {\n        this.eachElem(item => {\n            if (!this._mozMatchesSelector(item, selector)) {\n                return false;\n            }\n        });\n        return true;\n    }\n\n    /**\n     * easy node traversal, you can pass\n     * a set of node selectors which are joined as direct childs\n     *\n     * not the rootnodes are not in the getIf, those are always the child nodes\n     *\n     * @param nodeSelector\n     */\n    getIf(...nodeSelector: Array<string>): DomQuery {\n\n        let selectorStage: DomQuery = this.childNodes;\n        for (let cnt = 0; cnt < nodeSelector.length; cnt++) {\n            selectorStage = selectorStage.filterSelector(nodeSelector[cnt]);\n            if (selectorStage.isAbsent()) {\n                return selectorStage;\n            }\n        }\n        return selectorStage;\n    }\n\n    eachElem(func: (item: Element, cnt?: number) => any): DomQuery {\n        for (let cnt = 0, len = this.rootNode.length; cnt < len; cnt++) {\n            if (func(this.rootNode[cnt], cnt) === false) {\n                break;\n            }\n        }\n        return this;\n    }\n\n    firstElem(func: (item: Element, cnt?: number) => any = item => item): DomQuery {\n        if (this.rootNode.length > 1) {\n            func(this.rootNode[0], 0);\n        }\n        return this;\n    }\n\n    each(func: (item: DomQuery, cnt?: number) => any): DomQuery {\n        Stream.of(...this.rootNode)\n            .each((item, cnt) => {\n                //we could use a filter, but for the best performance we dont\n                if (item == null) {\n                    return;\n                }\n                return func(DomQuery.byId(item), cnt);\n            });\n\n        return this;\n    }\n\n    /**\n     * returns a new dom query containing only the first element max\n     *\n     * @param func a an optional callback function to perform an operation on the first element\n     */\n    first(func: (item: DomQuery, cnt?: number) => any = (item) => item): DomQuery {\n        if (this.rootNode.length >= 1) {\n            func(this.get(0), 0);\n            return this.get(0);\n        }\n        return this;\n    }\n\n    /**\n     * filter function which filters a subset\n     *\n     * @param func\n     */\n    filter(func: (item: DomQuery) => boolean): DomQuery {\n        let reArr: Array<DomQuery> = [];\n        this.each((item: DomQuery) => {\n            func(item) ? reArr.push(item) : null;\n        });\n        return new DomQuery(...<any>reArr);\n    }\n\n    //TODO append prepend\n\n    /**\n     * global eval head appendix method\n     * no other methods are supported anymore\n     * @param code the code to be evaled\n     * @param  nonce optional  nonce key for higher security\n     */\n    globalEval(code: string, nonce ?: string): DomQuery {\n        let head = document.getElementsByTagName(\"head\")[0] || document.documentElement;\n        let script = document.createElement(\"script\");\n        if (nonce) {\n            script.setAttribute(\"nonce\", nonce);\n        }\n        script.type = \"text/javascript\";\n        script.innerHTML = code;\n        let newScriptElement = head.appendChild(script);\n        head.removeChild(newScriptElement);\n        return this;\n    }\n\n    /**\n     * detaches a set of nodes from their parent elements\n     * in a browser independend manner\n     * @param {Object} items the items which need to be detached\n     * @return {Array} an array of nodes with the detached dom nodes\n     */\n    detach(): DomQuery {\n        this.eachElem((item: Element) => {\n            item.parentNode.removeChild(item);\n        });\n        return this;\n    }\n\n    /**\n     * appends the current set of elements\n     * to the element or first element passed via elem\n     * @param elem\n     */\n    appendTo(elem: DomQuery) {\n        this.eachElem((item) => {\n            let value1: Element = <Element>elem.getAsElem(0).orElseLazy(() => {\n                return {\n                    appendChild: (theItem: any) => {\n                    }\n                }\n            }).value;\n            value1.appendChild(item);\n        });\n    }\n\n    /**\n     * loads and evals a script from a source uri\n     *\n     * @param src the source to be loaded and evaled\n     * @param defer in miliseconds execution default (0 == no defer)\n     * @param charSet\n     */\n    loadScriptEval(src: string, defer: number = 0, charSet: string = \"utf-8\") {\n        let xhr = new XMLHttpRequest();\n        xhr.open(\"GET\", src, false);\n\n        if (charSet) {\n            xhr.setRequestHeader(\"Content-Type\", \"application/x-javascript; charset:\" + charSet);\n        }\n\n        xhr.send(null);\n\n        xhr.onload = (responseData: any) => {\n            //defer also means we have to process after the ajax response\n            //has been processed\n            //we can achieve that with a small timeout, the timeout\n            //triggers after the processing is done!\n            if (!defer) {\n                this.globalEval(xhr.responseText.replace(\"\\n\", \"\\r\\n\") + \"\\r\\n//@ sourceURL=\" + src);\n            } else {\n                //TODO not ideal we maybe ought to move to something else here\n                //but since it is not in use yet, it is ok\n                setTimeout(() => {\n                    this.globalEval(xhr.responseText + \"\\r\\n//@ sourceURL=\" + src);\n                }, defer);\n            }\n        };\n\n        xhr.onerror = (data: any) => {\n            throw Error(data);\n        };\n        //since we are synchronous we do it after not with onReadyStateChange\n\n        return this;\n    }\n\n    insertAfter(...toInsertParams: Array<DomQuery>): DomQuery {\n\n        this.each(existingItem => {\n            let existingElement = existingItem.getAsElem(0).value;\n            let rootNode = existingElement.parentNode;\n            for (let cnt = 0; cnt < toInsertParams.length; cnt++) {\n                let nextSibling: Element = <any>existingElement.nextSibling;\n                toInsertParams[cnt].eachElem(insertElem => {\n                    if (nextSibling) {\n                        rootNode.insertBefore(insertElem, nextSibling);\n                        existingElement = nextSibling;\n                    } else {\n                        rootNode.appendChild(insertElem);\n                    }\n                });\n\n            }\n        });\n\n        let res = [];\n        res.push(this);\n        res = res.concat(toInsertParams);\n        return new DomQuery(...res);\n    }\n\n    insertBefore(...toInsertParams: Array<DomQuery>): DomQuery {\n        this.each(existingItem => {\n            let existingElement = existingItem.getAsElem(0).value;\n            let rootNode = existingElement.parentNode;\n            for (let cnt = 0; cnt < toInsertParams.length; cnt++) {\n                toInsertParams[cnt].eachElem(insertElem => {\n                    rootNode.insertBefore(insertElem, existingElement);\n                });\n            }\n        });\n        let res = [];\n        res.push(this);\n        res = res.concat(toInsertParams);\n        return new DomQuery(...res);\n    }\n\n    orElse(...elseValue: any): DomQuery {\n        if (this.isPresent()) {\n            return this;\n        } else {\n            return new DomQuery(...elseValue);\n        }\n    }\n\n    orElseLazy(func: () => any): DomQuery {\n        if (this.isPresent()) {\n            return this;\n        } else {\n            return new DomQuery(func());\n        }\n    }\n\n    parents(tagName: string): DomQuery {\n        const retSet: Set<Element> = new Set();\n        const retArr: Array<Element> = [];\n        const lowerTagName = tagName.toLowerCase();\n\n        let resolveItem = (item: Element) => {\n            if ((item.tagName || \"\").toLowerCase() == lowerTagName && !retSet.has(item)) {\n                retSet.add(item);\n                retArr.push(item);\n            }\n        };\n\n        this.eachElem((item: Element) => {\n            while (item.parentNode) {\n                item = <Element>item.parentNode;\n                resolveItem(item);\n                //nested forms not possible, performance shortcut\n                if (tagName == \"form\" && retArr.length) {\n                    return false;\n                }\n            }\n        });\n\n        return new DomQuery(...retArr);\n    }\n\n    copyAttrs(sourceItem: DomQuery | XMLQuery): DomQuery {\n        sourceItem.eachElem((sourceNode: Element) => {\n            let attrs: Array<Attr> = objToArray(sourceNode.attributes);\n            for (let item of attrs) {\n                let value: string = item.value;\n                let name: string = item.name;\n\n                switch (name) {\n                    case \"id\":\n                        this.id.value = value;\n                        break;\n                    case \"disabled\":\n                        this.resolveAttributeHolder(\"disabled\").disabled = value;\n                        break;\n                    case \"checked\":\n                        this.resolveAttributeHolder(\"checked\").checked = value;\n                        break;\n                    default:\n                        this.attr(name).value = value;\n                }\n            }\n        });\n        return this;\n    }\n\n    /**\n     * resolves an attribute holder compared\n     * @param attrName the attribute name\n     */\n    private resolveAttributeHolder(attrName: string = \"value\"): HTMLFormElement | any {\n        let ret = [];\n        ret[attrName] = null;\n        return (attrName in this.getAsElem(0).value) ?\n            this.getAsElem(0).value :\n            ret;\n    }\n\n    /**\n     * outerhtml convenience method\n     * browsers only support innerHTML but\n     * for instance for your jsf.js we have a full\n     * replace pattern which needs outerHTML processing\n     *\n     * @param markup\n     * @param runEmbeddedScripts\n     * @param runEmbeddedCss\n     */\n    outerHTML(markup: string, runEmbeddedScripts ?: boolean, runEmbeddedCss ?: boolean): DomQuery {\n        if (this.isAbsent()) {\n            return;\n        }\n\n        let focusElementId = document?.activeElement?.id;\n        let caretPosition = (focusElementId) ? DomQuery.getCaretPosition(document.activeElement) : null;\n        let nodes = DomQuery.fromMarkup(markup);\n        let res = [];\n        let toReplace = this.getAsElem(0).value;\n        let firstInsert = nodes.get(0);\n        let parentNode = toReplace.parentNode;\n        let replaced = firstInsert.getAsElem(0).value;\n        parentNode.replaceChild(replaced, toReplace);\n        res.push(new DomQuery(replaced));\n        //no replacement possible\n        if (this.isAbsent()) {\n            return this;\n        }\n\n        let insertAdditionalItems = [];\n\n        if (nodes.length > 1) {\n            insertAdditionalItems = insertAdditionalItems.concat(...nodes.values.slice(1));\n            res.push(DomQuery.byId(replaced).insertAfter(new DomQuery(...insertAdditionalItems)));\n        }\n\n        if (runEmbeddedScripts) {\n            this.runScripts();\n        }\n        if (runEmbeddedCss) {\n            this.runCss();\n        }\n\n        let focusElement = DomQuery.byId(focusElementId);\n        if (focusElementId && focusElement.isPresent() &&\n            caretPosition != null && \"undefined\" != typeof caretPosition) {\n            focusElement.eachElem(item => DomQuery.setCaretPosition(item, caretPosition));\n        }\n\n        return nodes;\n    }\n\n    /**\n     * Run through the given nodes in the DomQuery execute the inline scripts\n     * @param whilteListed: optional whitelist function which can filter out script tags which are not processed\n     * defaults to the standard jsf.js exclusion (we use this code for myfaces)\n     */\n    runScripts(whilteListed: (val: string) => boolean = DEFAULT_JSF_WHITELIST): DomQuery {\n        let finalScripts = [],\n            equi = equalsIgnoreCase,\n            execScrpt = (item) => {\n                let tagName = item.tagName;\n                let itemType = item.type || \"\";\n                if (tagName && equi(tagName, \"script\") &&\n                    (itemType === \"\" || equi(itemType, \"text/javascript\") ||\n                        equi(itemType, \"javascript\") ||\n                        equi(itemType, \"text/ecmascript\") ||\n                        equi(itemType, \"ecmascript\"))) {\n                    let src = item.getAttribute('src');\n                    if ('undefined' != typeof src\n                        && null != src\n                        && src.length > 0\n                    ) {\n                        //we have to move this into an inner if because chrome otherwise chokes\n                        //due to changing the and order instead of relying on left to right\n                        //if jsf.js is already registered we do not replace it anymore\n                        if (whilteListed(src)) {\n                            if (finalScripts.length) {\n                                //script source means we have to eval the existing\n                                //scripts before running the include\n                                this.globalEval(finalScripts.join(\"\\n\"));\n\n                                finalScripts = [];\n                            }\n                            this.loadScriptEval(src, 0, \"UTF-8\");\n                        }\n\n                    } else {\n                        // embedded script auto eval\n                        //TODO this probably needs to be changed due to our new parsing structures\n                        //probably not needed anymore\n                        let evalText = trim(item.text || item.innerText || item.innerHTML);\n                        let go = true;\n\n                        while (go) {\n                            go = false;\n                            if (evalText.substring(0, 4) == \"<!--\") {\n                                evalText = evalText.substring(4);\n                                go = true;\n                            }\n                            if (evalText.substring(0, 4) == \"//<!--\") {\n                                evalText = evalText.substring(6);\n                                go = true;\n                            }\n                            if (evalText.substring(0, 11) == \"//<![CDATA[\") {\n                                evalText = evalText.substring(11);\n                                go = true;\n                            }\n                        }\n                        // we have to run the script under a global context\n                        //we store the script for less calls to eval\n                        finalScripts.push(evalText);\n\n                    }\n                }\n            };\n        try {\n            let scriptElements = new DomQuery(this.filterSelector(\"script\"), this.querySelectorAll(\"script\"));\n            //script execution order by relative pos in their dom tree\n            scriptElements.stream\n                .flatMap(item => {\n                    return Stream.of(item.values)\n                })\n                .sort((node1, node2) => {\n                    return node1.compareDocumentPosition(node2) - 3; //preceding 2, following == 4\n                })\n                .each(item => execScrpt(item));\n\n            if (finalScripts.length) {\n                this.globalEval(finalScripts.join(\"\\n\"));\n            }\n        } catch (e) {\n            if (window.console && window.console.error) {\n                //not sure if we\n                //should use our standard\n                //error mechanisms here\n                //because in the head appendix\n                //method only a console\n                //error would be raised as well\n                console.error(e.message || e.description);\n            }\n        } finally {\n            //the usual ie6 fix code\n            //the IE6 garbage collector is broken\n            //nulling closures helps somewhat to reduce\n            //mem leaks, which are impossible to avoid\n            //at this browser\n            execScrpt = null;\n        }\n        return this;\n    }\n\n    runCss(): DomQuery {\n\n        const applyStyle = (item: Element, style: string) => {\n                let newSS: HTMLStyleElement = document.createElement(\"style\");\n                document.getElementsByTagName(\"head\")[0].appendChild(newSS);\n\n                let styleSheet = newSS.sheet ?? (<any>newSS).styleSheet;\n\n                newSS.setAttribute(\"rel\", item.getAttribute(\"rel\") ?? \"stylesheet\");\n                newSS.setAttribute(\"type\", item.getAttribute(\"type\") ?? \"text/css\");\n\n                if (styleSheet?.cssText ?? false) {\n                    styleSheet.cssText = style;\n                } else {\n                    newSS.appendChild(document.createTextNode(style));\n                }\n            },\n\n            execCss = (item: Element) => {\n                const tagName = item.tagName;\n                if (tagName && equalsIgnoreCase(tagName, \"link\") && equalsIgnoreCase(item.getAttribute(\"type\"), \"text/css\")) {\n                    applyStyle(item, \"@import url('\" + item.getAttribute(\"href\") + \"');\");\n                } else if (tagName && equalsIgnoreCase(tagName, \"style\") && equalsIgnoreCase(item.getAttribute(\"type\"), \"text/css\")) {\n                    let innerText = [];\n                    //compliant browsers know child nodes\n                    let childNodes: NodeList = item.childNodes;\n                    if (childNodes) {\n                        const len = childNodes.length;\n                        for (let cnt = 0; cnt < len; cnt++) {\n                            innerText.push((<Element>childNodes[cnt]).innerHTML || (<CharacterData>childNodes[cnt]).data);\n                        }\n                        //non compliant ones innerHTML\n                    } else if (item.innerHTML) {\n                        innerText.push(item.innerHTML);\n                    }\n\n                    applyStyle(item, innerText.join(\"\"));\n                }\n            };\n\n        const scriptElements: DomQuery = new DomQuery(this.filterSelector(\"link, style\"), this.querySelectorAll(\"link, style\"));\n\n        scriptElements.stream\n            .flatMap(item => {\n                return Stream.of(item.values)\n            })\n            .sort((node1, node2) => {\n                return node1.compareDocumentPosition(node2) - 3; //preceding 2, following == 4\n            })\n            .each(item => execCss(item));\n\n        return this;\n    }\n\n    /**\n     * fires a click event on the underlying dom elements\n     */\n    click(): DomQuery {\n        this.fireEvent(\"click\");\n        return this;\n    }\n\n    addEventListener(type: string, listener: (evt: Event) => void, options?: boolean | EventListenerOptions): DomQuery {\n        this.eachElem((node: Element) => {\n            node.addEventListener(type, listener, options);\n        });\n        return this;\n    }\n\n    removeEventListener(type: string, listener: (evt: Event) => void, options?: boolean | EventListenerOptions): DomQuery {\n        this.eachElem((node: Element) => {\n            node.removeEventListener(type, listener, options);\n        });\n        return this;\n    }\n\n    /**\n     * fires an event\n     */\n    fireEvent(eventName: string) {\n        this.eachElem((node: Element) => {\n            let doc;\n            if (node.ownerDocument) {\n                doc = node.ownerDocument;\n            } else if (node.nodeType == 9) {\n                // the node may be the document itself, nodeType 9 = DOCUMENT_NODE\n                doc = node;\n            } else {\n                throw new Error(\"Invalid node passed to fireEvent: \" + node.id);\n            }\n\n            if (node.dispatchEvent) {\n                // Gecko-style approach (now the standard) takes more work\n                let eventClass = \"\";\n\n                // Different events have different event classes.\n                // If this switch statement can't map an eventName to an eventClass,\n                // the event firing is going to fail.\n                switch (eventName) {\n                    case \"click\": // Dispatching of 'click' appears to not work correctly in Safari. Use 'mousedown' or 'mouseup' instead.\n                    case \"mousedown\":\n                    case \"mouseup\":\n                        eventClass = \"MouseEvents\";\n                        break;\n\n                    case \"focus\":\n                    case \"change\":\n                    case \"blur\":\n                    case \"select\":\n                        eventClass = \"HTMLEvents\";\n                        break;\n\n                    default:\n                        throw \"fireEvent: Couldn't find an event class for event '\" + eventName + \"'.\";\n                        break;\n                }\n                let event = doc.createEvent(eventClass);\n                event.initEvent(eventName, true, true); // All events created as bubbling and cancelable.\n\n                event.synthetic = true; // allow detection of synthetic events\n                // The second parameter says go ahead with the default action\n                node.dispatchEvent(event);\n            } else if ((<any>node).fireEvent) {\n                // IE-old school style, you can drop this if you don't need to support IE8 and lower\n                let event = doc.createEventObject();\n                event.synthetic = true; // allow detection of synthetic events\n                (<any>node).fireEvent(\"on\" + eventName, event);\n            }\n        })\n    }\n\n    textContent(joinstr: string = \"\"): string {\n        return this.stream\n            .map((value: DomQuery) => {\n                let item = value.getAsElem(0).orElseLazy(() => {\n                    return <any>{\n                        textContent: \"\"\n                    };\n                }).value;\n                return (<any>item).textContent || \"\";\n            })\n            .reduce((text1, text2) => text1 + joinstr + text2, \"\").value;\n    }\n\n    innerText(joinstr: string = \"\"): string {\n        return this.stream\n            .map((value: DomQuery) => {\n                let item = value.getAsElem(0).orElseLazy(() => {\n                    return <any>{\n                        innerText: \"\"\n                    };\n                }).value;\n                return (<any>item).innerText || \"\";\n            })\n            .reduce((text1, text2) => [text1, text2].join(joinstr), \"\").value;\n\n    }\n\n    /**\n     * encodes all input elements properly into respective\n     * config entries, this can be used\n     * for legacy systems, for newer usecases, use the\n     * HTML5 Form class which all newer browsers provide\n     *\n     * @param toMerge optional config which can be merged in\n     * @return a copy pf\n     */\n    encodeFormElement(toMerge = new Config({})): Config {\n\n        //browser behavior no element name no encoding (normal submit fails in that case)\n        //https://issues.apache.org/jira/browse/MYFACES-2847\n        if (this.name.isAbsent()) {\n            return;\n        }\n\n        //lets keep it sideffects free\n        let target = toMerge.shallowCopy;\n\n        this.each((element: DomQuery) => {\n            if (element.name.isAbsent()) {//no name, no encoding\n                return;\n            }\n            let name = element.name.value;\n            let tagName = element.tagName.orElse(\"__none__\").value.toLowerCase();\n            let elemType = element.type.orElse(\"__none__\").value.toLowerCase();\n\n            elemType = elemType.toLowerCase();\n\n            // routine for all elements\n            // rules:\n            // - process only inputs, textareas and selects\n            // - elements muest have attribute \"name\"\n            // - elements must not be disabled\n            if (((tagName == \"input\" || tagName == \"textarea\" || tagName == \"select\") &&\n                (name != null && name != \"\")) && !element.disabled) {\n\n                // routine for select elements\n                // rules:\n                // - if select-one and value-Attribute exist => \"name=value\"\n                // (also if value empty => \"name=\")\n                // - if select-one and value-Attribute don't exist =>\n                // \"name=DisplayValue\"\n                // - if select multi and multple selected => \"name=value1&name=value2\"\n                // - if select and selectedIndex=-1 don't submit\n                if (tagName == \"select\") {\n                    // selectedIndex must be >= 0 sein to be submittet\n                    let selectElem: HTMLSelectElement = <HTMLSelectElement>element.getAsElem(0).value;\n                    if (selectElem.selectedIndex >= 0) {\n                        let uLen = selectElem.options.length;\n                        for (let u = 0; u < uLen; u++) {\n                            // find all selected options\n                            //let subBuf = [];\n                            if (selectElem.options[u].selected) {\n                                let elementOption = selectElem.options[u];\n                                target.assign(name).value = (elementOption.getAttribute(\"value\") != null) ?\n                                    elementOption.value : elementOption.text;\n                            }\n                        }\n                    }\n                }\n\n                // routine for remaining elements\n                // rules:\n                // - don't submit no selects (processed above), buttons, reset buttons, submit buttons,\n                // - submit checkboxes and radio inputs only if checked\n                if ((tagName != \"select\" && elemType != \"button\"\n                    && elemType != \"reset\" && elemType != \"submit\" && elemType != \"image\")\n                    && ((elemType != \"checkbox\" && elemType != \"radio\") || element.checked)) {\n                    let files: any = (<any>element.value).files;\n                    if (files && files.length) {\n                        //xhr level2\n                        target.assign(name).value = files[0];\n                    } else {\n                        target.assign(name).value = element.inputValue.value;\n                    }\n                }\n\n            }\n        });\n\n        return target;\n\n    }\n\n    get cDATAAsString(): string {\n        let cDataBlock = [];\n        let TYPE_CDATA_BLOCK = 4;\n        // response may contain several blocks\n        return this.stream\n            .flatMap(item => item.childNodes.stream).reduce((reduced: Array<any>, item: DomQuery) => {\n                if (item?.value?.value?.nodeType == TYPE_CDATA_BLOCK) {\n                    reduced.push((<any>item?.value?.value)?.data ?? \"\");\n                }\n                return reduced;\n            }, []).value.join(\"\");\n    }\n\n    subNodes(from: number, to?: number): DomQuery {\n        if (Optional.fromNullable(to).isAbsent()) {\n            to = this.length;\n        }\n        return new DomQuery(...this.rootNode.slice(from, Math.min(to, this.length)));\n    }\n\n    _limits = -1;\n\n    limits(end: number): IStream<DomQuery> {\n        this._limits = end;\n        return <any>this;\n    }\n\n    //-- internally exposed methods needed for the interconnectivity\n    hasNext() {\n        let isLimitsReached = this._limits != -1 && this.pos >= this._limits - 1;\n        let isEndOfArray = this.pos >= this.values.length - 1;\n        return !(isLimitsReached ||\n            isEndOfArray);\n    }\n\n    next(): DomQuery {\n        if (!this.hasNext()) {\n            return null;\n        }\n        this.pos++;\n        return new DomQuery(this.values[this.pos]);\n    }\n\n    reset() {\n        this.pos = -1;\n    }\n\n    //from\n    // http://blog.vishalon.net/index.php/javascript-getting-and-setting-caret-position-in-textarea/\n    static getCaretPosition(ctrl: any) {\n        let caretPos = 0;\n\n        try {\n            if ((<any>document)?.selection) {\n                ctrl.focus();\n                let selection = (<any>document).selection.createRange();\n                //the selection now is start zero\n                selection.moveStart('character', -ctrl.value.length);\n                //the caretposition is the selection start\n                caretPos = selection.text.length;\n            }\n        } catch (e) {\n            //now this is ugly, but not supported input types throw errors for selectionStart\n            //just in case someone dumps this code onto unsupported browsers\n        }\n        return caretPos;\n    }\n\n    static setCaretPosition(ctrl: any, pos: number) {\n        ctrl.focus();\n        //the selection range is our caret position\n        ctrl.setSelectionRange(pos, pos);\n    }\n}\n\n/**\n * Various collectors\n * which can be used in conjunction with Streams\n */\n\n/**\n * A collector which bundles a full dom query stream into a single dom query element\n *\n * This connects basically our stream back into DomQuery\n */\nexport class DomQueryCollector implements ICollector<DomQuery, DomQuery> {\n\n    data: DomQuery[] = [];\n\n    collect(element: DomQuery) {\n        this.data.push(element);\n    }\n\n    get finalValue(): DomQuery {\n        return new DomQuery(...this.data);\n    }\n}\n\n/**\n * abbreviation for DomQuery\n */\nexport const DQ = DomQuery;\nexport type DQ = DomQuery;\n","/* Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {Optional} from \"./Monad\";\n\n/**\n * Lang helpers crossported from the apache myfaces project\n */\nexport module Lang {\n    \n\n    //should be in lang, but for now here to avoid recursive imports, not sure if typescript still has a problem with those\n    /**\n     * helper function to savely resolve anything\n     * this is not an elvis operator, it resolves\n     * a value without exception in a tree and if\n     * it is not resolvable then an optional of\n     * a default value is restored or Optional.empty\n     * if none is given\n     *\n     * usage\n     * <code>\n     *     let var: Optiona<string> = saveResolve(() => a.b.c.d.e, \"foobaz\")\n     * </code>\n     *\n     * @param resolverProducer a lambda which can produce the value\n     * @param defaultValue an optional default value if the producer failes to produce anything\n     * @returns an Optional of the produced value\n     */\n    export function saveResolve<T>(resolverProducer: () => T, defaultValue: T = null): Optional<T> {\n        try {\n            let result = resolverProducer();\n            return Optional.fromNullable(result ?? defaultValue);\n        } catch (e) {\n            return Optional.absent;\n        }\n    }\n\n    export function saveResolveLazy<T>(resolverProducer: () => T, defaultValue: () => T = null): Optional<T> {\n        try {\n            let result = resolverProducer();\n            return Optional.fromNullable(result ?? defaultValue());\n        } catch (e) {\n            return Optional.absent;\n        }\n    }\n\n    /**\n     * String to array function performs a string to array transformation\n     * @param {String} it the string which has to be changed into an array\n     * @param {RegExp} splitter our splitter reglar expression\n     * @return a trimmed array of the splitted string\n     */\n    export function strToArray(it: string, splitter: string | RegExp = /\\./gi): Array<string> {\n\n        let ret = [];\n        it.split(splitter).forEach((element => {\n            ret.push(trim(element));\n        }));\n        return ret;\n    }\n\n    /**\n     * hyperfast trim\n     * http://blog.stevenlevithan.com/archives/faster-trim-javascript\n     * crossported from dojo\n     */\n    export function trim(str: string): string {\n        str = str.replace(/^\\s\\s*/, '');\n        let ws = /\\s/, i = str.length;\n\n        while (ws.test(str.charAt(--i))) {\n            //do nothing\n        }\n        return str.slice(0, i + 1);\n    }\n\n    /**\n     * generic object arrays like dom definitions to array conversion method which\n     * transforms any object to something array like\n     * @param obj\n     * @param offset\n     * @param pack\n     * @returns an array converted from the object\n     */\n    export function objToArray<T>(obj: any, offset: number = 0, pack: Array<T> = []): Array<T> {\n        if ((obj ?? \"__undefined__\") == \"__undefined__\") {\n            return pack ?? null;\n        }\n        //since offset is numeric we cannot use the shortcut due to 0 being false\n        //special condition array delivered no offset no pack\n        if ((<any>obj) instanceof Array && !offset && !pack) return obj;\n\n        return pack.concat(Array.prototype.slice.call(obj, offset));\n    }\n\n    /**\n     * equalsIgnoreCase, case insensitive comparison of two strings\n     *\n     * @param source\n     * @param destination\n     */\n    export function equalsIgnoreCase(source?: string, destination?: string): boolean {\n        let finalSource = source ?? \"___no_value__\";\n        let finalDest = destination ?? \"___no_value__\";\n\n        //in any other case we do a strong string comparison\n        return finalSource.toLowerCase() === finalDest.toLowerCase();\n    }\n\n    /**\n     * runtime type assertion\n     *\n     * @param probe the probe to be tested for a type\n     * @param theType the type to be tested for\n     */\n    export function assertType(probe: any, theType: any): boolean {\n        return isString(theType) ? typeof probe == theType : probe instanceof theType;\n    }\n\n    /**\n     * Backported from dojo\n     * a failsafe string determination method\n     * (since in javascript String != \"\" typeof alone fails!)\n     * @param it {|Object|} the object to be checked for being a string\n     * @return true in case of being a string false otherwise\n     */\n    export function isString(it?: any): boolean {\n        //\tsummary:\n        //\t\tReturn true if it is a String\n        return !!arguments.length && it != null && (typeof it == \"string\" || it instanceof String); // Boolean\n    }\n\n    export function isFunc(it: any): boolean {\n        return it instanceof Function || typeof it === \"function\";\n    }\n\n    // code from https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n    // license https://creativecommons.org/licenses/by-sa/2.5/\n    export function objAssign(target: any, ...theArgs: any) { // .length of function is 2\n        if (target == null) { // TypeError if undefined or null\n            throw new TypeError('Cannot convert undefined or null to object');\n        }\n\n        let to = Object(target);\n        if((<any>Object).assign) {\n            theArgs.forEach(item => (<any>Object).assign(to, item));\n            return to;\n        }\n\n        theArgs.forEach(item => {\n            let nextSource = item;\n            if (nextSource != null) { // Skip over if undefined or null\n                for (let nextKey in nextSource) {\n                    // Avoid bugs when hasOwnProperty is shadowed\n                    if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n                        to[nextKey] = nextSource[nextKey];\n                    }\n                }\n            }\n        });\n        return to;\n    }\n}\n\n","/* Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * A module which keeps  basic monadish like definitions in place without any sidedependencies to other modules.\n * Useful if you need the functions in another library to keep its dependencies down\n */\n\n/*IMonad definitions*/\n\nimport {Lang} from \"./Lang\";\nimport {AssocArrayCollector} from \"./SourcesCollectors\";\nimport {Stream} from \"./Stream\";\nimport objAssign = Lang.objAssign;\n\n/**\n * IFunctor interface,\n * defines an interface which allows to map a functor\n * via a first order function to another functor\n */\nexport interface IFunctor<T> {\n    map<R>(fn: (data: T) => R): IFunctor<R>;\n}\n\n/**\n * IMonad definition, basically a functor with a flaptmap implementation (flatmap reduces all nested monads after a\n * function call f into a monad with the nesting level of 1\n *\n * flatmap flats nested Monads into a IMonad of the deepest nested implementation\n */\nexport interface IMonad<T, M extends IMonad<any, any>> extends IFunctor<T> {\n    flatMap<T, M>(f: (T) => M): IMonad<any, any>;\n}\n\n/**\n * a stateful functor which holds a value upn which a\n * function can be applied\n *\n * as value holder of type T\n */\nexport interface IIdentity<T> extends IFunctor<T> {\n    readonly value: T;\n}\n\n/**\n *  custom value holder definition, since we are not pure functional\n *  but iterative we have structures which allow the assignment of a value\n *  also not all structures are sideffect free\n */\nexport interface IValueHolder<T> {\n    value: T | Array<T>;\n}\n\n/**\n * Implementation of a monad\n * (Sideffect free), no write allowed directly on the monads\n * value state\n */\nexport class Monad<T> implements IMonad<T, Monad<any>>, IValueHolder<T> {\n    constructor(value: T) {\n        this._value = value;\n    }\n\n    protected _value: T;\n\n    get value(): T {\n        return this._value;\n    }\n\n    map<R>(fn?: (data: T) => R): Monad<R> {\n        if (!fn) {\n            fn = (inval: any) => <R>inval;\n        }\n        let result: R = fn(this.value);\n        return new Monad(result);\n    }\n\n    flatMap<R>(fn?: (data: T) => R): Monad<any> {\n        let mapped: Monad<any> = this.map(fn);\n        while (mapped?.value instanceof Monad) {\n            mapped = mapped.value\n        }\n        return mapped;\n    }\n\n}\n\n\n\n\n/**\n * optional implementation, an optional is basically an implementation of a Monad with additional syntactic\n * sugar on top\n * (Sideeffect free, since value assignment is not allowed)\n * */\nexport class Optional<T> extends Monad<T> {\n\n    /*default value for absent*/\n    static absent = Optional.fromNullable(null);\n\n    constructor(value: T) {\n        super(value);\n    }\n\n    get value(): T {\n        if (this._value instanceof Monad) {\n            return this._value.flatMap().value\n        }\n        return this._value;\n    }\n\n    static fromNullable<T>(value?: T): Optional<T> {\n        return new Optional(value);\n    }\n\n    /*syntactic sugar for absent and present checks*/\n    isAbsent(): boolean {\n        return \"undefined\" == typeof this.value || null == this.value;\n    }\n\n    /**\n     * any value present\n     */\n    isPresent(presentRunnable ?: (val ?: Monad<T>) => void): boolean {\n        let absent = this.isAbsent();\n        if (!absent && presentRunnable) {\n            presentRunnable.call(this, this)\n        }\n        return !absent;\n    }\n\n    ifPresentLazy(presentRunnable: (val ?: Monad<T>) => void = () => {\n    }): Monad<T> {\n        this.isPresent.call(this, presentRunnable);\n        return this;\n    }\n\n    orElse(elseValue: any): Optional<any> {\n        if (this.isPresent()) {\n            return this;\n        } else {\n            //shortcut\n            if (elseValue == null) {\n                return Optional.absent;\n            }\n            return this.flatMap(() => elseValue);\n        }\n    }\n\n    /**\n     * lazy, passes a function which then is lazily evaluated\n     * instead of a direct value\n     * @param func\n     */\n    orElseLazy(func: () => any): Optional<any> {\n        if (this.isPresent()) {\n            return this;\n        } else {\n            return this.flatMap(func);\n        }\n    }\n\n    /*\n     * we need to implement it to fullfill the contract, although it is used only internally\n     * all values are flattened when accessed anyway, so there is no need to call this methiod\n     */\n    flatMap<R>(fn?: (data: T) => R): Optional<any> {\n        let val = super.flatMap(fn);\n        if (!(val instanceof Optional)) {\n            return Optional.fromNullable(val.value);\n        }\n\n        return <Optional<any>>val.flatMap();\n    }\n\n    /*\n     * elvis operation, take care, if you use this you lose typesafety and refactoring\n     * capabilites, unfortunately typesceript does not allow to have its own elvis operator\n     * this is some syntactic sugar however which is quite useful*/\n    getIf<R>(...key: string[]): Optional<R> {\n\n        let currentPos: Optional<any> = this;\n        for (let cnt = 0; cnt < key.length; cnt++) {\n            let currKey = this.keyVal(key[cnt]);\n            let arrPos = this.arrayIndex(key[cnt]);\n\n            if (currKey === \"\" && arrPos >= 0) {\n                currentPos = this.getClass().fromNullable(!(currentPos.value instanceof Array) ? null : (currentPos.value.length < arrPos ? null : currentPos.value[arrPos]));\n                if (currentPos.isAbsent()) {\n                    return currentPos;\n                }\n                continue;\n            } else if (currKey && arrPos >= 0) {\n                if (currentPos.getIfPresent(currKey).isAbsent()) {\n                    return currentPos;\n                }\n                currentPos = (currentPos.getIfPresent(currKey).value instanceof Array) ? this.getClass().fromNullable(currentPos.getIfPresent(currKey).value[arrPos]) : this.getClass().absent;\n                if (currentPos.isAbsent()) {\n                    return currentPos;\n                }\n                continue;\n\n            } else {\n                currentPos = currentPos.getIfPresent(currKey);\n            }\n            if (currentPos.isAbsent()) {\n                return currentPos;\n            } else if (arrPos > -1) {\n                currentPos = this.getClass().fromNullable(currentPos.value[arrPos]);\n            }\n        }\n        let retVal = currentPos;\n\n        return retVal;\n    }\n\n    /**\n     * simple match, if the first order function call returns\n     * true then there is a match, if the value is not present\n     * it never matches\n     *\n     * @param fn the first order function performing the match\n     */\n    match(fn: (item: T) => boolean): boolean {\n        if (this.isAbsent()) {\n            return false\n        }\n        return fn(this.value);\n    }\n\n    /**\n     * convenience function to flatmap the internal value\n     * and replace it with a default in case of being absent\n     *\n     * @param defaultVal\n     * @returns {Optional<any>}\n     */\n    get<R>(defaultVal: any = Optional.absent): Optional<R> {\n        if (this.isAbsent()) {\n            return this.getClass().fromNullable(defaultVal).flatMap();\n        }\n\n        return this.getClass().fromNullable(this.value).flatMap();\n    }\n\n    toJson(): string {\n        return JSON.stringify(this.value);\n    }\n\n    /**\n     * helper to override several implementations in a more fluent way\n     * by having a getClass operation we can avoid direct calls into the constructor or\n     * static methods and do not have to implement several methods which rely on the type\n     * of \"this\"\n     * @returns {Monadish.Optional}\n     */\n    protected getClass(): any {\n        return Optional;\n    }\n\n    /*helper method for getIf with array access aka <name>[<indexPos>]*/\n    protected arrayIndex(key: string): number {\n        let start = key.indexOf(\"[\");\n        let end = key.indexOf(\"]\");\n        if (start >= 0 && end > 0 && start < end) {\n            return parseInt(key.substring(start + 1, end));\n        } else {\n            return -1;\n        }\n    }\n\n    /*helper method for getIf with array access aka <name>[<indexPos>]*/\n    protected keyVal(key: string): string {\n        let start = key.indexOf(\"[\");\n\n        if (start >= 0) {\n            return key.substring(0, start);\n        } else {\n            return key;\n        }\n    }\n\n    /**\n     * additional syntactic sugar which is not part of the usual optional implementation\n     * but makes life easier, if you want to sacrifice typesafety and refactoring\n     * capabilities in typescript\n     */\n    getIfPresent<R>(key: string): Optional<R> {\n        if (this.isAbsent()) {\n            return this.getClass().absent;\n        }\n        return this.getClass().fromNullable(this.value[key]).flatMap();\n    }\n\n    /**\n     * elvis like typesafe functional save resolver\n     * a typesafe option for getIfPresent\n     *\n     * usage myOptional.resolve(value => value.subAttr.subAttr2).orElseLazy(....)\n     * if this is resolvable without any errors an Optional with the value is returned\n     * if not, then an Optional absent is returned, also if you return Optional absent\n     * it is flatmapped into absent\n     *\n     * @param resolver the resolver function, can throw any arbitrary errors, int  the error case\n     * the resolution goes towards absent\n     */\n    resolve<V>(resolver: (item: T) => V): Optional<V> {\n        if(this.isAbsent()) {\n            return Optional.absent;\n        }\n        try {\n            return Optional.fromNullable(resolver(this.value))\n        } catch(e) {\n            return Optional.absent;\n        }\n    }\n\n}\n\n\n// --------------------- From here onwards we break out the sideffects free limits ------------\n\n\n/**\n * ValueEmbedder is the writeable version\n * of optional, it basically is a wrappber\n * around a construct which has a state\n * and can be written to.\n *\n * For the readonly version see Optional\n */\nexport class ValueEmbedder<T> extends Optional<T> implements IValueHolder<T> {\n\n    /*default value for absent*/\n    static absent =  ValueEmbedder.fromNullable(null);\n\n    protected key: string;\n\n    constructor(rootElem: any, valueKey: string = \"value\") {\n        super(rootElem);\n\n        this.key = valueKey;\n    }\n\n    get value(): T {\n        return this._value ? <T>this._value[this.key] : null;\n    }\n\n    set value(newVal: T) {\n        if(!this._value) {\n            return;\n        }\n        this._value[this.key] = newVal\n    }\n\n    orElse(elseValue: any): Optional<any> {\n        let alternative = {};\n        alternative[this.key] = elseValue;\n        return this.isPresent() ? this : new ValueEmbedder(alternative, this.key);\n    }\n\n    orElseLazy(func: () => any): Optional<any> {\n        if (this.isPresent()) {\n            return this;\n        } else {\n            let alternative = {};\n            alternative[this.key] = func();\n            return new ValueEmbedder(alternative, this.key);\n        }\n    }\n\n    /**\n     * helper to override several implementations in a more fluent way\n     * by having a getClass operation we can avoid direct calls into the constructor or\n     * static methods and do not have to implement several methods which rely on the type\n     * of \"this\"\n     * @returns {Monadish.Optional}\n     */\n    protected getClass(): any {\n        return ValueEmbedder;\n    }\n\n    static fromNullable<T>(value?: any, valueKey: string = \"value\"): ValueEmbedder<T> {\n        return new ValueEmbedder(value, valueKey);\n    }\n\n}\n\n\n\n/**\n * specialized value embedder\n * for our Configuration\n */\nclass ConfigEntry<T> extends ValueEmbedder<T> {\n\n    /*default value for absent*/\n    static absent = ConfigEntry.fromNullable(null);\n\n    arrPos: number;\n\n    constructor(rootElem: any, key: any, arrPos?: number) {\n        super(rootElem, key);\n\n        this.arrPos =  arrPos ?? -1;\n    }\n\n    get value() {\n        if (this.key == \"\" && this.arrPos >= 0) {\n            return this._value[this.arrPos];\n        } else if (this.key && this.arrPos >= 0) {\n            return this._value[this.key][this.arrPos];\n        }\n        return this._value[this.key];\n    }\n\n    set value(val: T) {\n        if (this.key == \"\" && this.arrPos >= 0) {\n            this._value[this.arrPos] = val;\n            return;\n        } else if (this.key && this.arrPos >= 0) {\n            this._value[this.key][this.arrPos] = val;\n            return;\n        }\n        this._value[this.key] = val;\n    }\n}\n\n/**\n * Config, basically an optional wrapper for a json structure\n * (not sideeffect free, since we can alter the internal config state\n * without generating a new config), not sure if we should make it sideffect free\n * since this would swallow a lot of performane and ram\n */\nexport class Config extends Optional<any> {\n    constructor(root: any) {\n        super(root);\n    }\n\n    get shallowCopy(): Config {\n        return new Config(Stream.ofAssoc(this.value).collect(new AssocArrayCollector()));\n    }\n\n    get deepCopy(): Config {\n        return new Config(objAssign({}, this.value));\n    }\n\n    static fromNullable<T>(value?: any): Config {\n        return new Config(value);\n    }\n\n    /**\n     * simple merge for the root configs\n     */\n    shallowMerge(other: Config, overwrite = true) {\n        for (let key in other.value) {\n            if (overwrite || !(key in this.value)) {\n                this.assign(key).value = other.getIf(key).value;\n            }\n        }\n    }\n\n    assign(...keys): IValueHolder<any> {\n        if (keys.length < 1) {\n            return;\n        }\n\n        this.buildPath(keys);\n\n        let currKey = this.keyVal(keys[keys.length - 1]);\n        let arrPos = this.arrayIndex(keys[keys.length - 1]);\n        let retVal = new ConfigEntry(keys.length == 1 ? this.value : this.getIf.apply(this, keys.slice(0, keys.length - 1)).value,\n            currKey, arrPos\n        );\n\n        return retVal;\n    }\n\n    assignIf(condition: boolean, ...keys: Array<any>): IValueHolder<any> {\n        return condition ? this.assign(...keys) : {value: null};\n    }\n\n\n    getIf(...keys: Array<string>): Config {\n        return this.getClass().fromNullable(super.getIf.apply(this, keys).value);\n    }\n\n    get(defaultVal: any): Config {\n        return this.getClass().fromNullable(super.get(defaultVal).value);\n    }\n\n    //empties the current config entry\n    delete(key: string): Config {\n        if (key in this.value) {\n            delete this.value[key];\n        }\n        return this;\n    }\n\n    toJson(): any {\n        return JSON.stringify(this.value);\n    }\n\n    protected getClass(): any {\n        return Config;\n    }\n\n    private setVal(val: any) {\n        this._value = val;\n    }\n\n    private buildPath(keys: Array<any>): Config {\n        let val = this;\n        let parentVal = this.getClass().fromNullable(null);\n        let parentPos = -1;\n        let alloc = function (arr: Array<any>, length: number) {\n            let length1 = arr.length;\n            let length2 = length1 + length;\n            for(let cnt = length1; cnt < length2; cnt++) {\n                arr.push({});\n            }\n        };\n\n        for (let cnt = 0; cnt < keys.length; cnt++) {\n            let currKey = this.keyVal(keys[cnt]);\n            let arrPos = this.arrayIndex(keys[cnt]);\n\n            if (currKey === \"\" && arrPos >= 0) {\n\n                val.setVal((val.value instanceof Array) ? val.value : []);\n                alloc(val.value, arrPos + 1);\n                if (parentPos >= 0) {\n                    parentVal.value[parentPos] = val.value;\n                }\n                parentVal = val;\n                parentPos = arrPos;\n                val = this.getClass().fromNullable(val.value[arrPos]);\n                continue;\n            }\n\n            let tempVal = <Config>val.getIf(currKey);\n            if (arrPos == -1) {\n                if (tempVal.isAbsent()) {\n                    tempVal = <Config>this.getClass().fromNullable(val.value[currKey] = {});\n                } else {\n                    val = <any>tempVal;\n                }\n            } else {\n                let arr = (tempVal.value instanceof Array) ? tempVal.value : [];\n                alloc(arr, arrPos + 1);\n                val.value[currKey] = arr;\n                tempVal = this.getClass().fromNullable(arr[arrPos]);\n            }\n            parentVal = val;\n            parentPos = arrPos;\n            val = <any>tempVal;\n        }\n\n        return this;\n    }\n}\n\n\n","/* Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {Stream, StreamMapper} from \"./Stream\";\nimport {DomQuery} from \"./DomQuery\";\n\n/**\n * Every data source wich feeds data into the lazy stream\n * or stream generally must implement this interface\n *\n * It is basically an iteratable to the core\n */\nexport interface IStreamDataSource<T> {\n\n    /**\n     * @returns true if additional data is present\n     */\n    hasNext(): boolean;\n\n    /**\n     * false if not\n     */\n    next(): T;\n\n    /**\n     * resets the position to the beginning\n     */\n    reset(): void;\n}\n\n/**\n * A collector, needs to be implemented\n */\nexport interface ICollector<T, S> {\n    /**\n     * this method basically takes a single stream element\n     * and does something with it (collecting it one way or the other\n     * in most cases)\n     *\n     * @param element\n     */\n    collect(element: T);\n\n    /**\n     * the final result after all the collecting is done\n     */\n    finalValue: S;\n}\n\n/**\n * implementation of iteratable on top of array\n */\nexport class ArrayStreamDataSource<T> implements IStreamDataSource<T> {\n    value: Array<T>;\n    dataPos = -1;\n\n    constructor(...value: Array<T>) {\n        this.value = value;\n    }\n\n    hasNext(): boolean {\n        return this.value.length - 1 > this.dataPos;\n    }\n\n    next(): T {\n        this.dataPos++;\n        return this.value[this.dataPos];\n    }\n\n    reset() {\n        this.dataPos = -1;\n    }\n}\n\n/**\n * an intermediate data source wich prefilters\n * incoming stream data\n * and lets only the data out which\n * passes the filter function check\n */\nexport class FilteredStreamDatasource<T> implements IStreamDataSource<T> {\n\n    filterFunc: (T) => boolean;\n    inputDataSource: IStreamDataSource<T>;\n\n    filteredNext: T = null;\n\n    constructor(filterFunc: (T) => boolean, parent: IStreamDataSource<T>) {\n        this.filterFunc = filterFunc;\n        this.inputDataSource = parent;\n    }\n\n    /**\n     * in order to filter we have to make a look ahead until the\n     * first next allowed element\n     * hence we prefetch the element and then\n     * serve it via next\n     */\n    hasNext(): boolean {\n        while (this.filteredNext == null && this.inputDataSource.hasNext()) {\n            let next: T = <T>this.inputDataSource.next();\n            if (this.filterFunc(next)) {\n                this.filteredNext = next;\n                return true;\n            } else {\n                this.filteredNext = null;\n            }\n        }\n        return this.filteredNext != null;\n\n    }\n\n    /**\n     * serve the next element\n     */\n    next(): T {\n        let ret = this.filteredNext;\n        this.filteredNext = null;\n        //We have to call hasNext, to roll another\n        //prefetch in case someone runs next\n        //sequentially without calling hasNext\n        this.hasNext();\n        return ret;\n    }\n\n    reset(): void {\n        this.filteredNext = null;\n        this.inputDataSource.reset();\n    }\n}\n\n/**\n * an intermediate datasource which maps the items from\n * one into another\n */\nexport class MappedStreamDataSource<T, S> implements IStreamDataSource<S> {\n\n    mapFunc: (T) => S;\n    inputDataSource: IStreamDataSource<T>;\n\n    constructor(mapFunc: (T) => S, parent: IStreamDataSource<T>) {\n        this.mapFunc = mapFunc;\n        this.inputDataSource = parent;\n    }\n\n    hasNext(): boolean {\n        return this.inputDataSource.hasNext();\n    }\n\n    next(): S {\n        return this.mapFunc(this.inputDataSource.next());\n    }\n\n    reset(): void {\n        this.inputDataSource.reset();\n    }\n}\n\n/**\n * Same for flatmap to deal with element -> stream mappings\n */\nexport class FlatMapStreamDataSource<T, S> implements IStreamDataSource<S> {\n\n    mapFunc: StreamMapper<T>;\n\n    inputDataSource: IStreamDataSource<T>;\n\n    /**\n     * the currently active stream\n     * coming from an incoming element\n     * once the end of this one is reached\n     * it is swapped out by another one\n     * from the next element\n     */\n    activeDataSource: IStreamDataSource<S>;\n\n    constructor(func: StreamMapper<T>, parent: IStreamDataSource<T>) {\n        this.mapFunc = func;\n        this.inputDataSource = parent;\n    }\n\n    hasNext(): boolean {\n        return this.resolveCurrentNext() || this.resolveNextNext();\n    }\n\n    private resolveCurrentNext() {\n        let next = false;\n        if (this.activeDataSource) {\n            next = this.activeDataSource.hasNext();\n        }\n        return next;\n    }\n\n    private resolveNextNext() {\n        let next = false;\n        while (!next && this.inputDataSource.hasNext()) {\n            let mapped =  this.mapFunc(this.inputDataSource.next());\n            if(Array.isArray(mapped)) {\n                this.activeDataSource = new ArrayStreamDataSource(...mapped);\n            } else {\n                this.activeDataSource = mapped;\n            }\n            next = this.activeDataSource.hasNext();\n        }\n        return next;\n    }\n\n    next(): S {\n        return this.activeDataSource.next();\n    }\n\n    reset(): void {\n        this.inputDataSource.reset();\n    }\n}\n\n/**\n * For the time being we only need one collector\n * a collector which collects a stream back into arrays\n */\nexport class ArrayCollector<S> implements ICollector<S, Array<S>> {\n    private data: Array<S> = [];\n\n    collect(element: S) {\n        this.data.push(element);\n    }\n\n    get finalValue(): Array<S> {\n        return this.data;\n    }\n}\n\n/**\n * collects an assoc stream back to an assoc array\n */\nexport class AssocArrayCollector<S> implements ICollector<[string, S] | string, {[key:string]:S}> {\n\n    finalValue: {[key:string]:any} = {};\n\n    collect(element: [string, S] | string) {\n        this.finalValue[element[0] ?? <string>element] = element[1] ?? true;\n    }\n}\n\n/**\n * Form data collector for key value pair streams\n */\nexport class FormDataCollector implements ICollector<{ key: string, value: any }, FormData> {\n    finalValue: FormData = new FormData();\n\n    collect(element: { key: string; value: any }) {\n        this.finalValue.append(element.key, element.value);\n    }\n}\n\n/**\n * Form data collector for DomQuery streams\n */\nexport class QueryFormDataCollector implements ICollector<DomQuery, FormData> {\n    finalValue: FormData = new FormData();\n\n    collect(element: DomQuery) {\n        let toMerge = element.encodeFormElement();\n        if (toMerge.isPresent()) {\n            this.finalValue.append(element.name.value, toMerge.get(element.name).value);\n        }\n    }\n}\n\n/**\n * Encoded String collector from dom query streams\n */\nexport class QueryFormStringCollector implements ICollector<DomQuery, string> {\n\n    formData: [[string, string]] = <any>[];\n\n    collect(element: DomQuery) {\n        let toMerge = element.encodeFormElement();\n        if (toMerge.isPresent()) {\n            this.formData.push([element.name.value, toMerge.get(element.name).value]);\n        }\n    }\n\n    get finalValue(): string {\n        return Stream.of(...this.formData)\n            .map<string>(keyVal => keyVal.join(\"=\"))\n            .reduce((item1, item2) => [item1, item2].join(\"&\"))\n            .orElse(\"\").value;\n    }\n}","/* Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * A small stream implementation\n */\nimport {IMonad, IValueHolder, Optional} from \"./Monad\";\nimport {\n    ArrayCollector,\n    ArrayStreamDataSource,\n    FilteredStreamDatasource, FlatMapStreamDataSource,\n    ICollector,\n    IStreamDataSource,\n    MappedStreamDataSource\n} from \"./SourcesCollectors\";\n\n/*\n * some typedefs to make the code more reabable\n */\nexport type StreamMapper<T> = (data: T) => IStreamDataSource<any>;\nexport type ArrayMapper<T> = (data: T) => Array<any>;\nexport type IteratableConsumer<T> = (data: T, pos ?: number) => void | boolean;\nexport type Reducable<T> = (val1: T, val2: T) => T;\nexport type Matchable<T> = (data: T) => boolean;\nexport type Mappable<T, R> = (data: T) => R;\nexport type Comparator<T> = (el1: T, el2: T) => number;\n\n/**\n * Generic interface defining a stream\n */\nexport interface IStream<T> {\n    /**\n     * Perform the operation fn on a single element in the stream at a time\n     * then pass the stream over for further processing\n     * This is basically an intermediate point in the stream\n     * with further processing happening later, do not use\n     * this method to gather data or iterate over all date for processing\n     * (for the second case each has to be used)\n     *\n     * @param fn the processing function, if it returns false, further processing is stopped\n     */\n    onElem(fn: IteratableConsumer<T>): IStream<T>;\n\n    /**\n     * Iterate over all elements in the stream and do some processing via fn\n     *\n     * @param fn takes a single element and if it returns false\n     * then further processing is stopped\n     */\n    each(fn: IteratableConsumer<T>): void;\n\n    /**\n     * maps a single element into another via fn\n     * @param fn function which takes one element in and returns another\n     */\n    map<R>(fn?: Mappable<T, R>): IStream<R>;\n\n    /**\n     * Takes an element in and returns a set of something\n     * the set then is flatted into a single stream to be further processed\n     *\n     * @param fn\n     */\n    flatMap<R>(fn?: StreamMapper<T> | ArrayMapper<T>): IStream<R>;\n\n    /**\n     * filtering, takes an element in and is processed by fn.\n     * If it returns false then further processing on this element is skipped\n     * if it returns true it is passed down the chain.\n     *\n     * @param fn\n     */\n    filter(fn?: Matchable<T>): IStream<T>;\n\n    /**\n     * functional reduce... takes two elements in the stream and reduces to\n     * one from left to right\n     *\n     * @param fn the reduction function for instance (val1,val2) => val1l+val2\n     * @param startVal an optional starting value, if provided the the processing starts with this element\n     * and further goes down into the stream, if not, then the first two elements are taken as reduction starting point\n     */\n    reduce(fn: Reducable<T>, startVal: T): Optional<T>;\n\n    /**\n     * returns the first element in the stream is given as Optional\n     */\n    first(): Optional<T>;\n\n    /**\n     * Returns the last stream element (note in endless streams without filtering and limiting you will never reach that\n     * point hence producing an endless loop)\n     */\n    last(): Optional<T>;\n\n    /**\n     * returns true if there is at least one element where a call fn(element) produces true\n     *\n     * @param fn\n     */\n    anyMatch(fn: Matchable<T>): boolean;\n\n    /**\n     * returns true if all elmements produce true on a call to fn(element)\n     *\n     * @param fn\n     */\n    allMatch(fn: Matchable<T>): boolean;\n\n    /**\n     * returns true if no elmements produce true on a call to fn(element)\n     *\n     * @param fn\n     */\n    noneMatch(fn: Matchable<T>): boolean;\n\n    /**\n     * Collect the elements with a collector given\n     * There are a number of collectors provided\n     *\n     * @param collector\n     */\n    collect(collector: ICollector<T, any>): any;\n\n    /**\n     * sort on the stream, this is a special case\n     * of an endpoint, so your data which is fed in needs\n     * to be limited otherwise it will fail\n     * it still returns a stream for further processing\n     *\n     * @param comparator\n     */\n    sort(comparator: Comparator<T>): IStream<T>;\n\n    /**\n     * Limits the stream to a certain number of elements\n     *\n     * @param end the limit of the stream\n     */\n    limits(end: number): IStream<T>;\n\n    /**\n     * returns the stream collected into an array (90% use-case abbreviation\n     */\n    value: Array<T>;\n}\n\n/**\n * A simple typescript based reimplementation of streams\n *\n * This is the early eval version\n * for a lazy eval version check, LazyStream, which is api compatible\n * to this implementation, however with the benefit of being able\n * to provide infinite data sources and generic data providers, the downside\n * is, it might be a tad slower in some situations\n */\nexport class Stream<T> implements IMonad<T, Stream<any>>, IValueHolder<Array<T>>, IStream<T> {\n\n    value: Array<T>;\n    _limits = -1;\n\n    private pos = -1;\n\n    constructor(...value: T[]) {\n        this.value = value;\n    }\n\n    static of<T>(...data: Array<T>): Stream<T> {\n        return new Stream<T>(...data);\n    }\n\n    static ofAssoc<T>(data: {[key: string]: T}): Stream<[string, T]> {\n        return this.of(...Object.keys(data)).map(key => [key, data[key]]);\n    }\n\n    static ofDataSource<T>(dataSource: IStreamDataSource<T>) {\n        let value: T[] = [];\n        while (dataSource.hasNext()) {\n            value.push(dataSource.next());\n        }\n\n        return new Stream(...value);\n    }\n\n    limits(end: number): Stream<T> {\n        this._limits = end;\n        return this;\n    }\n\n    onElem(fn: (data: T, pos ?: number) => void | boolean): Stream<T> {\n        for (let cnt = 0; cnt < this.value.length && (this._limits == -1 || cnt < this._limits); cnt++) {\n            if (fn(this.value[cnt], cnt) === false) {\n                break;\n            }\n        }\n        return this;\n    }\n\n    each(fn: (data: T, pos ?: number) => void | boolean) {\n        this.onElem(fn);\n    }\n\n    map<R>(fn?: (data: T) => R): Stream<R> {\n        if (!fn) {\n            fn = (inval: any) => <R>inval;\n        }\n        let res: R[] = [];\n        this.each((item, cnt) => {\n            res.push(fn(item))\n        });\n\n        return new Stream<R>(...res);\n    }\n\n    /*\n     * we need to implement it to fullfill the contract, although it is used only internally\n     * all values are flattened when accessed anyway, so there is no need to call this methiod\n     */\n\n    flatMap<IStreamDataSource>(fn: (data: T) => IStreamDataSource | Array<any>): Stream<any> {\n        let ret = [];\n        this.each(item => {\n            let strmR: any = fn(item);\n            ret = Array.isArray(strmR) ? ret.concat(strmR) : ret.concat(...strmR.value);\n        });\n        return <Stream<any>>Stream.of(...ret);\n    }\n\n    filter(fn?: (data: T) => boolean): Stream<T> {\n        let res: Array<T> = [];\n        this.each((data) => {\n            if (fn(data)) {\n                res.push(data);\n            }\n        });\n        return new Stream<T>(...res);\n    }\n\n    reduce(fn: Reducable<T>, startVal: T = null): Optional<T> {\n        let offset = startVal != null ? 0 : 1;\n        let val1 = startVal != null ? startVal : this.value.length ? this.value[0] : null;\n\n        for (let cnt = offset; cnt < this.value.length && (this._limits == -1 || cnt < this._limits); cnt++) {\n            val1 = fn(val1, this.value[cnt]);\n        }\n        return Optional.fromNullable(val1);\n    }\n\n    first(): Optional<T> {\n        return this.value && this.value.length ? Optional.fromNullable(this.value[0]) : Optional.absent;\n    }\n\n    last(): Optional<T> {\n        //could be done via reduce, but is faster this way\n        let length = this._limits > 0 ? Math.min(this._limits, this.value.length) : this.value.length;\n\n        return Optional.fromNullable(length ? this.value[length - 1] : null);\n    }\n\n    anyMatch(fn: Matchable<T>): boolean {\n        for (let cnt = 0; cnt < this.value.length && (this._limits == -1 || cnt < this._limits); cnt++) {\n            if (fn(this.value[cnt])) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    allMatch(fn: Matchable<T>): boolean {\n        if (!this.value.length) {\n            return false;\n        }\n        let matches = 0;\n        for (let cnt = 0; cnt < this.value.length; cnt++) {\n            if (fn(this.value[cnt])) {\n                matches++;\n            }\n        }\n        return matches == this.value.length;\n    }\n\n    noneMatch(fn: Matchable<T>): boolean {\n        let matches = 0;\n        for (let cnt = 0; cnt < this.value.length; cnt++) {\n            if (!fn(this.value[cnt])) {\n                matches++;\n            }\n        }\n        return matches == this.value.length;\n    }\n\n    sort(comparator: Comparator<T>): IStream<T> {\n        let newArr = this.value.slice().sort(comparator);\n        return Stream.of(...newArr);\n    }\n\n\n    collect(collector: ICollector<T, any>): any {\n        this.each(data => collector.collect(data));\n        return collector.finalValue;\n    }\n\n    //-- internally exposed methods needed for the interconnectivity\n    hasNext() {\n        let isLimitsReached = this._limits != -1 && this.pos >= this._limits - 1;\n        let isEndOfArray = this.pos >= this.value.length - 1;\n        return !(isLimitsReached || isEndOfArray);\n    }\n\n    next(): T {\n        if (!this.hasNext()) {\n            return null;\n        }\n        this.pos++;\n        return this.value[this.pos];\n    }\n\n    reset() {\n        this.pos = -1;\n    }\n\n}\n\n/**\n * Lazy implementation of a Stream\n * The idea is to connect the intermediate\n * streams as datasources like a linked list\n * with reverse referencing and for special\n * operations like filtering flatmapping\n * have intermediate datasources in the list\n * with specialized functions.\n *\n * Sort of a modified pipe valve pattern\n * the streams are the pipes the intermediate\n * data sources are the valves\n *\n * We then can use passed in functions to control\n * the flow in the valves\n *\n * That way we can have a lazy evaluating stream\n *\n * So if an endpoint requests data\n * a callback trace goes back the stream list\n * which triggers an operation upwards\n * which sends data down the drain which then is processed\n * and filtered until one element hits the endpoint.\n *\n * That is repeated, until all elements are processed\n * or an internal limit is hit.\n *\n */\nexport class LazyStream<T> implements IStreamDataSource<T>, IStream<T>, IMonad<T, LazyStream<any>> {\n\n    protected dataSource: IStreamDataSource<T>;\n    _limits = -1;\n\n    /*\n     * needed to have the limits check working\n     * we need to keep track of the current position\n     * in the stream\n     */\n    pos = -1;\n\n    static of<T>(...values: Array<T>): LazyStream<T> {\n        return new LazyStream<T>(new ArrayStreamDataSource(...values));\n    }\n\n    static ofAssoc<T>(data: {[key: string]: T}): LazyStream<[string, T]> {\n        return this.of(...Object.keys(data)).map(key => [key, data[key]]);\n    }\n\n    static ofStreamDataSource<T>(value: IStreamDataSource<T>): LazyStream<T> {\n        return new LazyStream(value);\n    }\n\n    constructor(parent: IStreamDataSource<T>) {\n        this.dataSource = parent;\n\n    }\n\n    hasNext(): boolean {\n        if (this.isOverLimits()) {\n            return false;\n        }\n\n        return this.dataSource.hasNext();\n    }\n\n    next(): T {\n        let next = this.dataSource.next();\n        // @ts-ignore\n        this.pos++;\n        return next;\n    }\n\n    reset(): void {\n        this.dataSource.reset();\n        this.pos = 0;\n        this._limits = -1;\n    }\n\n    nextFilter(fn: Matchable<T>): T {\n        if (this.hasNext()) {\n            let newVal: T = this.next();\n            if (!fn(newVal)) {\n                return this.nextFilter(fn);\n            }\n            return <T>newVal;\n        }\n        return null;\n    }\n\n    limits(max: number): LazyStream<T> {\n        this._limits = max;\n        return this;\n    }\n\n    //main stream methods\n    collect(collector: ICollector<T, any>): any {\n        while (this.hasNext()) {\n            let t = this.next();\n            collector.collect(<T>t);\n        }\n        return collector.finalValue;\n    }\n\n    onElem(fn: IteratableConsumer<T>): LazyStream<T> {\n        return new LazyStream(new MappedStreamDataSource((el) => {\n            if (fn(el, this.pos) === false) {\n                this.stop();\n            }\n            return el;\n        }, this));\n    }\n\n    filter(fn: Matchable<T>): LazyStream<T> {\n        return <LazyStream<T>>new LazyStream<T>(new FilteredStreamDatasource<any>(fn, this));\n    }\n\n    map<R>(fn: Mappable<T, R>): LazyStream<any> {\n        return new LazyStream(new MappedStreamDataSource(fn, this));\n    }\n\n    flatMap<StreamMapper>(fn: StreamMapper | ArrayMapper<any>): LazyStream<any> {\n\n        return new LazyStream<any>(new FlatMapStreamDataSource(<any>fn, this));\n    }\n\n    //endpoint\n    each(fn: IteratableConsumer<T>) {\n        while (this.hasNext()) {\n            if (fn(this.next()) === false) {\n                this.stop();\n            }\n        }\n    }\n\n    reduce(fn: Reducable<T>, startVal: T = null): Optional<T> {\n        if (!this.hasNext()) {\n            return Optional.absent;\n        }\n        let value1 = null;\n        let value2 = null;\n        if (startVal != null) {\n            value1 = startVal;\n            value2 = this.next();\n        } else {\n            value1 = this.next();\n            if (!this.hasNext()) {\n                return Optional.fromNullable(value1);\n            }\n            value2 = this.next();\n        }\n        value1 = fn(value1, value2);\n        while (this.hasNext()) {\n            value2 = this.next();\n            value1 = fn(value1, value2);\n        }\n\n        return Optional.fromNullable(value1);\n    }\n\n    last(): Optional<T> {\n        if (!this.hasNext()) {\n            return Optional.absent;\n        }\n        return this.reduce((el1, el2) => el2);\n    }\n\n    first(): Optional<T> {\n        this.reset();\n        if (!this.hasNext()) {\n            return Optional.absent;\n        }\n        return Optional.fromNullable(this.next());\n    }\n\n    anyMatch(fn: Matchable<T>): boolean {\n        while (this.hasNext()) {\n            if (fn(this.next())) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    allMatch(fn: Matchable<T>): boolean {\n        while (this.hasNext()) {\n            if (!fn(this.next())) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    noneMatch(fn: Matchable<T>): boolean {\n        while (this.hasNext()) {\n            if (fn(this.next())) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    sort(comparator: Comparator<T>): IStream<T> {\n        let arr = this.collect(new ArrayCollector());\n        arr = arr.sort(comparator);\n        return LazyStream.of(...arr);\n    }\n\n    get value(): Array<T> {\n        return this.collect(new ArrayCollector<T>());\n    }\n\n    private stop() {\n        this.pos = this._limits + 1000000000;\n    }\n\n    private isOverLimits() {\n        return this._limits != -1 && this.pos >= this._limits - 1;\n    }\n\n}\n\n\n","/* Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {Lang} from \"./Lang\";\nimport {DomQuery} from \"./DomQuery\";\nimport isString = Lang.isString;\n\ndeclare let ActiveXObject: any;\n\n/**\n * xml query as specialized case for DomQuery\n */\nexport class XMLQuery extends DomQuery {\n\n    constructor(rootNode: Document | string | DomQuery, docType: SupportedType = \"text/xml\") {\n\n\n        let createIe11DomQueryShim = (): DOMParser => {\n            //at the time if wroting ie11 is the only relevant browser\n            //left withut any DomQuery support\n            let parser = new ActiveXObject(\"Microsoft.XMLDOM\");\n            parser.async = false;\n            //we shim th dom parser from ie in\n            return <any> {\n                parseFromString: (text: string, contentType: string): Document => {\n                    return parser.loadXML(text);\n                }\n            }\n        };\n\n        let parseXML = (xml: string): Document => {\n            if(xml == null) {\n                return null;\n            }\n            let domParser: DOMParser = Lang.saveResolveLazy<DOMParser>(\n                () => new window.DOMParser(),\n                (): DOMParser =>  createIe11DomQueryShim()\n            ).value;\n            return domParser.parseFromString(xml, docType);\n        };\n\n        if(isString(rootNode)) {\n            super(parseXML(<string>rootNode))\n        } else {\n            super(rootNode);\n        }\n    }\n\n\n    isXMLParserError(): boolean {\n        return this.querySelectorAll(\"parsererror\").isPresent();\n    }\n\n\n\n    toString(): string {\n        let ret = [];\n        this.eachElem((node: any) => {\n            let serialized = (<any>window)?.XMLSerializer?.constructor()?.serializeToString(node) ?? node?.xml;\n            if(!!serialized) {\n                ret.push(serialized);\n            }\n        });\n        return ret.join(\"\");\n    }\n\n\n    parserErrorText(joinstr: string): string {\n        return this.querySelectorAll(\"parsererror\").textContent(joinstr);\n    }\n\n    static parseXML(txt: string): XMLQuery {\n        return new  XMLQuery(txt);\n    }\n    static parseHTML(txt: string): XMLQuery {\n        return new  XMLQuery(txt, \"text/html\");\n    }\n\n    static fromString(txt: string, parseType: SupportedType = \"text/xml\"): XMLQuery {\n        return new  XMLQuery(txt,parseType);\n    }\n}\n\nexport const XQ = XMLQuery;\nexport type XQ = XMLQuery;","export {DomQuery, ElementAttribute, DomQueryCollector, DQ} from \"./DomQuery\";\nexport {Lang} from \"./Lang\";\nexport {Config, Monad, IValueHolder, IFunctor, IMonad, IIdentity, Optional, ValueEmbedder} from \"./Monad\";\nexport {XMLQuery, XQ} from \"./XmlQuery\";\nexport {Stream, LazyStream, IteratableConsumer, IStream} from \"./Stream\";\nexport {\n    ArrayStreamDataSource,\n    MappedStreamDataSource,\n    FilteredStreamDatasource,\n    FlatMapStreamDataSource,\n    QueryFormStringCollector,\n    IStreamDataSource,\n    ICollector,\n    ArrayCollector,\n    AssocArrayCollector,\n    FormDataCollector,\n    QueryFormDataCollector\n} from \"./SourcesCollectors\";\n\n\n","/* Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as myfacesConfig from \"../api/Myfaces\";\n\nimport {IListener} from \"./util/ListenerQueue\";\nimport {Response} from \"./xhrCore/Response\";\nimport {XhrRequest} from \"./xhrCore/XhrRequest\";\nimport {AsynchronouseQueue} from \"./util/AsyncQueue\";\nimport {AssocArrayCollector, Config, DQ, Lang, Optional, Stream} from \"../ext/monadish\";\nimport {Assertions} from \"./util/Assertions\";\nimport {XhrFormData} from \"./xhrCore/XhrFormData\";\nimport {ExtDomquery} from \"./util/ExtDomQuery\";\nimport {ErrorData} from \"./xhrCore/ErrorData\";\nimport {EventData} from \"./xhrCore/EventData\";\nimport {ExtLang} from \"./util/Lang\";\nimport {\n    CTX_PARAM_EXECUTE,\n    CTX_PARAM_PASS_THR,\n    CTX_PARAM_SRC_CTL_ID,\n    CTX_PARAM_SRC_FRM_ID,\n    CTX_PARAM_TR_TYPE,\n    IDENT_ALL,\n    IDENT_FORM,\n    IDENT_NONE,\n    IDENT_THIS,\n    MYFACES,\n    ON_ERROR,\n    ON_EVENT,\n    P_AJAX,\n    P_CLIENT_WINDOW,\n    P_EVT,\n    P_EXECUTE,\n    P_PARTIAL_SOURCE,\n    P_RENDER,\n    P_RESET_VALUES,\n    P_WINDOW_ID,\n    RENDER,\n    REQ_TYPE_POST,\n    SOURCE,\n    TAG_FORM\n} from \"./core/Const\";\nimport {\n    resolveDefaults,\n    resolveDelay,\n    resolveForm,\n    resolveTimeout\n} from \"./xhrCore/RequestDataResolver\";\n\ndeclare var jsf: any;\n\n/*\n * allowed project stages\n */\nenum ProjectStages {\n    Production = \"Production\",\n    Development = \"Development\",\n    SystemTest = \"SystemTest\",\n    UnitTest = \"UnitTest\"\n}\n\n/*\n *   blockfilter for the passthrough filtering; the attributes given here\n *   will not be transmitted from the options into the passthrough\n */\nenum BlockFilter {\n    onerror = \"onerror\",\n    onevent = \"onevent\",\n    render = \"render\",\n    execute = \"execute\",\n    myfaces = \"myfaces\",\n    delay = \"delay\",\n    timeout = \"timeout\",\n    windowId = \"windowId\"\n}\n\n/**\n * Core Implementation\n * to distinct between api and impl\n *\n * The original idea was to make the implementation pluggable\n * but this is pointless, you always can overwrite the thin api layer\n * however a dedicated api makes sense for readability reasons\n */\nexport module Implementation {\n\n    import trim = Lang.trim;\n    import getMessage = ExtLang.getMessage;\n    import getGlobalConfig = ExtLang.getGlobalConfig;\n    import assert = Assertions.assert;\n\n    let globalConfig = myfacesConfig.myfaces.config;\n\n    let projectStage: string = null;\n    let separator: string = null;\n    let eventQueue = [];\n    let errorQueue = [];\n    export let requestQueue: AsynchronouseQueue<XhrRequest> = null;\n    /*error reporting threshold*/\n    let threshold = \"ERROR\";\n\n    /**\n     * fetches the separator char from the given script tags\n     *\n     * @return {char} the separator char for the given script tags\n     */\n    export function getSeparatorChar(): string {\n        return this?.globalConfig?.separator ??\n            this?.separator ??\n            (separator = ExtDomquery.searchJsfJsFor(/separator=([^&;]*)/).orElse(\":\").value);\n    }\n\n    /**\n     * this is for testing purposes only, since AjaxImpl is a module\n     * we need to reset for every unit test its internal states\n     */\n    export function reset() {\n        globalConfig = myfacesConfig.myfaces.config;\n\n        projectStage = null;\n        separator = null;\n        eventQueue = [];\n        errorQueue = [];\n        requestQueue = null;\n    }\n\n    /**\n     * @return the project stage also emitted by the server:\n     * it cannot be cached and must be delivered over the server\n     * The value for it comes from the requestInternal parameter of the jsf.js script called \"stage\".\n     */\n    export function getProjectStage(): string | null {\n        return this?.globalConfig?.projectStage ??\n            this?.projectStage ??\n            (projectStage = resolveProjectStateFromURL());\n    }\n\n    /**\n     * resolves the project stage as url parameter\n     * @return the project stage or null\n     */\n    export function resolveProjectStateFromURL(): string | null {\n\n        /* run through all script tags and try to find the one that includes jsf.js */\n        let foundStage = <string>ExtDomquery.searchJsfJsFor(/stage=([^&;]*)/).value;\n        return (foundStage in ProjectStages) ? foundStage : null;\n    }\n\n    /**\n     * implementation of the jsf.util.chain functionality\n     *\n     * @param source\n     * @param event\n     * @param funcs\n     */\n    export function chain(source: any, event: Event, ...funcs: EvalFuncs): boolean {\n\n        let ret = true;\n        let resolveAndExecute = function (func: Function | string) {\n            if (\"string\" != typeof func) {\n                //function is passed down as chain parameter, can be executed as is\n                return (ret = ret && ((<Function>func).call(source, event) !== false));\n            } else {\n                //either a function or a string can be passed in case of a string we have to wrap it into another function\n                //it it is not a plain executable code but a definition\n                let sourceCode = trim(<string>func);\n                if (sourceCode.indexOf(\"function \") == 0) {\n                    sourceCode = `return ${sourceCode} (event)`;\n                }\n                return (ret = ret && (new Function(\"event\", sourceCode).call(source, event) !== false));\n            }\n        };\n\n        //we can use our stream each functionality to run our chain here..\n        //the no return value == false stop stream functionality is handled by our resolveAndExecute\n        <any>Stream.of(...funcs).each(func => resolveAndExecute(func));\n        return ret;\n    }\n\n    /**\n     * this function has to send the ajax requests\n     *\n     * following request conditions must be met:\n     * <ul>\n     *  <li> the request must be sent asynchronously! </li>\n     *  <li> the request must be a POST!!! request </li>\n     *  <li> the request url must be the form action attribute </li>\n     *  <li> all requests must be queued with a client side request queue to ensure the request ordering!</li>\n     * </ul>\n     *\n     * @param el any dom element no matter being it html or jsf, from which the event is emitted\n     * @param event any javascript event supported by that object\n     * @param opts  map of options being pushed into the ajax cycle\n     *\n     * a) transformArguments out of the function\n     * b) passThrough handling with a map copy with a filter map block map\n     */\n    export function request(el: ElemDef, event?: Event, opts ?: Options) {\n\n        const {\n            resolvedEvent,\n            options,\n            elem,\n            elementId,\n            requestCtx,\n            internalCtx,\n            windowId,\n            isResetValues\n        } = resolveDefaults(event, opts, el);\n\n        Assertions.assertRequestIntegrity(options, elem);\n\n        requestCtx.assignIf(!!windowId, P_WINDOW_ID).value = windowId;\n\n        requestCtx.assign(CTX_PARAM_PASS_THR).value = filterPassthroughValues(options.value);\n\n        requestCtx.assignIf(!!resolvedEvent, CTX_PARAM_PASS_THR, P_EVT).value = resolvedEvent?.type;\n\n        /**\n         * ajax pass through context with the source\n         * onresolvedEvent and onerror\n         */\n        requestCtx.assign(SOURCE).value = elementId.value;\n\n        /**\n         * on resolvedEvent and onError...\n         * those values will be traversed later on\n         * also into the response context\n         */\n        requestCtx.assign(ON_EVENT).value = options.value?.onevent;\n        requestCtx.assign(ON_ERROR).value = options.value?.onerror;\n\n        /**\n         * lets drag the myfaces config params also in\n         */\n        requestCtx.assign(MYFACES).value = options.value?.myfaces;\n        /**\n         * fetch the parent form\n         *\n         * note we also add an override possibility here\n         * so that people can use dummy forms and work\n         * with detached objects\n         */\n        let form: DQ = resolveForm(requestCtx, elem, resolvedEvent);\n\n        /**\n         * binding contract the javax.faces.source must be set\n         */\n        requestCtx.assign(CTX_PARAM_PASS_THR, P_PARTIAL_SOURCE).value = elementId.value;\n\n        /**\n         * javax.faces.partial.ajax must be set to true\n         */\n        requestCtx.assign(CTX_PARAM_PASS_THR, P_AJAX).value = true;\n\n        /**\n         * binding contract the javax.faces.source must be set\n         */\n        requestCtx.assign(CTX_PARAM_PASS_THR, P_PARTIAL_SOURCE).value = elementId.value;\n\n        /**\n         * if resetValues is set to true\n         * then we have to set javax.faces.resetValues as well\n         * as pass through parameter\n         * the value has to be explicitly true, according to\n         * the specs jsdoc\n         */\n        requestCtx.assignIf(isResetValues, CTX_PARAM_PASS_THR, P_RESET_VALUES).value = true;\n\n        //additional meta information to speed things up, note internal non jsf\n        //pass through options are stored under _mfInternal in the context\n        internalCtx.assign(CTX_PARAM_SRC_FRM_ID).value = form.id.value;\n        internalCtx.assign(CTX_PARAM_SRC_CTL_ID).value = elementId.value;\n        internalCtx.assign(CTX_PARAM_TR_TYPE).value = REQ_TYPE_POST;\n\n        //mojarra compatibility, mojarra is sending the form id as well\n        //this is not documented behavior but can be determined by running\n        //mojarra under blackbox conditions\n        //i assume it does the same as our formId_submit=1 so leaving it out\n        //wont hurt but for the sake of compatibility we are going to add it\n\n        requestCtx.assign(CTX_PARAM_PASS_THR, form.id.value).value = form.id.value;\n\n        assignClientWindowId(form, requestCtx);\n\n        assignExecute(options, requestCtx, form, elementId.value);\n        assignRender(options, requestCtx, form, elementId.value);\n\n        let delay: number = resolveDelay(options);\n        let timeout: number = resolveTimeout(options);\n\n        //now we enqueue the request as asynchronous runnable into our request\n        //queue and let the queue take over the rest\n        queueHandler.addRequestToQueue(elem, form, requestCtx, internalCtx, delay, timeout);\n    }\n\n    /**\n     * Spec. 13.3.3\n     * Examining the response markup and updating the DOM tree\n     * @param {XMLHttpRequest} request - the ajax request\n     * @param {Object} context - the ajax context\n     */\n    export function response(request: XMLHttpRequest, context: Context) {\n        Response.processResponse(request, context);\n    }\n\n    /**\n     * adds an error handler to the error queue\n     *\n     * @param errorListener the error listener handler\n     */\n    export function addOnError(errorListener: IListener<ErrorData>) {\n        /*error handling already done in the assert of the queue*/\n        errorQueue.push(errorListener);\n    }\n\n    /**\n     * adds an event handler to the event queue\n     *\n     * @param eventListener the event listener handler\n     */\n    export function addOnEvent(eventListener: IListener<EventData>) {\n        /*error handling already done in the assert of the queue*/\n        eventQueue.push(eventListener);\n    }\n\n    // noinspection JSUnusedLocalSymbols\n    /**\n     * sends an event to the event handlers\n     *\n     * @param data the event data object hosting the event data according to the spec @see EventData for what is reachable\n     * @param localHandler an optional event handler, which is processed before the event handler chain\n     */\n    export function sendEvent(data: EventData, localHandler = function (data: EventData) {\n    }) {\n        /*now we serve the queue as well*/\n        localHandler(data);\n        eventQueue.forEach(fn => fn(data));\n    }\n\n    /**\n     * error handler behavior called internally\n     * and only into the impl it takes care of the\n     * internal message transformation to a myfaces internal error\n     * and then uses the standard send error mechanisms\n     * also a double error logging prevention is done as well\n     *\n     * @param request the request currently being processed\n     * @param context the context affected by this error\n     * @param exception the exception being thrown\n     * @param clearRequestQueue if set to true, clears the request queue of all pending requests\n     */\n    export function stdErrorHandler(request: XMLHttpRequest,\n                                    context: Config,\n                                    exception: any,\n                                    clearRequestQueue = false) {\n        //newer browsers do not allow to hold additional values on native objects like exceptions\n        //we hence capsule it into the request, which is gced automatically\n        //on ie as well, since the stdErrorHandler usually is called between requests\n        //this is a valid approach\n        try {\n            if (threshold == \"ERROR\") {\n                let errorData = ErrorData.fromClient(exception);\n                sendError(errorData);\n            }\n        } finally {\n            if (clearRequestQueue) {\n                requestQueue.cleanup();\n            }\n        }\n    }\n\n    // noinspection JSUnusedLocalSymbols\n    /**\n     * implementation triggering the error chain\n     *\n     *\n     *\n     *  handles the errors, in case of an onError exists within the context the onError is called as local error handler\n     *  the registered error handlers in the queue receiv an error message to be dealt with\n     *  and if the projectStage is at development an alert box is displayed\n     *\n     *  note: we have additional functionality here, via the global config myfaces.config.defaultErrorOutput a function can be provided\n     *  which changes the default output behavior from alert to something else\n     *\n     * @param errorData the error data to be displayed\n     * @param localHandler an optional local error handler which has to be processed before the error handler queue\n     */\n    export function sendError(errorData: ErrorData, localHandler = function (data: any) {\n    }) {\n\n        localHandler(errorData);\n        errorQueue.forEach((errorCallback: Function) => {\n            errorCallback(errorData);\n        });\n        let displayError: (string) => void = getGlobalConfig(\"defaultErrorOutput\", (console ? console.error : alert));\n        displayError(errorData);\n    }\n\n    /**\n     * @node optional element or id defining a rootnode where an element with the id \"javax.faces.windowId\" is hosted\n     * @return the client window id of the current window, if one is given if none is found, null is returned\n     */\n    export function getClientWindow(node ?: Element | string): string | null {\n        const ALTERED = \"___mf_id_altered__\";\n        const INIT = \"___init____\";\n\n        /**\n         * the search root for the dom element search\n         */\n        let searchRoot = new DQ(node || document.body);\n\n        /**\n         * lazy helper to fetch the window id from the window url\n         */\n        let fetchWindowIdFromUrl = () => ExtDomquery.searchJsfJsFor(/jfwid=([^&;]*)/).orElse(null).value;\n\n        /**\n         * functional double check based on stream reduction\n         * the values should be identical or on INIT value which is a premise to\n         * skip the first check\n         *\n         * @param value1\n         * @param value2\n         */\n        let doubleCheck = (value1: string, value2: string) => {\n            if (value1 == ALTERED) {\n                return value1;\n            } else if (value1 == INIT) {\n                return value2;\n            } else if (value1 != value2) {\n                return ALTERED;\n            }\n            return value2;\n        };\n\n        /**\n         * helper for cleaner code, maps the value from an item\n         *\n         * @param item\n         */\n        let getValue = (item: DQ) => item.attr(\"value\").value;\n        /**\n         * fetch the window id from the forms\n         * window ids must be present in all forms\n         * or non existent. If they exist all of them must be the same\n         */\n        let formWindowId: Optional<string> = searchRoot.stream.map<string>(getValue).reduce(doubleCheck, INIT);\n\n        //if the resulting window id is set on altered then we have an unresolvable problem\n        assert(formWindowId.value != ALTERED, \"Multiple different windowIds found in document\");\n\n        /**\n         * return the window id or null\n         * prio, forms under node/document and if not given then from the url\n         */\n        return formWindowId.value ?? fetchWindowIdFromUrl();\n    }\n\n    /**\n     * collect and encode data for a given form element (must be of type form)\n     * find the javax.faces.ViewState element and encode its value as well!\n     * @return a concatenated string of the encoded values!\n     *\n     * @throws Error in case of the given element not being of type form!\n     * https://issues.apache.org/jira/browse/MYFACES-2110\n     */\n    export function getViewState(form: Element | string): string {\n        /**\n         *  typecheck assert!, we opt for strong typing here\n         *  because it makes it easier to detect bugs\n         */\n\n        let element: DQ = DQ.byId(form);\n        if (!element.isTag(TAG_FORM)) {\n            throw new Error(getMessage(\"ERR_VIEWSTATE\"));\n        }\n\n        let formData = new XhrFormData(element);\n        return formData.toString();\n    }\n\n    /**\n     * this at the first sight looks like a weird construct, but we need to do it this way\n     * for testing, we cannot proxy addRequestToQueue from the testing frameworks directly\n     * but we need to keep it under unit tests.\n     */\n    export let queueHandler = {\n        /**\n         * public to make it shimmable for tests\n         *\n         * adds a new request to our queue for further processing\n         */\n        addRequestToQueue: function (elem: DQ, form: DQ, reqCtx: Config, respPassThr: Config, delay = 0, timeout = 0) {\n            requestQueue = requestQueue ?? new AsynchronouseQueue<XhrRequest>();\n            requestQueue.enqueue(new XhrRequest(elem, form, reqCtx, respPassThr, [], timeout), delay);\n        }\n    };\n\n    //----------------------------------------------- Methods ---------------------------------------------------------------------\n\n    /**\n     * the idea is to replace some placeholder parameters with their respective values\n     * placeholder params like  @all, @none, @form, @this need to be replaced by\n     * the values defined by the specification\n     *\n     * This function does it for the render parameters\n     *\n     * @param requestOptions the source options coming in as options object from jsf.ajax.request (options parameter)\n     * @param targetContext the receiving target context\n     * @param issuingForm the issuing form\n     * @param sourceElementId the executing element triggering the jsf.ajax.request (id of it)\n     */\n    function assignRender(requestOptions: Config, targetContext: Config, issuingForm: DQ, sourceElementId: string) {\n        if (requestOptions.getIf(RENDER).isPresent()) {\n            remapDefaultConstants(targetContext.getIf(CTX_PARAM_PASS_THR).get({}), P_RENDER, <string>requestOptions.getIf(RENDER).value, issuingForm, <any>sourceElementId);\n        }\n    }\n\n    /**\n     * the idea is to replace some placeholder parameters with their respective values\n     * placeholder params like  @all, @none, @form, @this need to be replaced by\n     * the values defined by the specification\n     *\n     * This function does it for the execute parameters\n     *\n     * @param requestOptions the source options coming in as options object from jsf.ajax.request (options parameter)\n     * @param targetContext the receiving target context\n     * @param issuingForm the issuing form\n     * @param sourceElementId the executing element triggering the jsf.ajax.request (id of it)\n     */\n    function assignExecute(requestOptions: Config, targetContext: Config, issuingForm: DQ, sourceElementId: string) {\n\n        if (requestOptions.getIf(CTX_PARAM_EXECUTE).isPresent()) {\n            /*the options must be a blank delimited list of strings*/\n            /*compliance with Mojarra which automatically adds @this to an execute\n             * the spec rev 2.0a however states, if none is issued nothing at all should be sent down\n             */\n            requestOptions.assign(CTX_PARAM_EXECUTE).value = [requestOptions.getIf(CTX_PARAM_EXECUTE).value, IDENT_THIS].join(\" \");\n            remapDefaultConstants(targetContext.getIf(CTX_PARAM_PASS_THR).get({}), P_EXECUTE, <string>requestOptions.getIf(CTX_PARAM_EXECUTE).value, issuingForm, <any>sourceElementId);\n        } else {\n            targetContext.assign(CTX_PARAM_PASS_THR, P_EXECUTE).value = sourceElementId;\n        }\n    }\n\n    /**\n     * apply the browser tab where the request was originating from\n     *\n     * @param form the form hosting the client window id\n     * @param targetContext the target context receiving the value\n     */\n    function assignClientWindowId(form: DQ, targetContext: Config) {\n        let clientWindow = jsf.getClientWindow(form.getAsElem(0).value);\n        if (clientWindow) {\n            targetContext.assign(CTX_PARAM_PASS_THR, P_CLIENT_WINDOW).value = clientWindow;\n        }\n    }\n\n    /**\n     * transforms the user values to the expected one\n     * with the proper none all form and this handling\n     * (note we also could use a simple string replace but then\n     * we would have had double entries under some circumstances)\n     *\n     * there are several standardized constants which need a special treatment\n     * like @all, @none, @form, @this\n     *\n     * @param targetConfig the target configuration receiving the final values\n     * @param targetKey the target key\n     * @param userValues the passed user values (aka input string which needs to be transformed)\n     * @param issuingForm the form where the issuing element originates\n     * @param issuingElementId the issuing element\n     */\n    function remapDefaultConstants(targetConfig: Config, targetKey: string, userValues: string, issuingForm: DQ, issuingElementId: string): Config {\n        //a cleaner implementation of the transform list method\n\n        let iterValues = (userValues) ? trim(userValues).split(/\\s+/gi) : [];\n        let ret = [];\n        let processed = {};\n\n        //the idea is simply to loop over all values and then replace\n        //their generic values and filter out doubles\n        //this is more readable than the old indexed based solution\n        //and not really slower because we had to build up the index in our old solution\n        //anyway\n        for (let cnt = 0; cnt < iterValues.length; cnt++) {\n            //avoid doubles\n            if (iterValues[cnt] in processed) {\n                continue;\n            }\n            switch (iterValues[cnt]) {\n                //@none no values should be sent\n                case IDENT_NONE:\n                    return targetConfig.delete(targetKey);\n                //@all is a pass through case according to the spec\n                case IDENT_ALL:\n                    targetConfig.assign(targetKey).value = IDENT_ALL;\n                    return targetConfig;\n                //@form pushes the issuing form id into our list\n                case IDENT_FORM:\n                    ret.push(issuingForm.id.value);\n                    processed[issuingForm.id.value] = true;\n                    break;\n                //@this is replaced with the current issuing element id\n                case IDENT_THIS:\n                    if (!(issuingElementId in processed)) {\n                        ret.push(issuingElementId);\n                        processed[issuingElementId] = true;\n                    }\n                    break;\n                default:\n                    ret.push(iterValues[cnt]);\n                    processed[iterValues[cnt]] = true;\n            }\n        }\n        //We now add the target as joined list\n        targetConfig.assign(targetKey).value = ret.join(\" \");\n        return targetConfig;\n    }\n\n    /**\n     * filter the options tiven with a blacklist so that only\n     * the values required for passthough land in the ajax request\n     *\n     * @param mappedOpts the options to be filtered\n     */\n    function filterPassthroughValues(mappedOpts: { [key: string]: any }) {\n        //we now can use the full code reduction given by our stream api\n        //to filter\n        return Stream.ofAssoc(mappedOpts)\n            .filter(item => !(item[0] in BlockFilter))\n            .collect(new AssocArrayCollector());\n    }\n\n}\n","/**\n * Typescript port of the jsf.push part in the myfaces implementation\n */\n\n//TODO still work in progress\n//this is a 1:1 port for the time being\nimport {jsf} from \"../api/Jsf\";\nimport {MAX_RECONNECT_ATTEMPTS, REASON_EXPIRED, RECONNECT_INTERVAL} from \"./core/Const\";\n\n\n/**\n * Implementation class for the push functionality\n */\nexport module PushImpl {\n\n\n\n    const URL_PROTOCOL = window.location.protocol.replace(\"http\", \"ws\") + \"//\";\n\n\n    //we expose the member variables for testing purposes\n    //they are not directly touched outside of tests\n\n    /* socket map by token */\n    export let sockets = {};\n    /* component attributes by clientId */\n    export let components = {};\n    /* client ids by token (share websocket connection) */\n    export let clientIdsByTokens = {};\n\n\n    //needed for testing\n    export function reset() {\n        sockets = {};\n        components = {}\n        clientIdsByTokens = {}\n    }\n\n    /*\n     * Api implementations, exposed functions\n     */\n\n    /**\n     *\n     * @param {function} onopen The function to be invoked when the web socket is opened.\n     * @param {function} onmessage The function to be invoked when a message is received.\n     * @param {function} onclose The function to be invoked when the web socket is closed.\n     * @param {boolean} autoconnect Whether or not to immediately open the socket. Defaults to <code>false</code>.\n     */\n    export function init(socketClientId: string,\n                         uri: string,\n                         channel: string,\n                         onopen: Function,\n                         onmessage: Function,\n                         onclose: Function,\n                         behaviorScripts: any,\n                         autoconnect: boolean) {\n        onclose = resolveFunction(onclose);\n\n        if (!window.WebSocket) { // IE6-9.\n            onclose(-1, channel);\n            return;\n        }\n\n        let channelToken = uri.substr(uri.indexOf('?') + 1);\n\n        if (!components[socketClientId]) {\n            components[socketClientId] = {\n                'channelToken': channelToken,\n                'onopen': resolveFunction(onopen),\n                'onmessage' : resolveFunction(onmessage),\n                'onclose': onclose,\n                'behaviors': behaviorScripts,\n                'autoconnect': autoconnect};\n            if (!clientIdsByTokens[channelToken]) {\n                clientIdsByTokens[channelToken] = [];\n            }\n            clientIdsByTokens[channelToken].push(socketClientId);\n            if (!sockets[channelToken]){\n                sockets[channelToken] = new Socket(channelToken,\n                    getBaseURL(uri), channel);\n            }\n        }\n\n        if (autoconnect) {\n            jsf.push.open(socketClientId);\n        }\n    }\n\n    export function open(socketClientId: string) {\n        getSocket(components?.[socketClientId]?.channelToken).open();\n    }\n\n    export function close(socketClientId: string) {\n        getSocket(components?.[socketClientId].channelToken).close();\n    }\n\n    // Private helper classes\n    // Private classes functions ----------------------------------------------------------------------------------\n    /**\n     * Creates a reconnecting web socket. When the web socket successfully connects on first attempt, then it will\n     * automatically reconnect on timeout with cumulative intervals of 500ms with a maximum of 25 attempts (~3 minutes).\n     * The <code>onclose</code> function will be called with the error code of the last attempt.\n     * @constructor\n     * @param {string} channelToken the channel token associated with this websocket connection\n     * @param {string} url The URL of the web socket\n     * @param {string} channel The name of the web socket channel.\n     */\n\n    class Socket {\n\n        socket: WebSocket;\n        reconnectAttempts = 0;\n\n        constructor(private channelToken: string, private url: string, private channel: string) {\n        }\n\n        open() {\n            if (this.socket && this.socket.readyState == 1) {\n                return;\n            }\n            this.socket = new WebSocket(this.url);\n\n            this.bindCallbacks();\n        }\n\n        onopen(event: any) {\n            if (!this.reconnectAttempts) {\n                let clientIds = clientIdsByTokens[this.channelToken];\n                for (let i = clientIds.length - 1; i >= 0; i--) {\n                    let socketClientId = clientIds[i];\n                    components[socketClientId]['onopen'](this.channel);\n                }\n            }\n            this.reconnectAttempts = 0;\n        }\n\n        onmmessage(event: any) {\n            let message = JSON.parse(event.data);\n            for (let i = clientIdsByTokens[this.channelToken].length - 1; i >= 0; i--) {\n                let socketClientId = clientIdsByTokens[this.channelToken][i];\n                if (document.getElementById(socketClientId)) {\n                    try {\n                        components[socketClientId]['onmessage'](message, this.channel, event);\n                    } catch (e) {\n                        //Ignore\n                    }\n                    let behaviors = components[socketClientId]['behaviors'];\n                    let functions = behaviors[message];\n                    if (functions && functions.length) {\n                        for (let j = 0; j < functions.length; j++) {\n                            try {\n                                functions[j](null);\n                            } catch (e) {\n                                //Ignore\n                            }\n                        }\n                    }\n                } else {\n                    clientIdsByTokens[this.channelToken].splice(i, 1);\n                }\n            }\n            if (clientIdsByTokens[this.channelToken].length == 0) {\n                //tag dissapeared\n                this.close();\n            }\n        }\n\n        onclose(event: any) {\n            if (!this.socket\n                || (event.code == 1000 && event.reason == REASON_EXPIRED)\n                || (event.code == 1008)\n                || (!this.reconnectAttempts)\n                || (this.reconnectAttempts >= MAX_RECONNECT_ATTEMPTS)) {\n                let clientIds = clientIdsByTokens[this.channelToken];\n                for (let i = clientIds.length - 1; i >= 0; i--) {\n                    let socketClientId = clientIds[i];\n                    components[socketClientId]['onclose'](event?.code, this?.channel, event);\n                }\n            } else {\n                setTimeout(this.open, RECONNECT_INTERVAL * this.reconnectAttempts++);\n            }\n        };\n\n        close() {\n            if (this.socket) {\n                let s = this.socket;\n                this.socket = null;\n                s.close();\n            }\n        }\n\n        /**\n         * bind the callbacks to the socket callbacks\n         */\n        private bindCallbacks() {\n            this.socket.onopen = (event: Event) => this.onopen(event);\n            this.socket.onmessage = (event: Event) => this.onmmessage(event);\n            this.socket.onclose = (event: Event) => this.onclose(event);\n        }\n    }\n\n    // Private static functions ---------------------------------------------------------------------------------------\n\n    function getBaseURL(url: string) {\n        if (url.indexOf(\"://\") < 0) {\n            let base = window.location.hostname + \":\" + window.location.port;\n            return URL_PROTOCOL + base + url;\n        } else {\n            return url;\n        }\n    }\n\n    /**\n     * Get socket associated with given channelToken.\n     * @param {string} channelToken The name of the web socket channelToken.\n     * @return {Socket} Socket associated with given channelToken.\n     * @throws {Error} When channelToken is unknown, you may need to initialize\n     *                 it first via <code>init()</code> function.\n     */\n    function getSocket(channelToken: string): Socket {\n        let socket = sockets[channelToken];\n        if (socket) {\n            return socket;\n        } else {\n            throw new Error(\"Unknown channelToken: \" + channelToken);\n        }\n    }\n\n    function resolveFunction(fn: Function | string = () => {\n    }): Function {\n        return <Function>((typeof fn !== \"function\") && (fn = window[fn]), fn);\n    }\n\n}","/* Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * [export const] constants\n */\n\nexport const P_PARTIAL_SOURCE = \"javax.faces.source\";\nexport const PARTIAL_ID = \"partialId\";\nexport const P_VIEWSTATE = \"javax.faces.ViewState\";\nexport const P_VIEWROOT = \"javax.faces.ViewRoot\";\nexport const P_VIEWHEAD = \"javax.faces.ViewHead\";\nexport const P_VIEWBODY = \"javax.faces.ViewBody\";\n\n/*some useful definitions*/\n\nexport const EMPTY_FUNC = Object.freeze(() => {\n});\nexport const EMPTY_STR = \"\";\nexport const EMPTY_MAP = Object.freeze({});\n\nexport const HTML_VIEWSTATE = [\"<input type='hidden'\", \"id='\", P_VIEWSTATE, \"' name='\", P_VIEWSTATE, \"' value='' />\"].join(EMPTY_STR);\n\n\n/*internal identifiers for options*/\nexport const IDENT_ALL = \"@all\";\nexport const IDENT_NONE = \"@none\";\nexport const IDENT_THIS = \"@this\";\nexport const IDENT_FORM = \"@form\";\n\n\nexport const P_AJAX = \"javax.faces.partial.ajax\";\nexport const P_EXECUTE = \"javax.faces.partial.execute\";\nexport const P_RENDER = \"javax.faces.partial.render\";\nexport const P_EVT = \"javax.faces.partial.event\";\nexport const P_CLIENT_WINDOW = \"javax.faces.ClientWindow\";\nexport const P_RESET_VALUES = \"javax.faces.partial.resetValues\";\n\nexport const P_WINDOW_ID = \"javax.faces.windowId\";\n\nexport const RENDER = \"render\";\nexport const WINDOW_ID = \"windowId\";\n\n/* message types */\nexport const ERROR = \"error\";\nexport const EVENT = \"event\";\n\nexport const ON_ERROR = \"onerror\";\nexport const ON_EVENT = \"onevent\";\n\n/* event emitting stages */\nexport const BEGIN = \"begin\";\nexport const COMPLETE = \"complete\";\nexport const SUCCESS = \"success\";\n\nexport const SOURCE = \"source\";\nexport const STATUS = \"status\";\n\n\nexport const ERROR_NAME = \"error-name\";\nexport const ERROR_MESSAGE = \"error-message\";\n\n\nexport const RESPONSE_TEXT = \"responseText\";\nexport const RESPONSE_XML = \"responseXML\";\n\n/*ajax errors spec 14.4.2*/\nexport const HTTPERROR = \"httpError\";\nexport const EMPTY_RESPONSE = \"emptyResponse\";\nexport const MALFORMEDXML = \"malformedXML\";\nexport const SERVER_ERROR = \"serverError\";\nexport const CLIENT_ERROR = \"clientError\";\nexport const TIMEOUT_EVENT = \"timeout\";\n\nexport const CTX_PARAM_MF_INTERNAL = \"_mfInternal\";\n\nexport const CTX_PARAM_SRC_FRM_ID = \"_mfSourceFormId\";\nexport const CTX_PARAM_SRC_CTL_ID = \"_mfSourceControlId\";\nexport const CTX_PARAM_TR_TYPE = \"_mfTransportType\";\nexport const CTX_PARAM_PASS_THR = \"passThrgh\";\nexport const CTX_PARAM_DELAY = \"delay\";\nexport const CTX_PARAM_TIMEOUT = \"timeout\";\nexport const CTX_PARAM_RST = \"resetValues\";\nexport const CTX_PARAM_EXECUTE = \"execute\";\n\nexport const STAGE_DEVELOPMENT = \"Development\";\n\n\nexport const CONTENT_TYPE = \"Content-Type\";\nexport const HEAD_FACES_REQ = \"Faces-Request\";\nexport const REQ_ACCEPT = \"Accept\";\nexport const VAL_AJAX = \"partial/ajax\";\nexport const ENCODED_URL = \"javax.faces.encodedURL\";\nexport const REQ_TYPE_GET = \"GET\";\nexport const REQ_TYPE_POST = \"POST\";\nexport const STATE_EVT_BEGIN = \"begin\"; //TODO remove this\nexport const STATE_EVT_TIMEOUT = \"TIMEOUT_EVENT\";\nexport const STATE_EVT_COMPLETE = \"complete\"; //TODO remove this\nexport const URL_ENCODED = \"application/x-www-form-urlencoded\";\nexport const MULTIPART = \"multipart/form-data\";\nexport const NO_TIMEOUT = 0;\nexport const STD_ACCEPT = \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\";\n\nexport const TAG_HEAD = \"head\";\nexport const TAG_FORM = \"form\";\nexport const TAG_BODY = \"body\";\nexport const TAG_BEFORE = \"before\";\nexport const TAG_AFTER = \"after\";\n\nexport const TAG_ATTR = \"attribute\";\n\n\nexport const SEL_VIEWSTATE_ELEM = \"[name='\" + P_VIEWSTATE + \"']\";\nexport const SEL_RESPONSE_XML = \"responseXML\";\n\nexport const PHASE_PROCESS_RESPONSE = \"processResponse\";\n\n\nexport const ERR_NO_PARTIAL_RESPONSE = \"Partial response not set\";\n\nexport const ATTR_URL = \"url\";\nexport const ATTR_NAME = \"name\";\nexport const ATTR_VALUE = \"value\";\nexport const ATTR_ID = \"id\";\n\n/*partial response types*/\nexport const RESP_PARTIAL = \"partial-response\";\n\n/*partial commands*/\nexport const CMD_CHANGES = \"changes\";\nexport const CMD_UPDATE = \"update\";\nexport const CMD_DELETE = \"delete\";\nexport const CMD_INSERT = \"insert\";\nexport const CMD_EVAL = \"eval\";\nexport const CMD_ERROR = \"error\";\nexport const CMD_ATTRIBUTES = \"attributes\";\nexport const CMD_EXTENSION = \"extension\";\nexport const CMD_REDIRECT = \"redirect\";\n\n/*other constants*/\n\nexport const UPDATE_FORMS = \"_updateForms\";\nexport const UPDATE_ELEMS = \"_updateElems\";\n\nexport const MYFACES = \"myfaces\";\n\nexport const SEL_SCRIPTS_STYLES = \"script, style, link\";\n\nexport const MF_NONE = \"__mf_none__\";\n\nexport const REASON_EXPIRED = \"Expired\";\n\nexport const APPLIED_VST = \"appliedViewState\";\n\nexport const RECONNECT_INTERVAL = 500;\nexport const MAX_RECONNECT_ATTEMPTS = 25;\n\n\n","/* Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nimport {EMPTY_STR, P_VIEWSTATE} from \"./Const\";\n\nexport interface IdValueHolder {\n\n    readonly id: string;\n    readonly value: string;\n\n}\n\n/**\n * a helper class to isolate the\n * view state data processing\n */\nexport class ViewState implements IdValueHolder {\n\n    nameSpace: string;\n\n    constructor(public id: string, public value: string) {\n        let viewStatePos = id.indexOf(P_VIEWSTATE);\n        this.nameSpace = viewStatePos > 0 ? id.substr(0, viewStatePos - 1) : EMPTY_STR;\n    }\n\n    get hasNameSpace(): boolean {\n        return !!(this?.nameSpace ?? EMPTY_STR).length;\n    }\n}","/* Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport class Messages {\n    MSG_TEST = \"Testmessage\";\n\n    /*Messages*/\n    /** @constant */\n    MSG_DEV_MODE = \"Note, this message is only sent, because project stage is development and no \" +\n        \"other error listeners are registered.\";\n    /** @constant */\n    MSG_AFFECTED_CLASS = \"Affected Class=\";\n    /** @constant */\n    MSG_AFFECTED_METHOD = \"Affected Method=\";\n    /** @constant */\n    MSG_ERROR_NAME = \"Error Name=\";\n    /** @constant */\n    MSG_ERROR_MESSAGE = \"Error Message=\";\n    /** @constant */\n    MSG_SERVER_ERROR_NAME = \"Server Error Name=\";\n\n    /** @constant */\n    MSG_ERROR_DESC = \"Error Description=\";\n    /** @constant */\n    MSG_ERROR_NO = \"Error Number=\";\n    /** @constant */\n    MSG_ERROR_LINENO = \"Error Line Number=\";\n\n    /*Errors and messages*/\n    /** @constant */\n    ERR_FORM = \"Sourceform could not be determined, either because element is not attached to a form or we have multiple forms with named elements of the same identifier or name, stopping the ajax processing\";\n    /** @constant */\n    ERR_VIEWSTATE = \"jsf.viewState= param value not of type form!\";\n    /** @constant */\n    ERR_TRANSPORT = \"Transport type {0} does not exist\";\n    /** @constant */\n    ERR_EVT_PASS = \"an event must be passed down (either a an event object null or undefined) \";\n    /** @constant */\n    ERR_CONSTRUCT = \"Parts of the response couldn't be retrieved when constructing the event data= {0} \";\n    /** @constant */\n    ERR_MALFORMEDXML = \"The server response could not be parsed, the server has returned with a response which is not xml !\";\n    /** @constant */\n    ERR_SOURCE_FUNC = \"source cannot be a function (probably source and event were not defined or set to null\";\n    /** @constant */\n    ERR_EV_OR_UNKNOWN = \"An event object or unknown must be passed as second parameter\";\n    /** @constant */\n    ERR_SOURCE_NOSTR = \"source cannot be a string\";\n    /** @constant */\n    ERR_SOURCE_DEF_NULL = \"source must be defined or null\";\n\n    //_Lang.js\n    /** @constant */\n    ERR_MUST_STRING = \"{0}: {1} namespace must be of type String\";\n    /** @constant */\n    ERR_REF_OR_ID = \"{0}: {1} a reference node or identifier must be provided\";\n    /** @constant */\n    ERR_PARAM_GENERIC = \"{0}: parameter {1} must be of type {2}\";\n    /** @constant */\n    ERR_PARAM_STR = \"{0}: {1} param must be of type string\";\n    /** @constant */\n    ERR_PARAM_STR_RE = \"{0}: {1} param must be of type string or a regular expression\";\n    /** @constant */\n    ERR_PARAM_MIXMAPS = \"{0}: both a source as well as a destination map must be provided\";\n    /** @constant */\n    ERR_MUST_BE_PROVIDED = \"{0}: an {1} and a {2} must be provided\";\n    /** @constant */\n    ERR_MUST_BE_PROVIDED1 = \"{0}: {1} must be set\";\n\n    /** @constant */\n    ERR_REPLACE_EL = \"replaceElements called while evalNodes is not an array\";\n\n    /** @constant */\n    ERR_EMPTY_RESPONSE = \"{0}: The response cannot be null or empty!\";\n    /** @constant */\n    ERR_ITEM_ID_NOTFOUND = \"{0}: item with identifier {1} could not be found\";\n    /** @constant */\n    ERR_PPR_IDREQ = \"{0}: Error in PPR Insert, id must be present\";\n    /** @constant */\n    ERR_PPR_INSERTBEFID = \"{0}: Error in PPR Insert, before id or after id must be present\";\n    /** @constant */\n    ERR_PPR_INSERTBEFID_1 = \"{0}: Error in PPR Insert, before  node of id {1} does not exist in document\";\n    /** @constant */\n    ERR_PPR_INSERTBEFID_2 = \"{0}: Error in PPR Insert, after  node of id {1} does not exist in document\";\n\n    /** @constant */\n    ERR_PPR_DELID = \"{0}: Error in delete, id not in xml markup\";\n    /** @constant */\n    ERR_PPR_UNKNOWNCID = \"{0}:  Unknown Html-Component-ID= {1}\";\n\n    /** @constant */\n    ERR_NO_VIEWROOTATTR = \"{0}: Changing of ViewRoot attributes is not supported\";\n    /** @constant */\n    ERR_NO_HEADATTR = \"{0}: Changing of Head attributes is not supported\";\n    /** @constant */\n    ERR_RED_URL = \"{0}: Redirect without url\";\n\n    /** @constant */\n    ERR_REQ_FAILED_UNKNOWN = \"Request failed with unknown status\";\n\n    /** @constant */\n    ERR_REQU_FAILED = \"Request failed with status {0} and reason {1}\";\n\n    /** @constant */\n    UNKNOWN = \"UNKNOWN\";\n}","import {Config, Lang, XMLQuery} from \"../../ext/monadish\";\n\nimport {DQ} from \"../../ext/monadish\";\nimport {ExtLang} from \"./Lang\";\nimport getMessage = ExtLang.getMessage;\nimport makeException = ExtLang.makeException;\nimport {\n    ATTR_URL,\n    EMPTY_RESPONSE,\n    EMPTY_STR, ERR_NO_PARTIAL_RESPONSE, MALFORMEDXML,\n    ON_ERROR,\n    ON_EVENT,\n    PHASE_PROCESS_RESPONSE,\n    RESP_PARTIAL\n} from \"../core/Const\";\n\n/**\n * a set of internal code assertions\n * which raise an error\n *\n */\nexport module Assertions {\n\n    export function assertRequestIntegrity(options: Config, elem: DQ): void | never {\n        /*assert if the onerror is set and once if it is set it must be of type function*/\n        assertFunction(options.getIf(ON_ERROR).value);\n        /*assert if the onevent is set and once if it is set it must be of type function*/\n        assertFunction(options.getIf(ON_EVENT).value);\n        //improve the error messages if an empty elem is passed\n        //Assertions.assertElementExists(elem);\n        assert(elem.isPresent(), getMessage(\"ERR_MUST_BE_PROVIDED1\", \"{0}: source  must be provided or exist\", \"source element id\"), \"jsf.ajax.request\", \"ArgNotSet\",  )\n    }\n\n    export function assertUrlExists(node: XMLQuery): void | never {\n        if (node.attr(ATTR_URL).isAbsent()) {\n            throw Assertions.raiseError(new Error(), getMessage(\"ERR_RED_URL\", null, \"_Ajaxthis.processRedirect\"), \"processRedirect\");\n        }\n    }\n\n    /**\n     * checks the xml for various issues which can occur\n     * and prevent a proper processing\n     */\n    export function assertValidXMLResponse(responseXML: XMLQuery) : void | never  {\n        assert(!responseXML.isAbsent(), EMPTY_RESPONSE, PHASE_PROCESS_RESPONSE);\n        assert(!responseXML.isXMLParserError(),  responseXML.parserErrorText(EMPTY_STR), PHASE_PROCESS_RESPONSE);\n        assert(responseXML.querySelectorAll(RESP_PARTIAL).isPresent(), ERR_NO_PARTIAL_RESPONSE, PHASE_PROCESS_RESPONSE);\n    }\n\n    /**\n     * internal helper which raises an error in the\n     * format we need for further processing\n     *\n     * @param message the message\n     * @param title the title of the error (optional)\n     * @param name the name of the error (optional)\n     */\n    export function raiseError(error: any, message: string, caller ?: string, title ?: string, name ?: string): Error {\n\n        let finalTitle = title ?? MALFORMEDXML;\n        let finalName = name ?? MALFORMEDXML;\n        let finalMessage = message ?? EMPTY_STR;\n\n        //TODO clean up the messy makeException, this is a perfect case for encapsulation and sane defaults\n        return makeException(error, finalTitle, finalName, \"Response\", caller || (((<any>arguments).caller) ? (<any>arguments).caller.toString() : \"_raiseError\"), finalMessage);\n    }\n\n    /*\n     * using the new typescript 3.7 compiler assertion functionality to improve compiler hinting\n     * we are not fully there yet, but soon\n     */\n\n    export function assert(value: any, msg = EMPTY_STR, caller=EMPTY_STR, title=\"Assertion Error\"): asserts value {\n        if(!value) {\n            throw Assertions.raiseError(new Error(), msg ,caller, title);\n        }\n    }\n\n\n    export function assertType(value: any, theType: any, msg = EMPTY_STR, caller=EMPTY_STR, title=\"Type Assertion Error\"): asserts value {\n        if((!!value) && !Lang.assertType(value,theType)) {\n            throw Assertions.raiseError(new Error(), msg ,caller, title);\n        }\n    }\n\n    export function assertFunction(value: any, msg = EMPTY_STR, caller=EMPTY_STR, title=\"Assertion Error\"): asserts value is Function {\n        assertType(value, \"function\", msg, caller, title);\n    }\n}\n\n\n","import {AsyncRunnable} from \"./AsyncRunnable\";\n\n\n/**\n * Asynchronous queue which starts to work\n * through the callbacks until the queue is empty\n *\n * Every callback must be of async runnable\n * which is sort of an extended promise which has\n * added a decicated cancel and start point\n *\n * This interface can be used as wrapper contract\n * for normal promises if needed.\n */\nexport class AsynchronouseQueue<T extends AsyncRunnable<any>> {\n    static EVT_NEXT = \"__mf_queue_next__\";\n\n    private runnableQueue = [];\n    private delayTimeout: number;\n\n    currentlyRunning: AsyncRunnable<any>;\n\n    constructor() {\n    }\n\n    get isEmpty(): boolean {\n        return !this.runnableQueue.length;\n    }\n\n    /**\n     * enequeues an element and starts the\n     * asynchronous work loop if not already running\n     *\n     * @param element the element to be queued and processed\n     * @param delay possible delay after our usual process or drop if something newer is incoming algorithm\n     */\n    enqueue(element: T, delay = 0) {\n        if (this.delayTimeout) {\n            clearTimeout(this.delayTimeout);\n            this.delayTimeout = null;\n        }\n        if (delay) {\n            this.delayTimeout = setTimeout(() => {\n                this.appendElement(element);\n            });\n        } else {\n            this.appendElement(element);\n        }\n    }\n\n    dequeue(): T {\n        return this.runnableQueue.shift();\n    }\n\n    cleanup() {\n        this.currentlyRunning = null;\n        this.runnableQueue.length = 0;\n    }\n\n    private appendElement(element: T) {\n        //only if the first element is added we start with a trigger\n        //otherwise a process already is running and not finished yet at that\n        //time\n        this.runnableQueue.push(element);\n        if (!this.currentlyRunning) {\n            this.runEntry();\n        }\n    }\n\n    private runEntry() {\n        if (this.isEmpty) {\n            this.currentlyRunning = null;\n            return;\n        }\n        this.currentlyRunning = this.dequeue();\n        this.currentlyRunning\n            .catch((e) => {\n                //in case of an error we always clean up the remaining calls\n                //to allow a clean recovery of the application\n                this.cleanup();\n                throw e;\n            })\n            .then(\n                //the idea is to trigger the next over an event to reduce\n                //the number of recursive calls (stacks might be limited\n                //compared to ram)\n                //naturally give we have a DOM, the DOM is the natural event dispatch system\n                //which we can use, to decouple the calls from a recursive stack call\n                //(the browser engine will take care of that)\n                () => this.callForNextElementToProcess()\n            ).start();\n    }\n\n    cancel() {\n        try {\n            if (this.currentlyRunning) {\n                this.currentlyRunning.cancel();\n            }\n        } finally {\n            this.cleanup();\n        }\n    }\n\n    private callForNextElementToProcess() {\n        this.runEntry();\n    }\n\n    private processNextElement() {\n        this.currentlyRunning = null;\n        if (!this.isEmpty) {\n            this.runEntry();\n        }\n    }\n\n}","import {Config, IValueHolder, Optional} from \"../../ext/monadish/Monad\";\nimport {DomQuery, DQ} from \"../../ext/monadish/DomQuery\";\nimport {EMPTY_STR, P_WINDOW_ID} from \"../core/Const\";\n\ndeclare let window: any;\n\n/**\n * Extension which adds implementation specific\n * meta data to our dom qury\n *\n * Usage\n * el = new ExtDQ(oldReference)\n * nonce = el.nonce\n * windowId = el.getWindowId\n */\nexport class ExtDomquery extends DQ {\n\n    static get windowId() {\n        return new ExtDomquery(document.body).windowId;\n    }\n\n    static get nonce(): string {\n        return new ExtDomquery(document.body).nonce;\n    }\n\n    get windowId() {\n\n        const fetchWindowIdFromURL = function () {\n            let href = window.location.href;\n            let windowId = \"windowId\";\n            let regex = new RegExp(\"[\\\\?&]\" + windowId + \"=([^&#\\\\;]*)\");\n            let results = regex.exec(href);\n            //initial trial over the url and a regexp\n            if (results != null) return results[1];\n            return null;\n        };\n\n        //byId ($)\n        if (this.value.isPresent()) {\n            let result = this.querySelectorAll(\"form input[name='\" + P_WINDOW_ID + \"']\");\n            if (result.length > 0) {\n                throw Error(\"Multiple different windowIds found in document\");\n            }\n\n            return (result.isPresent()) ? (<HTMLInputElement>result.getAsElem(0).value).value : fetchWindowIdFromURL();\n        } else {\n            return fetchWindowIdFromURL();\n        }\n    }\n\n    /*\n    determines the jsfjs nonce and adds them to the namespace\n    * this is done once and only lazily\n    */\n    get nonce(): string {\n        //already processed\n        let myfacesConfig = new Config(window.myfaces);\n        let nonce: IValueHolder<string> = myfacesConfig.assign(\"config\", \"cspMeta\", \"nonce\");\n        if (nonce.value) {\n            return <string>nonce.value;\n        }\n\n        let curScript = new DQ(document.currentScript);\n        //since our baseline atm is ie11 we cannot use document.currentScript globally\n        if (curScript.attr(\"nonce\").value != null) {\n            //fastpath for modern browsers\n            return curScript.attr(\"nonce\").value;\n        }\n\n        let nonceScript = DQ.querySelectorAll(\"script[src], link[src]\").lazyStream\n            .filter((item) => item.attr(\"nonce\").value != null && item.attr(\"src\") != null)\n            .map((item => !item.attr(\"src\").value.match(/jsf\\.js\\?ln\\=javax\\.faces/gi)))\n            .first();\n\n        if (nonceScript.isPresent()) {\n            nonce.value = DomQuery.byId(nonceScript.value).attr(\"nonce\").value;\n        }\n        return <string>nonce.value;\n    }\n\n    static searchJsfJsFor(item: RegExp): Optional<String> {\n        return new ExtDomquery(document).searchJsfJsFor(item);\n    }\n\n    searchJsfJsFor(rexp: RegExp): Optional<string> {\n        //perfect application for lazy stream\n        return DQ.querySelectorAll(\"script\").lazyStream\n                .filter(item => {\n                    return (item.attr(\"src\").value ?? EMPTY_STR).search(/\\/javax\\.faces\\.resource.*\\/jsf\\.js.*separator/) != -1;\n                }).map((item: DQ) => {\n                    let result = item.attr(\"src\").value.match(rexp);\n                    return decodeURIComponent(result[1]);\n                }).first();\n    }\n\n    globalEval(code: string, nonce ?: string): DQ {\n        return super.globalEval(code, nonce ?? this.nonce);\n    }\n}\n\nexport const ExtDQ = DQ;","/* Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * todo replace singleton with module definition\n *\n */\n\nimport {Lang as LangBase} from \"../../ext/monadish/Lang\";\nimport {Messages} from \"../i18n/Messages\";\nimport {Config, Optional} from \"../../ext/monadish/Monad\";\nimport {DomQuery, DQ} from \"../../ext/monadish/DomQuery\";\nimport {Stream} from \"../../ext/monadish\";\nimport {EMPTY_STR} from \"../core/Const\";\nimport {getEventTarget} from \"../xhrCore/RequestDataResolver\";\n\n\nexport module ExtLang {\n\n     let installedLocale: Messages;\n     let nameSpace = \"impl/util/Lang/\";\n\n\n    export function getLanguage(): string {\n        //TODO global config override\n\n        let language: string = (<any>navigator).languages?.[0] ?? navigator?.language;\n        language = language.split(\"-\")[0];\n        return language;\n    }\n\n    //should be in lang, but for now here to avoid recursive imports, not sure if typescript still has a problem with those\n    /**\n     * helper function to savely resolve anything\n     * this is not an elvis operator, it resolves\n     * a value without exception in a tree and if\n     * it is not resolvable then an optional of\n     * a default value is restored or Optional.empty\n     * if none is given\n     *\n     * usage\n     * <code>\n     *     let var: Optional<string> = saveResolve(() => a.b.c.d.e, \"foobaz\")\n     * </code>\n     *\n     * @param resolverProducer a lambda which can produce the value\n     * @param defaultValue an optional default value if the producer failes to produce anything\n     * @returns an Optional of the produced value\n     */\n    export function failSaveResolve<T>(resolverProducer: () => T, defaultValue: T = null): Optional<T> {\n        return LangBase.saveResolve(resolverProducer, defaultValue);\n    }\n\n    /**\n     * under some conditions it makes sense to swallow errors and return a default value in the error case\n     * classical example the optional resolution of values in a chain (thankfully now covered by Typescript itself)\n     * another example which we have in our system is that some operations fail only under test due to test framework\n     * limitations while they cannot fail in the real world.\n     *\n     * @param resolverProducer a producer function which produces a value in the non error case\n     * @param defaultValue the default value in case of a fail of the function\n     */\n    export function failSaveExecute<T>(resolverProducer: () => any, defaultValue: T = null): void {\n        LangBase.saveResolve(resolverProducer, defaultValue);\n    }\n\n    /**\n     * returns a given localized message upon a given key\n     * basic java log like templating functionality is included\n     *\n     * @param {String} key the key for the message\n     * @param {String} defaultMessage optional default message if none was found\n     *\n     * Additionally you can pass additional arguments, which are used\n     * in the same way java log templates use the params\n     *\n     * @param templateParams the param list to be filled in\n     */\n    export function getMessage(key: string, defaultMessage?: string, ...templateParams: Array<string>): string {\n        installedLocale = installedLocale ?? new Messages();\n\n        let msg = installedLocale[key] ?? defaultMessage ?? key + \" - undefined message\";\n\n        Stream.of(...templateParams).each((param, cnt) => {\n            msg = msg.replace(new RegExp([\"\\\\{\", cnt, \"\\\\}\"].join(EMPTY_STR), \"g\"), param);\n        });\n\n        return msg;\n    }\n\n\n\n    /**\n     * transforms a key value pair into a string\n     * @param key the key\n     * @param val the value\n     * @param delimiter the delimiter\n     */\n    export function keyValToStr(key: string, val: string, delimiter: string = \"\\n\") {\n        return [key, val].join(delimiter);\n    }\n\n\n    /**\n     * creates an exeption with additional internal parameters\n     * for extra information\n     *\n     * @param {String} title the exception title\n     * @param {String} name  the exception name\n     * @param {String} callerCls the caller class\n     * @param {String} callFunc the caller function\n     * @param {String} message the message for the exception\n     */\n    export function makeException(error: Error, title: string, name: string, callerCls: string, callFunc: string, message: string): Error {\n\n        return new Error(message + (callerCls ?? nameSpace) + callFunc ?? (EMPTY_STR + (<any>arguments).caller.toString()));\n\n    }\n\n    /**\n     * fetches a global config entry\n     * @param {String} configName the name of the configuration entry\n     * @param {Object} defaultValue\n     *\n     * @return either the config entry or if none is given the default value\n     */\n    export function getGlobalConfig(configName: string, defaultValue: any): any {\n        /**\n         * note we could use exists but this is an heavy operation, since the config name usually\n         * given this function here is called very often\n         * is a single entry without . in between we can do the lighter shortcut\n         */\n        return (<any>window)?.myfaces?.config?.[configName] ?? defaultValue;\n    }\n\n\n\n\n    /**\n     * fetches the form in an unprecise manner depending\n     * on an element or event target.\n     *\n     * The idea is that according to the jsf spec\n     * the enclosing form of the issuing element needs to be fetched.\n     *\n     * This is fine, but since then html5 came into the picture with the form attribute the element\n     * can be anywhere referencing its parent form.\n     *\n     * Also theoretically you can have the case of an issuing element enclosing a set of forms\n     * (not really often used, but theoretically it could be input button allows to embed html for instance)\n     *\n     * So the idea is not to limit the issuing form determination to the spec case\n     * but also cover the theoretical and html5 corner case.\n     *\n     * @param elem\n     * @param event\n     */\n    export function getForm(elem: Element, event ?: Event): DQ | never {\n\n        const FORM = \"form\";\n\n        let queryElem = new DQ(elem);\n        let eventTarget = new DQ(getEventTarget(event));\n\n        if (queryElem.isTag(FORM)) {\n            return queryElem;\n        }\n\n        //html 5 for handling\n        if (queryElem.attr(FORM).isPresent()) {\n            let formId = queryElem.attr(FORM).value;\n            let foundForm = DQ.byId(formId);\n            if (foundForm.isPresent()) {\n                return foundForm;\n            }\n        }\n\n        let form = queryElem.parents(FORM)\n            .orElseLazy(() => queryElem.byTagName(FORM, true))\n            .orElseLazy(() => eventTarget.parents(FORM))\n            .orElseLazy(() => eventTarget.byTagName(FORM))\n            .first();\n\n        assertFormExists(form);\n\n        return form;\n    }\n\n    /**\n     * gets the local or global options with local ones having higher priority\n     * if no local or global one was found then the default value is given back\n     *\n     * @param {String} configName the name of the configuration entry\n     * @param {String} localOptions the local options root for the configuration myfaces as default marker is added implicitely\n     *\n     * @param {Object} defaultValue\n     *\n     * @return either the config entry or if none is given the default value\n     */\n    export function getLocalOrGlobalConfig(localOptions: Config, configName: string, defaultValue: any): any {\n        return localOptions.value?.myfaces?.config?.[configName] ??\n            (<any>window)?.myfaces?.config?.[configName] ??\n            defaultValue;\n    }\n\n    /**\n     * assert that the form exists and throw an exception in the case it does not\n     * (TODO move this into the assertions)\n     *\n     * @param form the form to check for\n     */\n    function assertFormExists(form: DomQuery): void | never {\n        if (form.isAbsent()) {\n            throw makeException(new Error(), null, null, \"Impl\", \"getForm\", getMessage(\"ERR_FORM\"));\n        }\n    }\n\n\n\n}","import {EMPTY_STR, ERROR_MESSAGE, ERROR_NAME, RESPONSE_TEXT, RESPONSE_XML, SOURCE, STATUS} from \"../core/Const\";\nimport {Config} from \"../../ext/monadish\";\n\nimport {EventData} from \"./EventData\";\nimport {ExtLang} from \"../util/Lang\";\nimport getMessage = ExtLang.getMessage;\n\n\nexport enum ErrorType {\n    SERVER_ERROR = \"serverError\",\n    HTTP_ERROR = \"httpError\",\n    CLIENT_ERROR = \"clientErrror\",\n    TIMEOUT = \"timeout\"\n}\n\n/**\n * the spec has a problem of having the error\n * object somewhat underspecified, there is no clear\n * description of the required contents.\n * I want to streamline it with mojarra here\n * hence we are going to move\n * everything into the same attributes,\n * I will add deprecated myfaces backwards compatibility attributes as well\n */\nexport class ErrorData extends EventData {\n\n    type: string = \"error\";\n    source: string;\n    errorName: string;\n    errorMessage: string;\n\n    responseText: string;\n    responseXML: any;\n\n    status: string;\n    typeDetails: ErrorType;\n\n    //TODO backwards compatible attributes\n    serverErrorName: string;\n    serverErrorMessage: string;\n    message: string;\n\n    constructor(source: string, errorName: string, errorMessage: string, responseText: string = null, responseXML: any = null, responseCode: string = \"200\", status: string = \"UNKNOWN\", type = ErrorType.CLIENT_ERROR) {\n        super();\n        this.source = source;\n        this.type = \"error\";\n        this.errorName = errorName;\n        this.message = this.errorMessage = errorMessage;\n        this.responseCode = responseCode;\n        this.responseText = responseText;\n        this.status = status;\n        this.typeDetails = type;\n\n        if (type == ErrorType.SERVER_ERROR) {\n            this.serverErrorName = this.errorName;\n            this.serverErrorMessage = this.errorMessage;\n        }\n    }\n\n    static fromClient(e: Error): ErrorData {\n        return new ErrorData(\"client\", e.name, e.message, e.stack);\n    }\n\n    static fromHttpConnection(source: string, name: string, message: string, responseText, responseCode: number): ErrorData {\n        return new ErrorData(source, name, message, responseText, responseCode, null, \"UNKNOWN\", ErrorType.HTTP_ERROR);\n    }\n\n    static fromGeneric(context: Config, errorCode: number, errorType: ErrorType = ErrorType.SERVER_ERROR): ErrorData {\n\n        let UNKNOWN = \"UNKNOWN\";\n        let getMsg = this.getMsg;\n\n        let source = getMsg(context, SOURCE);\n        let errorName = getMsg(context, ERROR_NAME);\n        let errorMessage = getMsg(context, ERROR_MESSAGE);\n        let status = getMsg(context, STATUS);\n        let responseText = getMsg(context, RESPONSE_TEXT);\n        let responseXML = getMsg(context, RESPONSE_XML);\n        return new ErrorData(source, name, errorMessage, responseText, responseXML, errorCode + EMPTY_STR, status, errorType);\n    }\n\n    private static getMsg(context, param) {\n        let UNKNOWN = \"UNKNOWN\";\n        return getMessage(context.getIf(param).orElse(UNKNOWN).value);\n    }\n\n    static fromServerError(context: Config): ErrorData {\n        return this.fromGeneric(context, -1);\n    }\n\n}","import {Config, DQ} from \"../../ext/monadish\";\nimport {BEGIN, CTX_PARAM_PASS_THR, EVENT, P_PARTIAL_SOURCE, SOURCE} from \"../core/Const\";\n\nexport class EventData {\n    type: string;\n    status: string;\n    source: any;\n    responseCode: string;\n    responseText: string;\n    responseXML: Document;\n\n    static createFromRequest(request: XMLHttpRequest, context: Config, /*event name*/ name: string): EventData {\n\n        let eventData = new EventData();\n\n        eventData.type = EVENT;\n        eventData.status = name;\n\n        let sourceId: string = context.getIf(SOURCE)\n            .orElse(context.getIf(P_PARTIAL_SOURCE).value)\n            .orElse(context.getIf(CTX_PARAM_PASS_THR, P_PARTIAL_SOURCE).value).value;\n        if(sourceId) {\n            eventData.source = DQ.byId(sourceId).first().value.value;\n        }\n\n\n        if (name !== BEGIN) {\n            eventData.responseCode = request?.status?.toString();\n            eventData.responseText = request?.responseText;\n            eventData.responseXML = request?.responseXML;\n        }\n        return eventData;\n    }\n}\n","/* Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {Config, DomQuery, DQ} from \"../../ext/monadish\";\nimport {\n    CTX_PARAM_DELAY,\n    CTX_PARAM_TIMEOUT,\n    EMPTY_FUNC,\n    EMPTY_STR,\n    ENCODED_URL,\n    MF_NONE,\n    REQ_TYPE_GET,\n    REQ_TYPE_POST\n} from \"../core/Const\";\nimport {XhrFormData} from \"./XhrFormData\";\nimport {ExtLang} from \"../util/Lang\";\nimport {ExtDomquery} from \"../util/ExtDomQuery\";\n\n/**\n * Resolver functions for various aspects of the request data\n *\n * stateless because it might be called from various\n * parts of the response classes\n */\n\n/**\n * resolves the event handlers lazly\n * so that if some decoration happens in between we can deal with it\n *\n * @param funcName\n */\nexport function resolveHandlerFunc(requestContext: Config, responseContext: Config, funcName: string) {\n    return responseContext.getIf(funcName)\n        .orElse(requestContext.getIf(funcName).value)\n        .orElse(EMPTY_FUNC).value;\n}\n\nexport function resolveTargetUrl(srcFormElement: HTMLFormElement) {\n    return (typeof srcFormElement.elements[ENCODED_URL] == 'undefined') ?\n        srcFormElement.action :\n        srcFormElement.elements[ENCODED_URL].value;\n}\n\nexport function resolveFinalUrl(sourceForm: DomQuery, formData: XhrFormData, ajaxType = REQ_TYPE_POST) {\n    let targetUrl = this.resolveTargetUrl(<HTMLFormElement>sourceForm.getAsElem(0).value);\n\n    return targetUrl + (ajaxType == REQ_TYPE_GET ? \"?\" + formData.toString() : EMPTY_STR);\n}\n\n/**\n * form resolution the same way our old implementation did\n * it is either the id or the parent form of the element or an embedded form\n * of the element\n *\n * @param requestCtx\n * @param elem\n * @param event\n */\nexport function resolveForm(requestCtx: Config, elem: DQ, event: Event): DQ {\n    const configId = requestCtx.value?.myfaces?.form ?? MF_NONE; //requestCtx.getIf(MYFACES, \"form\").orElse(MF_NONE).value;\n    return DQ\n        .byId(configId)\n        .orElseLazy(() => ExtLang.getForm(elem.getAsElem(0).value, event));\n}\n\nexport function resolveTimeout(options: Config): number {\n    let getCfg = ExtLang.getLocalOrGlobalConfig;\n    return options.getIf(CTX_PARAM_TIMEOUT).value ?? getCfg(options.value, CTX_PARAM_TIMEOUT, 0);\n}\n\n/**\n * resolve the delay from the options and/or the request context and or the configuration\n *\n * @param options ... the options object, in most cases it will host the delay value\n */\nexport function resolveDelay(options: Config): number {\n    let getCfg = ExtLang.getLocalOrGlobalConfig;\n\n    return options.getIf(CTX_PARAM_DELAY).value ?? getCfg(options.value, CTX_PARAM_DELAY, 0);\n}\n\n/**\n * resolves the window Id from various sources\n *\n * @param options\n */\nexport function resolveWindowId(options: Config) {\n    return options?.value?.windowId ?? ExtDomquery.windowId;\n}\n\n/**\n * determines the correct event depending\n * on the browsers state\n *\n * @param evt incoming event object (note not all browsers\n * have this)\n *\n * @return an event object no matter what is incoming\n */\nexport function resolveEvent(evt: Event): Event {\n    return evt ?? <any>window?.event ?? {};\n}\n\n/**\n * cross port from the dojo lib\n * browser save event resolution\n * @param evt the event object\n * (with a fallback for ie events if none is present)\n */\nexport function getEventTarget(evt: Event): Element {\n    //ie6 and 7 fallback\n    let finalEvent = this.resolveEvent(evt);\n    /**\n     * evt source is defined in the jsf events\n     * seems like some component authors use our code\n     * so we add it here see also\n     * https://issues.apache.org/jira/browse/MYFACES-2458\n     * not entirely a bug but makes sense to add this\n     * behavior. I dont use it that way but nevertheless it\n     * does not break anything so why not\n     * */\n    let t = finalEvent?.srcElement ?? finalEvent?.target ?? (<any>finalEvent)?.source;\n    while ((t) && (t.nodeType != 1)) {\n        t = t.parentNode;\n    }\n    return t;\n}\n\n/**\n * resolves a bunch of default values\n * which can be further processed from the given\n * call parameters of jsf.ajax.request\n *\n * @param event\n * @param opts\n * @param el\n */\nexport function resolveDefaults(event: Event, opts: any = {}, el: Element | string = null) {\n    const resolvedEvent = resolveEvent(event);\n\n    //deep copy the options, so that further transformations to not backfire into the callers\n    const options = new Config(opts).deepCopy;\n    const elem = DQ.byId(el || <Element>resolvedEvent.target);\n    const elementId = elem.id;\n    const requestCtx = new Config({});\n    const internalCtx = new Config({});\n    const windowId = resolveWindowId(options);\n    const isResetValues = true === options.value?.resetValues;\n    return {resolvedEvent, options, elem, elementId, requestCtx, internalCtx, windowId, isResetValues};\n};","/* Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {Config, Optional, XMLQuery} from \"../../ext/monadish\";\n\nimport {Assertions} from \"../util/Assertions\";\nimport {DQ} from \"../../ext/monadish\";\nimport {\n    CTX_PARAM_MF_INTERNAL,\n    CTX_PARAM_SRC_CTL_ID,\n    CTX_PARAM_SRC_FRM_ID,\n    SEL_RESPONSE_XML,\n    SOURCE,\n    TAG_FORM,\n    UPDATE_ELEMS,\n    UPDATE_FORMS\n} from \"../core/Const\";\n\n/**\n * Resolver functions for various aspects of the response data\n *\n * stateless because it might be called from various\n * parts of the response classes\n */\n\n/**\n * fetches the response XML\n * as XML Query object\n *\n * @param request the request hosting the responseXML\n *\n * Throws an error in case of non existent or wrong xml data\n *\n */\nexport function resolveResponseXML(request: Config): XMLQuery {\n    let ret = new XMLQuery(request.getIf(SEL_RESPONSE_XML).value);\n    Assertions.assertValidXMLResponse(ret);\n\n    return ret;\n}\n\n/**\n * Splits the incoming passthrough context apart\n * in an internal and an external nomalized context\n * the internal one is just for our internal processing\n *\n * @param context the root context as associative array\n */\nexport function resolveContexts(context: { [p: string]: any }): any {\n    /**\n     * we split the context apart into the external one and\n     * some internal values\n     */\n    let externalContext = Config.fromNullable(context);\n    let internalContext = externalContext.getIf(CTX_PARAM_MF_INTERNAL);\n    if (!internalContext.isPresent()) {\n        internalContext = Config.fromNullable({});\n    }\n\n    /**\n     * prepare storage for some deferred operations\n     */\n    internalContext.assign(UPDATE_FORMS).value = [];\n    internalContext.assign(UPDATE_ELEMS).value = [];\n    return {externalContext, internalContext};\n}\n\n/**\n * fetches the source element out of our conexts\n *\n * @param context the external context which shpuld host the source id\n * @param internalContext internal passthrough fall back\n *\n */\nexport function resolveSourceElement(context: Config, internalContext: Config): DQ {\n    let elemId = resolveSourceElementId(context, internalContext);\n    return DQ.byId(elemId.value);\n}\n\n/**\n * fetches the source form if it still exists\n * also embedded forms and parent forms are taken into consideration\n * as fallbacks\n *\n * @param internalContext\n * @param elem\n */\nexport function resolveSourceForm(internalContext: Config, elem: DQ): DQ {\n    let sourceFormId = internalContext.getIf(CTX_PARAM_SRC_FRM_ID);\n    let sourceForm = new DQ(sourceFormId.isPresent() ? document.forms[sourceFormId.value] : null);\n\n    sourceForm = sourceForm.orElse(elem.parents(TAG_FORM))\n        .orElse(elem.querySelectorAll(TAG_FORM))\n        .orElse(DQ.querySelectorAll(TAG_FORM));\n\n    return sourceForm;\n}\n\nfunction resolveSourceElementId(context: Config, internalContext: Config): Optional<string> {\n    //?internal context?? used to be external one\n    return internalContext.getIf(CTX_PARAM_SRC_CTL_ID)\n        .orElseLazy(() => context.getIf(SOURCE, \"id\").value);\n}\n\n","/* Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {Config, DQ, XMLQuery} from \"../../ext/monadish\";\nimport {ResponseProcessor} from \"./ResponseProcessor\";\n\nimport {IResponseProcessor} from \"./IResponseProcessor\";\nimport {\n    CMD_ATTRIBUTES,\n    CMD_CHANGES,\n    CMD_DELETE,\n    CMD_ERROR,\n    CMD_EVAL,\n    CMD_EXTENSION,\n    CMD_INSERT,\n    CMD_REDIRECT,\n    CMD_UPDATE,\n    P_VIEWBODY,\n    P_VIEWHEAD,\n    P_VIEWROOT,\n    PARTIAL_ID,\n    RESP_PARTIAL,\n    RESPONSE_XML,\n    TAG_AFTER,\n    TAG_BEFORE\n} from \"../core/Const\";\nimport {resolveContexts, resolveResponseXML} from \"./ResonseDataResolver\";\n\n\nexport module Response {\n\n\n    /**\n     * Standardized jsf.js response\n     * this one is called straight from jsf.js.response\n     *\n     * The processing follows the spec by going for the responseXML\n     * and processing its tags\n     *\n     * @param {XMLHttpRequest} request (xhrRequest) - xhr request object\n     * @param {[key: string]: any} context (Map) - AJAX context\n     *\n     */\n    export function processResponse(request: XMLHttpRequest, context: { [key: string]: any }) {\n\n        let req = Config.fromNullable(request);\n        let {externalContext, internalContext} = resolveContexts(context);\n        let responseXML: XMLQuery = resolveResponseXML(req);\n        let responseProcessor = new ResponseProcessor(req, externalContext, internalContext);\n\n        internalContext.assign(RESPONSE_XML).value = responseXML;\n\n        //we now process the partial tags, or in none given raise an error\n        responseXML.querySelectorAll(RESP_PARTIAL)\n            .each(item => processPartialTag(<XMLQuery>item, responseProcessor, internalContext));\n\n        //we now process the viewstates and the evals deferred\n        //the reason for this is that often it is better\n        //to wait until the document has caught up before\n        //doing any evals even on embedded scripts\n        responseProcessor.fixViewStates();\n        responseProcessor.globalEval();\n\n        responseProcessor.done();\n    }\n\n    /**\n     * highest node partial-response from there the main operations are triggered\n     */\n     function processPartialTag(node: XMLQuery, responseProcessor: IResponseProcessor, internalContext) {\n\n        internalContext.assign(PARTIAL_ID).value = node.id;\n        const SEL_SUB_TAGS = [CMD_ERROR, CMD_REDIRECT, CMD_CHANGES].join(\",\");\n\n        //now we can process the main operations\n        node.getIf(SEL_SUB_TAGS).each((node: XMLQuery) => {\n            switch (node.tagName.value) {\n                case CMD_ERROR:\n                    responseProcessor.error(node);\n                    break;\n                case CMD_REDIRECT:\n                    responseProcessor.redirect(node);\n                    break;\n                case CMD_CHANGES:\n                    processChangesTag(node, responseProcessor);\n                    break;\n            }\n        });\n\n    }\n\n    let processInsert = function (responseProcessor: IResponseProcessor, node: XMLQuery) {\n         //path1 insert after as child tags\n         if(node.querySelectorAll([TAG_BEFORE, TAG_AFTER].join(\",\")).length) {\n             responseProcessor.insertWithSubtags(node);\n         } else { //insert before after with id\n             responseProcessor.insert(node);\n         }\n\n    };\n\n    /**\n     * next level changes tag\n     *\n     * @param node\n     * @param responseProcessor\n     */\n     function processChangesTag(node: XMLQuery, responseProcessor: IResponseProcessor): boolean {\n        const ALLOWED_TAGS = [CMD_UPDATE, CMD_EVAL, CMD_INSERT, CMD_DELETE, CMD_ATTRIBUTES, CMD_EXTENSION].join(\",\");\n        node.getIf(ALLOWED_TAGS).each(\n            (node: XMLQuery) => {\n                switch (node.tagName.value) {\n                    case CMD_UPDATE:\n                        processUpdateTag(node, responseProcessor);\n                        break;\n\n                    case CMD_EVAL:\n                        responseProcessor.eval(node);\n                        break;\n\n                    case CMD_INSERT:\n                        processInsert(responseProcessor, node);\n                        break;\n\n                    case CMD_DELETE:\n                        responseProcessor.delete(node);\n                        break;\n\n                    case CMD_ATTRIBUTES:\n                        responseProcessor.attributes(node);\n                        break;\n\n                    case CMD_EXTENSION:\n                        break;\n                }\n            }\n        );\n        return true;\n    }\n\n    /**\n     * branch tag update.. drill further down into the updates\n     * special case viewstate in that case it is a leaf\n     * and the viewstate must be processed\n     *\n     * @param node\n     * @param responseProcessor\n     */\n     function processUpdateTag(node: XMLQuery, responseProcessor: IResponseProcessor) {\n        if (!responseProcessor.processViewState(node)) {\n            handleElementUpdate(node, responseProcessor);\n        }\n    }\n\n    /**\n     * element update\n     *\n     * @param node\n     * @param responseProcessor\n     */\n     function handleElementUpdate(node: XMLQuery, responseProcessor: IResponseProcessor) {\n        let cdataBlock = node.cDATAAsString;\n        switch (node.id.value) {\n            case P_VIEWROOT :\n                responseProcessor.replaceViewRoot(DQ.fromMarkup(cdataBlock.substring(cdataBlock.indexOf(\"<html\"))));\n                break;\n\n            case P_VIEWHEAD:\n                responseProcessor.replaceHead(DQ.fromMarkup(cdataBlock));\n                break;\n\n            case P_VIEWBODY:\n                responseProcessor.replaceBody(DQ.fromMarkup(cdataBlock));\n                break;\n\n            default://htmlItem replacement\n                responseProcessor.update(node, cdataBlock);\n                break;\n\n        }\n    }\n}","/* Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {Config, DomQuery, DQ, Lang, Stream, XMLQuery} from \"../../ext/monadish\";\nimport {Implementation} from \"../AjaxImpl\";\nimport {Assertions} from \"../util/Assertions\";\nimport {IResponseProcessor} from \"./IResponseProcessor\";\nimport {ErrorData} from \"./ErrorData\";\nimport {ExtLang} from \"../util/Lang\";\n\nimport {ViewState} from \"../core/ImplTypes\";\nimport {EventData} from \"./EventData\";\nimport {\n    APPLIED_VST,\n    ATTR_ID,\n    ATTR_NAME,\n    ATTR_URL,\n    ATTR_VALUE,\n    EMPTY_FUNC,\n    EMPTY_STR,\n    ERROR_MESSAGE,\n    ERROR_NAME,\n    HTML_VIEWSTATE,\n    ON_ERROR,\n    ON_EVENT,\n    P_PARTIAL_SOURCE,\n    P_VIEWSTATE,\n    RESPONSE_XML,\n    SEL_SCRIPTS_STYLES,\n    SEL_VIEWSTATE_ELEM,\n    SOURCE,\n    SUCCESS,\n    TAG_AFTER,\n    TAG_ATTR,\n    TAG_BEFORE,\n    TAG_BODY,\n    TAG_FORM,\n    TAG_HEAD,\n    UPDATE_ELEMS,\n    UPDATE_FORMS\n} from \"../core/Const\";\nimport trim = Lang.trim;\nimport getLocalOrGlobalConfig = ExtLang.getLocalOrGlobalConfig;\n\n/**\n * Response processor\n *\n * Each  XML tag is either a node or a leaf\n * or both\n *\n * the processor provides a set of operations\n * which are executed on a single leaf node per operation\n * and present the core functionality of our response\n *\n * Note the response processor is stateful hence we bundle it in a class\n * to reduce code we keep references tot contexts in place\n */\nexport class ResponseProcessor implements IResponseProcessor {\n\n    constructor(private request: Config, private externalContext: Config, private internalContext: Config) {\n\n    }\n\n    replaceHead(shadowDocument: XMLQuery | DQ) {\n        let shadowHead = shadowDocument.querySelectorAll(TAG_HEAD);\n        if (!shadowHead.isPresent()) {\n            return;\n        }\n\n        let oldHead = DQ.querySelectorAll(TAG_HEAD);\n\n        //delete all to avoid script and style overlays\n        oldHead.querySelectorAll(SEL_SCRIPTS_STYLES).delete();\n\n        this.storeForEval(shadowHead);\n    }\n\n    /**\n     * replaces the body in the expected manner\n     * which means the entire body content is refreshed\n     * however also the body attributes must be transferred\n     * keeping event handlers etc... in place\n     *\n     * @param shadowDocument .. an incoming shadow document hosting the new nodes\n     */\n    replaceBody(shadowDocument: XMLQuery | DQ) {\n\n        let shadowBody = shadowDocument.querySelectorAll(TAG_BODY);\n        if (!shadowBody.isPresent()) {\n            return;\n        }\n\n        let shadowInnerHTML: string = <string>shadowBody.html().value;\n\n        let resultingBody = <DQ>DQ.querySelectorAll(TAG_BODY).html(shadowInnerHTML);\n        let updateForms = resultingBody.querySelectorAll(TAG_FORM);\n\n        resultingBody.copyAttrs(shadowBody);\n\n        this.storeForPostProcessing(updateForms, resultingBody);\n    }\n\n    /**\n     * Leaf Tag eval... process whatever is in the evals cdata block\n     *\n     * @param node the node to eval\n     */\n    eval(node: XMLQuery) {\n        DQ.globalEval(node.cDATAAsString);\n    }\n\n    /**\n     * processes an incoming error from the response\n     * which is hosted under the &lt;error&gt; tag\n     * @param node the node hosting the error in our response xml\n     * @param node the node in the xml hosting the error message\n     */\n    error(node: XMLQuery) {\n        /**\n         * <error>\n         *      <error-name>String</error-name>\n         *      <error-message><![CDATA[message]]></error-message>\n         * <error>\n         */\n\n        let mergedErrorData = new Config({});\n        mergedErrorData.assign(SOURCE).value = this.externalContext.getIf(P_PARTIAL_SOURCE).get(0).value;\n        mergedErrorData.assign(ERROR_NAME).value = node.getIf(ERROR_NAME).textContent(EMPTY_STR);\n        mergedErrorData.assign(ERROR_MESSAGE).value = node.getIf(ERROR_MESSAGE).cDATAAsString;\n\n        let hasResponseXML = this.internalContext.get(RESPONSE_XML).isPresent();\n        mergedErrorData.assignIf(hasResponseXML, RESPONSE_XML).value = this.internalContext.getIf(RESPONSE_XML).value.get(0).value;\n\n        let errorData = ErrorData.fromServerError(mergedErrorData);\n\n        this.externalContext.getIf(ON_ERROR).orElse(this.internalContext.getIf(ON_ERROR).value).orElse(EMPTY_FUNC).value(errorData);\n        Implementation.sendError(errorData);\n    }\n\n    /**\n     * process the redirect operation\n     *\n     * @param node\n     */\n    redirect(node: XMLQuery) {\n        Assertions.assertUrlExists(node);\n\n        let redirectUrl = trim(node.attr(ATTR_URL).value);\n        if (redirectUrl != EMPTY_STR) {\n            (<any>window).location.href = redirectUrl;\n        }\n    }\n\n    /**\n     * processes the update operation and updates the node with the cdata block\n     * @param node the xml response node hosting the update info\n     * @param cdataBlock the cdata block with the new html code\n     */\n    update(node: XMLQuery, cdataBlock: string) {\n        let result = DQ.byId(node.id.value).outerHTML(cdataBlock, false, false);\n        let sourceForm = result?.parents(TAG_FORM).orElse(result.byTagName(TAG_FORM, true));\n        if (sourceForm) {\n            this.storeForPostProcessing(sourceForm, result);\n        }\n    }\n\n    delete(node: XMLQuery) {\n        DQ.byId(node.id.value).delete();\n    }\n\n    /**\n     * attributes leaf tag... process the attributes\n     *\n     * @param node\n     */\n    attributes(node: XMLQuery) {\n        let elem = DQ.byId(node.id.value);\n\n        node.byTagName(TAG_ATTR).each((item: XMLQuery) => {\n            elem.attr(item.attr(ATTR_NAME).value).value = item.attr(ATTR_VALUE).value;\n        });\n    }\n\n    /**\n     * @param shadowDocument a shadow document which is needed for further processing\n     */\n    replaceViewRoot(shadowDocument: XMLQuery) {\n        this.replaceHead(shadowDocument);\n        this.replaceBody(shadowDocument);\n    }\n\n    /**\n     * insert handling, either before or after\n     *\n     * @param node\n     */\n    insert(node: XMLQuery) {\n        //let insertId = node.id; //not used atm\n\n        let before = node.attr(TAG_BEFORE);\n        let after = node.attr(TAG_AFTER);\n\n        let insertNodes = DQ.fromMarkup(<any>node.cDATAAsString);\n\n        if (before.isPresent()) {\n            DQ.byId(before.value).insertBefore(insertNodes);\n            this.internalContext.assign(UPDATE_ELEMS).value.push(insertNodes);\n        }\n        if (after.isPresent()) {\n            let domQuery = DQ.byId(after.value);\n            domQuery.insertAfter(insertNodes);\n\n            this.internalContext.assign(UPDATE_ELEMS).value.push(insertNodes);\n        }\n    }\n\n    /**\n     * handler for the case &lt;insert <&lt; before id=\"...\n     *\n     * @param node the node hosting the insert data\n     */\n    insertWithSubtags(node: XMLQuery) {\n        let before = node.querySelectorAll(TAG_BEFORE);\n        let after = node.querySelectorAll(TAG_AFTER);\n\n        before.each(item => {\n            let insertId = item.attr(ATTR_ID);\n            let insertNodes = DQ.fromMarkup(<any>item.cDATAAsString);\n            if (insertId.isPresent()) {\n                DQ.byId(insertId.value).insertBefore(insertNodes);\n                this.internalContext.assign(UPDATE_ELEMS).value.push(insertNodes);\n            }\n        });\n\n        after.each(item => {\n            let insertId = item.attr(ATTR_ID);\n            let insertNodes = DQ.fromMarkup(<any>item.cDATAAsString);\n            if (insertId.isPresent()) {\n                DQ.byId(insertId.value).insertAfter(insertNodes);\n                this.internalContext.assign(UPDATE_ELEMS).value.push(insertNodes);\n            }\n        });\n    }\n\n    /**\n     * process the viewState update, update the affected\n     * forms with their respective new viewstate values\n     *\n     */\n    processViewState(node: XMLQuery): boolean {\n        if (ResponseProcessor.isViewStateNode(node)) {\n            let viewStateValue = node.cDATAAsString;\n            this.internalContext.assign(APPLIED_VST, node.id.value).value = new ViewState(node.id.value, viewStateValue);\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * generic global eval which runs the embedded css and scripts\n     */\n    globalEval() {\n        let updateElems = new DQ(...this.internalContext.getIf(UPDATE_ELEMS).value);\n        updateElems.runCss();\n        updateElems.runScripts();\n    }\n\n    /**\n     * post processing viewstate fixing\n     */\n    fixViewStates() {\n        Stream.ofAssoc<ViewState>(this.internalContext.getIf(APPLIED_VST).orElse({}).value)\n            .each((item: Array<any>) => {\n                let value: ViewState =item[1];\n                let nameSpace = DQ.byId(value.nameSpace).orElse(document.body);\n                let affectedForms = nameSpace.byTagName(TAG_FORM);\n                let affectedForms2 = nameSpace.filter(item => item.tagName.orElse(EMPTY_STR).value.toLowerCase() == TAG_FORM);\n\n\n                this.appendViewStateToForms(new DomQuery(affectedForms, affectedForms2), value.value);\n            });\n    }\n\n    /**\n     * all processing done we can close the request and send the appropriate events\n     */\n    done() {\n        let eventData = EventData.createFromRequest(this.request.value, this.externalContext, SUCCESS);\n\n        //because some frameworks might decorate them over the context in the response\n        let eventHandler = this.externalContext.getIf(ON_EVENT).orElse(this.internalContext.getIf(ON_EVENT).value).orElse(EMPTY_FUNC).value;\n        Implementation.sendEvent(eventData, eventHandler);\n    }\n\n    /**\n     * proper viewstate -> form assignment\n     *\n     * @param forms the forms to append the viewstate to\n     * @param viewState the final viewstate\n     */\n    private appendViewStateToForms(forms: DQ, viewState: string) {\n        forms.each((form: DQ) => {\n            let viewStateElems = form.querySelectorAll(SEL_VIEWSTATE_ELEM)\n                .orElseLazy(() => ResponseProcessor.newViewStateElement(form));\n\n            viewStateElems.attr(\"value\").value = viewState;\n        });\n    }\n\n    /**\n     * Helper to Create a new JSF ViewState Element\n     *\n     * @param parent, the parent node to attach the viewstate element to\n     * (usually a form node)\n     */\n    private static newViewStateElement(parent: DQ): DQ {\n        let newViewState = DQ.fromMarkup(HTML_VIEWSTATE);\n        newViewState.appendTo(parent);\n        return newViewState;\n    }\n\n    /**\n     * Stores certain aspects of the dom for later post processing\n     *\n     * @param updateForms the update forms which should receive standardized internal jsf data\n     * @param toBeEvaled the resulting elements which should be evaled\n     */\n    private storeForPostProcessing(updateForms: DQ, toBeEvaled: DQ) {\n        this.storeForUpdate(updateForms);\n        this.storeForEval(toBeEvaled);\n    }\n\n    /**\n     * helper to store a given form for the update post processing (viewstate)\n     *\n     * @param updateForms the dom query object pointing to the forms which need to be updated\n     */\n    private storeForUpdate(updateForms: DQ) {\n        this.internalContext.assign(UPDATE_FORMS).value.push(updateForms);\n    }\n\n    /**\n     * same for eval (js and css)\n     *\n     * @param toBeEvaled\n     */\n    private storeForEval(toBeEvaled: DQ) {\n        this.internalContext.assign(UPDATE_ELEMS).value.push(toBeEvaled);\n    }\n\n    /**\n     * check whether a given XMLQuery node is an explicit viewstate node\n     *\n     * @param node the node to check\n     * @returns true of it ii\n     */\n    private static isViewStateNode(node: XMLQuery): boolean {\n        let separatorChar = (<any>window).jsf.separatorchar;\n        return \"undefined\" != typeof node?.id?.value && (node?.id?.value == P_VIEWSTATE ||\n            node?.id?.value?.indexOf([separatorChar, P_VIEWSTATE].join(EMPTY_STR)) != -1 ||\n            node?.id?.value?.indexOf([P_VIEWSTATE, separatorChar].join(EMPTY_STR)) != -1);\n    }\n\n}","/* Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {Config, Lang} from \"../../ext/monadish\";\n\nimport {Stream} from \"../../ext/monadish\";\nimport {DQ} from \"../../ext/monadish\";\nimport isString = Lang.isString;\nimport {EMPTY_STR, P_VIEWSTATE} from \"../core/Const\";\n\n\n/**\n * A unified form data class\n * which builds upon our configuration.\n *\n * We cannot use standard html5 forms everywhere\n * due to api constraints on the HTML Form object in IE11\n * and due to the url encoding constraint given by the jsf.js spec\n */\nexport class XhrFormData extends Config {\n\n    /**\n     * data collector from a given form\n     *\n     * @param dataSource either a form as DomQuery object or an encoded url string\n     * @param partialIdsArray partial ids to collect, to reduce the data sent down\n     */\n    constructor(private dataSource: DQ | string, private partialIdsArray?: string[], private encode = true) {\n        super({});\n        //a call to getViewState before must pass the encoded line\n        //a call from getViewState passes the form element as datasource\n        //so we have two call points\n        if (isString(dataSource)) {\n            this.assignEncodedString(<string>this.dataSource);\n        } else {\n            this.handleFormSource();\n        }\n    }\n\n    private handleFormSource() {\n        //encode and append the issuing item if not a partial ids array of ids is passed\n        /*\n         * Spec. 13.3.1\n         * Collect and encode input elements.\n         * Additionally the hidden element javax.faces.ViewState\n         * Enhancement partial page submit\n         *\n         */\n        this.encodeSubmittableFields(this, <DQ>this.dataSource, this.partialIdsArray);\n\n        if (this.getIf(P_VIEWSTATE).isPresent()) {\n            return;\n        }\n\n        this.applyViewState(<DQ>this.dataSource);\n    }\n\n    /**\n     * special case viewstate handling\n     *\n     * @param form the form holding the viewstate value\n     */\n    private applyViewState(form: DQ) {\n        let viewState = form.byId(P_VIEWSTATE).inputValue;\n        this.assignIf(viewState.isPresent() ,P_VIEWSTATE).value = viewState.value;\n    }\n\n    /**\n     * assignes a url encoded string to this xhrFormData object\n     * as key value entry\n     * @param encoded\n     */\n    assignEncodedString(encoded: string) {\n        let keyValueEntries = encoded.split(/&/gi);\n        Stream.of(...keyValueEntries)\n            //split only the first =\n            .map(line => line.split(/=(.*)/gi))\n            //special case of having keys without values\n            .map(keyVal => keyVal.length < 3 ? [keyVal?.[0] ?? [], keyVal?.[1] ?? []] : keyVal)\n            .each(keyVal => {\n                this.assign(keyVal [0]).value = keyVal?.splice(1)?.join(\"\") ?? \"\";\n            });\n    }\n\n    // noinspection JSUnusedGlobalSymbols\n    /**\n     * @returns a Form data representation\n     */\n    toFormData(): FormData {\n        let ret: any = new FormData();\n        for (let key in this.value) {\n            if (this.value.hasOwnProperty(key)) {\n                ret.append(key, this.value[key])\n            }\n        }\n        return ret;\n    }\n\n    /**\n     * returns an encoded string representation of our xhr form data\n     *\n     * @param defaultStr optional default value if nothing is there to encode\n     */\n    toString(defaultStr = EMPTY_STR): string {\n        if (this.isAbsent()) {\n            return defaultStr;\n        }\n        let entries = [];\n        for (let key in this.value) {\n            if (this.value.hasOwnProperty(key)) {\n                //key value already encoded so no need to reencode them again\n                entries.push(`${encodeURIComponent(key)}=${encodeURIComponent(this.value[key])}`)\n            }\n        }\n        return entries.join(\"&\")\n    }\n\n    /**\n     * determines fields to submit\n     * @param {Object} targetBuf - the target form buffer receiving the data\n     * @param {Node} parentItem - form element item is nested in\n     * @param {Array} partialIds - ids fo PPS\n     */\n    private encodeSubmittableFields(targetBuf: Config,\n                                    parentItem: DQ, partialIds ?: string[]) {\n        let toEncode = null;\n        if (this.partialIdsArray && this.partialIdsArray.length) {\n            //in case of our myfaces reduced ppr we only\n            //only submit the partials\n            this._value = {};\n            toEncode = new DQ(...this.partialIdsArray);\n\n        } else {\n            if (parentItem.isAbsent()) throw \"NO_PARITEM\";\n            toEncode = parentItem;\n        }\n\n        //lets encode the form elements\n        this.shallowMerge(toEncode.querySelectorAll(\"input, checkbox, select, textarea\").encodeFormElement());\n    }\n\n    /**\n     * checks if the given datasource is a multipart request source\n     */\n    get isMultipartRequest(): boolean {\n        return  this.dataSource instanceof DQ && (<DQ> this.dataSource).querySelectorAll(\"input[type='file']\").isPresent();\n    }\n\n}","/* Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {AsyncRunnable} from \"../util/AsyncRunnable\";\nimport {Config, DQ, Stream} from \"../../ext/monadish\";\nimport {Implementation} from \"../AjaxImpl\";\n\nimport {XhrFormData} from \"./XhrFormData\";\nimport {ErrorData} from \"./ErrorData\";\nimport {EventData} from \"./EventData\";\nimport {ExtLang} from \"../util/Lang\";\nimport {\n    BEGIN,\n    COMPLETE,\n    CONTENT_TYPE,\n    CTX_PARAM_MF_INTERNAL,\n    CTX_PARAM_PASS_THR,\n    ERROR,\n    HEAD_FACES_REQ,\n    MALFORMEDXML,\n    MULTIPART,\n    NO_TIMEOUT,\n    ON_ERROR,\n    ON_EVENT,\n    REQ_ACCEPT,\n    REQ_TYPE_GET,\n    REQ_TYPE_POST,\n    STATE_EVT_TIMEOUT,\n    STD_ACCEPT,\n    URL_ENCODED,\n    VAL_AJAX\n} from \"../core/Const\";\nimport {resolveFinalUrl, resolveHandlerFunc} from \"./RequestDataResolver\";\nimport failSaveExecute = ExtLang.failSaveExecute;\n\n/**\n * JSFed XHR Request Wrapper\n * as Asyncrunnable for our Asynchronous queue\n *\n * The idea is that we basically just enqueue\n * a single ajax request into our queue\n * and let the queue do the processing.\n *\n */\n\ndeclare let jsf: any;\n\n\n\nexport class XhrRequest implements AsyncRunnable<XMLHttpRequest> {\n\n    private responseContext: Config;\n\n    private stopProgress = false;\n\n    /**\n     * helper support so that we do not have to drag in Promise shims\n     */\n    private catchFuncs: Array<Function> = [];\n    private  thenFunc: Array<Function> = [];\n\n    /**\n     * Reqired Parameters\n     *\n     * @param source the issuing element\n     * @param sourceForm the form which is related to the issuing element\n     * @param requestContext the request context with allö pass through values\n     *\n     * Optional Parameters\n     *\n     * @param partialIdsArray an optional restricting partial ids array for encoding\n     * @param timeout optional xhr timeout\n     * @param ajaxType optional request type, default \"POST\"\n     * @param contentType optional content type, default \"application/x-www-form-urlencoded\"\n     * @param xhrObject optional xhr object which must fullfill the XMLHTTPRequest api, default XMLHttpRequest\n     */\n    constructor(\n        private source: DQ,\n        private sourceForm: DQ,\n        private requestContext: Config,\n        private internalContext: Config,\n        private partialIdsArray = [],\n        private timeout = NO_TIMEOUT,\n        private ajaxType = REQ_TYPE_POST,\n        private contentType = URL_ENCODED,\n        private xhrObject = new XMLHttpRequest()\n    ) {\n        /*\n        * we omit promises here\n        * some browsers do not support it and we do not need shim code\n        */\n        this.registerXhrCallbacks((data: any) => {this.resolve(data)}, (data: any) => {this.reject(data)});\n    }\n\n    start(): AsyncRunnable<XMLHttpRequest> {\n\n        let ignoreErr = failSaveExecute;\n        let xhrObject = this.xhrObject;\n\n        try {\n\n            let viewState = jsf.getViewState(this.sourceForm.getAsElem(0).value);\n            //encoded we need to decode\n            let formData: XhrFormData = new XhrFormData(decodeURIComponent(viewState));\n\n            this.contentType = formData.isMultipartRequest ? MULTIPART : this.contentType;\n\n            //next step the pass through parameters are merged in for post params\n            let requestContext = this.requestContext;\n            let passThroughParams = requestContext.getIf(CTX_PARAM_PASS_THR);\n            formData.shallowMerge(passThroughParams);\n\n            this.responseContext = passThroughParams.deepCopy;\n\n            //we have to shift the internal passthroughs around to build up our response context\n            let responseContext = this.responseContext;\n\n            responseContext.assign(CTX_PARAM_MF_INTERNAL).value = this.internalContext.value;\n\n            //per spec the onevent and onerrors must be passed through to the response\n            responseContext.assign(ON_EVENT).value = requestContext.getIf(ON_EVENT).value;\n            responseContext.assign(ON_ERROR).value = requestContext.getIf(ON_ERROR).value;\n\n            xhrObject.open(this.ajaxType, resolveFinalUrl(this.sourceForm, formData, this.ajaxType), true);\n\n            //adding timeout\n            this.timeout ? xhrObject.timeout = this.timeout : null;\n\n            //a bug in the xhr stub library prevents the setRequestHeader to be properly executed on fake xhr objects\n            //normal browsers should resolve this\n            //tests can quietly fail on this one\n\n            ignoreErr(() => xhrObject.setRequestHeader(CONTENT_TYPE, `${this.contentType}; charset=utf-8`));\n            ignoreErr(() => xhrObject.setRequestHeader(HEAD_FACES_REQ, VAL_AJAX));\n\n            //probably not needed anymore, will test this\n            //some webkit based mobile browsers do not follow the w3c spec of\n            // setting the accept headers automatically\n            ignoreErr(() => xhrObject.setRequestHeader(REQ_ACCEPT, STD_ACCEPT));\n\n            this.sendEvent(BEGIN);\n\n            this.sendRequest(formData);\n\n        } catch (e) {\n            //_onError//_onError\n            this.handleError(e);\n        }\n        return this;\n    }\n\n    cancel() {\n        try {\n            this.xhrObject.abort();\n        } catch (e) {\n            this.handleError(e);\n        }\n    }\n\n    resolve(data: any) {\n        Stream.of(...this.thenFunc).reduce((inputVal: any, thenFunc: any) => {\n            return thenFunc(inputVal);\n        }, data);\n    }\n\n    reject(data: any) {\n        Stream.of(...this.catchFuncs).reduce((inputVal: any, catchFunc: any) => {\n            return catchFunc(inputVal);\n        }, data);\n    }\n\n\n    catch(func: (data: any) => any): AsyncRunnable<XMLHttpRequest> {\n        //this.$promise.catch(func);\n        this.catchFuncs.push(func);\n        return this;\n    }\n\n    finally(func: () => void): AsyncRunnable<XMLHttpRequest> {\n        //no ie11 support we probably are going to revert to shims for that one\n        //(<any>this.$promise).then(func).catch(func);\n        this.catchFuncs.push(func);\n        this.thenFunc.push(func);\n        return this;\n    }\n\n    then(func: (data: any) => any): AsyncRunnable<XMLHttpRequest> {\n        //this.$promise.then(func);\n        this.thenFunc.push(func);\n        return this;\n    }\n\n    /**\n     * attaches the internal event and processing\n     * callback within the promise to our xhr object\n     *\n     * @param resolve\n     * @param reject\n     */\n    protected registerXhrCallbacks(resolve: Consumer<any>, reject: Consumer<any>) {\n        let xhrObject = this.xhrObject;\n\n        xhrObject.onabort = () => {\n            this.onAbort(resolve, reject);\n        };\n        xhrObject.ontimeout = () => {\n            this.onTimeout(resolve, reject);\n        };\n        xhrObject.onload = () => {\n            this.onSuccess(this.xhrObject, resolve, reject)\n        };\n        xhrObject.onloadend = () => {\n            this.onDone(this.xhrObject, resolve, reject);\n        };\n        xhrObject.onerror = (errorData: any) => {\n            this.onError(errorData, resolve, reject);\n        };\n    }\n\n    /*\n     * xhr processing callbacks\n     *\n     * Those methods are the callbacks called by\n     * the xhr object depending on its own state\n     */\n\n    protected onAbort(resolve: Consumer<any>, reject: Consumer<any>) {\n        reject();\n    }\n\n    protected onTimeout(resolve: Consumer<any>, reject: Consumer<any>) {\n        this.sendEvent(STATE_EVT_TIMEOUT);\n        reject();\n    }\n\n    protected onSuccess(data: any, resolve: Consumer<any>, reject: Consumer<any>) {\n\n        this.sendEvent(COMPLETE);\n\n        //malforms always result in empty response xml\n        if(!this?.xhrObject?.responseXML) {\n            this.handleMalFormedXML(resolve);\n            return;\n        }\n\n        jsf.ajax.response(this.xhrObject, this.responseContext.value ?? {});\n    }\n\n    private handleMalFormedXML(resolve: Function) {\n        this.stopProgress = true;\n        let errorData = {\n            type: ERROR,\n            status: MALFORMEDXML,\n            responseCode: 200,\n            responseText: this.xhrObject?.responseText,\n            source: {\n                id: this.source.id.value\n            }\n        };\n        try {\n            Implementation.sendError(<any>errorData);\n        } finally {\n            resolve(errorData);\n        }\n        //non blocking non clearing\n    }\n\n    protected onDone(data: any, resolve: Consumer<any>, reject: Consumer<any>) {\n        if(this.stopProgress) {\n            return;\n        }\n        resolve(data);\n    }\n\n    protected onError(errorData: any, resolve: Consumer<any>, reject: Consumer<any>) {\n        this.handleError(errorData);\n        reject();\n    }\n\n    /*\n     * other helpers\n     */\n    private sendEvent(evtType: string) {\n        let eventData = EventData.createFromRequest(this.xhrObject, this.requestContext, evtType);\n        try {\n            //user code error, we might cover\n            //this in onError but also we cannot swallow it\n            //we need to resolve the local handlers lazyly,\n            //because some frameworks might decorate them over the context in the response\n            let eventHandler = resolveHandlerFunc(this.requestContext, this.responseContext, ON_EVENT);;\n            Implementation.sendEvent(eventData,  eventHandler);\n        } catch (e) {\n            this.handleError(e);\n            throw e;\n        }\n    }\n\n    private handleError(exception) {\n        let errorData = ErrorData.fromClient(exception);\n\n        let eventHandler = resolveHandlerFunc(this.requestContext, this.responseContext, ON_ERROR);\n        Implementation.sendError(errorData, eventHandler);\n    }\n\n\n\n    protected sendRequest(formData: XhrFormData) {\n        let isPost = this.ajaxType != REQ_TYPE_GET;\n        if(formData.isMultipartRequest) {\n            this.xhrObject.send((isPost) ? formData.toFormData() : null);\n        } else {\n            this.xhrObject.send((isPost) ? formData.toString() : null);\n        }\n    }\n\n}"],"sourceRoot":""}