HEX
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/8.0.30
System: Linux multiplicar 3.10.0-1160.102.1.el7.x86_64 #1 SMP Tue Oct 17 15:42:21 UTC 2023 x86_64
User: root (0)
PHP: 8.0.30
Disabled: NONE
Upload Files
File: /var/www/html/ceade.tocsa.com.py/user/amd/build/participantsfilter.min.js.map
{"version":3,"file":"participantsfilter.min.js","sources":["../src/participantsfilter.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Participants filter managemnet.\n *\n * @module     core_user/participants_filter\n * @copyright  2020 Andrew Nicols <andrew@nicols.co.uk>\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport CourseFilter from './local/participantsfilter/filtertypes/courseid';\nimport * as DynamicTable from 'core_table/dynamic';\nimport GenericFilter from './local/participantsfilter/filter';\nimport {get_strings as getStrings} from 'core/str';\nimport Notification from 'core/notification';\nimport Pending from 'core/pending';\nimport Selectors from './local/participantsfilter/selectors';\nimport Templates from 'core/templates';\nimport CustomEvents from 'core/custom_interaction_events';\nimport jQuery from 'jquery';\n\n/**\n * Initialise the participants filter on the element with the given id.\n *\n * @param {String} participantsRegionId\n */\nexport const init = participantsRegionId => {\n    // Keep a reference to the filterset.\n    const filterSet = document.querySelector(`#${participantsRegionId}`);\n\n    // Keep a reference to all of the active filters.\n    const activeFilters = {\n        courseid: new CourseFilter('courseid', filterSet),\n    };\n\n    /**\n     * Get the filter list region.\n     *\n     * @return {HTMLElement}\n     */\n    const getFilterRegion = () => filterSet.querySelector(Selectors.filterset.regions.filterlist);\n\n    /**\n     * Add an unselected filter row.\n     *\n     * @return {Promise}\n     */\n    const addFilterRow = () => {\n        const pendingPromise = new Pending('core_user/participantsfilter:addFilterRow');\n\n        const rownum = 1 + getFilterRegion().querySelectorAll(Selectors.filter.region).length;\n        return Templates.renderForPromise('core_user/local/participantsfilter/filterrow', {\"rownumber\": rownum})\n        .then(({html, js}) => {\n            const newContentNodes = Templates.appendNodeContents(getFilterRegion(), html, js);\n\n            return newContentNodes;\n        })\n        .then(filterRow => {\n            // Note: This is a nasty hack.\n            // We should try to find a better way of doing this.\n            // We do not have the list of types in a readily consumable format, so we take the pre-rendered one and copy\n            // it in place.\n            const typeList = filterSet.querySelector(Selectors.data.typeList);\n\n            filterRow.forEach(contentNode => {\n                const contentTypeList = contentNode.querySelector(Selectors.filter.fields.type);\n\n                if (contentTypeList) {\n                    contentTypeList.innerHTML = typeList.innerHTML;\n                }\n            });\n\n            return filterRow;\n        })\n        .then(filterRow => {\n            updateFiltersOptions();\n\n            return filterRow;\n        })\n        .then(result => {\n            pendingPromise.resolve();\n\n            return result;\n        })\n        .catch(Notification.exception);\n    };\n\n    /**\n     * Get the filter data source node fro the specified filter type.\n     *\n     * @param {String} filterType\n     * @return {HTMLElement}\n     */\n    const getFilterDataSource = filterType => {\n        const filterDataNode = filterSet.querySelector(Selectors.filterset.regions.datasource);\n\n        return filterDataNode.querySelector(Selectors.data.fields.byName(filterType));\n    };\n\n    /**\n     * Add a filter to the list of active filters, performing any necessary setup.\n     *\n     * @param {HTMLElement} filterRow\n     * @param {String} filterType\n     * @param {Array} initialFilterValues The initially selected values for the filter\n     * @returns {Filter}\n     */\n    const addFilter = async(filterRow, filterType, initialFilterValues) => {\n        // Name the filter on the filter row.\n        filterRow.dataset.filterType = filterType;\n\n        const filterDataNode = getFilterDataSource(filterType);\n\n        // Instantiate the Filter class.\n        let Filter = GenericFilter;\n        if (filterDataNode?.dataset.filterTypeClass) {\n            Filter = await import(filterDataNode.dataset.filterTypeClass);\n        }\n        activeFilters[filterType] = new Filter(filterType, filterSet, initialFilterValues);\n\n        // Disable the select.\n        const typeField = filterRow.querySelector(Selectors.filter.fields.type);\n        typeField.value = filterType;\n        typeField.disabled = 'disabled';\n\n        // Update the list of available filter types.\n        updateFiltersOptions();\n\n        return activeFilters[filterType];\n    };\n\n    /**\n     * Get the registered filter class for the named filter.\n     *\n     * @param {String} name\n     * @return {Object} See the Filter class.\n     */\n    const getFilterObject = name => {\n        return activeFilters[name];\n    };\n\n    /**\n     * Remove or replace the specified filter row and associated class, ensuring that if there is only one filter row,\n     * that it is replaced instead of being removed.\n     *\n     * @param {HTMLElement} filterRow\n     * @param {Bool} refreshContent Whether to refresh the table content when removing\n     */\n    const removeOrReplaceFilterRow = (filterRow, refreshContent) => {\n        const filterCount = getFilterRegion().querySelectorAll(Selectors.filter.region).length;\n\n        if (filterCount === 1) {\n            replaceFilterRow(filterRow, refreshContent);\n        } else {\n            removeFilterRow(filterRow, refreshContent);\n        }\n    };\n\n    /**\n     * Remove the specified filter row and associated class.\n     *\n     * @param {HTMLElement} filterRow\n     * @param {Bool} refreshContent Whether to refresh the table content when removing\n     */\n    const removeFilterRow = async(filterRow, refreshContent = true) => {\n        const filterType = filterRow.querySelector(Selectors.filter.fields.type);\n        const hasFilterValue = !!filterType.value;\n\n        // Remove the filter object.\n        removeFilterObject(filterRow.dataset.filterType);\n\n        // Remove the actual filter HTML.\n        filterRow.remove();\n\n        // Update the list of available filter types.\n        updateFiltersOptions();\n\n        if (hasFilterValue && refreshContent) {\n            // Refresh the table if there was any content in this row.\n            updateTableFromFilter();\n        }\n\n        // Update filter fieldset legends.\n        const filterLegends = await getAvailableFilterLegends();\n\n        getFilterRegion().querySelectorAll(Selectors.filter.region).forEach((filterRow, index) => {\n            filterRow.querySelector('legend').innerText = filterLegends[index];\n        });\n\n    };\n\n    /**\n     * Replace the specified filter row with a new one.\n     *\n     * @param {HTMLElement} filterRow\n     * @param {Bool} refreshContent Whether to refresh the table content when removing\n     * @param {Number} rowNum The number used to label the filter fieldset legend (eg Row 1). Defaults to 1 (the first filter).\n     * @return {Promise}\n     */\n    const replaceFilterRow = (filterRow, refreshContent = true, rowNum = 1) => {\n        // Remove the filter object.\n        removeFilterObject(filterRow.dataset.filterType);\n\n        return Templates.renderForPromise('core_user/local/participantsfilter/filterrow', {\"rownumber\": rowNum})\n        .then(({html, js}) => {\n            const newContentNodes = Templates.replaceNode(filterRow, html, js);\n\n            return newContentNodes;\n        })\n        .then(filterRow => {\n            // Note: This is a nasty hack.\n            // We should try to find a better way of doing this.\n            // We do not have the list of types in a readily consumable format, so we take the pre-rendered one and copy\n            // it in place.\n            const typeList = filterSet.querySelector(Selectors.data.typeList);\n\n            filterRow.forEach(contentNode => {\n                const contentTypeList = contentNode.querySelector(Selectors.filter.fields.type);\n\n                if (contentTypeList) {\n                    contentTypeList.innerHTML = typeList.innerHTML;\n                }\n            });\n\n            return filterRow;\n        })\n        .then(filterRow => {\n            updateFiltersOptions();\n\n            return filterRow;\n        })\n        .then(filterRow => {\n            // Refresh the table.\n            if (refreshContent) {\n                return updateTableFromFilter();\n            } else {\n                return filterRow;\n            }\n        })\n        .catch(Notification.exception);\n    };\n\n    /**\n     * Remove the Filter Object from the register.\n     *\n     * @param {string} filterName The name of the filter to be removed\n     */\n    const removeFilterObject = filterName => {\n        if (filterName) {\n            const filter = getFilterObject(filterName);\n            if (filter) {\n                filter.tearDown();\n\n                // Remove from the list of active filters.\n                delete activeFilters[filterName];\n            }\n        }\n    };\n\n    /**\n     * Remove all filters.\n     *\n     * @returns {Promise}\n     */\n    const removeAllFilters = () => {\n        const pendingPromise = new Pending('core_user/participantsfilter:setFilterFromConfig');\n\n        const filters = getFilterRegion().querySelectorAll(Selectors.filter.region);\n        filters.forEach(filterRow => removeOrReplaceFilterRow(filterRow, false));\n\n        // Refresh the table.\n        return updateTableFromFilter()\n        .then(result => {\n            pendingPromise.resolve();\n\n            return result;\n        });\n    };\n\n    /**\n     * Remove any empty filters.\n     */\n    const removeEmptyFilters = () => {\n        const filters = getFilterRegion().querySelectorAll(Selectors.filter.region);\n        filters.forEach(filterRow => {\n            const filterType = filterRow.querySelector(Selectors.filter.fields.type);\n            if (!filterType.value) {\n                removeOrReplaceFilterRow(filterRow, false);\n            }\n        });\n    };\n\n    /**\n     * Update the list of filter types to filter out those already selected.\n     */\n    const updateFiltersOptions = () => {\n        const filters = getFilterRegion().querySelectorAll(Selectors.filter.region);\n        filters.forEach(filterRow => {\n            const options = filterRow.querySelectorAll(Selectors.filter.fields.type + ' option');\n            options.forEach(option => {\n                if (option.value === filterRow.dataset.filterType) {\n                    option.classList.remove('hidden');\n                    option.disabled = false;\n                } else if (activeFilters[option.value]) {\n                    option.classList.add('hidden');\n                    option.disabled = true;\n                } else {\n                    option.classList.remove('hidden');\n                    option.disabled = false;\n                }\n            });\n        });\n\n        // Configure the state of the \"Add row\" button.\n        // This button is disabled when there is a filter row available for each condition.\n        const addRowButton = filterSet.querySelector(Selectors.filterset.actions.addRow);\n        const filterDataNode = filterSet.querySelectorAll(Selectors.data.fields.all);\n        if (filterDataNode.length <= filters.length) {\n            addRowButton.setAttribute('disabled', 'disabled');\n        } else {\n            addRowButton.removeAttribute('disabled');\n        }\n\n        if (filters.length === 1) {\n            filterSet.querySelector(Selectors.filterset.regions.filtermatch).classList.add('hidden');\n            filterSet.querySelector(Selectors.filterset.fields.join).value = 2;\n            filterSet.dataset.filterverb = 2;\n        } else {\n            filterSet.querySelector(Selectors.filterset.regions.filtermatch).classList.remove('hidden');\n        }\n    };\n\n    /**\n     * Set the current filter options based on a provided configuration.\n     *\n     * @param {Object} config\n     * @param {Number} config.jointype\n     * @param {Object} config.filters\n     * @returns {Promise}\n     */\n    const setFilterFromConfig = config => {\n        const filterConfig = Object.entries(config.filters);\n\n        if (!filterConfig.length) {\n            // There are no filters to set from.\n            return Promise.resolve();\n        }\n\n        // Set the main join type.\n        filterSet.querySelector(Selectors.filterset.fields.join).value = config.jointype;\n\n        const filterPromises = filterConfig.map(([filterType, filterData]) => {\n            if (filterType === 'courseid') {\n                // The courseid is a special case.\n                return false;\n            }\n\n            const filterValues = filterData.values;\n\n            if (!filterValues.length) {\n                // There are no values for this filter.\n                // Skip it.\n                return false;\n            }\n\n            return addFilterRow().then(([filterRow]) => addFilter(filterRow, filterType, filterValues));\n        }).filter(promise => promise);\n\n        if (!filterPromises.length) {\n            return Promise.resolve();\n        }\n\n        return Promise.all(filterPromises).then(() => {\n            return removeEmptyFilters();\n        })\n        .then(updateFiltersOptions)\n        .then(updateTableFromFilter);\n    };\n\n    /**\n     * Update the Dynamic table based upon the current filter.\n     *\n     * @return {Promise}\n     */\n    const updateTableFromFilter = () => {\n        const pendingPromise = new Pending('core_user/participantsfilter:updateTableFromFilter');\n\n        const filters = {};\n        Object.values(activeFilters).forEach(filter => {\n            filters[filter.filterValue.name] = filter.filterValue;\n        });\n\n        return DynamicTable.setFilters(\n            DynamicTable.getTableFromId(filterSet.dataset.tableRegion),\n            {\n                jointype: parseInt(filterSet.querySelector(Selectors.filterset.fields.join).value, 10),\n                filters,\n            }\n        )\n        .then(result => {\n            pendingPromise.resolve();\n\n            return result;\n        })\n        .catch(Notification.exception);\n    };\n\n    /**\n     * Fetch the strings used to populate the fieldset legends for the maximum number of filters possible.\n     *\n     * @return {array}\n     */\n    const getAvailableFilterLegends = async() => {\n        const maxFilters = document.querySelector(Selectors.data.typeListSelect).length - 1;\n        let requests = [];\n\n        [...Array(maxFilters)].forEach((_, rowIndex) => {\n            requests.push({\n                \"key\": \"filterrowlegend\",\n                \"component\": \"core_user\",\n                // Add 1 since rows begin at 1 (index begins at zero).\n                \"param\": rowIndex + 1\n            });\n        });\n\n        const legendStrings = await getStrings(requests)\n        .then(fetchedStrings => {\n            return fetchedStrings;\n        })\n        .catch(Notification.exception);\n\n        return legendStrings;\n    };\n\n    // Add listeners for the main actions.\n    filterSet.querySelector(Selectors.filterset.region).addEventListener('click', e => {\n        if (e.target.closest(Selectors.filterset.actions.addRow)) {\n            e.preventDefault();\n\n            addFilterRow();\n        }\n\n        if (e.target.closest(Selectors.filterset.actions.applyFilters)) {\n            e.preventDefault();\n\n            updateTableFromFilter();\n        }\n\n        if (e.target.closest(Selectors.filterset.actions.resetFilters)) {\n            e.preventDefault();\n\n            removeAllFilters();\n        }\n    });\n\n    // Add the listener to remove a single filter.\n    filterSet.querySelector(Selectors.filterset.regions.filterlist).addEventListener('click', e => {\n        if (e.target.closest(Selectors.filter.actions.remove)) {\n            e.preventDefault();\n\n            removeOrReplaceFilterRow(e.target.closest(Selectors.filter.region), true);\n        }\n    });\n\n    // Add listeners for the filter type selection.\n    let filterRegion = jQuery(getFilterRegion());\n    CustomEvents.define(filterRegion, [CustomEvents.events.accessibleChange]);\n    filterRegion.on(CustomEvents.events.accessibleChange, e => {\n        const typeField = e.target.closest(Selectors.filter.fields.type);\n        if (typeField && typeField.value) {\n            const filter = e.target.closest(Selectors.filter.region);\n\n            addFilter(filter, typeField.value);\n        }\n    });\n\n    filterSet.querySelector(Selectors.filterset.fields.join).addEventListener('change', e => {\n        filterSet.dataset.filterverb = e.target.value;\n    });\n\n    const tableRoot = DynamicTable.getTableFromId(filterSet.dataset.tableRegion);\n    const initialFilters = DynamicTable.getFilters(tableRoot);\n    if (initialFilters) {\n        const initialFilterPromise = new Pending('core_user/participantsfilter:setFilterFromConfig');\n        // Apply the initial filter configuration.\n        setFilterFromConfig(initialFilters)\n        .then(() => initialFilterPromise.resolve())\n        .catch();\n    }\n};\n"],"names":["participantsRegionId","filterSet","document","querySelector","activeFilters","courseid","CourseFilter","getFilterRegion","Selectors","filterset","regions","filterlist","addFilterRow","pendingPromise","Pending","rownum","querySelectorAll","filter","region","length","Templates","renderForPromise","then","html","js","appendNodeContents","filterRow","typeList","data","forEach","contentNode","contentTypeList","fields","type","innerHTML","updateFiltersOptions","result","resolve","catch","Notification","exception","getFilterDataSource","filterType","datasource","byName","addFilter","initialFilterValues","dataset","filterDataNode","Filter","GenericFilter","filterTypeClass","typeField","value","disabled","removeOrReplaceFilterRow","refreshContent","replaceFilterRow","removeFilterRow","hasFilterValue","removeFilterObject","remove","updateTableFromFilter","getAvailableFilterLegends","filterLegends","index","innerText","rowNum","replaceNode","filterName","tearDown","filters","option","classList","add","addRowButton","actions","addRow","all","setAttribute","removeAttribute","filtermatch","join","filterverb","Object","values","filterValue","name","DynamicTable","setFilters","getTableFromId","tableRegion","jointype","parseInt","maxFilters","typeListSelect","requests","Array","_","rowIndex","push","fetchedStrings","legendStrings","addEventListener","e","target","closest","preventDefault","applyFilters","resetFilters","filterRegion","define","CustomEvents","events","accessibleChange","on","tableRoot","initialFilters","getFilters","initialFilterPromise","config","filterConfig","entries","Promise","filterPromises","map","filterData","filterValues","promise","setFilterFromConfig"],"mappings":"+8IAuCoB,SAAAA,4CAEVC,UAAYC,SAASC,yBAAkBH,uBAGvCI,cAAgB,CAClBC,SAAU,IAAIC,kBAAa,WAAYL,YAQrCM,gBAAkB,kBAAMN,UAAUE,cAAcK,mBAAUC,UAAUC,QAAQC,aAO5EC,aAAe,eACXC,eAAiB,IAAIC,iBAAQ,6CAE7BC,OAAS,EAAIR,kBAAkBS,iBAAiBR,mBAAUS,OAAOC,QAAQC,cACxEC,mBAAUC,iBAAiB,+CAAgD,WAAcN,SAC/FO,MAAK,mBAAEC,UAAAA,KAAMC,QAAAA,UACcJ,mBAAUK,mBAAmBlB,kBAAmBgB,KAAMC,OAIjFF,MAAK,SAAAI,eAKIC,SAAW1B,UAAUE,cAAcK,mBAAUoB,KAAKD,iBAExDD,UAAUG,SAAQ,SAAAC,iBACRC,gBAAkBD,YAAY3B,cAAcK,mBAAUS,OAAOe,OAAOC,MAEtEF,kBACAA,gBAAgBG,UAAYP,SAASO,cAItCR,aAEVJ,MAAK,SAAAI,kBACFS,uBAEOT,aAEVJ,MAAK,SAAAc,eACFvB,eAAewB,UAERD,UAEVE,MAAMC,sBAAaC,YASlBC,oBAAsB,SAAAC,mBACDzC,UAAUE,cAAcK,mBAAUC,UAAUC,QAAQiC,YAErDxC,cAAcK,mBAAUoB,KAAKI,OAAOY,OAAOF,cAW/DG,4DAAY,iBAAMnB,UAAWgB,WAAYI,iKAE3CpB,UAAUqB,QAAQL,WAAaA,WAEzBM,eAAiBP,oBAAoBC,YAGvCO,OAASC,gBACTF,MAAAA,iBAAAA,eAAgBD,QAAQI,8QACFH,eAAeD,QAAQI,2SAAvBH,eAAeD,QAT3B,2EASYC,eAAeD,QAAQI,yBAA7CF,mCAEJ7C,cAAcsC,YAAc,IAAIO,OAAOP,WAAYzC,UAAW6C,sBAGxDM,UAAY1B,UAAUvB,cAAcK,mBAAUS,OAAOe,OAAOC,OACxDoB,MAAQX,WAClBU,UAAUE,SAAW,WAGrBnB,gDAEO/B,cAAcsC,gIAoBnBa,yBAA2B,SAAC7B,UAAW8B,gBAGrB,IAFAjD,kBAAkBS,iBAAiBR,mBAAUS,OAAOC,QAAQC,OAG5EsC,iBAAiB/B,UAAW8B,gBAE5BE,gBAAgBhC,UAAW8B,iBAU7BE,kEAAkB,kBAAMhC,sMAAW8B,iEAC/Bd,WAAahB,UAAUvB,cAAcK,mBAAUS,OAAOe,OAAOC,MAC7D0B,iBAAmBjB,WAAWW,MAGpCO,mBAAmBlC,UAAUqB,QAAQL,YAGrChB,UAAUmC,SAGV1B,uBAEIwB,gBAAkBH,gBAElBM,yCAIwBC,mCAAtBC,6BAENzD,kBAAkBS,iBAAiBR,mBAAUS,OAAOC,QAAQW,SAAQ,SAACH,UAAWuC,OAC5EvC,UAAUvB,cAAc,UAAU+D,UAAYF,cAAcC,wHAa9DR,iBAAmB,SAAC/B,eAAW8B,0EAAuBW,8DAAS,SAEjEP,mBAAmBlC,UAAUqB,QAAQL,YAE9BtB,mBAAUC,iBAAiB,+CAAgD,WAAc8C,SAC/F7C,MAAK,oBAAEC,WAAAA,KAAMC,SAAAA,UACcJ,mBAAUgD,YAAY1C,UAAWH,KAAMC,OAIlEF,MAAK,SAAAI,eAKIC,SAAW1B,UAAUE,cAAcK,mBAAUoB,KAAKD,iBAExDD,UAAUG,SAAQ,SAAAC,iBACRC,gBAAkBD,YAAY3B,cAAcK,mBAAUS,OAAOe,OAAOC,MAEtEF,kBACAA,gBAAgBG,UAAYP,SAASO,cAItCR,aAEVJ,MAAK,SAAAI,kBACFS,uBAEOT,aAEVJ,MAAK,SAAAI,kBAEE8B,eACOM,wBAEApC,aAGdY,MAAMC,sBAAaC,YAQlBoB,mBAAqB,SAAAS,eACnBA,WAAY,KACNpD,OA/GHb,cA+G4BiE,YAC3BpD,SACAA,OAAOqD,kBAGAlE,cAAciE,eAyC3BlC,qBAAuB,eACnBoC,QAAUhE,kBAAkBS,iBAAiBR,mBAAUS,OAAOC,QACpEqD,QAAQ1C,SAAQ,SAAAH,WACIA,UAAUV,iBAAiBR,mBAAUS,OAAOe,OAAOC,KAAO,WAClEJ,SAAQ,SAAA2C,QACRA,OAAOnB,QAAU3B,UAAUqB,QAAQL,YACnC8B,OAAOC,UAAUZ,OAAO,UACxBW,OAAOlB,UAAW,GACXlD,cAAcoE,OAAOnB,QAC5BmB,OAAOC,UAAUC,IAAI,UACrBF,OAAOlB,UAAW,IAElBkB,OAAOC,UAAUZ,OAAO,UACxBW,OAAOlB,UAAW,aAOxBqB,aAAe1E,UAAUE,cAAcK,mBAAUC,UAAUmE,QAAQC,QAClD5E,UAAUe,iBAAiBR,mBAAUoB,KAAKI,OAAO8C,KACrD3D,QAAUoD,QAAQpD,OACjCwD,aAAaI,aAAa,WAAY,YAEtCJ,aAAaK,gBAAgB,YAGV,IAAnBT,QAAQpD,QACRlB,UAAUE,cAAcK,mBAAUC,UAAUC,QAAQuE,aAAaR,UAAUC,IAAI,UAC/EzE,UAAUE,cAAcK,mBAAUC,UAAUuB,OAAOkD,MAAM7B,MAAQ,EACjEpD,UAAU8C,QAAQoC,WAAa,GAE/BlF,UAAUE,cAAcK,mBAAUC,UAAUC,QAAQuE,aAAaR,UAAUZ,OAAO,WAwDpFC,sBAAwB,eACpBjD,eAAiB,IAAIC,iBAAQ,sDAE7ByD,QAAU,UAChBa,OAAOC,OAAOjF,eAAeyB,SAAQ,SAAAZ,QACjCsD,QAAQtD,OAAOqE,YAAYC,MAAQtE,OAAOqE,eAGvCE,aAAaC,WAChBD,aAAaE,eAAezF,UAAU8C,QAAQ4C,aAC9C,CACIC,SAAUC,SAAS5F,UAAUE,cAAcK,mBAAUC,UAAUuB,OAAOkD,MAAM7B,MAAO,IACnFkB,QAAAA,UAGPjD,MAAK,SAAAc,eACFvB,eAAewB,UAERD,UAEVE,MAAMC,sBAAaC,YAQlBuB,4EAA4B,yKACxB+B,WAAa5F,SAASC,cAAcK,mBAAUoB,KAAKmE,gBAAgB5E,OAAS,EAC9E6E,SAAW,sBAEXC,MAAMH,aAAajE,SAAQ,SAACqE,EAAGC,UAC/BH,SAASI,KAAK,KACH,4BACM,kBAEJD,SAAW,yBAIA,oBAAWH,UACtC1E,MAAK,SAAA+E,uBACKA,kBAEV/D,MAAMC,sBAAaC,yBAJd8D,uDAMCA,yHAIXrG,UAAUE,cAAcK,mBAAUC,UAAUS,QAAQqF,iBAAiB,SAAS,SAAAC,GA3KrD,IACf3F,eA2KF2F,EAAEC,OAAOC,QAAQlG,mBAAUC,UAAUmE,QAAQC,UAC7C2B,EAAEG,iBAEF/F,gBAGA4F,EAAEC,OAAOC,QAAQlG,mBAAUC,UAAUmE,QAAQgC,gBAC7CJ,EAAEG,iBAEF7C,yBAGA0C,EAAEC,OAAOC,QAAQlG,mBAAUC,UAAUmE,QAAQiC,gBAC7CL,EAAEG,iBAxLA9F,eAAiB,IAAIC,iBAAQ,oDAEnBP,kBAAkBS,iBAAiBR,mBAAUS,OAAOC,QAC5DW,SAAQ,SAAAH,kBAAa6B,yBAAyB7B,WAAW,MAG1DoC,wBACNxC,MAAK,SAAAc,eACFvB,eAAewB,UAERD,cAqLfnC,UAAUE,cAAcK,mBAAUC,UAAUC,QAAQC,YAAY4F,iBAAiB,SAAS,SAAAC,GAClFA,EAAEC,OAAOC,QAAQlG,mBAAUS,OAAO2D,QAAQf,UAC1C2C,EAAEG,iBAEFpD,yBAAyBiD,EAAEC,OAAOC,QAAQlG,mBAAUS,OAAOC,SAAS,WAKxE4F,cAAe,mBAAOvG,sDACbwG,OAAOD,aAAc,CAACE,mCAAaC,OAAOC,mBACvDJ,aAAaK,GAAGH,mCAAaC,OAAOC,kBAAkB,SAAAV,OAC5CpD,UAAYoD,EAAEC,OAAOC,QAAQlG,mBAAUS,OAAOe,OAAOC,SACvDmB,WAAaA,UAAUC,MAAO,KACxBpC,OAASuF,EAAEC,OAAOC,QAAQlG,mBAAUS,OAAOC,QAEjD2B,UAAU5B,OAAQmC,UAAUC,WAIpCpD,UAAUE,cAAcK,mBAAUC,UAAUuB,OAAOkD,MAAMqB,iBAAiB,UAAU,SAAAC,GAChFvG,UAAU8C,QAAQoC,WAAaqB,EAAEC,OAAOpD,aAGtC+D,UAAY5B,aAAaE,eAAezF,UAAU8C,QAAQ4C,aAC1D0B,eAAiB7B,aAAa8B,WAAWF,cAC3CC,eAAgB,KACVE,qBAAuB,IAAIzG,iBAAQ,qDA/IjB,SAAA0G,YAClBC,aAAerC,OAAOsC,QAAQF,OAAOjD,aAEtCkD,aAAatG,cAEPwG,QAAQtF,UAInBpC,UAAUE,cAAcK,mBAAUC,UAAUuB,OAAOkD,MAAM7B,MAAQmE,OAAO5B,aAElEgC,eAAiBH,aAAaI,KAAI,kDAAEnF,oBAAYoF,uBAC/B,aAAfpF,kBAEO,MAGLqF,aAAeD,WAAWzC,eAE3B0C,aAAa5G,QAMXP,eAAeU,MAAK,oBAAEI,4CAAemB,UAAUnB,UAAWgB,WAAYqF,oBAC9E9G,QAAO,SAAA+G,gBAAWA,kBAEhBJ,eAAezG,OAIbwG,QAAQ7C,IAAI8C,gBAAgBtG,MAAK,WAzFxBf,kBAAkBS,iBAAiBR,mBAAUS,OAAOC,QAC5DW,SAAQ,SAAAH,WACOA,UAAUvB,cAAcK,mBAAUS,OAAOe,OAAOC,MACnDoB,OACZE,yBAAyB7B,WAAW,SAwF3CJ,KAAKa,sBACLb,KAAKwC,uBAPK6D,QAAQtF,WAoHnB4F,CAAoBZ,gBACnB/F,MAAK,kBAAMiG,qBAAqBlF,aAChCC"}