{"version":3,"file":"video.js-CZ4qC9nT.js","sources":["../../../node_modules/global/window.js","../../../__vite-browser-external","../../../node_modules/global/document.js","../../../node_modules/safe-json-parse/tuple.js","../../../node_modules/@babel/runtime/helpers/esm/extends.js","../../../node_modules/is-function/index.js","../../../node_modules/@videojs/xhr/lib/interceptors.js","../../../node_modules/@videojs/xhr/lib/retry.js","../../../node_modules/@videojs/xhr/lib/http-handler.js","../../../node_modules/@videojs/xhr/lib/index.js","../../../node_modules/videojs-vtt.js/lib/vtt.js","../../../node_modules/videojs-vtt.js/lib/vttcue.js","../../../node_modules/videojs-vtt.js/lib/vttregion.js","../../../node_modules/videojs-vtt.js/lib/browser-index.js","../../../node_modules/url-toolkit/src/url-toolkit.js","../../../node_modules/@videojs/vhs-utils/es/resolve-url.js","../../../node_modules/m3u8-parser/node_modules/@videojs/vhs-utils/es/stream.js","../../../node_modules/m3u8-parser/node_modules/@videojs/vhs-utils/es/decode-b64-to-uint8-array.js","../../../node_modules/m3u8-parser/dist/m3u8-parser.es.js","../../../node_modules/@videojs/vhs-utils/es/codecs.js","../../../node_modules/@videojs/vhs-utils/es/media-types.js","../../../node_modules/@videojs/vhs-utils/es/byte-helpers.js","../../../node_modules/@videojs/vhs-utils/es/media-groups.js","../../../node_modules/@videojs/vhs-utils/es/decode-b64-to-uint8-array.js","../../../node_modules/@xmldom/xmldom/lib/conventions.js","../../../node_modules/@xmldom/xmldom/lib/dom.js","../../../node_modules/@xmldom/xmldom/lib/entities.js","../../../node_modules/@xmldom/xmldom/lib/sax.js","../../../node_modules/@xmldom/xmldom/lib/dom-parser.js","../../../node_modules/@xmldom/xmldom/lib/index.js","../../../node_modules/mpd-parser/dist/mpd-parser.es.js","../../../node_modules/mux.js/lib/utils/numbers.js","../../../node_modules/mux.js/lib/tools/parse-sidx.js","../../../node_modules/@videojs/vhs-utils/es/id3-helpers.js","../../../node_modules/@videojs/vhs-utils/es/mp4-helpers.js","../../../node_modules/@videojs/vhs-utils/es/ebml-helpers.js","../../../node_modules/@videojs/vhs-utils/es/nal-helpers.js","../../../node_modules/@videojs/vhs-utils/es/containers.js","../../../node_modules/mux.js/lib/utils/clock.js","../../../node_modules/video.js/dist/video.es.js"],"sourcesContent":["var win;\n\nif (typeof window !== \"undefined\") {\n win = window;\n} else if (typeof global !== \"undefined\") {\n win = global;\n} else if (typeof self !== \"undefined\"){\n win = self;\n} else {\n win = {};\n}\n\nmodule.exports = win;\n","export default {}","var topLevel = typeof global !== 'undefined' ? global :\n typeof window !== 'undefined' ? window : {}\nvar minDoc = require('min-document');\n\nvar doccy;\n\nif (typeof document !== 'undefined') {\n doccy = document;\n} else {\n doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'];\n\n if (!doccy) {\n doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc;\n }\n}\n\nmodule.exports = doccy;\n","module.exports = SafeParseTuple\n\nfunction SafeParseTuple(obj, reviver) {\n var json\n var error = null\n\n try {\n json = JSON.parse(obj, reviver)\n } catch (err) {\n error = err\n }\n\n return [error, json]\n}\n","function _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nexport { _extends as default };","module.exports = isFunction\n\nvar toString = Object.prototype.toString\n\nfunction isFunction (fn) {\n if (!fn) {\n return false\n }\n var string = toString.call(fn)\n return string === '[object Function]' ||\n (typeof fn === 'function' && string !== '[object RegExp]') ||\n (typeof window !== 'undefined' &&\n // IE8 and below\n (fn === window.setTimeout ||\n fn === window.alert ||\n fn === window.confirm ||\n fn === window.prompt))\n};\n","\"use strict\";\n\nfunction _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nvar InterceptorsStorage = /*#__PURE__*/function () {\n function InterceptorsStorage() {\n this.typeToInterceptorsMap_ = new Map();\n this.enabled_ = false;\n }\n\n var _proto = InterceptorsStorage.prototype;\n\n _proto.getIsEnabled = function getIsEnabled() {\n return this.enabled_;\n };\n\n _proto.enable = function enable() {\n this.enabled_ = true;\n };\n\n _proto.disable = function disable() {\n this.enabled_ = false;\n };\n\n _proto.reset = function reset() {\n this.typeToInterceptorsMap_ = new Map();\n this.enabled_ = false;\n };\n\n _proto.addInterceptor = function addInterceptor(type, interceptor) {\n if (!this.typeToInterceptorsMap_.has(type)) {\n this.typeToInterceptorsMap_.set(type, new Set());\n }\n\n var interceptorsSet = this.typeToInterceptorsMap_.get(type);\n\n if (interceptorsSet.has(interceptor)) {\n // already have this interceptor\n return false;\n }\n\n interceptorsSet.add(interceptor);\n return true;\n };\n\n _proto.removeInterceptor = function removeInterceptor(type, interceptor) {\n var interceptorsSet = this.typeToInterceptorsMap_.get(type);\n\n if (interceptorsSet && interceptorsSet.has(interceptor)) {\n interceptorsSet.delete(interceptor);\n return true;\n }\n\n return false;\n };\n\n _proto.clearInterceptorsByType = function clearInterceptorsByType(type) {\n var interceptorsSet = this.typeToInterceptorsMap_.get(type);\n\n if (!interceptorsSet) {\n return false;\n }\n\n this.typeToInterceptorsMap_.delete(type);\n this.typeToInterceptorsMap_.set(type, new Set());\n return true;\n };\n\n _proto.clear = function clear() {\n if (!this.typeToInterceptorsMap_.size) {\n return false;\n }\n\n this.typeToInterceptorsMap_ = new Map();\n return true;\n };\n\n _proto.getForType = function getForType(type) {\n return this.typeToInterceptorsMap_.get(type) || new Set();\n };\n\n _proto.execute = function execute(type, payload) {\n var interceptors = this.getForType(type);\n\n for (var _iterator = _createForOfIteratorHelperLoose(interceptors), _step; !(_step = _iterator()).done;) {\n var interceptor = _step.value;\n\n try {\n payload = interceptor(payload);\n } catch (e) {//ignore\n }\n }\n\n return payload;\n };\n\n return InterceptorsStorage;\n}();\n\nmodule.exports = InterceptorsStorage;","\"use strict\";\n\nvar RetryManager = /*#__PURE__*/function () {\n function RetryManager() {\n this.maxAttempts_ = 1;\n this.delayFactor_ = 0.1;\n this.fuzzFactor_ = 0.1;\n this.initialDelay_ = 1000;\n this.enabled_ = false;\n }\n\n var _proto = RetryManager.prototype;\n\n _proto.getIsEnabled = function getIsEnabled() {\n return this.enabled_;\n };\n\n _proto.enable = function enable() {\n this.enabled_ = true;\n };\n\n _proto.disable = function disable() {\n this.enabled_ = false;\n };\n\n _proto.reset = function reset() {\n this.maxAttempts_ = 1;\n this.delayFactor_ = 0.1;\n this.fuzzFactor_ = 0.1;\n this.initialDelay_ = 1000;\n this.enabled_ = false;\n };\n\n _proto.getMaxAttempts = function getMaxAttempts() {\n return this.maxAttempts_;\n };\n\n _proto.setMaxAttempts = function setMaxAttempts(maxAttempts) {\n this.maxAttempts_ = maxAttempts;\n };\n\n _proto.getDelayFactor = function getDelayFactor() {\n return this.delayFactor_;\n };\n\n _proto.setDelayFactor = function setDelayFactor(delayFactor) {\n this.delayFactor_ = delayFactor;\n };\n\n _proto.getFuzzFactor = function getFuzzFactor() {\n return this.fuzzFactor_;\n };\n\n _proto.setFuzzFactor = function setFuzzFactor(fuzzFactor) {\n this.fuzzFactor_ = fuzzFactor;\n };\n\n _proto.getInitialDelay = function getInitialDelay() {\n return this.initialDelay_;\n };\n\n _proto.setInitialDelay = function setInitialDelay(initialDelay) {\n this.initialDelay_ = initialDelay;\n };\n\n _proto.createRetry = function createRetry(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n maxAttempts = _ref.maxAttempts,\n delayFactor = _ref.delayFactor,\n fuzzFactor = _ref.fuzzFactor,\n initialDelay = _ref.initialDelay;\n\n return new Retry({\n maxAttempts: maxAttempts || this.maxAttempts_,\n delayFactor: delayFactor || this.delayFactor_,\n fuzzFactor: fuzzFactor || this.fuzzFactor_,\n initialDelay: initialDelay || this.initialDelay_\n });\n };\n\n return RetryManager;\n}();\n\nvar Retry = /*#__PURE__*/function () {\n function Retry(options) {\n this.maxAttempts_ = options.maxAttempts;\n this.delayFactor_ = options.delayFactor;\n this.fuzzFactor_ = options.fuzzFactor;\n this.currentDelay_ = options.initialDelay;\n this.currentAttempt_ = 1;\n }\n\n var _proto2 = Retry.prototype;\n\n _proto2.moveToNextAttempt = function moveToNextAttempt() {\n this.currentAttempt_++;\n var delayDelta = this.currentDelay_ * this.delayFactor_;\n this.currentDelay_ = this.currentDelay_ + delayDelta;\n };\n\n _proto2.shouldRetry = function shouldRetry() {\n return this.currentAttempt_ < this.maxAttempts_;\n };\n\n _proto2.getCurrentDelay = function getCurrentDelay() {\n return this.currentDelay_;\n };\n\n _proto2.getCurrentMinPossibleDelay = function getCurrentMinPossibleDelay() {\n return (1 - this.fuzzFactor_) * this.currentDelay_;\n };\n\n _proto2.getCurrentMaxPossibleDelay = function getCurrentMaxPossibleDelay() {\n return (1 + this.fuzzFactor_) * this.currentDelay_;\n }\n /**\n * For example fuzzFactor is 0.1\n * This means ±10% deviation\n * So if we have delay as 1000\n * This function can generate any value from 900 to 1100\n */\n ;\n\n _proto2.getCurrentFuzzedDelay = function getCurrentFuzzedDelay() {\n var lowValue = this.getCurrentMinPossibleDelay();\n var highValue = this.getCurrentMaxPossibleDelay();\n return lowValue + Math.random() * (highValue - lowValue);\n };\n\n return Retry;\n}();\n\nmodule.exports = RetryManager;","\"use strict\";\n\nvar window = require('global/window');\n\nvar httpResponseHandler = function httpResponseHandler(callback, decodeResponseBody) {\n if (decodeResponseBody === void 0) {\n decodeResponseBody = false;\n }\n\n return function (err, response, responseBody) {\n // if the XHR failed, return that error\n if (err) {\n callback(err);\n return;\n } // if the HTTP status code is 4xx or 5xx, the request also failed\n\n\n if (response.statusCode >= 400 && response.statusCode <= 599) {\n var cause = responseBody;\n\n if (decodeResponseBody) {\n if (window.TextDecoder) {\n var charset = getCharset(response.headers && response.headers['content-type']);\n\n try {\n cause = new TextDecoder(charset).decode(responseBody);\n } catch (e) {}\n } else {\n cause = String.fromCharCode.apply(null, new Uint8Array(responseBody));\n }\n }\n\n callback({\n cause: cause\n });\n return;\n } // otherwise, request succeeded\n\n\n callback(null, responseBody);\n };\n};\n\nfunction getCharset(contentTypeHeader) {\n if (contentTypeHeader === void 0) {\n contentTypeHeader = '';\n }\n\n return contentTypeHeader.toLowerCase().split(';').reduce(function (charset, contentType) {\n var _contentType$split = contentType.split('='),\n type = _contentType$split[0],\n value = _contentType$split[1];\n\n if (type.trim() === 'charset') {\n return value.trim();\n }\n\n return charset;\n }, 'utf-8');\n}\n\nmodule.exports = httpResponseHandler;","\"use strict\";\n\nvar window = require(\"global/window\");\n\nvar _extends = require(\"@babel/runtime/helpers/extends\");\n\nvar isFunction = require('is-function');\n\nvar InterceptorsStorage = require('./interceptors.js');\n\nvar RetryManager = require(\"./retry.js\");\n\ncreateXHR.httpHandler = require('./http-handler.js');\ncreateXHR.requestInterceptorsStorage = new InterceptorsStorage();\ncreateXHR.responseInterceptorsStorage = new InterceptorsStorage();\ncreateXHR.retryManager = new RetryManager();\n/**\n * @license\n * slighly modified parse-headers 2.0.2 \n * Copyright (c) 2014 David Björklund\n * Available under the MIT license\n * \n */\n\nvar parseHeaders = function parseHeaders(headers) {\n var result = {};\n\n if (!headers) {\n return result;\n }\n\n headers.trim().split('\\n').forEach(function (row) {\n var index = row.indexOf(':');\n var key = row.slice(0, index).trim().toLowerCase();\n var value = row.slice(index + 1).trim();\n\n if (typeof result[key] === 'undefined') {\n result[key] = value;\n } else if (Array.isArray(result[key])) {\n result[key].push(value);\n } else {\n result[key] = [result[key], value];\n }\n });\n return result;\n};\n\nmodule.exports = createXHR; // Allow use of default import syntax in TypeScript\n\nmodule.exports.default = createXHR;\ncreateXHR.XMLHttpRequest = window.XMLHttpRequest || noop;\ncreateXHR.XDomainRequest = \"withCredentials\" in new createXHR.XMLHttpRequest() ? createXHR.XMLHttpRequest : window.XDomainRequest;\nforEachArray([\"get\", \"put\", \"post\", \"patch\", \"head\", \"delete\"], function (method) {\n createXHR[method === \"delete\" ? \"del\" : method] = function (uri, options, callback) {\n options = initParams(uri, options, callback);\n options.method = method.toUpperCase();\n return _createXHR(options);\n };\n});\n\nfunction forEachArray(array, iterator) {\n for (var i = 0; i < array.length; i++) {\n iterator(array[i]);\n }\n}\n\nfunction isEmpty(obj) {\n for (var i in obj) {\n if (obj.hasOwnProperty(i)) return false;\n }\n\n return true;\n}\n\nfunction initParams(uri, options, callback) {\n var params = uri;\n\n if (isFunction(options)) {\n callback = options;\n\n if (typeof uri === \"string\") {\n params = {\n uri: uri\n };\n }\n } else {\n params = _extends({}, options, {\n uri: uri\n });\n }\n\n params.callback = callback;\n return params;\n}\n\nfunction createXHR(uri, options, callback) {\n options = initParams(uri, options, callback);\n return _createXHR(options);\n}\n\nfunction _createXHR(options) {\n if (typeof options.callback === \"undefined\") {\n throw new Error(\"callback argument missing\");\n } // call all registered request interceptors for a given request type:\n\n\n if (options.requestType && createXHR.requestInterceptorsStorage.getIsEnabled()) {\n var requestInterceptorPayload = {\n uri: options.uri || options.url,\n headers: options.headers || {},\n body: options.body,\n metadata: options.metadata || {},\n retry: options.retry,\n timeout: options.timeout\n };\n var updatedPayload = createXHR.requestInterceptorsStorage.execute(options.requestType, requestInterceptorPayload);\n options.uri = updatedPayload.uri;\n options.headers = updatedPayload.headers;\n options.body = updatedPayload.body;\n options.metadata = updatedPayload.metadata;\n options.retry = updatedPayload.retry;\n options.timeout = updatedPayload.timeout;\n }\n\n var called = false;\n\n var callback = function cbOnce(err, response, body) {\n if (!called) {\n called = true;\n options.callback(err, response, body);\n }\n };\n\n function readystatechange() {\n // do not call load 2 times when response interceptors are enabled\n // why do we even need this 2nd load?\n if (xhr.readyState === 4 && !createXHR.responseInterceptorsStorage.getIsEnabled()) {\n setTimeout(loadFunc, 0);\n }\n }\n\n function getBody() {\n // Chrome with requestType=blob throws errors arround when even testing access to responseText\n var body = undefined;\n\n if (xhr.response) {\n body = xhr.response;\n } else {\n body = xhr.responseText || getXml(xhr);\n }\n\n if (isJson) {\n try {\n body = JSON.parse(body);\n } catch (e) {}\n }\n\n return body;\n }\n\n function errorFunc(evt) {\n clearTimeout(timeoutTimer);\n clearTimeout(options.retryTimeout);\n\n if (!(evt instanceof Error)) {\n evt = new Error(\"\" + (evt || \"Unknown XMLHttpRequest Error\"));\n }\n\n evt.statusCode = 0; // we would like to retry on error:\n\n if (!aborted && createXHR.retryManager.getIsEnabled() && options.retry && options.retry.shouldRetry()) {\n options.retryTimeout = setTimeout(function () {\n options.retry.moveToNextAttempt(); // we want to re-use the same options and the same xhr object:\n\n options.xhr = xhr;\n\n _createXHR(options);\n }, options.retry.getCurrentFuzzedDelay());\n return;\n } // call all registered response interceptors for a given request type:\n\n\n if (options.requestType && createXHR.responseInterceptorsStorage.getIsEnabled()) {\n var responseInterceptorPayload = {\n headers: failureResponse.headers || {},\n body: failureResponse.body,\n responseUrl: xhr.responseURL,\n responseType: xhr.responseType\n };\n\n var _updatedPayload = createXHR.responseInterceptorsStorage.execute(options.requestType, responseInterceptorPayload);\n\n failureResponse.body = _updatedPayload.body;\n failureResponse.headers = _updatedPayload.headers;\n }\n\n return callback(evt, failureResponse);\n } // will load the data & process the response in a special response object\n\n\n function loadFunc() {\n if (aborted) return;\n var status;\n clearTimeout(timeoutTimer);\n clearTimeout(options.retryTimeout);\n\n if (options.useXDR && xhr.status === undefined) {\n //IE8 CORS GET successful response doesn't have a status field, but body is fine\n status = 200;\n } else {\n status = xhr.status === 1223 ? 204 : xhr.status;\n }\n\n var response = failureResponse;\n var err = null;\n\n if (status !== 0) {\n response = {\n body: getBody(),\n statusCode: status,\n method: method,\n headers: {},\n url: uri,\n rawRequest: xhr\n };\n\n if (xhr.getAllResponseHeaders) {\n //remember xhr can in fact be XDR for CORS in IE\n response.headers = parseHeaders(xhr.getAllResponseHeaders());\n }\n } else {\n err = new Error(\"Internal XMLHttpRequest Error\");\n } // call all registered response interceptors for a given request type:\n\n\n if (options.requestType && createXHR.responseInterceptorsStorage.getIsEnabled()) {\n var responseInterceptorPayload = {\n headers: response.headers || {},\n body: response.body,\n responseUrl: xhr.responseURL,\n responseType: xhr.responseType\n };\n\n var _updatedPayload2 = createXHR.responseInterceptorsStorage.execute(options.requestType, responseInterceptorPayload);\n\n response.body = _updatedPayload2.body;\n response.headers = _updatedPayload2.headers;\n }\n\n return callback(err, response, response.body);\n }\n\n var xhr = options.xhr || null;\n\n if (!xhr) {\n if (options.cors || options.useXDR) {\n xhr = new createXHR.XDomainRequest();\n } else {\n xhr = new createXHR.XMLHttpRequest();\n }\n }\n\n var key;\n var aborted;\n var uri = xhr.url = options.uri || options.url;\n var method = xhr.method = options.method || \"GET\";\n var body = options.body || options.data;\n var headers = xhr.headers = options.headers || {};\n var sync = !!options.sync;\n var isJson = false;\n var timeoutTimer;\n var failureResponse = {\n body: undefined,\n headers: {},\n statusCode: 0,\n method: method,\n url: uri,\n rawRequest: xhr\n };\n\n if (\"json\" in options && options.json !== false) {\n isJson = true;\n headers[\"accept\"] || headers[\"Accept\"] || (headers[\"Accept\"] = \"application/json\"); //Don't override existing accept header declared by user\n\n if (method !== \"GET\" && method !== \"HEAD\") {\n headers[\"content-type\"] || headers[\"Content-Type\"] || (headers[\"Content-Type\"] = \"application/json\"); //Don't override existing accept header declared by user\n\n body = JSON.stringify(options.json === true ? body : options.json);\n }\n }\n\n xhr.onreadystatechange = readystatechange;\n xhr.onload = loadFunc;\n xhr.onerror = errorFunc; // IE9 must have onprogress be set to a unique function.\n\n xhr.onprogress = function () {// IE must die\n };\n\n xhr.onabort = function () {\n aborted = true;\n clearTimeout(options.retryTimeout);\n };\n\n xhr.ontimeout = errorFunc;\n xhr.open(method, uri, !sync, options.username, options.password); //has to be after open\n\n if (!sync) {\n xhr.withCredentials = !!options.withCredentials;\n } // Cannot set timeout with sync request\n // not setting timeout on the xhr object, because of old webkits etc. not handling that correctly\n // both npm's request and jquery 1.x use this kind of timeout, so this is being consistent\n\n\n if (!sync && options.timeout > 0) {\n timeoutTimer = setTimeout(function () {\n if (aborted) return;\n aborted = true; //IE9 may still call readystatechange\n\n xhr.abort(\"timeout\");\n var e = new Error(\"XMLHttpRequest timeout\");\n e.code = \"ETIMEDOUT\";\n errorFunc(e);\n }, options.timeout);\n }\n\n if (xhr.setRequestHeader) {\n for (key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n } else if (options.headers && !isEmpty(options.headers)) {\n throw new Error(\"Headers cannot be set on an XDomainRequest object\");\n }\n\n if (\"responseType\" in options) {\n xhr.responseType = options.responseType;\n }\n\n if (\"beforeSend\" in options && typeof options.beforeSend === \"function\") {\n options.beforeSend(xhr);\n } // Microsoft Edge browser sends \"undefined\" when send is called with undefined value.\n // XMLHttpRequest spec says to pass null as body to indicate no body\n // See https://github.com/naugtur/xhr/issues/100.\n\n\n xhr.send(body || null);\n return xhr;\n}\n\nfunction getXml(xhr) {\n // xhr.responseXML will throw Exception \"InvalidStateError\" or \"DOMException\"\n // See https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseXML.\n try {\n if (xhr.responseType === \"document\") {\n return xhr.responseXML;\n }\n\n var firefoxBugTakenEffect = xhr.responseXML && xhr.responseXML.documentElement.nodeName === \"parsererror\";\n\n if (xhr.responseType === \"\" && !firefoxBugTakenEffect) {\n return xhr.responseXML;\n }\n } catch (e) {}\n\n return null;\n}\n\nfunction noop() {}","/**\n * Copyright 2013 vtt.js Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * 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/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */\nvar document = require('global/document');\n\nvar _objCreate = Object.create || (function() {\n function F() {}\n return function(o) {\n if (arguments.length !== 1) {\n throw new Error('Object.create shim only accepts one parameter.');\n }\n F.prototype = o;\n return new F();\n };\n})();\n\n// Creates a new ParserError object from an errorData object. The errorData\n// object should have default code and message properties. The default message\n// property can be overriden by passing in a message parameter.\n// See ParsingError.Errors below for acceptable errors.\nfunction ParsingError(errorData, message) {\n this.name = \"ParsingError\";\n this.code = errorData.code;\n this.message = message || errorData.message;\n}\nParsingError.prototype = _objCreate(Error.prototype);\nParsingError.prototype.constructor = ParsingError;\n\n// ParsingError metadata for acceptable ParsingErrors.\nParsingError.Errors = {\n BadSignature: {\n code: 0,\n message: \"Malformed WebVTT signature.\"\n },\n BadTimeStamp: {\n code: 1,\n message: \"Malformed time stamp.\"\n }\n};\n\n// Try to parse input as a time stamp.\nfunction parseTimeStamp(input) {\n\n function computeSeconds(h, m, s, f) {\n return (h | 0) * 3600 + (m | 0) * 60 + (s | 0) + (f | 0) / 1000;\n }\n\n var m = input.match(/^(\\d+):(\\d{1,2})(:\\d{1,2})?\\.(\\d{3})/);\n if (!m) {\n return null;\n }\n\n if (m[3]) {\n // Timestamp takes the form of [hours]:[minutes]:[seconds].[milliseconds]\n return computeSeconds(m[1], m[2], m[3].replace(\":\", \"\"), m[4]);\n } else if (m[1] > 59) {\n // Timestamp takes the form of [hours]:[minutes].[milliseconds]\n // First position is hours as it's over 59.\n return computeSeconds(m[1], m[2], 0, m[4]);\n } else {\n // Timestamp takes the form of [minutes]:[seconds].[milliseconds]\n return computeSeconds(0, m[1], m[2], m[4]);\n }\n}\n\n// A settings object holds key/value pairs and will ignore anything but the first\n// assignment to a specific key.\nfunction Settings() {\n this.values = _objCreate(null);\n}\n\nSettings.prototype = {\n // Only accept the first assignment to any key.\n set: function(k, v) {\n if (!this.get(k) && v !== \"\") {\n this.values[k] = v;\n }\n },\n // Return the value for a key, or a default value.\n // If 'defaultKey' is passed then 'dflt' is assumed to be an object with\n // a number of possible default values as properties where 'defaultKey' is\n // the key of the property that will be chosen; otherwise it's assumed to be\n // a single value.\n get: function(k, dflt, defaultKey) {\n if (defaultKey) {\n return this.has(k) ? this.values[k] : dflt[defaultKey];\n }\n return this.has(k) ? this.values[k] : dflt;\n },\n // Check whether we have a value for a key.\n has: function(k) {\n return k in this.values;\n },\n // Accept a setting if its one of the given alternatives.\n alt: function(k, v, a) {\n for (var n = 0; n < a.length; ++n) {\n if (v === a[n]) {\n this.set(k, v);\n break;\n }\n }\n },\n // Accept a setting if its a valid (signed) integer.\n integer: function(k, v) {\n if (/^-?\\d+$/.test(v)) { // integer\n this.set(k, parseInt(v, 10));\n }\n },\n // Accept a setting if its a valid percentage.\n percent: function(k, v) {\n var m;\n if ((m = v.match(/^([\\d]{1,3})(\\.[\\d]*)?%$/))) {\n v = parseFloat(v);\n if (v >= 0 && v <= 100) {\n this.set(k, v);\n return true;\n }\n }\n return false;\n }\n};\n\n// Helper function to parse input into groups separated by 'groupDelim', and\n// interprete each group as a key/value pair separated by 'keyValueDelim'.\nfunction parseOptions(input, callback, keyValueDelim, groupDelim) {\n var groups = groupDelim ? input.split(groupDelim) : [input];\n for (var i in groups) {\n if (typeof groups[i] !== \"string\") {\n continue;\n }\n var kv = groups[i].split(keyValueDelim);\n if (kv.length !== 2) {\n continue;\n }\n var k = kv[0].trim();\n var v = kv[1].trim();\n callback(k, v);\n }\n}\n\nfunction parseCue(input, cue, regionList) {\n // Remember the original input if we need to throw an error.\n var oInput = input;\n // 4.1 WebVTT timestamp\n function consumeTimeStamp() {\n var ts = parseTimeStamp(input);\n if (ts === null) {\n throw new ParsingError(ParsingError.Errors.BadTimeStamp,\n \"Malformed timestamp: \" + oInput);\n }\n // Remove time stamp from input.\n input = input.replace(/^[^\\sa-zA-Z-]+/, \"\");\n return ts;\n }\n\n // 4.4.2 WebVTT cue settings\n function consumeCueSettings(input, cue) {\n var settings = new Settings();\n\n parseOptions(input, function (k, v) {\n switch (k) {\n case \"region\":\n // Find the last region we parsed with the same region id.\n for (var i = regionList.length - 1; i >= 0; i--) {\n if (regionList[i].id === v) {\n settings.set(k, regionList[i].region);\n break;\n }\n }\n break;\n case \"vertical\":\n settings.alt(k, v, [\"rl\", \"lr\"]);\n break;\n case \"line\":\n var vals = v.split(\",\"),\n vals0 = vals[0];\n settings.integer(k, vals0);\n settings.percent(k, vals0) ? settings.set(\"snapToLines\", false) : null;\n settings.alt(k, vals0, [\"auto\"]);\n if (vals.length === 2) {\n settings.alt(\"lineAlign\", vals[1], [\"start\", \"center\", \"end\"]);\n }\n break;\n case \"position\":\n vals = v.split(\",\");\n settings.percent(k, vals[0]);\n if (vals.length === 2) {\n settings.alt(\"positionAlign\", vals[1], [\"start\", \"center\", \"end\"]);\n }\n break;\n case \"size\":\n settings.percent(k, v);\n break;\n case \"align\":\n settings.alt(k, v, [\"start\", \"center\", \"end\", \"left\", \"right\"]);\n break;\n }\n }, /:/, /\\s/);\n\n // Apply default values for any missing fields.\n cue.region = settings.get(\"region\", null);\n cue.vertical = settings.get(\"vertical\", \"\");\n try {\n cue.line = settings.get(\"line\", \"auto\");\n } catch (e) {}\n cue.lineAlign = settings.get(\"lineAlign\", \"start\");\n cue.snapToLines = settings.get(\"snapToLines\", true);\n cue.size = settings.get(\"size\", 100);\n // Safari still uses the old middle value and won't accept center\n try {\n cue.align = settings.get(\"align\", \"center\");\n } catch (e) {\n cue.align = settings.get(\"align\", \"middle\");\n }\n try {\n cue.position = settings.get(\"position\", \"auto\");\n } catch (e) {\n cue.position = settings.get(\"position\", {\n start: 0,\n left: 0,\n center: 50,\n middle: 50,\n end: 100,\n right: 100\n }, cue.align);\n }\n\n\n cue.positionAlign = settings.get(\"positionAlign\", {\n start: \"start\",\n left: \"start\",\n center: \"center\",\n middle: \"center\",\n end: \"end\",\n right: \"end\"\n }, cue.align);\n }\n\n function skipWhitespace() {\n input = input.replace(/^\\s+/, \"\");\n }\n\n // 4.1 WebVTT cue timings.\n skipWhitespace();\n cue.startTime = consumeTimeStamp(); // (1) collect cue start time\n skipWhitespace();\n if (input.substr(0, 3) !== \"-->\") { // (3) next characters must match \"-->\"\n throw new ParsingError(ParsingError.Errors.BadTimeStamp,\n \"Malformed time stamp (time stamps must be separated by '-->'): \" +\n oInput);\n }\n input = input.substr(3);\n skipWhitespace();\n cue.endTime = consumeTimeStamp(); // (5) collect cue end time\n\n // 4.1 WebVTT cue settings list.\n skipWhitespace();\n consumeCueSettings(input, cue);\n}\n\n// When evaluating this file as part of a Webpack bundle for server\n// side rendering, `document` is an empty object.\nvar TEXTAREA_ELEMENT = document.createElement && document.createElement(\"textarea\");\n\nvar TAG_NAME = {\n c: \"span\",\n i: \"i\",\n b: \"b\",\n u: \"u\",\n ruby: \"ruby\",\n rt: \"rt\",\n v: \"span\",\n lang: \"span\"\n};\n\n// 5.1 default text color\n// 5.2 default text background color is equivalent to text color with bg_ prefix\nvar DEFAULT_COLOR_CLASS = {\n white: 'rgba(255,255,255,1)',\n lime: 'rgba(0,255,0,1)',\n cyan: 'rgba(0,255,255,1)',\n red: 'rgba(255,0,0,1)',\n yellow: 'rgba(255,255,0,1)',\n magenta: 'rgba(255,0,255,1)',\n blue: 'rgba(0,0,255,1)',\n black: 'rgba(0,0,0,1)'\n};\n\nvar TAG_ANNOTATION = {\n v: \"title\",\n lang: \"lang\"\n};\n\nvar NEEDS_PARENT = {\n rt: \"ruby\"\n};\n\n// Parse content into a document fragment.\nfunction parseContent(window, input) {\n function nextToken() {\n // Check for end-of-string.\n if (!input) {\n return null;\n }\n\n // Consume 'n' characters from the input.\n function consume(result) {\n input = input.substr(result.length);\n return result;\n }\n\n var m = input.match(/^([^<]*)(<[^>]*>?)?/);\n // If there is some text before the next tag, return it, otherwise return\n // the tag.\n return consume(m[1] ? m[1] : m[2]);\n }\n\n function unescape(s) {\n TEXTAREA_ELEMENT.innerHTML = s;\n s = TEXTAREA_ELEMENT.textContent;\n TEXTAREA_ELEMENT.textContent = \"\";\n return s;\n }\n\n function shouldAdd(current, element) {\n return !NEEDS_PARENT[element.localName] ||\n NEEDS_PARENT[element.localName] === current.localName;\n }\n\n // Create an element for this tag.\n function createElement(type, annotation) {\n var tagName = TAG_NAME[type];\n if (!tagName) {\n return null;\n }\n var element = window.document.createElement(tagName);\n var name = TAG_ANNOTATION[type];\n if (name && annotation) {\n element[name] = annotation.trim();\n }\n return element;\n }\n\n var rootDiv = window.document.createElement(\"div\"),\n current = rootDiv,\n t,\n tagStack = [];\n\n while ((t = nextToken()) !== null) {\n if (t[0] === '<') {\n if (t[1] === \"/\") {\n // If the closing tag matches, move back up to the parent node.\n if (tagStack.length &&\n tagStack[tagStack.length - 1] === t.substr(2).replace(\">\", \"\")) {\n tagStack.pop();\n current = current.parentNode;\n }\n // Otherwise just ignore the end tag.\n continue;\n }\n var ts = parseTimeStamp(t.substr(1, t.length - 2));\n var node;\n if (ts) {\n // Timestamps are lead nodes as well.\n node = window.document.createProcessingInstruction(\"timestamp\", ts);\n current.appendChild(node);\n continue;\n }\n var m = t.match(/^<([^.\\s/0-9>]+)(\\.[^\\s\\\\>]+)?([^>\\\\]+)?(\\\\?)>?$/);\n // If we can't parse the tag, skip to the next tag.\n if (!m) {\n continue;\n }\n // Try to construct an element, and ignore the tag if we couldn't.\n node = createElement(m[1], m[3]);\n if (!node) {\n continue;\n }\n // Determine if the tag should be added based on the context of where it\n // is placed in the cuetext.\n if (!shouldAdd(current, node)) {\n continue;\n }\n // Set the class list (as a list of classes, separated by space).\n if (m[2]) {\n var classes = m[2].split('.');\n\n classes.forEach(function(cl) {\n var bgColor = /^bg_/.test(cl);\n // slice out `bg_` if it's a background color\n var colorName = bgColor ? cl.slice(3) : cl;\n\n if (DEFAULT_COLOR_CLASS.hasOwnProperty(colorName)) {\n var propName = bgColor ? 'background-color' : 'color';\n var propValue = DEFAULT_COLOR_CLASS[colorName];\n\n node.style[propName] = propValue;\n }\n });\n\n node.className = classes.join(' ');\n }\n // Append the node to the current node, and enter the scope of the new\n // node.\n tagStack.push(m[1]);\n current.appendChild(node);\n current = node;\n continue;\n }\n\n // Text nodes are leaf nodes.\n current.appendChild(window.document.createTextNode(unescape(t)));\n }\n\n return rootDiv;\n}\n\n// This is a list of all the Unicode characters that have a strong\n// right-to-left category. What this means is that these characters are\n// written right-to-left for sure. It was generated by pulling all the strong\n// right-to-left characters out of the Unicode data table. That table can\n// found at: http://www.unicode.org/Public/UNIDATA/UnicodeData.txt\nvar strongRTLRanges = [[0x5be, 0x5be], [0x5c0, 0x5c0], [0x5c3, 0x5c3], [0x5c6, 0x5c6],\n [0x5d0, 0x5ea], [0x5f0, 0x5f4], [0x608, 0x608], [0x60b, 0x60b], [0x60d, 0x60d],\n [0x61b, 0x61b], [0x61e, 0x64a], [0x66d, 0x66f], [0x671, 0x6d5], [0x6e5, 0x6e6],\n [0x6ee, 0x6ef], [0x6fa, 0x70d], [0x70f, 0x710], [0x712, 0x72f], [0x74d, 0x7a5],\n [0x7b1, 0x7b1], [0x7c0, 0x7ea], [0x7f4, 0x7f5], [0x7fa, 0x7fa], [0x800, 0x815],\n [0x81a, 0x81a], [0x824, 0x824], [0x828, 0x828], [0x830, 0x83e], [0x840, 0x858],\n [0x85e, 0x85e], [0x8a0, 0x8a0], [0x8a2, 0x8ac], [0x200f, 0x200f],\n [0xfb1d, 0xfb1d], [0xfb1f, 0xfb28], [0xfb2a, 0xfb36], [0xfb38, 0xfb3c],\n [0xfb3e, 0xfb3e], [0xfb40, 0xfb41], [0xfb43, 0xfb44], [0xfb46, 0xfbc1],\n [0xfbd3, 0xfd3d], [0xfd50, 0xfd8f], [0xfd92, 0xfdc7], [0xfdf0, 0xfdfc],\n [0xfe70, 0xfe74], [0xfe76, 0xfefc], [0x10800, 0x10805], [0x10808, 0x10808],\n [0x1080a, 0x10835], [0x10837, 0x10838], [0x1083c, 0x1083c], [0x1083f, 0x10855],\n [0x10857, 0x1085f], [0x10900, 0x1091b], [0x10920, 0x10939], [0x1093f, 0x1093f],\n [0x10980, 0x109b7], [0x109be, 0x109bf], [0x10a00, 0x10a00], [0x10a10, 0x10a13],\n [0x10a15, 0x10a17], [0x10a19, 0x10a33], [0x10a40, 0x10a47], [0x10a50, 0x10a58],\n [0x10a60, 0x10a7f], [0x10b00, 0x10b35], [0x10b40, 0x10b55], [0x10b58, 0x10b72],\n [0x10b78, 0x10b7f], [0x10c00, 0x10c48], [0x1ee00, 0x1ee03], [0x1ee05, 0x1ee1f],\n [0x1ee21, 0x1ee22], [0x1ee24, 0x1ee24], [0x1ee27, 0x1ee27], [0x1ee29, 0x1ee32],\n [0x1ee34, 0x1ee37], [0x1ee39, 0x1ee39], [0x1ee3b, 0x1ee3b], [0x1ee42, 0x1ee42],\n [0x1ee47, 0x1ee47], [0x1ee49, 0x1ee49], [0x1ee4b, 0x1ee4b], [0x1ee4d, 0x1ee4f],\n [0x1ee51, 0x1ee52], [0x1ee54, 0x1ee54], [0x1ee57, 0x1ee57], [0x1ee59, 0x1ee59],\n [0x1ee5b, 0x1ee5b], [0x1ee5d, 0x1ee5d], [0x1ee5f, 0x1ee5f], [0x1ee61, 0x1ee62],\n [0x1ee64, 0x1ee64], [0x1ee67, 0x1ee6a], [0x1ee6c, 0x1ee72], [0x1ee74, 0x1ee77],\n [0x1ee79, 0x1ee7c], [0x1ee7e, 0x1ee7e], [0x1ee80, 0x1ee89], [0x1ee8b, 0x1ee9b],\n [0x1eea1, 0x1eea3], [0x1eea5, 0x1eea9], [0x1eeab, 0x1eebb], [0x10fffd, 0x10fffd]];\n\nfunction isStrongRTLChar(charCode) {\n for (var i = 0; i < strongRTLRanges.length; i++) {\n var currentRange = strongRTLRanges[i];\n if (charCode >= currentRange[0] && charCode <= currentRange[1]) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction determineBidi(cueDiv) {\n var nodeStack = [],\n text = \"\",\n charCode;\n\n if (!cueDiv || !cueDiv.childNodes) {\n return \"ltr\";\n }\n\n function pushNodes(nodeStack, node) {\n for (var i = node.childNodes.length - 1; i >= 0; i--) {\n nodeStack.push(node.childNodes[i]);\n }\n }\n\n function nextTextNode(nodeStack) {\n if (!nodeStack || !nodeStack.length) {\n return null;\n }\n\n var node = nodeStack.pop(),\n text = node.textContent || node.innerText;\n if (text) {\n // TODO: This should match all unicode type B characters (paragraph\n // separator characters). See issue #115.\n var m = text.match(/^.*(\\n|\\r)/);\n if (m) {\n nodeStack.length = 0;\n return m[0];\n }\n return text;\n }\n if (node.tagName === \"ruby\") {\n return nextTextNode(nodeStack);\n }\n if (node.childNodes) {\n pushNodes(nodeStack, node);\n return nextTextNode(nodeStack);\n }\n }\n\n pushNodes(nodeStack, cueDiv);\n while ((text = nextTextNode(nodeStack))) {\n for (var i = 0; i < text.length; i++) {\n charCode = text.charCodeAt(i);\n if (isStrongRTLChar(charCode)) {\n return \"rtl\";\n }\n }\n }\n return \"ltr\";\n}\n\nfunction computeLinePos(cue) {\n if (typeof cue.line === \"number\" &&\n (cue.snapToLines || (cue.line >= 0 && cue.line <= 100))) {\n return cue.line;\n }\n if (!cue.track || !cue.track.textTrackList ||\n !cue.track.textTrackList.mediaElement) {\n return -1;\n }\n var track = cue.track,\n trackList = track.textTrackList,\n count = 0;\n for (var i = 0; i < trackList.length && trackList[i] !== track; i++) {\n if (trackList[i].mode === \"showing\") {\n count++;\n }\n }\n return ++count * -1;\n}\n\nfunction StyleBox() {\n}\n\n// Apply styles to a div. If there is no div passed then it defaults to the\n// div on 'this'.\nStyleBox.prototype.applyStyles = function(styles, div) {\n div = div || this.div;\n for (var prop in styles) {\n if (styles.hasOwnProperty(prop)) {\n div.style[prop] = styles[prop];\n }\n }\n};\n\nStyleBox.prototype.formatStyle = function(val, unit) {\n return val === 0 ? 0 : val + unit;\n};\n\n// Constructs the computed display state of the cue (a div). Places the div\n// into the overlay which should be a block level element (usually a div).\nfunction CueStyleBox(window, cue, styleOptions) {\n StyleBox.call(this);\n this.cue = cue;\n\n // Parse our cue's text into a DOM tree rooted at 'cueDiv'. This div will\n // have inline positioning and will function as the cue background box.\n this.cueDiv = parseContent(window, cue.text);\n var styles = {\n color: \"rgba(255, 255, 255, 1)\",\n backgroundColor: \"rgba(0, 0, 0, 0.8)\",\n position: \"relative\",\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n display: \"inline\",\n writingMode: cue.vertical === \"\" ? \"horizontal-tb\"\n : cue.vertical === \"lr\" ? \"vertical-lr\"\n : \"vertical-rl\",\n unicodeBidi: \"plaintext\"\n };\n\n this.applyStyles(styles, this.cueDiv);\n\n // Create an absolutely positioned div that will be used to position the cue\n // div. Note, all WebVTT cue-setting alignments are equivalent to the CSS\n // mirrors of them except middle instead of center on Safari.\n this.div = window.document.createElement(\"div\");\n styles = {\n direction: determineBidi(this.cueDiv),\n writingMode: cue.vertical === \"\" ? \"horizontal-tb\"\n : cue.vertical === \"lr\" ? \"vertical-lr\"\n : \"vertical-rl\",\n unicodeBidi: \"plaintext\",\n textAlign: cue.align === \"middle\" ? \"center\" : cue.align,\n font: styleOptions.font,\n whiteSpace: \"pre-line\",\n position: \"absolute\"\n };\n\n this.applyStyles(styles);\n this.div.appendChild(this.cueDiv);\n\n // Calculate the distance from the reference edge of the viewport to the text\n // position of the cue box. The reference edge will be resolved later when\n // the box orientation styles are applied.\n var textPos = 0;\n switch (cue.positionAlign) {\n case \"start\":\n case \"line-left\":\n textPos = cue.position;\n break;\n case \"center\":\n textPos = cue.position - (cue.size / 2);\n break;\n case \"end\":\n case \"line-right\":\n textPos = cue.position - cue.size;\n break;\n }\n\n // Horizontal box orientation; textPos is the distance from the left edge of the\n // area to the left edge of the box and cue.size is the distance extending to\n // the right from there.\n if (cue.vertical === \"\") {\n this.applyStyles({\n left: this.formatStyle(textPos, \"%\"),\n width: this.formatStyle(cue.size, \"%\")\n });\n // Vertical box orientation; textPos is the distance from the top edge of the\n // area to the top edge of the box and cue.size is the height extending\n // downwards from there.\n } else {\n this.applyStyles({\n top: this.formatStyle(textPos, \"%\"),\n height: this.formatStyle(cue.size, \"%\")\n });\n }\n\n this.move = function(box) {\n this.applyStyles({\n top: this.formatStyle(box.top, \"px\"),\n bottom: this.formatStyle(box.bottom, \"px\"),\n left: this.formatStyle(box.left, \"px\"),\n right: this.formatStyle(box.right, \"px\"),\n height: this.formatStyle(box.height, \"px\"),\n width: this.formatStyle(box.width, \"px\")\n });\n };\n}\nCueStyleBox.prototype = _objCreate(StyleBox.prototype);\nCueStyleBox.prototype.constructor = CueStyleBox;\n\n// Represents the co-ordinates of an Element in a way that we can easily\n// compute things with such as if it overlaps or intersects with another Element.\n// Can initialize it with either a StyleBox or another BoxPosition.\nfunction BoxPosition(obj) {\n // Either a BoxPosition was passed in and we need to copy it, or a StyleBox\n // was passed in and we need to copy the results of 'getBoundingClientRect'\n // as the object returned is readonly. All co-ordinate values are in reference\n // to the viewport origin (top left).\n var lh, height, width, top;\n if (obj.div) {\n height = obj.div.offsetHeight;\n width = obj.div.offsetWidth;\n top = obj.div.offsetTop;\n\n var rects = (rects = obj.div.childNodes) && (rects = rects[0]) &&\n rects.getClientRects && rects.getClientRects();\n obj = obj.div.getBoundingClientRect();\n // In certain cases the outter div will be slightly larger then the sum of\n // the inner div's lines. This could be due to bold text, etc, on some platforms.\n // In this case we should get the average line height and use that. This will\n // result in the desired behaviour.\n lh = rects ? Math.max((rects[0] && rects[0].height) || 0, obj.height / rects.length)\n : 0;\n\n }\n this.left = obj.left;\n this.right = obj.right;\n this.top = obj.top || top;\n this.height = obj.height || height;\n this.bottom = obj.bottom || (top + (obj.height || height));\n this.width = obj.width || width;\n this.lineHeight = lh !== undefined ? lh : obj.lineHeight;\n}\n\n// Move the box along a particular axis. Optionally pass in an amount to move\n// the box. If no amount is passed then the default is the line height of the\n// box.\nBoxPosition.prototype.move = function(axis, toMove) {\n toMove = toMove !== undefined ? toMove : this.lineHeight;\n switch (axis) {\n case \"+x\":\n this.left += toMove;\n this.right += toMove;\n break;\n case \"-x\":\n this.left -= toMove;\n this.right -= toMove;\n break;\n case \"+y\":\n this.top += toMove;\n this.bottom += toMove;\n break;\n case \"-y\":\n this.top -= toMove;\n this.bottom -= toMove;\n break;\n }\n};\n\n// Check if this box overlaps another box, b2.\nBoxPosition.prototype.overlaps = function(b2) {\n return this.left < b2.right &&\n this.right > b2.left &&\n this.top < b2.bottom &&\n this.bottom > b2.top;\n};\n\n// Check if this box overlaps any other boxes in boxes.\nBoxPosition.prototype.overlapsAny = function(boxes) {\n for (var i = 0; i < boxes.length; i++) {\n if (this.overlaps(boxes[i])) {\n return true;\n }\n }\n return false;\n};\n\n// Check if this box is within another box.\nBoxPosition.prototype.within = function(container) {\n return this.top >= container.top &&\n this.bottom <= container.bottom &&\n this.left >= container.left &&\n this.right <= container.right;\n};\n\n// Check if this box is entirely within the container or it is overlapping\n// on the edge opposite of the axis direction passed. For example, if \"+x\" is\n// passed and the box is overlapping on the left edge of the container, then\n// return true.\nBoxPosition.prototype.overlapsOppositeAxis = function(container, axis) {\n switch (axis) {\n case \"+x\":\n return this.left < container.left;\n case \"-x\":\n return this.right > container.right;\n case \"+y\":\n return this.top < container.top;\n case \"-y\":\n return this.bottom > container.bottom;\n }\n};\n\n// Find the percentage of the area that this box is overlapping with another\n// box.\nBoxPosition.prototype.intersectPercentage = function(b2) {\n var x = Math.max(0, Math.min(this.right, b2.right) - Math.max(this.left, b2.left)),\n y = Math.max(0, Math.min(this.bottom, b2.bottom) - Math.max(this.top, b2.top)),\n intersectArea = x * y;\n return intersectArea / (this.height * this.width);\n};\n\n// Convert the positions from this box to CSS compatible positions using\n// the reference container's positions. This has to be done because this\n// box's positions are in reference to the viewport origin, whereas, CSS\n// values are in referecne to their respective edges.\nBoxPosition.prototype.toCSSCompatValues = function(reference) {\n return {\n top: this.top - reference.top,\n bottom: reference.bottom - this.bottom,\n left: this.left - reference.left,\n right: reference.right - this.right,\n height: this.height,\n width: this.width\n };\n};\n\n// Get an object that represents the box's position without anything extra.\n// Can pass a StyleBox, HTMLElement, or another BoxPositon.\nBoxPosition.getSimpleBoxPosition = function(obj) {\n var height = obj.div ? obj.div.offsetHeight : obj.tagName ? obj.offsetHeight : 0;\n var width = obj.div ? obj.div.offsetWidth : obj.tagName ? obj.offsetWidth : 0;\n var top = obj.div ? obj.div.offsetTop : obj.tagName ? obj.offsetTop : 0;\n\n obj = obj.div ? obj.div.getBoundingClientRect() :\n obj.tagName ? obj.getBoundingClientRect() : obj;\n var ret = {\n left: obj.left,\n right: obj.right,\n top: obj.top || top,\n height: obj.height || height,\n bottom: obj.bottom || (top + (obj.height || height)),\n width: obj.width || width\n };\n return ret;\n};\n\n// Move a StyleBox to its specified, or next best, position. The containerBox\n// is the box that contains the StyleBox, such as a div. boxPositions are\n// a list of other boxes that the styleBox can't overlap with.\nfunction moveBoxToLinePosition(window, styleBox, containerBox, boxPositions) {\n\n // Find the best position for a cue box, b, on the video. The axis parameter\n // is a list of axis, the order of which, it will move the box along. For example:\n // Passing [\"+x\", \"-x\"] will move the box first along the x axis in the positive\n // direction. If it doesn't find a good position for it there it will then move\n // it along the x axis in the negative direction.\n function findBestPosition(b, axis) {\n var bestPosition,\n specifiedPosition = new BoxPosition(b),\n percentage = 1; // Highest possible so the first thing we get is better.\n\n for (var i = 0; i < axis.length; i++) {\n while (b.overlapsOppositeAxis(containerBox, axis[i]) ||\n (b.within(containerBox) && b.overlapsAny(boxPositions))) {\n b.move(axis[i]);\n }\n // We found a spot where we aren't overlapping anything. This is our\n // best position.\n if (b.within(containerBox)) {\n return b;\n }\n var p = b.intersectPercentage(containerBox);\n // If we're outside the container box less then we were on our last try\n // then remember this position as the best position.\n if (percentage > p) {\n bestPosition = new BoxPosition(b);\n percentage = p;\n }\n // Reset the box position to the specified position.\n b = new BoxPosition(specifiedPosition);\n }\n return bestPosition || specifiedPosition;\n }\n\n var boxPosition = new BoxPosition(styleBox),\n cue = styleBox.cue,\n linePos = computeLinePos(cue),\n axis = [];\n\n // If we have a line number to align the cue to.\n if (cue.snapToLines) {\n var size;\n switch (cue.vertical) {\n case \"\":\n axis = [ \"+y\", \"-y\" ];\n size = \"height\";\n break;\n case \"rl\":\n axis = [ \"+x\", \"-x\" ];\n size = \"width\";\n break;\n case \"lr\":\n axis = [ \"-x\", \"+x\" ];\n size = \"width\";\n break;\n }\n\n var step = boxPosition.lineHeight,\n position = step * Math.round(linePos),\n maxPosition = containerBox[size] + step,\n initialAxis = axis[0];\n\n // If the specified intial position is greater then the max position then\n // clamp the box to the amount of steps it would take for the box to\n // reach the max position.\n if (Math.abs(position) > maxPosition) {\n position = position < 0 ? -1 : 1;\n position *= Math.ceil(maxPosition / step) * step;\n }\n\n // If computed line position returns negative then line numbers are\n // relative to the bottom of the video instead of the top. Therefore, we\n // need to increase our initial position by the length or width of the\n // video, depending on the writing direction, and reverse our axis directions.\n if (linePos < 0) {\n position += cue.vertical === \"\" ? containerBox.height : containerBox.width;\n axis = axis.reverse();\n }\n\n // Move the box to the specified position. This may not be its best\n // position.\n boxPosition.move(initialAxis, position);\n\n } else {\n // If we have a percentage line value for the cue.\n var calculatedPercentage = (boxPosition.lineHeight / containerBox.height) * 100;\n\n switch (cue.lineAlign) {\n case \"center\":\n linePos -= (calculatedPercentage / 2);\n break;\n case \"end\":\n linePos -= calculatedPercentage;\n break;\n }\n\n // Apply initial line position to the cue box.\n switch (cue.vertical) {\n case \"\":\n styleBox.applyStyles({\n top: styleBox.formatStyle(linePos, \"%\")\n });\n break;\n case \"rl\":\n styleBox.applyStyles({\n left: styleBox.formatStyle(linePos, \"%\")\n });\n break;\n case \"lr\":\n styleBox.applyStyles({\n right: styleBox.formatStyle(linePos, \"%\")\n });\n break;\n }\n\n axis = [ \"+y\", \"-x\", \"+x\", \"-y\" ];\n\n // Get the box position again after we've applied the specified positioning\n // to it.\n boxPosition = new BoxPosition(styleBox);\n }\n\n var bestPosition = findBestPosition(boxPosition, axis);\n styleBox.move(bestPosition.toCSSCompatValues(containerBox));\n}\n\nfunction WebVTT() {\n // Nothing\n}\n\n// Helper to allow strings to be decoded instead of the default binary utf8 data.\nWebVTT.StringDecoder = function() {\n return {\n decode: function(data) {\n if (!data) {\n return \"\";\n }\n if (typeof data !== \"string\") {\n throw new Error(\"Error - expected string data.\");\n }\n return decodeURIComponent(encodeURIComponent(data));\n }\n };\n};\n\nWebVTT.convertCueToDOMTree = function(window, cuetext) {\n if (!window || !cuetext) {\n return null;\n }\n return parseContent(window, cuetext);\n};\n\nvar FONT_SIZE_PERCENT = 0.05;\nvar FONT_STYLE = \"sans-serif\";\nvar CUE_BACKGROUND_PADDING = \"1.5%\";\n\n// Runs the processing model over the cues and regions passed to it.\n// @param overlay A block level element (usually a div) that the computed cues\n// and regions will be placed into.\nWebVTT.processCues = function(window, cues, overlay) {\n if (!window || !cues || !overlay) {\n return null;\n }\n\n // Remove all previous children.\n while (overlay.firstChild) {\n overlay.removeChild(overlay.firstChild);\n }\n\n var paddedOverlay = window.document.createElement(\"div\");\n paddedOverlay.style.position = \"absolute\";\n paddedOverlay.style.left = \"0\";\n paddedOverlay.style.right = \"0\";\n paddedOverlay.style.top = \"0\";\n paddedOverlay.style.bottom = \"0\";\n paddedOverlay.style.margin = CUE_BACKGROUND_PADDING;\n overlay.appendChild(paddedOverlay);\n\n // Determine if we need to compute the display states of the cues. This could\n // be the case if a cue's state has been changed since the last computation or\n // if it has not been computed yet.\n function shouldCompute(cues) {\n for (var i = 0; i < cues.length; i++) {\n if (cues[i].hasBeenReset || !cues[i].displayState) {\n return true;\n }\n }\n return false;\n }\n\n // We don't need to recompute the cues' display states. Just reuse them.\n if (!shouldCompute(cues)) {\n for (var i = 0; i < cues.length; i++) {\n paddedOverlay.appendChild(cues[i].displayState);\n }\n return;\n }\n\n var boxPositions = [],\n containerBox = BoxPosition.getSimpleBoxPosition(paddedOverlay),\n fontSize = Math.round(containerBox.height * FONT_SIZE_PERCENT * 100) / 100;\n var styleOptions = {\n font: fontSize + \"px \" + FONT_STYLE\n };\n\n (function() {\n var styleBox, cue;\n\n for (var i = 0; i < cues.length; i++) {\n cue = cues[i];\n\n // Compute the intial position and styles of the cue div.\n styleBox = new CueStyleBox(window, cue, styleOptions);\n paddedOverlay.appendChild(styleBox.div);\n\n // Move the cue div to it's correct line position.\n moveBoxToLinePosition(window, styleBox, containerBox, boxPositions);\n\n // Remember the computed div so that we don't have to recompute it later\n // if we don't have too.\n cue.displayState = styleBox.div;\n\n boxPositions.push(BoxPosition.getSimpleBoxPosition(styleBox));\n }\n })();\n};\n\nWebVTT.Parser = function(window, vttjs, decoder) {\n if (!decoder) {\n decoder = vttjs;\n vttjs = {};\n }\n if (!vttjs) {\n vttjs = {};\n }\n\n this.window = window;\n this.vttjs = vttjs;\n this.state = \"INITIAL\";\n this.buffer = \"\";\n this.decoder = decoder || new TextDecoder(\"utf8\");\n this.regionList = [];\n};\n\nWebVTT.Parser.prototype = {\n // If the error is a ParsingError then report it to the consumer if\n // possible. If it's not a ParsingError then throw it like normal.\n reportOrThrowError: function(e) {\n if (e instanceof ParsingError) {\n this.onparsingerror && this.onparsingerror(e);\n } else {\n throw e;\n }\n },\n parse: function (data) {\n var self = this;\n\n // If there is no data then we won't decode it, but will just try to parse\n // whatever is in buffer already. This may occur in circumstances, for\n // example when flush() is called.\n if (data) {\n // Try to decode the data that we received.\n self.buffer += self.decoder.decode(data, {stream: true});\n }\n\n function collectNextLine() {\n var buffer = self.buffer;\n var pos = 0;\n while (pos < buffer.length && buffer[pos] !== '\\r' && buffer[pos] !== '\\n') {\n ++pos;\n }\n var line = buffer.substr(0, pos);\n // Advance the buffer early in case we fail below.\n if (buffer[pos] === '\\r') {\n ++pos;\n }\n if (buffer[pos] === '\\n') {\n ++pos;\n }\n self.buffer = buffer.substr(pos);\n return line;\n }\n\n // 3.4 WebVTT region and WebVTT region settings syntax\n function parseRegion(input) {\n var settings = new Settings();\n\n parseOptions(input, function (k, v) {\n switch (k) {\n case \"id\":\n settings.set(k, v);\n break;\n case \"width\":\n settings.percent(k, v);\n break;\n case \"lines\":\n settings.integer(k, v);\n break;\n case \"regionanchor\":\n case \"viewportanchor\":\n var xy = v.split(',');\n if (xy.length !== 2) {\n break;\n }\n // We have to make sure both x and y parse, so use a temporary\n // settings object here.\n var anchor = new Settings();\n anchor.percent(\"x\", xy[0]);\n anchor.percent(\"y\", xy[1]);\n if (!anchor.has(\"x\") || !anchor.has(\"y\")) {\n break;\n }\n settings.set(k + \"X\", anchor.get(\"x\"));\n settings.set(k + \"Y\", anchor.get(\"y\"));\n break;\n case \"scroll\":\n settings.alt(k, v, [\"up\"]);\n break;\n }\n }, /=/, /\\s/);\n\n // Create the region, using default values for any values that were not\n // specified.\n if (settings.has(\"id\")) {\n var region = new (self.vttjs.VTTRegion || self.window.VTTRegion)();\n region.width = settings.get(\"width\", 100);\n region.lines = settings.get(\"lines\", 3);\n region.regionAnchorX = settings.get(\"regionanchorX\", 0);\n region.regionAnchorY = settings.get(\"regionanchorY\", 100);\n region.viewportAnchorX = settings.get(\"viewportanchorX\", 0);\n region.viewportAnchorY = settings.get(\"viewportanchorY\", 100);\n region.scroll = settings.get(\"scroll\", \"\");\n // Register the region.\n self.onregion && self.onregion(region);\n // Remember the VTTRegion for later in case we parse any VTTCues that\n // reference it.\n self.regionList.push({\n id: settings.get(\"id\"),\n region: region\n });\n }\n }\n\n // draft-pantos-http-live-streaming-20\n // https://tools.ietf.org/html/draft-pantos-http-live-streaming-20#section-3.5\n // 3.5 WebVTT\n function parseTimestampMap(input) {\n var settings = new Settings();\n\n parseOptions(input, function(k, v) {\n switch(k) {\n case \"MPEGT\":\n settings.integer(k + 'S', v);\n break;\n case \"LOCA\":\n settings.set(k + 'L', parseTimeStamp(v));\n break;\n }\n }, /[^\\d]:/, /,/);\n\n self.ontimestampmap && self.ontimestampmap({\n \"MPEGTS\": settings.get(\"MPEGTS\"),\n \"LOCAL\": settings.get(\"LOCAL\")\n });\n }\n\n // 3.2 WebVTT metadata header syntax\n function parseHeader(input) {\n if (input.match(/X-TIMESTAMP-MAP/)) {\n // This line contains HLS X-TIMESTAMP-MAP metadata\n parseOptions(input, function(k, v) {\n switch(k) {\n case \"X-TIMESTAMP-MAP\":\n parseTimestampMap(v);\n break;\n }\n }, /=/);\n } else {\n parseOptions(input, function (k, v) {\n switch (k) {\n case \"Region\":\n // 3.3 WebVTT region metadata header syntax\n parseRegion(v);\n break;\n }\n }, /:/);\n }\n\n }\n\n // 5.1 WebVTT file parsing.\n try {\n var line;\n if (self.state === \"INITIAL\") {\n // We can't start parsing until we have the first line.\n if (!/\\r\\n|\\n/.test(self.buffer)) {\n return this;\n }\n\n line = collectNextLine();\n\n var m = line.match(/^WEBVTT([ \\t].*)?$/);\n if (!m || !m[0]) {\n throw new ParsingError(ParsingError.Errors.BadSignature);\n }\n\n self.state = \"HEADER\";\n }\n\n var alreadyCollectedLine = false;\n while (self.buffer) {\n // We can't parse a line until we have the full line.\n if (!/\\r\\n|\\n/.test(self.buffer)) {\n return this;\n }\n\n if (!alreadyCollectedLine) {\n line = collectNextLine();\n } else {\n alreadyCollectedLine = false;\n }\n\n switch (self.state) {\n case \"HEADER\":\n // 13-18 - Allow a header (metadata) under the WEBVTT line.\n if (/:/.test(line)) {\n parseHeader(line);\n } else if (!line) {\n // An empty line terminates the header and starts the body (cues).\n self.state = \"ID\";\n }\n continue;\n case \"NOTE\":\n // Ignore NOTE blocks.\n if (!line) {\n self.state = \"ID\";\n }\n continue;\n case \"ID\":\n // Check for the start of NOTE blocks.\n if (/^NOTE($|[ \\t])/.test(line)) {\n self.state = \"NOTE\";\n break;\n }\n // 19-29 - Allow any number of line terminators, then initialize new cue values.\n if (!line) {\n continue;\n }\n self.cue = new (self.vttjs.VTTCue || self.window.VTTCue)(0, 0, \"\");\n // Safari still uses the old middle value and won't accept center\n try {\n self.cue.align = \"center\";\n } catch (e) {\n self.cue.align = \"middle\";\n }\n self.state = \"CUE\";\n // 30-39 - Check if self line contains an optional identifier or timing data.\n if (line.indexOf(\"-->\") === -1) {\n self.cue.id = line;\n continue;\n }\n // Process line as start of a cue.\n /*falls through*/\n case \"CUE\":\n // 40 - Collect cue timings and settings.\n try {\n parseCue(line, self.cue, self.regionList);\n } catch (e) {\n self.reportOrThrowError(e);\n // In case of an error ignore rest of the cue.\n self.cue = null;\n self.state = \"BADCUE\";\n continue;\n }\n self.state = \"CUETEXT\";\n continue;\n case \"CUETEXT\":\n var hasSubstring = line.indexOf(\"-->\") !== -1;\n // 34 - If we have an empty line then report the cue.\n // 35 - If we have the special substring '-->' then report the cue,\n // but do not collect the line as we need to process the current\n // one as a new cue.\n if (!line || hasSubstring && (alreadyCollectedLine = true)) {\n // We are done parsing self cue.\n self.oncue && self.oncue(self.cue);\n self.cue = null;\n self.state = \"ID\";\n continue;\n }\n if (self.cue.text) {\n self.cue.text += \"\\n\";\n }\n self.cue.text += line.replace(/\\u2028/g, '\\n').replace(/u2029/g, '\\n');\n continue;\n case \"BADCUE\": // BADCUE\n // 54-62 - Collect and discard the remaining cue.\n if (!line) {\n self.state = \"ID\";\n }\n continue;\n }\n }\n } catch (e) {\n self.reportOrThrowError(e);\n\n // If we are currently parsing a cue, report what we have.\n if (self.state === \"CUETEXT\" && self.cue && self.oncue) {\n self.oncue(self.cue);\n }\n self.cue = null;\n // Enter BADWEBVTT state if header was not parsed correctly otherwise\n // another exception occurred so enter BADCUE state.\n self.state = self.state === \"INITIAL\" ? \"BADWEBVTT\" : \"BADCUE\";\n }\n return this;\n },\n flush: function () {\n var self = this;\n try {\n // Finish decoding the stream.\n self.buffer += self.decoder.decode();\n // Synthesize the end of the current cue or region.\n if (self.cue || self.state === \"HEADER\") {\n self.buffer += \"\\n\\n\";\n self.parse();\n }\n // If we've flushed, parsed, and we're still on the INITIAL state then\n // that means we don't have enough of the stream to parse the first\n // line.\n if (self.state === \"INITIAL\") {\n throw new ParsingError(ParsingError.Errors.BadSignature);\n }\n } catch(e) {\n self.reportOrThrowError(e);\n }\n self.onflush && self.onflush();\n return this;\n }\n};\n\nmodule.exports = WebVTT;\n","/**\n * Copyright 2013 vtt.js Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * 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\nvar autoKeyword = \"auto\";\nvar directionSetting = {\n \"\": 1,\n \"lr\": 1,\n \"rl\": 1\n};\nvar alignSetting = {\n \"start\": 1,\n \"center\": 1,\n \"end\": 1,\n \"left\": 1,\n \"right\": 1,\n \"auto\": 1,\n \"line-left\": 1,\n \"line-right\": 1\n};\n\nfunction findDirectionSetting(value) {\n if (typeof value !== \"string\") {\n return false;\n }\n var dir = directionSetting[value.toLowerCase()];\n return dir ? value.toLowerCase() : false;\n}\n\nfunction findAlignSetting(value) {\n if (typeof value !== \"string\") {\n return false;\n }\n var align = alignSetting[value.toLowerCase()];\n return align ? value.toLowerCase() : false;\n}\n\nfunction VTTCue(startTime, endTime, text) {\n /**\n * Shim implementation specific properties. These properties are not in\n * the spec.\n */\n\n // Lets us know when the VTTCue's data has changed in such a way that we need\n // to recompute its display state. This lets us compute its display state\n // lazily.\n this.hasBeenReset = false;\n\n /**\n * VTTCue and TextTrackCue properties\n * http://dev.w3.org/html5/webvtt/#vttcue-interface\n */\n\n var _id = \"\";\n var _pauseOnExit = false;\n var _startTime = startTime;\n var _endTime = endTime;\n var _text = text;\n var _region = null;\n var _vertical = \"\";\n var _snapToLines = true;\n var _line = \"auto\";\n var _lineAlign = \"start\";\n var _position = \"auto\";\n var _positionAlign = \"auto\";\n var _size = 100;\n var _align = \"center\";\n\n Object.defineProperties(this, {\n \"id\": {\n enumerable: true,\n get: function() {\n return _id;\n },\n set: function(value) {\n _id = \"\" + value;\n }\n },\n\n \"pauseOnExit\": {\n enumerable: true,\n get: function() {\n return _pauseOnExit;\n },\n set: function(value) {\n _pauseOnExit = !!value;\n }\n },\n\n \"startTime\": {\n enumerable: true,\n get: function() {\n return _startTime;\n },\n set: function(value) {\n if (typeof value !== \"number\") {\n throw new TypeError(\"Start time must be set to a number.\");\n }\n _startTime = value;\n this.hasBeenReset = true;\n }\n },\n\n \"endTime\": {\n enumerable: true,\n get: function() {\n return _endTime;\n },\n set: function(value) {\n if (typeof value !== \"number\") {\n throw new TypeError(\"End time must be set to a number.\");\n }\n _endTime = value;\n this.hasBeenReset = true;\n }\n },\n\n \"text\": {\n enumerable: true,\n get: function() {\n return _text;\n },\n set: function(value) {\n _text = \"\" + value;\n this.hasBeenReset = true;\n }\n },\n\n \"region\": {\n enumerable: true,\n get: function() {\n return _region;\n },\n set: function(value) {\n _region = value;\n this.hasBeenReset = true;\n }\n },\n\n \"vertical\": {\n enumerable: true,\n get: function() {\n return _vertical;\n },\n set: function(value) {\n var setting = findDirectionSetting(value);\n // Have to check for false because the setting an be an empty string.\n if (setting === false) {\n throw new SyntaxError(\"Vertical: an invalid or illegal direction string was specified.\");\n }\n _vertical = setting;\n this.hasBeenReset = true;\n }\n },\n\n \"snapToLines\": {\n enumerable: true,\n get: function() {\n return _snapToLines;\n },\n set: function(value) {\n _snapToLines = !!value;\n this.hasBeenReset = true;\n }\n },\n\n \"line\": {\n enumerable: true,\n get: function() {\n return _line;\n },\n set: function(value) {\n if (typeof value !== \"number\" && value !== autoKeyword) {\n throw new SyntaxError(\"Line: an invalid number or illegal string was specified.\");\n }\n _line = value;\n this.hasBeenReset = true;\n }\n },\n\n \"lineAlign\": {\n enumerable: true,\n get: function() {\n return _lineAlign;\n },\n set: function(value) {\n var setting = findAlignSetting(value);\n if (!setting) {\n console.warn(\"lineAlign: an invalid or illegal string was specified.\");\n } else {\n _lineAlign = setting;\n this.hasBeenReset = true;\n }\n }\n },\n\n \"position\": {\n enumerable: true,\n get: function() {\n return _position;\n },\n set: function(value) {\n if (value < 0 || value > 100) {\n throw new Error(\"Position must be between 0 and 100.\");\n }\n _position = value;\n this.hasBeenReset = true;\n }\n },\n\n \"positionAlign\": {\n enumerable: true,\n get: function() {\n return _positionAlign;\n },\n set: function(value) {\n var setting = findAlignSetting(value);\n if (!setting) {\n console.warn(\"positionAlign: an invalid or illegal string was specified.\");\n } else {\n _positionAlign = setting;\n this.hasBeenReset = true;\n }\n }\n },\n\n \"size\": {\n enumerable: true,\n get: function() {\n return _size;\n },\n set: function(value) {\n if (value < 0 || value > 100) {\n throw new Error(\"Size must be between 0 and 100.\");\n }\n _size = value;\n this.hasBeenReset = true;\n }\n },\n\n \"align\": {\n enumerable: true,\n get: function() {\n return _align;\n },\n set: function(value) {\n var setting = findAlignSetting(value);\n if (!setting) {\n throw new SyntaxError(\"align: an invalid or illegal alignment string was specified.\");\n }\n _align = setting;\n this.hasBeenReset = true;\n }\n }\n });\n\n /**\n * Other spec defined properties\n */\n\n // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#text-track-cue-display-state\n this.displayState = undefined;\n}\n\n/**\n * VTTCue methods\n */\n\nVTTCue.prototype.getCueAsHTML = function() {\n // Assume WebVTT.convertCueToDOMTree is on the global.\n return WebVTT.convertCueToDOMTree(window, this.text);\n};\n\nmodule.exports = VTTCue;\n","/**\n * Copyright 2013 vtt.js Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * 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\nvar scrollSetting = {\n \"\": true,\n \"up\": true\n};\n\nfunction findScrollSetting(value) {\n if (typeof value !== \"string\") {\n return false;\n }\n var scroll = scrollSetting[value.toLowerCase()];\n return scroll ? value.toLowerCase() : false;\n}\n\nfunction isValidPercentValue(value) {\n return typeof value === \"number\" && (value >= 0 && value <= 100);\n}\n\n// VTTRegion shim http://dev.w3.org/html5/webvtt/#vttregion-interface\nfunction VTTRegion() {\n var _width = 100;\n var _lines = 3;\n var _regionAnchorX = 0;\n var _regionAnchorY = 100;\n var _viewportAnchorX = 0;\n var _viewportAnchorY = 100;\n var _scroll = \"\";\n\n Object.defineProperties(this, {\n \"width\": {\n enumerable: true,\n get: function() {\n return _width;\n },\n set: function(value) {\n if (!isValidPercentValue(value)) {\n throw new Error(\"Width must be between 0 and 100.\");\n }\n _width = value;\n }\n },\n \"lines\": {\n enumerable: true,\n get: function() {\n return _lines;\n },\n set: function(value) {\n if (typeof value !== \"number\") {\n throw new TypeError(\"Lines must be set to a number.\");\n }\n _lines = value;\n }\n },\n \"regionAnchorY\": {\n enumerable: true,\n get: function() {\n return _regionAnchorY;\n },\n set: function(value) {\n if (!isValidPercentValue(value)) {\n throw new Error(\"RegionAnchorX must be between 0 and 100.\");\n }\n _regionAnchorY = value;\n }\n },\n \"regionAnchorX\": {\n enumerable: true,\n get: function() {\n return _regionAnchorX;\n },\n set: function(value) {\n if(!isValidPercentValue(value)) {\n throw new Error(\"RegionAnchorY must be between 0 and 100.\");\n }\n _regionAnchorX = value;\n }\n },\n \"viewportAnchorY\": {\n enumerable: true,\n get: function() {\n return _viewportAnchorY;\n },\n set: function(value) {\n if (!isValidPercentValue(value)) {\n throw new Error(\"ViewportAnchorY must be between 0 and 100.\");\n }\n _viewportAnchorY = value;\n }\n },\n \"viewportAnchorX\": {\n enumerable: true,\n get: function() {\n return _viewportAnchorX;\n },\n set: function(value) {\n if (!isValidPercentValue(value)) {\n throw new Error(\"ViewportAnchorX must be between 0 and 100.\");\n }\n _viewportAnchorX = value;\n }\n },\n \"scroll\": {\n enumerable: true,\n get: function() {\n return _scroll;\n },\n set: function(value) {\n var setting = findScrollSetting(value);\n // Have to check for false as an empty string is a legal value.\n if (setting === false) {\n console.warn(\"Scroll: an invalid or illegal string was specified.\");\n } else {\n _scroll = setting;\n }\n }\n }\n });\n}\n\nmodule.exports = VTTRegion;\n","/**\n * Copyright 2013 vtt.js Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * 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// Default exports for Node. Export the extended versions of VTTCue and\n// VTTRegion in Node since we likely want the capability to convert back and\n// forth between JSON. If we don't then it's not that big of a deal since we're\n// off browser.\n\nvar window = require('global/window');\n\nvar vttjs = module.exports = {\n WebVTT: require(\"./vtt.js\"),\n VTTCue: require(\"./vttcue.js\"),\n VTTRegion: require(\"./vttregion.js\")\n};\n\nwindow.vttjs = vttjs;\nwindow.WebVTT = vttjs.WebVTT;\n\nvar cueShim = vttjs.VTTCue;\nvar regionShim = vttjs.VTTRegion;\nvar nativeVTTCue = window.VTTCue;\nvar nativeVTTRegion = window.VTTRegion;\n\nvttjs.shim = function() {\n window.VTTCue = cueShim;\n window.VTTRegion = regionShim;\n};\n\nvttjs.restore = function() {\n window.VTTCue = nativeVTTCue;\n window.VTTRegion = nativeVTTRegion;\n};\n\nif (!window.VTTCue) {\n vttjs.shim();\n}\n","// see https://tools.ietf.org/html/rfc1808\n\n(function (root) {\n var URL_REGEX =\n /^(?=((?:[a-zA-Z0-9+\\-.]+:)?))\\1(?=((?:\\/\\/[^\\/?#]*)?))\\2(?=((?:(?:[^?#\\/]*\\/)*[^;?#\\/]*)?))\\3((?:;[^?#]*)?)(\\?[^#]*)?(#[^]*)?$/;\n var FIRST_SEGMENT_REGEX = /^(?=([^\\/?#]*))\\1([^]*)$/;\n var SLASH_DOT_REGEX = /(?:\\/|^)\\.(?=\\/)/g;\n var SLASH_DOT_DOT_REGEX = /(?:\\/|^)\\.\\.\\/(?!\\.\\.\\/)[^\\/]*(?=\\/)/g;\n\n var URLToolkit = {\n // If opts.alwaysNormalize is true then the path will always be normalized even when it starts with / or //\n // E.g\n // With opts.alwaysNormalize = false (default, spec compliant)\n // http://a.com/b/cd + /e/f/../g => http://a.com/e/f/../g\n // With opts.alwaysNormalize = true (not spec compliant)\n // http://a.com/b/cd + /e/f/../g => http://a.com/e/g\n buildAbsoluteURL: function (baseURL, relativeURL, opts) {\n opts = opts || {};\n // remove any remaining space and CRLF\n baseURL = baseURL.trim();\n relativeURL = relativeURL.trim();\n if (!relativeURL) {\n // 2a) If the embedded URL is entirely empty, it inherits the\n // entire base URL (i.e., is set equal to the base URL)\n // and we are done.\n if (!opts.alwaysNormalize) {\n return baseURL;\n }\n var basePartsForNormalise = URLToolkit.parseURL(baseURL);\n if (!basePartsForNormalise) {\n throw new Error('Error trying to parse base URL.');\n }\n basePartsForNormalise.path = URLToolkit.normalizePath(\n basePartsForNormalise.path\n );\n return URLToolkit.buildURLFromParts(basePartsForNormalise);\n }\n var relativeParts = URLToolkit.parseURL(relativeURL);\n if (!relativeParts) {\n throw new Error('Error trying to parse relative URL.');\n }\n if (relativeParts.scheme) {\n // 2b) If the embedded URL starts with a scheme name, it is\n // interpreted as an absolute URL and we are done.\n if (!opts.alwaysNormalize) {\n return relativeURL;\n }\n relativeParts.path = URLToolkit.normalizePath(relativeParts.path);\n return URLToolkit.buildURLFromParts(relativeParts);\n }\n var baseParts = URLToolkit.parseURL(baseURL);\n if (!baseParts) {\n throw new Error('Error trying to parse base URL.');\n }\n if (!baseParts.netLoc && baseParts.path && baseParts.path[0] !== '/') {\n // If netLoc missing and path doesn't start with '/', assume everthing before the first '/' is the netLoc\n // This causes 'example.com/a' to be handled as '//example.com/a' instead of '/example.com/a'\n var pathParts = FIRST_SEGMENT_REGEX.exec(baseParts.path);\n baseParts.netLoc = pathParts[1];\n baseParts.path = pathParts[2];\n }\n if (baseParts.netLoc && !baseParts.path) {\n baseParts.path = '/';\n }\n var builtParts = {\n // 2c) Otherwise, the embedded URL inherits the scheme of\n // the base URL.\n scheme: baseParts.scheme,\n netLoc: relativeParts.netLoc,\n path: null,\n params: relativeParts.params,\n query: relativeParts.query,\n fragment: relativeParts.fragment,\n };\n if (!relativeParts.netLoc) {\n // 3) If the embedded URL's is non-empty, we skip to\n // Step 7. Otherwise, the embedded URL inherits the \n // (if any) of the base URL.\n builtParts.netLoc = baseParts.netLoc;\n // 4) If the embedded URL path is preceded by a slash \"/\", the\n // path is not relative and we skip to Step 7.\n if (relativeParts.path[0] !== '/') {\n if (!relativeParts.path) {\n // 5) If the embedded URL path is empty (and not preceded by a\n // slash), then the embedded URL inherits the base URL path\n builtParts.path = baseParts.path;\n // 5a) if the embedded URL's is non-empty, we skip to\n // step 7; otherwise, it inherits the of the base\n // URL (if any) and\n if (!relativeParts.params) {\n builtParts.params = baseParts.params;\n // 5b) if the embedded URL's is non-empty, we skip to\n // step 7; otherwise, it inherits the of the base\n // URL (if any) and we skip to step 7.\n if (!relativeParts.query) {\n builtParts.query = baseParts.query;\n }\n }\n } else {\n // 6) The last segment of the base URL's path (anything\n // following the rightmost slash \"/\", or the entire path if no\n // slash is present) is removed and the embedded URL's path is\n // appended in its place.\n var baseURLPath = baseParts.path;\n var newPath =\n baseURLPath.substring(0, baseURLPath.lastIndexOf('/') + 1) +\n relativeParts.path;\n builtParts.path = URLToolkit.normalizePath(newPath);\n }\n }\n }\n if (builtParts.path === null) {\n builtParts.path = opts.alwaysNormalize\n ? URLToolkit.normalizePath(relativeParts.path)\n : relativeParts.path;\n }\n return URLToolkit.buildURLFromParts(builtParts);\n },\n parseURL: function (url) {\n var parts = URL_REGEX.exec(url);\n if (!parts) {\n return null;\n }\n return {\n scheme: parts[1] || '',\n netLoc: parts[2] || '',\n path: parts[3] || '',\n params: parts[4] || '',\n query: parts[5] || '',\n fragment: parts[6] || '',\n };\n },\n normalizePath: function (path) {\n // The following operations are\n // then applied, in order, to the new path:\n // 6a) All occurrences of \"./\", where \".\" is a complete path\n // segment, are removed.\n // 6b) If the path ends with \".\" as a complete path segment,\n // that \".\" is removed.\n path = path.split('').reverse().join('').replace(SLASH_DOT_REGEX, '');\n // 6c) All occurrences of \"/../\", where is a\n // complete path segment not equal to \"..\", are removed.\n // Removal of these path segments is performed iteratively,\n // removing the leftmost matching pattern on each iteration,\n // until no matching pattern remains.\n // 6d) If the path ends with \"/..\", where is a\n // complete path segment not equal to \"..\", that\n // \"/..\" is removed.\n while (\n path.length !== (path = path.replace(SLASH_DOT_DOT_REGEX, '')).length\n ) {}\n return path.split('').reverse().join('');\n },\n buildURLFromParts: function (parts) {\n return (\n parts.scheme +\n parts.netLoc +\n parts.path +\n parts.params +\n parts.query +\n parts.fragment\n );\n },\n };\n\n if (typeof exports === 'object' && typeof module === 'object')\n module.exports = URLToolkit;\n else if (typeof define === 'function' && define.amd)\n define([], function () {\n return URLToolkit;\n });\n else if (typeof exports === 'object') exports['URLToolkit'] = URLToolkit;\n else root['URLToolkit'] = URLToolkit;\n})(this);\n","import URLToolkit from 'url-toolkit';\nimport window from 'global/window';\nvar DEFAULT_LOCATION = 'http://example.com';\n\nvar resolveUrl = function resolveUrl(baseUrl, relativeUrl) {\n // return early if we don't need to resolve\n if (/^[a-z]+:/i.test(relativeUrl)) {\n return relativeUrl;\n } // if baseUrl is a data URI, ignore it and resolve everything relative to window.location\n\n\n if (/^data:/.test(baseUrl)) {\n baseUrl = window.location && window.location.href || '';\n } // IE11 supports URL but not the URL constructor\n // feature detect the behavior we want\n\n\n var nativeURL = typeof window.URL === 'function';\n var protocolLess = /^\\/\\//.test(baseUrl); // remove location if window.location isn't available (i.e. we're in node)\n // and if baseUrl isn't an absolute url\n\n var removeLocation = !window.location && !/\\/\\//i.test(baseUrl); // if the base URL is relative then combine with the current location\n\n if (nativeURL) {\n baseUrl = new window.URL(baseUrl, window.location || DEFAULT_LOCATION);\n } else if (!/\\/\\//i.test(baseUrl)) {\n baseUrl = URLToolkit.buildAbsoluteURL(window.location && window.location.href || '', baseUrl);\n }\n\n if (nativeURL) {\n var newUrl = new URL(relativeUrl, baseUrl); // if we're a protocol-less url, remove the protocol\n // and if we're location-less, remove the location\n // otherwise, return the url unmodified\n\n if (removeLocation) {\n return newUrl.href.slice(DEFAULT_LOCATION.length);\n } else if (protocolLess) {\n return newUrl.href.slice(newUrl.protocol.length);\n }\n\n return newUrl.href;\n }\n\n return URLToolkit.buildAbsoluteURL(baseUrl, relativeUrl);\n};\n\nexport default resolveUrl;","/**\n * @file stream.js\n */\n\n/**\n * A lightweight readable stream implemention that handles event dispatching.\n *\n * @class Stream\n */\nvar Stream = /*#__PURE__*/function () {\n function Stream() {\n this.listeners = {};\n }\n /**\n * Add a listener for a specified event type.\n *\n * @param {string} type the event name\n * @param {Function} listener the callback to be invoked when an event of\n * the specified type occurs\n */\n\n\n var _proto = Stream.prototype;\n\n _proto.on = function on(type, listener) {\n if (!this.listeners[type]) {\n this.listeners[type] = [];\n }\n\n this.listeners[type].push(listener);\n }\n /**\n * Remove a listener for a specified event type.\n *\n * @param {string} type the event name\n * @param {Function} listener a function previously registered for this\n * type of event through `on`\n * @return {boolean} if we could turn it off or not\n */\n ;\n\n _proto.off = function off(type, listener) {\n if (!this.listeners[type]) {\n return false;\n }\n\n var index = this.listeners[type].indexOf(listener); // TODO: which is better?\n // In Video.js we slice listener functions\n // on trigger so that it does not mess up the order\n // while we loop through.\n //\n // Here we slice on off so that the loop in trigger\n // can continue using it's old reference to loop without\n // messing up the order.\n\n this.listeners[type] = this.listeners[type].slice(0);\n this.listeners[type].splice(index, 1);\n return index > -1;\n }\n /**\n * Trigger an event of the specified type on this stream. Any additional\n * arguments to this function are passed as parameters to event listeners.\n *\n * @param {string} type the event name\n */\n ;\n\n _proto.trigger = function trigger(type) {\n var callbacks = this.listeners[type];\n\n if (!callbacks) {\n return;\n } // Slicing the arguments on every invocation of this method\n // can add a significant amount of overhead. Avoid the\n // intermediate object creation for the common case of a\n // single callback argument\n\n\n if (arguments.length === 2) {\n var length = callbacks.length;\n\n for (var i = 0; i < length; ++i) {\n callbacks[i].call(this, arguments[1]);\n }\n } else {\n var args = Array.prototype.slice.call(arguments, 1);\n var _length = callbacks.length;\n\n for (var _i = 0; _i < _length; ++_i) {\n callbacks[_i].apply(this, args);\n }\n }\n }\n /**\n * Destroys the stream and cleans up.\n */\n ;\n\n _proto.dispose = function dispose() {\n this.listeners = {};\n }\n /**\n * Forwards all `data` events on this stream to the destination stream. The\n * destination stream should provide a method `push` to receive the data\n * events as they arrive.\n *\n * @param {Stream} destination the stream that will receive all `data` events\n * @see http://nodejs.org/api/stream.html#stream_readable_pipe_destination_options\n */\n ;\n\n _proto.pipe = function pipe(destination) {\n this.on('data', function (data) {\n destination.push(data);\n });\n };\n\n return Stream;\n}();\n\nexport { Stream as default };","import window from 'global/window';\n\nvar atob = function atob(s) {\n return window.atob ? window.atob(s) : Buffer.from(s, 'base64').toString('binary');\n};\n\nexport default function decodeB64ToUint8Array(b64Text) {\n var decodedString = atob(b64Text);\n var array = new Uint8Array(decodedString.length);\n\n for (var i = 0; i < decodedString.length; i++) {\n array[i] = decodedString.charCodeAt(i);\n }\n\n return array;\n}","/*! @name m3u8-parser @version 7.1.0 @license Apache-2.0 */\nimport Stream from '@videojs/vhs-utils/es/stream.js';\nimport _extends from '@babel/runtime/helpers/extends';\nimport decodeB64ToUint8Array from '@videojs/vhs-utils/es/decode-b64-to-uint8-array.js';\n\n/**\n * @file m3u8/line-stream.js\n */\n/**\n * A stream that buffers string input and generates a `data` event for each\n * line.\n *\n * @class LineStream\n * @extends Stream\n */\n\nclass LineStream extends Stream {\n constructor() {\n super();\n this.buffer = '';\n }\n /**\n * Add new data to be parsed.\n *\n * @param {string} data the text to process\n */\n\n\n push(data) {\n let nextNewline;\n this.buffer += data;\n nextNewline = this.buffer.indexOf('\\n');\n\n for (; nextNewline > -1; nextNewline = this.buffer.indexOf('\\n')) {\n this.trigger('data', this.buffer.substring(0, nextNewline));\n this.buffer = this.buffer.substring(nextNewline + 1);\n }\n }\n\n}\n\nconst TAB = String.fromCharCode(0x09);\n\nconst parseByterange = function (byterangeString) {\n // optionally match and capture 0+ digits before `@`\n // optionally match and capture 0+ digits after `@`\n const match = /([0-9.]*)?@?([0-9.]*)?/.exec(byterangeString || '');\n const result = {};\n\n if (match[1]) {\n result.length = parseInt(match[1], 10);\n }\n\n if (match[2]) {\n result.offset = parseInt(match[2], 10);\n }\n\n return result;\n};\n/**\n * \"forgiving\" attribute list psuedo-grammar:\n * attributes -> keyvalue (',' keyvalue)*\n * keyvalue -> key '=' value\n * key -> [^=]*\n * value -> '\"' [^\"]* '\"' | [^,]*\n */\n\n\nconst attributeSeparator = function () {\n const key = '[^=]*';\n const value = '\"[^\"]*\"|[^,]*';\n const keyvalue = '(?:' + key + ')=(?:' + value + ')';\n return new RegExp('(?:^|,)(' + keyvalue + ')');\n};\n/**\n * Parse attributes from a line given the separator\n *\n * @param {string} attributes the attribute line to parse\n */\n\n\nconst parseAttributes = function (attributes) {\n const result = {};\n\n if (!attributes) {\n return result;\n } // split the string using attributes as the separator\n\n\n const attrs = attributes.split(attributeSeparator());\n let i = attrs.length;\n let attr;\n\n while (i--) {\n // filter out unmatched portions of the string\n if (attrs[i] === '') {\n continue;\n } // split the key and value\n\n\n attr = /([^=]*)=(.*)/.exec(attrs[i]).slice(1); // trim whitespace and remove optional quotes around the value\n\n attr[0] = attr[0].replace(/^\\s+|\\s+$/g, '');\n attr[1] = attr[1].replace(/^\\s+|\\s+$/g, '');\n attr[1] = attr[1].replace(/^['\"](.*)['\"]$/g, '$1');\n result[attr[0]] = attr[1];\n }\n\n return result;\n};\n/**\n * A line-level M3U8 parser event stream. It expects to receive input one\n * line at a time and performs a context-free parse of its contents. A stream\n * interpretation of a manifest can be useful if the manifest is expected to\n * be too large to fit comfortably into memory or the entirety of the input\n * is not immediately available. Otherwise, it's probably much easier to work\n * with a regular `Parser` object.\n *\n * Produces `data` events with an object that captures the parser's\n * interpretation of the input. That object has a property `tag` that is one\n * of `uri`, `comment`, or `tag`. URIs only have a single additional\n * property, `line`, which captures the entirety of the input without\n * interpretation. Comments similarly have a single additional property\n * `text` which is the input without the leading `#`.\n *\n * Tags always have a property `tagType` which is the lower-cased version of\n * the M3U8 directive without the `#EXT` or `#EXT-X-` prefix. For instance,\n * `#EXT-X-MEDIA-SEQUENCE` becomes `media-sequence` when parsed. Unrecognized\n * tags are given the tag type `unknown` and a single additional property\n * `data` with the remainder of the input.\n *\n * @class ParseStream\n * @extends Stream\n */\n\n\nclass ParseStream extends Stream {\n constructor() {\n super();\n this.customParsers = [];\n this.tagMappers = [];\n }\n /**\n * Parses an additional line of input.\n *\n * @param {string} line a single line of an M3U8 file to parse\n */\n\n\n push(line) {\n let match;\n let event; // strip whitespace\n\n line = line.trim();\n\n if (line.length === 0) {\n // ignore empty lines\n return;\n } // URIs\n\n\n if (line[0] !== '#') {\n this.trigger('data', {\n type: 'uri',\n uri: line\n });\n return;\n } // map tags\n\n\n const newLines = this.tagMappers.reduce((acc, mapper) => {\n const mappedLine = mapper(line); // skip if unchanged\n\n if (mappedLine === line) {\n return acc;\n }\n\n return acc.concat([mappedLine]);\n }, [line]);\n newLines.forEach(newLine => {\n for (let i = 0; i < this.customParsers.length; i++) {\n if (this.customParsers[i].call(this, newLine)) {\n return;\n }\n } // Comments\n\n\n if (newLine.indexOf('#EXT') !== 0) {\n this.trigger('data', {\n type: 'comment',\n text: newLine.slice(1)\n });\n return;\n } // strip off any carriage returns here so the regex matching\n // doesn't have to account for them.\n\n\n newLine = newLine.replace('\\r', ''); // Tags\n\n match = /^#EXTM3U/.exec(newLine);\n\n if (match) {\n this.trigger('data', {\n type: 'tag',\n tagType: 'm3u'\n });\n return;\n }\n\n match = /^#EXTINF:([0-9\\.]*)?,?(.*)?$/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'inf'\n };\n\n if (match[1]) {\n event.duration = parseFloat(match[1]);\n }\n\n if (match[2]) {\n event.title = match[2];\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-TARGETDURATION:([0-9.]*)?/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'targetduration'\n };\n\n if (match[1]) {\n event.duration = parseInt(match[1], 10);\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-VERSION:([0-9.]*)?/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'version'\n };\n\n if (match[1]) {\n event.version = parseInt(match[1], 10);\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-MEDIA-SEQUENCE:(\\-?[0-9.]*)?/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'media-sequence'\n };\n\n if (match[1]) {\n event.number = parseInt(match[1], 10);\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-DISCONTINUITY-SEQUENCE:(\\-?[0-9.]*)?/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'discontinuity-sequence'\n };\n\n if (match[1]) {\n event.number = parseInt(match[1], 10);\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-PLAYLIST-TYPE:(.*)?$/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'playlist-type'\n };\n\n if (match[1]) {\n event.playlistType = match[1];\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-BYTERANGE:(.*)?$/.exec(newLine);\n\n if (match) {\n event = _extends(parseByterange(match[1]), {\n type: 'tag',\n tagType: 'byterange'\n });\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-ALLOW-CACHE:(YES|NO)?/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'allow-cache'\n };\n\n if (match[1]) {\n event.allowed = !/NO/.test(match[1]);\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-MAP:(.*)$/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'map'\n };\n\n if (match[1]) {\n const attributes = parseAttributes(match[1]);\n\n if (attributes.URI) {\n event.uri = attributes.URI;\n }\n\n if (attributes.BYTERANGE) {\n event.byterange = parseByterange(attributes.BYTERANGE);\n }\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-STREAM-INF:(.*)$/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'stream-inf'\n };\n\n if (match[1]) {\n event.attributes = parseAttributes(match[1]);\n\n if (event.attributes.RESOLUTION) {\n const split = event.attributes.RESOLUTION.split('x');\n const resolution = {};\n\n if (split[0]) {\n resolution.width = parseInt(split[0], 10);\n }\n\n if (split[1]) {\n resolution.height = parseInt(split[1], 10);\n }\n\n event.attributes.RESOLUTION = resolution;\n }\n\n if (event.attributes.BANDWIDTH) {\n event.attributes.BANDWIDTH = parseInt(event.attributes.BANDWIDTH, 10);\n }\n\n if (event.attributes['FRAME-RATE']) {\n event.attributes['FRAME-RATE'] = parseFloat(event.attributes['FRAME-RATE']);\n }\n\n if (event.attributes['PROGRAM-ID']) {\n event.attributes['PROGRAM-ID'] = parseInt(event.attributes['PROGRAM-ID'], 10);\n }\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-MEDIA:(.*)$/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'media'\n };\n\n if (match[1]) {\n event.attributes = parseAttributes(match[1]);\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-ENDLIST/.exec(newLine);\n\n if (match) {\n this.trigger('data', {\n type: 'tag',\n tagType: 'endlist'\n });\n return;\n }\n\n match = /^#EXT-X-DISCONTINUITY/.exec(newLine);\n\n if (match) {\n this.trigger('data', {\n type: 'tag',\n tagType: 'discontinuity'\n });\n return;\n }\n\n match = /^#EXT-X-PROGRAM-DATE-TIME:(.*)$/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'program-date-time'\n };\n\n if (match[1]) {\n event.dateTimeString = match[1];\n event.dateTimeObject = new Date(match[1]);\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-KEY:(.*)$/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'key'\n };\n\n if (match[1]) {\n event.attributes = parseAttributes(match[1]); // parse the IV string into a Uint32Array\n\n if (event.attributes.IV) {\n if (event.attributes.IV.substring(0, 2).toLowerCase() === '0x') {\n event.attributes.IV = event.attributes.IV.substring(2);\n }\n\n event.attributes.IV = event.attributes.IV.match(/.{8}/g);\n event.attributes.IV[0] = parseInt(event.attributes.IV[0], 16);\n event.attributes.IV[1] = parseInt(event.attributes.IV[1], 16);\n event.attributes.IV[2] = parseInt(event.attributes.IV[2], 16);\n event.attributes.IV[3] = parseInt(event.attributes.IV[3], 16);\n event.attributes.IV = new Uint32Array(event.attributes.IV);\n }\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-START:(.*)$/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'start'\n };\n\n if (match[1]) {\n event.attributes = parseAttributes(match[1]);\n event.attributes['TIME-OFFSET'] = parseFloat(event.attributes['TIME-OFFSET']);\n event.attributes.PRECISE = /YES/.test(event.attributes.PRECISE);\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-CUE-OUT-CONT:(.*)?$/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'cue-out-cont'\n };\n\n if (match[1]) {\n event.data = match[1];\n } else {\n event.data = '';\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-CUE-OUT:(.*)?$/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'cue-out'\n };\n\n if (match[1]) {\n event.data = match[1];\n } else {\n event.data = '';\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-CUE-IN:(.*)?$/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'cue-in'\n };\n\n if (match[1]) {\n event.data = match[1];\n } else {\n event.data = '';\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-SKIP:(.*)$/.exec(newLine);\n\n if (match && match[1]) {\n event = {\n type: 'tag',\n tagType: 'skip'\n };\n event.attributes = parseAttributes(match[1]);\n\n if (event.attributes.hasOwnProperty('SKIPPED-SEGMENTS')) {\n event.attributes['SKIPPED-SEGMENTS'] = parseInt(event.attributes['SKIPPED-SEGMENTS'], 10);\n }\n\n if (event.attributes.hasOwnProperty('RECENTLY-REMOVED-DATERANGES')) {\n event.attributes['RECENTLY-REMOVED-DATERANGES'] = event.attributes['RECENTLY-REMOVED-DATERANGES'].split(TAB);\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-PART:(.*)$/.exec(newLine);\n\n if (match && match[1]) {\n event = {\n type: 'tag',\n tagType: 'part'\n };\n event.attributes = parseAttributes(match[1]);\n ['DURATION'].forEach(function (key) {\n if (event.attributes.hasOwnProperty(key)) {\n event.attributes[key] = parseFloat(event.attributes[key]);\n }\n });\n ['INDEPENDENT', 'GAP'].forEach(function (key) {\n if (event.attributes.hasOwnProperty(key)) {\n event.attributes[key] = /YES/.test(event.attributes[key]);\n }\n });\n\n if (event.attributes.hasOwnProperty('BYTERANGE')) {\n event.attributes.byterange = parseByterange(event.attributes.BYTERANGE);\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-SERVER-CONTROL:(.*)$/.exec(newLine);\n\n if (match && match[1]) {\n event = {\n type: 'tag',\n tagType: 'server-control'\n };\n event.attributes = parseAttributes(match[1]);\n ['CAN-SKIP-UNTIL', 'PART-HOLD-BACK', 'HOLD-BACK'].forEach(function (key) {\n if (event.attributes.hasOwnProperty(key)) {\n event.attributes[key] = parseFloat(event.attributes[key]);\n }\n });\n ['CAN-SKIP-DATERANGES', 'CAN-BLOCK-RELOAD'].forEach(function (key) {\n if (event.attributes.hasOwnProperty(key)) {\n event.attributes[key] = /YES/.test(event.attributes[key]);\n }\n });\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-PART-INF:(.*)$/.exec(newLine);\n\n if (match && match[1]) {\n event = {\n type: 'tag',\n tagType: 'part-inf'\n };\n event.attributes = parseAttributes(match[1]);\n ['PART-TARGET'].forEach(function (key) {\n if (event.attributes.hasOwnProperty(key)) {\n event.attributes[key] = parseFloat(event.attributes[key]);\n }\n });\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-PRELOAD-HINT:(.*)$/.exec(newLine);\n\n if (match && match[1]) {\n event = {\n type: 'tag',\n tagType: 'preload-hint'\n };\n event.attributes = parseAttributes(match[1]);\n ['BYTERANGE-START', 'BYTERANGE-LENGTH'].forEach(function (key) {\n if (event.attributes.hasOwnProperty(key)) {\n event.attributes[key] = parseInt(event.attributes[key], 10);\n const subkey = key === 'BYTERANGE-LENGTH' ? 'length' : 'offset';\n event.attributes.byterange = event.attributes.byterange || {};\n event.attributes.byterange[subkey] = event.attributes[key]; // only keep the parsed byterange object.\n\n delete event.attributes[key];\n }\n });\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-RENDITION-REPORT:(.*)$/.exec(newLine);\n\n if (match && match[1]) {\n event = {\n type: 'tag',\n tagType: 'rendition-report'\n };\n event.attributes = parseAttributes(match[1]);\n ['LAST-MSN', 'LAST-PART'].forEach(function (key) {\n if (event.attributes.hasOwnProperty(key)) {\n event.attributes[key] = parseInt(event.attributes[key], 10);\n }\n });\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-DATERANGE:(.*)$/.exec(newLine);\n\n if (match && match[1]) {\n event = {\n type: 'tag',\n tagType: 'daterange'\n };\n event.attributes = parseAttributes(match[1]);\n ['ID', 'CLASS'].forEach(function (key) {\n if (event.attributes.hasOwnProperty(key)) {\n event.attributes[key] = String(event.attributes[key]);\n }\n });\n ['START-DATE', 'END-DATE'].forEach(function (key) {\n if (event.attributes.hasOwnProperty(key)) {\n event.attributes[key] = new Date(event.attributes[key]);\n }\n });\n ['DURATION', 'PLANNED-DURATION'].forEach(function (key) {\n if (event.attributes.hasOwnProperty(key)) {\n event.attributes[key] = parseFloat(event.attributes[key]);\n }\n });\n ['END-ON-NEXT'].forEach(function (key) {\n if (event.attributes.hasOwnProperty(key)) {\n event.attributes[key] = /YES/i.test(event.attributes[key]);\n }\n });\n ['SCTE35-CMD', ' SCTE35-OUT', 'SCTE35-IN'].forEach(function (key) {\n if (event.attributes.hasOwnProperty(key)) {\n event.attributes[key] = event.attributes[key].toString(16);\n }\n });\n const clientAttributePattern = /^X-([A-Z]+-)+[A-Z]+$/;\n\n for (const key in event.attributes) {\n if (!clientAttributePattern.test(key)) {\n continue;\n }\n\n const isHexaDecimal = /[0-9A-Fa-f]{6}/g.test(event.attributes[key]);\n const isDecimalFloating = /^\\d+(\\.\\d+)?$/.test(event.attributes[key]);\n event.attributes[key] = isHexaDecimal ? event.attributes[key].toString(16) : isDecimalFloating ? parseFloat(event.attributes[key]) : String(event.attributes[key]);\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-INDEPENDENT-SEGMENTS/.exec(newLine);\n\n if (match) {\n this.trigger('data', {\n type: 'tag',\n tagType: 'independent-segments'\n });\n return;\n }\n\n match = /^#EXT-X-CONTENT-STEERING:(.*)$/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'content-steering'\n };\n event.attributes = parseAttributes(match[1]);\n this.trigger('data', event);\n return;\n } // unknown tag type\n\n\n this.trigger('data', {\n type: 'tag',\n data: newLine.slice(4)\n });\n });\n }\n /**\n * Add a parser for custom headers\n *\n * @param {Object} options a map of options for the added parser\n * @param {RegExp} options.expression a regular expression to match the custom header\n * @param {string} options.customType the custom type to register to the output\n * @param {Function} [options.dataParser] function to parse the line into an object\n * @param {boolean} [options.segment] should tag data be attached to the segment object\n */\n\n\n addParser({\n expression,\n customType,\n dataParser,\n segment\n }) {\n if (typeof dataParser !== 'function') {\n dataParser = line => line;\n }\n\n this.customParsers.push(line => {\n const match = expression.exec(line);\n\n if (match) {\n this.trigger('data', {\n type: 'custom',\n data: dataParser(line),\n customType,\n segment\n });\n return true;\n }\n });\n }\n /**\n * Add a custom header mapper\n *\n * @param {Object} options\n * @param {RegExp} options.expression a regular expression to match the custom header\n * @param {Function} options.map function to translate tag into a different tag\n */\n\n\n addTagMapper({\n expression,\n map\n }) {\n const mapFn = line => {\n if (expression.test(line)) {\n return map(line);\n }\n\n return line;\n };\n\n this.tagMappers.push(mapFn);\n }\n\n}\n\nconst camelCase = str => str.toLowerCase().replace(/-(\\w)/g, a => a[1].toUpperCase());\n\nconst camelCaseKeys = function (attributes) {\n const result = {};\n Object.keys(attributes).forEach(function (key) {\n result[camelCase(key)] = attributes[key];\n });\n return result;\n}; // set SERVER-CONTROL hold back based upon targetDuration and partTargetDuration\n// we need this helper because defaults are based upon targetDuration and\n// partTargetDuration being set, but they may not be if SERVER-CONTROL appears before\n// target durations are set.\n\n\nconst setHoldBack = function (manifest) {\n const {\n serverControl,\n targetDuration,\n partTargetDuration\n } = manifest;\n\n if (!serverControl) {\n return;\n }\n\n const tag = '#EXT-X-SERVER-CONTROL';\n const hb = 'holdBack';\n const phb = 'partHoldBack';\n const minTargetDuration = targetDuration && targetDuration * 3;\n const minPartDuration = partTargetDuration && partTargetDuration * 2;\n\n if (targetDuration && !serverControl.hasOwnProperty(hb)) {\n serverControl[hb] = minTargetDuration;\n this.trigger('info', {\n message: `${tag} defaulting HOLD-BACK to targetDuration * 3 (${minTargetDuration}).`\n });\n }\n\n if (minTargetDuration && serverControl[hb] < minTargetDuration) {\n this.trigger('warn', {\n message: `${tag} clamping HOLD-BACK (${serverControl[hb]}) to targetDuration * 3 (${minTargetDuration})`\n });\n serverControl[hb] = minTargetDuration;\n } // default no part hold back to part target duration * 3\n\n\n if (partTargetDuration && !serverControl.hasOwnProperty(phb)) {\n serverControl[phb] = partTargetDuration * 3;\n this.trigger('info', {\n message: `${tag} defaulting PART-HOLD-BACK to partTargetDuration * 3 (${serverControl[phb]}).`\n });\n } // if part hold back is too small default it to part target duration * 2\n\n\n if (partTargetDuration && serverControl[phb] < minPartDuration) {\n this.trigger('warn', {\n message: `${tag} clamping PART-HOLD-BACK (${serverControl[phb]}) to partTargetDuration * 2 (${minPartDuration}).`\n });\n serverControl[phb] = minPartDuration;\n }\n};\n/**\n * A parser for M3U8 files. The current interpretation of the input is\n * exposed as a property `manifest` on parser objects. It's just two lines to\n * create and parse a manifest once you have the contents available as a string:\n *\n * ```js\n * var parser = new m3u8.Parser();\n * parser.push(xhr.responseText);\n * ```\n *\n * New input can later be applied to update the manifest object by calling\n * `push` again.\n *\n * The parser attempts to create a usable manifest object even if the\n * underlying input is somewhat nonsensical. It emits `info` and `warning`\n * events during the parse if it encounters input that seems invalid or\n * requires some property of the manifest object to be defaulted.\n *\n * @class Parser\n * @extends Stream\n */\n\n\nclass Parser extends Stream {\n constructor() {\n super();\n this.lineStream = new LineStream();\n this.parseStream = new ParseStream();\n this.lineStream.pipe(this.parseStream);\n this.lastProgramDateTime = null;\n /* eslint-disable consistent-this */\n\n const self = this;\n /* eslint-enable consistent-this */\n\n const uris = [];\n let currentUri = {}; // if specified, the active EXT-X-MAP definition\n\n let currentMap; // if specified, the active decryption key\n\n let key;\n let hasParts = false;\n\n const noop = function () {};\n\n const defaultMediaGroups = {\n 'AUDIO': {},\n 'VIDEO': {},\n 'CLOSED-CAPTIONS': {},\n 'SUBTITLES': {}\n }; // This is the Widevine UUID from DASH IF IOP. The same exact string is\n // used in MPDs with Widevine encrypted streams.\n\n const widevineUuid = 'urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed'; // group segments into numbered timelines delineated by discontinuities\n\n let currentTimeline = 0; // the manifest is empty until the parse stream begins delivering data\n\n this.manifest = {\n allowCache: true,\n discontinuityStarts: [],\n dateRanges: [],\n segments: []\n }; // keep track of the last seen segment's byte range end, as segments are not required\n // to provide the offset, in which case it defaults to the next byte after the\n // previous segment\n\n let lastByterangeEnd = 0; // keep track of the last seen part's byte range end.\n\n let lastPartByterangeEnd = 0;\n const dateRangeTags = {};\n this.on('end', () => {\n // only add preloadSegment if we don't yet have a uri for it.\n // and we actually have parts/preloadHints\n if (currentUri.uri || !currentUri.parts && !currentUri.preloadHints) {\n return;\n }\n\n if (!currentUri.map && currentMap) {\n currentUri.map = currentMap;\n }\n\n if (!currentUri.key && key) {\n currentUri.key = key;\n }\n\n if (!currentUri.timeline && typeof currentTimeline === 'number') {\n currentUri.timeline = currentTimeline;\n }\n\n this.manifest.preloadSegment = currentUri;\n }); // update the manifest with the m3u8 entry from the parse stream\n\n this.parseStream.on('data', function (entry) {\n let mediaGroup;\n let rendition;\n ({\n tag() {\n // switch based on the tag type\n (({\n version() {\n if (entry.version) {\n this.manifest.version = entry.version;\n }\n },\n\n 'allow-cache'() {\n this.manifest.allowCache = entry.allowed;\n\n if (!('allowed' in entry)) {\n this.trigger('info', {\n message: 'defaulting allowCache to YES'\n });\n this.manifest.allowCache = true;\n }\n },\n\n byterange() {\n const byterange = {};\n\n if ('length' in entry) {\n currentUri.byterange = byterange;\n byterange.length = entry.length;\n\n if (!('offset' in entry)) {\n /*\n * From the latest spec (as of this writing):\n * https://tools.ietf.org/html/draft-pantos-http-live-streaming-23#section-4.3.2.2\n *\n * Same text since EXT-X-BYTERANGE's introduction in draft 7:\n * https://tools.ietf.org/html/draft-pantos-http-live-streaming-07#section-3.3.1)\n *\n * \"If o [offset] is not present, the sub-range begins at the next byte\n * following the sub-range of the previous media segment.\"\n */\n entry.offset = lastByterangeEnd;\n }\n }\n\n if ('offset' in entry) {\n currentUri.byterange = byterange;\n byterange.offset = entry.offset;\n }\n\n lastByterangeEnd = byterange.offset + byterange.length;\n },\n\n endlist() {\n this.manifest.endList = true;\n },\n\n inf() {\n if (!('mediaSequence' in this.manifest)) {\n this.manifest.mediaSequence = 0;\n this.trigger('info', {\n message: 'defaulting media sequence to zero'\n });\n }\n\n if (!('discontinuitySequence' in this.manifest)) {\n this.manifest.discontinuitySequence = 0;\n this.trigger('info', {\n message: 'defaulting discontinuity sequence to zero'\n });\n }\n\n if (entry.title) {\n currentUri.title = entry.title;\n }\n\n if (entry.duration > 0) {\n currentUri.duration = entry.duration;\n }\n\n if (entry.duration === 0) {\n currentUri.duration = 0.01;\n this.trigger('info', {\n message: 'updating zero segment duration to a small value'\n });\n }\n\n this.manifest.segments = uris;\n },\n\n key() {\n if (!entry.attributes) {\n this.trigger('warn', {\n message: 'ignoring key declaration without attribute list'\n });\n return;\n } // clear the active encryption key\n\n\n if (entry.attributes.METHOD === 'NONE') {\n key = null;\n return;\n }\n\n if (!entry.attributes.URI) {\n this.trigger('warn', {\n message: 'ignoring key declaration without URI'\n });\n return;\n }\n\n if (entry.attributes.KEYFORMAT === 'com.apple.streamingkeydelivery') {\n this.manifest.contentProtection = this.manifest.contentProtection || {}; // TODO: add full support for this.\n\n this.manifest.contentProtection['com.apple.fps.1_0'] = {\n attributes: entry.attributes\n };\n return;\n }\n\n if (entry.attributes.KEYFORMAT === 'com.microsoft.playready') {\n this.manifest.contentProtection = this.manifest.contentProtection || {}; // TODO: add full support for this.\n\n this.manifest.contentProtection['com.microsoft.playready'] = {\n uri: entry.attributes.URI\n };\n return;\n } // check if the content is encrypted for Widevine\n // Widevine/HLS spec: https://storage.googleapis.com/wvdocs/Widevine_DRM_HLS.pdf\n\n\n if (entry.attributes.KEYFORMAT === widevineUuid) {\n const VALID_METHODS = ['SAMPLE-AES', 'SAMPLE-AES-CTR', 'SAMPLE-AES-CENC'];\n\n if (VALID_METHODS.indexOf(entry.attributes.METHOD) === -1) {\n this.trigger('warn', {\n message: 'invalid key method provided for Widevine'\n });\n return;\n }\n\n if (entry.attributes.METHOD === 'SAMPLE-AES-CENC') {\n this.trigger('warn', {\n message: 'SAMPLE-AES-CENC is deprecated, please use SAMPLE-AES-CTR instead'\n });\n }\n\n if (entry.attributes.URI.substring(0, 23) !== 'data:text/plain;base64,') {\n this.trigger('warn', {\n message: 'invalid key URI provided for Widevine'\n });\n return;\n }\n\n if (!(entry.attributes.KEYID && entry.attributes.KEYID.substring(0, 2) === '0x')) {\n this.trigger('warn', {\n message: 'invalid key ID provided for Widevine'\n });\n return;\n } // if Widevine key attributes are valid, store them as `contentProtection`\n // on the manifest to emulate Widevine tag structure in a DASH mpd\n\n\n this.manifest.contentProtection = this.manifest.contentProtection || {};\n this.manifest.contentProtection['com.widevine.alpha'] = {\n attributes: {\n schemeIdUri: entry.attributes.KEYFORMAT,\n // remove '0x' from the key id string\n keyId: entry.attributes.KEYID.substring(2)\n },\n // decode the base64-encoded PSSH box\n pssh: decodeB64ToUint8Array(entry.attributes.URI.split(',')[1])\n };\n return;\n }\n\n if (!entry.attributes.METHOD) {\n this.trigger('warn', {\n message: 'defaulting key method to AES-128'\n });\n } // setup an encryption key for upcoming segments\n\n\n key = {\n method: entry.attributes.METHOD || 'AES-128',\n uri: entry.attributes.URI\n };\n\n if (typeof entry.attributes.IV !== 'undefined') {\n key.iv = entry.attributes.IV;\n }\n },\n\n 'media-sequence'() {\n if (!isFinite(entry.number)) {\n this.trigger('warn', {\n message: 'ignoring invalid media sequence: ' + entry.number\n });\n return;\n }\n\n this.manifest.mediaSequence = entry.number;\n },\n\n 'discontinuity-sequence'() {\n if (!isFinite(entry.number)) {\n this.trigger('warn', {\n message: 'ignoring invalid discontinuity sequence: ' + entry.number\n });\n return;\n }\n\n this.manifest.discontinuitySequence = entry.number;\n currentTimeline = entry.number;\n },\n\n 'playlist-type'() {\n if (!/VOD|EVENT/.test(entry.playlistType)) {\n this.trigger('warn', {\n message: 'ignoring unknown playlist type: ' + entry.playlist\n });\n return;\n }\n\n this.manifest.playlistType = entry.playlistType;\n },\n\n map() {\n currentMap = {};\n\n if (entry.uri) {\n currentMap.uri = entry.uri;\n }\n\n if (entry.byterange) {\n currentMap.byterange = entry.byterange;\n }\n\n if (key) {\n currentMap.key = key;\n }\n },\n\n 'stream-inf'() {\n this.manifest.playlists = uris;\n this.manifest.mediaGroups = this.manifest.mediaGroups || defaultMediaGroups;\n\n if (!entry.attributes) {\n this.trigger('warn', {\n message: 'ignoring empty stream-inf attributes'\n });\n return;\n }\n\n if (!currentUri.attributes) {\n currentUri.attributes = {};\n }\n\n _extends(currentUri.attributes, entry.attributes);\n },\n\n media() {\n this.manifest.mediaGroups = this.manifest.mediaGroups || defaultMediaGroups;\n\n if (!(entry.attributes && entry.attributes.TYPE && entry.attributes['GROUP-ID'] && entry.attributes.NAME)) {\n this.trigger('warn', {\n message: 'ignoring incomplete or missing media group'\n });\n return;\n } // find the media group, creating defaults as necessary\n\n\n const mediaGroupType = this.manifest.mediaGroups[entry.attributes.TYPE];\n mediaGroupType[entry.attributes['GROUP-ID']] = mediaGroupType[entry.attributes['GROUP-ID']] || {};\n mediaGroup = mediaGroupType[entry.attributes['GROUP-ID']]; // collect the rendition metadata\n\n rendition = {\n default: /yes/i.test(entry.attributes.DEFAULT)\n };\n\n if (rendition.default) {\n rendition.autoselect = true;\n } else {\n rendition.autoselect = /yes/i.test(entry.attributes.AUTOSELECT);\n }\n\n if (entry.attributes.LANGUAGE) {\n rendition.language = entry.attributes.LANGUAGE;\n }\n\n if (entry.attributes.URI) {\n rendition.uri = entry.attributes.URI;\n }\n\n if (entry.attributes['INSTREAM-ID']) {\n rendition.instreamId = entry.attributes['INSTREAM-ID'];\n }\n\n if (entry.attributes.CHARACTERISTICS) {\n rendition.characteristics = entry.attributes.CHARACTERISTICS;\n }\n\n if (entry.attributes.FORCED) {\n rendition.forced = /yes/i.test(entry.attributes.FORCED);\n } // insert the new rendition\n\n\n mediaGroup[entry.attributes.NAME] = rendition;\n },\n\n discontinuity() {\n currentTimeline += 1;\n currentUri.discontinuity = true;\n this.manifest.discontinuityStarts.push(uris.length);\n },\n\n 'program-date-time'() {\n if (typeof this.manifest.dateTimeString === 'undefined') {\n // PROGRAM-DATE-TIME is a media-segment tag, but for backwards\n // compatibility, we add the first occurence of the PROGRAM-DATE-TIME tag\n // to the manifest object\n // TODO: Consider removing this in future major version\n this.manifest.dateTimeString = entry.dateTimeString;\n this.manifest.dateTimeObject = entry.dateTimeObject;\n }\n\n currentUri.dateTimeString = entry.dateTimeString;\n currentUri.dateTimeObject = entry.dateTimeObject;\n const {\n lastProgramDateTime\n } = this;\n this.lastProgramDateTime = new Date(entry.dateTimeString).getTime(); // We should extrapolate Program Date Time backward only during first program date time occurrence.\n // Once we have at least one program date time point, we can always extrapolate it forward using lastProgramDateTime reference.\n\n if (lastProgramDateTime === null) {\n // Extrapolate Program Date Time backward\n // Since it is first program date time occurrence we're assuming that\n // all this.manifest.segments have no program date time info\n this.manifest.segments.reduceRight((programDateTime, segment) => {\n segment.programDateTime = programDateTime - segment.duration * 1000;\n return segment.programDateTime;\n }, this.lastProgramDateTime);\n }\n },\n\n targetduration() {\n if (!isFinite(entry.duration) || entry.duration < 0) {\n this.trigger('warn', {\n message: 'ignoring invalid target duration: ' + entry.duration\n });\n return;\n }\n\n this.manifest.targetDuration = entry.duration;\n setHoldBack.call(this, this.manifest);\n },\n\n start() {\n if (!entry.attributes || isNaN(entry.attributes['TIME-OFFSET'])) {\n this.trigger('warn', {\n message: 'ignoring start declaration without appropriate attribute list'\n });\n return;\n }\n\n this.manifest.start = {\n timeOffset: entry.attributes['TIME-OFFSET'],\n precise: entry.attributes.PRECISE\n };\n },\n\n 'cue-out'() {\n currentUri.cueOut = entry.data;\n },\n\n 'cue-out-cont'() {\n currentUri.cueOutCont = entry.data;\n },\n\n 'cue-in'() {\n currentUri.cueIn = entry.data;\n },\n\n 'skip'() {\n this.manifest.skip = camelCaseKeys(entry.attributes);\n this.warnOnMissingAttributes_('#EXT-X-SKIP', entry.attributes, ['SKIPPED-SEGMENTS']);\n },\n\n 'part'() {\n hasParts = true; // parts are always specifed before a segment\n\n const segmentIndex = this.manifest.segments.length;\n const part = camelCaseKeys(entry.attributes);\n currentUri.parts = currentUri.parts || [];\n currentUri.parts.push(part);\n\n if (part.byterange) {\n if (!part.byterange.hasOwnProperty('offset')) {\n part.byterange.offset = lastPartByterangeEnd;\n }\n\n lastPartByterangeEnd = part.byterange.offset + part.byterange.length;\n }\n\n const partIndex = currentUri.parts.length - 1;\n this.warnOnMissingAttributes_(`#EXT-X-PART #${partIndex} for segment #${segmentIndex}`, entry.attributes, ['URI', 'DURATION']);\n\n if (this.manifest.renditionReports) {\n this.manifest.renditionReports.forEach((r, i) => {\n if (!r.hasOwnProperty('lastPart')) {\n this.trigger('warn', {\n message: `#EXT-X-RENDITION-REPORT #${i} lacks required attribute(s): LAST-PART`\n });\n }\n });\n }\n },\n\n 'server-control'() {\n const attrs = this.manifest.serverControl = camelCaseKeys(entry.attributes);\n\n if (!attrs.hasOwnProperty('canBlockReload')) {\n attrs.canBlockReload = false;\n this.trigger('info', {\n message: '#EXT-X-SERVER-CONTROL defaulting CAN-BLOCK-RELOAD to false'\n });\n }\n\n setHoldBack.call(this, this.manifest);\n\n if (attrs.canSkipDateranges && !attrs.hasOwnProperty('canSkipUntil')) {\n this.trigger('warn', {\n message: '#EXT-X-SERVER-CONTROL lacks required attribute CAN-SKIP-UNTIL which is required when CAN-SKIP-DATERANGES is set'\n });\n }\n },\n\n 'preload-hint'() {\n // parts are always specifed before a segment\n const segmentIndex = this.manifest.segments.length;\n const hint = camelCaseKeys(entry.attributes);\n const isPart = hint.type && hint.type === 'PART';\n currentUri.preloadHints = currentUri.preloadHints || [];\n currentUri.preloadHints.push(hint);\n\n if (hint.byterange) {\n if (!hint.byterange.hasOwnProperty('offset')) {\n // use last part byterange end or zero if not a part.\n hint.byterange.offset = isPart ? lastPartByterangeEnd : 0;\n\n if (isPart) {\n lastPartByterangeEnd = hint.byterange.offset + hint.byterange.length;\n }\n }\n }\n\n const index = currentUri.preloadHints.length - 1;\n this.warnOnMissingAttributes_(`#EXT-X-PRELOAD-HINT #${index} for segment #${segmentIndex}`, entry.attributes, ['TYPE', 'URI']);\n\n if (!hint.type) {\n return;\n } // search through all preload hints except for the current one for\n // a duplicate type.\n\n\n for (let i = 0; i < currentUri.preloadHints.length - 1; i++) {\n const otherHint = currentUri.preloadHints[i];\n\n if (!otherHint.type) {\n continue;\n }\n\n if (otherHint.type === hint.type) {\n this.trigger('warn', {\n message: `#EXT-X-PRELOAD-HINT #${index} for segment #${segmentIndex} has the same TYPE ${hint.type} as preload hint #${i}`\n });\n }\n }\n },\n\n 'rendition-report'() {\n const report = camelCaseKeys(entry.attributes);\n this.manifest.renditionReports = this.manifest.renditionReports || [];\n this.manifest.renditionReports.push(report);\n const index = this.manifest.renditionReports.length - 1;\n const required = ['LAST-MSN', 'URI'];\n\n if (hasParts) {\n required.push('LAST-PART');\n }\n\n this.warnOnMissingAttributes_(`#EXT-X-RENDITION-REPORT #${index}`, entry.attributes, required);\n },\n\n 'part-inf'() {\n this.manifest.partInf = camelCaseKeys(entry.attributes);\n this.warnOnMissingAttributes_('#EXT-X-PART-INF', entry.attributes, ['PART-TARGET']);\n\n if (this.manifest.partInf.partTarget) {\n this.manifest.partTargetDuration = this.manifest.partInf.partTarget;\n }\n\n setHoldBack.call(this, this.manifest);\n },\n\n 'daterange'() {\n this.manifest.dateRanges.push(camelCaseKeys(entry.attributes));\n const index = this.manifest.dateRanges.length - 1;\n this.warnOnMissingAttributes_(`#EXT-X-DATERANGE #${index}`, entry.attributes, ['ID', 'START-DATE']);\n const dateRange = this.manifest.dateRanges[index];\n\n if (dateRange.endDate && dateRange.startDate && new Date(dateRange.endDate) < new Date(dateRange.startDate)) {\n this.trigger('warn', {\n message: 'EXT-X-DATERANGE END-DATE must be equal to or later than the value of the START-DATE'\n });\n }\n\n if (dateRange.duration && dateRange.duration < 0) {\n this.trigger('warn', {\n message: 'EXT-X-DATERANGE DURATION must not be negative'\n });\n }\n\n if (dateRange.plannedDuration && dateRange.plannedDuration < 0) {\n this.trigger('warn', {\n message: 'EXT-X-DATERANGE PLANNED-DURATION must not be negative'\n });\n }\n\n const endOnNextYes = !!dateRange.endOnNext;\n\n if (endOnNextYes && !dateRange.class) {\n this.trigger('warn', {\n message: 'EXT-X-DATERANGE with an END-ON-NEXT=YES attribute must have a CLASS attribute'\n });\n }\n\n if (endOnNextYes && (dateRange.duration || dateRange.endDate)) {\n this.trigger('warn', {\n message: 'EXT-X-DATERANGE with an END-ON-NEXT=YES attribute must not contain DURATION or END-DATE attributes'\n });\n }\n\n if (dateRange.duration && dateRange.endDate) {\n const startDate = dateRange.startDate;\n const newDateInSeconds = startDate.getTime() + dateRange.duration * 1000;\n this.manifest.dateRanges[index].endDate = new Date(newDateInSeconds);\n }\n\n if (!dateRangeTags[dateRange.id]) {\n dateRangeTags[dateRange.id] = dateRange;\n } else {\n for (const attribute in dateRangeTags[dateRange.id]) {\n if (!!dateRange[attribute] && JSON.stringify(dateRangeTags[dateRange.id][attribute]) !== JSON.stringify(dateRange[attribute])) {\n this.trigger('warn', {\n message: 'EXT-X-DATERANGE tags with the same ID in a playlist must have the same attributes values'\n });\n break;\n }\n } // if tags with the same ID do not have conflicting attributes, merge them\n\n\n const dateRangeWithSameId = this.manifest.dateRanges.findIndex(dateRangeToFind => dateRangeToFind.id === dateRange.id);\n this.manifest.dateRanges[dateRangeWithSameId] = _extends(this.manifest.dateRanges[dateRangeWithSameId], dateRange);\n dateRangeTags[dateRange.id] = _extends(dateRangeTags[dateRange.id], dateRange); // after merging, delete the duplicate dateRange that was added last\n\n this.manifest.dateRanges.pop();\n }\n },\n\n 'independent-segments'() {\n this.manifest.independentSegments = true;\n },\n\n 'content-steering'() {\n this.manifest.contentSteering = camelCaseKeys(entry.attributes);\n this.warnOnMissingAttributes_('#EXT-X-CONTENT-STEERING', entry.attributes, ['SERVER-URI']);\n }\n\n })[entry.tagType] || noop).call(self);\n },\n\n uri() {\n currentUri.uri = entry.uri;\n uris.push(currentUri); // if no explicit duration was declared, use the target duration\n\n if (this.manifest.targetDuration && !('duration' in currentUri)) {\n this.trigger('warn', {\n message: 'defaulting segment duration to the target duration'\n });\n currentUri.duration = this.manifest.targetDuration;\n } // annotate with encryption information, if necessary\n\n\n if (key) {\n currentUri.key = key;\n }\n\n currentUri.timeline = currentTimeline; // annotate with initialization segment information, if necessary\n\n if (currentMap) {\n currentUri.map = currentMap;\n } // reset the last byterange end as it needs to be 0 between parts\n\n\n lastPartByterangeEnd = 0; // Once we have at least one program date time we can always extrapolate it forward\n\n if (this.lastProgramDateTime !== null) {\n currentUri.programDateTime = this.lastProgramDateTime;\n this.lastProgramDateTime += currentUri.duration * 1000;\n } // prepare for the next URI\n\n\n currentUri = {};\n },\n\n comment() {// comments are not important for playback\n },\n\n custom() {\n // if this is segment-level data attach the output to the segment\n if (entry.segment) {\n currentUri.custom = currentUri.custom || {};\n currentUri.custom[entry.customType] = entry.data; // if this is manifest-level data attach to the top level manifest object\n } else {\n this.manifest.custom = this.manifest.custom || {};\n this.manifest.custom[entry.customType] = entry.data;\n }\n }\n\n })[entry.type].call(self);\n });\n }\n\n warnOnMissingAttributes_(identifier, attributes, required) {\n const missing = [];\n required.forEach(function (key) {\n if (!attributes.hasOwnProperty(key)) {\n missing.push(key);\n }\n });\n\n if (missing.length) {\n this.trigger('warn', {\n message: `${identifier} lacks required attribute(s): ${missing.join(', ')}`\n });\n }\n }\n /**\n * Parse the input string and update the manifest object.\n *\n * @param {string} chunk a potentially incomplete portion of the manifest\n */\n\n\n push(chunk) {\n this.lineStream.push(chunk);\n }\n /**\n * Flush any remaining input. This can be handy if the last line of an M3U8\n * manifest did not contain a trailing newline but the file has been\n * completely received.\n */\n\n\n end() {\n // flush any buffered input\n this.lineStream.push('\\n');\n\n if (this.manifest.dateRanges.length && this.lastProgramDateTime === null) {\n this.trigger('warn', {\n message: 'A playlist with EXT-X-DATERANGE tag must contain atleast one EXT-X-PROGRAM-DATE-TIME tag'\n });\n }\n\n this.lastProgramDateTime = null;\n this.trigger('end');\n }\n /**\n * Add an additional parser for non-standard tags\n *\n * @param {Object} options a map of options for the added parser\n * @param {RegExp} options.expression a regular expression to match the custom header\n * @param {string} options.customType the custom type to register to the output\n * @param {Function} [options.dataParser] function to parse the line into an object\n * @param {boolean} [options.segment] should tag data be attached to the segment object\n */\n\n\n addParser(options) {\n this.parseStream.addParser(options);\n }\n /**\n * Add a custom header mapper\n *\n * @param {Object} options\n * @param {RegExp} options.expression a regular expression to match the custom header\n * @param {Function} options.map function to translate tag into a different tag\n */\n\n\n addTagMapper(options) {\n this.parseStream.addTagMapper(options);\n }\n\n}\n\nexport { LineStream, ParseStream, Parser };\n","import window from 'global/window';\nvar regexs = {\n // to determine mime types\n mp4: /^(av0?1|avc0?[1234]|vp0?9|flac|opus|mp3|mp4a|mp4v|stpp.ttml.im1t)/,\n webm: /^(vp0?[89]|av0?1|opus|vorbis)/,\n ogg: /^(vp0?[89]|theora|flac|opus|vorbis)/,\n // to determine if a codec is audio or video\n video: /^(av0?1|avc0?[1234]|vp0?[89]|hvc1|hev1|theora|mp4v)/,\n audio: /^(mp4a|flac|vorbis|opus|ac-[34]|ec-3|alac|mp3|speex|aac)/,\n text: /^(stpp.ttml.im1t)/,\n // mux.js support regex\n muxerVideo: /^(avc0?1)/,\n muxerAudio: /^(mp4a)/,\n // match nothing as muxer does not support text right now.\n // there cannot never be a character before the start of a string\n // so this matches nothing.\n muxerText: /a^/\n};\nvar mediaTypes = ['video', 'audio', 'text'];\nvar upperMediaTypes = ['Video', 'Audio', 'Text'];\n/**\n * Replace the old apple-style `avc1.
.
` codec string with the standard\n * `avc1.`\n *\n * @param {string} codec\n * Codec string to translate\n * @return {string}\n * The translated codec string\n */\n\nexport var translateLegacyCodec = function translateLegacyCodec(codec) {\n if (!codec) {\n return codec;\n }\n\n return codec.replace(/avc1\\.(\\d+)\\.(\\d+)/i, function (orig, profile, avcLevel) {\n var profileHex = ('00' + Number(profile).toString(16)).slice(-2);\n var avcLevelHex = ('00' + Number(avcLevel).toString(16)).slice(-2);\n return 'avc1.' + profileHex + '00' + avcLevelHex;\n });\n};\n/**\n * Replace the old apple-style `avc1.
.
` codec strings with the standard\n * `avc1.`\n *\n * @param {string[]} codecs\n * An array of codec strings to translate\n * @return {string[]}\n * The translated array of codec strings\n */\n\nexport var translateLegacyCodecs = function translateLegacyCodecs(codecs) {\n return codecs.map(translateLegacyCodec);\n};\n/**\n * Replace codecs in the codec string with the old apple-style `avc1.
.
` to the\n * standard `avc1.`.\n *\n * @param {string} codecString\n * The codec string\n * @return {string}\n * The codec string with old apple-style codecs replaced\n *\n * @private\n */\n\nexport var mapLegacyAvcCodecs = function mapLegacyAvcCodecs(codecString) {\n return codecString.replace(/avc1\\.(\\d+)\\.(\\d+)/i, function (match) {\n return translateLegacyCodecs([match])[0];\n });\n};\n/**\n * @typedef {Object} ParsedCodecInfo\n * @property {number} codecCount\n * Number of codecs parsed\n * @property {string} [videoCodec]\n * Parsed video codec (if found)\n * @property {string} [videoObjectTypeIndicator]\n * Video object type indicator (if found)\n * @property {string|null} audioProfile\n * Audio profile\n */\n\n/**\n * Parses a codec string to retrieve the number of codecs specified, the video codec and\n * object type indicator, and the audio profile.\n *\n * @param {string} [codecString]\n * The codec string to parse\n * @return {ParsedCodecInfo}\n * Parsed codec info\n */\n\nexport var parseCodecs = function parseCodecs(codecString) {\n if (codecString === void 0) {\n codecString = '';\n }\n\n var codecs = codecString.split(',');\n var result = [];\n codecs.forEach(function (codec) {\n codec = codec.trim();\n var codecType;\n mediaTypes.forEach(function (name) {\n var match = regexs[name].exec(codec.toLowerCase());\n\n if (!match || match.length <= 1) {\n return;\n }\n\n codecType = name; // maintain codec case\n\n var type = codec.substring(0, match[1].length);\n var details = codec.replace(type, '');\n result.push({\n type: type,\n details: details,\n mediaType: name\n });\n });\n\n if (!codecType) {\n result.push({\n type: codec,\n details: '',\n mediaType: 'unknown'\n });\n }\n });\n return result;\n};\n/**\n * Returns a ParsedCodecInfo object for the default alternate audio playlist if there is\n * a default alternate audio playlist for the provided audio group.\n *\n * @param {Object} master\n * The master playlist\n * @param {string} audioGroupId\n * ID of the audio group for which to find the default codec info\n * @return {ParsedCodecInfo}\n * Parsed codec info\n */\n\nexport var codecsFromDefault = function codecsFromDefault(master, audioGroupId) {\n if (!master.mediaGroups.AUDIO || !audioGroupId) {\n return null;\n }\n\n var audioGroup = master.mediaGroups.AUDIO[audioGroupId];\n\n if (!audioGroup) {\n return null;\n }\n\n for (var name in audioGroup) {\n var audioType = audioGroup[name];\n\n if (audioType.default && audioType.playlists) {\n // codec should be the same for all playlists within the audio type\n return parseCodecs(audioType.playlists[0].attributes.CODECS);\n }\n }\n\n return null;\n};\nexport var isVideoCodec = function isVideoCodec(codec) {\n if (codec === void 0) {\n codec = '';\n }\n\n return regexs.video.test(codec.trim().toLowerCase());\n};\nexport var isAudioCodec = function isAudioCodec(codec) {\n if (codec === void 0) {\n codec = '';\n }\n\n return regexs.audio.test(codec.trim().toLowerCase());\n};\nexport var isTextCodec = function isTextCodec(codec) {\n if (codec === void 0) {\n codec = '';\n }\n\n return regexs.text.test(codec.trim().toLowerCase());\n};\nexport var getMimeForCodec = function getMimeForCodec(codecString) {\n if (!codecString || typeof codecString !== 'string') {\n return;\n }\n\n var codecs = codecString.toLowerCase().split(',').map(function (c) {\n return translateLegacyCodec(c.trim());\n }); // default to video type\n\n var type = 'video'; // only change to audio type if the only codec we have is\n // audio\n\n if (codecs.length === 1 && isAudioCodec(codecs[0])) {\n type = 'audio';\n } else if (codecs.length === 1 && isTextCodec(codecs[0])) {\n // text uses application/ for now\n type = 'application';\n } // default the container to mp4\n\n\n var container = 'mp4'; // every codec must be able to go into the container\n // for that container to be the correct one\n\n if (codecs.every(function (c) {\n return regexs.mp4.test(c);\n })) {\n container = 'mp4';\n } else if (codecs.every(function (c) {\n return regexs.webm.test(c);\n })) {\n container = 'webm';\n } else if (codecs.every(function (c) {\n return regexs.ogg.test(c);\n })) {\n container = 'ogg';\n }\n\n return type + \"/\" + container + \";codecs=\\\"\" + codecString + \"\\\"\";\n};\nexport var browserSupportsCodec = function browserSupportsCodec(codecString) {\n if (codecString === void 0) {\n codecString = '';\n }\n\n return window.MediaSource && window.MediaSource.isTypeSupported && window.MediaSource.isTypeSupported(getMimeForCodec(codecString)) || false;\n};\nexport var muxerSupportsCodec = function muxerSupportsCodec(codecString) {\n if (codecString === void 0) {\n codecString = '';\n }\n\n return codecString.toLowerCase().split(',').every(function (codec) {\n codec = codec.trim(); // any match is supported.\n\n for (var i = 0; i < upperMediaTypes.length; i++) {\n var type = upperMediaTypes[i];\n\n if (regexs[\"muxer\" + type].test(codec)) {\n return true;\n }\n }\n\n return false;\n });\n};\nexport var DEFAULT_AUDIO_CODEC = 'mp4a.40.2';\nexport var DEFAULT_VIDEO_CODEC = 'avc1.4d400d';","var MPEGURL_REGEX = /^(audio|video|application)\\/(x-|vnd\\.apple\\.)?mpegurl/i;\nvar DASH_REGEX = /^application\\/dash\\+xml/i;\n/**\n * Returns a string that describes the type of source based on a video source object's\n * media type.\n *\n * @see {@link https://dev.w3.org/html5/pf-summary/video.html#dom-source-type|Source Type}\n *\n * @param {string} type\n * Video source object media type\n * @return {('hls'|'dash'|'vhs-json'|null)}\n * VHS source type string\n */\n\nexport var simpleTypeFromSourceType = function simpleTypeFromSourceType(type) {\n if (MPEGURL_REGEX.test(type)) {\n return 'hls';\n }\n\n if (DASH_REGEX.test(type)) {\n return 'dash';\n } // Denotes the special case of a manifest object passed to http-streaming instead of a\n // source URL.\n //\n // See https://en.wikipedia.org/wiki/Media_type for details on specifying media types.\n //\n // In this case, vnd stands for vendor, video.js for the organization, VHS for this\n // project, and the +json suffix identifies the structure of the media type.\n\n\n if (type === 'application/vnd.videojs.vhs+json') {\n return 'vhs-json';\n }\n\n return null;\n};","import window from 'global/window'; // const log2 = Math.log2 ? Math.log2 : (x) => (Math.log(x) / Math.log(2));\n\nvar repeat = function repeat(str, len) {\n var acc = '';\n\n while (len--) {\n acc += str;\n }\n\n return acc;\n}; // count the number of bits it would take to represent a number\n// we used to do this with log2 but BigInt does not support builtin math\n// Math.ceil(log2(x));\n\n\nexport var countBits = function countBits(x) {\n return x.toString(2).length;\n}; // count the number of whole bytes it would take to represent a number\n\nexport var countBytes = function countBytes(x) {\n return Math.ceil(countBits(x) / 8);\n};\nexport var padStart = function padStart(b, len, str) {\n if (str === void 0) {\n str = ' ';\n }\n\n return (repeat(str, len) + b.toString()).slice(-len);\n};\nexport var isArrayBufferView = function isArrayBufferView(obj) {\n if (ArrayBuffer.isView === 'function') {\n return ArrayBuffer.isView(obj);\n }\n\n return obj && obj.buffer instanceof ArrayBuffer;\n};\nexport var isTypedArray = function isTypedArray(obj) {\n return isArrayBufferView(obj);\n};\nexport var toUint8 = function toUint8(bytes) {\n if (bytes instanceof Uint8Array) {\n return bytes;\n }\n\n if (!Array.isArray(bytes) && !isTypedArray(bytes) && !(bytes instanceof ArrayBuffer)) {\n // any non-number or NaN leads to empty uint8array\n // eslint-disable-next-line\n if (typeof bytes !== 'number' || typeof bytes === 'number' && bytes !== bytes) {\n bytes = 0;\n } else {\n bytes = [bytes];\n }\n }\n\n return new Uint8Array(bytes && bytes.buffer || bytes, bytes && bytes.byteOffset || 0, bytes && bytes.byteLength || 0);\n};\nexport var toHexString = function toHexString(bytes) {\n bytes = toUint8(bytes);\n var str = '';\n\n for (var i = 0; i < bytes.length; i++) {\n str += padStart(bytes[i].toString(16), 2, '0');\n }\n\n return str;\n};\nexport var toBinaryString = function toBinaryString(bytes) {\n bytes = toUint8(bytes);\n var str = '';\n\n for (var i = 0; i < bytes.length; i++) {\n str += padStart(bytes[i].toString(2), 8, '0');\n }\n\n return str;\n};\nvar BigInt = window.BigInt || Number;\nvar BYTE_TABLE = [BigInt('0x1'), BigInt('0x100'), BigInt('0x10000'), BigInt('0x1000000'), BigInt('0x100000000'), BigInt('0x10000000000'), BigInt('0x1000000000000'), BigInt('0x100000000000000'), BigInt('0x10000000000000000')];\nexport var ENDIANNESS = function () {\n var a = new Uint16Array([0xFFCC]);\n var b = new Uint8Array(a.buffer, a.byteOffset, a.byteLength);\n\n if (b[0] === 0xFF) {\n return 'big';\n }\n\n if (b[0] === 0xCC) {\n return 'little';\n }\n\n return 'unknown';\n}();\nexport var IS_BIG_ENDIAN = ENDIANNESS === 'big';\nexport var IS_LITTLE_ENDIAN = ENDIANNESS === 'little';\nexport var bytesToNumber = function bytesToNumber(bytes, _temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n _ref$signed = _ref.signed,\n signed = _ref$signed === void 0 ? false : _ref$signed,\n _ref$le = _ref.le,\n le = _ref$le === void 0 ? false : _ref$le;\n\n bytes = toUint8(bytes);\n var fn = le ? 'reduce' : 'reduceRight';\n var obj = bytes[fn] ? bytes[fn] : Array.prototype[fn];\n var number = obj.call(bytes, function (total, byte, i) {\n var exponent = le ? i : Math.abs(i + 1 - bytes.length);\n return total + BigInt(byte) * BYTE_TABLE[exponent];\n }, BigInt(0));\n\n if (signed) {\n var max = BYTE_TABLE[bytes.length] / BigInt(2) - BigInt(1);\n number = BigInt(number);\n\n if (number > max) {\n number -= max;\n number -= max;\n number -= BigInt(2);\n }\n }\n\n return Number(number);\n};\nexport var numberToBytes = function numberToBytes(number, _temp2) {\n var _ref2 = _temp2 === void 0 ? {} : _temp2,\n _ref2$le = _ref2.le,\n le = _ref2$le === void 0 ? false : _ref2$le;\n\n // eslint-disable-next-line\n if (typeof number !== 'bigint' && typeof number !== 'number' || typeof number === 'number' && number !== number) {\n number = 0;\n }\n\n number = BigInt(number);\n var byteCount = countBytes(number);\n var bytes = new Uint8Array(new ArrayBuffer(byteCount));\n\n for (var i = 0; i < byteCount; i++) {\n var byteIndex = le ? i : Math.abs(i + 1 - bytes.length);\n bytes[byteIndex] = Number(number / BYTE_TABLE[i] & BigInt(0xFF));\n\n if (number < 0) {\n bytes[byteIndex] = Math.abs(~bytes[byteIndex]);\n bytes[byteIndex] -= i === 0 ? 1 : 2;\n }\n }\n\n return bytes;\n};\nexport var bytesToString = function bytesToString(bytes) {\n if (!bytes) {\n return '';\n } // TODO: should toUint8 handle cases where we only have 8 bytes\n // but report more since this is a Uint16+ Array?\n\n\n bytes = Array.prototype.slice.call(bytes);\n var string = String.fromCharCode.apply(null, toUint8(bytes));\n\n try {\n return decodeURIComponent(escape(string));\n } catch (e) {// if decodeURIComponent/escape fails, we are dealing with partial\n // or full non string data. Just return the potentially garbled string.\n }\n\n return string;\n};\nexport var stringToBytes = function stringToBytes(string, stringIsBytes) {\n if (typeof string !== 'string' && string && typeof string.toString === 'function') {\n string = string.toString();\n }\n\n if (typeof string !== 'string') {\n return new Uint8Array();\n } // If the string already is bytes, we don't have to do this\n // otherwise we do this so that we split multi length characters\n // into individual bytes\n\n\n if (!stringIsBytes) {\n string = unescape(encodeURIComponent(string));\n }\n\n var view = new Uint8Array(string.length);\n\n for (var i = 0; i < string.length; i++) {\n view[i] = string.charCodeAt(i);\n }\n\n return view;\n};\nexport var concatTypedArrays = function concatTypedArrays() {\n for (var _len = arguments.length, buffers = new Array(_len), _key = 0; _key < _len; _key++) {\n buffers[_key] = arguments[_key];\n }\n\n buffers = buffers.filter(function (b) {\n return b && (b.byteLength || b.length) && typeof b !== 'string';\n });\n\n if (buffers.length <= 1) {\n // for 0 length we will return empty uint8\n // for 1 length we return the first uint8\n return toUint8(buffers[0]);\n }\n\n var totalLen = buffers.reduce(function (total, buf, i) {\n return total + (buf.byteLength || buf.length);\n }, 0);\n var tempBuffer = new Uint8Array(totalLen);\n var offset = 0;\n buffers.forEach(function (buf) {\n buf = toUint8(buf);\n tempBuffer.set(buf, offset);\n offset += buf.byteLength;\n });\n return tempBuffer;\n};\n/**\n * Check if the bytes \"b\" are contained within bytes \"a\".\n *\n * @param {Uint8Array|Array} a\n * Bytes to check in\n *\n * @param {Uint8Array|Array} b\n * Bytes to check for\n *\n * @param {Object} options\n * options\n *\n * @param {Array|Uint8Array} [offset=0]\n * offset to use when looking at bytes in a\n *\n * @param {Array|Uint8Array} [mask=[]]\n * mask to use on bytes before comparison.\n *\n * @return {boolean}\n * If all bytes in b are inside of a, taking into account\n * bit masks.\n */\n\nexport var bytesMatch = function bytesMatch(a, b, _temp3) {\n var _ref3 = _temp3 === void 0 ? {} : _temp3,\n _ref3$offset = _ref3.offset,\n offset = _ref3$offset === void 0 ? 0 : _ref3$offset,\n _ref3$mask = _ref3.mask,\n mask = _ref3$mask === void 0 ? [] : _ref3$mask;\n\n a = toUint8(a);\n b = toUint8(b); // ie 11 does not support uint8 every\n\n var fn = b.every ? b.every : Array.prototype.every;\n return b.length && a.length - offset >= b.length && // ie 11 doesn't support every on uin8\n fn.call(b, function (bByte, i) {\n var aByte = mask[i] ? mask[i] & a[offset + i] : a[offset + i];\n return bByte === aByte;\n });\n};\nexport var sliceBytes = function sliceBytes(src, start, end) {\n if (Uint8Array.prototype.slice) {\n return Uint8Array.prototype.slice.call(src, start, end);\n }\n\n return new Uint8Array(Array.prototype.slice.call(src, start, end));\n};\nexport var reverseBytes = function reverseBytes(src) {\n if (src.reverse) {\n return src.reverse();\n }\n\n return Array.prototype.reverse.call(src);\n};","/**\n * Loops through all supported media groups in master and calls the provided\n * callback for each group\n *\n * @param {Object} master\n * The parsed master manifest object\n * @param {string[]} groups\n * The media groups to call the callback for\n * @param {Function} callback\n * Callback to call for each media group\n */\nexport var forEachMediaGroup = function forEachMediaGroup(master, groups, callback) {\n groups.forEach(function (mediaType) {\n for (var groupKey in master.mediaGroups[mediaType]) {\n for (var labelKey in master.mediaGroups[mediaType][groupKey]) {\n var mediaProperties = master.mediaGroups[mediaType][groupKey][labelKey];\n callback(mediaProperties, mediaType, groupKey, labelKey);\n }\n }\n });\n};","import window from 'global/window';\n\nvar atob = function atob(s) {\n return window.atob ? window.atob(s) : Buffer.from(s, 'base64').toString('binary');\n};\n\nexport default function decodeB64ToUint8Array(b64Text) {\n var decodedString = atob(b64Text);\n var array = new Uint8Array(decodedString.length);\n\n for (var i = 0; i < decodedString.length; i++) {\n array[i] = decodedString.charCodeAt(i);\n }\n\n return array;\n}","'use strict'\n\n/**\n * Ponyfill for `Array.prototype.find` which is only available in ES6 runtimes.\n *\n * Works with anything that has a `length` property and index access properties, including NodeList.\n *\n * @template {unknown} T\n * @param {Array | ({length:number, [number]: T})} list\n * @param {function (item: T, index: number, list:Array | ({length:number, [number]: T})):boolean} predicate\n * @param {Partial>?} ac `Array.prototype` by default,\n * \t\t\t\tallows injecting a custom implementation in tests\n * @returns {T | undefined}\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find\n * @see https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.find\n */\nfunction find(list, predicate, ac) {\n\tif (ac === undefined) {\n\t\tac = Array.prototype;\n\t}\n\tif (list && typeof ac.find === 'function') {\n\t\treturn ac.find.call(list, predicate);\n\t}\n\tfor (var i = 0; i < list.length; i++) {\n\t\tif (Object.prototype.hasOwnProperty.call(list, i)) {\n\t\t\tvar item = list[i];\n\t\t\tif (predicate.call(undefined, item, i, list)) {\n\t\t\t\treturn item;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * \"Shallow freezes\" an object to render it immutable.\n * Uses `Object.freeze` if available,\n * otherwise the immutability is only in the type.\n *\n * Is used to create \"enum like\" objects.\n *\n * @template T\n * @param {T} object the object to freeze\n * @param {Pick = Object} oc `Object` by default,\n * \t\t\t\tallows to inject custom object constructor for tests\n * @returns {Readonly}\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze\n */\nfunction freeze(object, oc) {\n\tif (oc === undefined) {\n\t\toc = Object\n\t}\n\treturn oc && typeof oc.freeze === 'function' ? oc.freeze(object) : object\n}\n\n/**\n * Since we can not rely on `Object.assign` we provide a simplified version\n * that is sufficient for our needs.\n *\n * @param {Object} target\n * @param {Object | null | undefined} source\n *\n * @returns {Object} target\n * @throws TypeError if target is not an object\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n * @see https://tc39.es/ecma262/multipage/fundamental-objects.html#sec-object.assign\n */\nfunction assign(target, source) {\n\tif (target === null || typeof target !== 'object') {\n\t\tthrow new TypeError('target is not an object')\n\t}\n\tfor (var key in source) {\n\t\tif (Object.prototype.hasOwnProperty.call(source, key)) {\n\t\t\ttarget[key] = source[key]\n\t\t}\n\t}\n\treturn target\n}\n\n/**\n * All mime types that are allowed as input to `DOMParser.parseFromString`\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString#Argument02 MDN\n * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#domparsersupportedtype WHATWG HTML Spec\n * @see DOMParser.prototype.parseFromString\n */\nvar MIME_TYPE = freeze({\n\t/**\n\t * `text/html`, the only mime type that triggers treating an XML document as HTML.\n\t *\n\t * @see DOMParser.SupportedType.isHTML\n\t * @see https://www.iana.org/assignments/media-types/text/html IANA MimeType registration\n\t * @see https://en.wikipedia.org/wiki/HTML Wikipedia\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString MDN\n\t * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-domparser-parsefromstring WHATWG HTML Spec\n\t */\n\tHTML: 'text/html',\n\n\t/**\n\t * Helper method to check a mime type if it indicates an HTML document\n\t *\n\t * @param {string} [value]\n\t * @returns {boolean}\n\t *\n\t * @see https://www.iana.org/assignments/media-types/text/html IANA MimeType registration\n\t * @see https://en.wikipedia.org/wiki/HTML Wikipedia\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString MDN\n\t * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-domparser-parsefromstring \t */\n\tisHTML: function (value) {\n\t\treturn value === MIME_TYPE.HTML\n\t},\n\n\t/**\n\t * `application/xml`, the standard mime type for XML documents.\n\t *\n\t * @see https://www.iana.org/assignments/media-types/application/xml IANA MimeType registration\n\t * @see https://tools.ietf.org/html/rfc7303#section-9.1 RFC 7303\n\t * @see https://en.wikipedia.org/wiki/XML_and_MIME Wikipedia\n\t */\n\tXML_APPLICATION: 'application/xml',\n\n\t/**\n\t * `text/html`, an alias for `application/xml`.\n\t *\n\t * @see https://tools.ietf.org/html/rfc7303#section-9.2 RFC 7303\n\t * @see https://www.iana.org/assignments/media-types/text/xml IANA MimeType registration\n\t * @see https://en.wikipedia.org/wiki/XML_and_MIME Wikipedia\n\t */\n\tXML_TEXT: 'text/xml',\n\n\t/**\n\t * `application/xhtml+xml`, indicates an XML document that has the default HTML namespace,\n\t * but is parsed as an XML document.\n\t *\n\t * @see https://www.iana.org/assignments/media-types/application/xhtml+xml IANA MimeType registration\n\t * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocument WHATWG DOM Spec\n\t * @see https://en.wikipedia.org/wiki/XHTML Wikipedia\n\t */\n\tXML_XHTML_APPLICATION: 'application/xhtml+xml',\n\n\t/**\n\t * `image/svg+xml`,\n\t *\n\t * @see https://www.iana.org/assignments/media-types/image/svg+xml IANA MimeType registration\n\t * @see https://www.w3.org/TR/SVG11/ W3C SVG 1.1\n\t * @see https://en.wikipedia.org/wiki/Scalable_Vector_Graphics Wikipedia\n\t */\n\tXML_SVG_IMAGE: 'image/svg+xml',\n})\n\n/**\n * Namespaces that are used in this code base.\n *\n * @see http://www.w3.org/TR/REC-xml-names\n */\nvar NAMESPACE = freeze({\n\t/**\n\t * The XHTML namespace.\n\t *\n\t * @see http://www.w3.org/1999/xhtml\n\t */\n\tHTML: 'http://www.w3.org/1999/xhtml',\n\n\t/**\n\t * Checks if `uri` equals `NAMESPACE.HTML`.\n\t *\n\t * @param {string} [uri]\n\t *\n\t * @see NAMESPACE.HTML\n\t */\n\tisHTML: function (uri) {\n\t\treturn uri === NAMESPACE.HTML\n\t},\n\n\t/**\n\t * The SVG namespace.\n\t *\n\t * @see http://www.w3.org/2000/svg\n\t */\n\tSVG: 'http://www.w3.org/2000/svg',\n\n\t/**\n\t * The `xml:` namespace.\n\t *\n\t * @see http://www.w3.org/XML/1998/namespace\n\t */\n\tXML: 'http://www.w3.org/XML/1998/namespace',\n\n\t/**\n\t * The `xmlns:` namespace\n\t *\n\t * @see https://www.w3.org/2000/xmlns/\n\t */\n\tXMLNS: 'http://www.w3.org/2000/xmlns/',\n})\n\nexports.assign = assign;\nexports.find = find;\nexports.freeze = freeze;\nexports.MIME_TYPE = MIME_TYPE;\nexports.NAMESPACE = NAMESPACE;\n","var conventions = require(\"./conventions\");\n\nvar find = conventions.find;\nvar NAMESPACE = conventions.NAMESPACE;\n\n/**\n * A prerequisite for `[].filter`, to drop elements that are empty\n * @param {string} input\n * @returns {boolean}\n */\nfunction notEmptyString (input) {\n\treturn input !== ''\n}\n/**\n * @see https://infra.spec.whatwg.org/#split-on-ascii-whitespace\n * @see https://infra.spec.whatwg.org/#ascii-whitespace\n *\n * @param {string} input\n * @returns {string[]} (can be empty)\n */\nfunction splitOnASCIIWhitespace(input) {\n\t// U+0009 TAB, U+000A LF, U+000C FF, U+000D CR, U+0020 SPACE\n\treturn input ? input.split(/[\\t\\n\\f\\r ]+/).filter(notEmptyString) : []\n}\n\n/**\n * Adds element as a key to current if it is not already present.\n *\n * @param {Record} current\n * @param {string} element\n * @returns {Record}\n */\nfunction orderedSetReducer (current, element) {\n\tif (!current.hasOwnProperty(element)) {\n\t\tcurrent[element] = true;\n\t}\n\treturn current;\n}\n\n/**\n * @see https://infra.spec.whatwg.org/#ordered-set\n * @param {string} input\n * @returns {string[]}\n */\nfunction toOrderedSet(input) {\n\tif (!input) return [];\n\tvar list = splitOnASCIIWhitespace(input);\n\treturn Object.keys(list.reduce(orderedSetReducer, {}))\n}\n\n/**\n * Uses `list.indexOf` to implement something like `Array.prototype.includes`,\n * which we can not rely on being available.\n *\n * @param {any[]} list\n * @returns {function(any): boolean}\n */\nfunction arrayIncludes (list) {\n\treturn function(element) {\n\t\treturn list && list.indexOf(element) !== -1;\n\t}\n}\n\nfunction copy(src,dest){\n\tfor(var p in src){\n\t\tif (Object.prototype.hasOwnProperty.call(src, p)) {\n\t\t\tdest[p] = src[p];\n\t\t}\n\t}\n}\n\n/**\n^\\w+\\.prototype\\.([_\\w]+)\\s*=\\s*((?:.*\\{\\s*?[\\r\\n][\\s\\S]*?^})|\\S.*?(?=[;\\r\\n]));?\n^\\w+\\.prototype\\.([_\\w]+)\\s*=\\s*(\\S.*?(?=[;\\r\\n]));?\n */\nfunction _extends(Class,Super){\n\tvar pt = Class.prototype;\n\tif(!(pt instanceof Super)){\n\t\tfunction t(){};\n\t\tt.prototype = Super.prototype;\n\t\tt = new t();\n\t\tcopy(pt,t);\n\t\tClass.prototype = pt = t;\n\t}\n\tif(pt.constructor != Class){\n\t\tif(typeof Class != 'function'){\n\t\t\tconsole.error(\"unknown Class:\"+Class)\n\t\t}\n\t\tpt.constructor = Class\n\t}\n}\n\n// Node Types\nvar NodeType = {}\nvar ELEMENT_NODE = NodeType.ELEMENT_NODE = 1;\nvar ATTRIBUTE_NODE = NodeType.ATTRIBUTE_NODE = 2;\nvar TEXT_NODE = NodeType.TEXT_NODE = 3;\nvar CDATA_SECTION_NODE = NodeType.CDATA_SECTION_NODE = 4;\nvar ENTITY_REFERENCE_NODE = NodeType.ENTITY_REFERENCE_NODE = 5;\nvar ENTITY_NODE = NodeType.ENTITY_NODE = 6;\nvar PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;\nvar COMMENT_NODE = NodeType.COMMENT_NODE = 8;\nvar DOCUMENT_NODE = NodeType.DOCUMENT_NODE = 9;\nvar DOCUMENT_TYPE_NODE = NodeType.DOCUMENT_TYPE_NODE = 10;\nvar DOCUMENT_FRAGMENT_NODE = NodeType.DOCUMENT_FRAGMENT_NODE = 11;\nvar NOTATION_NODE = NodeType.NOTATION_NODE = 12;\n\n// ExceptionCode\nvar ExceptionCode = {}\nvar ExceptionMessage = {};\nvar INDEX_SIZE_ERR = ExceptionCode.INDEX_SIZE_ERR = ((ExceptionMessage[1]=\"Index size error\"),1);\nvar DOMSTRING_SIZE_ERR = ExceptionCode.DOMSTRING_SIZE_ERR = ((ExceptionMessage[2]=\"DOMString size error\"),2);\nvar HIERARCHY_REQUEST_ERR = ExceptionCode.HIERARCHY_REQUEST_ERR = ((ExceptionMessage[3]=\"Hierarchy request error\"),3);\nvar WRONG_DOCUMENT_ERR = ExceptionCode.WRONG_DOCUMENT_ERR = ((ExceptionMessage[4]=\"Wrong document\"),4);\nvar INVALID_CHARACTER_ERR = ExceptionCode.INVALID_CHARACTER_ERR = ((ExceptionMessage[5]=\"Invalid character\"),5);\nvar NO_DATA_ALLOWED_ERR = ExceptionCode.NO_DATA_ALLOWED_ERR = ((ExceptionMessage[6]=\"No data allowed\"),6);\nvar NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]=\"No modification allowed\"),7);\nvar NOT_FOUND_ERR = ExceptionCode.NOT_FOUND_ERR = ((ExceptionMessage[8]=\"Not found\"),8);\nvar NOT_SUPPORTED_ERR = ExceptionCode.NOT_SUPPORTED_ERR = ((ExceptionMessage[9]=\"Not supported\"),9);\nvar INUSE_ATTRIBUTE_ERR = ExceptionCode.INUSE_ATTRIBUTE_ERR = ((ExceptionMessage[10]=\"Attribute in use\"),10);\n//level2\nvar INVALID_STATE_ERR \t= ExceptionCode.INVALID_STATE_ERR \t= ((ExceptionMessage[11]=\"Invalid state\"),11);\nvar SYNTAX_ERR \t= ExceptionCode.SYNTAX_ERR \t= ((ExceptionMessage[12]=\"Syntax error\"),12);\nvar INVALID_MODIFICATION_ERR \t= ExceptionCode.INVALID_MODIFICATION_ERR \t= ((ExceptionMessage[13]=\"Invalid modification\"),13);\nvar NAMESPACE_ERR \t= ExceptionCode.NAMESPACE_ERR \t= ((ExceptionMessage[14]=\"Invalid namespace\"),14);\nvar INVALID_ACCESS_ERR \t= ExceptionCode.INVALID_ACCESS_ERR \t= ((ExceptionMessage[15]=\"Invalid access\"),15);\n\n/**\n * DOM Level 2\n * Object DOMException\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html\n * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html\n */\nfunction DOMException(code, message) {\n\tif(message instanceof Error){\n\t\tvar error = message;\n\t}else{\n\t\terror = this;\n\t\tError.call(this, ExceptionMessage[code]);\n\t\tthis.message = ExceptionMessage[code];\n\t\tif(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);\n\t}\n\terror.code = code;\n\tif(message) this.message = this.message + \": \" + message;\n\treturn error;\n};\nDOMException.prototype = Error.prototype;\ncopy(ExceptionCode,DOMException)\n\n/**\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177\n * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.\n * The items in the NodeList are accessible via an integral index, starting from 0.\n */\nfunction NodeList() {\n};\nNodeList.prototype = {\n\t/**\n\t * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.\n\t * @standard level1\n\t */\n\tlength:0,\n\t/**\n\t * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.\n\t * @standard level1\n\t * @param index unsigned long\n\t * Index into the collection.\n\t * @return Node\n\t * \tThe node at the indexth position in the NodeList, or null if that is not a valid index.\n\t */\n\titem: function(index) {\n\t\treturn index >= 0 && index < this.length ? this[index] : null;\n\t},\n\ttoString:function(isHTML,nodeFilter){\n\t\tfor(var buf = [], i = 0;i=0){\n\t\tvar lastIndex = list.length-1\n\t\twhile(i0 || key == 'xmlns'){\n//\t\t\treturn null;\n//\t\t}\n\t\t//console.log()\n\t\tvar i = this.length;\n\t\twhile(i--){\n\t\t\tvar attr = this[i];\n\t\t\t//console.log(attr.nodeName,key)\n\t\t\tif(attr.nodeName == key){\n\t\t\t\treturn attr;\n\t\t\t}\n\t\t}\n\t},\n\tsetNamedItem: function(attr) {\n\t\tvar el = attr.ownerElement;\n\t\tif(el && el!=this._ownerElement){\n\t\t\tthrow new DOMException(INUSE_ATTRIBUTE_ERR);\n\t\t}\n\t\tvar oldAttr = this.getNamedItem(attr.nodeName);\n\t\t_addNamedNode(this._ownerElement,this,attr,oldAttr);\n\t\treturn oldAttr;\n\t},\n\t/* returns Node */\n\tsetNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR\n\t\tvar el = attr.ownerElement, oldAttr;\n\t\tif(el && el!=this._ownerElement){\n\t\t\tthrow new DOMException(INUSE_ATTRIBUTE_ERR);\n\t\t}\n\t\toldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);\n\t\t_addNamedNode(this._ownerElement,this,attr,oldAttr);\n\t\treturn oldAttr;\n\t},\n\n\t/* returns Node */\n\tremoveNamedItem: function(key) {\n\t\tvar attr = this.getNamedItem(key);\n\t\t_removeNamedNode(this._ownerElement,this,attr);\n\t\treturn attr;\n\n\n\t},// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR\n\n\t//for level2\n\tremoveNamedItemNS:function(namespaceURI,localName){\n\t\tvar attr = this.getNamedItemNS(namespaceURI,localName);\n\t\t_removeNamedNode(this._ownerElement,this,attr);\n\t\treturn attr;\n\t},\n\tgetNamedItemNS: function(namespaceURI, localName) {\n\t\tvar i = this.length;\n\t\twhile(i--){\n\t\t\tvar node = this[i];\n\t\t\tif(node.localName == localName && node.namespaceURI == namespaceURI){\n\t\t\t\treturn node;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n};\n\n/**\n * The DOMImplementation interface represents an object providing methods\n * which are not dependent on any particular document.\n * Such an object is returned by the `Document.implementation` property.\n *\n * __The individual methods describe the differences compared to the specs.__\n *\n * @constructor\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation MDN\n * @see https://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490 DOM Level 1 Core (Initial)\n * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-102161490 DOM Level 2 Core\n * @see https://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-102161490 DOM Level 3 Core\n * @see https://dom.spec.whatwg.org/#domimplementation DOM Living Standard\n */\nfunction DOMImplementation() {\n}\n\nDOMImplementation.prototype = {\n\t/**\n\t * The DOMImplementation.hasFeature() method returns a Boolean flag indicating if a given feature is supported.\n\t * The different implementations fairly diverged in what kind of features were reported.\n\t * The latest version of the spec settled to force this method to always return true, where the functionality was accurate and in use.\n\t *\n\t * @deprecated It is deprecated and modern browsers return true in all cases.\n\t *\n\t * @param {string} feature\n\t * @param {string} [version]\n\t * @returns {boolean} always true\n\t *\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/hasFeature MDN\n\t * @see https://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-5CED94D7 DOM Level 1 Core\n\t * @see https://dom.spec.whatwg.org/#dom-domimplementation-hasfeature DOM Living Standard\n\t */\n\thasFeature: function(feature, version) {\n\t\t\treturn true;\n\t},\n\t/**\n\t * Creates an XML Document object of the specified type with its document element.\n\t *\n\t * __It behaves slightly different from the description in the living standard__:\n\t * - There is no interface/class `XMLDocument`, it returns a `Document` instance.\n\t * - `contentType`, `encoding`, `mode`, `origin`, `url` fields are currently not declared.\n\t * - this implementation is not validating names or qualified names\n\t * (when parsing XML strings, the SAX parser takes care of that)\n\t *\n\t * @param {string|null} namespaceURI\n\t * @param {string} qualifiedName\n\t * @param {DocumentType=null} doctype\n\t * @returns {Document}\n\t *\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/createDocument MDN\n\t * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#Level-2-Core-DOM-createDocument DOM Level 2 Core (initial)\n\t * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocument DOM Level 2 Core\n\t *\n\t * @see https://dom.spec.whatwg.org/#validate-and-extract DOM: Validate and extract\n\t * @see https://www.w3.org/TR/xml/#NT-NameStartChar XML Spec: Names\n\t * @see https://www.w3.org/TR/xml-names/#ns-qualnames XML Namespaces: Qualified names\n\t */\n\tcreateDocument: function(namespaceURI, qualifiedName, doctype){\n\t\tvar doc = new Document();\n\t\tdoc.implementation = this;\n\t\tdoc.childNodes = new NodeList();\n\t\tdoc.doctype = doctype || null;\n\t\tif (doctype){\n\t\t\tdoc.appendChild(doctype);\n\t\t}\n\t\tif (qualifiedName){\n\t\t\tvar root = doc.createElementNS(namespaceURI, qualifiedName);\n\t\t\tdoc.appendChild(root);\n\t\t}\n\t\treturn doc;\n\t},\n\t/**\n\t * Returns a doctype, with the given `qualifiedName`, `publicId`, and `systemId`.\n\t *\n\t * __This behavior is slightly different from the in the specs__:\n\t * - this implementation is not validating names or qualified names\n\t * (when parsing XML strings, the SAX parser takes care of that)\n\t *\n\t * @param {string} qualifiedName\n\t * @param {string} [publicId]\n\t * @param {string} [systemId]\n\t * @returns {DocumentType} which can either be used with `DOMImplementation.createDocument` upon document creation\n\t * \t\t\t\t or can be put into the document via methods like `Node.insertBefore()` or `Node.replaceChild()`\n\t *\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/createDocumentType MDN\n\t * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#Level-2-Core-DOM-createDocType DOM Level 2 Core\n\t * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocumenttype DOM Living Standard\n\t *\n\t * @see https://dom.spec.whatwg.org/#validate-and-extract DOM: Validate and extract\n\t * @see https://www.w3.org/TR/xml/#NT-NameStartChar XML Spec: Names\n\t * @see https://www.w3.org/TR/xml-names/#ns-qualnames XML Namespaces: Qualified names\n\t */\n\tcreateDocumentType: function(qualifiedName, publicId, systemId){\n\t\tvar node = new DocumentType();\n\t\tnode.name = qualifiedName;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.publicId = publicId || '';\n\t\tnode.systemId = systemId || '';\n\n\t\treturn node;\n\t}\n};\n\n\n/**\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247\n */\n\nfunction Node() {\n};\n\nNode.prototype = {\n\tfirstChild : null,\n\tlastChild : null,\n\tpreviousSibling : null,\n\tnextSibling : null,\n\tattributes : null,\n\tparentNode : null,\n\tchildNodes : null,\n\townerDocument : null,\n\tnodeValue : null,\n\tnamespaceURI : null,\n\tprefix : null,\n\tlocalName : null,\n\t// Modified in DOM Level 2:\n\tinsertBefore:function(newChild, refChild){//raises\n\t\treturn _insertBefore(this,newChild,refChild);\n\t},\n\treplaceChild:function(newChild, oldChild){//raises\n\t\t_insertBefore(this, newChild,oldChild, assertPreReplacementValidityInDocument);\n\t\tif(oldChild){\n\t\t\tthis.removeChild(oldChild);\n\t\t}\n\t},\n\tremoveChild:function(oldChild){\n\t\treturn _removeChild(this,oldChild);\n\t},\n\tappendChild:function(newChild){\n\t\treturn this.insertBefore(newChild,null);\n\t},\n\thasChildNodes:function(){\n\t\treturn this.firstChild != null;\n\t},\n\tcloneNode:function(deep){\n\t\treturn cloneNode(this.ownerDocument||this,this,deep);\n\t},\n\t// Modified in DOM Level 2:\n\tnormalize:function(){\n\t\tvar child = this.firstChild;\n\t\twhile(child){\n\t\t\tvar next = child.nextSibling;\n\t\t\tif(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){\n\t\t\t\tthis.removeChild(next);\n\t\t\t\tchild.appendData(next.data);\n\t\t\t}else{\n\t\t\t\tchild.normalize();\n\t\t\t\tchild = next;\n\t\t\t}\n\t\t}\n\t},\n \t// Introduced in DOM Level 2:\n\tisSupported:function(feature, version){\n\t\treturn this.ownerDocument.implementation.hasFeature(feature,version);\n\t},\n // Introduced in DOM Level 2:\n hasAttributes:function(){\n \treturn this.attributes.length>0;\n },\n\t/**\n\t * Look up the prefix associated to the given namespace URI, starting from this node.\n\t * **The default namespace declarations are ignored by this method.**\n\t * See Namespace Prefix Lookup for details on the algorithm used by this method.\n\t *\n\t * _Note: The implementation seems to be incomplete when compared to the algorithm described in the specs._\n\t *\n\t * @param {string | null} namespaceURI\n\t * @returns {string | null}\n\t * @see https://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-lookupNamespacePrefix\n\t * @see https://www.w3.org/TR/DOM-Level-3-Core/namespaces-algorithms.html#lookupNamespacePrefixAlgo\n\t * @see https://dom.spec.whatwg.org/#dom-node-lookupprefix\n\t * @see https://github.com/xmldom/xmldom/issues/322\n\t */\n lookupPrefix:function(namespaceURI){\n \tvar el = this;\n \twhile(el){\n \t\tvar map = el._nsMap;\n \t\t//console.dir(map)\n \t\tif(map){\n \t\t\tfor(var n in map){\n\t\t\t\t\t\tif (Object.prototype.hasOwnProperty.call(map, n) && map[n] === namespaceURI) {\n\t\t\t\t\t\t\treturn n;\n\t\t\t\t\t\t}\n \t\t\t}\n \t\t}\n \t\tel = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;\n \t}\n \treturn null;\n },\n // Introduced in DOM Level 3:\n lookupNamespaceURI:function(prefix){\n \tvar el = this;\n \twhile(el){\n \t\tvar map = el._nsMap;\n \t\t//console.dir(map)\n \t\tif(map){\n \t\t\tif(Object.prototype.hasOwnProperty.call(map, prefix)){\n \t\t\t\treturn map[prefix] ;\n \t\t\t}\n \t\t}\n \t\tel = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;\n \t}\n \treturn null;\n },\n // Introduced in DOM Level 3:\n isDefaultNamespace:function(namespaceURI){\n \tvar prefix = this.lookupPrefix(namespaceURI);\n \treturn prefix == null;\n }\n};\n\n\nfunction _xmlEncoder(c){\n\treturn c == '<' && '<' ||\n c == '>' && '>' ||\n c == '&' && '&' ||\n c == '\"' && '"' ||\n '&#'+c.charCodeAt()+';'\n}\n\n\ncopy(NodeType,Node);\ncopy(NodeType,Node.prototype);\n\n/**\n * @param callback return true for continue,false for break\n * @return boolean true: break visit;\n */\nfunction _visitNode(node,callback){\n\tif(callback(node)){\n\t\treturn true;\n\t}\n\tif(node = node.firstChild){\n\t\tdo{\n\t\t\tif(_visitNode(node,callback)){return true}\n }while(node=node.nextSibling)\n }\n}\n\n\n\nfunction Document(){\n\tthis.ownerDocument = this;\n}\n\nfunction _onAddAttribute(doc,el,newAttr){\n\tdoc && doc._inc++;\n\tvar ns = newAttr.namespaceURI ;\n\tif(ns === NAMESPACE.XMLNS){\n\t\t//update namespace\n\t\tel._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value\n\t}\n}\n\nfunction _onRemoveAttribute(doc,el,newAttr,remove){\n\tdoc && doc._inc++;\n\tvar ns = newAttr.namespaceURI ;\n\tif(ns === NAMESPACE.XMLNS){\n\t\t//update namespace\n\t\tdelete el._nsMap[newAttr.prefix?newAttr.localName:'']\n\t}\n}\n\n/**\n * Updates `el.childNodes`, updating the indexed items and it's `length`.\n * Passing `newChild` means it will be appended.\n * Otherwise it's assumed that an item has been removed,\n * and `el.firstNode` and it's `.nextSibling` are used\n * to walk the current list of child nodes.\n *\n * @param {Document} doc\n * @param {Node} el\n * @param {Node} [newChild]\n * @private\n */\nfunction _onUpdateChild (doc, el, newChild) {\n\tif(doc && doc._inc){\n\t\tdoc._inc++;\n\t\t//update childNodes\n\t\tvar cs = el.childNodes;\n\t\tif (newChild) {\n\t\t\tcs[cs.length++] = newChild;\n\t\t} else {\n\t\t\tvar child = el.firstChild;\n\t\t\tvar i = 0;\n\t\t\twhile (child) {\n\t\t\t\tcs[i++] = child;\n\t\t\t\tchild = child.nextSibling;\n\t\t\t}\n\t\t\tcs.length = i;\n\t\t\tdelete cs[cs.length];\n\t\t}\n\t}\n}\n\n/**\n * Removes the connections between `parentNode` and `child`\n * and any existing `child.previousSibling` or `child.nextSibling`.\n *\n * @see https://github.com/xmldom/xmldom/issues/135\n * @see https://github.com/xmldom/xmldom/issues/145\n *\n * @param {Node} parentNode\n * @param {Node} child\n * @returns {Node} the child that was removed.\n * @private\n */\nfunction _removeChild (parentNode, child) {\n\tvar previous = child.previousSibling;\n\tvar next = child.nextSibling;\n\tif (previous) {\n\t\tprevious.nextSibling = next;\n\t} else {\n\t\tparentNode.firstChild = next;\n\t}\n\tif (next) {\n\t\tnext.previousSibling = previous;\n\t} else {\n\t\tparentNode.lastChild = previous;\n\t}\n\tchild.parentNode = null;\n\tchild.previousSibling = null;\n\tchild.nextSibling = null;\n\t_onUpdateChild(parentNode.ownerDocument, parentNode);\n\treturn child;\n}\n\n/**\n * Returns `true` if `node` can be a parent for insertion.\n * @param {Node} node\n * @returns {boolean}\n */\nfunction hasValidParentNodeType(node) {\n\treturn (\n\t\tnode &&\n\t\t(node.nodeType === Node.DOCUMENT_NODE || node.nodeType === Node.DOCUMENT_FRAGMENT_NODE || node.nodeType === Node.ELEMENT_NODE)\n\t);\n}\n\n/**\n * Returns `true` if `node` can be inserted according to it's `nodeType`.\n * @param {Node} node\n * @returns {boolean}\n */\nfunction hasInsertableNodeType(node) {\n\treturn (\n\t\tnode &&\n\t\t(isElementNode(node) ||\n\t\t\tisTextNode(node) ||\n\t\t\tisDocTypeNode(node) ||\n\t\t\tnode.nodeType === Node.DOCUMENT_FRAGMENT_NODE ||\n\t\t\tnode.nodeType === Node.COMMENT_NODE ||\n\t\t\tnode.nodeType === Node.PROCESSING_INSTRUCTION_NODE)\n\t);\n}\n\n/**\n * Returns true if `node` is a DOCTYPE node\n * @param {Node} node\n * @returns {boolean}\n */\nfunction isDocTypeNode(node) {\n\treturn node && node.nodeType === Node.DOCUMENT_TYPE_NODE;\n}\n\n/**\n * Returns true if the node is an element\n * @param {Node} node\n * @returns {boolean}\n */\nfunction isElementNode(node) {\n\treturn node && node.nodeType === Node.ELEMENT_NODE;\n}\n/**\n * Returns true if `node` is a text node\n * @param {Node} node\n * @returns {boolean}\n */\nfunction isTextNode(node) {\n\treturn node && node.nodeType === Node.TEXT_NODE;\n}\n\n/**\n * Check if en element node can be inserted before `child`, or at the end if child is falsy,\n * according to the presence and position of a doctype node on the same level.\n *\n * @param {Document} doc The document node\n * @param {Node} child the node that would become the nextSibling if the element would be inserted\n * @returns {boolean} `true` if an element can be inserted before child\n * @private\n * https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n */\nfunction isElementInsertionPossible(doc, child) {\n\tvar parentChildNodes = doc.childNodes || [];\n\tif (find(parentChildNodes, isElementNode) || isDocTypeNode(child)) {\n\t\treturn false;\n\t}\n\tvar docTypeNode = find(parentChildNodes, isDocTypeNode);\n\treturn !(child && docTypeNode && parentChildNodes.indexOf(docTypeNode) > parentChildNodes.indexOf(child));\n}\n\n/**\n * Check if en element node can be inserted before `child`, or at the end if child is falsy,\n * according to the presence and position of a doctype node on the same level.\n *\n * @param {Node} doc The document node\n * @param {Node} child the node that would become the nextSibling if the element would be inserted\n * @returns {boolean} `true` if an element can be inserted before child\n * @private\n * https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n */\nfunction isElementReplacementPossible(doc, child) {\n\tvar parentChildNodes = doc.childNodes || [];\n\n\tfunction hasElementChildThatIsNotChild(node) {\n\t\treturn isElementNode(node) && node !== child;\n\t}\n\n\tif (find(parentChildNodes, hasElementChildThatIsNotChild)) {\n\t\treturn false;\n\t}\n\tvar docTypeNode = find(parentChildNodes, isDocTypeNode);\n\treturn !(child && docTypeNode && parentChildNodes.indexOf(docTypeNode) > parentChildNodes.indexOf(child));\n}\n\n/**\n * @private\n * Steps 1-5 of the checks before inserting and before replacing a child are the same.\n *\n * @param {Node} parent the parent node to insert `node` into\n * @param {Node} node the node to insert\n * @param {Node=} child the node that should become the `nextSibling` of `node`\n * @returns {Node}\n * @throws DOMException for several node combinations that would create a DOM that is not well-formed.\n * @throws DOMException if `child` is provided but is not a child of `parent`.\n * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n * @see https://dom.spec.whatwg.org/#concept-node-replace\n */\nfunction assertPreInsertionValidity1to5(parent, node, child) {\n\t// 1. If `parent` is not a Document, DocumentFragment, or Element node, then throw a \"HierarchyRequestError\" DOMException.\n\tif (!hasValidParentNodeType(parent)) {\n\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Unexpected parent node type ' + parent.nodeType);\n\t}\n\t// 2. If `node` is a host-including inclusive ancestor of `parent`, then throw a \"HierarchyRequestError\" DOMException.\n\t// not implemented!\n\t// 3. If `child` is non-null and its parent is not `parent`, then throw a \"NotFoundError\" DOMException.\n\tif (child && child.parentNode !== parent) {\n\t\tthrow new DOMException(NOT_FOUND_ERR, 'child not in parent');\n\t}\n\tif (\n\t\t// 4. If `node` is not a DocumentFragment, DocumentType, Element, or CharacterData node, then throw a \"HierarchyRequestError\" DOMException.\n\t\t!hasInsertableNodeType(node) ||\n\t\t// 5. If either `node` is a Text node and `parent` is a document,\n\t\t// the sax parser currently adds top level text nodes, this will be fixed in 0.9.0\n\t\t// || (node.nodeType === Node.TEXT_NODE && parent.nodeType === Node.DOCUMENT_NODE)\n\t\t// or `node` is a doctype and `parent` is not a document, then throw a \"HierarchyRequestError\" DOMException.\n\t\t(isDocTypeNode(node) && parent.nodeType !== Node.DOCUMENT_NODE)\n\t) {\n\t\tthrow new DOMException(\n\t\t\tHIERARCHY_REQUEST_ERR,\n\t\t\t'Unexpected node type ' + node.nodeType + ' for parent node type ' + parent.nodeType\n\t\t);\n\t}\n}\n\n/**\n * @private\n * Step 6 of the checks before inserting and before replacing a child are different.\n *\n * @param {Document} parent the parent node to insert `node` into\n * @param {Node} node the node to insert\n * @param {Node | undefined} child the node that should become the `nextSibling` of `node`\n * @returns {Node}\n * @throws DOMException for several node combinations that would create a DOM that is not well-formed.\n * @throws DOMException if `child` is provided but is not a child of `parent`.\n * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n * @see https://dom.spec.whatwg.org/#concept-node-replace\n */\nfunction assertPreInsertionValidityInDocument(parent, node, child) {\n\tvar parentChildNodes = parent.childNodes || [];\n\tvar nodeChildNodes = node.childNodes || [];\n\n\t// DocumentFragment\n\tif (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n\t\tvar nodeChildElements = nodeChildNodes.filter(isElementNode);\n\t\t// If node has more than one element child or has a Text node child.\n\t\tif (nodeChildElements.length > 1 || find(nodeChildNodes, isTextNode)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'More than one element or text in fragment');\n\t\t}\n\t\t// Otherwise, if `node` has one element child and either `parent` has an element child,\n\t\t// `child` is a doctype, or `child` is non-null and a doctype is following `child`.\n\t\tif (nodeChildElements.length === 1 && !isElementInsertionPossible(parent, child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Element in fragment can not be inserted before doctype');\n\t\t}\n\t}\n\t// Element\n\tif (isElementNode(node)) {\n\t\t// `parent` has an element child, `child` is a doctype,\n\t\t// or `child` is non-null and a doctype is following `child`.\n\t\tif (!isElementInsertionPossible(parent, child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Only one element can be added and only after doctype');\n\t\t}\n\t}\n\t// DocumentType\n\tif (isDocTypeNode(node)) {\n\t\t// `parent` has a doctype child,\n\t\tif (find(parentChildNodes, isDocTypeNode)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Only one doctype is allowed');\n\t\t}\n\t\tvar parentElementChild = find(parentChildNodes, isElementNode);\n\t\t// `child` is non-null and an element is preceding `child`,\n\t\tif (child && parentChildNodes.indexOf(parentElementChild) < parentChildNodes.indexOf(child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Doctype can only be inserted before an element');\n\t\t}\n\t\t// or `child` is null and `parent` has an element child.\n\t\tif (!child && parentElementChild) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Doctype can not be appended since element is present');\n\t\t}\n\t}\n}\n\n/**\n * @private\n * Step 6 of the checks before inserting and before replacing a child are different.\n *\n * @param {Document} parent the parent node to insert `node` into\n * @param {Node} node the node to insert\n * @param {Node | undefined} child the node that should become the `nextSibling` of `node`\n * @returns {Node}\n * @throws DOMException for several node combinations that would create a DOM that is not well-formed.\n * @throws DOMException if `child` is provided but is not a child of `parent`.\n * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n * @see https://dom.spec.whatwg.org/#concept-node-replace\n */\nfunction assertPreReplacementValidityInDocument(parent, node, child) {\n\tvar parentChildNodes = parent.childNodes || [];\n\tvar nodeChildNodes = node.childNodes || [];\n\n\t// DocumentFragment\n\tif (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n\t\tvar nodeChildElements = nodeChildNodes.filter(isElementNode);\n\t\t// If `node` has more than one element child or has a Text node child.\n\t\tif (nodeChildElements.length > 1 || find(nodeChildNodes, isTextNode)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'More than one element or text in fragment');\n\t\t}\n\t\t// Otherwise, if `node` has one element child and either `parent` has an element child that is not `child` or a doctype is following `child`.\n\t\tif (nodeChildElements.length === 1 && !isElementReplacementPossible(parent, child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Element in fragment can not be inserted before doctype');\n\t\t}\n\t}\n\t// Element\n\tif (isElementNode(node)) {\n\t\t// `parent` has an element child that is not `child` or a doctype is following `child`.\n\t\tif (!isElementReplacementPossible(parent, child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Only one element can be added and only after doctype');\n\t\t}\n\t}\n\t// DocumentType\n\tif (isDocTypeNode(node)) {\n\t\tfunction hasDoctypeChildThatIsNotChild(node) {\n\t\t\treturn isDocTypeNode(node) && node !== child;\n\t\t}\n\n\t\t// `parent` has a doctype child that is not `child`,\n\t\tif (find(parentChildNodes, hasDoctypeChildThatIsNotChild)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Only one doctype is allowed');\n\t\t}\n\t\tvar parentElementChild = find(parentChildNodes, isElementNode);\n\t\t// or an element is preceding `child`.\n\t\tif (child && parentChildNodes.indexOf(parentElementChild) < parentChildNodes.indexOf(child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Doctype can only be inserted before an element');\n\t\t}\n\t}\n}\n\n/**\n * @private\n * @param {Node} parent the parent node to insert `node` into\n * @param {Node} node the node to insert\n * @param {Node=} child the node that should become the `nextSibling` of `node`\n * @returns {Node}\n * @throws DOMException for several node combinations that would create a DOM that is not well-formed.\n * @throws DOMException if `child` is provided but is not a child of `parent`.\n * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n */\nfunction _insertBefore(parent, node, child, _inDocumentAssertion) {\n\t// To ensure pre-insertion validity of a node into a parent before a child, run these steps:\n\tassertPreInsertionValidity1to5(parent, node, child);\n\n\t// If parent is a document, and any of the statements below, switched on the interface node implements,\n\t// are true, then throw a \"HierarchyRequestError\" DOMException.\n\tif (parent.nodeType === Node.DOCUMENT_NODE) {\n\t\t(_inDocumentAssertion || assertPreInsertionValidityInDocument)(parent, node, child);\n\t}\n\n\tvar cp = node.parentNode;\n\tif(cp){\n\t\tcp.removeChild(node);//remove and update\n\t}\n\tif(node.nodeType === DOCUMENT_FRAGMENT_NODE){\n\t\tvar newFirst = node.firstChild;\n\t\tif (newFirst == null) {\n\t\t\treturn node;\n\t\t}\n\t\tvar newLast = node.lastChild;\n\t}else{\n\t\tnewFirst = newLast = node;\n\t}\n\tvar pre = child ? child.previousSibling : parent.lastChild;\n\n\tnewFirst.previousSibling = pre;\n\tnewLast.nextSibling = child;\n\n\n\tif(pre){\n\t\tpre.nextSibling = newFirst;\n\t}else{\n\t\tparent.firstChild = newFirst;\n\t}\n\tif(child == null){\n\t\tparent.lastChild = newLast;\n\t}else{\n\t\tchild.previousSibling = newLast;\n\t}\n\tdo{\n\t\tnewFirst.parentNode = parent;\n\t}while(newFirst !== newLast && (newFirst= newFirst.nextSibling))\n\t_onUpdateChild(parent.ownerDocument||parent, parent);\n\t//console.log(parent.lastChild.nextSibling == null)\n\tif (node.nodeType == DOCUMENT_FRAGMENT_NODE) {\n\t\tnode.firstChild = node.lastChild = null;\n\t}\n\treturn node;\n}\n\n/**\n * Appends `newChild` to `parentNode`.\n * If `newChild` is already connected to a `parentNode` it is first removed from it.\n *\n * @see https://github.com/xmldom/xmldom/issues/135\n * @see https://github.com/xmldom/xmldom/issues/145\n * @param {Node} parentNode\n * @param {Node} newChild\n * @returns {Node}\n * @private\n */\nfunction _appendSingleChild (parentNode, newChild) {\n\tif (newChild.parentNode) {\n\t\tnewChild.parentNode.removeChild(newChild);\n\t}\n\tnewChild.parentNode = parentNode;\n\tnewChild.previousSibling = parentNode.lastChild;\n\tnewChild.nextSibling = null;\n\tif (newChild.previousSibling) {\n\t\tnewChild.previousSibling.nextSibling = newChild;\n\t} else {\n\t\tparentNode.firstChild = newChild;\n\t}\n\tparentNode.lastChild = newChild;\n\t_onUpdateChild(parentNode.ownerDocument, parentNode, newChild);\n\treturn newChild;\n}\n\nDocument.prototype = {\n\t//implementation : null,\n\tnodeName : '#document',\n\tnodeType : DOCUMENT_NODE,\n\t/**\n\t * The DocumentType node of the document.\n\t *\n\t * @readonly\n\t * @type DocumentType\n\t */\n\tdoctype : null,\n\tdocumentElement : null,\n\t_inc : 1,\n\n\tinsertBefore : function(newChild, refChild){//raises\n\t\tif(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){\n\t\t\tvar child = newChild.firstChild;\n\t\t\twhile(child){\n\t\t\t\tvar next = child.nextSibling;\n\t\t\t\tthis.insertBefore(child,refChild);\n\t\t\t\tchild = next;\n\t\t\t}\n\t\t\treturn newChild;\n\t\t}\n\t\t_insertBefore(this, newChild, refChild);\n\t\tnewChild.ownerDocument = this;\n\t\tif (this.documentElement === null && newChild.nodeType === ELEMENT_NODE) {\n\t\t\tthis.documentElement = newChild;\n\t\t}\n\n\t\treturn newChild;\n\t},\n\tremoveChild : function(oldChild){\n\t\tif(this.documentElement == oldChild){\n\t\t\tthis.documentElement = null;\n\t\t}\n\t\treturn _removeChild(this,oldChild);\n\t},\n\treplaceChild: function (newChild, oldChild) {\n\t\t//raises\n\t\t_insertBefore(this, newChild, oldChild, assertPreReplacementValidityInDocument);\n\t\tnewChild.ownerDocument = this;\n\t\tif (oldChild) {\n\t\t\tthis.removeChild(oldChild);\n\t\t}\n\t\tif (isElementNode(newChild)) {\n\t\t\tthis.documentElement = newChild;\n\t\t}\n\t},\n\t// Introduced in DOM Level 2:\n\timportNode : function(importedNode,deep){\n\t\treturn importNode(this,importedNode,deep);\n\t},\n\t// Introduced in DOM Level 2:\n\tgetElementById :\tfunction(id){\n\t\tvar rtv = null;\n\t\t_visitNode(this.documentElement,function(node){\n\t\t\tif(node.nodeType == ELEMENT_NODE){\n\t\t\t\tif(node.getAttribute('id') == id){\n\t\t\t\t\trtv = node;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\treturn rtv;\n\t},\n\n\t/**\n\t * The `getElementsByClassName` method of `Document` interface returns an array-like object\n\t * of all child elements which have **all** of the given class name(s).\n\t *\n\t * Returns an empty list if `classeNames` is an empty string or only contains HTML white space characters.\n\t *\n\t *\n\t * Warning: This is a live LiveNodeList.\n\t * Changes in the DOM will reflect in the array as the changes occur.\n\t * If an element selected by this array no longer qualifies for the selector,\n\t * it will automatically be removed. Be aware of this for iteration purposes.\n\t *\n\t * @param {string} classNames is a string representing the class name(s) to match; multiple class names are separated by (ASCII-)whitespace\n\t *\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByClassName\n\t * @see https://dom.spec.whatwg.org/#concept-getelementsbyclassname\n\t */\n\tgetElementsByClassName: function(classNames) {\n\t\tvar classNamesSet = toOrderedSet(classNames)\n\t\treturn new LiveNodeList(this, function(base) {\n\t\t\tvar ls = [];\n\t\t\tif (classNamesSet.length > 0) {\n\t\t\t\t_visitNode(base.documentElement, function(node) {\n\t\t\t\t\tif(node !== base && node.nodeType === ELEMENT_NODE) {\n\t\t\t\t\t\tvar nodeClassNames = node.getAttribute('class')\n\t\t\t\t\t\t// can be null if the attribute does not exist\n\t\t\t\t\t\tif (nodeClassNames) {\n\t\t\t\t\t\t\t// before splitting and iterating just compare them for the most common case\n\t\t\t\t\t\t\tvar matches = classNames === nodeClassNames;\n\t\t\t\t\t\t\tif (!matches) {\n\t\t\t\t\t\t\t\tvar nodeClassNamesSet = toOrderedSet(nodeClassNames)\n\t\t\t\t\t\t\t\tmatches = classNamesSet.every(arrayIncludes(nodeClassNamesSet))\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(matches) {\n\t\t\t\t\t\t\t\tls.push(node);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn ls;\n\t\t});\n\t},\n\n\t//document factory method:\n\tcreateElement :\tfunction(tagName){\n\t\tvar node = new Element();\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = tagName;\n\t\tnode.tagName = tagName;\n\t\tnode.localName = tagName;\n\t\tnode.childNodes = new NodeList();\n\t\tvar attrs\t= node.attributes = new NamedNodeMap();\n\t\tattrs._ownerElement = node;\n\t\treturn node;\n\t},\n\tcreateDocumentFragment :\tfunction(){\n\t\tvar node = new DocumentFragment();\n\t\tnode.ownerDocument = this;\n\t\tnode.childNodes = new NodeList();\n\t\treturn node;\n\t},\n\tcreateTextNode :\tfunction(data){\n\t\tvar node = new Text();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateComment :\tfunction(data){\n\t\tvar node = new Comment();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateCDATASection :\tfunction(data){\n\t\tvar node = new CDATASection();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateProcessingInstruction :\tfunction(target,data){\n\t\tvar node = new ProcessingInstruction();\n\t\tnode.ownerDocument = this;\n\t\tnode.tagName = node.nodeName = node.target = target;\n\t\tnode.nodeValue = node.data = data;\n\t\treturn node;\n\t},\n\tcreateAttribute :\tfunction(name){\n\t\tvar node = new Attr();\n\t\tnode.ownerDocument\t= this;\n\t\tnode.name = name;\n\t\tnode.nodeName\t= name;\n\t\tnode.localName = name;\n\t\tnode.specified = true;\n\t\treturn node;\n\t},\n\tcreateEntityReference :\tfunction(name){\n\t\tvar node = new EntityReference();\n\t\tnode.ownerDocument\t= this;\n\t\tnode.nodeName\t= name;\n\t\treturn node;\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateElementNS :\tfunction(namespaceURI,qualifiedName){\n\t\tvar node = new Element();\n\t\tvar pl = qualifiedName.split(':');\n\t\tvar attrs\t= node.attributes = new NamedNodeMap();\n\t\tnode.childNodes = new NodeList();\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.tagName = qualifiedName;\n\t\tnode.namespaceURI = namespaceURI;\n\t\tif(pl.length == 2){\n\t\t\tnode.prefix = pl[0];\n\t\t\tnode.localName = pl[1];\n\t\t}else{\n\t\t\t//el.prefix = null;\n\t\t\tnode.localName = qualifiedName;\n\t\t}\n\t\tattrs._ownerElement = node;\n\t\treturn node;\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateAttributeNS :\tfunction(namespaceURI,qualifiedName){\n\t\tvar node = new Attr();\n\t\tvar pl = qualifiedName.split(':');\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.name = qualifiedName;\n\t\tnode.namespaceURI = namespaceURI;\n\t\tnode.specified = true;\n\t\tif(pl.length == 2){\n\t\t\tnode.prefix = pl[0];\n\t\t\tnode.localName = pl[1];\n\t\t}else{\n\t\t\t//el.prefix = null;\n\t\t\tnode.localName = qualifiedName;\n\t\t}\n\t\treturn node;\n\t}\n};\n_extends(Document,Node);\n\n\nfunction Element() {\n\tthis._nsMap = {};\n};\nElement.prototype = {\n\tnodeType : ELEMENT_NODE,\n\thasAttribute : function(name){\n\t\treturn this.getAttributeNode(name)!=null;\n\t},\n\tgetAttribute : function(name){\n\t\tvar attr = this.getAttributeNode(name);\n\t\treturn attr && attr.value || '';\n\t},\n\tgetAttributeNode : function(name){\n\t\treturn this.attributes.getNamedItem(name);\n\t},\n\tsetAttribute : function(name, value){\n\t\tvar attr = this.ownerDocument.createAttribute(name);\n\t\tattr.value = attr.nodeValue = \"\" + value;\n\t\tthis.setAttributeNode(attr)\n\t},\n\tremoveAttribute : function(name){\n\t\tvar attr = this.getAttributeNode(name)\n\t\tattr && this.removeAttributeNode(attr);\n\t},\n\n\t//four real opeartion method\n\tappendChild:function(newChild){\n\t\tif(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){\n\t\t\treturn this.insertBefore(newChild,null);\n\t\t}else{\n\t\t\treturn _appendSingleChild(this,newChild);\n\t\t}\n\t},\n\tsetAttributeNode : function(newAttr){\n\t\treturn this.attributes.setNamedItem(newAttr);\n\t},\n\tsetAttributeNodeNS : function(newAttr){\n\t\treturn this.attributes.setNamedItemNS(newAttr);\n\t},\n\tremoveAttributeNode : function(oldAttr){\n\t\t//console.log(this == oldAttr.ownerElement)\n\t\treturn this.attributes.removeNamedItem(oldAttr.nodeName);\n\t},\n\t//get real attribute name,and remove it by removeAttributeNode\n\tremoveAttributeNS : function(namespaceURI, localName){\n\t\tvar old = this.getAttributeNodeNS(namespaceURI, localName);\n\t\told && this.removeAttributeNode(old);\n\t},\n\n\thasAttributeNS : function(namespaceURI, localName){\n\t\treturn this.getAttributeNodeNS(namespaceURI, localName)!=null;\n\t},\n\tgetAttributeNS : function(namespaceURI, localName){\n\t\tvar attr = this.getAttributeNodeNS(namespaceURI, localName);\n\t\treturn attr && attr.value || '';\n\t},\n\tsetAttributeNS : function(namespaceURI, qualifiedName, value){\n\t\tvar attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);\n\t\tattr.value = attr.nodeValue = \"\" + value;\n\t\tthis.setAttributeNode(attr)\n\t},\n\tgetAttributeNodeNS : function(namespaceURI, localName){\n\t\treturn this.attributes.getNamedItemNS(namespaceURI, localName);\n\t},\n\n\tgetElementsByTagName : function(tagName){\n\t\treturn new LiveNodeList(this,function(base){\n\t\t\tvar ls = [];\n\t\t\t_visitNode(base,function(node){\n\t\t\t\tif(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){\n\t\t\t\t\tls.push(node);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn ls;\n\t\t});\n\t},\n\tgetElementsByTagNameNS : function(namespaceURI, localName){\n\t\treturn new LiveNodeList(this,function(base){\n\t\t\tvar ls = [];\n\t\t\t_visitNode(base,function(node){\n\t\t\t\tif(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){\n\t\t\t\t\tls.push(node);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn ls;\n\n\t\t});\n\t}\n};\nDocument.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;\nDocument.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;\n\n\n_extends(Element,Node);\nfunction Attr() {\n};\nAttr.prototype.nodeType = ATTRIBUTE_NODE;\n_extends(Attr,Node);\n\n\nfunction CharacterData() {\n};\nCharacterData.prototype = {\n\tdata : '',\n\tsubstringData : function(offset, count) {\n\t\treturn this.data.substring(offset, offset+count);\n\t},\n\tappendData: function(text) {\n\t\ttext = this.data+text;\n\t\tthis.nodeValue = this.data = text;\n\t\tthis.length = text.length;\n\t},\n\tinsertData: function(offset,text) {\n\t\tthis.replaceData(offset,0,text);\n\n\t},\n\tappendChild:function(newChild){\n\t\tthrow new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])\n\t},\n\tdeleteData: function(offset, count) {\n\t\tthis.replaceData(offset,count,\"\");\n\t},\n\treplaceData: function(offset, count, text) {\n\t\tvar start = this.data.substring(0,offset);\n\t\tvar end = this.data.substring(offset+count);\n\t\ttext = start + text + end;\n\t\tthis.nodeValue = this.data = text;\n\t\tthis.length = text.length;\n\t}\n}\n_extends(CharacterData,Node);\nfunction Text() {\n};\nText.prototype = {\n\tnodeName : \"#text\",\n\tnodeType : TEXT_NODE,\n\tsplitText : function(offset) {\n\t\tvar text = this.data;\n\t\tvar newText = text.substring(offset);\n\t\ttext = text.substring(0, offset);\n\t\tthis.data = this.nodeValue = text;\n\t\tthis.length = text.length;\n\t\tvar newNode = this.ownerDocument.createTextNode(newText);\n\t\tif(this.parentNode){\n\t\t\tthis.parentNode.insertBefore(newNode, this.nextSibling);\n\t\t}\n\t\treturn newNode;\n\t}\n}\n_extends(Text,CharacterData);\nfunction Comment() {\n};\nComment.prototype = {\n\tnodeName : \"#comment\",\n\tnodeType : COMMENT_NODE\n}\n_extends(Comment,CharacterData);\n\nfunction CDATASection() {\n};\nCDATASection.prototype = {\n\tnodeName : \"#cdata-section\",\n\tnodeType : CDATA_SECTION_NODE\n}\n_extends(CDATASection,CharacterData);\n\n\nfunction DocumentType() {\n};\nDocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;\n_extends(DocumentType,Node);\n\nfunction Notation() {\n};\nNotation.prototype.nodeType = NOTATION_NODE;\n_extends(Notation,Node);\n\nfunction Entity() {\n};\nEntity.prototype.nodeType = ENTITY_NODE;\n_extends(Entity,Node);\n\nfunction EntityReference() {\n};\nEntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;\n_extends(EntityReference,Node);\n\nfunction DocumentFragment() {\n};\nDocumentFragment.prototype.nodeName =\t\"#document-fragment\";\nDocumentFragment.prototype.nodeType =\tDOCUMENT_FRAGMENT_NODE;\n_extends(DocumentFragment,Node);\n\n\nfunction ProcessingInstruction() {\n}\nProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;\n_extends(ProcessingInstruction,Node);\nfunction XMLSerializer(){}\nXMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){\n\treturn nodeSerializeToString.call(node,isHtml,nodeFilter);\n}\nNode.prototype.toString = nodeSerializeToString;\nfunction nodeSerializeToString(isHtml,nodeFilter){\n\tvar buf = [];\n\tvar refNode = this.nodeType == 9 && this.documentElement || this;\n\tvar prefix = refNode.prefix;\n\tvar uri = refNode.namespaceURI;\n\n\tif(uri && prefix == null){\n\t\t//console.log(prefix)\n\t\tvar prefix = refNode.lookupPrefix(uri);\n\t\tif(prefix == null){\n\t\t\t//isHTML = true;\n\t\t\tvar visibleNamespaces=[\n\t\t\t{namespace:uri,prefix:null}\n\t\t\t//{namespace:uri,prefix:''}\n\t\t\t]\n\t\t}\n\t}\n\tserializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);\n\t//console.log('###',this.nodeType,uri,prefix,buf.join(''))\n\treturn buf.join('');\n}\n\nfunction needNamespaceDefine(node, isHTML, visibleNamespaces) {\n\tvar prefix = node.prefix || '';\n\tvar uri = node.namespaceURI;\n\t// According to [Namespaces in XML 1.0](https://www.w3.org/TR/REC-xml-names/#ns-using) ,\n\t// and more specifically https://www.w3.org/TR/REC-xml-names/#nsc-NoPrefixUndecl :\n\t// > In a namespace declaration for a prefix [...], the attribute value MUST NOT be empty.\n\t// in a similar manner [Namespaces in XML 1.1](https://www.w3.org/TR/xml-names11/#ns-using)\n\t// and more specifically https://www.w3.org/TR/xml-names11/#nsc-NSDeclared :\n\t// > [...] Furthermore, the attribute value [...] must not be an empty string.\n\t// so serializing empty namespace value like xmlns:ds=\"\" would produce an invalid XML document.\n\tif (!uri) {\n\t\treturn false;\n\t}\n\tif (prefix === \"xml\" && uri === NAMESPACE.XML || uri === NAMESPACE.XMLNS) {\n\t\treturn false;\n\t}\n\n\tvar i = visibleNamespaces.length\n\twhile (i--) {\n\t\tvar ns = visibleNamespaces[i];\n\t\t// get namespace prefix\n\t\tif (ns.prefix === prefix) {\n\t\t\treturn ns.namespace !== uri;\n\t\t}\n\t}\n\treturn true;\n}\n/**\n * Well-formed constraint: No < in Attribute Values\n * > The replacement text of any entity referred to directly or indirectly\n * > in an attribute value must not contain a <.\n * @see https://www.w3.org/TR/xml11/#CleanAttrVals\n * @see https://www.w3.org/TR/xml11/#NT-AttValue\n *\n * Literal whitespace other than space that appear in attribute values\n * are serialized as their entity references, so they will be preserved.\n * (In contrast to whitespace literals in the input which are normalized to spaces)\n * @see https://www.w3.org/TR/xml11/#AVNormalize\n * @see https://w3c.github.io/DOM-Parsing/#serializing-an-element-s-attributes\n */\nfunction addSerializedAttribute(buf, qualifiedName, value) {\n\tbuf.push(' ', qualifiedName, '=\"', value.replace(/[<>&\"\\t\\n\\r]/g, _xmlEncoder), '\"')\n}\n\nfunction serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){\n\tif (!visibleNamespaces) {\n\t\tvisibleNamespaces = [];\n\t}\n\n\tif(nodeFilter){\n\t\tnode = nodeFilter(node);\n\t\tif(node){\n\t\t\tif(typeof node == 'string'){\n\t\t\t\tbuf.push(node);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}else{\n\t\t\treturn;\n\t\t}\n\t\t//buf.sort.apply(attrs, attributeSorter);\n\t}\n\n\tswitch(node.nodeType){\n\tcase ELEMENT_NODE:\n\t\tvar attrs = node.attributes;\n\t\tvar len = attrs.length;\n\t\tvar child = node.firstChild;\n\t\tvar nodeName = node.tagName;\n\n\t\tisHTML = NAMESPACE.isHTML(node.namespaceURI) || isHTML\n\n\t\tvar prefixedNodeName = nodeName\n\t\tif (!isHTML && !node.prefix && node.namespaceURI) {\n\t\t\tvar defaultNS\n\t\t\t// lookup current default ns from `xmlns` attribute\n\t\t\tfor (var ai = 0; ai < attrs.length; ai++) {\n\t\t\t\tif (attrs.item(ai).name === 'xmlns') {\n\t\t\t\t\tdefaultNS = attrs.item(ai).value\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!defaultNS) {\n\t\t\t\t// lookup current default ns in visibleNamespaces\n\t\t\t\tfor (var nsi = visibleNamespaces.length - 1; nsi >= 0; nsi--) {\n\t\t\t\t\tvar namespace = visibleNamespaces[nsi]\n\t\t\t\t\tif (namespace.prefix === '' && namespace.namespace === node.namespaceURI) {\n\t\t\t\t\t\tdefaultNS = namespace.namespace\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (defaultNS !== node.namespaceURI) {\n\t\t\t\tfor (var nsi = visibleNamespaces.length - 1; nsi >= 0; nsi--) {\n\t\t\t\t\tvar namespace = visibleNamespaces[nsi]\n\t\t\t\t\tif (namespace.namespace === node.namespaceURI) {\n\t\t\t\t\t\tif (namespace.prefix) {\n\t\t\t\t\t\t\tprefixedNodeName = namespace.prefix + ':' + nodeName\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tbuf.push('<', prefixedNodeName);\n\n\t\tfor(var i=0;i');\n\t\t\t//if is cdata child node\n\t\t\tif(isHTML && /^script$/i.test(nodeName)){\n\t\t\t\twhile(child){\n\t\t\t\t\tif(child.data){\n\t\t\t\t\t\tbuf.push(child.data);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tserializeToString(child, buf, isHTML, nodeFilter, visibleNamespaces.slice());\n\t\t\t\t\t}\n\t\t\t\t\tchild = child.nextSibling;\n\t\t\t\t}\n\t\t\t}else\n\t\t\t{\n\t\t\t\twhile(child){\n\t\t\t\t\tserializeToString(child, buf, isHTML, nodeFilter, visibleNamespaces.slice());\n\t\t\t\t\tchild = child.nextSibling;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbuf.push('');\n\t\t}else{\n\t\t\tbuf.push('/>');\n\t\t}\n\t\t// remove added visible namespaces\n\t\t//visibleNamespaces.length = startVisibleNamespaces;\n\t\treturn;\n\tcase DOCUMENT_NODE:\n\tcase DOCUMENT_FRAGMENT_NODE:\n\t\tvar child = node.firstChild;\n\t\twhile(child){\n\t\t\tserializeToString(child, buf, isHTML, nodeFilter, visibleNamespaces.slice());\n\t\t\tchild = child.nextSibling;\n\t\t}\n\t\treturn;\n\tcase ATTRIBUTE_NODE:\n\t\treturn addSerializedAttribute(buf, node.name, node.value);\n\tcase TEXT_NODE:\n\t\t/**\n\t\t * The ampersand character (&) and the left angle bracket (<) must not appear in their literal form,\n\t\t * except when used as markup delimiters, or within a comment, a processing instruction, or a CDATA section.\n\t\t * If they are needed elsewhere, they must be escaped using either numeric character references or the strings\n\t\t * `&` and `<` respectively.\n\t\t * The right angle bracket (>) may be represented using the string \" > \", and must, for compatibility,\n\t\t * be escaped using either `>` or a character reference when it appears in the string `]]>` in content,\n\t\t * when that string is not marking the end of a CDATA section.\n\t\t *\n\t\t * In the content of elements, character data is any string of characters\n\t\t * which does not contain the start-delimiter of any markup\n\t\t * and does not include the CDATA-section-close delimiter, `]]>`.\n\t\t *\n\t\t * @see https://www.w3.org/TR/xml/#NT-CharData\n\t\t * @see https://w3c.github.io/DOM-Parsing/#xml-serializing-a-text-node\n\t\t */\n\t\treturn buf.push(node.data\n\t\t\t.replace(/[<&>]/g,_xmlEncoder)\n\t\t);\n\tcase CDATA_SECTION_NODE:\n\t\treturn buf.push( '');\n\tcase COMMENT_NODE:\n\t\treturn buf.push( \"\");\n\tcase DOCUMENT_TYPE_NODE:\n\t\tvar pubid = node.publicId;\n\t\tvar sysid = node.systemId;\n\t\tbuf.push('');\n\t\t}else if(sysid && sysid!='.'){\n\t\t\tbuf.push(' SYSTEM ', sysid, '>');\n\t\t}else{\n\t\t\tvar sub = node.internalSubset;\n\t\t\tif(sub){\n\t\t\t\tbuf.push(\" [\",sub,\"]\");\n\t\t\t}\n\t\t\tbuf.push(\">\");\n\t\t}\n\t\treturn;\n\tcase PROCESSING_INSTRUCTION_NODE:\n\t\treturn buf.push( \"\");\n\tcase ENTITY_REFERENCE_NODE:\n\t\treturn buf.push( '&',node.nodeName,';');\n\t//case ENTITY_NODE:\n\t//case NOTATION_NODE:\n\tdefault:\n\t\tbuf.push('??',node.nodeName);\n\t}\n}\nfunction importNode(doc,node,deep){\n\tvar node2;\n\tswitch (node.nodeType) {\n\tcase ELEMENT_NODE:\n\t\tnode2 = node.cloneNode(false);\n\t\tnode2.ownerDocument = doc;\n\t\t//var attrs = node2.attributes;\n\t\t//var len = attrs.length;\n\t\t//for(var i=0;i',\n\tlt: '<',\n\tquot: '\"',\n});\n\n/**\n * A map of all entities that are detected in an HTML document.\n * They contain all entries from `XML_ENTITIES`.\n *\n * @see XML_ENTITIES\n * @see DOMParser.parseFromString\n * @see DOMImplementation.prototype.createHTMLDocument\n * @see https://html.spec.whatwg.org/#named-character-references WHATWG HTML(5) Spec\n * @see https://html.spec.whatwg.org/entities.json JSON\n * @see https://www.w3.org/TR/xml-entity-names/ W3C XML Entity Names\n * @see https://www.w3.org/TR/html4/sgml/entities.html W3C HTML4/SGML\n * @see https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Character_entity_references_in_HTML Wikipedia (HTML)\n * @see https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Entities_representing_special_characters_in_XHTML Wikpedia (XHTML)\n */\nexports.HTML_ENTITIES = freeze({\n\tAacute: '\\u00C1',\n\taacute: '\\u00E1',\n\tAbreve: '\\u0102',\n\tabreve: '\\u0103',\n\tac: '\\u223E',\n\tacd: '\\u223F',\n\tacE: '\\u223E\\u0333',\n\tAcirc: '\\u00C2',\n\tacirc: '\\u00E2',\n\tacute: '\\u00B4',\n\tAcy: '\\u0410',\n\tacy: '\\u0430',\n\tAElig: '\\u00C6',\n\taelig: '\\u00E6',\n\taf: '\\u2061',\n\tAfr: '\\uD835\\uDD04',\n\tafr: '\\uD835\\uDD1E',\n\tAgrave: '\\u00C0',\n\tagrave: '\\u00E0',\n\talefsym: '\\u2135',\n\taleph: '\\u2135',\n\tAlpha: '\\u0391',\n\talpha: '\\u03B1',\n\tAmacr: '\\u0100',\n\tamacr: '\\u0101',\n\tamalg: '\\u2A3F',\n\tAMP: '\\u0026',\n\tamp: '\\u0026',\n\tAnd: '\\u2A53',\n\tand: '\\u2227',\n\tandand: '\\u2A55',\n\tandd: '\\u2A5C',\n\tandslope: '\\u2A58',\n\tandv: '\\u2A5A',\n\tang: '\\u2220',\n\tange: '\\u29A4',\n\tangle: '\\u2220',\n\tangmsd: '\\u2221',\n\tangmsdaa: '\\u29A8',\n\tangmsdab: '\\u29A9',\n\tangmsdac: '\\u29AA',\n\tangmsdad: '\\u29AB',\n\tangmsdae: '\\u29AC',\n\tangmsdaf: '\\u29AD',\n\tangmsdag: '\\u29AE',\n\tangmsdah: '\\u29AF',\n\tangrt: '\\u221F',\n\tangrtvb: '\\u22BE',\n\tangrtvbd: '\\u299D',\n\tangsph: '\\u2222',\n\tangst: '\\u00C5',\n\tangzarr: '\\u237C',\n\tAogon: '\\u0104',\n\taogon: '\\u0105',\n\tAopf: '\\uD835\\uDD38',\n\taopf: '\\uD835\\uDD52',\n\tap: '\\u2248',\n\tapacir: '\\u2A6F',\n\tapE: '\\u2A70',\n\tape: '\\u224A',\n\tapid: '\\u224B',\n\tapos: '\\u0027',\n\tApplyFunction: '\\u2061',\n\tapprox: '\\u2248',\n\tapproxeq: '\\u224A',\n\tAring: '\\u00C5',\n\taring: '\\u00E5',\n\tAscr: '\\uD835\\uDC9C',\n\tascr: '\\uD835\\uDCB6',\n\tAssign: '\\u2254',\n\tast: '\\u002A',\n\tasymp: '\\u2248',\n\tasympeq: '\\u224D',\n\tAtilde: '\\u00C3',\n\tatilde: '\\u00E3',\n\tAuml: '\\u00C4',\n\tauml: '\\u00E4',\n\tawconint: '\\u2233',\n\tawint: '\\u2A11',\n\tbackcong: '\\u224C',\n\tbackepsilon: '\\u03F6',\n\tbackprime: '\\u2035',\n\tbacksim: '\\u223D',\n\tbacksimeq: '\\u22CD',\n\tBackslash: '\\u2216',\n\tBarv: '\\u2AE7',\n\tbarvee: '\\u22BD',\n\tBarwed: '\\u2306',\n\tbarwed: '\\u2305',\n\tbarwedge: '\\u2305',\n\tbbrk: '\\u23B5',\n\tbbrktbrk: '\\u23B6',\n\tbcong: '\\u224C',\n\tBcy: '\\u0411',\n\tbcy: '\\u0431',\n\tbdquo: '\\u201E',\n\tbecaus: '\\u2235',\n\tBecause: '\\u2235',\n\tbecause: '\\u2235',\n\tbemptyv: '\\u29B0',\n\tbepsi: '\\u03F6',\n\tbernou: '\\u212C',\n\tBernoullis: '\\u212C',\n\tBeta: '\\u0392',\n\tbeta: '\\u03B2',\n\tbeth: '\\u2136',\n\tbetween: '\\u226C',\n\tBfr: '\\uD835\\uDD05',\n\tbfr: '\\uD835\\uDD1F',\n\tbigcap: '\\u22C2',\n\tbigcirc: '\\u25EF',\n\tbigcup: '\\u22C3',\n\tbigodot: '\\u2A00',\n\tbigoplus: '\\u2A01',\n\tbigotimes: '\\u2A02',\n\tbigsqcup: '\\u2A06',\n\tbigstar: '\\u2605',\n\tbigtriangledown: '\\u25BD',\n\tbigtriangleup: '\\u25B3',\n\tbiguplus: '\\u2A04',\n\tbigvee: '\\u22C1',\n\tbigwedge: '\\u22C0',\n\tbkarow: '\\u290D',\n\tblacklozenge: '\\u29EB',\n\tblacksquare: '\\u25AA',\n\tblacktriangle: '\\u25B4',\n\tblacktriangledown: '\\u25BE',\n\tblacktriangleleft: '\\u25C2',\n\tblacktriangleright: '\\u25B8',\n\tblank: '\\u2423',\n\tblk12: '\\u2592',\n\tblk14: '\\u2591',\n\tblk34: '\\u2593',\n\tblock: '\\u2588',\n\tbne: '\\u003D\\u20E5',\n\tbnequiv: '\\u2261\\u20E5',\n\tbNot: '\\u2AED',\n\tbnot: '\\u2310',\n\tBopf: '\\uD835\\uDD39',\n\tbopf: '\\uD835\\uDD53',\n\tbot: '\\u22A5',\n\tbottom: '\\u22A5',\n\tbowtie: '\\u22C8',\n\tboxbox: '\\u29C9',\n\tboxDL: '\\u2557',\n\tboxDl: '\\u2556',\n\tboxdL: '\\u2555',\n\tboxdl: '\\u2510',\n\tboxDR: '\\u2554',\n\tboxDr: '\\u2553',\n\tboxdR: '\\u2552',\n\tboxdr: '\\u250C',\n\tboxH: '\\u2550',\n\tboxh: '\\u2500',\n\tboxHD: '\\u2566',\n\tboxHd: '\\u2564',\n\tboxhD: '\\u2565',\n\tboxhd: '\\u252C',\n\tboxHU: '\\u2569',\n\tboxHu: '\\u2567',\n\tboxhU: '\\u2568',\n\tboxhu: '\\u2534',\n\tboxminus: '\\u229F',\n\tboxplus: '\\u229E',\n\tboxtimes: '\\u22A0',\n\tboxUL: '\\u255D',\n\tboxUl: '\\u255C',\n\tboxuL: '\\u255B',\n\tboxul: '\\u2518',\n\tboxUR: '\\u255A',\n\tboxUr: '\\u2559',\n\tboxuR: '\\u2558',\n\tboxur: '\\u2514',\n\tboxV: '\\u2551',\n\tboxv: '\\u2502',\n\tboxVH: '\\u256C',\n\tboxVh: '\\u256B',\n\tboxvH: '\\u256A',\n\tboxvh: '\\u253C',\n\tboxVL: '\\u2563',\n\tboxVl: '\\u2562',\n\tboxvL: '\\u2561',\n\tboxvl: '\\u2524',\n\tboxVR: '\\u2560',\n\tboxVr: '\\u255F',\n\tboxvR: '\\u255E',\n\tboxvr: '\\u251C',\n\tbprime: '\\u2035',\n\tBreve: '\\u02D8',\n\tbreve: '\\u02D8',\n\tbrvbar: '\\u00A6',\n\tBscr: '\\u212C',\n\tbscr: '\\uD835\\uDCB7',\n\tbsemi: '\\u204F',\n\tbsim: '\\u223D',\n\tbsime: '\\u22CD',\n\tbsol: '\\u005C',\n\tbsolb: '\\u29C5',\n\tbsolhsub: '\\u27C8',\n\tbull: '\\u2022',\n\tbullet: '\\u2022',\n\tbump: '\\u224E',\n\tbumpE: '\\u2AAE',\n\tbumpe: '\\u224F',\n\tBumpeq: '\\u224E',\n\tbumpeq: '\\u224F',\n\tCacute: '\\u0106',\n\tcacute: '\\u0107',\n\tCap: '\\u22D2',\n\tcap: '\\u2229',\n\tcapand: '\\u2A44',\n\tcapbrcup: '\\u2A49',\n\tcapcap: '\\u2A4B',\n\tcapcup: '\\u2A47',\n\tcapdot: '\\u2A40',\n\tCapitalDifferentialD: '\\u2145',\n\tcaps: '\\u2229\\uFE00',\n\tcaret: '\\u2041',\n\tcaron: '\\u02C7',\n\tCayleys: '\\u212D',\n\tccaps: '\\u2A4D',\n\tCcaron: '\\u010C',\n\tccaron: '\\u010D',\n\tCcedil: '\\u00C7',\n\tccedil: '\\u00E7',\n\tCcirc: '\\u0108',\n\tccirc: '\\u0109',\n\tCconint: '\\u2230',\n\tccups: '\\u2A4C',\n\tccupssm: '\\u2A50',\n\tCdot: '\\u010A',\n\tcdot: '\\u010B',\n\tcedil: '\\u00B8',\n\tCedilla: '\\u00B8',\n\tcemptyv: '\\u29B2',\n\tcent: '\\u00A2',\n\tCenterDot: '\\u00B7',\n\tcenterdot: '\\u00B7',\n\tCfr: '\\u212D',\n\tcfr: '\\uD835\\uDD20',\n\tCHcy: '\\u0427',\n\tchcy: '\\u0447',\n\tcheck: '\\u2713',\n\tcheckmark: '\\u2713',\n\tChi: '\\u03A7',\n\tchi: '\\u03C7',\n\tcir: '\\u25CB',\n\tcirc: '\\u02C6',\n\tcirceq: '\\u2257',\n\tcirclearrowleft: '\\u21BA',\n\tcirclearrowright: '\\u21BB',\n\tcircledast: '\\u229B',\n\tcircledcirc: '\\u229A',\n\tcircleddash: '\\u229D',\n\tCircleDot: '\\u2299',\n\tcircledR: '\\u00AE',\n\tcircledS: '\\u24C8',\n\tCircleMinus: '\\u2296',\n\tCirclePlus: '\\u2295',\n\tCircleTimes: '\\u2297',\n\tcirE: '\\u29C3',\n\tcire: '\\u2257',\n\tcirfnint: '\\u2A10',\n\tcirmid: '\\u2AEF',\n\tcirscir: '\\u29C2',\n\tClockwiseContourIntegral: '\\u2232',\n\tCloseCurlyDoubleQuote: '\\u201D',\n\tCloseCurlyQuote: '\\u2019',\n\tclubs: '\\u2663',\n\tclubsuit: '\\u2663',\n\tColon: '\\u2237',\n\tcolon: '\\u003A',\n\tColone: '\\u2A74',\n\tcolone: '\\u2254',\n\tcoloneq: '\\u2254',\n\tcomma: '\\u002C',\n\tcommat: '\\u0040',\n\tcomp: '\\u2201',\n\tcompfn: '\\u2218',\n\tcomplement: '\\u2201',\n\tcomplexes: '\\u2102',\n\tcong: '\\u2245',\n\tcongdot: '\\u2A6D',\n\tCongruent: '\\u2261',\n\tConint: '\\u222F',\n\tconint: '\\u222E',\n\tContourIntegral: '\\u222E',\n\tCopf: '\\u2102',\n\tcopf: '\\uD835\\uDD54',\n\tcoprod: '\\u2210',\n\tCoproduct: '\\u2210',\n\tCOPY: '\\u00A9',\n\tcopy: '\\u00A9',\n\tcopysr: '\\u2117',\n\tCounterClockwiseContourIntegral: '\\u2233',\n\tcrarr: '\\u21B5',\n\tCross: '\\u2A2F',\n\tcross: '\\u2717',\n\tCscr: '\\uD835\\uDC9E',\n\tcscr: '\\uD835\\uDCB8',\n\tcsub: '\\u2ACF',\n\tcsube: '\\u2AD1',\n\tcsup: '\\u2AD0',\n\tcsupe: '\\u2AD2',\n\tctdot: '\\u22EF',\n\tcudarrl: '\\u2938',\n\tcudarrr: '\\u2935',\n\tcuepr: '\\u22DE',\n\tcuesc: '\\u22DF',\n\tcularr: '\\u21B6',\n\tcularrp: '\\u293D',\n\tCup: '\\u22D3',\n\tcup: '\\u222A',\n\tcupbrcap: '\\u2A48',\n\tCupCap: '\\u224D',\n\tcupcap: '\\u2A46',\n\tcupcup: '\\u2A4A',\n\tcupdot: '\\u228D',\n\tcupor: '\\u2A45',\n\tcups: '\\u222A\\uFE00',\n\tcurarr: '\\u21B7',\n\tcurarrm: '\\u293C',\n\tcurlyeqprec: '\\u22DE',\n\tcurlyeqsucc: '\\u22DF',\n\tcurlyvee: '\\u22CE',\n\tcurlywedge: '\\u22CF',\n\tcurren: '\\u00A4',\n\tcurvearrowleft: '\\u21B6',\n\tcurvearrowright: '\\u21B7',\n\tcuvee: '\\u22CE',\n\tcuwed: '\\u22CF',\n\tcwconint: '\\u2232',\n\tcwint: '\\u2231',\n\tcylcty: '\\u232D',\n\tDagger: '\\u2021',\n\tdagger: '\\u2020',\n\tdaleth: '\\u2138',\n\tDarr: '\\u21A1',\n\tdArr: '\\u21D3',\n\tdarr: '\\u2193',\n\tdash: '\\u2010',\n\tDashv: '\\u2AE4',\n\tdashv: '\\u22A3',\n\tdbkarow: '\\u290F',\n\tdblac: '\\u02DD',\n\tDcaron: '\\u010E',\n\tdcaron: '\\u010F',\n\tDcy: '\\u0414',\n\tdcy: '\\u0434',\n\tDD: '\\u2145',\n\tdd: '\\u2146',\n\tddagger: '\\u2021',\n\tddarr: '\\u21CA',\n\tDDotrahd: '\\u2911',\n\tddotseq: '\\u2A77',\n\tdeg: '\\u00B0',\n\tDel: '\\u2207',\n\tDelta: '\\u0394',\n\tdelta: '\\u03B4',\n\tdemptyv: '\\u29B1',\n\tdfisht: '\\u297F',\n\tDfr: '\\uD835\\uDD07',\n\tdfr: '\\uD835\\uDD21',\n\tdHar: '\\u2965',\n\tdharl: '\\u21C3',\n\tdharr: '\\u21C2',\n\tDiacriticalAcute: '\\u00B4',\n\tDiacriticalDot: '\\u02D9',\n\tDiacriticalDoubleAcute: '\\u02DD',\n\tDiacriticalGrave: '\\u0060',\n\tDiacriticalTilde: '\\u02DC',\n\tdiam: '\\u22C4',\n\tDiamond: '\\u22C4',\n\tdiamond: '\\u22C4',\n\tdiamondsuit: '\\u2666',\n\tdiams: '\\u2666',\n\tdie: '\\u00A8',\n\tDifferentialD: '\\u2146',\n\tdigamma: '\\u03DD',\n\tdisin: '\\u22F2',\n\tdiv: '\\u00F7',\n\tdivide: '\\u00F7',\n\tdivideontimes: '\\u22C7',\n\tdivonx: '\\u22C7',\n\tDJcy: '\\u0402',\n\tdjcy: '\\u0452',\n\tdlcorn: '\\u231E',\n\tdlcrop: '\\u230D',\n\tdollar: '\\u0024',\n\tDopf: '\\uD835\\uDD3B',\n\tdopf: '\\uD835\\uDD55',\n\tDot: '\\u00A8',\n\tdot: '\\u02D9',\n\tDotDot: '\\u20DC',\n\tdoteq: '\\u2250',\n\tdoteqdot: '\\u2251',\n\tDotEqual: '\\u2250',\n\tdotminus: '\\u2238',\n\tdotplus: '\\u2214',\n\tdotsquare: '\\u22A1',\n\tdoublebarwedge: '\\u2306',\n\tDoubleContourIntegral: '\\u222F',\n\tDoubleDot: '\\u00A8',\n\tDoubleDownArrow: '\\u21D3',\n\tDoubleLeftArrow: '\\u21D0',\n\tDoubleLeftRightArrow: '\\u21D4',\n\tDoubleLeftTee: '\\u2AE4',\n\tDoubleLongLeftArrow: '\\u27F8',\n\tDoubleLongLeftRightArrow: '\\u27FA',\n\tDoubleLongRightArrow: '\\u27F9',\n\tDoubleRightArrow: '\\u21D2',\n\tDoubleRightTee: '\\u22A8',\n\tDoubleUpArrow: '\\u21D1',\n\tDoubleUpDownArrow: '\\u21D5',\n\tDoubleVerticalBar: '\\u2225',\n\tDownArrow: '\\u2193',\n\tDownarrow: '\\u21D3',\n\tdownarrow: '\\u2193',\n\tDownArrowBar: '\\u2913',\n\tDownArrowUpArrow: '\\u21F5',\n\tDownBreve: '\\u0311',\n\tdowndownarrows: '\\u21CA',\n\tdownharpoonleft: '\\u21C3',\n\tdownharpoonright: '\\u21C2',\n\tDownLeftRightVector: '\\u2950',\n\tDownLeftTeeVector: '\\u295E',\n\tDownLeftVector: '\\u21BD',\n\tDownLeftVectorBar: '\\u2956',\n\tDownRightTeeVector: '\\u295F',\n\tDownRightVector: '\\u21C1',\n\tDownRightVectorBar: '\\u2957',\n\tDownTee: '\\u22A4',\n\tDownTeeArrow: '\\u21A7',\n\tdrbkarow: '\\u2910',\n\tdrcorn: '\\u231F',\n\tdrcrop: '\\u230C',\n\tDscr: '\\uD835\\uDC9F',\n\tdscr: '\\uD835\\uDCB9',\n\tDScy: '\\u0405',\n\tdscy: '\\u0455',\n\tdsol: '\\u29F6',\n\tDstrok: '\\u0110',\n\tdstrok: '\\u0111',\n\tdtdot: '\\u22F1',\n\tdtri: '\\u25BF',\n\tdtrif: '\\u25BE',\n\tduarr: '\\u21F5',\n\tduhar: '\\u296F',\n\tdwangle: '\\u29A6',\n\tDZcy: '\\u040F',\n\tdzcy: '\\u045F',\n\tdzigrarr: '\\u27FF',\n\tEacute: '\\u00C9',\n\teacute: '\\u00E9',\n\teaster: '\\u2A6E',\n\tEcaron: '\\u011A',\n\tecaron: '\\u011B',\n\tecir: '\\u2256',\n\tEcirc: '\\u00CA',\n\tecirc: '\\u00EA',\n\tecolon: '\\u2255',\n\tEcy: '\\u042D',\n\tecy: '\\u044D',\n\teDDot: '\\u2A77',\n\tEdot: '\\u0116',\n\teDot: '\\u2251',\n\tedot: '\\u0117',\n\tee: '\\u2147',\n\tefDot: '\\u2252',\n\tEfr: '\\uD835\\uDD08',\n\tefr: '\\uD835\\uDD22',\n\teg: '\\u2A9A',\n\tEgrave: '\\u00C8',\n\tegrave: '\\u00E8',\n\tegs: '\\u2A96',\n\tegsdot: '\\u2A98',\n\tel: '\\u2A99',\n\tElement: '\\u2208',\n\telinters: '\\u23E7',\n\tell: '\\u2113',\n\tels: '\\u2A95',\n\telsdot: '\\u2A97',\n\tEmacr: '\\u0112',\n\temacr: '\\u0113',\n\tempty: '\\u2205',\n\temptyset: '\\u2205',\n\tEmptySmallSquare: '\\u25FB',\n\temptyv: '\\u2205',\n\tEmptyVerySmallSquare: '\\u25AB',\n\temsp: '\\u2003',\n\temsp13: '\\u2004',\n\temsp14: '\\u2005',\n\tENG: '\\u014A',\n\teng: '\\u014B',\n\tensp: '\\u2002',\n\tEogon: '\\u0118',\n\teogon: '\\u0119',\n\tEopf: '\\uD835\\uDD3C',\n\teopf: '\\uD835\\uDD56',\n\tepar: '\\u22D5',\n\teparsl: '\\u29E3',\n\teplus: '\\u2A71',\n\tepsi: '\\u03B5',\n\tEpsilon: '\\u0395',\n\tepsilon: '\\u03B5',\n\tepsiv: '\\u03F5',\n\teqcirc: '\\u2256',\n\teqcolon: '\\u2255',\n\teqsim: '\\u2242',\n\teqslantgtr: '\\u2A96',\n\teqslantless: '\\u2A95',\n\tEqual: '\\u2A75',\n\tequals: '\\u003D',\n\tEqualTilde: '\\u2242',\n\tequest: '\\u225F',\n\tEquilibrium: '\\u21CC',\n\tequiv: '\\u2261',\n\tequivDD: '\\u2A78',\n\teqvparsl: '\\u29E5',\n\terarr: '\\u2971',\n\terDot: '\\u2253',\n\tEscr: '\\u2130',\n\tescr: '\\u212F',\n\tesdot: '\\u2250',\n\tEsim: '\\u2A73',\n\tesim: '\\u2242',\n\tEta: '\\u0397',\n\teta: '\\u03B7',\n\tETH: '\\u00D0',\n\teth: '\\u00F0',\n\tEuml: '\\u00CB',\n\teuml: '\\u00EB',\n\teuro: '\\u20AC',\n\texcl: '\\u0021',\n\texist: '\\u2203',\n\tExists: '\\u2203',\n\texpectation: '\\u2130',\n\tExponentialE: '\\u2147',\n\texponentiale: '\\u2147',\n\tfallingdotseq: '\\u2252',\n\tFcy: '\\u0424',\n\tfcy: '\\u0444',\n\tfemale: '\\u2640',\n\tffilig: '\\uFB03',\n\tfflig: '\\uFB00',\n\tffllig: '\\uFB04',\n\tFfr: '\\uD835\\uDD09',\n\tffr: '\\uD835\\uDD23',\n\tfilig: '\\uFB01',\n\tFilledSmallSquare: '\\u25FC',\n\tFilledVerySmallSquare: '\\u25AA',\n\tfjlig: '\\u0066\\u006A',\n\tflat: '\\u266D',\n\tfllig: '\\uFB02',\n\tfltns: '\\u25B1',\n\tfnof: '\\u0192',\n\tFopf: '\\uD835\\uDD3D',\n\tfopf: '\\uD835\\uDD57',\n\tForAll: '\\u2200',\n\tforall: '\\u2200',\n\tfork: '\\u22D4',\n\tforkv: '\\u2AD9',\n\tFouriertrf: '\\u2131',\n\tfpartint: '\\u2A0D',\n\tfrac12: '\\u00BD',\n\tfrac13: '\\u2153',\n\tfrac14: '\\u00BC',\n\tfrac15: '\\u2155',\n\tfrac16: '\\u2159',\n\tfrac18: '\\u215B',\n\tfrac23: '\\u2154',\n\tfrac25: '\\u2156',\n\tfrac34: '\\u00BE',\n\tfrac35: '\\u2157',\n\tfrac38: '\\u215C',\n\tfrac45: '\\u2158',\n\tfrac56: '\\u215A',\n\tfrac58: '\\u215D',\n\tfrac78: '\\u215E',\n\tfrasl: '\\u2044',\n\tfrown: '\\u2322',\n\tFscr: '\\u2131',\n\tfscr: '\\uD835\\uDCBB',\n\tgacute: '\\u01F5',\n\tGamma: '\\u0393',\n\tgamma: '\\u03B3',\n\tGammad: '\\u03DC',\n\tgammad: '\\u03DD',\n\tgap: '\\u2A86',\n\tGbreve: '\\u011E',\n\tgbreve: '\\u011F',\n\tGcedil: '\\u0122',\n\tGcirc: '\\u011C',\n\tgcirc: '\\u011D',\n\tGcy: '\\u0413',\n\tgcy: '\\u0433',\n\tGdot: '\\u0120',\n\tgdot: '\\u0121',\n\tgE: '\\u2267',\n\tge: '\\u2265',\n\tgEl: '\\u2A8C',\n\tgel: '\\u22DB',\n\tgeq: '\\u2265',\n\tgeqq: '\\u2267',\n\tgeqslant: '\\u2A7E',\n\tges: '\\u2A7E',\n\tgescc: '\\u2AA9',\n\tgesdot: '\\u2A80',\n\tgesdoto: '\\u2A82',\n\tgesdotol: '\\u2A84',\n\tgesl: '\\u22DB\\uFE00',\n\tgesles: '\\u2A94',\n\tGfr: '\\uD835\\uDD0A',\n\tgfr: '\\uD835\\uDD24',\n\tGg: '\\u22D9',\n\tgg: '\\u226B',\n\tggg: '\\u22D9',\n\tgimel: '\\u2137',\n\tGJcy: '\\u0403',\n\tgjcy: '\\u0453',\n\tgl: '\\u2277',\n\tgla: '\\u2AA5',\n\tglE: '\\u2A92',\n\tglj: '\\u2AA4',\n\tgnap: '\\u2A8A',\n\tgnapprox: '\\u2A8A',\n\tgnE: '\\u2269',\n\tgne: '\\u2A88',\n\tgneq: '\\u2A88',\n\tgneqq: '\\u2269',\n\tgnsim: '\\u22E7',\n\tGopf: '\\uD835\\uDD3E',\n\tgopf: '\\uD835\\uDD58',\n\tgrave: '\\u0060',\n\tGreaterEqual: '\\u2265',\n\tGreaterEqualLess: '\\u22DB',\n\tGreaterFullEqual: '\\u2267',\n\tGreaterGreater: '\\u2AA2',\n\tGreaterLess: '\\u2277',\n\tGreaterSlantEqual: '\\u2A7E',\n\tGreaterTilde: '\\u2273',\n\tGscr: '\\uD835\\uDCA2',\n\tgscr: '\\u210A',\n\tgsim: '\\u2273',\n\tgsime: '\\u2A8E',\n\tgsiml: '\\u2A90',\n\tGt: '\\u226B',\n\tGT: '\\u003E',\n\tgt: '\\u003E',\n\tgtcc: '\\u2AA7',\n\tgtcir: '\\u2A7A',\n\tgtdot: '\\u22D7',\n\tgtlPar: '\\u2995',\n\tgtquest: '\\u2A7C',\n\tgtrapprox: '\\u2A86',\n\tgtrarr: '\\u2978',\n\tgtrdot: '\\u22D7',\n\tgtreqless: '\\u22DB',\n\tgtreqqless: '\\u2A8C',\n\tgtrless: '\\u2277',\n\tgtrsim: '\\u2273',\n\tgvertneqq: '\\u2269\\uFE00',\n\tgvnE: '\\u2269\\uFE00',\n\tHacek: '\\u02C7',\n\thairsp: '\\u200A',\n\thalf: '\\u00BD',\n\thamilt: '\\u210B',\n\tHARDcy: '\\u042A',\n\thardcy: '\\u044A',\n\thArr: '\\u21D4',\n\tharr: '\\u2194',\n\tharrcir: '\\u2948',\n\tharrw: '\\u21AD',\n\tHat: '\\u005E',\n\thbar: '\\u210F',\n\tHcirc: '\\u0124',\n\thcirc: '\\u0125',\n\thearts: '\\u2665',\n\theartsuit: '\\u2665',\n\thellip: '\\u2026',\n\thercon: '\\u22B9',\n\tHfr: '\\u210C',\n\thfr: '\\uD835\\uDD25',\n\tHilbertSpace: '\\u210B',\n\thksearow: '\\u2925',\n\thkswarow: '\\u2926',\n\thoarr: '\\u21FF',\n\thomtht: '\\u223B',\n\thookleftarrow: '\\u21A9',\n\thookrightarrow: '\\u21AA',\n\tHopf: '\\u210D',\n\thopf: '\\uD835\\uDD59',\n\thorbar: '\\u2015',\n\tHorizontalLine: '\\u2500',\n\tHscr: '\\u210B',\n\thscr: '\\uD835\\uDCBD',\n\thslash: '\\u210F',\n\tHstrok: '\\u0126',\n\thstrok: '\\u0127',\n\tHumpDownHump: '\\u224E',\n\tHumpEqual: '\\u224F',\n\thybull: '\\u2043',\n\thyphen: '\\u2010',\n\tIacute: '\\u00CD',\n\tiacute: '\\u00ED',\n\tic: '\\u2063',\n\tIcirc: '\\u00CE',\n\ticirc: '\\u00EE',\n\tIcy: '\\u0418',\n\ticy: '\\u0438',\n\tIdot: '\\u0130',\n\tIEcy: '\\u0415',\n\tiecy: '\\u0435',\n\tiexcl: '\\u00A1',\n\tiff: '\\u21D4',\n\tIfr: '\\u2111',\n\tifr: '\\uD835\\uDD26',\n\tIgrave: '\\u00CC',\n\tigrave: '\\u00EC',\n\tii: '\\u2148',\n\tiiiint: '\\u2A0C',\n\tiiint: '\\u222D',\n\tiinfin: '\\u29DC',\n\tiiota: '\\u2129',\n\tIJlig: '\\u0132',\n\tijlig: '\\u0133',\n\tIm: '\\u2111',\n\tImacr: '\\u012A',\n\timacr: '\\u012B',\n\timage: '\\u2111',\n\tImaginaryI: '\\u2148',\n\timagline: '\\u2110',\n\timagpart: '\\u2111',\n\timath: '\\u0131',\n\timof: '\\u22B7',\n\timped: '\\u01B5',\n\tImplies: '\\u21D2',\n\tin: '\\u2208',\n\tincare: '\\u2105',\n\tinfin: '\\u221E',\n\tinfintie: '\\u29DD',\n\tinodot: '\\u0131',\n\tInt: '\\u222C',\n\tint: '\\u222B',\n\tintcal: '\\u22BA',\n\tintegers: '\\u2124',\n\tIntegral: '\\u222B',\n\tintercal: '\\u22BA',\n\tIntersection: '\\u22C2',\n\tintlarhk: '\\u2A17',\n\tintprod: '\\u2A3C',\n\tInvisibleComma: '\\u2063',\n\tInvisibleTimes: '\\u2062',\n\tIOcy: '\\u0401',\n\tiocy: '\\u0451',\n\tIogon: '\\u012E',\n\tiogon: '\\u012F',\n\tIopf: '\\uD835\\uDD40',\n\tiopf: '\\uD835\\uDD5A',\n\tIota: '\\u0399',\n\tiota: '\\u03B9',\n\tiprod: '\\u2A3C',\n\tiquest: '\\u00BF',\n\tIscr: '\\u2110',\n\tiscr: '\\uD835\\uDCBE',\n\tisin: '\\u2208',\n\tisindot: '\\u22F5',\n\tisinE: '\\u22F9',\n\tisins: '\\u22F4',\n\tisinsv: '\\u22F3',\n\tisinv: '\\u2208',\n\tit: '\\u2062',\n\tItilde: '\\u0128',\n\titilde: '\\u0129',\n\tIukcy: '\\u0406',\n\tiukcy: '\\u0456',\n\tIuml: '\\u00CF',\n\tiuml: '\\u00EF',\n\tJcirc: '\\u0134',\n\tjcirc: '\\u0135',\n\tJcy: '\\u0419',\n\tjcy: '\\u0439',\n\tJfr: '\\uD835\\uDD0D',\n\tjfr: '\\uD835\\uDD27',\n\tjmath: '\\u0237',\n\tJopf: '\\uD835\\uDD41',\n\tjopf: '\\uD835\\uDD5B',\n\tJscr: '\\uD835\\uDCA5',\n\tjscr: '\\uD835\\uDCBF',\n\tJsercy: '\\u0408',\n\tjsercy: '\\u0458',\n\tJukcy: '\\u0404',\n\tjukcy: '\\u0454',\n\tKappa: '\\u039A',\n\tkappa: '\\u03BA',\n\tkappav: '\\u03F0',\n\tKcedil: '\\u0136',\n\tkcedil: '\\u0137',\n\tKcy: '\\u041A',\n\tkcy: '\\u043A',\n\tKfr: '\\uD835\\uDD0E',\n\tkfr: '\\uD835\\uDD28',\n\tkgreen: '\\u0138',\n\tKHcy: '\\u0425',\n\tkhcy: '\\u0445',\n\tKJcy: '\\u040C',\n\tkjcy: '\\u045C',\n\tKopf: '\\uD835\\uDD42',\n\tkopf: '\\uD835\\uDD5C',\n\tKscr: '\\uD835\\uDCA6',\n\tkscr: '\\uD835\\uDCC0',\n\tlAarr: '\\u21DA',\n\tLacute: '\\u0139',\n\tlacute: '\\u013A',\n\tlaemptyv: '\\u29B4',\n\tlagran: '\\u2112',\n\tLambda: '\\u039B',\n\tlambda: '\\u03BB',\n\tLang: '\\u27EA',\n\tlang: '\\u27E8',\n\tlangd: '\\u2991',\n\tlangle: '\\u27E8',\n\tlap: '\\u2A85',\n\tLaplacetrf: '\\u2112',\n\tlaquo: '\\u00AB',\n\tLarr: '\\u219E',\n\tlArr: '\\u21D0',\n\tlarr: '\\u2190',\n\tlarrb: '\\u21E4',\n\tlarrbfs: '\\u291F',\n\tlarrfs: '\\u291D',\n\tlarrhk: '\\u21A9',\n\tlarrlp: '\\u21AB',\n\tlarrpl: '\\u2939',\n\tlarrsim: '\\u2973',\n\tlarrtl: '\\u21A2',\n\tlat: '\\u2AAB',\n\tlAtail: '\\u291B',\n\tlatail: '\\u2919',\n\tlate: '\\u2AAD',\n\tlates: '\\u2AAD\\uFE00',\n\tlBarr: '\\u290E',\n\tlbarr: '\\u290C',\n\tlbbrk: '\\u2772',\n\tlbrace: '\\u007B',\n\tlbrack: '\\u005B',\n\tlbrke: '\\u298B',\n\tlbrksld: '\\u298F',\n\tlbrkslu: '\\u298D',\n\tLcaron: '\\u013D',\n\tlcaron: '\\u013E',\n\tLcedil: '\\u013B',\n\tlcedil: '\\u013C',\n\tlceil: '\\u2308',\n\tlcub: '\\u007B',\n\tLcy: '\\u041B',\n\tlcy: '\\u043B',\n\tldca: '\\u2936',\n\tldquo: '\\u201C',\n\tldquor: '\\u201E',\n\tldrdhar: '\\u2967',\n\tldrushar: '\\u294B',\n\tldsh: '\\u21B2',\n\tlE: '\\u2266',\n\tle: '\\u2264',\n\tLeftAngleBracket: '\\u27E8',\n\tLeftArrow: '\\u2190',\n\tLeftarrow: '\\u21D0',\n\tleftarrow: '\\u2190',\n\tLeftArrowBar: '\\u21E4',\n\tLeftArrowRightArrow: '\\u21C6',\n\tleftarrowtail: '\\u21A2',\n\tLeftCeiling: '\\u2308',\n\tLeftDoubleBracket: '\\u27E6',\n\tLeftDownTeeVector: '\\u2961',\n\tLeftDownVector: '\\u21C3',\n\tLeftDownVectorBar: '\\u2959',\n\tLeftFloor: '\\u230A',\n\tleftharpoondown: '\\u21BD',\n\tleftharpoonup: '\\u21BC',\n\tleftleftarrows: '\\u21C7',\n\tLeftRightArrow: '\\u2194',\n\tLeftrightarrow: '\\u21D4',\n\tleftrightarrow: '\\u2194',\n\tleftrightarrows: '\\u21C6',\n\tleftrightharpoons: '\\u21CB',\n\tleftrightsquigarrow: '\\u21AD',\n\tLeftRightVector: '\\u294E',\n\tLeftTee: '\\u22A3',\n\tLeftTeeArrow: '\\u21A4',\n\tLeftTeeVector: '\\u295A',\n\tleftthreetimes: '\\u22CB',\n\tLeftTriangle: '\\u22B2',\n\tLeftTriangleBar: '\\u29CF',\n\tLeftTriangleEqual: '\\u22B4',\n\tLeftUpDownVector: '\\u2951',\n\tLeftUpTeeVector: '\\u2960',\n\tLeftUpVector: '\\u21BF',\n\tLeftUpVectorBar: '\\u2958',\n\tLeftVector: '\\u21BC',\n\tLeftVectorBar: '\\u2952',\n\tlEg: '\\u2A8B',\n\tleg: '\\u22DA',\n\tleq: '\\u2264',\n\tleqq: '\\u2266',\n\tleqslant: '\\u2A7D',\n\tles: '\\u2A7D',\n\tlescc: '\\u2AA8',\n\tlesdot: '\\u2A7F',\n\tlesdoto: '\\u2A81',\n\tlesdotor: '\\u2A83',\n\tlesg: '\\u22DA\\uFE00',\n\tlesges: '\\u2A93',\n\tlessapprox: '\\u2A85',\n\tlessdot: '\\u22D6',\n\tlesseqgtr: '\\u22DA',\n\tlesseqqgtr: '\\u2A8B',\n\tLessEqualGreater: '\\u22DA',\n\tLessFullEqual: '\\u2266',\n\tLessGreater: '\\u2276',\n\tlessgtr: '\\u2276',\n\tLessLess: '\\u2AA1',\n\tlesssim: '\\u2272',\n\tLessSlantEqual: '\\u2A7D',\n\tLessTilde: '\\u2272',\n\tlfisht: '\\u297C',\n\tlfloor: '\\u230A',\n\tLfr: '\\uD835\\uDD0F',\n\tlfr: '\\uD835\\uDD29',\n\tlg: '\\u2276',\n\tlgE: '\\u2A91',\n\tlHar: '\\u2962',\n\tlhard: '\\u21BD',\n\tlharu: '\\u21BC',\n\tlharul: '\\u296A',\n\tlhblk: '\\u2584',\n\tLJcy: '\\u0409',\n\tljcy: '\\u0459',\n\tLl: '\\u22D8',\n\tll: '\\u226A',\n\tllarr: '\\u21C7',\n\tllcorner: '\\u231E',\n\tLleftarrow: '\\u21DA',\n\tllhard: '\\u296B',\n\tlltri: '\\u25FA',\n\tLmidot: '\\u013F',\n\tlmidot: '\\u0140',\n\tlmoust: '\\u23B0',\n\tlmoustache: '\\u23B0',\n\tlnap: '\\u2A89',\n\tlnapprox: '\\u2A89',\n\tlnE: '\\u2268',\n\tlne: '\\u2A87',\n\tlneq: '\\u2A87',\n\tlneqq: '\\u2268',\n\tlnsim: '\\u22E6',\n\tloang: '\\u27EC',\n\tloarr: '\\u21FD',\n\tlobrk: '\\u27E6',\n\tLongLeftArrow: '\\u27F5',\n\tLongleftarrow: '\\u27F8',\n\tlongleftarrow: '\\u27F5',\n\tLongLeftRightArrow: '\\u27F7',\n\tLongleftrightarrow: '\\u27FA',\n\tlongleftrightarrow: '\\u27F7',\n\tlongmapsto: '\\u27FC',\n\tLongRightArrow: '\\u27F6',\n\tLongrightarrow: '\\u27F9',\n\tlongrightarrow: '\\u27F6',\n\tlooparrowleft: '\\u21AB',\n\tlooparrowright: '\\u21AC',\n\tlopar: '\\u2985',\n\tLopf: '\\uD835\\uDD43',\n\tlopf: '\\uD835\\uDD5D',\n\tloplus: '\\u2A2D',\n\tlotimes: '\\u2A34',\n\tlowast: '\\u2217',\n\tlowbar: '\\u005F',\n\tLowerLeftArrow: '\\u2199',\n\tLowerRightArrow: '\\u2198',\n\tloz: '\\u25CA',\n\tlozenge: '\\u25CA',\n\tlozf: '\\u29EB',\n\tlpar: '\\u0028',\n\tlparlt: '\\u2993',\n\tlrarr: '\\u21C6',\n\tlrcorner: '\\u231F',\n\tlrhar: '\\u21CB',\n\tlrhard: '\\u296D',\n\tlrm: '\\u200E',\n\tlrtri: '\\u22BF',\n\tlsaquo: '\\u2039',\n\tLscr: '\\u2112',\n\tlscr: '\\uD835\\uDCC1',\n\tLsh: '\\u21B0',\n\tlsh: '\\u21B0',\n\tlsim: '\\u2272',\n\tlsime: '\\u2A8D',\n\tlsimg: '\\u2A8F',\n\tlsqb: '\\u005B',\n\tlsquo: '\\u2018',\n\tlsquor: '\\u201A',\n\tLstrok: '\\u0141',\n\tlstrok: '\\u0142',\n\tLt: '\\u226A',\n\tLT: '\\u003C',\n\tlt: '\\u003C',\n\tltcc: '\\u2AA6',\n\tltcir: '\\u2A79',\n\tltdot: '\\u22D6',\n\tlthree: '\\u22CB',\n\tltimes: '\\u22C9',\n\tltlarr: '\\u2976',\n\tltquest: '\\u2A7B',\n\tltri: '\\u25C3',\n\tltrie: '\\u22B4',\n\tltrif: '\\u25C2',\n\tltrPar: '\\u2996',\n\tlurdshar: '\\u294A',\n\tluruhar: '\\u2966',\n\tlvertneqq: '\\u2268\\uFE00',\n\tlvnE: '\\u2268\\uFE00',\n\tmacr: '\\u00AF',\n\tmale: '\\u2642',\n\tmalt: '\\u2720',\n\tmaltese: '\\u2720',\n\tMap: '\\u2905',\n\tmap: '\\u21A6',\n\tmapsto: '\\u21A6',\n\tmapstodown: '\\u21A7',\n\tmapstoleft: '\\u21A4',\n\tmapstoup: '\\u21A5',\n\tmarker: '\\u25AE',\n\tmcomma: '\\u2A29',\n\tMcy: '\\u041C',\n\tmcy: '\\u043C',\n\tmdash: '\\u2014',\n\tmDDot: '\\u223A',\n\tmeasuredangle: '\\u2221',\n\tMediumSpace: '\\u205F',\n\tMellintrf: '\\u2133',\n\tMfr: '\\uD835\\uDD10',\n\tmfr: '\\uD835\\uDD2A',\n\tmho: '\\u2127',\n\tmicro: '\\u00B5',\n\tmid: '\\u2223',\n\tmidast: '\\u002A',\n\tmidcir: '\\u2AF0',\n\tmiddot: '\\u00B7',\n\tminus: '\\u2212',\n\tminusb: '\\u229F',\n\tminusd: '\\u2238',\n\tminusdu: '\\u2A2A',\n\tMinusPlus: '\\u2213',\n\tmlcp: '\\u2ADB',\n\tmldr: '\\u2026',\n\tmnplus: '\\u2213',\n\tmodels: '\\u22A7',\n\tMopf: '\\uD835\\uDD44',\n\tmopf: '\\uD835\\uDD5E',\n\tmp: '\\u2213',\n\tMscr: '\\u2133',\n\tmscr: '\\uD835\\uDCC2',\n\tmstpos: '\\u223E',\n\tMu: '\\u039C',\n\tmu: '\\u03BC',\n\tmultimap: '\\u22B8',\n\tmumap: '\\u22B8',\n\tnabla: '\\u2207',\n\tNacute: '\\u0143',\n\tnacute: '\\u0144',\n\tnang: '\\u2220\\u20D2',\n\tnap: '\\u2249',\n\tnapE: '\\u2A70\\u0338',\n\tnapid: '\\u224B\\u0338',\n\tnapos: '\\u0149',\n\tnapprox: '\\u2249',\n\tnatur: '\\u266E',\n\tnatural: '\\u266E',\n\tnaturals: '\\u2115',\n\tnbsp: '\\u00A0',\n\tnbump: '\\u224E\\u0338',\n\tnbumpe: '\\u224F\\u0338',\n\tncap: '\\u2A43',\n\tNcaron: '\\u0147',\n\tncaron: '\\u0148',\n\tNcedil: '\\u0145',\n\tncedil: '\\u0146',\n\tncong: '\\u2247',\n\tncongdot: '\\u2A6D\\u0338',\n\tncup: '\\u2A42',\n\tNcy: '\\u041D',\n\tncy: '\\u043D',\n\tndash: '\\u2013',\n\tne: '\\u2260',\n\tnearhk: '\\u2924',\n\tneArr: '\\u21D7',\n\tnearr: '\\u2197',\n\tnearrow: '\\u2197',\n\tnedot: '\\u2250\\u0338',\n\tNegativeMediumSpace: '\\u200B',\n\tNegativeThickSpace: '\\u200B',\n\tNegativeThinSpace: '\\u200B',\n\tNegativeVeryThinSpace: '\\u200B',\n\tnequiv: '\\u2262',\n\tnesear: '\\u2928',\n\tnesim: '\\u2242\\u0338',\n\tNestedGreaterGreater: '\\u226B',\n\tNestedLessLess: '\\u226A',\n\tNewLine: '\\u000A',\n\tnexist: '\\u2204',\n\tnexists: '\\u2204',\n\tNfr: '\\uD835\\uDD11',\n\tnfr: '\\uD835\\uDD2B',\n\tngE: '\\u2267\\u0338',\n\tnge: '\\u2271',\n\tngeq: '\\u2271',\n\tngeqq: '\\u2267\\u0338',\n\tngeqslant: '\\u2A7E\\u0338',\n\tnges: '\\u2A7E\\u0338',\n\tnGg: '\\u22D9\\u0338',\n\tngsim: '\\u2275',\n\tnGt: '\\u226B\\u20D2',\n\tngt: '\\u226F',\n\tngtr: '\\u226F',\n\tnGtv: '\\u226B\\u0338',\n\tnhArr: '\\u21CE',\n\tnharr: '\\u21AE',\n\tnhpar: '\\u2AF2',\n\tni: '\\u220B',\n\tnis: '\\u22FC',\n\tnisd: '\\u22FA',\n\tniv: '\\u220B',\n\tNJcy: '\\u040A',\n\tnjcy: '\\u045A',\n\tnlArr: '\\u21CD',\n\tnlarr: '\\u219A',\n\tnldr: '\\u2025',\n\tnlE: '\\u2266\\u0338',\n\tnle: '\\u2270',\n\tnLeftarrow: '\\u21CD',\n\tnleftarrow: '\\u219A',\n\tnLeftrightarrow: '\\u21CE',\n\tnleftrightarrow: '\\u21AE',\n\tnleq: '\\u2270',\n\tnleqq: '\\u2266\\u0338',\n\tnleqslant: '\\u2A7D\\u0338',\n\tnles: '\\u2A7D\\u0338',\n\tnless: '\\u226E',\n\tnLl: '\\u22D8\\u0338',\n\tnlsim: '\\u2274',\n\tnLt: '\\u226A\\u20D2',\n\tnlt: '\\u226E',\n\tnltri: '\\u22EA',\n\tnltrie: '\\u22EC',\n\tnLtv: '\\u226A\\u0338',\n\tnmid: '\\u2224',\n\tNoBreak: '\\u2060',\n\tNonBreakingSpace: '\\u00A0',\n\tNopf: '\\u2115',\n\tnopf: '\\uD835\\uDD5F',\n\tNot: '\\u2AEC',\n\tnot: '\\u00AC',\n\tNotCongruent: '\\u2262',\n\tNotCupCap: '\\u226D',\n\tNotDoubleVerticalBar: '\\u2226',\n\tNotElement: '\\u2209',\n\tNotEqual: '\\u2260',\n\tNotEqualTilde: '\\u2242\\u0338',\n\tNotExists: '\\u2204',\n\tNotGreater: '\\u226F',\n\tNotGreaterEqual: '\\u2271',\n\tNotGreaterFullEqual: '\\u2267\\u0338',\n\tNotGreaterGreater: '\\u226B\\u0338',\n\tNotGreaterLess: '\\u2279',\n\tNotGreaterSlantEqual: '\\u2A7E\\u0338',\n\tNotGreaterTilde: '\\u2275',\n\tNotHumpDownHump: '\\u224E\\u0338',\n\tNotHumpEqual: '\\u224F\\u0338',\n\tnotin: '\\u2209',\n\tnotindot: '\\u22F5\\u0338',\n\tnotinE: '\\u22F9\\u0338',\n\tnotinva: '\\u2209',\n\tnotinvb: '\\u22F7',\n\tnotinvc: '\\u22F6',\n\tNotLeftTriangle: '\\u22EA',\n\tNotLeftTriangleBar: '\\u29CF\\u0338',\n\tNotLeftTriangleEqual: '\\u22EC',\n\tNotLess: '\\u226E',\n\tNotLessEqual: '\\u2270',\n\tNotLessGreater: '\\u2278',\n\tNotLessLess: '\\u226A\\u0338',\n\tNotLessSlantEqual: '\\u2A7D\\u0338',\n\tNotLessTilde: '\\u2274',\n\tNotNestedGreaterGreater: '\\u2AA2\\u0338',\n\tNotNestedLessLess: '\\u2AA1\\u0338',\n\tnotni: '\\u220C',\n\tnotniva: '\\u220C',\n\tnotnivb: '\\u22FE',\n\tnotnivc: '\\u22FD',\n\tNotPrecedes: '\\u2280',\n\tNotPrecedesEqual: '\\u2AAF\\u0338',\n\tNotPrecedesSlantEqual: '\\u22E0',\n\tNotReverseElement: '\\u220C',\n\tNotRightTriangle: '\\u22EB',\n\tNotRightTriangleBar: '\\u29D0\\u0338',\n\tNotRightTriangleEqual: '\\u22ED',\n\tNotSquareSubset: '\\u228F\\u0338',\n\tNotSquareSubsetEqual: '\\u22E2',\n\tNotSquareSuperset: '\\u2290\\u0338',\n\tNotSquareSupersetEqual: '\\u22E3',\n\tNotSubset: '\\u2282\\u20D2',\n\tNotSubsetEqual: '\\u2288',\n\tNotSucceeds: '\\u2281',\n\tNotSucceedsEqual: '\\u2AB0\\u0338',\n\tNotSucceedsSlantEqual: '\\u22E1',\n\tNotSucceedsTilde: '\\u227F\\u0338',\n\tNotSuperset: '\\u2283\\u20D2',\n\tNotSupersetEqual: '\\u2289',\n\tNotTilde: '\\u2241',\n\tNotTildeEqual: '\\u2244',\n\tNotTildeFullEqual: '\\u2247',\n\tNotTildeTilde: '\\u2249',\n\tNotVerticalBar: '\\u2224',\n\tnpar: '\\u2226',\n\tnparallel: '\\u2226',\n\tnparsl: '\\u2AFD\\u20E5',\n\tnpart: '\\u2202\\u0338',\n\tnpolint: '\\u2A14',\n\tnpr: '\\u2280',\n\tnprcue: '\\u22E0',\n\tnpre: '\\u2AAF\\u0338',\n\tnprec: '\\u2280',\n\tnpreceq: '\\u2AAF\\u0338',\n\tnrArr: '\\u21CF',\n\tnrarr: '\\u219B',\n\tnrarrc: '\\u2933\\u0338',\n\tnrarrw: '\\u219D\\u0338',\n\tnRightarrow: '\\u21CF',\n\tnrightarrow: '\\u219B',\n\tnrtri: '\\u22EB',\n\tnrtrie: '\\u22ED',\n\tnsc: '\\u2281',\n\tnsccue: '\\u22E1',\n\tnsce: '\\u2AB0\\u0338',\n\tNscr: '\\uD835\\uDCA9',\n\tnscr: '\\uD835\\uDCC3',\n\tnshortmid: '\\u2224',\n\tnshortparallel: '\\u2226',\n\tnsim: '\\u2241',\n\tnsime: '\\u2244',\n\tnsimeq: '\\u2244',\n\tnsmid: '\\u2224',\n\tnspar: '\\u2226',\n\tnsqsube: '\\u22E2',\n\tnsqsupe: '\\u22E3',\n\tnsub: '\\u2284',\n\tnsubE: '\\u2AC5\\u0338',\n\tnsube: '\\u2288',\n\tnsubset: '\\u2282\\u20D2',\n\tnsubseteq: '\\u2288',\n\tnsubseteqq: '\\u2AC5\\u0338',\n\tnsucc: '\\u2281',\n\tnsucceq: '\\u2AB0\\u0338',\n\tnsup: '\\u2285',\n\tnsupE: '\\u2AC6\\u0338',\n\tnsupe: '\\u2289',\n\tnsupset: '\\u2283\\u20D2',\n\tnsupseteq: '\\u2289',\n\tnsupseteqq: '\\u2AC6\\u0338',\n\tntgl: '\\u2279',\n\tNtilde: '\\u00D1',\n\tntilde: '\\u00F1',\n\tntlg: '\\u2278',\n\tntriangleleft: '\\u22EA',\n\tntrianglelefteq: '\\u22EC',\n\tntriangleright: '\\u22EB',\n\tntrianglerighteq: '\\u22ED',\n\tNu: '\\u039D',\n\tnu: '\\u03BD',\n\tnum: '\\u0023',\n\tnumero: '\\u2116',\n\tnumsp: '\\u2007',\n\tnvap: '\\u224D\\u20D2',\n\tnVDash: '\\u22AF',\n\tnVdash: '\\u22AE',\n\tnvDash: '\\u22AD',\n\tnvdash: '\\u22AC',\n\tnvge: '\\u2265\\u20D2',\n\tnvgt: '\\u003E\\u20D2',\n\tnvHarr: '\\u2904',\n\tnvinfin: '\\u29DE',\n\tnvlArr: '\\u2902',\n\tnvle: '\\u2264\\u20D2',\n\tnvlt: '\\u003C\\u20D2',\n\tnvltrie: '\\u22B4\\u20D2',\n\tnvrArr: '\\u2903',\n\tnvrtrie: '\\u22B5\\u20D2',\n\tnvsim: '\\u223C\\u20D2',\n\tnwarhk: '\\u2923',\n\tnwArr: '\\u21D6',\n\tnwarr: '\\u2196',\n\tnwarrow: '\\u2196',\n\tnwnear: '\\u2927',\n\tOacute: '\\u00D3',\n\toacute: '\\u00F3',\n\toast: '\\u229B',\n\tocir: '\\u229A',\n\tOcirc: '\\u00D4',\n\tocirc: '\\u00F4',\n\tOcy: '\\u041E',\n\tocy: '\\u043E',\n\todash: '\\u229D',\n\tOdblac: '\\u0150',\n\todblac: '\\u0151',\n\todiv: '\\u2A38',\n\todot: '\\u2299',\n\todsold: '\\u29BC',\n\tOElig: '\\u0152',\n\toelig: '\\u0153',\n\tofcir: '\\u29BF',\n\tOfr: '\\uD835\\uDD12',\n\tofr: '\\uD835\\uDD2C',\n\togon: '\\u02DB',\n\tOgrave: '\\u00D2',\n\tograve: '\\u00F2',\n\togt: '\\u29C1',\n\tohbar: '\\u29B5',\n\tohm: '\\u03A9',\n\toint: '\\u222E',\n\tolarr: '\\u21BA',\n\tolcir: '\\u29BE',\n\tolcross: '\\u29BB',\n\toline: '\\u203E',\n\tolt: '\\u29C0',\n\tOmacr: '\\u014C',\n\tomacr: '\\u014D',\n\tOmega: '\\u03A9',\n\tomega: '\\u03C9',\n\tOmicron: '\\u039F',\n\tomicron: '\\u03BF',\n\tomid: '\\u29B6',\n\tominus: '\\u2296',\n\tOopf: '\\uD835\\uDD46',\n\toopf: '\\uD835\\uDD60',\n\topar: '\\u29B7',\n\tOpenCurlyDoubleQuote: '\\u201C',\n\tOpenCurlyQuote: '\\u2018',\n\toperp: '\\u29B9',\n\toplus: '\\u2295',\n\tOr: '\\u2A54',\n\tor: '\\u2228',\n\torarr: '\\u21BB',\n\tord: '\\u2A5D',\n\torder: '\\u2134',\n\torderof: '\\u2134',\n\tordf: '\\u00AA',\n\tordm: '\\u00BA',\n\torigof: '\\u22B6',\n\toror: '\\u2A56',\n\torslope: '\\u2A57',\n\torv: '\\u2A5B',\n\toS: '\\u24C8',\n\tOscr: '\\uD835\\uDCAA',\n\toscr: '\\u2134',\n\tOslash: '\\u00D8',\n\toslash: '\\u00F8',\n\tosol: '\\u2298',\n\tOtilde: '\\u00D5',\n\totilde: '\\u00F5',\n\tOtimes: '\\u2A37',\n\totimes: '\\u2297',\n\totimesas: '\\u2A36',\n\tOuml: '\\u00D6',\n\touml: '\\u00F6',\n\tovbar: '\\u233D',\n\tOverBar: '\\u203E',\n\tOverBrace: '\\u23DE',\n\tOverBracket: '\\u23B4',\n\tOverParenthesis: '\\u23DC',\n\tpar: '\\u2225',\n\tpara: '\\u00B6',\n\tparallel: '\\u2225',\n\tparsim: '\\u2AF3',\n\tparsl: '\\u2AFD',\n\tpart: '\\u2202',\n\tPartialD: '\\u2202',\n\tPcy: '\\u041F',\n\tpcy: '\\u043F',\n\tpercnt: '\\u0025',\n\tperiod: '\\u002E',\n\tpermil: '\\u2030',\n\tperp: '\\u22A5',\n\tpertenk: '\\u2031',\n\tPfr: '\\uD835\\uDD13',\n\tpfr: '\\uD835\\uDD2D',\n\tPhi: '\\u03A6',\n\tphi: '\\u03C6',\n\tphiv: '\\u03D5',\n\tphmmat: '\\u2133',\n\tphone: '\\u260E',\n\tPi: '\\u03A0',\n\tpi: '\\u03C0',\n\tpitchfork: '\\u22D4',\n\tpiv: '\\u03D6',\n\tplanck: '\\u210F',\n\tplanckh: '\\u210E',\n\tplankv: '\\u210F',\n\tplus: '\\u002B',\n\tplusacir: '\\u2A23',\n\tplusb: '\\u229E',\n\tpluscir: '\\u2A22',\n\tplusdo: '\\u2214',\n\tplusdu: '\\u2A25',\n\tpluse: '\\u2A72',\n\tPlusMinus: '\\u00B1',\n\tplusmn: '\\u00B1',\n\tplussim: '\\u2A26',\n\tplustwo: '\\u2A27',\n\tpm: '\\u00B1',\n\tPoincareplane: '\\u210C',\n\tpointint: '\\u2A15',\n\tPopf: '\\u2119',\n\tpopf: '\\uD835\\uDD61',\n\tpound: '\\u00A3',\n\tPr: '\\u2ABB',\n\tpr: '\\u227A',\n\tprap: '\\u2AB7',\n\tprcue: '\\u227C',\n\tprE: '\\u2AB3',\n\tpre: '\\u2AAF',\n\tprec: '\\u227A',\n\tprecapprox: '\\u2AB7',\n\tpreccurlyeq: '\\u227C',\n\tPrecedes: '\\u227A',\n\tPrecedesEqual: '\\u2AAF',\n\tPrecedesSlantEqual: '\\u227C',\n\tPrecedesTilde: '\\u227E',\n\tpreceq: '\\u2AAF',\n\tprecnapprox: '\\u2AB9',\n\tprecneqq: '\\u2AB5',\n\tprecnsim: '\\u22E8',\n\tprecsim: '\\u227E',\n\tPrime: '\\u2033',\n\tprime: '\\u2032',\n\tprimes: '\\u2119',\n\tprnap: '\\u2AB9',\n\tprnE: '\\u2AB5',\n\tprnsim: '\\u22E8',\n\tprod: '\\u220F',\n\tProduct: '\\u220F',\n\tprofalar: '\\u232E',\n\tprofline: '\\u2312',\n\tprofsurf: '\\u2313',\n\tprop: '\\u221D',\n\tProportion: '\\u2237',\n\tProportional: '\\u221D',\n\tpropto: '\\u221D',\n\tprsim: '\\u227E',\n\tprurel: '\\u22B0',\n\tPscr: '\\uD835\\uDCAB',\n\tpscr: '\\uD835\\uDCC5',\n\tPsi: '\\u03A8',\n\tpsi: '\\u03C8',\n\tpuncsp: '\\u2008',\n\tQfr: '\\uD835\\uDD14',\n\tqfr: '\\uD835\\uDD2E',\n\tqint: '\\u2A0C',\n\tQopf: '\\u211A',\n\tqopf: '\\uD835\\uDD62',\n\tqprime: '\\u2057',\n\tQscr: '\\uD835\\uDCAC',\n\tqscr: '\\uD835\\uDCC6',\n\tquaternions: '\\u210D',\n\tquatint: '\\u2A16',\n\tquest: '\\u003F',\n\tquesteq: '\\u225F',\n\tQUOT: '\\u0022',\n\tquot: '\\u0022',\n\trAarr: '\\u21DB',\n\trace: '\\u223D\\u0331',\n\tRacute: '\\u0154',\n\tracute: '\\u0155',\n\tradic: '\\u221A',\n\traemptyv: '\\u29B3',\n\tRang: '\\u27EB',\n\trang: '\\u27E9',\n\trangd: '\\u2992',\n\trange: '\\u29A5',\n\trangle: '\\u27E9',\n\traquo: '\\u00BB',\n\tRarr: '\\u21A0',\n\trArr: '\\u21D2',\n\trarr: '\\u2192',\n\trarrap: '\\u2975',\n\trarrb: '\\u21E5',\n\trarrbfs: '\\u2920',\n\trarrc: '\\u2933',\n\trarrfs: '\\u291E',\n\trarrhk: '\\u21AA',\n\trarrlp: '\\u21AC',\n\trarrpl: '\\u2945',\n\trarrsim: '\\u2974',\n\tRarrtl: '\\u2916',\n\trarrtl: '\\u21A3',\n\trarrw: '\\u219D',\n\trAtail: '\\u291C',\n\tratail: '\\u291A',\n\tratio: '\\u2236',\n\trationals: '\\u211A',\n\tRBarr: '\\u2910',\n\trBarr: '\\u290F',\n\trbarr: '\\u290D',\n\trbbrk: '\\u2773',\n\trbrace: '\\u007D',\n\trbrack: '\\u005D',\n\trbrke: '\\u298C',\n\trbrksld: '\\u298E',\n\trbrkslu: '\\u2990',\n\tRcaron: '\\u0158',\n\trcaron: '\\u0159',\n\tRcedil: '\\u0156',\n\trcedil: '\\u0157',\n\trceil: '\\u2309',\n\trcub: '\\u007D',\n\tRcy: '\\u0420',\n\trcy: '\\u0440',\n\trdca: '\\u2937',\n\trdldhar: '\\u2969',\n\trdquo: '\\u201D',\n\trdquor: '\\u201D',\n\trdsh: '\\u21B3',\n\tRe: '\\u211C',\n\treal: '\\u211C',\n\trealine: '\\u211B',\n\trealpart: '\\u211C',\n\treals: '\\u211D',\n\trect: '\\u25AD',\n\tREG: '\\u00AE',\n\treg: '\\u00AE',\n\tReverseElement: '\\u220B',\n\tReverseEquilibrium: '\\u21CB',\n\tReverseUpEquilibrium: '\\u296F',\n\trfisht: '\\u297D',\n\trfloor: '\\u230B',\n\tRfr: '\\u211C',\n\trfr: '\\uD835\\uDD2F',\n\trHar: '\\u2964',\n\trhard: '\\u21C1',\n\trharu: '\\u21C0',\n\trharul: '\\u296C',\n\tRho: '\\u03A1',\n\trho: '\\u03C1',\n\trhov: '\\u03F1',\n\tRightAngleBracket: '\\u27E9',\n\tRightArrow: '\\u2192',\n\tRightarrow: '\\u21D2',\n\trightarrow: '\\u2192',\n\tRightArrowBar: '\\u21E5',\n\tRightArrowLeftArrow: '\\u21C4',\n\trightarrowtail: '\\u21A3',\n\tRightCeiling: '\\u2309',\n\tRightDoubleBracket: '\\u27E7',\n\tRightDownTeeVector: '\\u295D',\n\tRightDownVector: '\\u21C2',\n\tRightDownVectorBar: '\\u2955',\n\tRightFloor: '\\u230B',\n\trightharpoondown: '\\u21C1',\n\trightharpoonup: '\\u21C0',\n\trightleftarrows: '\\u21C4',\n\trightleftharpoons: '\\u21CC',\n\trightrightarrows: '\\u21C9',\n\trightsquigarrow: '\\u219D',\n\tRightTee: '\\u22A2',\n\tRightTeeArrow: '\\u21A6',\n\tRightTeeVector: '\\u295B',\n\trightthreetimes: '\\u22CC',\n\tRightTriangle: '\\u22B3',\n\tRightTriangleBar: '\\u29D0',\n\tRightTriangleEqual: '\\u22B5',\n\tRightUpDownVector: '\\u294F',\n\tRightUpTeeVector: '\\u295C',\n\tRightUpVector: '\\u21BE',\n\tRightUpVectorBar: '\\u2954',\n\tRightVector: '\\u21C0',\n\tRightVectorBar: '\\u2953',\n\tring: '\\u02DA',\n\trisingdotseq: '\\u2253',\n\trlarr: '\\u21C4',\n\trlhar: '\\u21CC',\n\trlm: '\\u200F',\n\trmoust: '\\u23B1',\n\trmoustache: '\\u23B1',\n\trnmid: '\\u2AEE',\n\troang: '\\u27ED',\n\troarr: '\\u21FE',\n\trobrk: '\\u27E7',\n\tropar: '\\u2986',\n\tRopf: '\\u211D',\n\tropf: '\\uD835\\uDD63',\n\troplus: '\\u2A2E',\n\trotimes: '\\u2A35',\n\tRoundImplies: '\\u2970',\n\trpar: '\\u0029',\n\trpargt: '\\u2994',\n\trppolint: '\\u2A12',\n\trrarr: '\\u21C9',\n\tRrightarrow: '\\u21DB',\n\trsaquo: '\\u203A',\n\tRscr: '\\u211B',\n\trscr: '\\uD835\\uDCC7',\n\tRsh: '\\u21B1',\n\trsh: '\\u21B1',\n\trsqb: '\\u005D',\n\trsquo: '\\u2019',\n\trsquor: '\\u2019',\n\trthree: '\\u22CC',\n\trtimes: '\\u22CA',\n\trtri: '\\u25B9',\n\trtrie: '\\u22B5',\n\trtrif: '\\u25B8',\n\trtriltri: '\\u29CE',\n\tRuleDelayed: '\\u29F4',\n\truluhar: '\\u2968',\n\trx: '\\u211E',\n\tSacute: '\\u015A',\n\tsacute: '\\u015B',\n\tsbquo: '\\u201A',\n\tSc: '\\u2ABC',\n\tsc: '\\u227B',\n\tscap: '\\u2AB8',\n\tScaron: '\\u0160',\n\tscaron: '\\u0161',\n\tsccue: '\\u227D',\n\tscE: '\\u2AB4',\n\tsce: '\\u2AB0',\n\tScedil: '\\u015E',\n\tscedil: '\\u015F',\n\tScirc: '\\u015C',\n\tscirc: '\\u015D',\n\tscnap: '\\u2ABA',\n\tscnE: '\\u2AB6',\n\tscnsim: '\\u22E9',\n\tscpolint: '\\u2A13',\n\tscsim: '\\u227F',\n\tScy: '\\u0421',\n\tscy: '\\u0441',\n\tsdot: '\\u22C5',\n\tsdotb: '\\u22A1',\n\tsdote: '\\u2A66',\n\tsearhk: '\\u2925',\n\tseArr: '\\u21D8',\n\tsearr: '\\u2198',\n\tsearrow: '\\u2198',\n\tsect: '\\u00A7',\n\tsemi: '\\u003B',\n\tseswar: '\\u2929',\n\tsetminus: '\\u2216',\n\tsetmn: '\\u2216',\n\tsext: '\\u2736',\n\tSfr: '\\uD835\\uDD16',\n\tsfr: '\\uD835\\uDD30',\n\tsfrown: '\\u2322',\n\tsharp: '\\u266F',\n\tSHCHcy: '\\u0429',\n\tshchcy: '\\u0449',\n\tSHcy: '\\u0428',\n\tshcy: '\\u0448',\n\tShortDownArrow: '\\u2193',\n\tShortLeftArrow: '\\u2190',\n\tshortmid: '\\u2223',\n\tshortparallel: '\\u2225',\n\tShortRightArrow: '\\u2192',\n\tShortUpArrow: '\\u2191',\n\tshy: '\\u00AD',\n\tSigma: '\\u03A3',\n\tsigma: '\\u03C3',\n\tsigmaf: '\\u03C2',\n\tsigmav: '\\u03C2',\n\tsim: '\\u223C',\n\tsimdot: '\\u2A6A',\n\tsime: '\\u2243',\n\tsimeq: '\\u2243',\n\tsimg: '\\u2A9E',\n\tsimgE: '\\u2AA0',\n\tsiml: '\\u2A9D',\n\tsimlE: '\\u2A9F',\n\tsimne: '\\u2246',\n\tsimplus: '\\u2A24',\n\tsimrarr: '\\u2972',\n\tslarr: '\\u2190',\n\tSmallCircle: '\\u2218',\n\tsmallsetminus: '\\u2216',\n\tsmashp: '\\u2A33',\n\tsmeparsl: '\\u29E4',\n\tsmid: '\\u2223',\n\tsmile: '\\u2323',\n\tsmt: '\\u2AAA',\n\tsmte: '\\u2AAC',\n\tsmtes: '\\u2AAC\\uFE00',\n\tSOFTcy: '\\u042C',\n\tsoftcy: '\\u044C',\n\tsol: '\\u002F',\n\tsolb: '\\u29C4',\n\tsolbar: '\\u233F',\n\tSopf: '\\uD835\\uDD4A',\n\tsopf: '\\uD835\\uDD64',\n\tspades: '\\u2660',\n\tspadesuit: '\\u2660',\n\tspar: '\\u2225',\n\tsqcap: '\\u2293',\n\tsqcaps: '\\u2293\\uFE00',\n\tsqcup: '\\u2294',\n\tsqcups: '\\u2294\\uFE00',\n\tSqrt: '\\u221A',\n\tsqsub: '\\u228F',\n\tsqsube: '\\u2291',\n\tsqsubset: '\\u228F',\n\tsqsubseteq: '\\u2291',\n\tsqsup: '\\u2290',\n\tsqsupe: '\\u2292',\n\tsqsupset: '\\u2290',\n\tsqsupseteq: '\\u2292',\n\tsqu: '\\u25A1',\n\tSquare: '\\u25A1',\n\tsquare: '\\u25A1',\n\tSquareIntersection: '\\u2293',\n\tSquareSubset: '\\u228F',\n\tSquareSubsetEqual: '\\u2291',\n\tSquareSuperset: '\\u2290',\n\tSquareSupersetEqual: '\\u2292',\n\tSquareUnion: '\\u2294',\n\tsquarf: '\\u25AA',\n\tsquf: '\\u25AA',\n\tsrarr: '\\u2192',\n\tSscr: '\\uD835\\uDCAE',\n\tsscr: '\\uD835\\uDCC8',\n\tssetmn: '\\u2216',\n\tssmile: '\\u2323',\n\tsstarf: '\\u22C6',\n\tStar: '\\u22C6',\n\tstar: '\\u2606',\n\tstarf: '\\u2605',\n\tstraightepsilon: '\\u03F5',\n\tstraightphi: '\\u03D5',\n\tstrns: '\\u00AF',\n\tSub: '\\u22D0',\n\tsub: '\\u2282',\n\tsubdot: '\\u2ABD',\n\tsubE: '\\u2AC5',\n\tsube: '\\u2286',\n\tsubedot: '\\u2AC3',\n\tsubmult: '\\u2AC1',\n\tsubnE: '\\u2ACB',\n\tsubne: '\\u228A',\n\tsubplus: '\\u2ABF',\n\tsubrarr: '\\u2979',\n\tSubset: '\\u22D0',\n\tsubset: '\\u2282',\n\tsubseteq: '\\u2286',\n\tsubseteqq: '\\u2AC5',\n\tSubsetEqual: '\\u2286',\n\tsubsetneq: '\\u228A',\n\tsubsetneqq: '\\u2ACB',\n\tsubsim: '\\u2AC7',\n\tsubsub: '\\u2AD5',\n\tsubsup: '\\u2AD3',\n\tsucc: '\\u227B',\n\tsuccapprox: '\\u2AB8',\n\tsucccurlyeq: '\\u227D',\n\tSucceeds: '\\u227B',\n\tSucceedsEqual: '\\u2AB0',\n\tSucceedsSlantEqual: '\\u227D',\n\tSucceedsTilde: '\\u227F',\n\tsucceq: '\\u2AB0',\n\tsuccnapprox: '\\u2ABA',\n\tsuccneqq: '\\u2AB6',\n\tsuccnsim: '\\u22E9',\n\tsuccsim: '\\u227F',\n\tSuchThat: '\\u220B',\n\tSum: '\\u2211',\n\tsum: '\\u2211',\n\tsung: '\\u266A',\n\tSup: '\\u22D1',\n\tsup: '\\u2283',\n\tsup1: '\\u00B9',\n\tsup2: '\\u00B2',\n\tsup3: '\\u00B3',\n\tsupdot: '\\u2ABE',\n\tsupdsub: '\\u2AD8',\n\tsupE: '\\u2AC6',\n\tsupe: '\\u2287',\n\tsupedot: '\\u2AC4',\n\tSuperset: '\\u2283',\n\tSupersetEqual: '\\u2287',\n\tsuphsol: '\\u27C9',\n\tsuphsub: '\\u2AD7',\n\tsuplarr: '\\u297B',\n\tsupmult: '\\u2AC2',\n\tsupnE: '\\u2ACC',\n\tsupne: '\\u228B',\n\tsupplus: '\\u2AC0',\n\tSupset: '\\u22D1',\n\tsupset: '\\u2283',\n\tsupseteq: '\\u2287',\n\tsupseteqq: '\\u2AC6',\n\tsupsetneq: '\\u228B',\n\tsupsetneqq: '\\u2ACC',\n\tsupsim: '\\u2AC8',\n\tsupsub: '\\u2AD4',\n\tsupsup: '\\u2AD6',\n\tswarhk: '\\u2926',\n\tswArr: '\\u21D9',\n\tswarr: '\\u2199',\n\tswarrow: '\\u2199',\n\tswnwar: '\\u292A',\n\tszlig: '\\u00DF',\n\tTab: '\\u0009',\n\ttarget: '\\u2316',\n\tTau: '\\u03A4',\n\ttau: '\\u03C4',\n\ttbrk: '\\u23B4',\n\tTcaron: '\\u0164',\n\ttcaron: '\\u0165',\n\tTcedil: '\\u0162',\n\ttcedil: '\\u0163',\n\tTcy: '\\u0422',\n\ttcy: '\\u0442',\n\ttdot: '\\u20DB',\n\ttelrec: '\\u2315',\n\tTfr: '\\uD835\\uDD17',\n\ttfr: '\\uD835\\uDD31',\n\tthere4: '\\u2234',\n\tTherefore: '\\u2234',\n\ttherefore: '\\u2234',\n\tTheta: '\\u0398',\n\ttheta: '\\u03B8',\n\tthetasym: '\\u03D1',\n\tthetav: '\\u03D1',\n\tthickapprox: '\\u2248',\n\tthicksim: '\\u223C',\n\tThickSpace: '\\u205F\\u200A',\n\tthinsp: '\\u2009',\n\tThinSpace: '\\u2009',\n\tthkap: '\\u2248',\n\tthksim: '\\u223C',\n\tTHORN: '\\u00DE',\n\tthorn: '\\u00FE',\n\tTilde: '\\u223C',\n\ttilde: '\\u02DC',\n\tTildeEqual: '\\u2243',\n\tTildeFullEqual: '\\u2245',\n\tTildeTilde: '\\u2248',\n\ttimes: '\\u00D7',\n\ttimesb: '\\u22A0',\n\ttimesbar: '\\u2A31',\n\ttimesd: '\\u2A30',\n\ttint: '\\u222D',\n\ttoea: '\\u2928',\n\ttop: '\\u22A4',\n\ttopbot: '\\u2336',\n\ttopcir: '\\u2AF1',\n\tTopf: '\\uD835\\uDD4B',\n\ttopf: '\\uD835\\uDD65',\n\ttopfork: '\\u2ADA',\n\ttosa: '\\u2929',\n\ttprime: '\\u2034',\n\tTRADE: '\\u2122',\n\ttrade: '\\u2122',\n\ttriangle: '\\u25B5',\n\ttriangledown: '\\u25BF',\n\ttriangleleft: '\\u25C3',\n\ttrianglelefteq: '\\u22B4',\n\ttriangleq: '\\u225C',\n\ttriangleright: '\\u25B9',\n\ttrianglerighteq: '\\u22B5',\n\ttridot: '\\u25EC',\n\ttrie: '\\u225C',\n\ttriminus: '\\u2A3A',\n\tTripleDot: '\\u20DB',\n\ttriplus: '\\u2A39',\n\ttrisb: '\\u29CD',\n\ttritime: '\\u2A3B',\n\ttrpezium: '\\u23E2',\n\tTscr: '\\uD835\\uDCAF',\n\ttscr: '\\uD835\\uDCC9',\n\tTScy: '\\u0426',\n\ttscy: '\\u0446',\n\tTSHcy: '\\u040B',\n\ttshcy: '\\u045B',\n\tTstrok: '\\u0166',\n\ttstrok: '\\u0167',\n\ttwixt: '\\u226C',\n\ttwoheadleftarrow: '\\u219E',\n\ttwoheadrightarrow: '\\u21A0',\n\tUacute: '\\u00DA',\n\tuacute: '\\u00FA',\n\tUarr: '\\u219F',\n\tuArr: '\\u21D1',\n\tuarr: '\\u2191',\n\tUarrocir: '\\u2949',\n\tUbrcy: '\\u040E',\n\tubrcy: '\\u045E',\n\tUbreve: '\\u016C',\n\tubreve: '\\u016D',\n\tUcirc: '\\u00DB',\n\tucirc: '\\u00FB',\n\tUcy: '\\u0423',\n\tucy: '\\u0443',\n\tudarr: '\\u21C5',\n\tUdblac: '\\u0170',\n\tudblac: '\\u0171',\n\tudhar: '\\u296E',\n\tufisht: '\\u297E',\n\tUfr: '\\uD835\\uDD18',\n\tufr: '\\uD835\\uDD32',\n\tUgrave: '\\u00D9',\n\tugrave: '\\u00F9',\n\tuHar: '\\u2963',\n\tuharl: '\\u21BF',\n\tuharr: '\\u21BE',\n\tuhblk: '\\u2580',\n\tulcorn: '\\u231C',\n\tulcorner: '\\u231C',\n\tulcrop: '\\u230F',\n\tultri: '\\u25F8',\n\tUmacr: '\\u016A',\n\tumacr: '\\u016B',\n\tuml: '\\u00A8',\n\tUnderBar: '\\u005F',\n\tUnderBrace: '\\u23DF',\n\tUnderBracket: '\\u23B5',\n\tUnderParenthesis: '\\u23DD',\n\tUnion: '\\u22C3',\n\tUnionPlus: '\\u228E',\n\tUogon: '\\u0172',\n\tuogon: '\\u0173',\n\tUopf: '\\uD835\\uDD4C',\n\tuopf: '\\uD835\\uDD66',\n\tUpArrow: '\\u2191',\n\tUparrow: '\\u21D1',\n\tuparrow: '\\u2191',\n\tUpArrowBar: '\\u2912',\n\tUpArrowDownArrow: '\\u21C5',\n\tUpDownArrow: '\\u2195',\n\tUpdownarrow: '\\u21D5',\n\tupdownarrow: '\\u2195',\n\tUpEquilibrium: '\\u296E',\n\tupharpoonleft: '\\u21BF',\n\tupharpoonright: '\\u21BE',\n\tuplus: '\\u228E',\n\tUpperLeftArrow: '\\u2196',\n\tUpperRightArrow: '\\u2197',\n\tUpsi: '\\u03D2',\n\tupsi: '\\u03C5',\n\tupsih: '\\u03D2',\n\tUpsilon: '\\u03A5',\n\tupsilon: '\\u03C5',\n\tUpTee: '\\u22A5',\n\tUpTeeArrow: '\\u21A5',\n\tupuparrows: '\\u21C8',\n\turcorn: '\\u231D',\n\turcorner: '\\u231D',\n\turcrop: '\\u230E',\n\tUring: '\\u016E',\n\turing: '\\u016F',\n\turtri: '\\u25F9',\n\tUscr: '\\uD835\\uDCB0',\n\tuscr: '\\uD835\\uDCCA',\n\tutdot: '\\u22F0',\n\tUtilde: '\\u0168',\n\tutilde: '\\u0169',\n\tutri: '\\u25B5',\n\tutrif: '\\u25B4',\n\tuuarr: '\\u21C8',\n\tUuml: '\\u00DC',\n\tuuml: '\\u00FC',\n\tuwangle: '\\u29A7',\n\tvangrt: '\\u299C',\n\tvarepsilon: '\\u03F5',\n\tvarkappa: '\\u03F0',\n\tvarnothing: '\\u2205',\n\tvarphi: '\\u03D5',\n\tvarpi: '\\u03D6',\n\tvarpropto: '\\u221D',\n\tvArr: '\\u21D5',\n\tvarr: '\\u2195',\n\tvarrho: '\\u03F1',\n\tvarsigma: '\\u03C2',\n\tvarsubsetneq: '\\u228A\\uFE00',\n\tvarsubsetneqq: '\\u2ACB\\uFE00',\n\tvarsupsetneq: '\\u228B\\uFE00',\n\tvarsupsetneqq: '\\u2ACC\\uFE00',\n\tvartheta: '\\u03D1',\n\tvartriangleleft: '\\u22B2',\n\tvartriangleright: '\\u22B3',\n\tVbar: '\\u2AEB',\n\tvBar: '\\u2AE8',\n\tvBarv: '\\u2AE9',\n\tVcy: '\\u0412',\n\tvcy: '\\u0432',\n\tVDash: '\\u22AB',\n\tVdash: '\\u22A9',\n\tvDash: '\\u22A8',\n\tvdash: '\\u22A2',\n\tVdashl: '\\u2AE6',\n\tVee: '\\u22C1',\n\tvee: '\\u2228',\n\tveebar: '\\u22BB',\n\tveeeq: '\\u225A',\n\tvellip: '\\u22EE',\n\tVerbar: '\\u2016',\n\tverbar: '\\u007C',\n\tVert: '\\u2016',\n\tvert: '\\u007C',\n\tVerticalBar: '\\u2223',\n\tVerticalLine: '\\u007C',\n\tVerticalSeparator: '\\u2758',\n\tVerticalTilde: '\\u2240',\n\tVeryThinSpace: '\\u200A',\n\tVfr: '\\uD835\\uDD19',\n\tvfr: '\\uD835\\uDD33',\n\tvltri: '\\u22B2',\n\tvnsub: '\\u2282\\u20D2',\n\tvnsup: '\\u2283\\u20D2',\n\tVopf: '\\uD835\\uDD4D',\n\tvopf: '\\uD835\\uDD67',\n\tvprop: '\\u221D',\n\tvrtri: '\\u22B3',\n\tVscr: '\\uD835\\uDCB1',\n\tvscr: '\\uD835\\uDCCB',\n\tvsubnE: '\\u2ACB\\uFE00',\n\tvsubne: '\\u228A\\uFE00',\n\tvsupnE: '\\u2ACC\\uFE00',\n\tvsupne: '\\u228B\\uFE00',\n\tVvdash: '\\u22AA',\n\tvzigzag: '\\u299A',\n\tWcirc: '\\u0174',\n\twcirc: '\\u0175',\n\twedbar: '\\u2A5F',\n\tWedge: '\\u22C0',\n\twedge: '\\u2227',\n\twedgeq: '\\u2259',\n\tweierp: '\\u2118',\n\tWfr: '\\uD835\\uDD1A',\n\twfr: '\\uD835\\uDD34',\n\tWopf: '\\uD835\\uDD4E',\n\twopf: '\\uD835\\uDD68',\n\twp: '\\u2118',\n\twr: '\\u2240',\n\twreath: '\\u2240',\n\tWscr: '\\uD835\\uDCB2',\n\twscr: '\\uD835\\uDCCC',\n\txcap: '\\u22C2',\n\txcirc: '\\u25EF',\n\txcup: '\\u22C3',\n\txdtri: '\\u25BD',\n\tXfr: '\\uD835\\uDD1B',\n\txfr: '\\uD835\\uDD35',\n\txhArr: '\\u27FA',\n\txharr: '\\u27F7',\n\tXi: '\\u039E',\n\txi: '\\u03BE',\n\txlArr: '\\u27F8',\n\txlarr: '\\u27F5',\n\txmap: '\\u27FC',\n\txnis: '\\u22FB',\n\txodot: '\\u2A00',\n\tXopf: '\\uD835\\uDD4F',\n\txopf: '\\uD835\\uDD69',\n\txoplus: '\\u2A01',\n\txotime: '\\u2A02',\n\txrArr: '\\u27F9',\n\txrarr: '\\u27F6',\n\tXscr: '\\uD835\\uDCB3',\n\txscr: '\\uD835\\uDCCD',\n\txsqcup: '\\u2A06',\n\txuplus: '\\u2A04',\n\txutri: '\\u25B3',\n\txvee: '\\u22C1',\n\txwedge: '\\u22C0',\n\tYacute: '\\u00DD',\n\tyacute: '\\u00FD',\n\tYAcy: '\\u042F',\n\tyacy: '\\u044F',\n\tYcirc: '\\u0176',\n\tycirc: '\\u0177',\n\tYcy: '\\u042B',\n\tycy: '\\u044B',\n\tyen: '\\u00A5',\n\tYfr: '\\uD835\\uDD1C',\n\tyfr: '\\uD835\\uDD36',\n\tYIcy: '\\u0407',\n\tyicy: '\\u0457',\n\tYopf: '\\uD835\\uDD50',\n\tyopf: '\\uD835\\uDD6A',\n\tYscr: '\\uD835\\uDCB4',\n\tyscr: '\\uD835\\uDCCE',\n\tYUcy: '\\u042E',\n\tyucy: '\\u044E',\n\tYuml: '\\u0178',\n\tyuml: '\\u00FF',\n\tZacute: '\\u0179',\n\tzacute: '\\u017A',\n\tZcaron: '\\u017D',\n\tzcaron: '\\u017E',\n\tZcy: '\\u0417',\n\tzcy: '\\u0437',\n\tZdot: '\\u017B',\n\tzdot: '\\u017C',\n\tzeetrf: '\\u2128',\n\tZeroWidthSpace: '\\u200B',\n\tZeta: '\\u0396',\n\tzeta: '\\u03B6',\n\tZfr: '\\u2128',\n\tzfr: '\\uD835\\uDD37',\n\tZHcy: '\\u0416',\n\tzhcy: '\\u0436',\n\tzigrarr: '\\u21DD',\n\tZopf: '\\u2124',\n\tzopf: '\\uD835\\uDD6B',\n\tZscr: '\\uD835\\uDCB5',\n\tzscr: '\\uD835\\uDCCF',\n\tzwj: '\\u200D',\n\tzwnj: '\\u200C',\n});\n\n/**\n * @deprecated use `HTML_ENTITIES` instead\n * @see HTML_ENTITIES\n */\nexports.entityMap = exports.HTML_ENTITIES;\n","var NAMESPACE = require(\"./conventions\").NAMESPACE;\n\n//[4] \tNameStartChar\t ::= \t\":\" | [A-Z] | \"_\" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]\n//[4a] \tNameChar\t ::= \tNameStartChar | \"-\" | \".\" | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]\n//[5] \tName\t ::= \tNameStartChar (NameChar)*\nvar nameStartChar = /[A-Z_a-z\\xC0-\\xD6\\xD8-\\xF6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]///\\u10000-\\uEFFFF\nvar nameChar = new RegExp(\"[\\\\-\\\\.0-9\"+nameStartChar.source.slice(1,-1)+\"\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040]\");\nvar tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\\:'+nameStartChar.source+nameChar.source+'*)?$');\n//var tagNamePattern = /^[a-zA-Z_][\\w\\-\\.]*(?:\\:[a-zA-Z_][\\w\\-\\.]*)?$/\n//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')\n\n//S_TAG,\tS_ATTR,\tS_EQ,\tS_ATTR_NOQUOT_VALUE\n//S_ATTR_SPACE,\tS_ATTR_END,\tS_TAG_SPACE, S_TAG_CLOSE\nvar S_TAG = 0;//tag name offerring\nvar S_ATTR = 1;//attr name offerring\nvar S_ATTR_SPACE=2;//attr name end and space offer\nvar S_EQ = 3;//=space?\nvar S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)\nvar S_ATTR_END = 5;//attr value end and no space(quot end)\nvar S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)\nvar S_TAG_CLOSE = 7;//closed el\n\n/**\n * Creates an error that will not be caught by XMLReader aka the SAX parser.\n *\n * @param {string} message\n * @param {any?} locator Optional, can provide details about the location in the source\n * @constructor\n */\nfunction ParseError(message, locator) {\n\tthis.message = message\n\tthis.locator = locator\n\tif(Error.captureStackTrace) Error.captureStackTrace(this, ParseError);\n}\nParseError.prototype = new Error();\nParseError.prototype.name = ParseError.name\n\nfunction XMLReader(){\n\n}\n\nXMLReader.prototype = {\n\tparse:function(source,defaultNSMap,entityMap){\n\t\tvar domBuilder = this.domBuilder;\n\t\tdomBuilder.startDocument();\n\t\t_copy(defaultNSMap ,defaultNSMap = {})\n\t\tparse(source,defaultNSMap,entityMap,\n\t\t\t\tdomBuilder,this.errorHandler);\n\t\tdomBuilder.endDocument();\n\t}\n}\nfunction parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){\n\tfunction fixedFromCharCode(code) {\n\t\t// String.prototype.fromCharCode does not supports\n\t\t// > 2 bytes unicode chars directly\n\t\tif (code > 0xffff) {\n\t\t\tcode -= 0x10000;\n\t\t\tvar surrogate1 = 0xd800 + (code >> 10)\n\t\t\t\t, surrogate2 = 0xdc00 + (code & 0x3ff);\n\n\t\t\treturn String.fromCharCode(surrogate1, surrogate2);\n\t\t} else {\n\t\t\treturn String.fromCharCode(code);\n\t\t}\n\t}\n\tfunction entityReplacer(a){\n\t\tvar k = a.slice(1,-1);\n\t\tif (Object.hasOwnProperty.call(entityMap, k)) {\n\t\t\treturn entityMap[k];\n\t\t}else if(k.charAt(0) === '#'){\n\t\t\treturn fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))\n\t\t}else{\n\t\t\terrorHandler.error('entity not found:'+a);\n\t\t\treturn a;\n\t\t}\n\t}\n\tfunction appendText(end){//has some bugs\n\t\tif(end>start){\n\t\t\tvar xt = source.substring(start,end).replace(/&#?\\w+;/g,entityReplacer);\n\t\t\tlocator&&position(start);\n\t\t\tdomBuilder.characters(xt,0,end-start);\n\t\t\tstart = end\n\t\t}\n\t}\n\tfunction position(p,m){\n\t\twhile(p>=lineEnd && (m = linePattern.exec(source))){\n\t\t\tlineStart = m.index;\n\t\t\tlineEnd = lineStart + m[0].length;\n\t\t\tlocator.lineNumber++;\n\t\t\t//console.log('line++:',locator,startPos,endPos)\n\t\t}\n\t\tlocator.columnNumber = p-lineStart+1;\n\t}\n\tvar lineStart = 0;\n\tvar lineEnd = 0;\n\tvar linePattern = /.*(?:\\r\\n?|\\n)|.*$/g\n\tvar locator = domBuilder.locator;\n\n\tvar parseStack = [{currentNSMap:defaultNSMapCopy}]\n\tvar closeMap = {};\n\tvar start = 0;\n\twhile(true){\n\t\ttry{\n\t\t\tvar tagStart = source.indexOf('<',start);\n\t\t\tif(tagStart<0){\n\t\t\t\tif(!source.substr(start).match(/^\\s*$/)){\n\t\t\t\t\tvar doc = domBuilder.doc;\n\t \t\t\tvar text = doc.createTextNode(source.substr(start));\n\t \t\t\tdoc.appendChild(text);\n\t \t\t\tdomBuilder.currentElement = text;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(tagStart>start){\n\t\t\t\tappendText(tagStart);\n\t\t\t}\n\t\t\tswitch(source.charAt(tagStart+1)){\n\t\t\tcase '/':\n\t\t\t\tvar end = source.indexOf('>',tagStart+3);\n\t\t\t\tvar tagName = source.substring(tagStart + 2, end).replace(/[ \\t\\n\\r]+$/g, '');\n\t\t\t\tvar config = parseStack.pop();\n\t\t\t\tif(end<0){\n\n\t \t\ttagName = source.substring(tagStart+2).replace(/[\\s<].*/,'');\n\t \t\terrorHandler.error(\"end tag name: \"+tagName+' is not complete:'+config.tagName);\n\t \t\tend = tagStart+1+tagName.length;\n\t \t}else if(tagName.match(/\\s\n\t\t\t\tlocator&&position(tagStart);\n\t\t\t\tend = parseInstruction(source,tagStart,domBuilder);\n\t\t\t\tbreak;\n\t\t\tcase '!':// start){\n\t\t\tstart = end;\n\t\t}else{\n\t\t\t//TODO: 这里有可能sax回退,有位置错误风险\n\t\t\tappendText(Math.max(tagStart,start)+1);\n\t\t}\n\t}\n}\nfunction copyLocator(f,t){\n\tt.lineNumber = f.lineNumber;\n\tt.columnNumber = f.columnNumber;\n\treturn t;\n}\n\n/**\n * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);\n * @return end of the elementStartPart(end of elementEndPart for selfClosed el)\n */\nfunction parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){\n\n\t/**\n\t * @param {string} qname\n\t * @param {string} value\n\t * @param {number} startIndex\n\t */\n\tfunction addAttribute(qname, value, startIndex) {\n\t\tif (el.attributeNames.hasOwnProperty(qname)) {\n\t\t\terrorHandler.fatalError('Attribute ' + qname + ' redefined')\n\t\t}\n\t\tel.addValue(\n\t\t\tqname,\n\t\t\t// @see https://www.w3.org/TR/xml/#AVNormalize\n\t\t\t// since the xmldom sax parser does not \"interpret\" DTD the following is not implemented:\n\t\t\t// - recursive replacement of (DTD) entity references\n\t\t\t// - trimming and collapsing multiple spaces into a single one for attributes that are not of type CDATA\n\t\t\tvalue.replace(/[\\t\\n\\r]/g, ' ').replace(/&#?\\w+;/g, entityReplacer),\n\t\t\tstartIndex\n\t\t)\n\t}\n\tvar attrName;\n\tvar value;\n\tvar p = ++start;\n\tvar s = S_TAG;//status\n\twhile(true){\n\t\tvar c = source.charAt(p);\n\t\tswitch(c){\n\t\tcase '=':\n\t\t\tif(s === S_ATTR){//attrName\n\t\t\t\tattrName = source.slice(start,p);\n\t\t\t\ts = S_EQ;\n\t\t\t}else if(s === S_ATTR_SPACE){\n\t\t\t\ts = S_EQ;\n\t\t\t}else{\n\t\t\t\t//fatalError: equal must after attrName or space after attrName\n\t\t\t\tthrow new Error('attribute equal must after attrName'); // No known test case\n\t\t\t}\n\t\t\tbreak;\n\t\tcase '\\'':\n\t\tcase '\"':\n\t\t\tif(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE\n\t\t\t\t){//equal\n\t\t\t\tif(s === S_ATTR){\n\t\t\t\t\terrorHandler.warning('attribute value must after \"=\"')\n\t\t\t\t\tattrName = source.slice(start,p)\n\t\t\t\t}\n\t\t\t\tstart = p+1;\n\t\t\t\tp = source.indexOf(c,start)\n\t\t\t\tif(p>0){\n\t\t\t\t\tvalue = source.slice(start, p);\n\t\t\t\t\taddAttribute(attrName, value, start-1);\n\t\t\t\t\ts = S_ATTR_END;\n\t\t\t\t}else{\n\t\t\t\t\t//fatalError: no end quot match\n\t\t\t\t\tthrow new Error('attribute value no end \\''+c+'\\' match');\n\t\t\t\t}\n\t\t\t}else if(s == S_ATTR_NOQUOT_VALUE){\n\t\t\t\tvalue = source.slice(start, p);\n\t\t\t\taddAttribute(attrName, value, start);\n\t\t\t\terrorHandler.warning('attribute \"'+attrName+'\" missed start quot('+c+')!!');\n\t\t\t\tstart = p+1;\n\t\t\t\ts = S_ATTR_END\n\t\t\t}else{\n\t\t\t\t//fatalError: no equal before\n\t\t\t\tthrow new Error('attribute value must after \"=\"'); // No known test case\n\t\t\t}\n\t\t\tbreak;\n\t\tcase '/':\n\t\t\tswitch(s){\n\t\t\tcase S_TAG:\n\t\t\t\tel.setTagName(source.slice(start,p));\n\t\t\tcase S_ATTR_END:\n\t\t\tcase S_TAG_SPACE:\n\t\t\tcase S_TAG_CLOSE:\n\t\t\t\ts =S_TAG_CLOSE;\n\t\t\t\tel.closed = true;\n\t\t\tcase S_ATTR_NOQUOT_VALUE:\n\t\t\tcase S_ATTR:\n\t\t\t\tbreak;\n\t\t\t\tcase S_ATTR_SPACE:\n\t\t\t\t\tel.closed = true;\n\t\t\t\tbreak;\n\t\t\t//case S_EQ:\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"attribute invalid close char('/')\") // No known test case\n\t\t\t}\n\t\t\tbreak;\n\t\tcase ''://end document\n\t\t\terrorHandler.error('unexpected end of input');\n\t\t\tif(s == S_TAG){\n\t\t\t\tel.setTagName(source.slice(start,p));\n\t\t\t}\n\t\t\treturn p;\n\t\tcase '>':\n\t\t\tswitch(s){\n\t\t\tcase S_TAG:\n\t\t\t\tel.setTagName(source.slice(start,p));\n\t\t\tcase S_ATTR_END:\n\t\t\tcase S_TAG_SPACE:\n\t\t\tcase S_TAG_CLOSE:\n\t\t\t\tbreak;//normal\n\t\t\tcase S_ATTR_NOQUOT_VALUE://Compatible state\n\t\t\tcase S_ATTR:\n\t\t\t\tvalue = source.slice(start,p);\n\t\t\t\tif(value.slice(-1) === '/'){\n\t\t\t\t\tel.closed = true;\n\t\t\t\t\tvalue = value.slice(0,-1)\n\t\t\t\t}\n\t\t\tcase S_ATTR_SPACE:\n\t\t\t\tif(s === S_ATTR_SPACE){\n\t\t\t\t\tvalue = attrName;\n\t\t\t\t}\n\t\t\t\tif(s == S_ATTR_NOQUOT_VALUE){\n\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed quot(\")!');\n\t\t\t\t\taddAttribute(attrName, value, start)\n\t\t\t\t}else{\n\t\t\t\t\tif(!NAMESPACE.isHTML(currentNSMap['']) || !value.match(/^(?:disabled|checked|selected)$/i)){\n\t\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed value!! \"'+value+'\" instead!!')\n\t\t\t\t\t}\n\t\t\t\t\taddAttribute(value, value, start)\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase S_EQ:\n\t\t\t\tthrow new Error('attribute value missed!!');\n\t\t\t}\n//\t\t\tconsole.log(tagName,tagNamePattern,tagNamePattern.test(tagName))\n\t\t\treturn p;\n\t\t/*xml space '\\x20' | #x9 | #xD | #xA; */\n\t\tcase '\\u0080':\n\t\t\tc = ' ';\n\t\tdefault:\n\t\t\tif(c<= ' '){//space\n\t\t\t\tswitch(s){\n\t\t\t\tcase S_TAG:\n\t\t\t\t\tel.setTagName(source.slice(start,p));//tagName\n\t\t\t\t\ts = S_TAG_SPACE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_ATTR:\n\t\t\t\t\tattrName = source.slice(start,p)\n\t\t\t\t\ts = S_ATTR_SPACE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_ATTR_NOQUOT_VALUE:\n\t\t\t\t\tvar value = source.slice(start, p);\n\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed quot(\")!!');\n\t\t\t\t\taddAttribute(attrName, value, start)\n\t\t\t\tcase S_ATTR_END:\n\t\t\t\t\ts = S_TAG_SPACE;\n\t\t\t\t\tbreak;\n\t\t\t\t//case S_TAG_SPACE:\n\t\t\t\t//case S_EQ:\n\t\t\t\t//case S_ATTR_SPACE:\n\t\t\t\t//\tvoid();break;\n\t\t\t\t//case S_TAG_CLOSE:\n\t\t\t\t\t//ignore warning\n\t\t\t\t}\n\t\t\t}else{//not space\n//S_TAG,\tS_ATTR,\tS_EQ,\tS_ATTR_NOQUOT_VALUE\n//S_ATTR_SPACE,\tS_ATTR_END,\tS_TAG_SPACE, S_TAG_CLOSE\n\t\t\t\tswitch(s){\n\t\t\t\t//case S_TAG:void();break;\n\t\t\t\t//case S_ATTR:void();break;\n\t\t\t\t//case S_ATTR_NOQUOT_VALUE:void();break;\n\t\t\t\tcase S_ATTR_SPACE:\n\t\t\t\t\tvar tagName = el.tagName;\n\t\t\t\t\tif (!NAMESPACE.isHTML(currentNSMap['']) || !attrName.match(/^(?:disabled|checked|selected)$/i)) {\n\t\t\t\t\t\terrorHandler.warning('attribute \"'+attrName+'\" missed value!! \"'+attrName+'\" instead2!!')\n\t\t\t\t\t}\n\t\t\t\t\taddAttribute(attrName, attrName, start);\n\t\t\t\t\tstart = p;\n\t\t\t\t\ts = S_ATTR;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_ATTR_END:\n\t\t\t\t\terrorHandler.warning('attribute space is required\"'+attrName+'\"!!')\n\t\t\t\tcase S_TAG_SPACE:\n\t\t\t\t\ts = S_ATTR;\n\t\t\t\t\tstart = p;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_EQ:\n\t\t\t\t\ts = S_ATTR_NOQUOT_VALUE;\n\t\t\t\t\tstart = p;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_TAG_CLOSE:\n\t\t\t\t\tthrow new Error(\"elements closed character '/' and '>' must be connected to\");\n\t\t\t\t}\n\t\t\t}\n\t\t}//end outer switch\n\t\t//console.log('p++',p)\n\t\tp++;\n\t}\n}\n/**\n * @return true if has new namespace define\n */\nfunction appendElement(el,domBuilder,currentNSMap){\n\tvar tagName = el.tagName;\n\tvar localNSMap = null;\n\t//var currentNSMap = parseStack[parseStack.length-1].currentNSMap;\n\tvar i = el.length;\n\twhile(i--){\n\t\tvar a = el[i];\n\t\tvar qName = a.qName;\n\t\tvar value = a.value;\n\t\tvar nsp = qName.indexOf(':');\n\t\tif(nsp>0){\n\t\t\tvar prefix = a.prefix = qName.slice(0,nsp);\n\t\t\tvar localName = qName.slice(nsp+1);\n\t\t\tvar nsPrefix = prefix === 'xmlns' && localName\n\t\t}else{\n\t\t\tlocalName = qName;\n\t\t\tprefix = null\n\t\t\tnsPrefix = qName === 'xmlns' && ''\n\t\t}\n\t\t//can not set prefix,because prefix !== ''\n\t\ta.localName = localName ;\n\t\t//prefix == null for no ns prefix attribute\n\t\tif(nsPrefix !== false){//hack!!\n\t\t\tif(localNSMap == null){\n\t\t\t\tlocalNSMap = {}\n\t\t\t\t//console.log(currentNSMap,0)\n\t\t\t\t_copy(currentNSMap,currentNSMap={})\n\t\t\t\t//console.log(currentNSMap,1)\n\t\t\t}\n\t\t\tcurrentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;\n\t\t\ta.uri = NAMESPACE.XMLNS\n\t\t\tdomBuilder.startPrefixMapping(nsPrefix, value)\n\t\t}\n\t}\n\tvar i = el.length;\n\twhile(i--){\n\t\ta = el[i];\n\t\tvar prefix = a.prefix;\n\t\tif(prefix){//no prefix attribute has no namespace\n\t\t\tif(prefix === 'xml'){\n\t\t\t\ta.uri = NAMESPACE.XML;\n\t\t\t}if(prefix !== 'xmlns'){\n\t\t\t\ta.uri = currentNSMap[prefix || '']\n\n\t\t\t\t//{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}\n\t\t\t}\n\t\t}\n\t}\n\tvar nsp = tagName.indexOf(':');\n\tif(nsp>0){\n\t\tprefix = el.prefix = tagName.slice(0,nsp);\n\t\tlocalName = el.localName = tagName.slice(nsp+1);\n\t}else{\n\t\tprefix = null;//important!!\n\t\tlocalName = el.localName = tagName;\n\t}\n\t//no prefix element has default namespace\n\tvar ns = el.uri = currentNSMap[prefix || ''];\n\tdomBuilder.startElement(ns,localName,tagName,el);\n\t//endPrefixMapping and startPrefixMapping have not any help for dom builder\n\t//localNSMap = null\n\tif(el.closed){\n\t\tdomBuilder.endElement(ns,localName,tagName);\n\t\tif(localNSMap){\n\t\t\tfor (prefix in localNSMap) {\n\t\t\t\tif (Object.prototype.hasOwnProperty.call(localNSMap, prefix)) {\n\t\t\t\t\tdomBuilder.endPrefixMapping(prefix);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}else{\n\t\tel.currentNSMap = currentNSMap;\n\t\tel.localNSMap = localNSMap;\n\t\t//parseStack.push(el);\n\t\treturn true;\n\t}\n}\nfunction parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){\n\tif(/^(?:script|textarea)$/i.test(tagName)){\n\t\tvar elEndStart = source.indexOf('',elStartEnd);\n\t\tvar text = source.substring(elStartEnd+1,elEndStart);\n\t\tif(/[&<]/.test(text)){\n\t\t\tif(/^script$/i.test(tagName)){\n\t\t\t\t//if(!/\\]\\]>/.test(text)){\n\t\t\t\t\t//lexHandler.startCDATA();\n\t\t\t\t\tdomBuilder.characters(text,0,text.length);\n\t\t\t\t\t//lexHandler.endCDATA();\n\t\t\t\t\treturn elEndStart;\n\t\t\t\t//}\n\t\t\t}//}else{//text area\n\t\t\t\ttext = text.replace(/&#?\\w+;/g,entityReplacer);\n\t\t\t\tdomBuilder.characters(text,0,text.length);\n\t\t\t\treturn elEndStart;\n\t\t\t//}\n\n\t\t}\n\t}\n\treturn elStartEnd+1;\n}\nfunction fixSelfClosed(source,elStartEnd,tagName,closeMap){\n\t//if(tagName in closeMap){\n\tvar pos = closeMap[tagName];\n\tif(pos == null){\n\t\t//console.log(tagName)\n\t\tpos = source.lastIndexOf('')\n\t\tif(pos',start+4);\n\t\t\t//append comment source.substring(4,end)// ${end}. Duration (${end - start})\\n`;\n }\n return bufferedRangesStr;\n}\n\n/**\n * ranges\n *\n * Utilities for working with TimeRanges.\n *\n */\n\nconst TIME_FUDGE_FACTOR = 1 / 30; // Comparisons between time values such as current time and the end of the buffered range\n// can be misleading because of precision differences or when the current media has poorly\n// aligned audio and video, which can cause values to be slightly off from what you would\n// expect. This value is what we consider to be safe to use in such comparisons to account\n// for these scenarios.\n\nconst SAFE_TIME_DELTA = TIME_FUDGE_FACTOR * 3;\nconst filterRanges = function (timeRanges, predicate) {\n const results = [];\n let i;\n if (timeRanges && timeRanges.length) {\n // Search for ranges that match the predicate\n for (i = 0; i < timeRanges.length; i++) {\n if (predicate(timeRanges.start(i), timeRanges.end(i))) {\n results.push([timeRanges.start(i), timeRanges.end(i)]);\n }\n }\n }\n return createTimeRanges(results);\n};\n/**\n * Attempts to find the buffered TimeRange that contains the specified\n * time.\n *\n * @param {TimeRanges} buffered - the TimeRanges object to query\n * @param {number} time - the time to filter on.\n * @return {TimeRanges} a new TimeRanges object\n */\n\nconst findRange = function (buffered, time) {\n return filterRanges(buffered, function (start, end) {\n return start - SAFE_TIME_DELTA <= time && end + SAFE_TIME_DELTA >= time;\n });\n};\n/**\n * Returns the TimeRanges that begin later than the specified time.\n *\n * @param {TimeRanges} timeRanges - the TimeRanges object to query\n * @param {number} time - the time to filter on.\n * @return {TimeRanges} a new TimeRanges object.\n */\n\nconst findNextRange = function (timeRanges, time) {\n return filterRanges(timeRanges, function (start) {\n return start - TIME_FUDGE_FACTOR >= time;\n });\n};\n/**\n * Returns gaps within a list of TimeRanges\n *\n * @param {TimeRanges} buffered - the TimeRanges object\n * @return {TimeRanges} a TimeRanges object of gaps\n */\n\nconst findGaps = function (buffered) {\n if (buffered.length < 2) {\n return createTimeRanges();\n }\n const ranges = [];\n for (let i = 1; i < buffered.length; i++) {\n const start = buffered.end(i - 1);\n const end = buffered.start(i);\n ranges.push([start, end]);\n }\n return createTimeRanges(ranges);\n};\n/**\n * Calculate the intersection of two TimeRanges\n *\n * @param {TimeRanges} bufferA\n * @param {TimeRanges} bufferB\n * @return {TimeRanges} The interesection of `bufferA` with `bufferB`\n */\n\nconst bufferIntersection = function (bufferA, bufferB) {\n let start = null;\n let end = null;\n let arity = 0;\n const extents = [];\n const ranges = [];\n if (!bufferA || !bufferA.length || !bufferB || !bufferB.length) {\n return createTimeRanges();\n } // Handle the case where we have both buffers and create an\n // intersection of the two\n\n let count = bufferA.length; // A) Gather up all start and end times\n\n while (count--) {\n extents.push({\n time: bufferA.start(count),\n type: 'start'\n });\n extents.push({\n time: bufferA.end(count),\n type: 'end'\n });\n }\n count = bufferB.length;\n while (count--) {\n extents.push({\n time: bufferB.start(count),\n type: 'start'\n });\n extents.push({\n time: bufferB.end(count),\n type: 'end'\n });\n } // B) Sort them by time\n\n extents.sort(function (a, b) {\n return a.time - b.time;\n }); // C) Go along one by one incrementing arity for start and decrementing\n // arity for ends\n\n for (count = 0; count < extents.length; count++) {\n if (extents[count].type === 'start') {\n arity++; // D) If arity is ever incremented to 2 we are entering an\n // overlapping range\n\n if (arity === 2) {\n start = extents[count].time;\n }\n } else if (extents[count].type === 'end') {\n arity--; // E) If arity is ever decremented to 1 we leaving an\n // overlapping range\n\n if (arity === 1) {\n end = extents[count].time;\n }\n } // F) Record overlapping ranges\n\n if (start !== null && end !== null) {\n ranges.push([start, end]);\n start = null;\n end = null;\n }\n }\n return createTimeRanges(ranges);\n};\n/**\n * Gets a human readable string for a TimeRange\n *\n * @param {TimeRange} range\n * @return {string} a human readable string\n */\n\nconst printableRange = range => {\n const strArr = [];\n if (!range || !range.length) {\n return '';\n }\n for (let i = 0; i < range.length; i++) {\n strArr.push(range.start(i) + ' => ' + range.end(i));\n }\n return strArr.join(', ');\n};\n/**\n * Calculates the amount of time left in seconds until the player hits the end of the\n * buffer and causes a rebuffer\n *\n * @param {TimeRange} buffered\n * The state of the buffer\n * @param {Numnber} currentTime\n * The current time of the player\n * @param {number} playbackRate\n * The current playback rate of the player. Defaults to 1.\n * @return {number}\n * Time until the player has to start rebuffering in seconds.\n * @function timeUntilRebuffer\n */\n\nconst timeUntilRebuffer = function (buffered, currentTime, playbackRate = 1) {\n const bufferedEnd = buffered.length ? buffered.end(buffered.length - 1) : 0;\n return (bufferedEnd - currentTime) / playbackRate;\n};\n/**\n * Converts a TimeRanges object into an array representation\n *\n * @param {TimeRanges} timeRanges\n * @return {Array}\n */\n\nconst timeRangesToArray = timeRanges => {\n const timeRangesList = [];\n for (let i = 0; i < timeRanges.length; i++) {\n timeRangesList.push({\n start: timeRanges.start(i),\n end: timeRanges.end(i)\n });\n }\n return timeRangesList;\n};\n/**\n * Determines if two time range objects are different.\n *\n * @param {TimeRange} a\n * the first time range object to check\n *\n * @param {TimeRange} b\n * the second time range object to check\n *\n * @return {Boolean}\n * Whether the time range objects differ\n */\n\nconst isRangeDifferent = function (a, b) {\n // same object\n if (a === b) {\n return false;\n } // one or the other is undefined\n\n if (!a && b || !b && a) {\n return true;\n } // length is different\n\n if (a.length !== b.length) {\n return true;\n } // see if any start/end pair is different\n\n for (let i = 0; i < a.length; i++) {\n if (a.start(i) !== b.start(i) || a.end(i) !== b.end(i)) {\n return true;\n }\n } // if the length and every pair is the same\n // this is the same time range\n\n return false;\n};\nconst lastBufferedEnd = function (a) {\n if (!a || !a.length || !a.end) {\n return;\n }\n return a.end(a.length - 1);\n};\n/**\n * A utility function to add up the amount of time in a timeRange\n * after a specified startTime.\n * ie:[[0, 10], [20, 40], [50, 60]] with a startTime 0\n * would return 40 as there are 40s seconds after 0 in the timeRange\n *\n * @param {TimeRange} range\n * The range to check against\n * @param {number} startTime\n * The time in the time range that you should start counting from\n *\n * @return {number}\n * The number of seconds in the buffer passed the specified time.\n */\n\nconst timeAheadOf = function (range, startTime) {\n let time = 0;\n if (!range || !range.length) {\n return time;\n }\n for (let i = 0; i < range.length; i++) {\n const start = range.start(i);\n const end = range.end(i); // startTime is after this range entirely\n\n if (startTime > end) {\n continue;\n } // startTime is within this range\n\n if (startTime > start && startTime <= end) {\n time += end - startTime;\n continue;\n } // startTime is before this range.\n\n time += end - start;\n }\n return time;\n};\n\n/**\n * @file playlist.js\n *\n * Playlist related utilities.\n */\n/**\n * Get the duration of a segment, with special cases for\n * llhls segments that do not have a duration yet.\n *\n * @param {Object} playlist\n * the playlist that the segment belongs to.\n * @param {Object} segment\n * the segment to get a duration for.\n *\n * @return {number}\n * the segment duration\n */\n\nconst segmentDurationWithParts = (playlist, segment) => {\n // if this isn't a preload segment\n // then we will have a segment duration that is accurate.\n if (!segment.preload) {\n return segment.duration;\n } // otherwise we have to add up parts and preload hints\n // to get an up to date duration.\n\n let result = 0;\n (segment.parts || []).forEach(function (p) {\n result += p.duration;\n }); // for preload hints we have to use partTargetDuration\n // as they won't even have a duration yet.\n\n (segment.preloadHints || []).forEach(function (p) {\n if (p.type === 'PART') {\n result += playlist.partTargetDuration;\n }\n });\n return result;\n};\n/**\n * A function to get a combined list of parts and segments with durations\n * and indexes.\n *\n * @param {Playlist} playlist the playlist to get the list for.\n *\n * @return {Array} The part/segment list.\n */\n\nconst getPartsAndSegments = playlist => (playlist.segments || []).reduce((acc, segment, si) => {\n if (segment.parts) {\n segment.parts.forEach(function (part, pi) {\n acc.push({\n duration: part.duration,\n segmentIndex: si,\n partIndex: pi,\n part,\n segment\n });\n });\n } else {\n acc.push({\n duration: segment.duration,\n segmentIndex: si,\n partIndex: null,\n segment,\n part: null\n });\n }\n return acc;\n}, []);\nconst getLastParts = media => {\n const lastSegment = media.segments && media.segments.length && media.segments[media.segments.length - 1];\n return lastSegment && lastSegment.parts || [];\n};\nconst getKnownPartCount = ({\n preloadSegment\n}) => {\n if (!preloadSegment) {\n return;\n }\n const {\n parts,\n preloadHints\n } = preloadSegment;\n let partCount = (preloadHints || []).reduce((count, hint) => count + (hint.type === 'PART' ? 1 : 0), 0);\n partCount += parts && parts.length ? parts.length : 0;\n return partCount;\n};\n/**\n * Get the number of seconds to delay from the end of a\n * live playlist.\n *\n * @param {Playlist} main the main playlist\n * @param {Playlist} media the media playlist\n * @return {number} the hold back in seconds.\n */\n\nconst liveEdgeDelay = (main, media) => {\n if (media.endList) {\n return 0;\n } // dash suggestedPresentationDelay trumps everything\n\n if (main && main.suggestedPresentationDelay) {\n return main.suggestedPresentationDelay;\n }\n const hasParts = getLastParts(media).length > 0; // look for \"part\" delays from ll-hls first\n\n if (hasParts && media.serverControl && media.serverControl.partHoldBack) {\n return media.serverControl.partHoldBack;\n } else if (hasParts && media.partTargetDuration) {\n return media.partTargetDuration * 3; // finally look for full segment delays\n } else if (media.serverControl && media.serverControl.holdBack) {\n return media.serverControl.holdBack;\n } else if (media.targetDuration) {\n return media.targetDuration * 3;\n }\n return 0;\n};\n/**\n * walk backward until we find a duration we can use\n * or return a failure\n *\n * @param {Playlist} playlist the playlist to walk through\n * @param {Number} endSequence the mediaSequence to stop walking on\n */\n\nconst backwardDuration = function (playlist, endSequence) {\n let result = 0;\n let i = endSequence - playlist.mediaSequence; // if a start time is available for segment immediately following\n // the interval, use it\n\n let segment = playlist.segments[i]; // Walk backward until we find the latest segment with timeline\n // information that is earlier than endSequence\n\n if (segment) {\n if (typeof segment.start !== 'undefined') {\n return {\n result: segment.start,\n precise: true\n };\n }\n if (typeof segment.end !== 'undefined') {\n return {\n result: segment.end - segment.duration,\n precise: true\n };\n }\n }\n while (i--) {\n segment = playlist.segments[i];\n if (typeof segment.end !== 'undefined') {\n return {\n result: result + segment.end,\n precise: true\n };\n }\n result += segmentDurationWithParts(playlist, segment);\n if (typeof segment.start !== 'undefined') {\n return {\n result: result + segment.start,\n precise: true\n };\n }\n }\n return {\n result,\n precise: false\n };\n};\n/**\n * walk forward until we find a duration we can use\n * or return a failure\n *\n * @param {Playlist} playlist the playlist to walk through\n * @param {number} endSequence the mediaSequence to stop walking on\n */\n\nconst forwardDuration = function (playlist, endSequence) {\n let result = 0;\n let segment;\n let i = endSequence - playlist.mediaSequence; // Walk forward until we find the earliest segment with timeline\n // information\n\n for (; i < playlist.segments.length; i++) {\n segment = playlist.segments[i];\n if (typeof segment.start !== 'undefined') {\n return {\n result: segment.start - result,\n precise: true\n };\n }\n result += segmentDurationWithParts(playlist, segment);\n if (typeof segment.end !== 'undefined') {\n return {\n result: segment.end - result,\n precise: true\n };\n }\n } // indicate we didn't find a useful duration estimate\n\n return {\n result: -1,\n precise: false\n };\n};\n/**\n * Calculate the media duration from the segments associated with a\n * playlist. The duration of a subinterval of the available segments\n * may be calculated by specifying an end index.\n *\n * @param {Object} playlist a media playlist object\n * @param {number=} endSequence an exclusive upper boundary\n * for the playlist. Defaults to playlist length.\n * @param {number} expired the amount of time that has dropped\n * off the front of the playlist in a live scenario\n * @return {number} the duration between the first available segment\n * and end index.\n */\n\nconst intervalDuration = function (playlist, endSequence, expired) {\n if (typeof endSequence === 'undefined') {\n endSequence = playlist.mediaSequence + playlist.segments.length;\n }\n if (endSequence < playlist.mediaSequence) {\n return 0;\n } // do a backward walk to estimate the duration\n\n const backward = backwardDuration(playlist, endSequence);\n if (backward.precise) {\n // if we were able to base our duration estimate on timing\n // information provided directly from the Media Source, return\n // it\n return backward.result;\n } // walk forward to see if a precise duration estimate can be made\n // that way\n\n const forward = forwardDuration(playlist, endSequence);\n if (forward.precise) {\n // we found a segment that has been buffered and so it's\n // position is known precisely\n return forward.result;\n } // return the less-precise, playlist-based duration estimate\n\n return backward.result + expired;\n};\n/**\n * Calculates the duration of a playlist. If a start and end index\n * are specified, the duration will be for the subset of the media\n * timeline between those two indices. The total duration for live\n * playlists is always Infinity.\n *\n * @param {Object} playlist a media playlist object\n * @param {number=} endSequence an exclusive upper\n * boundary for the playlist. Defaults to the playlist media\n * sequence number plus its length.\n * @param {number=} expired the amount of time that has\n * dropped off the front of the playlist in a live scenario\n * @return {number} the duration between the start index and end\n * index.\n */\n\nconst duration = function (playlist, endSequence, expired) {\n if (!playlist) {\n return 0;\n }\n if (typeof expired !== 'number') {\n expired = 0;\n } // if a slice of the total duration is not requested, use\n // playlist-level duration indicators when they're present\n\n if (typeof endSequence === 'undefined') {\n // if present, use the duration specified in the playlist\n if (playlist.totalDuration) {\n return playlist.totalDuration;\n } // duration should be Infinity for live playlists\n\n if (!playlist.endList) {\n return window$1.Infinity;\n }\n } // calculate the total duration based on the segment durations\n\n return intervalDuration(playlist, endSequence, expired);\n};\n/**\n * Calculate the time between two indexes in the current playlist\n * neight the start- nor the end-index need to be within the current\n * playlist in which case, the targetDuration of the playlist is used\n * to approximate the durations of the segments\n *\n * @param {Array} options.durationList list to iterate over for durations.\n * @param {number} options.defaultDuration duration to use for elements before or after the durationList\n * @param {number} options.startIndex partsAndSegments index to start\n * @param {number} options.endIndex partsAndSegments index to end.\n * @return {number} the number of seconds between startIndex and endIndex\n */\n\nconst sumDurations = function ({\n defaultDuration,\n durationList,\n startIndex,\n endIndex\n}) {\n let durations = 0;\n if (startIndex > endIndex) {\n [startIndex, endIndex] = [endIndex, startIndex];\n }\n if (startIndex < 0) {\n for (let i = startIndex; i < Math.min(0, endIndex); i++) {\n durations += defaultDuration;\n }\n startIndex = 0;\n }\n for (let i = startIndex; i < endIndex; i++) {\n durations += durationList[i].duration;\n }\n return durations;\n};\n/**\n * Calculates the playlist end time\n *\n * @param {Object} playlist a media playlist object\n * @param {number=} expired the amount of time that has\n * dropped off the front of the playlist in a live scenario\n * @param {boolean|false} useSafeLiveEnd a boolean value indicating whether or not the\n * playlist end calculation should consider the safe live end\n * (truncate the playlist end by three segments). This is normally\n * used for calculating the end of the playlist's seekable range.\n * This takes into account the value of liveEdgePadding.\n * Setting liveEdgePadding to 0 is equivalent to setting this to false.\n * @param {number} liveEdgePadding a number indicating how far from the end of the playlist we should be in seconds.\n * If this is provided, it is used in the safe live end calculation.\n * Setting useSafeLiveEnd=false or liveEdgePadding=0 are equivalent.\n * Corresponds to suggestedPresentationDelay in DASH manifests.\n * @return {number} the end time of playlist\n * @function playlistEnd\n */\n\nconst playlistEnd = function (playlist, expired, useSafeLiveEnd, liveEdgePadding) {\n if (!playlist || !playlist.segments) {\n return null;\n }\n if (playlist.endList) {\n return duration(playlist);\n }\n if (expired === null) {\n return null;\n }\n expired = expired || 0;\n let lastSegmentEndTime = intervalDuration(playlist, playlist.mediaSequence + playlist.segments.length, expired);\n if (useSafeLiveEnd) {\n liveEdgePadding = typeof liveEdgePadding === 'number' ? liveEdgePadding : liveEdgeDelay(null, playlist);\n lastSegmentEndTime -= liveEdgePadding;\n } // don't return a time less than zero\n\n return Math.max(0, lastSegmentEndTime);\n};\n/**\n * Calculates the interval of time that is currently seekable in a\n * playlist. The returned time ranges are relative to the earliest\n * moment in the specified playlist that is still available. A full\n * seekable implementation for live streams would need to offset\n * these values by the duration of content that has expired from the\n * stream.\n *\n * @param {Object} playlist a media playlist object\n * dropped off the front of the playlist in a live scenario\n * @param {number=} expired the amount of time that has\n * dropped off the front of the playlist in a live scenario\n * @param {number} liveEdgePadding how far from the end of the playlist we should be in seconds.\n * Corresponds to suggestedPresentationDelay in DASH manifests.\n * @return {TimeRanges} the periods of time that are valid targets\n * for seeking\n */\n\nconst seekable = function (playlist, expired, liveEdgePadding) {\n const useSafeLiveEnd = true;\n const seekableStart = expired || 0;\n let seekableEnd = playlistEnd(playlist, expired, useSafeLiveEnd, liveEdgePadding);\n if (seekableEnd === null) {\n return createTimeRanges();\n } // Clamp seekable end since it can not be less than the seekable start\n\n if (seekableEnd < seekableStart) {\n seekableEnd = seekableStart;\n }\n return createTimeRanges(seekableStart, seekableEnd);\n};\n/**\n * Determine the index and estimated starting time of the segment that\n * contains a specified playback position in a media playlist.\n *\n * @param {Object} options.playlist the media playlist to query\n * @param {number} options.currentTime The number of seconds since the earliest\n * possible position to determine the containing segment for\n * @param {number} options.startTime the time when the segment/part starts\n * @param {number} options.startingSegmentIndex the segment index to start looking at.\n * @param {number?} [options.startingPartIndex] the part index to look at within the segment.\n *\n * @return {Object} an object with partIndex, segmentIndex, and startTime.\n */\n\nconst getMediaInfoForTime = function ({\n playlist,\n currentTime,\n startingSegmentIndex,\n startingPartIndex,\n startTime,\n exactManifestTimings\n}) {\n let time = currentTime - startTime;\n const partsAndSegments = getPartsAndSegments(playlist);\n let startIndex = 0;\n for (let i = 0; i < partsAndSegments.length; i++) {\n const partAndSegment = partsAndSegments[i];\n if (startingSegmentIndex !== partAndSegment.segmentIndex) {\n continue;\n } // skip this if part index does not match.\n\n if (typeof startingPartIndex === 'number' && typeof partAndSegment.partIndex === 'number' && startingPartIndex !== partAndSegment.partIndex) {\n continue;\n }\n startIndex = i;\n break;\n }\n if (time < 0) {\n // Walk backward from startIndex in the playlist, adding durations\n // until we find a segment that contains `time` and return it\n if (startIndex > 0) {\n for (let i = startIndex - 1; i >= 0; i--) {\n const partAndSegment = partsAndSegments[i];\n time += partAndSegment.duration;\n if (exactManifestTimings) {\n if (time < 0) {\n continue;\n }\n } else if (time + TIME_FUDGE_FACTOR <= 0) {\n continue;\n }\n return {\n partIndex: partAndSegment.partIndex,\n segmentIndex: partAndSegment.segmentIndex,\n startTime: startTime - sumDurations({\n defaultDuration: playlist.targetDuration,\n durationList: partsAndSegments,\n startIndex,\n endIndex: i\n })\n };\n }\n } // We were unable to find a good segment within the playlist\n // so select the first segment\n\n return {\n partIndex: partsAndSegments[0] && partsAndSegments[0].partIndex || null,\n segmentIndex: partsAndSegments[0] && partsAndSegments[0].segmentIndex || 0,\n startTime: currentTime\n };\n } // When startIndex is negative, we first walk forward to first segment\n // adding target durations. If we \"run out of time\" before getting to\n // the first segment, return the first segment\n\n if (startIndex < 0) {\n for (let i = startIndex; i < 0; i++) {\n time -= playlist.targetDuration;\n if (time < 0) {\n return {\n partIndex: partsAndSegments[0] && partsAndSegments[0].partIndex || null,\n segmentIndex: partsAndSegments[0] && partsAndSegments[0].segmentIndex || 0,\n startTime: currentTime\n };\n }\n }\n startIndex = 0;\n } // Walk forward from startIndex in the playlist, subtracting durations\n // until we find a segment that contains `time` and return it\n\n for (let i = startIndex; i < partsAndSegments.length; i++) {\n const partAndSegment = partsAndSegments[i];\n time -= partAndSegment.duration;\n const canUseFudgeFactor = partAndSegment.duration > TIME_FUDGE_FACTOR;\n const isExactlyAtTheEnd = time === 0;\n const isExtremelyCloseToTheEnd = canUseFudgeFactor && time + TIME_FUDGE_FACTOR >= 0;\n if (isExactlyAtTheEnd || isExtremelyCloseToTheEnd) {\n // 1) We are exactly at the end of the current segment.\n // 2) We are extremely close to the end of the current segment (The difference is less than 1 / 30).\n // We may encounter this situation when\n // we don't have exact match between segment duration info in the manifest and the actual duration of the segment\n // For example:\n // We appended 3 segments 10 seconds each, meaning we should have 30 sec buffered,\n // but we the actual buffered is 29.99999\n //\n // In both cases:\n // if we passed current time -> it means that we already played current segment\n // if we passed buffered.end -> it means that this segment is already loaded and buffered\n // we should select the next segment if we have one:\n if (i !== partsAndSegments.length - 1) {\n continue;\n }\n }\n if (exactManifestTimings) {\n if (time > 0) {\n continue;\n }\n } else if (time - TIME_FUDGE_FACTOR >= 0) {\n continue;\n }\n return {\n partIndex: partAndSegment.partIndex,\n segmentIndex: partAndSegment.segmentIndex,\n startTime: startTime + sumDurations({\n defaultDuration: playlist.targetDuration,\n durationList: partsAndSegments,\n startIndex,\n endIndex: i\n })\n };\n } // We are out of possible candidates so load the last one...\n\n return {\n segmentIndex: partsAndSegments[partsAndSegments.length - 1].segmentIndex,\n partIndex: partsAndSegments[partsAndSegments.length - 1].partIndex,\n startTime: currentTime\n };\n};\n/**\n * Check whether the playlist is excluded or not.\n *\n * @param {Object} playlist the media playlist object\n * @return {boolean} whether the playlist is excluded or not\n * @function isExcluded\n */\n\nconst isExcluded = function (playlist) {\n return playlist.excludeUntil && playlist.excludeUntil > Date.now();\n};\n/**\n * Check whether the playlist is compatible with current playback configuration or has\n * been excluded permanently for being incompatible.\n *\n * @param {Object} playlist the media playlist object\n * @return {boolean} whether the playlist is incompatible or not\n * @function isIncompatible\n */\n\nconst isIncompatible = function (playlist) {\n return playlist.excludeUntil && playlist.excludeUntil === Infinity;\n};\n/**\n * Check whether the playlist is enabled or not.\n *\n * @param {Object} playlist the media playlist object\n * @return {boolean} whether the playlist is enabled or not\n * @function isEnabled\n */\n\nconst isEnabled = function (playlist) {\n const excluded = isExcluded(playlist);\n return !playlist.disabled && !excluded;\n};\n/**\n * Check whether the playlist has been manually disabled through the representations api.\n *\n * @param {Object} playlist the media playlist object\n * @return {boolean} whether the playlist is disabled manually or not\n * @function isDisabled\n */\n\nconst isDisabled = function (playlist) {\n return playlist.disabled;\n};\n/**\n * Returns whether the current playlist is an AES encrypted HLS stream\n *\n * @return {boolean} true if it's an AES encrypted HLS stream\n */\n\nconst isAes = function (media) {\n for (let i = 0; i < media.segments.length; i++) {\n if (media.segments[i].key) {\n return true;\n }\n }\n return false;\n};\n/**\n * Checks if the playlist has a value for the specified attribute\n *\n * @param {string} attr\n * Attribute to check for\n * @param {Object} playlist\n * The media playlist object\n * @return {boolean}\n * Whether the playlist contains a value for the attribute or not\n * @function hasAttribute\n */\n\nconst hasAttribute = function (attr, playlist) {\n return playlist.attributes && playlist.attributes[attr];\n};\n/**\n * Estimates the time required to complete a segment download from the specified playlist\n *\n * @param {number} segmentDuration\n * Duration of requested segment\n * @param {number} bandwidth\n * Current measured bandwidth of the player\n * @param {Object} playlist\n * The media playlist object\n * @param {number=} bytesReceived\n * Number of bytes already received for the request. Defaults to 0\n * @return {number|NaN}\n * The estimated time to request the segment. NaN if bandwidth information for\n * the given playlist is unavailable\n * @function estimateSegmentRequestTime\n */\n\nconst estimateSegmentRequestTime = function (segmentDuration, bandwidth, playlist, bytesReceived = 0) {\n if (!hasAttribute('BANDWIDTH', playlist)) {\n return NaN;\n }\n const size = segmentDuration * playlist.attributes.BANDWIDTH;\n return (size - bytesReceived * 8) / bandwidth;\n};\n/*\n * Returns whether the current playlist is the lowest rendition\n *\n * @return {Boolean} true if on lowest rendition\n */\n\nconst isLowestEnabledRendition = (main, media) => {\n if (main.playlists.length === 1) {\n return true;\n }\n const currentBandwidth = media.attributes.BANDWIDTH || Number.MAX_VALUE;\n return main.playlists.filter(playlist => {\n if (!isEnabled(playlist)) {\n return false;\n }\n return (playlist.attributes.BANDWIDTH || 0) < currentBandwidth;\n }).length === 0;\n};\nconst playlistMatch = (a, b) => {\n // both playlits are null\n // or only one playlist is non-null\n // no match\n if (!a && !b || !a && b || a && !b) {\n return false;\n } // playlist objects are the same, match\n\n if (a === b) {\n return true;\n } // first try to use id as it should be the most\n // accurate\n\n if (a.id && b.id && a.id === b.id) {\n return true;\n } // next try to use reslovedUri as it should be the\n // second most accurate.\n\n if (a.resolvedUri && b.resolvedUri && a.resolvedUri === b.resolvedUri) {\n return true;\n } // finally try to use uri as it should be accurate\n // but might miss a few cases for relative uris\n\n if (a.uri && b.uri && a.uri === b.uri) {\n return true;\n }\n return false;\n};\nconst someAudioVariant = function (main, callback) {\n const AUDIO = main && main.mediaGroups && main.mediaGroups.AUDIO || {};\n let found = false;\n for (const groupName in AUDIO) {\n for (const label in AUDIO[groupName]) {\n found = callback(AUDIO[groupName][label]);\n if (found) {\n break;\n }\n }\n if (found) {\n break;\n }\n }\n return !!found;\n};\nconst isAudioOnly = main => {\n // we are audio only if we have no main playlists but do\n // have media group playlists.\n if (!main || !main.playlists || !main.playlists.length) {\n // without audio variants or playlists this\n // is not an audio only main.\n const found = someAudioVariant(main, variant => variant.playlists && variant.playlists.length || variant.uri);\n return found;\n } // if every playlist has only an audio codec it is audio only\n\n for (let i = 0; i < main.playlists.length; i++) {\n const playlist = main.playlists[i];\n const CODECS = playlist.attributes && playlist.attributes.CODECS; // all codecs are audio, this is an audio playlist.\n\n if (CODECS && CODECS.split(',').every(c => isAudioCodec(c))) {\n continue;\n } // playlist is in an audio group it is audio only\n\n const found = someAudioVariant(main, variant => playlistMatch(playlist, variant));\n if (found) {\n continue;\n } // if we make it here this playlist isn't audio and we\n // are not audio only\n\n return false;\n } // if we make it past every playlist without returning, then\n // this is an audio only playlist.\n\n return true;\n}; // exports\n\nvar Playlist = {\n liveEdgeDelay,\n duration,\n seekable,\n getMediaInfoForTime,\n isEnabled,\n isDisabled,\n isExcluded,\n isIncompatible,\n playlistEnd,\n isAes,\n hasAttribute,\n estimateSegmentRequestTime,\n isLowestEnabledRendition,\n isAudioOnly,\n playlistMatch,\n segmentDurationWithParts\n};\nconst {\n log\n} = videojs;\nconst createPlaylistID = (index, uri) => {\n return `${index}-${uri}`;\n}; // default function for creating a group id\n\nconst groupID = (type, group, label) => {\n return `placeholder-uri-${type}-${group}-${label}`;\n};\n/**\n * Parses a given m3u8 playlist\n *\n * @param {Function} [onwarn]\n * a function to call when the parser triggers a warning event.\n * @param {Function} [oninfo]\n * a function to call when the parser triggers an info event.\n * @param {string} manifestString\n * The downloaded manifest string\n * @param {Object[]} [customTagParsers]\n * An array of custom tag parsers for the m3u8-parser instance\n * @param {Object[]} [customTagMappers]\n * An array of custom tag mappers for the m3u8-parser instance\n * @param {boolean} [llhls]\n * Whether to keep ll-hls features in the manifest after parsing.\n * @return {Object}\n * The manifest object\n */\n\nconst parseManifest = ({\n onwarn,\n oninfo,\n manifestString,\n customTagParsers = [],\n customTagMappers = [],\n llhls\n}) => {\n const parser = new Parser();\n if (onwarn) {\n parser.on('warn', onwarn);\n }\n if (oninfo) {\n parser.on('info', oninfo);\n }\n customTagParsers.forEach(customParser => parser.addParser(customParser));\n customTagMappers.forEach(mapper => parser.addTagMapper(mapper));\n parser.push(manifestString);\n parser.end();\n const manifest = parser.manifest; // remove llhls features from the parsed manifest\n // if we don't want llhls support.\n\n if (!llhls) {\n ['preloadSegment', 'skip', 'serverControl', 'renditionReports', 'partInf', 'partTargetDuration'].forEach(function (k) {\n if (manifest.hasOwnProperty(k)) {\n delete manifest[k];\n }\n });\n if (manifest.segments) {\n manifest.segments.forEach(function (segment) {\n ['parts', 'preloadHints'].forEach(function (k) {\n if (segment.hasOwnProperty(k)) {\n delete segment[k];\n }\n });\n });\n }\n }\n if (!manifest.targetDuration) {\n let targetDuration = 10;\n if (manifest.segments && manifest.segments.length) {\n targetDuration = manifest.segments.reduce((acc, s) => Math.max(acc, s.duration), 0);\n }\n if (onwarn) {\n onwarn({\n message: `manifest has no targetDuration defaulting to ${targetDuration}`\n });\n }\n manifest.targetDuration = targetDuration;\n }\n const parts = getLastParts(manifest);\n if (parts.length && !manifest.partTargetDuration) {\n const partTargetDuration = parts.reduce((acc, p) => Math.max(acc, p.duration), 0);\n if (onwarn) {\n onwarn({\n message: `manifest has no partTargetDuration defaulting to ${partTargetDuration}`\n });\n log.error('LL-HLS manifest has parts but lacks required #EXT-X-PART-INF:PART-TARGET value. See https://datatracker.ietf.org/doc/html/draft-pantos-hls-rfc8216bis-09#section-4.4.3.7. Playback is not guaranteed.');\n }\n manifest.partTargetDuration = partTargetDuration;\n }\n return manifest;\n};\n/**\n * Loops through all supported media groups in main and calls the provided\n * callback for each group\n *\n * @param {Object} main\n * The parsed main manifest object\n * @param {Function} callback\n * Callback to call for each media group\n */\n\nconst forEachMediaGroup = (main, callback) => {\n if (!main.mediaGroups) {\n return;\n }\n ['AUDIO', 'SUBTITLES'].forEach(mediaType => {\n if (!main.mediaGroups[mediaType]) {\n return;\n }\n for (const groupKey in main.mediaGroups[mediaType]) {\n for (const labelKey in main.mediaGroups[mediaType][groupKey]) {\n const mediaProperties = main.mediaGroups[mediaType][groupKey][labelKey];\n callback(mediaProperties, mediaType, groupKey, labelKey);\n }\n }\n });\n};\n/**\n * Adds properties and attributes to the playlist to keep consistent functionality for\n * playlists throughout VHS.\n *\n * @param {Object} config\n * Arguments object\n * @param {Object} config.playlist\n * The media playlist\n * @param {string} [config.uri]\n * The uri to the media playlist (if media playlist is not from within a main\n * playlist)\n * @param {string} id\n * ID to use for the playlist\n */\n\nconst setupMediaPlaylist = ({\n playlist,\n uri,\n id\n}) => {\n playlist.id = id;\n playlist.playlistErrors_ = 0;\n if (uri) {\n // For media playlists, m3u8-parser does not have access to a URI, as HLS media\n // playlists do not contain their own source URI, but one is needed for consistency in\n // VHS.\n playlist.uri = uri;\n } // For HLS main playlists, even though certain attributes MUST be defined, the\n // stream may still be played without them.\n // For HLS media playlists, m3u8-parser does not attach an attributes object to the\n // manifest.\n //\n // To avoid undefined reference errors through the project, and make the code easier\n // to write/read, add an empty attributes object for these cases.\n\n playlist.attributes = playlist.attributes || {};\n};\n/**\n * Adds ID, resolvedUri, and attributes properties to each playlist of the main, where\n * necessary. In addition, creates playlist IDs for each playlist and adds playlist ID to\n * playlist references to the playlists array.\n *\n * @param {Object} main\n * The main playlist\n */\n\nconst setupMediaPlaylists = main => {\n let i = main.playlists.length;\n while (i--) {\n const playlist = main.playlists[i];\n setupMediaPlaylist({\n playlist,\n id: createPlaylistID(i, playlist.uri)\n });\n playlist.resolvedUri = resolveUrl(main.uri, playlist.uri);\n main.playlists[playlist.id] = playlist; // URI reference added for backwards compatibility\n\n main.playlists[playlist.uri] = playlist; // Although the spec states an #EXT-X-STREAM-INF tag MUST have a BANDWIDTH attribute,\n // the stream can be played without it. Although an attributes property may have been\n // added to the playlist to prevent undefined references, issue a warning to fix the\n // manifest.\n\n if (!playlist.attributes.BANDWIDTH) {\n log.warn('Invalid playlist STREAM-INF detected. Missing BANDWIDTH attribute.');\n }\n }\n};\n/**\n * Adds resolvedUri properties to each media group.\n *\n * @param {Object} main\n * The main playlist\n */\n\nconst resolveMediaGroupUris = main => {\n forEachMediaGroup(main, properties => {\n if (properties.uri) {\n properties.resolvedUri = resolveUrl(main.uri, properties.uri);\n }\n });\n};\n/**\n * Creates a main playlist wrapper to insert a sole media playlist into.\n *\n * @param {Object} media\n * Media playlist\n * @param {string} uri\n * The media URI\n *\n * @return {Object}\n * main playlist\n */\n\nconst mainForMedia = (media, uri) => {\n const id = createPlaylistID(0, uri);\n const main = {\n mediaGroups: {\n 'AUDIO': {},\n 'VIDEO': {},\n 'CLOSED-CAPTIONS': {},\n 'SUBTITLES': {}\n },\n uri: window$1.location.href,\n resolvedUri: window$1.location.href,\n playlists: [{\n uri,\n id,\n resolvedUri: uri,\n // m3u8-parser does not attach an attributes property to media playlists so make\n // sure that the property is attached to avoid undefined reference errors\n attributes: {}\n }]\n }; // set up ID reference\n\n main.playlists[id] = main.playlists[0]; // URI reference added for backwards compatibility\n\n main.playlists[uri] = main.playlists[0];\n return main;\n};\n/**\n * Does an in-place update of the main manifest to add updated playlist URI references\n * as well as other properties needed by VHS that aren't included by the parser.\n *\n * @param {Object} main\n * main manifest object\n * @param {string} uri\n * The source URI\n * @param {function} createGroupID\n * A function to determine how to create the groupID for mediaGroups\n */\n\nconst addPropertiesToMain = (main, uri, createGroupID = groupID) => {\n main.uri = uri;\n for (let i = 0; i < main.playlists.length; i++) {\n if (!main.playlists[i].uri) {\n // Set up phony URIs for the playlists since playlists are referenced by their URIs\n // throughout VHS, but some formats (e.g., DASH) don't have external URIs\n // TODO: consider adding dummy URIs in mpd-parser\n const phonyUri = `placeholder-uri-${i}`;\n main.playlists[i].uri = phonyUri;\n }\n }\n const audioOnlyMain = isAudioOnly(main);\n forEachMediaGroup(main, (properties, mediaType, groupKey, labelKey) => {\n // add a playlist array under properties\n if (!properties.playlists || !properties.playlists.length) {\n // If the manifest is audio only and this media group does not have a uri, check\n // if the media group is located in the main list of playlists. If it is, don't add\n // placeholder properties as it shouldn't be considered an alternate audio track.\n if (audioOnlyMain && mediaType === 'AUDIO' && !properties.uri) {\n for (let i = 0; i < main.playlists.length; i++) {\n const p = main.playlists[i];\n if (p.attributes && p.attributes.AUDIO && p.attributes.AUDIO === groupKey) {\n return;\n }\n }\n }\n properties.playlists = [_extends({}, properties)];\n }\n properties.playlists.forEach(function (p, i) {\n const groupId = createGroupID(mediaType, groupKey, labelKey, p);\n const id = createPlaylistID(i, groupId);\n if (p.uri) {\n p.resolvedUri = p.resolvedUri || resolveUrl(main.uri, p.uri);\n } else {\n // DEPRECATED, this has been added to prevent a breaking change.\n // previously we only ever had a single media group playlist, so\n // we mark the first playlist uri without prepending the index as we used to\n // ideally we would do all of the playlists the same way.\n p.uri = i === 0 ? groupId : id; // don't resolve a placeholder uri to an absolute url, just use\n // the placeholder again\n\n p.resolvedUri = p.uri;\n }\n p.id = p.id || id; // add an empty attributes object, all playlists are\n // expected to have this.\n\n p.attributes = p.attributes || {}; // setup ID and URI references (URI for backwards compatibility)\n\n main.playlists[p.id] = p;\n main.playlists[p.uri] = p;\n });\n });\n setupMediaPlaylists(main);\n resolveMediaGroupUris(main);\n};\nclass DateRangesStorage {\n constructor() {\n this.offset_ = null;\n this.pendingDateRanges_ = new Map();\n this.processedDateRanges_ = new Map();\n }\n setOffset(segments = []) {\n // already set\n if (this.offset_ !== null) {\n return;\n } // no segment to process\n\n if (!segments.length) {\n return;\n }\n const [firstSegment] = segments; // no program date time\n\n if (firstSegment.programDateTime === undefined) {\n return;\n } // Set offset as ProgramDateTime for the very first segment of the very first playlist load:\n\n this.offset_ = firstSegment.programDateTime / 1000;\n }\n setPendingDateRanges(dateRanges = []) {\n if (!dateRanges.length) {\n return;\n }\n const [dateRange] = dateRanges;\n const startTime = dateRange.startDate.getTime();\n this.trimProcessedDateRanges_(startTime);\n this.pendingDateRanges_ = dateRanges.reduce((map, pendingDateRange) => {\n map.set(pendingDateRange.id, pendingDateRange);\n return map;\n }, new Map());\n }\n processDateRange(dateRange) {\n this.pendingDateRanges_.delete(dateRange.id);\n this.processedDateRanges_.set(dateRange.id, dateRange);\n }\n getDateRangesToProcess() {\n if (this.offset_ === null) {\n return [];\n }\n const dateRangeClasses = {};\n const dateRangesToProcess = [];\n this.pendingDateRanges_.forEach((dateRange, id) => {\n if (this.processedDateRanges_.has(id)) {\n return;\n }\n dateRange.startTime = dateRange.startDate.getTime() / 1000 - this.offset_;\n dateRange.processDateRange = () => this.processDateRange(dateRange);\n dateRangesToProcess.push(dateRange);\n if (!dateRange.class) {\n return;\n }\n if (dateRangeClasses[dateRange.class]) {\n const length = dateRangeClasses[dateRange.class].push(dateRange);\n dateRange.classListIndex = length - 1;\n } else {\n dateRangeClasses[dateRange.class] = [dateRange];\n dateRange.classListIndex = 0;\n }\n });\n for (const dateRange of dateRangesToProcess) {\n const classList = dateRangeClasses[dateRange.class] || [];\n if (dateRange.endDate) {\n dateRange.endTime = dateRange.endDate.getTime() / 1000 - this.offset_;\n } else if (dateRange.endOnNext && classList[dateRange.classListIndex + 1]) {\n dateRange.endTime = classList[dateRange.classListIndex + 1].startTime;\n } else if (dateRange.duration) {\n dateRange.endTime = dateRange.startTime + dateRange.duration;\n } else if (dateRange.plannedDuration) {\n dateRange.endTime = dateRange.startTime + dateRange.plannedDuration;\n } else {\n dateRange.endTime = dateRange.startTime;\n }\n }\n return dateRangesToProcess;\n }\n trimProcessedDateRanges_(startTime) {\n const copy = new Map(this.processedDateRanges_);\n copy.forEach((dateRange, id) => {\n if (dateRange.startDate.getTime() < startTime) {\n this.processedDateRanges_.delete(id);\n }\n });\n }\n}\nconst QUOTA_EXCEEDED_ERR = 22;\nconst getStreamingNetworkErrorMetadata = ({\n requestType,\n request,\n error,\n parseFailure\n}) => {\n const isBadStatus = request.status < 200 || request.status > 299;\n const isFailure = request.status >= 400 && request.status <= 499;\n const errorMetadata = {\n uri: request.uri,\n requestType\n };\n const isBadStatusOrParseFailure = isBadStatus && !isFailure || parseFailure;\n if (error && isFailure) {\n // copy original error and add to the metadata.\n errorMetadata.error = _extends({}, error);\n errorMetadata.errorType = videojs.Error.NetworkRequestFailed;\n } else if (request.aborted) {\n errorMetadata.errorType = videojs.Error.NetworkRequestAborted;\n } else if (request.timedout) {\n errorMetadata.erroType = videojs.Error.NetworkRequestTimeout;\n } else if (isBadStatusOrParseFailure) {\n const errorType = parseFailure ? videojs.Error.NetworkBodyParserFailed : videojs.Error.NetworkBadStatus;\n errorMetadata.errorType = errorType;\n errorMetadata.status = request.status;\n errorMetadata.headers = request.headers;\n }\n return errorMetadata;\n};\nconst {\n EventTarget: EventTarget$1\n} = videojs;\nconst addLLHLSQueryDirectives = (uri, media) => {\n if (media.endList || !media.serverControl) {\n return uri;\n }\n const parameters = {};\n if (media.serverControl.canBlockReload) {\n const {\n preloadSegment\n } = media; // next msn is a zero based value, length is not.\n\n let nextMSN = media.mediaSequence + media.segments.length; // If preload segment has parts then it is likely\n // that we are going to request a part of that preload segment.\n // the logic below is used to determine that.\n\n if (preloadSegment) {\n const parts = preloadSegment.parts || []; // _HLS_part is a zero based index\n\n const nextPart = getKnownPartCount(media) - 1; // if nextPart is > -1 and not equal to just the\n // length of parts, then we know we had part preload hints\n // and we need to add the _HLS_part= query\n\n if (nextPart > -1 && nextPart !== parts.length - 1) {\n // add existing parts to our preload hints\n // eslint-disable-next-line\n parameters._HLS_part = nextPart;\n } // this if statement makes sure that we request the msn\n // of the preload segment if:\n // 1. the preload segment had parts (and was not yet a full segment)\n // but was added to our segments array\n // 2. the preload segment had preload hints for parts that are not in\n // the manifest yet.\n // in all other cases we want the segment after the preload segment\n // which will be given by using media.segments.length because it is 1 based\n // rather than 0 based.\n\n if (nextPart > -1 || parts.length) {\n nextMSN--;\n }\n } // add _HLS_msn= in front of any _HLS_part query\n // eslint-disable-next-line\n\n parameters._HLS_msn = nextMSN;\n }\n if (media.serverControl && media.serverControl.canSkipUntil) {\n // add _HLS_skip= infront of all other queries.\n // eslint-disable-next-line\n parameters._HLS_skip = media.serverControl.canSkipDateranges ? 'v2' : 'YES';\n }\n if (Object.keys(parameters).length) {\n const parsedUri = new window$1.URL(uri);\n ['_HLS_skip', '_HLS_msn', '_HLS_part'].forEach(function (name) {\n if (!parameters.hasOwnProperty(name)) {\n return;\n }\n parsedUri.searchParams.set(name, parameters[name]);\n });\n uri = parsedUri.toString();\n }\n return uri;\n};\n/**\n * Returns a new segment object with properties and\n * the parts array merged.\n *\n * @param {Object} a the old segment\n * @param {Object} b the new segment\n *\n * @return {Object} the merged segment\n */\n\nconst updateSegment = (a, b) => {\n if (!a) {\n return b;\n }\n const result = merge(a, b); // if only the old segment has preload hints\n // and the new one does not, remove preload hints.\n\n if (a.preloadHints && !b.preloadHints) {\n delete result.preloadHints;\n } // if only the old segment has parts\n // then the parts are no longer valid\n\n if (a.parts && !b.parts) {\n delete result.parts; // if both segments have parts\n // copy part propeties from the old segment\n // to the new one.\n } else if (a.parts && b.parts) {\n for (let i = 0; i < b.parts.length; i++) {\n if (a.parts && a.parts[i]) {\n result.parts[i] = merge(a.parts[i], b.parts[i]);\n }\n }\n } // set skipped to false for segments that have\n // have had information merged from the old segment.\n\n if (!a.skipped && b.skipped) {\n result.skipped = false;\n } // set preload to false for segments that have\n // had information added in the new segment.\n\n if (a.preload && !b.preload) {\n result.preload = false;\n }\n return result;\n};\n/**\n * Returns a new array of segments that is the result of merging\n * properties from an older list of segments onto an updated\n * list. No properties on the updated playlist will be ovewritten.\n *\n * @param {Array} original the outdated list of segments\n * @param {Array} update the updated list of segments\n * @param {number=} offset the index of the first update\n * segment in the original segment list. For non-live playlists,\n * this should always be zero and does not need to be\n * specified. For live playlists, it should be the difference\n * between the media sequence numbers in the original and updated\n * playlists.\n * @return {Array} a list of merged segment objects\n */\n\nconst updateSegments = (original, update, offset) => {\n const oldSegments = original.slice();\n const newSegments = update.slice();\n offset = offset || 0;\n const result = [];\n let currentMap;\n for (let newIndex = 0; newIndex < newSegments.length; newIndex++) {\n const oldSegment = oldSegments[newIndex + offset];\n const newSegment = newSegments[newIndex];\n if (oldSegment) {\n currentMap = oldSegment.map || currentMap;\n result.push(updateSegment(oldSegment, newSegment));\n } else {\n // carry over map to new segment if it is missing\n if (currentMap && !newSegment.map) {\n newSegment.map = currentMap;\n }\n result.push(newSegment);\n }\n }\n return result;\n};\nconst resolveSegmentUris = (segment, baseUri) => {\n // preloadSegment will not have a uri at all\n // as the segment isn't actually in the manifest yet, only parts\n if (!segment.resolvedUri && segment.uri) {\n segment.resolvedUri = resolveUrl(baseUri, segment.uri);\n }\n if (segment.key && !segment.key.resolvedUri) {\n segment.key.resolvedUri = resolveUrl(baseUri, segment.key.uri);\n }\n if (segment.map && !segment.map.resolvedUri) {\n segment.map.resolvedUri = resolveUrl(baseUri, segment.map.uri);\n }\n if (segment.map && segment.map.key && !segment.map.key.resolvedUri) {\n segment.map.key.resolvedUri = resolveUrl(baseUri, segment.map.key.uri);\n }\n if (segment.parts && segment.parts.length) {\n segment.parts.forEach(p => {\n if (p.resolvedUri) {\n return;\n }\n p.resolvedUri = resolveUrl(baseUri, p.uri);\n });\n }\n if (segment.preloadHints && segment.preloadHints.length) {\n segment.preloadHints.forEach(p => {\n if (p.resolvedUri) {\n return;\n }\n p.resolvedUri = resolveUrl(baseUri, p.uri);\n });\n }\n};\nconst getAllSegments = function (media) {\n const segments = media.segments || [];\n const preloadSegment = media.preloadSegment; // a preloadSegment with only preloadHints is not currently\n // a usable segment, only include a preloadSegment that has\n // parts.\n\n if (preloadSegment && preloadSegment.parts && preloadSegment.parts.length) {\n // if preloadHints has a MAP that means that the\n // init segment is going to change. We cannot use any of the parts\n // from this preload segment.\n if (preloadSegment.preloadHints) {\n for (let i = 0; i < preloadSegment.preloadHints.length; i++) {\n if (preloadSegment.preloadHints[i].type === 'MAP') {\n return segments;\n }\n }\n } // set the duration for our preload segment to target duration.\n\n preloadSegment.duration = media.targetDuration;\n preloadSegment.preload = true;\n segments.push(preloadSegment);\n }\n return segments;\n}; // consider the playlist unchanged if the playlist object is the same or\n// the number of segments is equal, the media sequence number is unchanged,\n// and this playlist hasn't become the end of the playlist\n\nconst isPlaylistUnchanged = (a, b) => a === b || a.segments && b.segments && a.segments.length === b.segments.length && a.endList === b.endList && a.mediaSequence === b.mediaSequence && a.preloadSegment === b.preloadSegment;\n/**\n * Returns a new main playlist that is the result of merging an\n * updated media playlist into the original version. If the\n * updated media playlist does not match any of the playlist\n * entries in the original main playlist, null is returned.\n *\n * @param {Object} main a parsed main M3U8 object\n * @param {Object} media a parsed media M3U8 object\n * @return {Object} a new object that represents the original\n * main playlist with the updated media playlist merged in, or\n * null if the merge produced no change.\n */\n\nconst updateMain$1 = (main, newMedia, unchangedCheck = isPlaylistUnchanged) => {\n const result = merge(main, {});\n const oldMedia = result.playlists[newMedia.id];\n if (!oldMedia) {\n return null;\n }\n if (unchangedCheck(oldMedia, newMedia)) {\n return null;\n }\n newMedia.segments = getAllSegments(newMedia);\n const mergedPlaylist = merge(oldMedia, newMedia); // always use the new media's preload segment\n\n if (mergedPlaylist.preloadSegment && !newMedia.preloadSegment) {\n delete mergedPlaylist.preloadSegment;\n } // if the update could overlap existing segment information, merge the two segment lists\n\n if (oldMedia.segments) {\n if (newMedia.skip) {\n newMedia.segments = newMedia.segments || []; // add back in objects for skipped segments, so that we merge\n // old properties into the new segments\n\n for (let i = 0; i < newMedia.skip.skippedSegments; i++) {\n newMedia.segments.unshift({\n skipped: true\n });\n }\n }\n mergedPlaylist.segments = updateSegments(oldMedia.segments, newMedia.segments, newMedia.mediaSequence - oldMedia.mediaSequence);\n } // resolve any segment URIs to prevent us from having to do it later\n\n mergedPlaylist.segments.forEach(segment => {\n resolveSegmentUris(segment, mergedPlaylist.resolvedUri);\n }); // TODO Right now in the playlists array there are two references to each playlist, one\n // that is referenced by index, and one by URI. The index reference may no longer be\n // necessary.\n\n for (let i = 0; i < result.playlists.length; i++) {\n if (result.playlists[i].id === newMedia.id) {\n result.playlists[i] = mergedPlaylist;\n }\n }\n result.playlists[newMedia.id] = mergedPlaylist; // URI reference added for backwards compatibility\n\n result.playlists[newMedia.uri] = mergedPlaylist; // update media group playlist references.\n\n forEachMediaGroup(main, (properties, mediaType, groupKey, labelKey) => {\n if (!properties.playlists) {\n return;\n }\n for (let i = 0; i < properties.playlists.length; i++) {\n if (newMedia.id === properties.playlists[i].id) {\n properties.playlists[i] = mergedPlaylist;\n }\n }\n });\n return result;\n};\n/**\n * Calculates the time to wait before refreshing a live playlist\n *\n * @param {Object} media\n * The current media\n * @param {boolean} update\n * True if there were any updates from the last refresh, false otherwise\n * @return {number}\n * The time in ms to wait before refreshing the live playlist\n */\n\nconst refreshDelay = (media, update) => {\n const segments = media.segments || [];\n const lastSegment = segments[segments.length - 1];\n const lastPart = lastSegment && lastSegment.parts && lastSegment.parts[lastSegment.parts.length - 1];\n const lastDuration = lastPart && lastPart.duration || lastSegment && lastSegment.duration;\n if (update && lastDuration) {\n return lastDuration * 1000;\n } // if the playlist is unchanged since the last reload or last segment duration\n // cannot be determined, try again after half the target duration\n\n return (media.partTargetDuration || media.targetDuration || 10) * 500;\n};\nconst playlistMetadataPayload = (playlists, type, isLive) => {\n if (!playlists) {\n return;\n }\n const renditions = [];\n playlists.forEach(playlist => {\n // we need attributes to populate rendition data.\n if (!playlist.attributes) {\n return;\n }\n const {\n BANDWIDTH,\n RESOLUTION,\n CODECS\n } = playlist.attributes;\n renditions.push({\n id: playlist.id,\n bandwidth: BANDWIDTH,\n resolution: RESOLUTION,\n codecs: CODECS\n });\n });\n return {\n type,\n isLive,\n renditions\n };\n};\n/**\n * Load a playlist from a remote location\n *\n * @class PlaylistLoader\n * @extends Stream\n * @param {string|Object} src url or object of manifest\n * @param {boolean} withCredentials the withCredentials xhr option\n * @class\n */\n\nclass PlaylistLoader extends EventTarget$1 {\n constructor(src, vhs, options = {}) {\n super();\n if (!src) {\n throw new Error('A non-empty playlist URL or object is required');\n }\n this.logger_ = logger('PlaylistLoader');\n const {\n withCredentials = false\n } = options;\n this.src = src;\n this.vhs_ = vhs;\n this.withCredentials = withCredentials;\n this.addDateRangesToTextTrack_ = options.addDateRangesToTextTrack;\n const vhsOptions = vhs.options_;\n this.customTagParsers = vhsOptions && vhsOptions.customTagParsers || [];\n this.customTagMappers = vhsOptions && vhsOptions.customTagMappers || [];\n this.llhls = vhsOptions && vhsOptions.llhls;\n this.dateRangesStorage_ = new DateRangesStorage(); // initialize the loader state\n\n this.state = 'HAVE_NOTHING'; // live playlist staleness timeout\n\n this.handleMediaupdatetimeout_ = this.handleMediaupdatetimeout_.bind(this);\n this.on('mediaupdatetimeout', this.handleMediaupdatetimeout_);\n this.on('loadedplaylist', this.handleLoadedPlaylist_.bind(this));\n }\n handleLoadedPlaylist_() {\n const mediaPlaylist = this.media();\n if (!mediaPlaylist) {\n return;\n }\n this.dateRangesStorage_.setOffset(mediaPlaylist.segments);\n this.dateRangesStorage_.setPendingDateRanges(mediaPlaylist.dateRanges);\n const availableDateRanges = this.dateRangesStorage_.getDateRangesToProcess();\n if (!availableDateRanges.length || !this.addDateRangesToTextTrack_) {\n return;\n }\n this.addDateRangesToTextTrack_(availableDateRanges);\n }\n handleMediaupdatetimeout_() {\n if (this.state !== 'HAVE_METADATA') {\n // only refresh the media playlist if no other activity is going on\n return;\n }\n const media = this.media();\n let uri = resolveUrl(this.main.uri, media.uri);\n if (this.llhls) {\n uri = addLLHLSQueryDirectives(uri, media);\n }\n this.state = 'HAVE_CURRENT_METADATA';\n this.request = this.vhs_.xhr({\n uri,\n withCredentials: this.withCredentials,\n requestType: 'hls-playlist'\n }, (error, req) => {\n // disposed\n if (!this.request) {\n return;\n }\n if (error) {\n return this.playlistRequestError(this.request, this.media(), 'HAVE_METADATA');\n }\n this.haveMetadata({\n playlistString: this.request.responseText,\n url: this.media().uri,\n id: this.media().id\n });\n });\n }\n playlistRequestError(xhr, playlist, startingState) {\n const {\n uri,\n id\n } = playlist; // any in-flight request is now finished\n\n this.request = null;\n if (startingState) {\n this.state = startingState;\n }\n this.error = {\n playlist: this.main.playlists[id],\n status: xhr.status,\n message: `HLS playlist request error at URL: ${uri}.`,\n responseText: xhr.responseText,\n code: xhr.status >= 500 ? 4 : 2,\n metadata: getStreamingNetworkErrorMetadata({\n requestType: xhr.requestType,\n request: xhr,\n error: xhr.error\n })\n };\n this.trigger('error');\n }\n parseManifest_({\n url,\n manifestString\n }) {\n try {\n return parseManifest({\n onwarn: ({\n message\n }) => this.logger_(`m3u8-parser warn for ${url}: ${message}`),\n oninfo: ({\n message\n }) => this.logger_(`m3u8-parser info for ${url}: ${message}`),\n manifestString,\n customTagParsers: this.customTagParsers,\n customTagMappers: this.customTagMappers,\n llhls: this.llhls\n });\n } catch (error) {\n this.error = error;\n this.error.metadata = {\n errorType: videojs.Error.StreamingHlsPlaylistParserError,\n error\n };\n }\n }\n /**\n * Update the playlist loader's state in response to a new or updated playlist.\n *\n * @param {string} [playlistString]\n * Playlist string (if playlistObject is not provided)\n * @param {Object} [playlistObject]\n * Playlist object (if playlistString is not provided)\n * @param {string} url\n * URL of playlist\n * @param {string} id\n * ID to use for playlist\n */\n\n haveMetadata({\n playlistString,\n playlistObject,\n url,\n id\n }) {\n // any in-flight request is now finished\n this.request = null;\n this.state = 'HAVE_METADATA';\n const metadata = {\n playlistInfo: {\n type: 'media',\n uri: url\n }\n };\n this.trigger({\n type: 'playlistparsestart',\n metadata\n });\n const playlist = playlistObject || this.parseManifest_({\n url,\n manifestString: playlistString\n });\n playlist.lastRequest = Date.now();\n setupMediaPlaylist({\n playlist,\n uri: url,\n id\n }); // merge this playlist into the main manifest\n\n const update = updateMain$1(this.main, playlist);\n this.targetDuration = playlist.partTargetDuration || playlist.targetDuration;\n this.pendingMedia_ = null;\n if (update) {\n this.main = update;\n this.media_ = this.main.playlists[id];\n } else {\n this.trigger('playlistunchanged');\n }\n this.updateMediaUpdateTimeout_(refreshDelay(this.media(), !!update));\n metadata.parsedPlaylist = playlistMetadataPayload(this.main.playlists, metadata.playlistInfo.type, !this.media_.endList);\n this.trigger({\n type: 'playlistparsecomplete',\n metadata\n });\n this.trigger('loadedplaylist');\n }\n /**\n * Abort any outstanding work and clean up.\n */\n\n dispose() {\n this.trigger('dispose');\n this.stopRequest();\n window$1.clearTimeout(this.mediaUpdateTimeout);\n window$1.clearTimeout(this.finalRenditionTimeout);\n this.dateRangesStorage_ = new DateRangesStorage();\n this.off();\n }\n stopRequest() {\n if (this.request) {\n const oldRequest = this.request;\n this.request = null;\n oldRequest.onreadystatechange = null;\n oldRequest.abort();\n }\n }\n /**\n * When called without any arguments, returns the currently\n * active media playlist. When called with a single argument,\n * triggers the playlist loader to asynchronously switch to the\n * specified media playlist. Calling this method while the\n * loader is in the HAVE_NOTHING causes an error to be emitted\n * but otherwise has no effect.\n *\n * @param {Object=} playlist the parsed media playlist\n * object to switch to\n * @param {boolean=} shouldDelay whether we should delay the request by half target duration\n *\n * @return {Playlist} the current loaded media\n */\n\n media(playlist, shouldDelay) {\n // getter\n if (!playlist) {\n return this.media_;\n } // setter\n\n if (this.state === 'HAVE_NOTHING') {\n throw new Error('Cannot switch media playlist from ' + this.state);\n } // find the playlist object if the target playlist has been\n // specified by URI\n\n if (typeof playlist === 'string') {\n if (!this.main.playlists[playlist]) {\n throw new Error('Unknown playlist URI: ' + playlist);\n }\n playlist = this.main.playlists[playlist];\n }\n window$1.clearTimeout(this.finalRenditionTimeout);\n if (shouldDelay) {\n const delay = (playlist.partTargetDuration || playlist.targetDuration) / 2 * 1000 || 5 * 1000;\n this.finalRenditionTimeout = window$1.setTimeout(this.media.bind(this, playlist, false), delay);\n return;\n }\n const startingState = this.state;\n const mediaChange = !this.media_ || playlist.id !== this.media_.id;\n const mainPlaylistRef = this.main.playlists[playlist.id]; // switch to fully loaded playlists immediately\n\n if (mainPlaylistRef && mainPlaylistRef.endList ||\n // handle the case of a playlist object (e.g., if using vhs-json with a resolved\n // media playlist or, for the case of demuxed audio, a resolved audio media group)\n playlist.endList && playlist.segments.length) {\n // abort outstanding playlist requests\n if (this.request) {\n this.request.onreadystatechange = null;\n this.request.abort();\n this.request = null;\n }\n this.state = 'HAVE_METADATA';\n this.media_ = playlist; // trigger media change if the active media has been updated\n\n if (mediaChange) {\n this.trigger('mediachanging');\n if (startingState === 'HAVE_MAIN_MANIFEST') {\n // The initial playlist was a main manifest, and the first media selected was\n // also provided (in the form of a resolved playlist object) as part of the\n // source object (rather than just a URL). Therefore, since the media playlist\n // doesn't need to be requested, loadedmetadata won't trigger as part of the\n // normal flow, and needs an explicit trigger here.\n this.trigger('loadedmetadata');\n } else {\n this.trigger('mediachange');\n }\n }\n return;\n } // We update/set the timeout here so that live playlists\n // that are not a media change will \"start\" the loader as expected.\n // We expect that this function will start the media update timeout\n // cycle again. This also prevents a playlist switch failure from\n // causing us to stall during live.\n\n this.updateMediaUpdateTimeout_(refreshDelay(playlist, true)); // switching to the active playlist is a no-op\n\n if (!mediaChange) {\n return;\n }\n this.state = 'SWITCHING_MEDIA'; // there is already an outstanding playlist request\n\n if (this.request) {\n if (playlist.resolvedUri === this.request.url) {\n // requesting to switch to the same playlist multiple times\n // has no effect after the first\n return;\n }\n this.request.onreadystatechange = null;\n this.request.abort();\n this.request = null;\n } // request the new playlist\n\n if (this.media_) {\n this.trigger('mediachanging');\n }\n this.pendingMedia_ = playlist;\n const metadata = {\n playlistInfo: {\n type: 'media',\n uri: playlist.uri\n }\n };\n this.trigger({\n type: 'playlistrequeststart',\n metadata\n });\n this.request = this.vhs_.xhr({\n uri: playlist.resolvedUri,\n withCredentials: this.withCredentials,\n requestType: 'hls-playlist'\n }, (error, req) => {\n // disposed\n if (!this.request) {\n return;\n }\n playlist.lastRequest = Date.now();\n playlist.resolvedUri = resolveManifestRedirect(playlist.resolvedUri, req);\n if (error) {\n return this.playlistRequestError(this.request, playlist, startingState);\n }\n this.trigger({\n type: 'playlistrequestcomplete',\n metadata\n });\n this.haveMetadata({\n playlistString: req.responseText,\n url: playlist.uri,\n id: playlist.id\n }); // fire loadedmetadata the first time a media playlist is loaded\n\n if (startingState === 'HAVE_MAIN_MANIFEST') {\n this.trigger('loadedmetadata');\n } else {\n this.trigger('mediachange');\n }\n });\n }\n /**\n * pause loading of the playlist\n */\n\n pause() {\n if (this.mediaUpdateTimeout) {\n window$1.clearTimeout(this.mediaUpdateTimeout);\n this.mediaUpdateTimeout = null;\n }\n this.stopRequest();\n if (this.state === 'HAVE_NOTHING') {\n // If we pause the loader before any data has been retrieved, its as if we never\n // started, so reset to an unstarted state.\n this.started = false;\n } // Need to restore state now that no activity is happening\n\n if (this.state === 'SWITCHING_MEDIA') {\n // if the loader was in the process of switching media, it should either return to\n // HAVE_MAIN_MANIFEST or HAVE_METADATA depending on if the loader has loaded a media\n // playlist yet. This is determined by the existence of loader.media_\n if (this.media_) {\n this.state = 'HAVE_METADATA';\n } else {\n this.state = 'HAVE_MAIN_MANIFEST';\n }\n } else if (this.state === 'HAVE_CURRENT_METADATA') {\n this.state = 'HAVE_METADATA';\n }\n }\n /**\n * start loading of the playlist\n */\n\n load(shouldDelay) {\n if (this.mediaUpdateTimeout) {\n window$1.clearTimeout(this.mediaUpdateTimeout);\n this.mediaUpdateTimeout = null;\n }\n const media = this.media();\n if (shouldDelay) {\n const delay = media ? (media.partTargetDuration || media.targetDuration) / 2 * 1000 : 5 * 1000;\n this.mediaUpdateTimeout = window$1.setTimeout(() => {\n this.mediaUpdateTimeout = null;\n this.load();\n }, delay);\n return;\n }\n if (!this.started) {\n this.start();\n return;\n }\n if (media && !media.endList) {\n this.trigger('mediaupdatetimeout');\n } else {\n this.trigger('loadedplaylist');\n }\n }\n updateMediaUpdateTimeout_(delay) {\n if (this.mediaUpdateTimeout) {\n window$1.clearTimeout(this.mediaUpdateTimeout);\n this.mediaUpdateTimeout = null;\n } // we only have use mediaupdatetimeout for live playlists.\n\n if (!this.media() || this.media().endList) {\n return;\n }\n this.mediaUpdateTimeout = window$1.setTimeout(() => {\n this.mediaUpdateTimeout = null;\n this.trigger('mediaupdatetimeout');\n this.updateMediaUpdateTimeout_(delay);\n }, delay);\n }\n /**\n * start loading of the playlist\n */\n\n start() {\n this.started = true;\n if (typeof this.src === 'object') {\n // in the case of an entirely constructed manifest object (meaning there's no actual\n // manifest on a server), default the uri to the page's href\n if (!this.src.uri) {\n this.src.uri = window$1.location.href;\n } // resolvedUri is added on internally after the initial request. Since there's no\n // request for pre-resolved manifests, add on resolvedUri here.\n\n this.src.resolvedUri = this.src.uri; // Since a manifest object was passed in as the source (instead of a URL), the first\n // request can be skipped (since the top level of the manifest, at a minimum, is\n // already available as a parsed manifest object). However, if the manifest object\n // represents a main playlist, some media playlists may need to be resolved before\n // the starting segment list is available. Therefore, go directly to setup of the\n // initial playlist, and let the normal flow continue from there.\n //\n // Note that the call to setup is asynchronous, as other sections of VHS may assume\n // that the first request is asynchronous.\n\n setTimeout(() => {\n this.setupInitialPlaylist(this.src);\n }, 0);\n return;\n }\n const metadata = {\n playlistInfo: {\n type: 'multivariant',\n uri: this.src\n }\n };\n this.trigger({\n type: 'playlistrequeststart',\n metadata\n }); // request the specified URL\n\n this.request = this.vhs_.xhr({\n uri: this.src,\n withCredentials: this.withCredentials,\n requestType: 'hls-playlist'\n }, (error, req) => {\n // disposed\n if (!this.request) {\n return;\n } // clear the loader's request reference\n\n this.request = null;\n if (error) {\n this.error = {\n status: req.status,\n message: `HLS playlist request error at URL: ${this.src}.`,\n responseText: req.responseText,\n // MEDIA_ERR_NETWORK\n code: 2,\n metadata: getStreamingNetworkErrorMetadata({\n requestType: req.requestType,\n request: req,\n error\n })\n };\n if (this.state === 'HAVE_NOTHING') {\n this.started = false;\n }\n return this.trigger('error');\n }\n this.trigger({\n type: 'playlistrequestcomplete',\n metadata\n });\n this.src = resolveManifestRedirect(this.src, req);\n this.trigger({\n type: 'playlistparsestart',\n metadata\n });\n const manifest = this.parseManifest_({\n manifestString: req.responseText,\n url: this.src\n }); // we haven't loaded any variant playlists here so we default to false for isLive.\n\n metadata.parsedPlaylist = playlistMetadataPayload(manifest.playlists, metadata.playlistInfo.type, false);\n this.trigger({\n type: 'playlistparsecomplete',\n metadata\n });\n this.setupInitialPlaylist(manifest);\n });\n }\n srcUri() {\n return typeof this.src === 'string' ? this.src : this.src.uri;\n }\n /**\n * Given a manifest object that's either a main or media playlist, trigger the proper\n * events and set the state of the playlist loader.\n *\n * If the manifest object represents a main playlist, `loadedplaylist` will be\n * triggered to allow listeners to select a playlist. If none is selected, the loader\n * will default to the first one in the playlists array.\n *\n * If the manifest object represents a media playlist, `loadedplaylist` will be\n * triggered followed by `loadedmetadata`, as the only available playlist is loaded.\n *\n * In the case of a media playlist, a main playlist object wrapper with one playlist\n * will be created so that all logic can handle playlists in the same fashion (as an\n * assumed manifest object schema).\n *\n * @param {Object} manifest\n * The parsed manifest object\n */\n\n setupInitialPlaylist(manifest) {\n this.state = 'HAVE_MAIN_MANIFEST';\n if (manifest.playlists) {\n this.main = manifest;\n addPropertiesToMain(this.main, this.srcUri()); // If the initial main playlist has playlists wtih segments already resolved,\n // then resolve URIs in advance, as they are usually done after a playlist request,\n // which may not happen if the playlist is resolved.\n\n manifest.playlists.forEach(playlist => {\n playlist.segments = getAllSegments(playlist);\n playlist.segments.forEach(segment => {\n resolveSegmentUris(segment, playlist.resolvedUri);\n });\n });\n this.trigger('loadedplaylist');\n if (!this.request) {\n // no media playlist was specifically selected so start\n // from the first listed one\n this.media(this.main.playlists[0]);\n }\n return;\n } // In order to support media playlists passed in as vhs-json, the case where the uri\n // is not provided as part of the manifest should be considered, and an appropriate\n // default used.\n\n const uri = this.srcUri() || window$1.location.href;\n this.main = mainForMedia(manifest, uri);\n this.haveMetadata({\n playlistObject: manifest,\n url: uri,\n id: this.main.playlists[0].id\n });\n this.trigger('loadedmetadata');\n }\n /**\n * Updates or deletes a preexisting pathway clone.\n * Ensures that all playlists related to the old pathway clone are\n * either updated or deleted.\n *\n * @param {Object} clone On update, the pathway clone object for the newly updated pathway clone.\n * On delete, the old pathway clone object to be deleted.\n * @param {boolean} isUpdate True if the pathway is to be updated,\n * false if it is meant to be deleted.\n */\n\n updateOrDeleteClone(clone, isUpdate) {\n const main = this.main;\n const pathway = clone.ID;\n let i = main.playlists.length; // Iterate backwards through the playlist so we can remove playlists if necessary.\n\n while (i--) {\n const p = main.playlists[i];\n if (p.attributes['PATHWAY-ID'] === pathway) {\n const oldPlaylistUri = p.resolvedUri;\n const oldPlaylistId = p.id; // update the indexed playlist and add new playlists by ID and URI\n\n if (isUpdate) {\n const newPlaylistUri = this.createCloneURI_(p.resolvedUri, clone);\n const newPlaylistId = createPlaylistID(pathway, newPlaylistUri);\n const attributes = this.createCloneAttributes_(pathway, p.attributes);\n const updatedPlaylist = this.createClonePlaylist_(p, newPlaylistId, clone, attributes);\n main.playlists[i] = updatedPlaylist;\n main.playlists[newPlaylistId] = updatedPlaylist;\n main.playlists[newPlaylistUri] = updatedPlaylist;\n } else {\n // Remove the indexed playlist.\n main.playlists.splice(i, 1);\n } // Remove playlists by the old ID and URI.\n\n delete main.playlists[oldPlaylistId];\n delete main.playlists[oldPlaylistUri];\n }\n }\n this.updateOrDeleteCloneMedia(clone, isUpdate);\n }\n /**\n * Updates or deletes media data based on the pathway clone object.\n * Due to the complexity of the media groups and playlists, in all cases\n * we remove all of the old media groups and playlists.\n * On updates, we then create new media groups and playlists based on the\n * new pathway clone object.\n *\n * @param {Object} clone The pathway clone object for the newly updated pathway clone.\n * @param {boolean} isUpdate True if the pathway is to be updated,\n * false if it is meant to be deleted.\n */\n\n updateOrDeleteCloneMedia(clone, isUpdate) {\n const main = this.main;\n const id = clone.ID;\n ['AUDIO', 'SUBTITLES', 'CLOSED-CAPTIONS'].forEach(mediaType => {\n if (!main.mediaGroups[mediaType] || !main.mediaGroups[mediaType][id]) {\n return;\n }\n for (const groupKey in main.mediaGroups[mediaType]) {\n // Remove all media playlists for the media group for this pathway clone.\n if (groupKey === id) {\n for (const labelKey in main.mediaGroups[mediaType][groupKey]) {\n const oldMedia = main.mediaGroups[mediaType][groupKey][labelKey];\n oldMedia.playlists.forEach((p, i) => {\n const oldMediaPlaylist = main.playlists[p.id];\n const oldPlaylistId = oldMediaPlaylist.id;\n const oldPlaylistUri = oldMediaPlaylist.resolvedUri;\n delete main.playlists[oldPlaylistId];\n delete main.playlists[oldPlaylistUri];\n });\n } // Delete the old media group.\n\n delete main.mediaGroups[mediaType][groupKey];\n }\n }\n }); // Create the new media groups and playlists if there is an update.\n\n if (isUpdate) {\n this.createClonedMediaGroups_(clone);\n }\n }\n /**\n * Given a pathway clone object, clones all necessary playlists.\n *\n * @param {Object} clone The pathway clone object.\n * @param {Object} basePlaylist The original playlist to clone from.\n */\n\n addClonePathway(clone, basePlaylist = {}) {\n const main = this.main;\n const index = main.playlists.length;\n const uri = this.createCloneURI_(basePlaylist.resolvedUri, clone);\n const playlistId = createPlaylistID(clone.ID, uri);\n const attributes = this.createCloneAttributes_(clone.ID, basePlaylist.attributes);\n const playlist = this.createClonePlaylist_(basePlaylist, playlistId, clone, attributes);\n main.playlists[index] = playlist; // add playlist by ID and URI\n\n main.playlists[playlistId] = playlist;\n main.playlists[uri] = playlist;\n this.createClonedMediaGroups_(clone);\n }\n /**\n * Given a pathway clone object we create clones of all media.\n * In this function, all necessary information and updated playlists\n * are added to the `mediaGroup` object.\n * Playlists are also added to the `playlists` array so the media groups\n * will be properly linked.\n *\n * @param {Object} clone The pathway clone object.\n */\n\n createClonedMediaGroups_(clone) {\n const id = clone.ID;\n const baseID = clone['BASE-ID'];\n const main = this.main;\n ['AUDIO', 'SUBTITLES', 'CLOSED-CAPTIONS'].forEach(mediaType => {\n // If the media type doesn't exist, or there is already a clone, skip\n // to the next media type.\n if (!main.mediaGroups[mediaType] || main.mediaGroups[mediaType][id]) {\n return;\n }\n for (const groupKey in main.mediaGroups[mediaType]) {\n if (groupKey === baseID) {\n // Create the group.\n main.mediaGroups[mediaType][id] = {};\n } else {\n // There is no need to iterate over label keys in this case.\n continue;\n }\n for (const labelKey in main.mediaGroups[mediaType][groupKey]) {\n const oldMedia = main.mediaGroups[mediaType][groupKey][labelKey];\n main.mediaGroups[mediaType][id][labelKey] = _extends({}, oldMedia);\n const newMedia = main.mediaGroups[mediaType][id][labelKey]; // update URIs on the media\n\n const newUri = this.createCloneURI_(oldMedia.resolvedUri, clone);\n newMedia.resolvedUri = newUri;\n newMedia.uri = newUri; // Reset playlists in the new media group.\n\n newMedia.playlists = []; // Create new playlists in the newly cloned media group.\n\n oldMedia.playlists.forEach((p, i) => {\n const oldMediaPlaylist = main.playlists[p.id];\n const group = groupID(mediaType, id, labelKey);\n const newPlaylistID = createPlaylistID(id, group); // Check to see if it already exists\n\n if (oldMediaPlaylist && !main.playlists[newPlaylistID]) {\n const newMediaPlaylist = this.createClonePlaylist_(oldMediaPlaylist, newPlaylistID, clone);\n const newPlaylistUri = newMediaPlaylist.resolvedUri;\n main.playlists[newPlaylistID] = newMediaPlaylist;\n main.playlists[newPlaylistUri] = newMediaPlaylist;\n }\n newMedia.playlists[i] = this.createClonePlaylist_(p, newPlaylistID, clone);\n });\n }\n }\n });\n }\n /**\n * Using the original playlist to be cloned, and the pathway clone object\n * information, we create a new playlist.\n *\n * @param {Object} basePlaylist The original playlist to be cloned from.\n * @param {string} id The desired id of the newly cloned playlist.\n * @param {Object} clone The pathway clone object.\n * @param {Object} attributes An optional object to populate the `attributes` property in the playlist.\n *\n * @return {Object} The combined cloned playlist.\n */\n\n createClonePlaylist_(basePlaylist, id, clone, attributes) {\n const uri = this.createCloneURI_(basePlaylist.resolvedUri, clone);\n const newProps = {\n resolvedUri: uri,\n uri,\n id\n }; // Remove all segments from previous playlist in the clone.\n\n if (basePlaylist.segments) {\n newProps.segments = [];\n }\n if (attributes) {\n newProps.attributes = attributes;\n }\n return merge(basePlaylist, newProps);\n }\n /**\n * Generates an updated URI for a cloned pathway based on the original\n * pathway's URI and the paramaters from the pathway clone object in the\n * content steering server response.\n *\n * @param {string} baseUri URI to be updated in the cloned pathway.\n * @param {Object} clone The pathway clone object.\n *\n * @return {string} The updated URI for the cloned pathway.\n */\n\n createCloneURI_(baseURI, clone) {\n const uri = new URL(baseURI);\n uri.hostname = clone['URI-REPLACEMENT'].HOST;\n const params = clone['URI-REPLACEMENT'].PARAMS; // Add params to the cloned URL.\n\n for (const key of Object.keys(params)) {\n uri.searchParams.set(key, params[key]);\n }\n return uri.href;\n }\n /**\n * Helper function to create the attributes needed for the new clone.\n * This mainly adds the necessary media attributes.\n *\n * @param {string} id The pathway clone object ID.\n * @param {Object} oldAttributes The old attributes to compare to.\n * @return {Object} The new attributes to add to the playlist.\n */\n\n createCloneAttributes_(id, oldAttributes) {\n const attributes = {\n ['PATHWAY-ID']: id\n };\n ['AUDIO', 'SUBTITLES', 'CLOSED-CAPTIONS'].forEach(mediaType => {\n if (oldAttributes[mediaType]) {\n attributes[mediaType] = id;\n }\n });\n return attributes;\n }\n /**\n * Returns the key ID set from a playlist\n *\n * @param {playlist} playlist to fetch the key ID set from.\n * @return a Set of 32 digit hex strings that represent the unique keyIds for that playlist.\n */\n\n getKeyIdSet(playlist) {\n if (playlist.contentProtection) {\n const keyIds = new Set();\n for (const keysystem in playlist.contentProtection) {\n const keyId = playlist.contentProtection[keysystem].attributes.keyId;\n if (keyId) {\n keyIds.add(keyId.toLowerCase());\n }\n }\n return keyIds;\n }\n }\n}\n\n/**\n * @file xhr.js\n */\n\nconst callbackWrapper = function (request, error, response, callback) {\n const reqResponse = request.responseType === 'arraybuffer' ? request.response : request.responseText;\n if (!error && reqResponse) {\n request.responseTime = Date.now();\n request.roundTripTime = request.responseTime - request.requestTime;\n request.bytesReceived = reqResponse.byteLength || reqResponse.length;\n if (!request.bandwidth) {\n request.bandwidth = Math.floor(request.bytesReceived / request.roundTripTime * 8 * 1000);\n }\n }\n if (response.headers) {\n request.responseHeaders = response.headers;\n } // videojs.xhr now uses a specific code on the error\n // object to signal that a request has timed out instead\n // of setting a boolean on the request object\n\n if (error && error.code === 'ETIMEDOUT') {\n request.timedout = true;\n } // videojs.xhr no longer considers status codes outside of 200 and 0\n // (for file uris) to be errors, but the old XHR did, so emulate that\n // behavior. Status 206 may be used in response to byterange requests.\n\n if (!error && !request.aborted && response.statusCode !== 200 && response.statusCode !== 206 && response.statusCode !== 0) {\n error = new Error('XHR Failed with a response of: ' + (request && (reqResponse || request.responseText)));\n }\n callback(error, request);\n};\n/**\n * Iterates over the request hooks Set and calls them in order\n *\n * @param {Set} hooks the hook Set to iterate over\n * @param {Object} options the request options to pass to the xhr wrapper\n * @return the callback hook function return value, the modified or new options Object.\n */\n\nconst callAllRequestHooks = (requestSet, options) => {\n if (!requestSet || !requestSet.size) {\n return;\n }\n let newOptions = options;\n requestSet.forEach(requestCallback => {\n newOptions = requestCallback(newOptions);\n });\n return newOptions;\n};\n/**\n * Iterates over the response hooks Set and calls them in order.\n *\n * @param {Set} hooks the hook Set to iterate over\n * @param {Object} request the xhr request object\n * @param {Object} error the xhr error object\n * @param {Object} response the xhr response object\n */\n\nconst callAllResponseHooks = (responseSet, request, error, response) => {\n if (!responseSet || !responseSet.size) {\n return;\n }\n responseSet.forEach(responseCallback => {\n responseCallback(request, error, response);\n });\n};\nconst xhrFactory = function () {\n const xhr = function XhrFunction(options, callback) {\n // Add a default timeout\n options = merge({\n timeout: 45e3\n }, options); // Allow an optional user-specified function to modify the option\n // object before we construct the xhr request\n // TODO: Remove beforeRequest in the next major release.\n\n const beforeRequest = XhrFunction.beforeRequest || videojs.Vhs.xhr.beforeRequest; // onRequest and onResponse hooks as a Set, at either the player or global level.\n // TODO: new Set added here for beforeRequest alias. Remove this when beforeRequest is removed.\n\n const _requestCallbackSet = XhrFunction._requestCallbackSet || videojs.Vhs.xhr._requestCallbackSet || new Set();\n const _responseCallbackSet = XhrFunction._responseCallbackSet || videojs.Vhs.xhr._responseCallbackSet;\n if (beforeRequest && typeof beforeRequest === 'function') {\n videojs.log.warn('beforeRequest is deprecated, use onRequest instead.');\n _requestCallbackSet.add(beforeRequest);\n } // Use the standard videojs.xhr() method unless `videojs.Vhs.xhr` has been overriden\n // TODO: switch back to videojs.Vhs.xhr.name === 'XhrFunction' when we drop IE11\n\n const xhrMethod = videojs.Vhs.xhr.original === true ? videojs.xhr : videojs.Vhs.xhr; // call all registered onRequest hooks, assign new options.\n\n const beforeRequestOptions = callAllRequestHooks(_requestCallbackSet, options); // Remove the beforeRequest function from the hooks set so stale beforeRequest functions are not called.\n\n _requestCallbackSet.delete(beforeRequest); // xhrMethod will call XMLHttpRequest.open and XMLHttpRequest.send\n\n const request = xhrMethod(beforeRequestOptions || options, function (error, response) {\n // call all registered onResponse hooks\n callAllResponseHooks(_responseCallbackSet, request, error, response);\n return callbackWrapper(request, error, response, callback);\n });\n const originalAbort = request.abort;\n request.abort = function () {\n request.aborted = true;\n return originalAbort.apply(request, arguments);\n };\n request.uri = options.uri;\n request.requestType = options.requestType;\n request.requestTime = Date.now();\n return request;\n };\n xhr.original = true;\n return xhr;\n};\n/**\n * Turns segment byterange into a string suitable for use in\n * HTTP Range requests\n *\n * @param {Object} byterange - an object with two values defining the start and end\n * of a byte-range\n */\n\nconst byterangeStr = function (byterange) {\n // `byterangeEnd` is one less than `offset + length` because the HTTP range\n // header uses inclusive ranges\n let byterangeEnd;\n const byterangeStart = byterange.offset;\n if (typeof byterange.offset === 'bigint' || typeof byterange.length === 'bigint') {\n byterangeEnd = window$1.BigInt(byterange.offset) + window$1.BigInt(byterange.length) - window$1.BigInt(1);\n } else {\n byterangeEnd = byterange.offset + byterange.length - 1;\n }\n return 'bytes=' + byterangeStart + '-' + byterangeEnd;\n};\n/**\n * Defines headers for use in the xhr request for a particular segment.\n *\n * @param {Object} segment - a simplified copy of the segmentInfo object\n * from SegmentLoader\n */\n\nconst segmentXhrHeaders = function (segment) {\n const headers = {};\n if (segment.byterange) {\n headers.Range = byterangeStr(segment.byterange);\n }\n return headers;\n};\n\n/**\n * @file bin-utils.js\n */\n\n/**\n * convert a TimeRange to text\n *\n * @param {TimeRange} range the timerange to use for conversion\n * @param {number} i the iterator on the range to convert\n * @return {string} the range in string format\n */\n\nconst textRange = function (range, i) {\n return range.start(i) + '-' + range.end(i);\n};\n/**\n * format a number as hex string\n *\n * @param {number} e The number\n * @param {number} i the iterator\n * @return {string} the hex formatted number as a string\n */\n\nconst formatHexString = function (e, i) {\n const value = e.toString(16);\n return '00'.substring(0, 2 - value.length) + value + (i % 2 ? ' ' : '');\n};\nconst formatAsciiString = function (e) {\n if (e >= 0x20 && e < 0x7e) {\n return String.fromCharCode(e);\n }\n return '.';\n};\n/**\n * Creates an object for sending to a web worker modifying properties that are TypedArrays\n * into a new object with seperated properties for the buffer, byteOffset, and byteLength.\n *\n * @param {Object} message\n * Object of properties and values to send to the web worker\n * @return {Object}\n * Modified message with TypedArray values expanded\n * @function createTransferableMessage\n */\n\nconst createTransferableMessage = function (message) {\n const transferable = {};\n Object.keys(message).forEach(key => {\n const value = message[key];\n if (isArrayBufferView(value)) {\n transferable[key] = {\n bytes: value.buffer,\n byteOffset: value.byteOffset,\n byteLength: value.byteLength\n };\n } else {\n transferable[key] = value;\n }\n });\n return transferable;\n};\n/**\n * Returns a unique string identifier for a media initialization\n * segment.\n *\n * @param {Object} initSegment\n * the init segment object.\n *\n * @return {string} the generated init segment id\n */\n\nconst initSegmentId = function (initSegment) {\n const byterange = initSegment.byterange || {\n length: Infinity,\n offset: 0\n };\n return [byterange.length, byterange.offset, initSegment.resolvedUri].join(',');\n};\n/**\n * Returns a unique string identifier for a media segment key.\n *\n * @param {Object} key the encryption key\n * @return {string} the unique id for the media segment key.\n */\n\nconst segmentKeyId = function (key) {\n return key.resolvedUri;\n};\n/**\n * utils to help dump binary data to the console\n *\n * @param {Array|TypedArray} data\n * data to dump to a string\n *\n * @return {string} the data as a hex string.\n */\n\nconst hexDump = data => {\n const bytes = Array.prototype.slice.call(data);\n const step = 16;\n let result = '';\n let hex;\n let ascii;\n for (let j = 0; j < bytes.length / step; j++) {\n hex = bytes.slice(j * step, j * step + step).map(formatHexString).join('');\n ascii = bytes.slice(j * step, j * step + step).map(formatAsciiString).join('');\n result += hex + ' ' + ascii + '\\n';\n }\n return result;\n};\nconst tagDump = ({\n bytes\n}) => hexDump(bytes);\nconst textRanges = ranges => {\n let result = '';\n let i;\n for (i = 0; i < ranges.length; i++) {\n result += textRange(ranges, i) + ' ';\n }\n return result;\n};\nvar utils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n createTransferableMessage: createTransferableMessage,\n initSegmentId: initSegmentId,\n segmentKeyId: segmentKeyId,\n hexDump: hexDump,\n tagDump: tagDump,\n textRanges: textRanges\n});\n\n// TODO handle fmp4 case where the timing info is accurate and doesn't involve transmux\n// 25% was arbitrarily chosen, and may need to be refined over time.\n\nconst SEGMENT_END_FUDGE_PERCENT = 0.25;\n/**\n * Converts a player time (any time that can be gotten/set from player.currentTime(),\n * e.g., any time within player.seekable().start(0) to player.seekable().end(0)) to a\n * program time (any time referencing the real world (e.g., EXT-X-PROGRAM-DATE-TIME)).\n *\n * The containing segment is required as the EXT-X-PROGRAM-DATE-TIME serves as an \"anchor\n * point\" (a point where we have a mapping from program time to player time, with player\n * time being the post transmux start of the segment).\n *\n * For more details, see [this doc](../../docs/program-time-from-player-time.md).\n *\n * @param {number} playerTime the player time\n * @param {Object} segment the segment which contains the player time\n * @return {Date} program time\n */\n\nconst playerTimeToProgramTime = (playerTime, segment) => {\n if (!segment.dateTimeObject) {\n // Can't convert without an \"anchor point\" for the program time (i.e., a time that can\n // be used to map the start of a segment with a real world time).\n return null;\n }\n const transmuxerPrependedSeconds = segment.videoTimingInfo.transmuxerPrependedSeconds;\n const transmuxedStart = segment.videoTimingInfo.transmuxedPresentationStart; // get the start of the content from before old content is prepended\n\n const startOfSegment = transmuxedStart + transmuxerPrependedSeconds;\n const offsetFromSegmentStart = playerTime - startOfSegment;\n return new Date(segment.dateTimeObject.getTime() + offsetFromSegmentStart * 1000);\n};\nconst originalSegmentVideoDuration = videoTimingInfo => {\n return videoTimingInfo.transmuxedPresentationEnd - videoTimingInfo.transmuxedPresentationStart - videoTimingInfo.transmuxerPrependedSeconds;\n};\n/**\n * Finds a segment that contains the time requested given as an ISO-8601 string. The\n * returned segment might be an estimate or an accurate match.\n *\n * @param {string} programTime The ISO-8601 programTime to find a match for\n * @param {Object} playlist A playlist object to search within\n */\n\nconst findSegmentForProgramTime = (programTime, playlist) => {\n // Assumptions:\n // - verifyProgramDateTimeTags has already been run\n // - live streams have been started\n let dateTimeObject;\n try {\n dateTimeObject = new Date(programTime);\n } catch (e) {\n return null;\n }\n if (!playlist || !playlist.segments || playlist.segments.length === 0) {\n return null;\n }\n let segment = playlist.segments[0];\n if (dateTimeObject < new Date(segment.dateTimeObject)) {\n // Requested time is before stream start.\n return null;\n }\n for (let i = 0; i < playlist.segments.length - 1; i++) {\n segment = playlist.segments[i];\n const nextSegmentStart = new Date(playlist.segments[i + 1].dateTimeObject);\n if (dateTimeObject < nextSegmentStart) {\n break;\n }\n }\n const lastSegment = playlist.segments[playlist.segments.length - 1];\n const lastSegmentStart = lastSegment.dateTimeObject;\n const lastSegmentDuration = lastSegment.videoTimingInfo ? originalSegmentVideoDuration(lastSegment.videoTimingInfo) : lastSegment.duration + lastSegment.duration * SEGMENT_END_FUDGE_PERCENT;\n const lastSegmentEnd = new Date(lastSegmentStart.getTime() + lastSegmentDuration * 1000);\n if (dateTimeObject > lastSegmentEnd) {\n // Beyond the end of the stream, or our best guess of the end of the stream.\n return null;\n }\n if (dateTimeObject > new Date(lastSegmentStart)) {\n segment = lastSegment;\n }\n return {\n segment,\n estimatedStart: segment.videoTimingInfo ? segment.videoTimingInfo.transmuxedPresentationStart : Playlist.duration(playlist, playlist.mediaSequence + playlist.segments.indexOf(segment)),\n // Although, given that all segments have accurate date time objects, the segment\n // selected should be accurate, unless the video has been transmuxed at some point\n // (determined by the presence of the videoTimingInfo object), the segment's \"player\n // time\" (the start time in the player) can't be considered accurate.\n type: segment.videoTimingInfo ? 'accurate' : 'estimate'\n };\n};\n/**\n * Finds a segment that contains the given player time(in seconds).\n *\n * @param {number} time The player time to find a match for\n * @param {Object} playlist A playlist object to search within\n */\n\nconst findSegmentForPlayerTime = (time, playlist) => {\n // Assumptions:\n // - there will always be a segment.duration\n // - we can start from zero\n // - segments are in time order\n if (!playlist || !playlist.segments || playlist.segments.length === 0) {\n return null;\n }\n let segmentEnd = 0;\n let segment;\n for (let i = 0; i < playlist.segments.length; i++) {\n segment = playlist.segments[i]; // videoTimingInfo is set after the segment is downloaded and transmuxed, and\n // should contain the most accurate values we have for the segment's player times.\n //\n // Use the accurate transmuxedPresentationEnd value if it is available, otherwise fall\n // back to an estimate based on the manifest derived (inaccurate) segment.duration, to\n // calculate an end value.\n\n segmentEnd = segment.videoTimingInfo ? segment.videoTimingInfo.transmuxedPresentationEnd : segmentEnd + segment.duration;\n if (time <= segmentEnd) {\n break;\n }\n }\n const lastSegment = playlist.segments[playlist.segments.length - 1];\n if (lastSegment.videoTimingInfo && lastSegment.videoTimingInfo.transmuxedPresentationEnd < time) {\n // The time requested is beyond the stream end.\n return null;\n }\n if (time > segmentEnd) {\n // The time is within or beyond the last segment.\n //\n // Check to see if the time is beyond a reasonable guess of the end of the stream.\n if (time > segmentEnd + lastSegment.duration * SEGMENT_END_FUDGE_PERCENT) {\n // Technically, because the duration value is only an estimate, the time may still\n // exist in the last segment, however, there isn't enough information to make even\n // a reasonable estimate.\n return null;\n }\n segment = lastSegment;\n }\n return {\n segment,\n estimatedStart: segment.videoTimingInfo ? segment.videoTimingInfo.transmuxedPresentationStart : segmentEnd - segment.duration,\n // Because videoTimingInfo is only set after transmux, it is the only way to get\n // accurate timing values.\n type: segment.videoTimingInfo ? 'accurate' : 'estimate'\n };\n};\n/**\n * Gives the offset of the comparisonTimestamp from the programTime timestamp in seconds.\n * If the offset returned is positive, the programTime occurs after the\n * comparisonTimestamp.\n * If the offset is negative, the programTime occurs before the comparisonTimestamp.\n *\n * @param {string} comparisonTimeStamp An ISO-8601 timestamp to compare against\n * @param {string} programTime The programTime as an ISO-8601 string\n * @return {number} offset\n */\n\nconst getOffsetFromTimestamp = (comparisonTimeStamp, programTime) => {\n let segmentDateTime;\n let programDateTime;\n try {\n segmentDateTime = new Date(comparisonTimeStamp);\n programDateTime = new Date(programTime);\n } catch (e) {// TODO handle error\n }\n const segmentTimeEpoch = segmentDateTime.getTime();\n const programTimeEpoch = programDateTime.getTime();\n return (programTimeEpoch - segmentTimeEpoch) / 1000;\n};\n/**\n * Checks that all segments in this playlist have programDateTime tags.\n *\n * @param {Object} playlist A playlist object\n */\n\nconst verifyProgramDateTimeTags = playlist => {\n if (!playlist.segments || playlist.segments.length === 0) {\n return false;\n }\n for (let i = 0; i < playlist.segments.length; i++) {\n const segment = playlist.segments[i];\n if (!segment.dateTimeObject) {\n return false;\n }\n }\n return true;\n};\n/**\n * Returns the programTime of the media given a playlist and a playerTime.\n * The playlist must have programDateTime tags for a programDateTime tag to be returned.\n * If the segments containing the time requested have not been buffered yet, an estimate\n * may be returned to the callback.\n *\n * @param {Object} args\n * @param {Object} args.playlist A playlist object to search within\n * @param {number} time A playerTime in seconds\n * @param {Function} callback(err, programTime)\n * @return {string} err.message A detailed error message\n * @return {Object} programTime\n * @return {number} programTime.mediaSeconds The streamTime in seconds\n * @return {string} programTime.programDateTime The programTime as an ISO-8601 String\n */\n\nconst getProgramTime = ({\n playlist,\n time = undefined,\n callback\n}) => {\n if (!callback) {\n throw new Error('getProgramTime: callback must be provided');\n }\n if (!playlist || time === undefined) {\n return callback({\n message: 'getProgramTime: playlist and time must be provided'\n });\n }\n const matchedSegment = findSegmentForPlayerTime(time, playlist);\n if (!matchedSegment) {\n return callback({\n message: 'valid programTime was not found'\n });\n }\n if (matchedSegment.type === 'estimate') {\n return callback({\n message: 'Accurate programTime could not be determined.' + ' Please seek to e.seekTime and try again',\n seekTime: matchedSegment.estimatedStart\n });\n }\n const programTimeObject = {\n mediaSeconds: time\n };\n const programTime = playerTimeToProgramTime(time, matchedSegment.segment);\n if (programTime) {\n programTimeObject.programDateTime = programTime.toISOString();\n }\n return callback(null, programTimeObject);\n};\n/**\n * Seeks in the player to a time that matches the given programTime ISO-8601 string.\n *\n * @param {Object} args\n * @param {string} args.programTime A programTime to seek to as an ISO-8601 String\n * @param {Object} args.playlist A playlist to look within\n * @param {number} args.retryCount The number of times to try for an accurate seek. Default is 2.\n * @param {Function} args.seekTo A method to perform a seek\n * @param {boolean} args.pauseAfterSeek Whether to end in a paused state after seeking. Default is true.\n * @param {Object} args.tech The tech to seek on\n * @param {Function} args.callback(err, newTime) A callback to return the new time to\n * @return {string} err.message A detailed error message\n * @return {number} newTime The exact time that was seeked to in seconds\n */\n\nconst seekToProgramTime = ({\n programTime,\n playlist,\n retryCount = 2,\n seekTo,\n pauseAfterSeek = true,\n tech,\n callback\n}) => {\n if (!callback) {\n throw new Error('seekToProgramTime: callback must be provided');\n }\n if (typeof programTime === 'undefined' || !playlist || !seekTo) {\n return callback({\n message: 'seekToProgramTime: programTime, seekTo and playlist must be provided'\n });\n }\n if (!playlist.endList && !tech.hasStarted_) {\n return callback({\n message: 'player must be playing a live stream to start buffering'\n });\n }\n if (!verifyProgramDateTimeTags(playlist)) {\n return callback({\n message: 'programDateTime tags must be provided in the manifest ' + playlist.resolvedUri\n });\n }\n const matchedSegment = findSegmentForProgramTime(programTime, playlist); // no match\n\n if (!matchedSegment) {\n return callback({\n message: `${programTime} was not found in the stream`\n });\n }\n const segment = matchedSegment.segment;\n const mediaOffset = getOffsetFromTimestamp(segment.dateTimeObject, programTime);\n if (matchedSegment.type === 'estimate') {\n // we've run out of retries\n if (retryCount === 0) {\n return callback({\n message: `${programTime} is not buffered yet. Try again`\n });\n }\n seekTo(matchedSegment.estimatedStart + mediaOffset);\n tech.one('seeked', () => {\n seekToProgramTime({\n programTime,\n playlist,\n retryCount: retryCount - 1,\n seekTo,\n pauseAfterSeek,\n tech,\n callback\n });\n });\n return;\n } // Since the segment.start value is determined from the buffered end or ending time\n // of the prior segment, the seekToTime doesn't need to account for any transmuxer\n // modifications.\n\n const seekToTime = segment.start + mediaOffset;\n const seekedCallback = () => {\n return callback(null, tech.currentTime());\n }; // listen for seeked event\n\n tech.one('seeked', seekedCallback); // pause before seeking as video.js will restore this state\n\n if (pauseAfterSeek) {\n tech.pause();\n }\n seekTo(seekToTime);\n};\n\n// which will only happen if the request is complete.\n\nconst callbackOnCompleted = (request, cb) => {\n if (request.readyState === 4) {\n return cb();\n }\n return;\n};\nconst containerRequest = (uri, xhr, cb, requestType) => {\n let bytes = [];\n let id3Offset;\n let finished = false;\n const endRequestAndCallback = function (err, req, type, _bytes) {\n req.abort();\n finished = true;\n return cb(err, req, type, _bytes);\n };\n const progressListener = function (error, request) {\n if (finished) {\n return;\n }\n if (error) {\n error.metadata = getStreamingNetworkErrorMetadata({\n requestType,\n request,\n error\n });\n return endRequestAndCallback(error, request, '', bytes);\n } // grap the new part of content that was just downloaded\n\n const newPart = request.responseText.substring(bytes && bytes.byteLength || 0, request.responseText.length); // add that onto bytes\n\n bytes = concatTypedArrays(bytes, stringToBytes(newPart, true));\n id3Offset = id3Offset || getId3Offset(bytes); // we need at least 10 bytes to determine a type\n // or we need at least two bytes after an id3Offset\n\n if (bytes.length < 10 || id3Offset && bytes.length < id3Offset + 2) {\n return callbackOnCompleted(request, () => endRequestAndCallback(error, request, '', bytes));\n }\n const type = detectContainerForBytes(bytes); // if this looks like a ts segment but we don't have enough data\n // to see the second sync byte, wait until we have enough data\n // before declaring it ts\n\n if (type === 'ts' && bytes.length < 188) {\n return callbackOnCompleted(request, () => endRequestAndCallback(error, request, '', bytes));\n } // this may be an unsynced ts segment\n // wait for 376 bytes before detecting no container\n\n if (!type && bytes.length < 376) {\n return callbackOnCompleted(request, () => endRequestAndCallback(error, request, '', bytes));\n }\n return endRequestAndCallback(null, request, type, bytes);\n };\n const options = {\n uri,\n beforeSend(request) {\n // this forces the browser to pass the bytes to us unprocessed\n request.overrideMimeType('text/plain; charset=x-user-defined');\n request.addEventListener('progress', function ({\n total,\n loaded\n }) {\n return callbackWrapper(request, null, {\n statusCode: request.status\n }, progressListener);\n });\n }\n };\n const request = xhr(options, function (error, response) {\n return callbackWrapper(request, error, response, progressListener);\n });\n return request;\n};\nconst {\n EventTarget\n} = videojs;\nconst dashPlaylistUnchanged = function (a, b) {\n if (!isPlaylistUnchanged(a, b)) {\n return false;\n } // for dash the above check will often return true in scenarios where\n // the playlist actually has changed because mediaSequence isn't a\n // dash thing, and we often set it to 1. So if the playlists have the same amount\n // of segments we return true.\n // So for dash we need to make sure that the underlying segments are different.\n // if sidx changed then the playlists are different.\n\n if (a.sidx && b.sidx && (a.sidx.offset !== b.sidx.offset || a.sidx.length !== b.sidx.length)) {\n return false;\n } else if (!a.sidx && b.sidx || a.sidx && !b.sidx) {\n return false;\n } // one or the other does not have segments\n // there was a change.\n\n if (a.segments && !b.segments || !a.segments && b.segments) {\n return false;\n } // neither has segments nothing changed\n\n if (!a.segments && !b.segments) {\n return true;\n } // check segments themselves\n\n for (let i = 0; i < a.segments.length; i++) {\n const aSegment = a.segments[i];\n const bSegment = b.segments[i]; // if uris are different between segments there was a change\n\n if (aSegment.uri !== bSegment.uri) {\n return false;\n } // neither segment has a byterange, there will be no byterange change.\n\n if (!aSegment.byterange && !bSegment.byterange) {\n continue;\n }\n const aByterange = aSegment.byterange;\n const bByterange = bSegment.byterange; // if byterange only exists on one of the segments, there was a change.\n\n if (aByterange && !bByterange || !aByterange && bByterange) {\n return false;\n } // if both segments have byterange with different offsets, there was a change.\n\n if (aByterange.offset !== bByterange.offset || aByterange.length !== bByterange.length) {\n return false;\n }\n } // if everything was the same with segments, this is the same playlist.\n\n return true;\n};\n/**\n * Use the representation IDs from the mpd object to create groupIDs, the NAME is set to mandatory representation\n * ID in the parser. This allows for continuous playout across periods with the same representation IDs\n * (continuous periods as defined in DASH-IF 3.2.12). This is assumed in the mpd-parser as well. If we want to support\n * periods without continuous playback this function may need modification as well as the parser.\n */\n\nconst dashGroupId = (type, group, label, playlist) => {\n // If the manifest somehow does not have an ID (non-dash compliant), use the label.\n const playlistId = playlist.attributes.NAME || label;\n return `placeholder-uri-${type}-${group}-${playlistId}`;\n};\n/**\n * Parses the main XML string and updates playlist URI references.\n *\n * @param {Object} config\n * Object of arguments\n * @param {string} config.mainXml\n * The mpd XML\n * @param {string} config.srcUrl\n * The mpd URL\n * @param {Date} config.clientOffset\n * A time difference between server and client\n * @param {Object} config.sidxMapping\n * SIDX mappings for moof/mdat URIs and byte ranges\n * @return {Object}\n * The parsed mpd manifest object\n */\n\nconst parseMainXml = ({\n mainXml,\n srcUrl,\n clientOffset,\n sidxMapping,\n previousManifest\n}) => {\n const manifest = parse(mainXml, {\n manifestUri: srcUrl,\n clientOffset,\n sidxMapping,\n previousManifest\n });\n addPropertiesToMain(manifest, srcUrl, dashGroupId);\n return manifest;\n};\n/**\n * Removes any mediaGroup labels that no longer exist in the newMain\n *\n * @param {Object} update\n * The previous mpd object being updated\n * @param {Object} newMain\n * The new mpd object\n */\n\nconst removeOldMediaGroupLabels = (update, newMain) => {\n forEachMediaGroup(update, (properties, type, group, label) => {\n if (!(label in newMain.mediaGroups[type][group])) {\n delete update.mediaGroups[type][group][label];\n }\n });\n};\n/**\n * Returns a new main manifest that is the result of merging an updated main manifest\n * into the original version.\n *\n * @param {Object} oldMain\n * The old parsed mpd object\n * @param {Object} newMain\n * The updated parsed mpd object\n * @return {Object}\n * A new object representing the original main manifest with the updated media\n * playlists merged in\n */\n\nconst updateMain = (oldMain, newMain, sidxMapping) => {\n let noChanges = true;\n let update = merge(oldMain, {\n // These are top level properties that can be updated\n duration: newMain.duration,\n minimumUpdatePeriod: newMain.minimumUpdatePeriod,\n timelineStarts: newMain.timelineStarts\n }); // First update the playlists in playlist list\n\n for (let i = 0; i < newMain.playlists.length; i++) {\n const playlist = newMain.playlists[i];\n if (playlist.sidx) {\n const sidxKey = generateSidxKey(playlist.sidx); // add sidx segments to the playlist if we have all the sidx info already\n\n if (sidxMapping && sidxMapping[sidxKey] && sidxMapping[sidxKey].sidx) {\n addSidxSegmentsToPlaylist(playlist, sidxMapping[sidxKey].sidx, playlist.sidx.resolvedUri);\n }\n }\n const playlistUpdate = updateMain$1(update, playlist, dashPlaylistUnchanged);\n if (playlistUpdate) {\n update = playlistUpdate;\n noChanges = false;\n }\n } // Then update media group playlists\n\n forEachMediaGroup(newMain, (properties, type, group, label) => {\n if (properties.playlists && properties.playlists.length) {\n const id = properties.playlists[0].id;\n const playlistUpdate = updateMain$1(update, properties.playlists[0], dashPlaylistUnchanged);\n if (playlistUpdate) {\n update = playlistUpdate; // add new mediaGroup label if it doesn't exist and assign the new mediaGroup.\n\n if (!(label in update.mediaGroups[type][group])) {\n update.mediaGroups[type][group][label] = properties;\n } // update the playlist reference within media groups\n\n update.mediaGroups[type][group][label].playlists[0] = update.playlists[id];\n noChanges = false;\n }\n }\n }); // remove mediaGroup labels and references that no longer exist in the newMain\n\n removeOldMediaGroupLabels(update, newMain);\n if (newMain.minimumUpdatePeriod !== oldMain.minimumUpdatePeriod) {\n noChanges = false;\n }\n if (noChanges) {\n return null;\n }\n return update;\n}; // SIDX should be equivalent if the URI and byteranges of the SIDX match.\n// If the SIDXs have maps, the two maps should match,\n// both `a` and `b` missing SIDXs is considered matching.\n// If `a` or `b` but not both have a map, they aren't matching.\n\nconst equivalentSidx = (a, b) => {\n const neitherMap = Boolean(!a.map && !b.map);\n const equivalentMap = neitherMap || Boolean(a.map && b.map && a.map.byterange.offset === b.map.byterange.offset && a.map.byterange.length === b.map.byterange.length);\n return equivalentMap && a.uri === b.uri && a.byterange.offset === b.byterange.offset && a.byterange.length === b.byterange.length;\n}; // exported for testing\n\nconst compareSidxEntry = (playlists, oldSidxMapping) => {\n const newSidxMapping = {};\n for (const id in playlists) {\n const playlist = playlists[id];\n const currentSidxInfo = playlist.sidx;\n if (currentSidxInfo) {\n const key = generateSidxKey(currentSidxInfo);\n if (!oldSidxMapping[key]) {\n break;\n }\n const savedSidxInfo = oldSidxMapping[key].sidxInfo;\n if (equivalentSidx(savedSidxInfo, currentSidxInfo)) {\n newSidxMapping[key] = oldSidxMapping[key];\n }\n }\n }\n return newSidxMapping;\n};\n/**\n * A function that filters out changed items as they need to be requested separately.\n *\n * The method is exported for testing\n *\n * @param {Object} main the parsed mpd XML returned via mpd-parser\n * @param {Object} oldSidxMapping the SIDX to compare against\n */\n\nconst filterChangedSidxMappings = (main, oldSidxMapping) => {\n const videoSidx = compareSidxEntry(main.playlists, oldSidxMapping);\n let mediaGroupSidx = videoSidx;\n forEachMediaGroup(main, (properties, mediaType, groupKey, labelKey) => {\n if (properties.playlists && properties.playlists.length) {\n const playlists = properties.playlists;\n mediaGroupSidx = merge(mediaGroupSidx, compareSidxEntry(playlists, oldSidxMapping));\n }\n });\n return mediaGroupSidx;\n};\nclass DashPlaylistLoader extends EventTarget {\n // DashPlaylistLoader must accept either a src url or a playlist because subsequent\n // playlist loader setups from media groups will expect to be able to pass a playlist\n // (since there aren't external URLs to media playlists with DASH)\n constructor(srcUrlOrPlaylist, vhs, options = {}, mainPlaylistLoader) {\n super();\n this.mainPlaylistLoader_ = mainPlaylistLoader || this;\n if (!mainPlaylistLoader) {\n this.isMain_ = true;\n }\n const {\n withCredentials = false\n } = options;\n this.vhs_ = vhs;\n this.withCredentials = withCredentials;\n this.addMetadataToTextTrack = options.addMetadataToTextTrack;\n if (!srcUrlOrPlaylist) {\n throw new Error('A non-empty playlist URL or object is required');\n } // event naming?\n\n this.on('minimumUpdatePeriod', () => {\n this.refreshXml_();\n }); // live playlist staleness timeout\n\n this.on('mediaupdatetimeout', () => {\n this.refreshMedia_(this.media().id);\n });\n this.state = 'HAVE_NOTHING';\n this.loadedPlaylists_ = {};\n this.logger_ = logger('DashPlaylistLoader'); // initialize the loader state\n // The mainPlaylistLoader will be created with a string\n\n if (this.isMain_) {\n this.mainPlaylistLoader_.srcUrl = srcUrlOrPlaylist; // TODO: reset sidxMapping between period changes\n // once multi-period is refactored\n\n this.mainPlaylistLoader_.sidxMapping_ = {};\n } else {\n this.childPlaylist_ = srcUrlOrPlaylist;\n }\n }\n requestErrored_(err, request, startingState) {\n // disposed\n if (!this.request) {\n return true;\n } // pending request is cleared\n\n this.request = null;\n if (err) {\n // use the provided error object or create one\n // based on the request/response\n this.error = typeof err === 'object' && !(err instanceof Error) ? err : {\n status: request.status,\n message: 'DASH request error at URL: ' + request.uri,\n response: request.response,\n // MEDIA_ERR_NETWORK\n code: 2,\n metadata: err.metadata\n };\n if (startingState) {\n this.state = startingState;\n }\n this.trigger('error');\n return true;\n }\n }\n /**\n * Verify that the container of the sidx segment can be parsed\n * and if it can, get and parse that segment.\n */\n\n addSidxSegments_(playlist, startingState, cb) {\n const sidxKey = playlist.sidx && generateSidxKey(playlist.sidx); // playlist lacks sidx or sidx segments were added to this playlist already.\n\n if (!playlist.sidx || !sidxKey || this.mainPlaylistLoader_.sidxMapping_[sidxKey]) {\n // keep this function async\n this.mediaRequest_ = window$1.setTimeout(() => cb(false), 0);\n return;\n } // resolve the segment URL relative to the playlist\n\n const uri = resolveManifestRedirect(playlist.sidx.resolvedUri);\n const fin = (err, request) => {\n if (this.requestErrored_(err, request, startingState)) {\n return;\n }\n const sidxMapping = this.mainPlaylistLoader_.sidxMapping_;\n const {\n requestType\n } = request;\n let sidx;\n try {\n sidx = parseSidx(toUint8(request.response).subarray(8));\n } catch (e) {\n e.metadata = getStreamingNetworkErrorMetadata({\n requestType,\n request,\n parseFailure: true\n }); // sidx parsing failed.\n\n this.requestErrored_(e, request, startingState);\n return;\n }\n sidxMapping[sidxKey] = {\n sidxInfo: playlist.sidx,\n sidx\n };\n addSidxSegmentsToPlaylist(playlist, sidx, playlist.sidx.resolvedUri);\n return cb(true);\n };\n const REQUEST_TYPE = 'dash-sidx';\n this.request = containerRequest(uri, this.vhs_.xhr, (err, request, container, bytes) => {\n if (err) {\n return fin(err, request);\n }\n if (!container || container !== 'mp4') {\n const sidxContainer = container || 'unknown';\n return fin({\n status: request.status,\n message: `Unsupported ${sidxContainer} container type for sidx segment at URL: ${uri}`,\n // response is just bytes in this case\n // but we really don't want to return that.\n response: '',\n playlist,\n internal: true,\n playlistExclusionDuration: Infinity,\n // MEDIA_ERR_NETWORK\n code: 2\n }, request);\n } // if we already downloaded the sidx bytes in the container request, use them\n\n const {\n offset,\n length\n } = playlist.sidx.byterange;\n if (bytes.length >= length + offset) {\n return fin(err, {\n response: bytes.subarray(offset, offset + length),\n status: request.status,\n uri: request.uri\n });\n } // otherwise request sidx bytes\n\n this.request = this.vhs_.xhr({\n uri,\n responseType: 'arraybuffer',\n requestType: 'dash-sidx',\n headers: segmentXhrHeaders({\n byterange: playlist.sidx.byterange\n })\n }, fin);\n }, REQUEST_TYPE);\n }\n dispose() {\n this.trigger('dispose');\n this.stopRequest();\n this.loadedPlaylists_ = {};\n window$1.clearTimeout(this.minimumUpdatePeriodTimeout_);\n window$1.clearTimeout(this.mediaRequest_);\n window$1.clearTimeout(this.mediaUpdateTimeout);\n this.mediaUpdateTimeout = null;\n this.mediaRequest_ = null;\n this.minimumUpdatePeriodTimeout_ = null;\n if (this.mainPlaylistLoader_.createMupOnMedia_) {\n this.off('loadedmetadata', this.mainPlaylistLoader_.createMupOnMedia_);\n this.mainPlaylistLoader_.createMupOnMedia_ = null;\n }\n this.off();\n }\n hasPendingRequest() {\n return this.request || this.mediaRequest_;\n }\n stopRequest() {\n if (this.request) {\n const oldRequest = this.request;\n this.request = null;\n oldRequest.onreadystatechange = null;\n oldRequest.abort();\n }\n }\n media(playlist) {\n // getter\n if (!playlist) {\n return this.media_;\n } // setter\n\n if (this.state === 'HAVE_NOTHING') {\n throw new Error('Cannot switch media playlist from ' + this.state);\n }\n const startingState = this.state; // find the playlist object if the target playlist has been specified by URI\n\n if (typeof playlist === 'string') {\n if (!this.mainPlaylistLoader_.main.playlists[playlist]) {\n throw new Error('Unknown playlist URI: ' + playlist);\n }\n playlist = this.mainPlaylistLoader_.main.playlists[playlist];\n }\n const mediaChange = !this.media_ || playlist.id !== this.media_.id; // switch to previously loaded playlists immediately\n\n if (mediaChange && this.loadedPlaylists_[playlist.id] && this.loadedPlaylists_[playlist.id].endList) {\n this.state = 'HAVE_METADATA';\n this.media_ = playlist; // trigger media change if the active media has been updated\n\n if (mediaChange) {\n this.trigger('mediachanging');\n this.trigger('mediachange');\n }\n return;\n } // switching to the active playlist is a no-op\n\n if (!mediaChange) {\n return;\n } // switching from an already loaded playlist\n\n if (this.media_) {\n this.trigger('mediachanging');\n }\n this.addSidxSegments_(playlist, startingState, sidxChanged => {\n // everything is ready just continue to haveMetadata\n this.haveMetadata({\n startingState,\n playlist\n });\n });\n }\n haveMetadata({\n startingState,\n playlist\n }) {\n this.state = 'HAVE_METADATA';\n this.loadedPlaylists_[playlist.id] = playlist;\n this.mediaRequest_ = null; // This will trigger loadedplaylist\n\n this.refreshMedia_(playlist.id); // fire loadedmetadata the first time a media playlist is loaded\n // to resolve setup of media groups\n\n if (startingState === 'HAVE_MAIN_MANIFEST') {\n this.trigger('loadedmetadata');\n } else {\n // trigger media change if the active media has been updated\n this.trigger('mediachange');\n }\n }\n pause() {\n if (this.mainPlaylistLoader_.createMupOnMedia_) {\n this.off('loadedmetadata', this.mainPlaylistLoader_.createMupOnMedia_);\n this.mainPlaylistLoader_.createMupOnMedia_ = null;\n }\n this.stopRequest();\n window$1.clearTimeout(this.mediaUpdateTimeout);\n this.mediaUpdateTimeout = null;\n if (this.isMain_) {\n window$1.clearTimeout(this.mainPlaylistLoader_.minimumUpdatePeriodTimeout_);\n this.mainPlaylistLoader_.minimumUpdatePeriodTimeout_ = null;\n }\n if (this.state === 'HAVE_NOTHING') {\n // If we pause the loader before any data has been retrieved, its as if we never\n // started, so reset to an unstarted state.\n this.started = false;\n }\n }\n load(isFinalRendition) {\n window$1.clearTimeout(this.mediaUpdateTimeout);\n this.mediaUpdateTimeout = null;\n const media = this.media();\n if (isFinalRendition) {\n const delay = media ? media.targetDuration / 2 * 1000 : 5 * 1000;\n this.mediaUpdateTimeout = window$1.setTimeout(() => this.load(), delay);\n return;\n } // because the playlists are internal to the manifest, load should either load the\n // main manifest, or do nothing but trigger an event\n\n if (!this.started) {\n this.start();\n return;\n }\n if (media && !media.endList) {\n // Check to see if this is the main loader and the MUP was cleared (this happens\n // when the loader was paused). `media` should be set at this point since one is always\n // set during `start()`.\n if (this.isMain_ && !this.minimumUpdatePeriodTimeout_) {\n // Trigger minimumUpdatePeriod to refresh the main manifest\n this.trigger('minimumUpdatePeriod'); // Since there was no prior minimumUpdatePeriodTimeout it should be recreated\n\n this.updateMinimumUpdatePeriodTimeout_();\n }\n this.trigger('mediaupdatetimeout');\n } else {\n this.trigger('loadedplaylist');\n }\n }\n start() {\n this.started = true; // We don't need to request the main manifest again\n // Call this asynchronously to match the xhr request behavior below\n\n if (!this.isMain_) {\n this.mediaRequest_ = window$1.setTimeout(() => this.haveMain_(), 0);\n return;\n }\n this.requestMain_((req, mainChanged) => {\n this.haveMain_();\n if (!this.hasPendingRequest() && !this.media_) {\n this.media(this.mainPlaylistLoader_.main.playlists[0]);\n }\n });\n }\n requestMain_(cb) {\n const metadata = {\n manifestInfo: {\n uri: this.mainPlaylistLoader_.srcUrl\n }\n };\n this.trigger({\n type: 'manifestrequeststart',\n metadata\n });\n this.request = this.vhs_.xhr({\n uri: this.mainPlaylistLoader_.srcUrl,\n withCredentials: this.withCredentials,\n requestType: 'dash-manifest'\n }, (error, req) => {\n if (error) {\n const {\n requestType\n } = req;\n error.metadata = getStreamingNetworkErrorMetadata({\n requestType,\n request: req,\n error\n });\n }\n if (this.requestErrored_(error, req)) {\n if (this.state === 'HAVE_NOTHING') {\n this.started = false;\n }\n return;\n }\n this.trigger({\n type: 'manifestrequestcomplete',\n metadata\n });\n const mainChanged = req.responseText !== this.mainPlaylistLoader_.mainXml_;\n this.mainPlaylistLoader_.mainXml_ = req.responseText;\n if (req.responseHeaders && req.responseHeaders.date) {\n this.mainLoaded_ = Date.parse(req.responseHeaders.date);\n } else {\n this.mainLoaded_ = Date.now();\n }\n this.mainPlaylistLoader_.srcUrl = resolveManifestRedirect(this.mainPlaylistLoader_.srcUrl, req);\n if (mainChanged) {\n this.handleMain_();\n this.syncClientServerClock_(() => {\n return cb(req, mainChanged);\n });\n return;\n }\n return cb(req, mainChanged);\n });\n }\n /**\n * Parses the main xml for UTCTiming node to sync the client clock to the server\n * clock. If the UTCTiming node requires a HEAD or GET request, that request is made.\n *\n * @param {Function} done\n * Function to call when clock sync has completed\n */\n\n syncClientServerClock_(done) {\n const utcTiming = parseUTCTiming(this.mainPlaylistLoader_.mainXml_); // No UTCTiming element found in the mpd. Use Date header from mpd request as the\n // server clock\n\n if (utcTiming === null) {\n this.mainPlaylistLoader_.clientOffset_ = this.mainLoaded_ - Date.now();\n return done();\n }\n if (utcTiming.method === 'DIRECT') {\n this.mainPlaylistLoader_.clientOffset_ = utcTiming.value - Date.now();\n return done();\n }\n this.request = this.vhs_.xhr({\n uri: resolveUrl(this.mainPlaylistLoader_.srcUrl, utcTiming.value),\n method: utcTiming.method,\n withCredentials: this.withCredentials,\n requestType: 'dash-clock-sync'\n }, (error, req) => {\n // disposed\n if (!this.request) {\n return;\n }\n if (error) {\n const {\n requestType\n } = req;\n this.error.metadata = getStreamingNetworkErrorMetadata({\n requestType,\n request: req,\n error\n }); // sync request failed, fall back to using date header from mpd\n // TODO: log warning\n\n this.mainPlaylistLoader_.clientOffset_ = this.mainLoaded_ - Date.now();\n return done();\n }\n let serverTime;\n if (utcTiming.method === 'HEAD') {\n if (!req.responseHeaders || !req.responseHeaders.date) {\n // expected date header not preset, fall back to using date header from mpd\n // TODO: log warning\n serverTime = this.mainLoaded_;\n } else {\n serverTime = Date.parse(req.responseHeaders.date);\n }\n } else {\n serverTime = Date.parse(req.responseText);\n }\n this.mainPlaylistLoader_.clientOffset_ = serverTime - Date.now();\n done();\n });\n }\n haveMain_() {\n this.state = 'HAVE_MAIN_MANIFEST';\n if (this.isMain_) {\n // We have the main playlist at this point, so\n // trigger this to allow PlaylistController\n // to make an initial playlist selection\n this.trigger('loadedplaylist');\n } else if (!this.media_) {\n // no media playlist was specifically selected so select\n // the one the child playlist loader was created with\n this.media(this.childPlaylist_);\n }\n }\n handleMain_() {\n // clear media request\n this.mediaRequest_ = null;\n const oldMain = this.mainPlaylistLoader_.main;\n const metadata = {\n manifestInfo: {\n uri: this.mainPlaylistLoader_.srcUrl\n }\n };\n this.trigger({\n type: 'manifestparsestart',\n metadata\n });\n let newMain;\n try {\n newMain = parseMainXml({\n mainXml: this.mainPlaylistLoader_.mainXml_,\n srcUrl: this.mainPlaylistLoader_.srcUrl,\n clientOffset: this.mainPlaylistLoader_.clientOffset_,\n sidxMapping: this.mainPlaylistLoader_.sidxMapping_,\n previousManifest: oldMain\n });\n } catch (error) {\n this.error = error;\n this.error.metadata = {\n errorType: videojs.Error.StreamingDashManifestParserError,\n error\n };\n this.trigger('error');\n } // if we have an old main to compare the new main against\n\n if (oldMain) {\n newMain = updateMain(oldMain, newMain, this.mainPlaylistLoader_.sidxMapping_);\n } // only update main if we have a new main\n\n this.mainPlaylistLoader_.main = newMain ? newMain : oldMain;\n const location = this.mainPlaylistLoader_.main.locations && this.mainPlaylistLoader_.main.locations[0];\n if (location && location !== this.mainPlaylistLoader_.srcUrl) {\n this.mainPlaylistLoader_.srcUrl = location;\n }\n if (!oldMain || newMain && newMain.minimumUpdatePeriod !== oldMain.minimumUpdatePeriod) {\n this.updateMinimumUpdatePeriodTimeout_();\n }\n this.addEventStreamToMetadataTrack_(newMain);\n if (newMain) {\n const {\n duration,\n endList\n } = newMain;\n const renditions = [];\n newMain.playlists.forEach(playlist => {\n renditions.push({\n id: playlist.id,\n bandwidth: playlist.attributes.BANDWIDTH,\n resolution: playlist.attributes.RESOLUTION,\n codecs: playlist.attributes.CODECS\n });\n });\n const parsedManifest = {\n duration,\n isLive: !endList,\n renditions\n };\n metadata.parsedManifest = parsedManifest;\n this.trigger({\n type: 'manifestparsecomplete',\n metadata\n });\n }\n return Boolean(newMain);\n }\n updateMinimumUpdatePeriodTimeout_() {\n const mpl = this.mainPlaylistLoader_; // cancel any pending creation of mup on media\n // a new one will be added if needed.\n\n if (mpl.createMupOnMedia_) {\n mpl.off('loadedmetadata', mpl.createMupOnMedia_);\n mpl.createMupOnMedia_ = null;\n } // clear any pending timeouts\n\n if (mpl.minimumUpdatePeriodTimeout_) {\n window$1.clearTimeout(mpl.minimumUpdatePeriodTimeout_);\n mpl.minimumUpdatePeriodTimeout_ = null;\n }\n let mup = mpl.main && mpl.main.minimumUpdatePeriod; // If the minimumUpdatePeriod has a value of 0, that indicates that the current\n // MPD has no future validity, so a new one will need to be acquired when new\n // media segments are to be made available. Thus, we use the target duration\n // in this case\n\n if (mup === 0) {\n if (mpl.media()) {\n mup = mpl.media().targetDuration * 1000;\n } else {\n mpl.createMupOnMedia_ = mpl.updateMinimumUpdatePeriodTimeout_;\n mpl.one('loadedmetadata', mpl.createMupOnMedia_);\n }\n } // if minimumUpdatePeriod is invalid or <= zero, which\n // can happen when a live video becomes VOD. skip timeout\n // creation.\n\n if (typeof mup !== 'number' || mup <= 0) {\n if (mup < 0) {\n this.logger_(`found invalid minimumUpdatePeriod of ${mup}, not setting a timeout`);\n }\n return;\n }\n this.createMUPTimeout_(mup);\n }\n createMUPTimeout_(mup) {\n const mpl = this.mainPlaylistLoader_;\n mpl.minimumUpdatePeriodTimeout_ = window$1.setTimeout(() => {\n mpl.minimumUpdatePeriodTimeout_ = null;\n mpl.trigger('minimumUpdatePeriod');\n mpl.createMUPTimeout_(mup);\n }, mup);\n }\n /**\n * Sends request to refresh the main xml and updates the parsed main manifest\n */\n\n refreshXml_() {\n this.requestMain_((req, mainChanged) => {\n if (!mainChanged) {\n return;\n }\n if (this.media_) {\n this.media_ = this.mainPlaylistLoader_.main.playlists[this.media_.id];\n } // This will filter out updated sidx info from the mapping\n\n this.mainPlaylistLoader_.sidxMapping_ = filterChangedSidxMappings(this.mainPlaylistLoader_.main, this.mainPlaylistLoader_.sidxMapping_);\n this.addSidxSegments_(this.media(), this.state, sidxChanged => {\n // TODO: do we need to reload the current playlist?\n this.refreshMedia_(this.media().id);\n });\n });\n }\n /**\n * Refreshes the media playlist by re-parsing the main xml and updating playlist\n * references. If this is an alternate loader, the updated parsed manifest is retrieved\n * from the main loader.\n */\n\n refreshMedia_(mediaID) {\n if (!mediaID) {\n throw new Error('refreshMedia_ must take a media id');\n } // for main we have to reparse the main xml\n // to re-create segments based on current timing values\n // which may change media. We only skip updating the main manifest\n // if this is the first time this.media_ is being set.\n // as main was just parsed in that case.\n\n if (this.media_ && this.isMain_) {\n this.handleMain_();\n }\n const playlists = this.mainPlaylistLoader_.main.playlists;\n const mediaChanged = !this.media_ || this.media_ !== playlists[mediaID];\n if (mediaChanged) {\n this.media_ = playlists[mediaID];\n } else {\n this.trigger('playlistunchanged');\n }\n if (!this.mediaUpdateTimeout) {\n const createMediaUpdateTimeout = () => {\n if (this.media().endList) {\n return;\n }\n this.mediaUpdateTimeout = window$1.setTimeout(() => {\n this.trigger('mediaupdatetimeout');\n createMediaUpdateTimeout();\n }, refreshDelay(this.media(), Boolean(mediaChanged)));\n };\n createMediaUpdateTimeout();\n }\n this.trigger('loadedplaylist');\n }\n /**\n * Takes eventstream data from a parsed DASH manifest and adds it to the metadata text track.\n *\n * @param {manifest} newMain the newly parsed manifest\n */\n\n addEventStreamToMetadataTrack_(newMain) {\n // Only add new event stream metadata if we have a new manifest.\n if (newMain && this.mainPlaylistLoader_.main.eventStream) {\n // convert EventStream to ID3-like data.\n const metadataArray = this.mainPlaylistLoader_.main.eventStream.map(eventStreamNode => {\n return {\n cueTime: eventStreamNode.start,\n frames: [{\n data: eventStreamNode.messageData\n }]\n };\n });\n this.addMetadataToTextTrack('EventStream', metadataArray, this.mainPlaylistLoader_.main.duration);\n }\n }\n /**\n * Returns the key ID set from a playlist\n *\n * @param {playlist} playlist to fetch the key ID set from.\n * @return a Set of 32 digit hex strings that represent the unique keyIds for that playlist.\n */\n\n getKeyIdSet(playlist) {\n if (playlist.contentProtection) {\n const keyIds = new Set();\n for (const keysystem in playlist.contentProtection) {\n const defaultKID = playlist.contentProtection[keysystem].attributes['cenc:default_KID'];\n if (defaultKID) {\n // DASH keyIds are separated by dashes.\n keyIds.add(defaultKID.replace(/-/g, '').toLowerCase());\n }\n }\n return keyIds;\n }\n }\n}\nvar Config = {\n GOAL_BUFFER_LENGTH: 30,\n MAX_GOAL_BUFFER_LENGTH: 60,\n BACK_BUFFER_LENGTH: 30,\n GOAL_BUFFER_LENGTH_RATE: 1,\n // 0.5 MB/s\n INITIAL_BANDWIDTH: 4194304,\n // A fudge factor to apply to advertised playlist bitrates to account for\n // temporary flucations in client bandwidth\n BANDWIDTH_VARIANCE: 1.2,\n // How much of the buffer must be filled before we consider upswitching\n BUFFER_LOW_WATER_LINE: 0,\n MAX_BUFFER_LOW_WATER_LINE: 30,\n // TODO: Remove this when experimentalBufferBasedABR is removed\n EXPERIMENTAL_MAX_BUFFER_LOW_WATER_LINE: 16,\n BUFFER_LOW_WATER_LINE_RATE: 1,\n // If the buffer is greater than the high water line, we won't switch down\n BUFFER_HIGH_WATER_LINE: 30\n};\nconst stringToArrayBuffer = string => {\n const view = new Uint8Array(new ArrayBuffer(string.length));\n for (let i = 0; i < string.length; i++) {\n view[i] = string.charCodeAt(i);\n }\n return view.buffer;\n};\n\n/* global Blob, BlobBuilder, Worker */\n// unify worker interface\nconst browserWorkerPolyFill = function (workerObj) {\n // node only supports on/off\n workerObj.on = workerObj.addEventListener;\n workerObj.off = workerObj.removeEventListener;\n return workerObj;\n};\nconst createObjectURL = function (str) {\n try {\n return URL.createObjectURL(new Blob([str], {\n type: 'application/javascript'\n }));\n } catch (e) {\n const blob = new BlobBuilder();\n blob.append(str);\n return URL.createObjectURL(blob.getBlob());\n }\n};\nconst factory = function (code) {\n return function () {\n const objectUrl = createObjectURL(code);\n const worker = browserWorkerPolyFill(new Worker(objectUrl));\n worker.objURL = objectUrl;\n const terminate = worker.terminate;\n worker.on = worker.addEventListener;\n worker.off = worker.removeEventListener;\n worker.terminate = function () {\n URL.revokeObjectURL(objectUrl);\n return terminate.call(this);\n };\n return worker;\n };\n};\nconst transform = function (code) {\n return `var browserWorkerPolyFill = ${browserWorkerPolyFill.toString()};\\n` + 'browserWorkerPolyFill(self);\\n' + code;\n};\nconst getWorkerString = function (fn) {\n return fn.toString().replace(/^function.+?{/, '').slice(0, -1);\n};\n\n/* rollup-plugin-worker-factory start for worker!/home/runner/work/http-streaming/http-streaming/src/transmuxer-worker.js */\nconst workerCode$1 = transform(getWorkerString(function () {\n var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * A lightweight readable stream implemention that handles event dispatching.\n * Objects that inherit from streams should call init in their constructors.\n */\n\n var Stream$8 = function () {\n this.init = function () {\n var listeners = {};\n /**\n * Add a listener for a specified event type.\n * @param type {string} the event name\n * @param listener {function} the callback to be invoked when an event of\n * the specified type occurs\n */\n\n this.on = function (type, listener) {\n if (!listeners[type]) {\n listeners[type] = [];\n }\n listeners[type] = listeners[type].concat(listener);\n };\n /**\n * Remove a listener for a specified event type.\n * @param type {string} the event name\n * @param listener {function} a function previously registered for this\n * type of event through `on`\n */\n\n this.off = function (type, listener) {\n var index;\n if (!listeners[type]) {\n return false;\n }\n index = listeners[type].indexOf(listener);\n listeners[type] = listeners[type].slice();\n listeners[type].splice(index, 1);\n return index > -1;\n };\n /**\n * Trigger an event of the specified type on this stream. Any additional\n * arguments to this function are passed as parameters to event listeners.\n * @param type {string} the event name\n */\n\n this.trigger = function (type) {\n var callbacks, i, length, args;\n callbacks = listeners[type];\n if (!callbacks) {\n return;\n } // Slicing the arguments on every invocation of this method\n // can add a significant amount of overhead. Avoid the\n // intermediate object creation for the common case of a\n // single callback argument\n\n if (arguments.length === 2) {\n length = callbacks.length;\n for (i = 0; i < length; ++i) {\n callbacks[i].call(this, arguments[1]);\n }\n } else {\n args = [];\n i = arguments.length;\n for (i = 1; i < arguments.length; ++i) {\n args.push(arguments[i]);\n }\n length = callbacks.length;\n for (i = 0; i < length; ++i) {\n callbacks[i].apply(this, args);\n }\n }\n };\n /**\n * Destroys the stream and cleans up.\n */\n\n this.dispose = function () {\n listeners = {};\n };\n };\n };\n /**\n * Forwards all `data` events on this stream to the destination stream. The\n * destination stream should provide a method `push` to receive the data\n * events as they arrive.\n * @param destination {stream} the stream that will receive all `data` events\n * @param autoFlush {boolean} if false, we will not call `flush` on the destination\n * when the current stream emits a 'done' event\n * @see http://nodejs.org/api/stream.html#stream_readable_pipe_destination_options\n */\n\n Stream$8.prototype.pipe = function (destination) {\n this.on('data', function (data) {\n destination.push(data);\n });\n this.on('done', function (flushSource) {\n destination.flush(flushSource);\n });\n this.on('partialdone', function (flushSource) {\n destination.partialFlush(flushSource);\n });\n this.on('endedtimeline', function (flushSource) {\n destination.endTimeline(flushSource);\n });\n this.on('reset', function (flushSource) {\n destination.reset(flushSource);\n });\n return destination;\n }; // Default stream functions that are expected to be overridden to perform\n // actual work. These are provided by the prototype as a sort of no-op\n // implementation so that we don't have to check for their existence in the\n // `pipe` function above.\n\n Stream$8.prototype.push = function (data) {\n this.trigger('data', data);\n };\n Stream$8.prototype.flush = function (flushSource) {\n this.trigger('done', flushSource);\n };\n Stream$8.prototype.partialFlush = function (flushSource) {\n this.trigger('partialdone', flushSource);\n };\n Stream$8.prototype.endTimeline = function (flushSource) {\n this.trigger('endedtimeline', flushSource);\n };\n Stream$8.prototype.reset = function (flushSource) {\n this.trigger('reset', flushSource);\n };\n var stream = Stream$8;\n var MAX_UINT32$1 = Math.pow(2, 32);\n var getUint64$3 = function (uint8) {\n var dv = new DataView(uint8.buffer, uint8.byteOffset, uint8.byteLength);\n var value;\n if (dv.getBigUint64) {\n value = dv.getBigUint64(0);\n if (value < Number.MAX_SAFE_INTEGER) {\n return Number(value);\n }\n return value;\n }\n return dv.getUint32(0) * MAX_UINT32$1 + dv.getUint32(4);\n };\n var numbers = {\n getUint64: getUint64$3,\n MAX_UINT32: MAX_UINT32$1\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * Functions that generate fragmented MP4s suitable for use with Media\n * Source Extensions.\n */\n\n var MAX_UINT32 = numbers.MAX_UINT32;\n var box, dinf, esds, ftyp, mdat, mfhd, minf, moof, moov, mvex, mvhd, trak, tkhd, mdia, mdhd, hdlr, sdtp, stbl, stsd, traf, trex, trun$1, types, MAJOR_BRAND, MINOR_VERSION, AVC1_BRAND, VIDEO_HDLR, AUDIO_HDLR, HDLR_TYPES, VMHD, SMHD, DREF, STCO, STSC, STSZ, STTS; // pre-calculate constants\n\n (function () {\n var i;\n types = {\n avc1: [],\n // codingname\n avcC: [],\n btrt: [],\n dinf: [],\n dref: [],\n esds: [],\n ftyp: [],\n hdlr: [],\n mdat: [],\n mdhd: [],\n mdia: [],\n mfhd: [],\n minf: [],\n moof: [],\n moov: [],\n mp4a: [],\n // codingname\n mvex: [],\n mvhd: [],\n pasp: [],\n sdtp: [],\n smhd: [],\n stbl: [],\n stco: [],\n stsc: [],\n stsd: [],\n stsz: [],\n stts: [],\n styp: [],\n tfdt: [],\n tfhd: [],\n traf: [],\n trak: [],\n trun: [],\n trex: [],\n tkhd: [],\n vmhd: []\n }; // In environments where Uint8Array is undefined (e.g., IE8), skip set up so that we\n // don't throw an error\n\n if (typeof Uint8Array === 'undefined') {\n return;\n }\n for (i in types) {\n if (types.hasOwnProperty(i)) {\n types[i] = [i.charCodeAt(0), i.charCodeAt(1), i.charCodeAt(2), i.charCodeAt(3)];\n }\n }\n MAJOR_BRAND = new Uint8Array(['i'.charCodeAt(0), 's'.charCodeAt(0), 'o'.charCodeAt(0), 'm'.charCodeAt(0)]);\n AVC1_BRAND = new Uint8Array(['a'.charCodeAt(0), 'v'.charCodeAt(0), 'c'.charCodeAt(0), '1'.charCodeAt(0)]);\n MINOR_VERSION = new Uint8Array([0, 0, 0, 1]);\n VIDEO_HDLR = new Uint8Array([0x00,\n // version 0\n 0x00, 0x00, 0x00,\n // flags\n 0x00, 0x00, 0x00, 0x00,\n // pre_defined\n 0x76, 0x69, 0x64, 0x65,\n // handler_type: 'vide'\n 0x00, 0x00, 0x00, 0x00,\n // reserved\n 0x00, 0x00, 0x00, 0x00,\n // reserved\n 0x00, 0x00, 0x00, 0x00,\n // reserved\n 0x56, 0x69, 0x64, 0x65, 0x6f, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x00 // name: 'VideoHandler'\n ]);\n\n AUDIO_HDLR = new Uint8Array([0x00,\n // version 0\n 0x00, 0x00, 0x00,\n // flags\n 0x00, 0x00, 0x00, 0x00,\n // pre_defined\n 0x73, 0x6f, 0x75, 0x6e,\n // handler_type: 'soun'\n 0x00, 0x00, 0x00, 0x00,\n // reserved\n 0x00, 0x00, 0x00, 0x00,\n // reserved\n 0x00, 0x00, 0x00, 0x00,\n // reserved\n 0x53, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x00 // name: 'SoundHandler'\n ]);\n\n HDLR_TYPES = {\n video: VIDEO_HDLR,\n audio: AUDIO_HDLR\n };\n DREF = new Uint8Array([0x00,\n // version 0\n 0x00, 0x00, 0x00,\n // flags\n 0x00, 0x00, 0x00, 0x01,\n // entry_count\n 0x00, 0x00, 0x00, 0x0c,\n // entry_size\n 0x75, 0x72, 0x6c, 0x20,\n // 'url' type\n 0x00,\n // version 0\n 0x00, 0x00, 0x01 // entry_flags\n ]);\n\n SMHD = new Uint8Array([0x00,\n // version\n 0x00, 0x00, 0x00,\n // flags\n 0x00, 0x00,\n // balance, 0 means centered\n 0x00, 0x00 // reserved\n ]);\n\n STCO = new Uint8Array([0x00,\n // version\n 0x00, 0x00, 0x00,\n // flags\n 0x00, 0x00, 0x00, 0x00 // entry_count\n ]);\n\n STSC = STCO;\n STSZ = new Uint8Array([0x00,\n // version\n 0x00, 0x00, 0x00,\n // flags\n 0x00, 0x00, 0x00, 0x00,\n // sample_size\n 0x00, 0x00, 0x00, 0x00 // sample_count\n ]);\n\n STTS = STCO;\n VMHD = new Uint8Array([0x00,\n // version\n 0x00, 0x00, 0x01,\n // flags\n 0x00, 0x00,\n // graphicsmode\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // opcolor\n ]);\n })();\n\n box = function (type) {\n var payload = [],\n size = 0,\n i,\n result,\n view;\n for (i = 1; i < arguments.length; i++) {\n payload.push(arguments[i]);\n }\n i = payload.length; // calculate the total size we need to allocate\n\n while (i--) {\n size += payload[i].byteLength;\n }\n result = new Uint8Array(size + 8);\n view = new DataView(result.buffer, result.byteOffset, result.byteLength);\n view.setUint32(0, result.byteLength);\n result.set(type, 4); // copy the payload into the result\n\n for (i = 0, size = 8; i < payload.length; i++) {\n result.set(payload[i], size);\n size += payload[i].byteLength;\n }\n return result;\n };\n dinf = function () {\n return box(types.dinf, box(types.dref, DREF));\n };\n esds = function (track) {\n return box(types.esds, new Uint8Array([0x00,\n // version\n 0x00, 0x00, 0x00,\n // flags\n // ES_Descriptor\n 0x03,\n // tag, ES_DescrTag\n 0x19,\n // length\n 0x00, 0x00,\n // ES_ID\n 0x00,\n // streamDependenceFlag, URL_flag, reserved, streamPriority\n // DecoderConfigDescriptor\n 0x04,\n // tag, DecoderConfigDescrTag\n 0x11,\n // length\n 0x40,\n // object type\n 0x15,\n // streamType\n 0x00, 0x06, 0x00,\n // bufferSizeDB\n 0x00, 0x00, 0xda, 0xc0,\n // maxBitrate\n 0x00, 0x00, 0xda, 0xc0,\n // avgBitrate\n // DecoderSpecificInfo\n 0x05,\n // tag, DecoderSpecificInfoTag\n 0x02,\n // length\n // ISO/IEC 14496-3, AudioSpecificConfig\n // for samplingFrequencyIndex see ISO/IEC 13818-7:2006, 8.1.3.2.2, Table 35\n track.audioobjecttype << 3 | track.samplingfrequencyindex >>> 1, track.samplingfrequencyindex << 7 | track.channelcount << 3, 0x06, 0x01, 0x02 // GASpecificConfig\n ]));\n };\n\n ftyp = function () {\n return box(types.ftyp, MAJOR_BRAND, MINOR_VERSION, MAJOR_BRAND, AVC1_BRAND);\n };\n hdlr = function (type) {\n return box(types.hdlr, HDLR_TYPES[type]);\n };\n mdat = function (data) {\n return box(types.mdat, data);\n };\n mdhd = function (track) {\n var result = new Uint8Array([0x00,\n // version 0\n 0x00, 0x00, 0x00,\n // flags\n 0x00, 0x00, 0x00, 0x02,\n // creation_time\n 0x00, 0x00, 0x00, 0x03,\n // modification_time\n 0x00, 0x01, 0x5f, 0x90,\n // timescale, 90,000 \"ticks\" per second\n track.duration >>> 24 & 0xFF, track.duration >>> 16 & 0xFF, track.duration >>> 8 & 0xFF, track.duration & 0xFF,\n // duration\n 0x55, 0xc4,\n // 'und' language (undetermined)\n 0x00, 0x00]); // Use the sample rate from the track metadata, when it is\n // defined. The sample rate can be parsed out of an ADTS header, for\n // instance.\n\n if (track.samplerate) {\n result[12] = track.samplerate >>> 24 & 0xFF;\n result[13] = track.samplerate >>> 16 & 0xFF;\n result[14] = track.samplerate >>> 8 & 0xFF;\n result[15] = track.samplerate & 0xFF;\n }\n return box(types.mdhd, result);\n };\n mdia = function (track) {\n return box(types.mdia, mdhd(track), hdlr(track.type), minf(track));\n };\n mfhd = function (sequenceNumber) {\n return box(types.mfhd, new Uint8Array([0x00, 0x00, 0x00, 0x00,\n // flags\n (sequenceNumber & 0xFF000000) >> 24, (sequenceNumber & 0xFF0000) >> 16, (sequenceNumber & 0xFF00) >> 8, sequenceNumber & 0xFF // sequence_number\n ]));\n };\n\n minf = function (track) {\n return box(types.minf, track.type === 'video' ? box(types.vmhd, VMHD) : box(types.smhd, SMHD), dinf(), stbl(track));\n };\n moof = function (sequenceNumber, tracks) {\n var trackFragments = [],\n i = tracks.length; // build traf boxes for each track fragment\n\n while (i--) {\n trackFragments[i] = traf(tracks[i]);\n }\n return box.apply(null, [types.moof, mfhd(sequenceNumber)].concat(trackFragments));\n };\n /**\n * Returns a movie box.\n * @param tracks {array} the tracks associated with this movie\n * @see ISO/IEC 14496-12:2012(E), section 8.2.1\n */\n\n moov = function (tracks) {\n var i = tracks.length,\n boxes = [];\n while (i--) {\n boxes[i] = trak(tracks[i]);\n }\n return box.apply(null, [types.moov, mvhd(0xffffffff)].concat(boxes).concat(mvex(tracks)));\n };\n mvex = function (tracks) {\n var i = tracks.length,\n boxes = [];\n while (i--) {\n boxes[i] = trex(tracks[i]);\n }\n return box.apply(null, [types.mvex].concat(boxes));\n };\n mvhd = function (duration) {\n var bytes = new Uint8Array([0x00,\n // version 0\n 0x00, 0x00, 0x00,\n // flags\n 0x00, 0x00, 0x00, 0x01,\n // creation_time\n 0x00, 0x00, 0x00, 0x02,\n // modification_time\n 0x00, 0x01, 0x5f, 0x90,\n // timescale, 90,000 \"ticks\" per second\n (duration & 0xFF000000) >> 24, (duration & 0xFF0000) >> 16, (duration & 0xFF00) >> 8, duration & 0xFF,\n // duration\n 0x00, 0x01, 0x00, 0x00,\n // 1.0 rate\n 0x01, 0x00,\n // 1.0 volume\n 0x00, 0x00,\n // reserved\n 0x00, 0x00, 0x00, 0x00,\n // reserved\n 0x00, 0x00, 0x00, 0x00,\n // reserved\n 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,\n // transformation: unity matrix\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n // pre_defined\n 0xff, 0xff, 0xff, 0xff // next_track_ID\n ]);\n\n return box(types.mvhd, bytes);\n };\n sdtp = function (track) {\n var samples = track.samples || [],\n bytes = new Uint8Array(4 + samples.length),\n flags,\n i; // leave the full box header (4 bytes) all zero\n // write the sample table\n\n for (i = 0; i < samples.length; i++) {\n flags = samples[i].flags;\n bytes[i + 4] = flags.dependsOn << 4 | flags.isDependedOn << 2 | flags.hasRedundancy;\n }\n return box(types.sdtp, bytes);\n };\n stbl = function (track) {\n return box(types.stbl, stsd(track), box(types.stts, STTS), box(types.stsc, STSC), box(types.stsz, STSZ), box(types.stco, STCO));\n };\n (function () {\n var videoSample, audioSample;\n stsd = function (track) {\n return box(types.stsd, new Uint8Array([0x00,\n // version 0\n 0x00, 0x00, 0x00,\n // flags\n 0x00, 0x00, 0x00, 0x01]), track.type === 'video' ? videoSample(track) : audioSample(track));\n };\n videoSample = function (track) {\n var sps = track.sps || [],\n pps = track.pps || [],\n sequenceParameterSets = [],\n pictureParameterSets = [],\n i,\n avc1Box; // assemble the SPSs\n\n for (i = 0; i < sps.length; i++) {\n sequenceParameterSets.push((sps[i].byteLength & 0xFF00) >>> 8);\n sequenceParameterSets.push(sps[i].byteLength & 0xFF); // sequenceParameterSetLength\n\n sequenceParameterSets = sequenceParameterSets.concat(Array.prototype.slice.call(sps[i])); // SPS\n } // assemble the PPSs\n\n for (i = 0; i < pps.length; i++) {\n pictureParameterSets.push((pps[i].byteLength & 0xFF00) >>> 8);\n pictureParameterSets.push(pps[i].byteLength & 0xFF);\n pictureParameterSets = pictureParameterSets.concat(Array.prototype.slice.call(pps[i]));\n }\n avc1Box = [types.avc1, new Uint8Array([0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n // reserved\n 0x00, 0x01,\n // data_reference_index\n 0x00, 0x00,\n // pre_defined\n 0x00, 0x00,\n // reserved\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n // pre_defined\n (track.width & 0xff00) >> 8, track.width & 0xff,\n // width\n (track.height & 0xff00) >> 8, track.height & 0xff,\n // height\n 0x00, 0x48, 0x00, 0x00,\n // horizresolution\n 0x00, 0x48, 0x00, 0x00,\n // vertresolution\n 0x00, 0x00, 0x00, 0x00,\n // reserved\n 0x00, 0x01,\n // frame_count\n 0x13, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x6a, 0x73, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x2d, 0x68, 0x6c, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n // compressorname\n 0x00, 0x18,\n // depth = 24\n 0x11, 0x11 // pre_defined = -1\n ]), box(types.avcC, new Uint8Array([0x01,\n // configurationVersion\n track.profileIdc,\n // AVCProfileIndication\n track.profileCompatibility,\n // profile_compatibility\n track.levelIdc,\n // AVCLevelIndication\n 0xff // lengthSizeMinusOne, hard-coded to 4 bytes\n ].concat([sps.length],\n // numOfSequenceParameterSets\n sequenceParameterSets,\n // \"SPS\"\n [pps.length],\n // numOfPictureParameterSets\n pictureParameterSets // \"PPS\"\n ))), box(types.btrt, new Uint8Array([0x00, 0x1c, 0x9c, 0x80,\n // bufferSizeDB\n 0x00, 0x2d, 0xc6, 0xc0,\n // maxBitrate\n 0x00, 0x2d, 0xc6, 0xc0 // avgBitrate\n ]))];\n\n if (track.sarRatio) {\n var hSpacing = track.sarRatio[0],\n vSpacing = track.sarRatio[1];\n avc1Box.push(box(types.pasp, new Uint8Array([(hSpacing & 0xFF000000) >> 24, (hSpacing & 0xFF0000) >> 16, (hSpacing & 0xFF00) >> 8, hSpacing & 0xFF, (vSpacing & 0xFF000000) >> 24, (vSpacing & 0xFF0000) >> 16, (vSpacing & 0xFF00) >> 8, vSpacing & 0xFF])));\n }\n return box.apply(null, avc1Box);\n };\n audioSample = function (track) {\n return box(types.mp4a, new Uint8Array([\n // SampleEntry, ISO/IEC 14496-12\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n // reserved\n 0x00, 0x01,\n // data_reference_index\n // AudioSampleEntry, ISO/IEC 14496-12\n 0x00, 0x00, 0x00, 0x00,\n // reserved\n 0x00, 0x00, 0x00, 0x00,\n // reserved\n (track.channelcount & 0xff00) >> 8, track.channelcount & 0xff,\n // channelcount\n (track.samplesize & 0xff00) >> 8, track.samplesize & 0xff,\n // samplesize\n 0x00, 0x00,\n // pre_defined\n 0x00, 0x00,\n // reserved\n (track.samplerate & 0xff00) >> 8, track.samplerate & 0xff, 0x00, 0x00 // samplerate, 16.16\n // MP4AudioSampleEntry, ISO/IEC 14496-14\n ]), esds(track));\n };\n })();\n tkhd = function (track) {\n var result = new Uint8Array([0x00,\n // version 0\n 0x00, 0x00, 0x07,\n // flags\n 0x00, 0x00, 0x00, 0x00,\n // creation_time\n 0x00, 0x00, 0x00, 0x00,\n // modification_time\n (track.id & 0xFF000000) >> 24, (track.id & 0xFF0000) >> 16, (track.id & 0xFF00) >> 8, track.id & 0xFF,\n // track_ID\n 0x00, 0x00, 0x00, 0x00,\n // reserved\n (track.duration & 0xFF000000) >> 24, (track.duration & 0xFF0000) >> 16, (track.duration & 0xFF00) >> 8, track.duration & 0xFF,\n // duration\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n // reserved\n 0x00, 0x00,\n // layer\n 0x00, 0x00,\n // alternate_group\n 0x01, 0x00,\n // non-audio track volume\n 0x00, 0x00,\n // reserved\n 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,\n // transformation: unity matrix\n (track.width & 0xFF00) >> 8, track.width & 0xFF, 0x00, 0x00,\n // width\n (track.height & 0xFF00) >> 8, track.height & 0xFF, 0x00, 0x00 // height\n ]);\n\n return box(types.tkhd, result);\n };\n /**\n * Generate a track fragment (traf) box. A traf box collects metadata\n * about tracks in a movie fragment (moof) box.\n */\n\n traf = function (track) {\n var trackFragmentHeader, trackFragmentDecodeTime, trackFragmentRun, sampleDependencyTable, dataOffset, upperWordBaseMediaDecodeTime, lowerWordBaseMediaDecodeTime;\n trackFragmentHeader = box(types.tfhd, new Uint8Array([0x00,\n // version 0\n 0x00, 0x00, 0x3a,\n // flags\n (track.id & 0xFF000000) >> 24, (track.id & 0xFF0000) >> 16, (track.id & 0xFF00) >> 8, track.id & 0xFF,\n // track_ID\n 0x00, 0x00, 0x00, 0x01,\n // sample_description_index\n 0x00, 0x00, 0x00, 0x00,\n // default_sample_duration\n 0x00, 0x00, 0x00, 0x00,\n // default_sample_size\n 0x00, 0x00, 0x00, 0x00 // default_sample_flags\n ]));\n\n upperWordBaseMediaDecodeTime = Math.floor(track.baseMediaDecodeTime / MAX_UINT32);\n lowerWordBaseMediaDecodeTime = Math.floor(track.baseMediaDecodeTime % MAX_UINT32);\n trackFragmentDecodeTime = box(types.tfdt, new Uint8Array([0x01,\n // version 1\n 0x00, 0x00, 0x00,\n // flags\n // baseMediaDecodeTime\n upperWordBaseMediaDecodeTime >>> 24 & 0xFF, upperWordBaseMediaDecodeTime >>> 16 & 0xFF, upperWordBaseMediaDecodeTime >>> 8 & 0xFF, upperWordBaseMediaDecodeTime & 0xFF, lowerWordBaseMediaDecodeTime >>> 24 & 0xFF, lowerWordBaseMediaDecodeTime >>> 16 & 0xFF, lowerWordBaseMediaDecodeTime >>> 8 & 0xFF, lowerWordBaseMediaDecodeTime & 0xFF])); // the data offset specifies the number of bytes from the start of\n // the containing moof to the first payload byte of the associated\n // mdat\n\n dataOffset = 32 +\n // tfhd\n 20 +\n // tfdt\n 8 +\n // traf header\n 16 +\n // mfhd\n 8 +\n // moof header\n 8; // mdat header\n // audio tracks require less metadata\n\n if (track.type === 'audio') {\n trackFragmentRun = trun$1(track, dataOffset);\n return box(types.traf, trackFragmentHeader, trackFragmentDecodeTime, trackFragmentRun);\n } // video tracks should contain an independent and disposable samples\n // box (sdtp)\n // generate one and adjust offsets to match\n\n sampleDependencyTable = sdtp(track);\n trackFragmentRun = trun$1(track, sampleDependencyTable.length + dataOffset);\n return box(types.traf, trackFragmentHeader, trackFragmentDecodeTime, trackFragmentRun, sampleDependencyTable);\n };\n /**\n * Generate a track box.\n * @param track {object} a track definition\n * @return {Uint8Array} the track box\n */\n\n trak = function (track) {\n track.duration = track.duration || 0xffffffff;\n return box(types.trak, tkhd(track), mdia(track));\n };\n trex = function (track) {\n var result = new Uint8Array([0x00,\n // version 0\n 0x00, 0x00, 0x00,\n // flags\n (track.id & 0xFF000000) >> 24, (track.id & 0xFF0000) >> 16, (track.id & 0xFF00) >> 8, track.id & 0xFF,\n // track_ID\n 0x00, 0x00, 0x00, 0x01,\n // default_sample_description_index\n 0x00, 0x00, 0x00, 0x00,\n // default_sample_duration\n 0x00, 0x00, 0x00, 0x00,\n // default_sample_size\n 0x00, 0x01, 0x00, 0x01 // default_sample_flags\n ]); // the last two bytes of default_sample_flags is the sample\n // degradation priority, a hint about the importance of this sample\n // relative to others. Lower the degradation priority for all sample\n // types other than video.\n\n if (track.type !== 'video') {\n result[result.length - 1] = 0x00;\n }\n return box(types.trex, result);\n };\n (function () {\n var audioTrun, videoTrun, trunHeader; // This method assumes all samples are uniform. That is, if a\n // duration is present for the first sample, it will be present for\n // all subsequent samples.\n // see ISO/IEC 14496-12:2012, Section 8.8.8.1\n\n trunHeader = function (samples, offset) {\n var durationPresent = 0,\n sizePresent = 0,\n flagsPresent = 0,\n compositionTimeOffset = 0; // trun flag constants\n\n if (samples.length) {\n if (samples[0].duration !== undefined) {\n durationPresent = 0x1;\n }\n if (samples[0].size !== undefined) {\n sizePresent = 0x2;\n }\n if (samples[0].flags !== undefined) {\n flagsPresent = 0x4;\n }\n if (samples[0].compositionTimeOffset !== undefined) {\n compositionTimeOffset = 0x8;\n }\n }\n return [0x00,\n // version 0\n 0x00, durationPresent | sizePresent | flagsPresent | compositionTimeOffset, 0x01,\n // flags\n (samples.length & 0xFF000000) >>> 24, (samples.length & 0xFF0000) >>> 16, (samples.length & 0xFF00) >>> 8, samples.length & 0xFF,\n // sample_count\n (offset & 0xFF000000) >>> 24, (offset & 0xFF0000) >>> 16, (offset & 0xFF00) >>> 8, offset & 0xFF // data_offset\n ];\n };\n\n videoTrun = function (track, offset) {\n var bytesOffest, bytes, header, samples, sample, i;\n samples = track.samples || [];\n offset += 8 + 12 + 16 * samples.length;\n header = trunHeader(samples, offset);\n bytes = new Uint8Array(header.length + samples.length * 16);\n bytes.set(header);\n bytesOffest = header.length;\n for (i = 0; i < samples.length; i++) {\n sample = samples[i];\n bytes[bytesOffest++] = (sample.duration & 0xFF000000) >>> 24;\n bytes[bytesOffest++] = (sample.duration & 0xFF0000) >>> 16;\n bytes[bytesOffest++] = (sample.duration & 0xFF00) >>> 8;\n bytes[bytesOffest++] = sample.duration & 0xFF; // sample_duration\n\n bytes[bytesOffest++] = (sample.size & 0xFF000000) >>> 24;\n bytes[bytesOffest++] = (sample.size & 0xFF0000) >>> 16;\n bytes[bytesOffest++] = (sample.size & 0xFF00) >>> 8;\n bytes[bytesOffest++] = sample.size & 0xFF; // sample_size\n\n bytes[bytesOffest++] = sample.flags.isLeading << 2 | sample.flags.dependsOn;\n bytes[bytesOffest++] = sample.flags.isDependedOn << 6 | sample.flags.hasRedundancy << 4 | sample.flags.paddingValue << 1 | sample.flags.isNonSyncSample;\n bytes[bytesOffest++] = sample.flags.degradationPriority & 0xF0 << 8;\n bytes[bytesOffest++] = sample.flags.degradationPriority & 0x0F; // sample_flags\n\n bytes[bytesOffest++] = (sample.compositionTimeOffset & 0xFF000000) >>> 24;\n bytes[bytesOffest++] = (sample.compositionTimeOffset & 0xFF0000) >>> 16;\n bytes[bytesOffest++] = (sample.compositionTimeOffset & 0xFF00) >>> 8;\n bytes[bytesOffest++] = sample.compositionTimeOffset & 0xFF; // sample_composition_time_offset\n }\n\n return box(types.trun, bytes);\n };\n audioTrun = function (track, offset) {\n var bytes, bytesOffest, header, samples, sample, i;\n samples = track.samples || [];\n offset += 8 + 12 + 8 * samples.length;\n header = trunHeader(samples, offset);\n bytes = new Uint8Array(header.length + samples.length * 8);\n bytes.set(header);\n bytesOffest = header.length;\n for (i = 0; i < samples.length; i++) {\n sample = samples[i];\n bytes[bytesOffest++] = (sample.duration & 0xFF000000) >>> 24;\n bytes[bytesOffest++] = (sample.duration & 0xFF0000) >>> 16;\n bytes[bytesOffest++] = (sample.duration & 0xFF00) >>> 8;\n bytes[bytesOffest++] = sample.duration & 0xFF; // sample_duration\n\n bytes[bytesOffest++] = (sample.size & 0xFF000000) >>> 24;\n bytes[bytesOffest++] = (sample.size & 0xFF0000) >>> 16;\n bytes[bytesOffest++] = (sample.size & 0xFF00) >>> 8;\n bytes[bytesOffest++] = sample.size & 0xFF; // sample_size\n }\n\n return box(types.trun, bytes);\n };\n trun$1 = function (track, offset) {\n if (track.type === 'audio') {\n return audioTrun(track, offset);\n }\n return videoTrun(track, offset);\n };\n })();\n var mp4Generator = {\n ftyp: ftyp,\n mdat: mdat,\n moof: moof,\n moov: moov,\n initSegment: function (tracks) {\n var fileType = ftyp(),\n movie = moov(tracks),\n result;\n result = new Uint8Array(fileType.byteLength + movie.byteLength);\n result.set(fileType);\n result.set(movie, fileType.byteLength);\n return result;\n }\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n */\n // composed of the nal units that make up that frame\n // Also keep track of cummulative data about the frame from the nal units such\n // as the frame duration, starting pts, etc.\n\n var groupNalsIntoFrames = function (nalUnits) {\n var i,\n currentNal,\n currentFrame = [],\n frames = []; // TODO added for LHLS, make sure this is OK\n\n frames.byteLength = 0;\n frames.nalCount = 0;\n frames.duration = 0;\n currentFrame.byteLength = 0;\n for (i = 0; i < nalUnits.length; i++) {\n currentNal = nalUnits[i]; // Split on 'aud'-type nal units\n\n if (currentNal.nalUnitType === 'access_unit_delimiter_rbsp') {\n // Since the very first nal unit is expected to be an AUD\n // only push to the frames array when currentFrame is not empty\n if (currentFrame.length) {\n currentFrame.duration = currentNal.dts - currentFrame.dts; // TODO added for LHLS, make sure this is OK\n\n frames.byteLength += currentFrame.byteLength;\n frames.nalCount += currentFrame.length;\n frames.duration += currentFrame.duration;\n frames.push(currentFrame);\n }\n currentFrame = [currentNal];\n currentFrame.byteLength = currentNal.data.byteLength;\n currentFrame.pts = currentNal.pts;\n currentFrame.dts = currentNal.dts;\n } else {\n // Specifically flag key frames for ease of use later\n if (currentNal.nalUnitType === 'slice_layer_without_partitioning_rbsp_idr') {\n currentFrame.keyFrame = true;\n }\n currentFrame.duration = currentNal.dts - currentFrame.dts;\n currentFrame.byteLength += currentNal.data.byteLength;\n currentFrame.push(currentNal);\n }\n } // For the last frame, use the duration of the previous frame if we\n // have nothing better to go on\n\n if (frames.length && (!currentFrame.duration || currentFrame.duration <= 0)) {\n currentFrame.duration = frames[frames.length - 1].duration;\n } // Push the final frame\n // TODO added for LHLS, make sure this is OK\n\n frames.byteLength += currentFrame.byteLength;\n frames.nalCount += currentFrame.length;\n frames.duration += currentFrame.duration;\n frames.push(currentFrame);\n return frames;\n }; // Convert an array of frames into an array of Gop with each Gop being composed\n // of the frames that make up that Gop\n // Also keep track of cummulative data about the Gop from the frames such as the\n // Gop duration, starting pts, etc.\n\n var groupFramesIntoGops = function (frames) {\n var i,\n currentFrame,\n currentGop = [],\n gops = []; // We must pre-set some of the values on the Gop since we\n // keep running totals of these values\n\n currentGop.byteLength = 0;\n currentGop.nalCount = 0;\n currentGop.duration = 0;\n currentGop.pts = frames[0].pts;\n currentGop.dts = frames[0].dts; // store some metadata about all the Gops\n\n gops.byteLength = 0;\n gops.nalCount = 0;\n gops.duration = 0;\n gops.pts = frames[0].pts;\n gops.dts = frames[0].dts;\n for (i = 0; i < frames.length; i++) {\n currentFrame = frames[i];\n if (currentFrame.keyFrame) {\n // Since the very first frame is expected to be an keyframe\n // only push to the gops array when currentGop is not empty\n if (currentGop.length) {\n gops.push(currentGop);\n gops.byteLength += currentGop.byteLength;\n gops.nalCount += currentGop.nalCount;\n gops.duration += currentGop.duration;\n }\n currentGop = [currentFrame];\n currentGop.nalCount = currentFrame.length;\n currentGop.byteLength = currentFrame.byteLength;\n currentGop.pts = currentFrame.pts;\n currentGop.dts = currentFrame.dts;\n currentGop.duration = currentFrame.duration;\n } else {\n currentGop.duration += currentFrame.duration;\n currentGop.nalCount += currentFrame.length;\n currentGop.byteLength += currentFrame.byteLength;\n currentGop.push(currentFrame);\n }\n }\n if (gops.length && currentGop.duration <= 0) {\n currentGop.duration = gops[gops.length - 1].duration;\n }\n gops.byteLength += currentGop.byteLength;\n gops.nalCount += currentGop.nalCount;\n gops.duration += currentGop.duration; // push the final Gop\n\n gops.push(currentGop);\n return gops;\n };\n /*\n * Search for the first keyframe in the GOPs and throw away all frames\n * until that keyframe. Then extend the duration of the pulled keyframe\n * and pull the PTS and DTS of the keyframe so that it covers the time\n * range of the frames that were disposed.\n *\n * @param {Array} gops video GOPs\n * @returns {Array} modified video GOPs\n */\n\n var extendFirstKeyFrame = function (gops) {\n var currentGop;\n if (!gops[0][0].keyFrame && gops.length > 1) {\n // Remove the first GOP\n currentGop = gops.shift();\n gops.byteLength -= currentGop.byteLength;\n gops.nalCount -= currentGop.nalCount; // Extend the first frame of what is now the\n // first gop to cover the time period of the\n // frames we just removed\n\n gops[0][0].dts = currentGop.dts;\n gops[0][0].pts = currentGop.pts;\n gops[0][0].duration += currentGop.duration;\n }\n return gops;\n };\n /**\n * Default sample object\n * see ISO/IEC 14496-12:2012, section 8.6.4.3\n */\n\n var createDefaultSample = function () {\n return {\n size: 0,\n flags: {\n isLeading: 0,\n dependsOn: 1,\n isDependedOn: 0,\n hasRedundancy: 0,\n degradationPriority: 0,\n isNonSyncSample: 1\n }\n };\n };\n /*\n * Collates information from a video frame into an object for eventual\n * entry into an MP4 sample table.\n *\n * @param {Object} frame the video frame\n * @param {Number} dataOffset the byte offset to position the sample\n * @return {Object} object containing sample table info for a frame\n */\n\n var sampleForFrame = function (frame, dataOffset) {\n var sample = createDefaultSample();\n sample.dataOffset = dataOffset;\n sample.compositionTimeOffset = frame.pts - frame.dts;\n sample.duration = frame.duration;\n sample.size = 4 * frame.length; // Space for nal unit size\n\n sample.size += frame.byteLength;\n if (frame.keyFrame) {\n sample.flags.dependsOn = 2;\n sample.flags.isNonSyncSample = 0;\n }\n return sample;\n }; // generate the track's sample table from an array of gops\n\n var generateSampleTable$1 = function (gops, baseDataOffset) {\n var h,\n i,\n sample,\n currentGop,\n currentFrame,\n dataOffset = baseDataOffset || 0,\n samples = [];\n for (h = 0; h < gops.length; h++) {\n currentGop = gops[h];\n for (i = 0; i < currentGop.length; i++) {\n currentFrame = currentGop[i];\n sample = sampleForFrame(currentFrame, dataOffset);\n dataOffset += sample.size;\n samples.push(sample);\n }\n }\n return samples;\n }; // generate the track's raw mdat data from an array of gops\n\n var concatenateNalData = function (gops) {\n var h,\n i,\n j,\n currentGop,\n currentFrame,\n currentNal,\n dataOffset = 0,\n nalsByteLength = gops.byteLength,\n numberOfNals = gops.nalCount,\n totalByteLength = nalsByteLength + 4 * numberOfNals,\n data = new Uint8Array(totalByteLength),\n view = new DataView(data.buffer); // For each Gop..\n\n for (h = 0; h < gops.length; h++) {\n currentGop = gops[h]; // For each Frame..\n\n for (i = 0; i < currentGop.length; i++) {\n currentFrame = currentGop[i]; // For each NAL..\n\n for (j = 0; j < currentFrame.length; j++) {\n currentNal = currentFrame[j];\n view.setUint32(dataOffset, currentNal.data.byteLength);\n dataOffset += 4;\n data.set(currentNal.data, dataOffset);\n dataOffset += currentNal.data.byteLength;\n }\n }\n }\n return data;\n }; // generate the track's sample table from a frame\n\n var generateSampleTableForFrame = function (frame, baseDataOffset) {\n var sample,\n dataOffset = baseDataOffset || 0,\n samples = [];\n sample = sampleForFrame(frame, dataOffset);\n samples.push(sample);\n return samples;\n }; // generate the track's raw mdat data from a frame\n\n var concatenateNalDataForFrame = function (frame) {\n var i,\n currentNal,\n dataOffset = 0,\n nalsByteLength = frame.byteLength,\n numberOfNals = frame.length,\n totalByteLength = nalsByteLength + 4 * numberOfNals,\n data = new Uint8Array(totalByteLength),\n view = new DataView(data.buffer); // For each NAL..\n\n for (i = 0; i < frame.length; i++) {\n currentNal = frame[i];\n view.setUint32(dataOffset, currentNal.data.byteLength);\n dataOffset += 4;\n data.set(currentNal.data, dataOffset);\n dataOffset += currentNal.data.byteLength;\n }\n return data;\n };\n var frameUtils$1 = {\n groupNalsIntoFrames: groupNalsIntoFrames,\n groupFramesIntoGops: groupFramesIntoGops,\n extendFirstKeyFrame: extendFirstKeyFrame,\n generateSampleTable: generateSampleTable$1,\n concatenateNalData: concatenateNalData,\n generateSampleTableForFrame: generateSampleTableForFrame,\n concatenateNalDataForFrame: concatenateNalDataForFrame\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n */\n\n var highPrefix = [33, 16, 5, 32, 164, 27];\n var lowPrefix = [33, 65, 108, 84, 1, 2, 4, 8, 168, 2, 4, 8, 17, 191, 252];\n var zeroFill = function (count) {\n var a = [];\n while (count--) {\n a.push(0);\n }\n return a;\n };\n var makeTable = function (metaTable) {\n return Object.keys(metaTable).reduce(function (obj, key) {\n obj[key] = new Uint8Array(metaTable[key].reduce(function (arr, part) {\n return arr.concat(part);\n }, []));\n return obj;\n }, {});\n };\n var silence;\n var silence_1 = function () {\n if (!silence) {\n // Frames-of-silence to use for filling in missing AAC frames\n var coneOfSilence = {\n 96000: [highPrefix, [227, 64], zeroFill(154), [56]],\n 88200: [highPrefix, [231], zeroFill(170), [56]],\n 64000: [highPrefix, [248, 192], zeroFill(240), [56]],\n 48000: [highPrefix, [255, 192], zeroFill(268), [55, 148, 128], zeroFill(54), [112]],\n 44100: [highPrefix, [255, 192], zeroFill(268), [55, 163, 128], zeroFill(84), [112]],\n 32000: [highPrefix, [255, 192], zeroFill(268), [55, 234], zeroFill(226), [112]],\n 24000: [highPrefix, [255, 192], zeroFill(268), [55, 255, 128], zeroFill(268), [111, 112], zeroFill(126), [224]],\n 16000: [highPrefix, [255, 192], zeroFill(268), [55, 255, 128], zeroFill(268), [111, 255], zeroFill(269), [223, 108], zeroFill(195), [1, 192]],\n 12000: [lowPrefix, zeroFill(268), [3, 127, 248], zeroFill(268), [6, 255, 240], zeroFill(268), [13, 255, 224], zeroFill(268), [27, 253, 128], zeroFill(259), [56]],\n 11025: [lowPrefix, zeroFill(268), [3, 127, 248], zeroFill(268), [6, 255, 240], zeroFill(268), [13, 255, 224], zeroFill(268), [27, 255, 192], zeroFill(268), [55, 175, 128], zeroFill(108), [112]],\n 8000: [lowPrefix, zeroFill(268), [3, 121, 16], zeroFill(47), [7]]\n };\n silence = makeTable(coneOfSilence);\n }\n return silence;\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n */\n\n var ONE_SECOND_IN_TS$4 = 90000,\n // 90kHz clock\n secondsToVideoTs,\n secondsToAudioTs,\n videoTsToSeconds,\n audioTsToSeconds,\n audioTsToVideoTs,\n videoTsToAudioTs,\n metadataTsToSeconds;\n secondsToVideoTs = function (seconds) {\n return seconds * ONE_SECOND_IN_TS$4;\n };\n secondsToAudioTs = function (seconds, sampleRate) {\n return seconds * sampleRate;\n };\n videoTsToSeconds = function (timestamp) {\n return timestamp / ONE_SECOND_IN_TS$4;\n };\n audioTsToSeconds = function (timestamp, sampleRate) {\n return timestamp / sampleRate;\n };\n audioTsToVideoTs = function (timestamp, sampleRate) {\n return secondsToVideoTs(audioTsToSeconds(timestamp, sampleRate));\n };\n videoTsToAudioTs = function (timestamp, sampleRate) {\n return secondsToAudioTs(videoTsToSeconds(timestamp), sampleRate);\n };\n /**\n * Adjust ID3 tag or caption timing information by the timeline pts values\n * (if keepOriginalTimestamps is false) and convert to seconds\n */\n\n metadataTsToSeconds = function (timestamp, timelineStartPts, keepOriginalTimestamps) {\n return videoTsToSeconds(keepOriginalTimestamps ? timestamp : timestamp - timelineStartPts);\n };\n var clock$2 = {\n ONE_SECOND_IN_TS: ONE_SECOND_IN_TS$4,\n secondsToVideoTs: secondsToVideoTs,\n secondsToAudioTs: secondsToAudioTs,\n videoTsToSeconds: videoTsToSeconds,\n audioTsToSeconds: audioTsToSeconds,\n audioTsToVideoTs: audioTsToVideoTs,\n videoTsToAudioTs: videoTsToAudioTs,\n metadataTsToSeconds: metadataTsToSeconds\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n */\n\n var coneOfSilence = silence_1;\n var clock$1 = clock$2;\n /**\n * Sum the `byteLength` properties of the data in each AAC frame\n */\n\n var sumFrameByteLengths = function (array) {\n var i,\n currentObj,\n sum = 0; // sum the byteLength's all each nal unit in the frame\n\n for (i = 0; i < array.length; i++) {\n currentObj = array[i];\n sum += currentObj.data.byteLength;\n }\n return sum;\n }; // Possibly pad (prefix) the audio track with silence if appending this track\n // would lead to the introduction of a gap in the audio buffer\n\n var prefixWithSilence = function (track, frames, audioAppendStartTs, videoBaseMediaDecodeTime) {\n var baseMediaDecodeTimeTs,\n frameDuration = 0,\n audioGapDuration = 0,\n audioFillFrameCount = 0,\n audioFillDuration = 0,\n silentFrame,\n i,\n firstFrame;\n if (!frames.length) {\n return;\n }\n baseMediaDecodeTimeTs = clock$1.audioTsToVideoTs(track.baseMediaDecodeTime, track.samplerate); // determine frame clock duration based on sample rate, round up to avoid overfills\n\n frameDuration = Math.ceil(clock$1.ONE_SECOND_IN_TS / (track.samplerate / 1024));\n if (audioAppendStartTs && videoBaseMediaDecodeTime) {\n // insert the shortest possible amount (audio gap or audio to video gap)\n audioGapDuration = baseMediaDecodeTimeTs - Math.max(audioAppendStartTs, videoBaseMediaDecodeTime); // number of full frames in the audio gap\n\n audioFillFrameCount = Math.floor(audioGapDuration / frameDuration);\n audioFillDuration = audioFillFrameCount * frameDuration;\n } // don't attempt to fill gaps smaller than a single frame or larger\n // than a half second\n\n if (audioFillFrameCount < 1 || audioFillDuration > clock$1.ONE_SECOND_IN_TS / 2) {\n return;\n }\n silentFrame = coneOfSilence()[track.samplerate];\n if (!silentFrame) {\n // we don't have a silent frame pregenerated for the sample rate, so use a frame\n // from the content instead\n silentFrame = frames[0].data;\n }\n for (i = 0; i < audioFillFrameCount; i++) {\n firstFrame = frames[0];\n frames.splice(0, 0, {\n data: silentFrame,\n dts: firstFrame.dts - frameDuration,\n pts: firstFrame.pts - frameDuration\n });\n }\n track.baseMediaDecodeTime -= Math.floor(clock$1.videoTsToAudioTs(audioFillDuration, track.samplerate));\n return audioFillDuration;\n }; // If the audio segment extends before the earliest allowed dts\n // value, remove AAC frames until starts at or after the earliest\n // allowed DTS so that we don't end up with a negative baseMedia-\n // DecodeTime for the audio track\n\n var trimAdtsFramesByEarliestDts = function (adtsFrames, track, earliestAllowedDts) {\n if (track.minSegmentDts >= earliestAllowedDts) {\n return adtsFrames;\n } // We will need to recalculate the earliest segment Dts\n\n track.minSegmentDts = Infinity;\n return adtsFrames.filter(function (currentFrame) {\n // If this is an allowed frame, keep it and record it's Dts\n if (currentFrame.dts >= earliestAllowedDts) {\n track.minSegmentDts = Math.min(track.minSegmentDts, currentFrame.dts);\n track.minSegmentPts = track.minSegmentDts;\n return true;\n } // Otherwise, discard it\n\n return false;\n });\n }; // generate the track's raw mdat data from an array of frames\n\n var generateSampleTable = function (frames) {\n var i,\n currentFrame,\n samples = [];\n for (i = 0; i < frames.length; i++) {\n currentFrame = frames[i];\n samples.push({\n size: currentFrame.data.byteLength,\n duration: 1024 // For AAC audio, all samples contain 1024 samples\n });\n }\n\n return samples;\n }; // generate the track's sample table from an array of frames\n\n var concatenateFrameData = function (frames) {\n var i,\n currentFrame,\n dataOffset = 0,\n data = new Uint8Array(sumFrameByteLengths(frames));\n for (i = 0; i < frames.length; i++) {\n currentFrame = frames[i];\n data.set(currentFrame.data, dataOffset);\n dataOffset += currentFrame.data.byteLength;\n }\n return data;\n };\n var audioFrameUtils$1 = {\n prefixWithSilence: prefixWithSilence,\n trimAdtsFramesByEarliestDts: trimAdtsFramesByEarliestDts,\n generateSampleTable: generateSampleTable,\n concatenateFrameData: concatenateFrameData\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n */\n\n var ONE_SECOND_IN_TS$3 = clock$2.ONE_SECOND_IN_TS;\n /**\n * Store information about the start and end of the track and the\n * duration for each frame/sample we process in order to calculate\n * the baseMediaDecodeTime\n */\n\n var collectDtsInfo = function (track, data) {\n if (typeof data.pts === 'number') {\n if (track.timelineStartInfo.pts === undefined) {\n track.timelineStartInfo.pts = data.pts;\n }\n if (track.minSegmentPts === undefined) {\n track.minSegmentPts = data.pts;\n } else {\n track.minSegmentPts = Math.min(track.minSegmentPts, data.pts);\n }\n if (track.maxSegmentPts === undefined) {\n track.maxSegmentPts = data.pts;\n } else {\n track.maxSegmentPts = Math.max(track.maxSegmentPts, data.pts);\n }\n }\n if (typeof data.dts === 'number') {\n if (track.timelineStartInfo.dts === undefined) {\n track.timelineStartInfo.dts = data.dts;\n }\n if (track.minSegmentDts === undefined) {\n track.minSegmentDts = data.dts;\n } else {\n track.minSegmentDts = Math.min(track.minSegmentDts, data.dts);\n }\n if (track.maxSegmentDts === undefined) {\n track.maxSegmentDts = data.dts;\n } else {\n track.maxSegmentDts = Math.max(track.maxSegmentDts, data.dts);\n }\n }\n };\n /**\n * Clear values used to calculate the baseMediaDecodeTime between\n * tracks\n */\n\n var clearDtsInfo = function (track) {\n delete track.minSegmentDts;\n delete track.maxSegmentDts;\n delete track.minSegmentPts;\n delete track.maxSegmentPts;\n };\n /**\n * Calculate the track's baseMediaDecodeTime based on the earliest\n * DTS the transmuxer has ever seen and the minimum DTS for the\n * current track\n * @param track {object} track metadata configuration\n * @param keepOriginalTimestamps {boolean} If true, keep the timestamps\n * in the source; false to adjust the first segment to start at 0.\n */\n\n var calculateTrackBaseMediaDecodeTime = function (track, keepOriginalTimestamps) {\n var baseMediaDecodeTime,\n scale,\n minSegmentDts = track.minSegmentDts; // Optionally adjust the time so the first segment starts at zero.\n\n if (!keepOriginalTimestamps) {\n minSegmentDts -= track.timelineStartInfo.dts;\n } // track.timelineStartInfo.baseMediaDecodeTime is the location, in time, where\n // we want the start of the first segment to be placed\n\n baseMediaDecodeTime = track.timelineStartInfo.baseMediaDecodeTime; // Add to that the distance this segment is from the very first\n\n baseMediaDecodeTime += minSegmentDts; // baseMediaDecodeTime must not become negative\n\n baseMediaDecodeTime = Math.max(0, baseMediaDecodeTime);\n if (track.type === 'audio') {\n // Audio has a different clock equal to the sampling_rate so we need to\n // scale the PTS values into the clock rate of the track\n scale = track.samplerate / ONE_SECOND_IN_TS$3;\n baseMediaDecodeTime *= scale;\n baseMediaDecodeTime = Math.floor(baseMediaDecodeTime);\n }\n return baseMediaDecodeTime;\n };\n var trackDecodeInfo$1 = {\n clearDtsInfo: clearDtsInfo,\n calculateTrackBaseMediaDecodeTime: calculateTrackBaseMediaDecodeTime,\n collectDtsInfo: collectDtsInfo\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * Reads in-band caption information from a video elementary\n * stream. Captions must follow the CEA-708 standard for injection\n * into an MPEG-2 transport streams.\n * @see https://en.wikipedia.org/wiki/CEA-708\n * @see https://www.gpo.gov/fdsys/pkg/CFR-2007-title47-vol1/pdf/CFR-2007-title47-vol1-sec15-119.pdf\n */\n // payload type field to indicate how they are to be\n // interpreted. CEAS-708 caption content is always transmitted with\n // payload type 0x04.\n\n var USER_DATA_REGISTERED_ITU_T_T35 = 4,\n RBSP_TRAILING_BITS = 128;\n /**\n * Parse a supplemental enhancement information (SEI) NAL unit.\n * Stops parsing once a message of type ITU T T35 has been found.\n *\n * @param bytes {Uint8Array} the bytes of a SEI NAL unit\n * @return {object} the parsed SEI payload\n * @see Rec. ITU-T H.264, 7.3.2.3.1\n */\n\n var parseSei = function (bytes) {\n var i = 0,\n result = {\n payloadType: -1,\n payloadSize: 0\n },\n payloadType = 0,\n payloadSize = 0; // go through the sei_rbsp parsing each each individual sei_message\n\n while (i < bytes.byteLength) {\n // stop once we have hit the end of the sei_rbsp\n if (bytes[i] === RBSP_TRAILING_BITS) {\n break;\n } // Parse payload type\n\n while (bytes[i] === 0xFF) {\n payloadType += 255;\n i++;\n }\n payloadType += bytes[i++]; // Parse payload size\n\n while (bytes[i] === 0xFF) {\n payloadSize += 255;\n i++;\n }\n payloadSize += bytes[i++]; // this sei_message is a 608/708 caption so save it and break\n // there can only ever be one caption message in a frame's sei\n\n if (!result.payload && payloadType === USER_DATA_REGISTERED_ITU_T_T35) {\n var userIdentifier = String.fromCharCode(bytes[i + 3], bytes[i + 4], bytes[i + 5], bytes[i + 6]);\n if (userIdentifier === 'GA94') {\n result.payloadType = payloadType;\n result.payloadSize = payloadSize;\n result.payload = bytes.subarray(i, i + payloadSize);\n break;\n } else {\n result.payload = void 0;\n }\n } // skip the payload and parse the next message\n\n i += payloadSize;\n payloadType = 0;\n payloadSize = 0;\n }\n return result;\n }; // see ANSI/SCTE 128-1 (2013), section 8.1\n\n var parseUserData = function (sei) {\n // itu_t_t35_contry_code must be 181 (United States) for\n // captions\n if (sei.payload[0] !== 181) {\n return null;\n } // itu_t_t35_provider_code should be 49 (ATSC) for captions\n\n if ((sei.payload[1] << 8 | sei.payload[2]) !== 49) {\n return null;\n } // the user_identifier should be \"GA94\" to indicate ATSC1 data\n\n if (String.fromCharCode(sei.payload[3], sei.payload[4], sei.payload[5], sei.payload[6]) !== 'GA94') {\n return null;\n } // finally, user_data_type_code should be 0x03 for caption data\n\n if (sei.payload[7] !== 0x03) {\n return null;\n } // return the user_data_type_structure and strip the trailing\n // marker bits\n\n return sei.payload.subarray(8, sei.payload.length - 1);\n }; // see CEA-708-D, section 4.4\n\n var parseCaptionPackets = function (pts, userData) {\n var results = [],\n i,\n count,\n offset,\n data; // if this is just filler, return immediately\n\n if (!(userData[0] & 0x40)) {\n return results;\n } // parse out the cc_data_1 and cc_data_2 fields\n\n count = userData[0] & 0x1f;\n for (i = 0; i < count; i++) {\n offset = i * 3;\n data = {\n type: userData[offset + 2] & 0x03,\n pts: pts\n }; // capture cc data when cc_valid is 1\n\n if (userData[offset + 2] & 0x04) {\n data.ccData = userData[offset + 3] << 8 | userData[offset + 4];\n results.push(data);\n }\n }\n return results;\n };\n var discardEmulationPreventionBytes$1 = function (data) {\n var length = data.byteLength,\n emulationPreventionBytesPositions = [],\n i = 1,\n newLength,\n newData; // Find all `Emulation Prevention Bytes`\n\n while (i < length - 2) {\n if (data[i] === 0 && data[i + 1] === 0 && data[i + 2] === 0x03) {\n emulationPreventionBytesPositions.push(i + 2);\n i += 2;\n } else {\n i++;\n }\n } // If no Emulation Prevention Bytes were found just return the original\n // array\n\n if (emulationPreventionBytesPositions.length === 0) {\n return data;\n } // Create a new array to hold the NAL unit data\n\n newLength = length - emulationPreventionBytesPositions.length;\n newData = new Uint8Array(newLength);\n var sourceIndex = 0;\n for (i = 0; i < newLength; sourceIndex++, i++) {\n if (sourceIndex === emulationPreventionBytesPositions[0]) {\n // Skip this byte\n sourceIndex++; // Remove this position index\n\n emulationPreventionBytesPositions.shift();\n }\n newData[i] = data[sourceIndex];\n }\n return newData;\n }; // exports\n\n var captionPacketParser = {\n parseSei: parseSei,\n parseUserData: parseUserData,\n parseCaptionPackets: parseCaptionPackets,\n discardEmulationPreventionBytes: discardEmulationPreventionBytes$1,\n USER_DATA_REGISTERED_ITU_T_T35: USER_DATA_REGISTERED_ITU_T_T35\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * Reads in-band caption information from a video elementary\n * stream. Captions must follow the CEA-708 standard for injection\n * into an MPEG-2 transport streams.\n * @see https://en.wikipedia.org/wiki/CEA-708\n * @see https://www.gpo.gov/fdsys/pkg/CFR-2007-title47-vol1/pdf/CFR-2007-title47-vol1-sec15-119.pdf\n */\n // Link To Transport\n // -----------------\n\n var Stream$7 = stream;\n var cea708Parser = captionPacketParser;\n var CaptionStream$2 = function (options) {\n options = options || {};\n CaptionStream$2.prototype.init.call(this); // parse708captions flag, default to true\n\n this.parse708captions_ = typeof options.parse708captions === 'boolean' ? options.parse708captions : true;\n this.captionPackets_ = [];\n this.ccStreams_ = [new Cea608Stream(0, 0),\n // eslint-disable-line no-use-before-define\n new Cea608Stream(0, 1),\n // eslint-disable-line no-use-before-define\n new Cea608Stream(1, 0),\n // eslint-disable-line no-use-before-define\n new Cea608Stream(1, 1) // eslint-disable-line no-use-before-define\n ];\n\n if (this.parse708captions_) {\n this.cc708Stream_ = new Cea708Stream({\n captionServices: options.captionServices\n }); // eslint-disable-line no-use-before-define\n }\n\n this.reset(); // forward data and done events from CCs to this CaptionStream\n\n this.ccStreams_.forEach(function (cc) {\n cc.on('data', this.trigger.bind(this, 'data'));\n cc.on('partialdone', this.trigger.bind(this, 'partialdone'));\n cc.on('done', this.trigger.bind(this, 'done'));\n }, this);\n if (this.parse708captions_) {\n this.cc708Stream_.on('data', this.trigger.bind(this, 'data'));\n this.cc708Stream_.on('partialdone', this.trigger.bind(this, 'partialdone'));\n this.cc708Stream_.on('done', this.trigger.bind(this, 'done'));\n }\n };\n CaptionStream$2.prototype = new Stream$7();\n CaptionStream$2.prototype.push = function (event) {\n var sei, userData, newCaptionPackets; // only examine SEI NALs\n\n if (event.nalUnitType !== 'sei_rbsp') {\n return;\n } // parse the sei\n\n sei = cea708Parser.parseSei(event.escapedRBSP); // no payload data, skip\n\n if (!sei.payload) {\n return;\n } // ignore everything but user_data_registered_itu_t_t35\n\n if (sei.payloadType !== cea708Parser.USER_DATA_REGISTERED_ITU_T_T35) {\n return;\n } // parse out the user data payload\n\n userData = cea708Parser.parseUserData(sei); // ignore unrecognized userData\n\n if (!userData) {\n return;\n } // Sometimes, the same segment # will be downloaded twice. To stop the\n // caption data from being processed twice, we track the latest dts we've\n // received and ignore everything with a dts before that. However, since\n // data for a specific dts can be split across packets on either side of\n // a segment boundary, we need to make sure we *don't* ignore the packets\n // from the *next* segment that have dts === this.latestDts_. By constantly\n // tracking the number of packets received with dts === this.latestDts_, we\n // know how many should be ignored once we start receiving duplicates.\n\n if (event.dts < this.latestDts_) {\n // We've started getting older data, so set the flag.\n this.ignoreNextEqualDts_ = true;\n return;\n } else if (event.dts === this.latestDts_ && this.ignoreNextEqualDts_) {\n this.numSameDts_--;\n if (!this.numSameDts_) {\n // We've received the last duplicate packet, time to start processing again\n this.ignoreNextEqualDts_ = false;\n }\n return;\n } // parse out CC data packets and save them for later\n\n newCaptionPackets = cea708Parser.parseCaptionPackets(event.pts, userData);\n this.captionPackets_ = this.captionPackets_.concat(newCaptionPackets);\n if (this.latestDts_ !== event.dts) {\n this.numSameDts_ = 0;\n }\n this.numSameDts_++;\n this.latestDts_ = event.dts;\n };\n CaptionStream$2.prototype.flushCCStreams = function (flushType) {\n this.ccStreams_.forEach(function (cc) {\n return flushType === 'flush' ? cc.flush() : cc.partialFlush();\n }, this);\n };\n CaptionStream$2.prototype.flushStream = function (flushType) {\n // make sure we actually parsed captions before proceeding\n if (!this.captionPackets_.length) {\n this.flushCCStreams(flushType);\n return;\n } // In Chrome, the Array#sort function is not stable so add a\n // presortIndex that we can use to ensure we get a stable-sort\n\n this.captionPackets_.forEach(function (elem, idx) {\n elem.presortIndex = idx;\n }); // sort caption byte-pairs based on their PTS values\n\n this.captionPackets_.sort(function (a, b) {\n if (a.pts === b.pts) {\n return a.presortIndex - b.presortIndex;\n }\n return a.pts - b.pts;\n });\n this.captionPackets_.forEach(function (packet) {\n if (packet.type < 2) {\n // Dispatch packet to the right Cea608Stream\n this.dispatchCea608Packet(packet);\n } else {\n // Dispatch packet to the Cea708Stream\n this.dispatchCea708Packet(packet);\n }\n }, this);\n this.captionPackets_.length = 0;\n this.flushCCStreams(flushType);\n };\n CaptionStream$2.prototype.flush = function () {\n return this.flushStream('flush');\n }; // Only called if handling partial data\n\n CaptionStream$2.prototype.partialFlush = function () {\n return this.flushStream('partialFlush');\n };\n CaptionStream$2.prototype.reset = function () {\n this.latestDts_ = null;\n this.ignoreNextEqualDts_ = false;\n this.numSameDts_ = 0;\n this.activeCea608Channel_ = [null, null];\n this.ccStreams_.forEach(function (ccStream) {\n ccStream.reset();\n });\n }; // From the CEA-608 spec:\n\n /*\n * When XDS sub-packets are interleaved with other services, the end of each sub-packet shall be followed\n * by a control pair to change to a different service. When any of the control codes from 0x10 to 0x1F is\n * used to begin a control code pair, it indicates the return to captioning or Text data. The control code pair\n * and subsequent data should then be processed according to the FCC rules. It may be necessary for the\n * line 21 data encoder to automatically insert a control code pair (i.e. RCL, RU2, RU3, RU4, RDC, or RTD)\n * to switch to captioning or Text.\n */\n // With that in mind, we ignore any data between an XDS control code and a\n // subsequent closed-captioning control code.\n\n CaptionStream$2.prototype.dispatchCea608Packet = function (packet) {\n // NOTE: packet.type is the CEA608 field\n if (this.setsTextOrXDSActive(packet)) {\n this.activeCea608Channel_[packet.type] = null;\n } else if (this.setsChannel1Active(packet)) {\n this.activeCea608Channel_[packet.type] = 0;\n } else if (this.setsChannel2Active(packet)) {\n this.activeCea608Channel_[packet.type] = 1;\n }\n if (this.activeCea608Channel_[packet.type] === null) {\n // If we haven't received anything to set the active channel, or the\n // packets are Text/XDS data, discard the data; we don't want jumbled\n // captions\n return;\n }\n this.ccStreams_[(packet.type << 1) + this.activeCea608Channel_[packet.type]].push(packet);\n };\n CaptionStream$2.prototype.setsChannel1Active = function (packet) {\n return (packet.ccData & 0x7800) === 0x1000;\n };\n CaptionStream$2.prototype.setsChannel2Active = function (packet) {\n return (packet.ccData & 0x7800) === 0x1800;\n };\n CaptionStream$2.prototype.setsTextOrXDSActive = function (packet) {\n return (packet.ccData & 0x7100) === 0x0100 || (packet.ccData & 0x78fe) === 0x102a || (packet.ccData & 0x78fe) === 0x182a;\n };\n CaptionStream$2.prototype.dispatchCea708Packet = function (packet) {\n if (this.parse708captions_) {\n this.cc708Stream_.push(packet);\n }\n }; // ----------------------\n // Session to Application\n // ----------------------\n // This hash maps special and extended character codes to their\n // proper Unicode equivalent. The first one-byte key is just a\n // non-standard character code. The two-byte keys that follow are\n // the extended CEA708 character codes, along with the preceding\n // 0x10 extended character byte to distinguish these codes from\n // non-extended character codes. Every CEA708 character code that\n // is not in this object maps directly to a standard unicode\n // character code.\n // The transparent space and non-breaking transparent space are\n // technically not fully supported since there is no code to\n // make them transparent, so they have normal non-transparent\n // stand-ins.\n // The special closed caption (CC) character isn't a standard\n // unicode character, so a fairly similar unicode character was\n // chosen in it's place.\n\n var CHARACTER_TRANSLATION_708 = {\n 0x7f: 0x266a,\n // ♪\n 0x1020: 0x20,\n // Transparent Space\n 0x1021: 0xa0,\n // Nob-breaking Transparent Space\n 0x1025: 0x2026,\n // …\n 0x102a: 0x0160,\n // Š\n 0x102c: 0x0152,\n // Œ\n 0x1030: 0x2588,\n // █\n 0x1031: 0x2018,\n // ‘\n 0x1032: 0x2019,\n // ’\n 0x1033: 0x201c,\n // “\n 0x1034: 0x201d,\n // ”\n 0x1035: 0x2022,\n // •\n 0x1039: 0x2122,\n // ™\n 0x103a: 0x0161,\n // š\n 0x103c: 0x0153,\n // œ\n 0x103d: 0x2120,\n // ℠\n 0x103f: 0x0178,\n // Ÿ\n 0x1076: 0x215b,\n // ⅛\n 0x1077: 0x215c,\n // ⅜\n 0x1078: 0x215d,\n // ⅝\n 0x1079: 0x215e,\n // ⅞\n 0x107a: 0x23d0,\n // ⏐\n 0x107b: 0x23a4,\n // ⎤\n 0x107c: 0x23a3,\n // ⎣\n 0x107d: 0x23af,\n // ⎯\n 0x107e: 0x23a6,\n // ⎦\n 0x107f: 0x23a1,\n // ⎡\n 0x10a0: 0x3138 // ㄸ (CC char)\n };\n\n var get708CharFromCode = function (code) {\n var newCode = CHARACTER_TRANSLATION_708[code] || code;\n if (code & 0x1000 && code === newCode) {\n // Invalid extended code\n return '';\n }\n return String.fromCharCode(newCode);\n };\n var within708TextBlock = function (b) {\n return 0x20 <= b && b <= 0x7f || 0xa0 <= b && b <= 0xff;\n };\n var Cea708Window = function (windowNum) {\n this.windowNum = windowNum;\n this.reset();\n };\n Cea708Window.prototype.reset = function () {\n this.clearText();\n this.pendingNewLine = false;\n this.winAttr = {};\n this.penAttr = {};\n this.penLoc = {};\n this.penColor = {}; // These default values are arbitrary,\n // defineWindow will usually override them\n\n this.visible = 0;\n this.rowLock = 0;\n this.columnLock = 0;\n this.priority = 0;\n this.relativePositioning = 0;\n this.anchorVertical = 0;\n this.anchorHorizontal = 0;\n this.anchorPoint = 0;\n this.rowCount = 1;\n this.virtualRowCount = this.rowCount + 1;\n this.columnCount = 41;\n this.windowStyle = 0;\n this.penStyle = 0;\n };\n Cea708Window.prototype.getText = function () {\n return this.rows.join('\\n');\n };\n Cea708Window.prototype.clearText = function () {\n this.rows = [''];\n this.rowIdx = 0;\n };\n Cea708Window.prototype.newLine = function (pts) {\n if (this.rows.length >= this.virtualRowCount && typeof this.beforeRowOverflow === 'function') {\n this.beforeRowOverflow(pts);\n }\n if (this.rows.length > 0) {\n this.rows.push('');\n this.rowIdx++;\n } // Show all virtual rows since there's no visible scrolling\n\n while (this.rows.length > this.virtualRowCount) {\n this.rows.shift();\n this.rowIdx--;\n }\n };\n Cea708Window.prototype.isEmpty = function () {\n if (this.rows.length === 0) {\n return true;\n } else if (this.rows.length === 1) {\n return this.rows[0] === '';\n }\n return false;\n };\n Cea708Window.prototype.addText = function (text) {\n this.rows[this.rowIdx] += text;\n };\n Cea708Window.prototype.backspace = function () {\n if (!this.isEmpty()) {\n var row = this.rows[this.rowIdx];\n this.rows[this.rowIdx] = row.substr(0, row.length - 1);\n }\n };\n var Cea708Service = function (serviceNum, encoding, stream) {\n this.serviceNum = serviceNum;\n this.text = '';\n this.currentWindow = new Cea708Window(-1);\n this.windows = [];\n this.stream = stream; // Try to setup a TextDecoder if an `encoding` value was provided\n\n if (typeof encoding === 'string') {\n this.createTextDecoder(encoding);\n }\n };\n /**\n * Initialize service windows\n * Must be run before service use\n *\n * @param {Integer} pts PTS value\n * @param {Function} beforeRowOverflow Function to execute before row overflow of a window\n */\n\n Cea708Service.prototype.init = function (pts, beforeRowOverflow) {\n this.startPts = pts;\n for (var win = 0; win < 8; win++) {\n this.windows[win] = new Cea708Window(win);\n if (typeof beforeRowOverflow === 'function') {\n this.windows[win].beforeRowOverflow = beforeRowOverflow;\n }\n }\n };\n /**\n * Set current window of service to be affected by commands\n *\n * @param {Integer} windowNum Window number\n */\n\n Cea708Service.prototype.setCurrentWindow = function (windowNum) {\n this.currentWindow = this.windows[windowNum];\n };\n /**\n * Try to create a TextDecoder if it is natively supported\n */\n\n Cea708Service.prototype.createTextDecoder = function (encoding) {\n if (typeof TextDecoder === 'undefined') {\n this.stream.trigger('log', {\n level: 'warn',\n message: 'The `encoding` option is unsupported without TextDecoder support'\n });\n } else {\n try {\n this.textDecoder_ = new TextDecoder(encoding);\n } catch (error) {\n this.stream.trigger('log', {\n level: 'warn',\n message: 'TextDecoder could not be created with ' + encoding + ' encoding. ' + error\n });\n }\n }\n };\n var Cea708Stream = function (options) {\n options = options || {};\n Cea708Stream.prototype.init.call(this);\n var self = this;\n var captionServices = options.captionServices || {};\n var captionServiceEncodings = {};\n var serviceProps; // Get service encodings from captionServices option block\n\n Object.keys(captionServices).forEach(serviceName => {\n serviceProps = captionServices[serviceName];\n if (/^SERVICE/.test(serviceName)) {\n captionServiceEncodings[serviceName] = serviceProps.encoding;\n }\n });\n this.serviceEncodings = captionServiceEncodings;\n this.current708Packet = null;\n this.services = {};\n this.push = function (packet) {\n if (packet.type === 3) {\n // 708 packet start\n self.new708Packet();\n self.add708Bytes(packet);\n } else {\n if (self.current708Packet === null) {\n // This should only happen at the start of a file if there's no packet start.\n self.new708Packet();\n }\n self.add708Bytes(packet);\n }\n };\n };\n Cea708Stream.prototype = new Stream$7();\n /**\n * Push current 708 packet, create new 708 packet.\n */\n\n Cea708Stream.prototype.new708Packet = function () {\n if (this.current708Packet !== null) {\n this.push708Packet();\n }\n this.current708Packet = {\n data: [],\n ptsVals: []\n };\n };\n /**\n * Add pts and both bytes from packet into current 708 packet.\n */\n\n Cea708Stream.prototype.add708Bytes = function (packet) {\n var data = packet.ccData;\n var byte0 = data >>> 8;\n var byte1 = data & 0xff; // I would just keep a list of packets instead of bytes, but it isn't clear in the spec\n // that service blocks will always line up with byte pairs.\n\n this.current708Packet.ptsVals.push(packet.pts);\n this.current708Packet.data.push(byte0);\n this.current708Packet.data.push(byte1);\n };\n /**\n * Parse completed 708 packet into service blocks and push each service block.\n */\n\n Cea708Stream.prototype.push708Packet = function () {\n var packet708 = this.current708Packet;\n var packetData = packet708.data;\n var serviceNum = null;\n var blockSize = null;\n var i = 0;\n var b = packetData[i++];\n packet708.seq = b >> 6;\n packet708.sizeCode = b & 0x3f; // 0b00111111;\n\n for (; i < packetData.length; i++) {\n b = packetData[i++];\n serviceNum = b >> 5;\n blockSize = b & 0x1f; // 0b00011111\n\n if (serviceNum === 7 && blockSize > 0) {\n // Extended service num\n b = packetData[i++];\n serviceNum = b;\n }\n this.pushServiceBlock(serviceNum, i, blockSize);\n if (blockSize > 0) {\n i += blockSize - 1;\n }\n }\n };\n /**\n * Parse service block, execute commands, read text.\n *\n * Note: While many of these commands serve important purposes,\n * many others just parse out the parameters or attributes, but\n * nothing is done with them because this is not a full and complete\n * implementation of the entire 708 spec.\n *\n * @param {Integer} serviceNum Service number\n * @param {Integer} start Start index of the 708 packet data\n * @param {Integer} size Block size\n */\n\n Cea708Stream.prototype.pushServiceBlock = function (serviceNum, start, size) {\n var b;\n var i = start;\n var packetData = this.current708Packet.data;\n var service = this.services[serviceNum];\n if (!service) {\n service = this.initService(serviceNum, i);\n }\n for (; i < start + size && i < packetData.length; i++) {\n b = packetData[i];\n if (within708TextBlock(b)) {\n i = this.handleText(i, service);\n } else if (b === 0x18) {\n i = this.multiByteCharacter(i, service);\n } else if (b === 0x10) {\n i = this.extendedCommands(i, service);\n } else if (0x80 <= b && b <= 0x87) {\n i = this.setCurrentWindow(i, service);\n } else if (0x98 <= b && b <= 0x9f) {\n i = this.defineWindow(i, service);\n } else if (b === 0x88) {\n i = this.clearWindows(i, service);\n } else if (b === 0x8c) {\n i = this.deleteWindows(i, service);\n } else if (b === 0x89) {\n i = this.displayWindows(i, service);\n } else if (b === 0x8a) {\n i = this.hideWindows(i, service);\n } else if (b === 0x8b) {\n i = this.toggleWindows(i, service);\n } else if (b === 0x97) {\n i = this.setWindowAttributes(i, service);\n } else if (b === 0x90) {\n i = this.setPenAttributes(i, service);\n } else if (b === 0x91) {\n i = this.setPenColor(i, service);\n } else if (b === 0x92) {\n i = this.setPenLocation(i, service);\n } else if (b === 0x8f) {\n service = this.reset(i, service);\n } else if (b === 0x08) {\n // BS: Backspace\n service.currentWindow.backspace();\n } else if (b === 0x0c) {\n // FF: Form feed\n service.currentWindow.clearText();\n } else if (b === 0x0d) {\n // CR: Carriage return\n service.currentWindow.pendingNewLine = true;\n } else if (b === 0x0e) {\n // HCR: Horizontal carriage return\n service.currentWindow.clearText();\n } else if (b === 0x8d) {\n // DLY: Delay, nothing to do\n i++;\n } else ;\n }\n };\n /**\n * Execute an extended command\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.extendedCommands = function (i, service) {\n var packetData = this.current708Packet.data;\n var b = packetData[++i];\n if (within708TextBlock(b)) {\n i = this.handleText(i, service, {\n isExtended: true\n });\n }\n return i;\n };\n /**\n * Get PTS value of a given byte index\n *\n * @param {Integer} byteIndex Index of the byte\n * @return {Integer} PTS\n */\n\n Cea708Stream.prototype.getPts = function (byteIndex) {\n // There's 1 pts value per 2 bytes\n return this.current708Packet.ptsVals[Math.floor(byteIndex / 2)];\n };\n /**\n * Initializes a service\n *\n * @param {Integer} serviceNum Service number\n * @return {Service} Initialized service object\n */\n\n Cea708Stream.prototype.initService = function (serviceNum, i) {\n var serviceName = 'SERVICE' + serviceNum;\n var self = this;\n var serviceName;\n var encoding;\n if (serviceName in this.serviceEncodings) {\n encoding = this.serviceEncodings[serviceName];\n }\n this.services[serviceNum] = new Cea708Service(serviceNum, encoding, self);\n this.services[serviceNum].init(this.getPts(i), function (pts) {\n self.flushDisplayed(pts, self.services[serviceNum]);\n });\n return this.services[serviceNum];\n };\n /**\n * Execute text writing to current window\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.handleText = function (i, service, options) {\n var isExtended = options && options.isExtended;\n var isMultiByte = options && options.isMultiByte;\n var packetData = this.current708Packet.data;\n var extended = isExtended ? 0x1000 : 0x0000;\n var currentByte = packetData[i];\n var nextByte = packetData[i + 1];\n var win = service.currentWindow;\n var char;\n var charCodeArray; // Converts an array of bytes to a unicode hex string.\n\n function toHexString(byteArray) {\n return byteArray.map(byte => {\n return ('0' + (byte & 0xFF).toString(16)).slice(-2);\n }).join('');\n }\n if (isMultiByte) {\n charCodeArray = [currentByte, nextByte];\n i++;\n } else {\n charCodeArray = [currentByte];\n } // Use the TextDecoder if one was created for this service\n\n if (service.textDecoder_ && !isExtended) {\n char = service.textDecoder_.decode(new Uint8Array(charCodeArray));\n } else {\n // We assume any multi-byte char without a decoder is unicode.\n if (isMultiByte) {\n const unicode = toHexString(charCodeArray); // Takes a unicode hex string and creates a single character.\n\n char = String.fromCharCode(parseInt(unicode, 16));\n } else {\n char = get708CharFromCode(extended | currentByte);\n }\n }\n if (win.pendingNewLine && !win.isEmpty()) {\n win.newLine(this.getPts(i));\n }\n win.pendingNewLine = false;\n win.addText(char);\n return i;\n };\n /**\n * Handle decoding of multibyte character\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.multiByteCharacter = function (i, service) {\n var packetData = this.current708Packet.data;\n var firstByte = packetData[i + 1];\n var secondByte = packetData[i + 2];\n if (within708TextBlock(firstByte) && within708TextBlock(secondByte)) {\n i = this.handleText(++i, service, {\n isMultiByte: true\n });\n }\n return i;\n };\n /**\n * Parse and execute the CW# command.\n *\n * Set the current window.\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.setCurrentWindow = function (i, service) {\n var packetData = this.current708Packet.data;\n var b = packetData[i];\n var windowNum = b & 0x07;\n service.setCurrentWindow(windowNum);\n return i;\n };\n /**\n * Parse and execute the DF# command.\n *\n * Define a window and set it as the current window.\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.defineWindow = function (i, service) {\n var packetData = this.current708Packet.data;\n var b = packetData[i];\n var windowNum = b & 0x07;\n service.setCurrentWindow(windowNum);\n var win = service.currentWindow;\n b = packetData[++i];\n win.visible = (b & 0x20) >> 5; // v\n\n win.rowLock = (b & 0x10) >> 4; // rl\n\n win.columnLock = (b & 0x08) >> 3; // cl\n\n win.priority = b & 0x07; // p\n\n b = packetData[++i];\n win.relativePositioning = (b & 0x80) >> 7; // rp\n\n win.anchorVertical = b & 0x7f; // av\n\n b = packetData[++i];\n win.anchorHorizontal = b; // ah\n\n b = packetData[++i];\n win.anchorPoint = (b & 0xf0) >> 4; // ap\n\n win.rowCount = b & 0x0f; // rc\n\n b = packetData[++i];\n win.columnCount = b & 0x3f; // cc\n\n b = packetData[++i];\n win.windowStyle = (b & 0x38) >> 3; // ws\n\n win.penStyle = b & 0x07; // ps\n // The spec says there are (rowCount+1) \"virtual rows\"\n\n win.virtualRowCount = win.rowCount + 1;\n return i;\n };\n /**\n * Parse and execute the SWA command.\n *\n * Set attributes of the current window.\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.setWindowAttributes = function (i, service) {\n var packetData = this.current708Packet.data;\n var b = packetData[i];\n var winAttr = service.currentWindow.winAttr;\n b = packetData[++i];\n winAttr.fillOpacity = (b & 0xc0) >> 6; // fo\n\n winAttr.fillRed = (b & 0x30) >> 4; // fr\n\n winAttr.fillGreen = (b & 0x0c) >> 2; // fg\n\n winAttr.fillBlue = b & 0x03; // fb\n\n b = packetData[++i];\n winAttr.borderType = (b & 0xc0) >> 6; // bt\n\n winAttr.borderRed = (b & 0x30) >> 4; // br\n\n winAttr.borderGreen = (b & 0x0c) >> 2; // bg\n\n winAttr.borderBlue = b & 0x03; // bb\n\n b = packetData[++i];\n winAttr.borderType += (b & 0x80) >> 5; // bt\n\n winAttr.wordWrap = (b & 0x40) >> 6; // ww\n\n winAttr.printDirection = (b & 0x30) >> 4; // pd\n\n winAttr.scrollDirection = (b & 0x0c) >> 2; // sd\n\n winAttr.justify = b & 0x03; // j\n\n b = packetData[++i];\n winAttr.effectSpeed = (b & 0xf0) >> 4; // es\n\n winAttr.effectDirection = (b & 0x0c) >> 2; // ed\n\n winAttr.displayEffect = b & 0x03; // de\n\n return i;\n };\n /**\n * Gather text from all displayed windows and push a caption to output.\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n */\n\n Cea708Stream.prototype.flushDisplayed = function (pts, service) {\n var displayedText = []; // TODO: Positioning not supported, displaying multiple windows will not necessarily\n // display text in the correct order, but sample files so far have not shown any issue.\n\n for (var winId = 0; winId < 8; winId++) {\n if (service.windows[winId].visible && !service.windows[winId].isEmpty()) {\n displayedText.push(service.windows[winId].getText());\n }\n }\n service.endPts = pts;\n service.text = displayedText.join('\\n\\n');\n this.pushCaption(service);\n service.startPts = pts;\n };\n /**\n * Push a caption to output if the caption contains text.\n *\n * @param {Service} service The service object to be affected\n */\n\n Cea708Stream.prototype.pushCaption = function (service) {\n if (service.text !== '') {\n this.trigger('data', {\n startPts: service.startPts,\n endPts: service.endPts,\n text: service.text,\n stream: 'cc708_' + service.serviceNum\n });\n service.text = '';\n service.startPts = service.endPts;\n }\n };\n /**\n * Parse and execute the DSW command.\n *\n * Set visible property of windows based on the parsed bitmask.\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.displayWindows = function (i, service) {\n var packetData = this.current708Packet.data;\n var b = packetData[++i];\n var pts = this.getPts(i);\n this.flushDisplayed(pts, service);\n for (var winId = 0; winId < 8; winId++) {\n if (b & 0x01 << winId) {\n service.windows[winId].visible = 1;\n }\n }\n return i;\n };\n /**\n * Parse and execute the HDW command.\n *\n * Set visible property of windows based on the parsed bitmask.\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.hideWindows = function (i, service) {\n var packetData = this.current708Packet.data;\n var b = packetData[++i];\n var pts = this.getPts(i);\n this.flushDisplayed(pts, service);\n for (var winId = 0; winId < 8; winId++) {\n if (b & 0x01 << winId) {\n service.windows[winId].visible = 0;\n }\n }\n return i;\n };\n /**\n * Parse and execute the TGW command.\n *\n * Set visible property of windows based on the parsed bitmask.\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.toggleWindows = function (i, service) {\n var packetData = this.current708Packet.data;\n var b = packetData[++i];\n var pts = this.getPts(i);\n this.flushDisplayed(pts, service);\n for (var winId = 0; winId < 8; winId++) {\n if (b & 0x01 << winId) {\n service.windows[winId].visible ^= 1;\n }\n }\n return i;\n };\n /**\n * Parse and execute the CLW command.\n *\n * Clear text of windows based on the parsed bitmask.\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.clearWindows = function (i, service) {\n var packetData = this.current708Packet.data;\n var b = packetData[++i];\n var pts = this.getPts(i);\n this.flushDisplayed(pts, service);\n for (var winId = 0; winId < 8; winId++) {\n if (b & 0x01 << winId) {\n service.windows[winId].clearText();\n }\n }\n return i;\n };\n /**\n * Parse and execute the DLW command.\n *\n * Re-initialize windows based on the parsed bitmask.\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.deleteWindows = function (i, service) {\n var packetData = this.current708Packet.data;\n var b = packetData[++i];\n var pts = this.getPts(i);\n this.flushDisplayed(pts, service);\n for (var winId = 0; winId < 8; winId++) {\n if (b & 0x01 << winId) {\n service.windows[winId].reset();\n }\n }\n return i;\n };\n /**\n * Parse and execute the SPA command.\n *\n * Set pen attributes of the current window.\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.setPenAttributes = function (i, service) {\n var packetData = this.current708Packet.data;\n var b = packetData[i];\n var penAttr = service.currentWindow.penAttr;\n b = packetData[++i];\n penAttr.textTag = (b & 0xf0) >> 4; // tt\n\n penAttr.offset = (b & 0x0c) >> 2; // o\n\n penAttr.penSize = b & 0x03; // s\n\n b = packetData[++i];\n penAttr.italics = (b & 0x80) >> 7; // i\n\n penAttr.underline = (b & 0x40) >> 6; // u\n\n penAttr.edgeType = (b & 0x38) >> 3; // et\n\n penAttr.fontStyle = b & 0x07; // fs\n\n return i;\n };\n /**\n * Parse and execute the SPC command.\n *\n * Set pen color of the current window.\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.setPenColor = function (i, service) {\n var packetData = this.current708Packet.data;\n var b = packetData[i];\n var penColor = service.currentWindow.penColor;\n b = packetData[++i];\n penColor.fgOpacity = (b & 0xc0) >> 6; // fo\n\n penColor.fgRed = (b & 0x30) >> 4; // fr\n\n penColor.fgGreen = (b & 0x0c) >> 2; // fg\n\n penColor.fgBlue = b & 0x03; // fb\n\n b = packetData[++i];\n penColor.bgOpacity = (b & 0xc0) >> 6; // bo\n\n penColor.bgRed = (b & 0x30) >> 4; // br\n\n penColor.bgGreen = (b & 0x0c) >> 2; // bg\n\n penColor.bgBlue = b & 0x03; // bb\n\n b = packetData[++i];\n penColor.edgeRed = (b & 0x30) >> 4; // er\n\n penColor.edgeGreen = (b & 0x0c) >> 2; // eg\n\n penColor.edgeBlue = b & 0x03; // eb\n\n return i;\n };\n /**\n * Parse and execute the SPL command.\n *\n * Set pen location of the current window.\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.setPenLocation = function (i, service) {\n var packetData = this.current708Packet.data;\n var b = packetData[i];\n var penLoc = service.currentWindow.penLoc; // Positioning isn't really supported at the moment, so this essentially just inserts a linebreak\n\n service.currentWindow.pendingNewLine = true;\n b = packetData[++i];\n penLoc.row = b & 0x0f; // r\n\n b = packetData[++i];\n penLoc.column = b & 0x3f; // c\n\n return i;\n };\n /**\n * Execute the RST command.\n *\n * Reset service to a clean slate. Re-initialize.\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Service} Re-initialized service\n */\n\n Cea708Stream.prototype.reset = function (i, service) {\n var pts = this.getPts(i);\n this.flushDisplayed(pts, service);\n return this.initService(service.serviceNum, i);\n }; // This hash maps non-ASCII, special, and extended character codes to their\n // proper Unicode equivalent. The first keys that are only a single byte\n // are the non-standard ASCII characters, which simply map the CEA608 byte\n // to the standard ASCII/Unicode. The two-byte keys that follow are the CEA608\n // character codes, but have their MSB bitmasked with 0x03 so that a lookup\n // can be performed regardless of the field and data channel on which the\n // character code was received.\n\n var CHARACTER_TRANSLATION = {\n 0x2a: 0xe1,\n // á\n 0x5c: 0xe9,\n // é\n 0x5e: 0xed,\n // í\n 0x5f: 0xf3,\n // ó\n 0x60: 0xfa,\n // ú\n 0x7b: 0xe7,\n // ç\n 0x7c: 0xf7,\n // ÷\n 0x7d: 0xd1,\n // Ñ\n 0x7e: 0xf1,\n // ñ\n 0x7f: 0x2588,\n // █\n 0x0130: 0xae,\n // ®\n 0x0131: 0xb0,\n // °\n 0x0132: 0xbd,\n // ½\n 0x0133: 0xbf,\n // ¿\n 0x0134: 0x2122,\n // ™\n 0x0135: 0xa2,\n // ¢\n 0x0136: 0xa3,\n // £\n 0x0137: 0x266a,\n // ♪\n 0x0138: 0xe0,\n // à\n 0x0139: 0xa0,\n //\n 0x013a: 0xe8,\n // è\n 0x013b: 0xe2,\n // â\n 0x013c: 0xea,\n // ê\n 0x013d: 0xee,\n // î\n 0x013e: 0xf4,\n // ô\n 0x013f: 0xfb,\n // û\n 0x0220: 0xc1,\n // Á\n 0x0221: 0xc9,\n // É\n 0x0222: 0xd3,\n // Ó\n 0x0223: 0xda,\n // Ú\n 0x0224: 0xdc,\n // Ü\n 0x0225: 0xfc,\n // ü\n 0x0226: 0x2018,\n // ‘\n 0x0227: 0xa1,\n // ¡\n 0x0228: 0x2a,\n // *\n 0x0229: 0x27,\n // '\n 0x022a: 0x2014,\n // —\n 0x022b: 0xa9,\n // ©\n 0x022c: 0x2120,\n // ℠\n 0x022d: 0x2022,\n // •\n 0x022e: 0x201c,\n // “\n 0x022f: 0x201d,\n // ”\n 0x0230: 0xc0,\n // À\n 0x0231: 0xc2,\n // Â\n 0x0232: 0xc7,\n // Ç\n 0x0233: 0xc8,\n // È\n 0x0234: 0xca,\n // Ê\n 0x0235: 0xcb,\n // Ë\n 0x0236: 0xeb,\n // ë\n 0x0237: 0xce,\n // Î\n 0x0238: 0xcf,\n // Ï\n 0x0239: 0xef,\n // ï\n 0x023a: 0xd4,\n // Ô\n 0x023b: 0xd9,\n // Ù\n 0x023c: 0xf9,\n // ù\n 0x023d: 0xdb,\n // Û\n 0x023e: 0xab,\n // «\n 0x023f: 0xbb,\n // »\n 0x0320: 0xc3,\n // Ã\n 0x0321: 0xe3,\n // ã\n 0x0322: 0xcd,\n // Í\n 0x0323: 0xcc,\n // Ì\n 0x0324: 0xec,\n // ì\n 0x0325: 0xd2,\n // Ò\n 0x0326: 0xf2,\n // ò\n 0x0327: 0xd5,\n // Õ\n 0x0328: 0xf5,\n // õ\n 0x0329: 0x7b,\n // {\n 0x032a: 0x7d,\n // }\n 0x032b: 0x5c,\n // \\\n 0x032c: 0x5e,\n // ^\n 0x032d: 0x5f,\n // _\n 0x032e: 0x7c,\n // |\n 0x032f: 0x7e,\n // ~\n 0x0330: 0xc4,\n // Ä\n 0x0331: 0xe4,\n // ä\n 0x0332: 0xd6,\n // Ö\n 0x0333: 0xf6,\n // ö\n 0x0334: 0xdf,\n // ß\n 0x0335: 0xa5,\n // ¥\n 0x0336: 0xa4,\n // ¤\n 0x0337: 0x2502,\n // │\n 0x0338: 0xc5,\n // Å\n 0x0339: 0xe5,\n // å\n 0x033a: 0xd8,\n // Ø\n 0x033b: 0xf8,\n // ø\n 0x033c: 0x250c,\n // ┌\n 0x033d: 0x2510,\n // ┐\n 0x033e: 0x2514,\n // └\n 0x033f: 0x2518 // ┘\n };\n\n var getCharFromCode = function (code) {\n if (code === null) {\n return '';\n }\n code = CHARACTER_TRANSLATION[code] || code;\n return String.fromCharCode(code);\n }; // the index of the last row in a CEA-608 display buffer\n\n var BOTTOM_ROW = 14; // This array is used for mapping PACs -> row #, since there's no way of\n // getting it through bit logic.\n\n var ROWS = [0x1100, 0x1120, 0x1200, 0x1220, 0x1500, 0x1520, 0x1600, 0x1620, 0x1700, 0x1720, 0x1000, 0x1300, 0x1320, 0x1400, 0x1420]; // CEA-608 captions are rendered onto a 34x15 matrix of character\n // cells. The \"bottom\" row is the last element in the outer array.\n // We keep track of positioning information as we go by storing the\n // number of indentations and the tab offset in this buffer.\n\n var createDisplayBuffer = function () {\n var result = [],\n i = BOTTOM_ROW + 1;\n while (i--) {\n result.push({\n text: '',\n indent: 0,\n offset: 0\n });\n }\n return result;\n };\n var Cea608Stream = function (field, dataChannel) {\n Cea608Stream.prototype.init.call(this);\n this.field_ = field || 0;\n this.dataChannel_ = dataChannel || 0;\n this.name_ = 'CC' + ((this.field_ << 1 | this.dataChannel_) + 1);\n this.setConstants();\n this.reset();\n this.push = function (packet) {\n var data, swap, char0, char1, text; // remove the parity bits\n\n data = packet.ccData & 0x7f7f; // ignore duplicate control codes; the spec demands they're sent twice\n\n if (data === this.lastControlCode_) {\n this.lastControlCode_ = null;\n return;\n } // Store control codes\n\n if ((data & 0xf000) === 0x1000) {\n this.lastControlCode_ = data;\n } else if (data !== this.PADDING_) {\n this.lastControlCode_ = null;\n }\n char0 = data >>> 8;\n char1 = data & 0xff;\n if (data === this.PADDING_) {\n return;\n } else if (data === this.RESUME_CAPTION_LOADING_) {\n this.mode_ = 'popOn';\n } else if (data === this.END_OF_CAPTION_) {\n // If an EOC is received while in paint-on mode, the displayed caption\n // text should be swapped to non-displayed memory as if it was a pop-on\n // caption. Because of that, we should explicitly switch back to pop-on\n // mode\n this.mode_ = 'popOn';\n this.clearFormatting(packet.pts); // if a caption was being displayed, it's gone now\n\n this.flushDisplayed(packet.pts); // flip memory\n\n swap = this.displayed_;\n this.displayed_ = this.nonDisplayed_;\n this.nonDisplayed_ = swap; // start measuring the time to display the caption\n\n this.startPts_ = packet.pts;\n } else if (data === this.ROLL_UP_2_ROWS_) {\n this.rollUpRows_ = 2;\n this.setRollUp(packet.pts);\n } else if (data === this.ROLL_UP_3_ROWS_) {\n this.rollUpRows_ = 3;\n this.setRollUp(packet.pts);\n } else if (data === this.ROLL_UP_4_ROWS_) {\n this.rollUpRows_ = 4;\n this.setRollUp(packet.pts);\n } else if (data === this.CARRIAGE_RETURN_) {\n this.clearFormatting(packet.pts);\n this.flushDisplayed(packet.pts);\n this.shiftRowsUp_();\n this.startPts_ = packet.pts;\n } else if (data === this.BACKSPACE_) {\n if (this.mode_ === 'popOn') {\n this.nonDisplayed_[this.row_].text = this.nonDisplayed_[this.row_].text.slice(0, -1);\n } else {\n this.displayed_[this.row_].text = this.displayed_[this.row_].text.slice(0, -1);\n }\n } else if (data === this.ERASE_DISPLAYED_MEMORY_) {\n this.flushDisplayed(packet.pts);\n this.displayed_ = createDisplayBuffer();\n } else if (data === this.ERASE_NON_DISPLAYED_MEMORY_) {\n this.nonDisplayed_ = createDisplayBuffer();\n } else if (data === this.RESUME_DIRECT_CAPTIONING_) {\n if (this.mode_ !== 'paintOn') {\n // NOTE: This should be removed when proper caption positioning is\n // implemented\n this.flushDisplayed(packet.pts);\n this.displayed_ = createDisplayBuffer();\n }\n this.mode_ = 'paintOn';\n this.startPts_ = packet.pts; // Append special characters to caption text\n } else if (this.isSpecialCharacter(char0, char1)) {\n // Bitmask char0 so that we can apply character transformations\n // regardless of field and data channel.\n // Then byte-shift to the left and OR with char1 so we can pass the\n // entire character code to `getCharFromCode`.\n char0 = (char0 & 0x03) << 8;\n text = getCharFromCode(char0 | char1);\n this[this.mode_](packet.pts, text);\n this.column_++; // Append extended characters to caption text\n } else if (this.isExtCharacter(char0, char1)) {\n // Extended characters always follow their \"non-extended\" equivalents.\n // IE if a \"è\" is desired, you'll always receive \"eè\"; non-compliant\n // decoders are supposed to drop the \"è\", while compliant decoders\n // backspace the \"e\" and insert \"è\".\n // Delete the previous character\n if (this.mode_ === 'popOn') {\n this.nonDisplayed_[this.row_].text = this.nonDisplayed_[this.row_].text.slice(0, -1);\n } else {\n this.displayed_[this.row_].text = this.displayed_[this.row_].text.slice(0, -1);\n } // Bitmask char0 so that we can apply character transformations\n // regardless of field and data channel.\n // Then byte-shift to the left and OR with char1 so we can pass the\n // entire character code to `getCharFromCode`.\n\n char0 = (char0 & 0x03) << 8;\n text = getCharFromCode(char0 | char1);\n this[this.mode_](packet.pts, text);\n this.column_++; // Process mid-row codes\n } else if (this.isMidRowCode(char0, char1)) {\n // Attributes are not additive, so clear all formatting\n this.clearFormatting(packet.pts); // According to the standard, mid-row codes\n // should be replaced with spaces, so add one now\n\n this[this.mode_](packet.pts, ' ');\n this.column_++;\n if ((char1 & 0xe) === 0xe) {\n this.addFormatting(packet.pts, ['i']);\n }\n if ((char1 & 0x1) === 0x1) {\n this.addFormatting(packet.pts, ['u']);\n } // Detect offset control codes and adjust cursor\n } else if (this.isOffsetControlCode(char0, char1)) {\n // Cursor position is set by indent PAC (see below) in 4-column\n // increments, with an additional offset code of 1-3 to reach any\n // of the 32 columns specified by CEA-608. So all we need to do\n // here is increment the column cursor by the given offset.\n const offset = char1 & 0x03; // For an offest value 1-3, set the offset for that caption\n // in the non-displayed array.\n\n this.nonDisplayed_[this.row_].offset = offset;\n this.column_ += offset; // Detect PACs (Preamble Address Codes)\n } else if (this.isPAC(char0, char1)) {\n // There's no logic for PAC -> row mapping, so we have to just\n // find the row code in an array and use its index :(\n var row = ROWS.indexOf(data & 0x1f20); // Configure the caption window if we're in roll-up mode\n\n if (this.mode_ === 'rollUp') {\n // This implies that the base row is incorrectly set.\n // As per the recommendation in CEA-608(Base Row Implementation), defer to the number\n // of roll-up rows set.\n if (row - this.rollUpRows_ + 1 < 0) {\n row = this.rollUpRows_ - 1;\n }\n this.setRollUp(packet.pts, row);\n } // Ensure the row is between 0 and 14, otherwise use the most\n // recent or default row.\n\n if (row !== this.row_ && row >= 0 && row <= 14) {\n // formatting is only persistent for current row\n this.clearFormatting(packet.pts);\n this.row_ = row;\n } // All PACs can apply underline, so detect and apply\n // (All odd-numbered second bytes set underline)\n\n if (char1 & 0x1 && this.formatting_.indexOf('u') === -1) {\n this.addFormatting(packet.pts, ['u']);\n }\n if ((data & 0x10) === 0x10) {\n // We've got an indent level code. Each successive even number\n // increments the column cursor by 4, so we can get the desired\n // column position by bit-shifting to the right (to get n/2)\n // and multiplying by 4.\n const indentations = (data & 0xe) >> 1;\n this.column_ = indentations * 4; // add to the number of indentations for positioning\n\n this.nonDisplayed_[this.row_].indent += indentations;\n }\n if (this.isColorPAC(char1)) {\n // it's a color code, though we only support white, which\n // can be either normal or italicized. white italics can be\n // either 0x4e or 0x6e depending on the row, so we just\n // bitwise-and with 0xe to see if italics should be turned on\n if ((char1 & 0xe) === 0xe) {\n this.addFormatting(packet.pts, ['i']);\n }\n } // We have a normal character in char0, and possibly one in char1\n } else if (this.isNormalChar(char0)) {\n if (char1 === 0x00) {\n char1 = null;\n }\n text = getCharFromCode(char0);\n text += getCharFromCode(char1);\n this[this.mode_](packet.pts, text);\n this.column_ += text.length;\n } // finish data processing\n };\n };\n\n Cea608Stream.prototype = new Stream$7(); // Trigger a cue point that captures the current state of the\n // display buffer\n\n Cea608Stream.prototype.flushDisplayed = function (pts) {\n const logWarning = index => {\n this.trigger('log', {\n level: 'warn',\n message: 'Skipping a malformed 608 caption at index ' + index + '.'\n });\n };\n const content = [];\n this.displayed_.forEach((row, i) => {\n if (row && row.text && row.text.length) {\n try {\n // remove spaces from the start and end of the string\n row.text = row.text.trim();\n } catch (e) {\n // Ordinarily, this shouldn't happen. However, caption\n // parsing errors should not throw exceptions and\n // break playback.\n logWarning(i);\n } // See the below link for more details on the following fields:\n // https://dvcs.w3.org/hg/text-tracks/raw-file/default/608toVTT/608toVTT.html#positioning-in-cea-608\n\n if (row.text.length) {\n content.push({\n // The text to be displayed in the caption from this specific row, with whitespace removed.\n text: row.text,\n // Value between 1 and 15 representing the PAC row used to calculate line height.\n line: i + 1,\n // A number representing the indent position by percentage (CEA-608 PAC indent code).\n // The value will be a number between 10 and 80. Offset is used to add an aditional\n // value to the position if necessary.\n position: 10 + Math.min(70, row.indent * 10) + row.offset * 2.5\n });\n }\n } else if (row === undefined || row === null) {\n logWarning(i);\n }\n });\n if (content.length) {\n this.trigger('data', {\n startPts: this.startPts_,\n endPts: pts,\n content,\n stream: this.name_\n });\n }\n };\n /**\n * Zero out the data, used for startup and on seek\n */\n\n Cea608Stream.prototype.reset = function () {\n this.mode_ = 'popOn'; // When in roll-up mode, the index of the last row that will\n // actually display captions. If a caption is shifted to a row\n // with a lower index than this, it is cleared from the display\n // buffer\n\n this.topRow_ = 0;\n this.startPts_ = 0;\n this.displayed_ = createDisplayBuffer();\n this.nonDisplayed_ = createDisplayBuffer();\n this.lastControlCode_ = null; // Track row and column for proper line-breaking and spacing\n\n this.column_ = 0;\n this.row_ = BOTTOM_ROW;\n this.rollUpRows_ = 2; // This variable holds currently-applied formatting\n\n this.formatting_ = [];\n };\n /**\n * Sets up control code and related constants for this instance\n */\n\n Cea608Stream.prototype.setConstants = function () {\n // The following attributes have these uses:\n // ext_ : char0 for mid-row codes, and the base for extended\n // chars (ext_+0, ext_+1, and ext_+2 are char0s for\n // extended codes)\n // control_: char0 for control codes, except byte-shifted to the\n // left so that we can do this.control_ | CONTROL_CODE\n // offset_: char0 for tab offset codes\n //\n // It's also worth noting that control codes, and _only_ control codes,\n // differ between field 1 and field2. Field 2 control codes are always\n // their field 1 value plus 1. That's why there's the \"| field\" on the\n // control value.\n if (this.dataChannel_ === 0) {\n this.BASE_ = 0x10;\n this.EXT_ = 0x11;\n this.CONTROL_ = (0x14 | this.field_) << 8;\n this.OFFSET_ = 0x17;\n } else if (this.dataChannel_ === 1) {\n this.BASE_ = 0x18;\n this.EXT_ = 0x19;\n this.CONTROL_ = (0x1c | this.field_) << 8;\n this.OFFSET_ = 0x1f;\n } // Constants for the LSByte command codes recognized by Cea608Stream. This\n // list is not exhaustive. For a more comprehensive listing and semantics see\n // http://www.gpo.gov/fdsys/pkg/CFR-2010-title47-vol1/pdf/CFR-2010-title47-vol1-sec15-119.pdf\n // Padding\n\n this.PADDING_ = 0x0000; // Pop-on Mode\n\n this.RESUME_CAPTION_LOADING_ = this.CONTROL_ | 0x20;\n this.END_OF_CAPTION_ = this.CONTROL_ | 0x2f; // Roll-up Mode\n\n this.ROLL_UP_2_ROWS_ = this.CONTROL_ | 0x25;\n this.ROLL_UP_3_ROWS_ = this.CONTROL_ | 0x26;\n this.ROLL_UP_4_ROWS_ = this.CONTROL_ | 0x27;\n this.CARRIAGE_RETURN_ = this.CONTROL_ | 0x2d; // paint-on mode\n\n this.RESUME_DIRECT_CAPTIONING_ = this.CONTROL_ | 0x29; // Erasure\n\n this.BACKSPACE_ = this.CONTROL_ | 0x21;\n this.ERASE_DISPLAYED_MEMORY_ = this.CONTROL_ | 0x2c;\n this.ERASE_NON_DISPLAYED_MEMORY_ = this.CONTROL_ | 0x2e;\n };\n /**\n * Detects if the 2-byte packet data is a special character\n *\n * Special characters have a second byte in the range 0x30 to 0x3f,\n * with the first byte being 0x11 (for data channel 1) or 0x19 (for\n * data channel 2).\n *\n * @param {Integer} char0 The first byte\n * @param {Integer} char1 The second byte\n * @return {Boolean} Whether the 2 bytes are an special character\n */\n\n Cea608Stream.prototype.isSpecialCharacter = function (char0, char1) {\n return char0 === this.EXT_ && char1 >= 0x30 && char1 <= 0x3f;\n };\n /**\n * Detects if the 2-byte packet data is an extended character\n *\n * Extended characters have a second byte in the range 0x20 to 0x3f,\n * with the first byte being 0x12 or 0x13 (for data channel 1) or\n * 0x1a or 0x1b (for data channel 2).\n *\n * @param {Integer} char0 The first byte\n * @param {Integer} char1 The second byte\n * @return {Boolean} Whether the 2 bytes are an extended character\n */\n\n Cea608Stream.prototype.isExtCharacter = function (char0, char1) {\n return (char0 === this.EXT_ + 1 || char0 === this.EXT_ + 2) && char1 >= 0x20 && char1 <= 0x3f;\n };\n /**\n * Detects if the 2-byte packet is a mid-row code\n *\n * Mid-row codes have a second byte in the range 0x20 to 0x2f, with\n * the first byte being 0x11 (for data channel 1) or 0x19 (for data\n * channel 2).\n *\n * @param {Integer} char0 The first byte\n * @param {Integer} char1 The second byte\n * @return {Boolean} Whether the 2 bytes are a mid-row code\n */\n\n Cea608Stream.prototype.isMidRowCode = function (char0, char1) {\n return char0 === this.EXT_ && char1 >= 0x20 && char1 <= 0x2f;\n };\n /**\n * Detects if the 2-byte packet is an offset control code\n *\n * Offset control codes have a second byte in the range 0x21 to 0x23,\n * with the first byte being 0x17 (for data channel 1) or 0x1f (for\n * data channel 2).\n *\n * @param {Integer} char0 The first byte\n * @param {Integer} char1 The second byte\n * @return {Boolean} Whether the 2 bytes are an offset control code\n */\n\n Cea608Stream.prototype.isOffsetControlCode = function (char0, char1) {\n return char0 === this.OFFSET_ && char1 >= 0x21 && char1 <= 0x23;\n };\n /**\n * Detects if the 2-byte packet is a Preamble Address Code\n *\n * PACs have a first byte in the range 0x10 to 0x17 (for data channel 1)\n * or 0x18 to 0x1f (for data channel 2), with the second byte in the\n * range 0x40 to 0x7f.\n *\n * @param {Integer} char0 The first byte\n * @param {Integer} char1 The second byte\n * @return {Boolean} Whether the 2 bytes are a PAC\n */\n\n Cea608Stream.prototype.isPAC = function (char0, char1) {\n return char0 >= this.BASE_ && char0 < this.BASE_ + 8 && char1 >= 0x40 && char1 <= 0x7f;\n };\n /**\n * Detects if a packet's second byte is in the range of a PAC color code\n *\n * PAC color codes have the second byte be in the range 0x40 to 0x4f, or\n * 0x60 to 0x6f.\n *\n * @param {Integer} char1 The second byte\n * @return {Boolean} Whether the byte is a color PAC\n */\n\n Cea608Stream.prototype.isColorPAC = function (char1) {\n return char1 >= 0x40 && char1 <= 0x4f || char1 >= 0x60 && char1 <= 0x7f;\n };\n /**\n * Detects if a single byte is in the range of a normal character\n *\n * Normal text bytes are in the range 0x20 to 0x7f.\n *\n * @param {Integer} char The byte\n * @return {Boolean} Whether the byte is a normal character\n */\n\n Cea608Stream.prototype.isNormalChar = function (char) {\n return char >= 0x20 && char <= 0x7f;\n };\n /**\n * Configures roll-up\n *\n * @param {Integer} pts Current PTS\n * @param {Integer} newBaseRow Used by PACs to slide the current window to\n * a new position\n */\n\n Cea608Stream.prototype.setRollUp = function (pts, newBaseRow) {\n // Reset the base row to the bottom row when switching modes\n if (this.mode_ !== 'rollUp') {\n this.row_ = BOTTOM_ROW;\n this.mode_ = 'rollUp'; // Spec says to wipe memories when switching to roll-up\n\n this.flushDisplayed(pts);\n this.nonDisplayed_ = createDisplayBuffer();\n this.displayed_ = createDisplayBuffer();\n }\n if (newBaseRow !== undefined && newBaseRow !== this.row_) {\n // move currently displayed captions (up or down) to the new base row\n for (var i = 0; i < this.rollUpRows_; i++) {\n this.displayed_[newBaseRow - i] = this.displayed_[this.row_ - i];\n this.displayed_[this.row_ - i] = {\n text: '',\n indent: 0,\n offset: 0\n };\n }\n }\n if (newBaseRow === undefined) {\n newBaseRow = this.row_;\n }\n this.topRow_ = newBaseRow - this.rollUpRows_ + 1;\n }; // Adds the opening HTML tag for the passed character to the caption text,\n // and keeps track of it for later closing\n\n Cea608Stream.prototype.addFormatting = function (pts, format) {\n this.formatting_ = this.formatting_.concat(format);\n var text = format.reduce(function (text, format) {\n return text + '<' + format + '>';\n }, '');\n this[this.mode_](pts, text);\n }; // Adds HTML closing tags for current formatting to caption text and\n // clears remembered formatting\n\n Cea608Stream.prototype.clearFormatting = function (pts) {\n if (!this.formatting_.length) {\n return;\n }\n var text = this.formatting_.reverse().reduce(function (text, format) {\n return text + '';\n }, '');\n this.formatting_ = [];\n this[this.mode_](pts, text);\n }; // Mode Implementations\n\n Cea608Stream.prototype.popOn = function (pts, text) {\n var baseRow = this.nonDisplayed_[this.row_].text; // buffer characters\n\n baseRow += text;\n this.nonDisplayed_[this.row_].text = baseRow;\n };\n Cea608Stream.prototype.rollUp = function (pts, text) {\n var baseRow = this.displayed_[this.row_].text;\n baseRow += text;\n this.displayed_[this.row_].text = baseRow;\n };\n Cea608Stream.prototype.shiftRowsUp_ = function () {\n var i; // clear out inactive rows\n\n for (i = 0; i < this.topRow_; i++) {\n this.displayed_[i] = {\n text: '',\n indent: 0,\n offset: 0\n };\n }\n for (i = this.row_ + 1; i < BOTTOM_ROW + 1; i++) {\n this.displayed_[i] = {\n text: '',\n indent: 0,\n offset: 0\n };\n } // shift displayed rows up\n\n for (i = this.topRow_; i < this.row_; i++) {\n this.displayed_[i] = this.displayed_[i + 1];\n } // clear out the bottom row\n\n this.displayed_[this.row_] = {\n text: '',\n indent: 0,\n offset: 0\n };\n };\n Cea608Stream.prototype.paintOn = function (pts, text) {\n var baseRow = this.displayed_[this.row_].text;\n baseRow += text;\n this.displayed_[this.row_].text = baseRow;\n }; // exports\n\n var captionStream = {\n CaptionStream: CaptionStream$2,\n Cea608Stream: Cea608Stream,\n Cea708Stream: Cea708Stream\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n */\n\n var streamTypes = {\n H264_STREAM_TYPE: 0x1B,\n ADTS_STREAM_TYPE: 0x0F,\n METADATA_STREAM_TYPE: 0x15\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * Accepts program elementary stream (PES) data events and corrects\n * decode and presentation time stamps to account for a rollover\n * of the 33 bit value.\n */\n\n var Stream$6 = stream;\n var MAX_TS = 8589934592;\n var RO_THRESH = 4294967296;\n var TYPE_SHARED = 'shared';\n var handleRollover$1 = function (value, reference) {\n var direction = 1;\n if (value > reference) {\n // If the current timestamp value is greater than our reference timestamp and we detect a\n // timestamp rollover, this means the roll over is happening in the opposite direction.\n // Example scenario: Enter a long stream/video just after a rollover occurred. The reference\n // point will be set to a small number, e.g. 1. The user then seeks backwards over the\n // rollover point. In loading this segment, the timestamp values will be very large,\n // e.g. 2^33 - 1. Since this comes before the data we loaded previously, we want to adjust\n // the time stamp to be `value - 2^33`.\n direction = -1;\n } // Note: A seek forwards or back that is greater than the RO_THRESH (2^32, ~13 hours) will\n // cause an incorrect adjustment.\n\n while (Math.abs(reference - value) > RO_THRESH) {\n value += direction * MAX_TS;\n }\n return value;\n };\n var TimestampRolloverStream$1 = function (type) {\n var lastDTS, referenceDTS;\n TimestampRolloverStream$1.prototype.init.call(this); // The \"shared\" type is used in cases where a stream will contain muxed\n // video and audio. We could use `undefined` here, but having a string\n // makes debugging a little clearer.\n\n this.type_ = type || TYPE_SHARED;\n this.push = function (data) {\n /**\n * Rollover stream expects data from elementary stream.\n * Elementary stream can push forward 2 types of data\n * - Parsed Video/Audio/Timed-metadata PES (packetized elementary stream) packets\n * - Tracks metadata from PMT (Program Map Table)\n * Rollover stream expects pts/dts info to be available, since it stores lastDTS\n * We should ignore non-PES packets since they may override lastDTS to undefined.\n * lastDTS is important to signal the next segments\n * about rollover from the previous segments.\n */\n if (data.type === 'metadata') {\n this.trigger('data', data);\n return;\n } // Any \"shared\" rollover streams will accept _all_ data. Otherwise,\n // streams will only accept data that matches their type.\n\n if (this.type_ !== TYPE_SHARED && data.type !== this.type_) {\n return;\n }\n if (referenceDTS === undefined) {\n referenceDTS = data.dts;\n }\n data.dts = handleRollover$1(data.dts, referenceDTS);\n data.pts = handleRollover$1(data.pts, referenceDTS);\n lastDTS = data.dts;\n this.trigger('data', data);\n };\n this.flush = function () {\n referenceDTS = lastDTS;\n this.trigger('done');\n };\n this.endTimeline = function () {\n this.flush();\n this.trigger('endedtimeline');\n };\n this.discontinuity = function () {\n referenceDTS = void 0;\n lastDTS = void 0;\n };\n this.reset = function () {\n this.discontinuity();\n this.trigger('reset');\n };\n };\n TimestampRolloverStream$1.prototype = new Stream$6();\n var timestampRolloverStream = {\n TimestampRolloverStream: TimestampRolloverStream$1,\n handleRollover: handleRollover$1\n }; // Once IE11 support is dropped, this function should be removed.\n\n var typedArrayIndexOf$1 = (typedArray, element, fromIndex) => {\n if (!typedArray) {\n return -1;\n }\n var currentIndex = fromIndex;\n for (; currentIndex < typedArray.length; currentIndex++) {\n if (typedArray[currentIndex] === element) {\n return currentIndex;\n }\n }\n return -1;\n };\n var typedArray = {\n typedArrayIndexOf: typedArrayIndexOf$1\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * Tools for parsing ID3 frame data\n * @see http://id3.org/id3v2.3.0\n */\n\n var typedArrayIndexOf = typedArray.typedArrayIndexOf,\n // Frames that allow different types of text encoding contain a text\n // encoding description byte [ID3v2.4.0 section 4.]\n textEncodingDescriptionByte = {\n Iso88591: 0x00,\n // ISO-8859-1, terminated with \\0.\n Utf16: 0x01,\n // UTF-16 encoded Unicode BOM, terminated with \\0\\0\n Utf16be: 0x02,\n // UTF-16BE encoded Unicode, without BOM, terminated with \\0\\0\n Utf8: 0x03 // UTF-8 encoded Unicode, terminated with \\0\n },\n // return a percent-encoded representation of the specified byte range\n // @see http://en.wikipedia.org/wiki/Percent-encoding \n percentEncode$1 = function (bytes, start, end) {\n var i,\n result = '';\n for (i = start; i < end; i++) {\n result += '%' + ('00' + bytes[i].toString(16)).slice(-2);\n }\n return result;\n },\n // return the string representation of the specified byte range,\n // interpreted as UTf-8.\n parseUtf8 = function (bytes, start, end) {\n return decodeURIComponent(percentEncode$1(bytes, start, end));\n },\n // return the string representation of the specified byte range,\n // interpreted as ISO-8859-1.\n parseIso88591$1 = function (bytes, start, end) {\n return unescape(percentEncode$1(bytes, start, end)); // jshint ignore:line\n },\n parseSyncSafeInteger$1 = function (data) {\n return data[0] << 21 | data[1] << 14 | data[2] << 7 | data[3];\n },\n frameParsers = {\n 'APIC': function (frame) {\n var i = 1,\n mimeTypeEndIndex,\n descriptionEndIndex,\n LINK_MIME_TYPE = '-->';\n if (frame.data[0] !== textEncodingDescriptionByte.Utf8) {\n // ignore frames with unrecognized character encodings\n return;\n } // parsing fields [ID3v2.4.0 section 4.14.]\n\n mimeTypeEndIndex = typedArrayIndexOf(frame.data, 0, i);\n if (mimeTypeEndIndex < 0) {\n // malformed frame\n return;\n } // parsing Mime type field (terminated with \\0)\n\n frame.mimeType = parseIso88591$1(frame.data, i, mimeTypeEndIndex);\n i = mimeTypeEndIndex + 1; // parsing 1-byte Picture Type field\n\n frame.pictureType = frame.data[i];\n i++;\n descriptionEndIndex = typedArrayIndexOf(frame.data, 0, i);\n if (descriptionEndIndex < 0) {\n // malformed frame\n return;\n } // parsing Description field (terminated with \\0)\n\n frame.description = parseUtf8(frame.data, i, descriptionEndIndex);\n i = descriptionEndIndex + 1;\n if (frame.mimeType === LINK_MIME_TYPE) {\n // parsing Picture Data field as URL (always represented as ISO-8859-1 [ID3v2.4.0 section 4.])\n frame.url = parseIso88591$1(frame.data, i, frame.data.length);\n } else {\n // parsing Picture Data field as binary data\n frame.pictureData = frame.data.subarray(i, frame.data.length);\n }\n },\n 'T*': function (frame) {\n if (frame.data[0] !== textEncodingDescriptionByte.Utf8) {\n // ignore frames with unrecognized character encodings\n return;\n } // parse text field, do not include null terminator in the frame value\n // frames that allow different types of encoding contain terminated text [ID3v2.4.0 section 4.]\n\n frame.value = parseUtf8(frame.data, 1, frame.data.length).replace(/\\0*$/, ''); // text information frames supports multiple strings, stored as a terminator separated list [ID3v2.4.0 section 4.2.]\n\n frame.values = frame.value.split('\\0');\n },\n 'TXXX': function (frame) {\n var descriptionEndIndex;\n if (frame.data[0] !== textEncodingDescriptionByte.Utf8) {\n // ignore frames with unrecognized character encodings\n return;\n }\n descriptionEndIndex = typedArrayIndexOf(frame.data, 0, 1);\n if (descriptionEndIndex === -1) {\n return;\n } // parse the text fields\n\n frame.description = parseUtf8(frame.data, 1, descriptionEndIndex); // do not include the null terminator in the tag value\n // frames that allow different types of encoding contain terminated text\n // [ID3v2.4.0 section 4.]\n\n frame.value = parseUtf8(frame.data, descriptionEndIndex + 1, frame.data.length).replace(/\\0*$/, '');\n frame.data = frame.value;\n },\n 'W*': function (frame) {\n // parse URL field; URL fields are always represented as ISO-8859-1 [ID3v2.4.0 section 4.]\n // if the value is followed by a string termination all the following information should be ignored [ID3v2.4.0 section 4.3]\n frame.url = parseIso88591$1(frame.data, 0, frame.data.length).replace(/\\0.*$/, '');\n },\n 'WXXX': function (frame) {\n var descriptionEndIndex;\n if (frame.data[0] !== textEncodingDescriptionByte.Utf8) {\n // ignore frames with unrecognized character encodings\n return;\n }\n descriptionEndIndex = typedArrayIndexOf(frame.data, 0, 1);\n if (descriptionEndIndex === -1) {\n return;\n } // parse the description and URL fields\n\n frame.description = parseUtf8(frame.data, 1, descriptionEndIndex); // URL fields are always represented as ISO-8859-1 [ID3v2.4.0 section 4.]\n // if the value is followed by a string termination all the following information\n // should be ignored [ID3v2.4.0 section 4.3]\n\n frame.url = parseIso88591$1(frame.data, descriptionEndIndex + 1, frame.data.length).replace(/\\0.*$/, '');\n },\n 'PRIV': function (frame) {\n var i;\n for (i = 0; i < frame.data.length; i++) {\n if (frame.data[i] === 0) {\n // parse the description and URL fields\n frame.owner = parseIso88591$1(frame.data, 0, i);\n break;\n }\n }\n frame.privateData = frame.data.subarray(i + 1);\n frame.data = frame.privateData;\n }\n };\n var parseId3Frames$1 = function (data) {\n var frameSize,\n frameHeader,\n frameStart = 10,\n tagSize = 0,\n frames = []; // If we don't have enough data for a header, 10 bytes, \n // or 'ID3' in the first 3 bytes this is not a valid ID3 tag.\n\n if (data.length < 10 || data[0] !== 'I'.charCodeAt(0) || data[1] !== 'D'.charCodeAt(0) || data[2] !== '3'.charCodeAt(0)) {\n return;\n } // the frame size is transmitted as a 28-bit integer in the\n // last four bytes of the ID3 header.\n // The most significant bit of each byte is dropped and the\n // results concatenated to recover the actual value.\n\n tagSize = parseSyncSafeInteger$1(data.subarray(6, 10)); // ID3 reports the tag size excluding the header but it's more\n // convenient for our comparisons to include it\n\n tagSize += 10; // check bit 6 of byte 5 for the extended header flag.\n\n var hasExtendedHeader = data[5] & 0x40;\n if (hasExtendedHeader) {\n // advance the frame start past the extended header\n frameStart += 4; // header size field\n\n frameStart += parseSyncSafeInteger$1(data.subarray(10, 14));\n tagSize -= parseSyncSafeInteger$1(data.subarray(16, 20)); // clip any padding off the end\n } // parse one or more ID3 frames\n // http://id3.org/id3v2.3.0#ID3v2_frame_overview\n\n do {\n // determine the number of bytes in this frame\n frameSize = parseSyncSafeInteger$1(data.subarray(frameStart + 4, frameStart + 8));\n if (frameSize < 1) {\n break;\n }\n frameHeader = String.fromCharCode(data[frameStart], data[frameStart + 1], data[frameStart + 2], data[frameStart + 3]);\n var frame = {\n id: frameHeader,\n data: data.subarray(frameStart + 10, frameStart + frameSize + 10)\n };\n frame.key = frame.id; // parse frame values\n\n if (frameParsers[frame.id]) {\n // use frame specific parser\n frameParsers[frame.id](frame);\n } else if (frame.id[0] === 'T') {\n // use text frame generic parser\n frameParsers['T*'](frame);\n } else if (frame.id[0] === 'W') {\n // use URL link frame generic parser\n frameParsers['W*'](frame);\n }\n frames.push(frame);\n frameStart += 10; // advance past the frame header\n\n frameStart += frameSize; // advance past the frame body\n } while (frameStart < tagSize);\n return frames;\n };\n var parseId3 = {\n parseId3Frames: parseId3Frames$1,\n parseSyncSafeInteger: parseSyncSafeInteger$1,\n frameParsers: frameParsers\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * Accepts program elementary stream (PES) data events and parses out\n * ID3 metadata from them, if present.\n * @see http://id3.org/id3v2.3.0\n */\n\n var Stream$5 = stream,\n StreamTypes$3 = streamTypes,\n id3 = parseId3,\n MetadataStream;\n MetadataStream = function (options) {\n var settings = {\n // the bytes of the program-level descriptor field in MP2T\n // see ISO/IEC 13818-1:2013 (E), section 2.6 \"Program and\n // program element descriptors\"\n descriptor: options && options.descriptor\n },\n // the total size in bytes of the ID3 tag being parsed\n tagSize = 0,\n // tag data that is not complete enough to be parsed\n buffer = [],\n // the total number of bytes currently in the buffer\n bufferSize = 0,\n i;\n MetadataStream.prototype.init.call(this); // calculate the text track in-band metadata track dispatch type\n // https://html.spec.whatwg.org/multipage/embedded-content.html#steps-to-expose-a-media-resource-specific-text-track\n\n this.dispatchType = StreamTypes$3.METADATA_STREAM_TYPE.toString(16);\n if (settings.descriptor) {\n for (i = 0; i < settings.descriptor.length; i++) {\n this.dispatchType += ('00' + settings.descriptor[i].toString(16)).slice(-2);\n }\n }\n this.push = function (chunk) {\n var tag, frameStart, frameSize, frame, i, frameHeader;\n if (chunk.type !== 'timed-metadata') {\n return;\n } // if data_alignment_indicator is set in the PES header,\n // we must have the start of a new ID3 tag. Assume anything\n // remaining in the buffer was malformed and throw it out\n\n if (chunk.dataAlignmentIndicator) {\n bufferSize = 0;\n buffer.length = 0;\n } // ignore events that don't look like ID3 data\n\n if (buffer.length === 0 && (chunk.data.length < 10 || chunk.data[0] !== 'I'.charCodeAt(0) || chunk.data[1] !== 'D'.charCodeAt(0) || chunk.data[2] !== '3'.charCodeAt(0))) {\n this.trigger('log', {\n level: 'warn',\n message: 'Skipping unrecognized metadata packet'\n });\n return;\n } // add this chunk to the data we've collected so far\n\n buffer.push(chunk);\n bufferSize += chunk.data.byteLength; // grab the size of the entire frame from the ID3 header\n\n if (buffer.length === 1) {\n // the frame size is transmitted as a 28-bit integer in the\n // last four bytes of the ID3 header.\n // The most significant bit of each byte is dropped and the\n // results concatenated to recover the actual value.\n tagSize = id3.parseSyncSafeInteger(chunk.data.subarray(6, 10)); // ID3 reports the tag size excluding the header but it's more\n // convenient for our comparisons to include it\n\n tagSize += 10;\n } // if the entire frame has not arrived, wait for more data\n\n if (bufferSize < tagSize) {\n return;\n } // collect the entire frame so it can be parsed\n\n tag = {\n data: new Uint8Array(tagSize),\n frames: [],\n pts: buffer[0].pts,\n dts: buffer[0].dts\n };\n for (i = 0; i < tagSize;) {\n tag.data.set(buffer[0].data.subarray(0, tagSize - i), i);\n i += buffer[0].data.byteLength;\n bufferSize -= buffer[0].data.byteLength;\n buffer.shift();\n } // find the start of the first frame and the end of the tag\n\n frameStart = 10;\n if (tag.data[5] & 0x40) {\n // advance the frame start past the extended header\n frameStart += 4; // header size field\n\n frameStart += id3.parseSyncSafeInteger(tag.data.subarray(10, 14)); // clip any padding off the end\n\n tagSize -= id3.parseSyncSafeInteger(tag.data.subarray(16, 20));\n } // parse one or more ID3 frames\n // http://id3.org/id3v2.3.0#ID3v2_frame_overview\n\n do {\n // determine the number of bytes in this frame\n frameSize = id3.parseSyncSafeInteger(tag.data.subarray(frameStart + 4, frameStart + 8));\n if (frameSize < 1) {\n this.trigger('log', {\n level: 'warn',\n message: 'Malformed ID3 frame encountered. Skipping remaining metadata parsing.'\n }); // If the frame is malformed, don't parse any further frames but allow previous valid parsed frames\n // to be sent along.\n\n break;\n }\n frameHeader = String.fromCharCode(tag.data[frameStart], tag.data[frameStart + 1], tag.data[frameStart + 2], tag.data[frameStart + 3]);\n frame = {\n id: frameHeader,\n data: tag.data.subarray(frameStart + 10, frameStart + frameSize + 10)\n };\n frame.key = frame.id; // parse frame values\n\n if (id3.frameParsers[frame.id]) {\n // use frame specific parser\n id3.frameParsers[frame.id](frame);\n } else if (frame.id[0] === 'T') {\n // use text frame generic parser\n id3.frameParsers['T*'](frame);\n } else if (frame.id[0] === 'W') {\n // use URL link frame generic parser\n id3.frameParsers['W*'](frame);\n } // handle the special PRIV frame used to indicate the start\n // time for raw AAC data\n\n if (frame.owner === 'com.apple.streaming.transportStreamTimestamp') {\n var d = frame.data,\n size = (d[3] & 0x01) << 30 | d[4] << 22 | d[5] << 14 | d[6] << 6 | d[7] >>> 2;\n size *= 4;\n size += d[7] & 0x03;\n frame.timeStamp = size; // in raw AAC, all subsequent data will be timestamped based\n // on the value of this frame\n // we couldn't have known the appropriate pts and dts before\n // parsing this ID3 tag so set those values now\n\n if (tag.pts === undefined && tag.dts === undefined) {\n tag.pts = frame.timeStamp;\n tag.dts = frame.timeStamp;\n }\n this.trigger('timestamp', frame);\n }\n tag.frames.push(frame);\n frameStart += 10; // advance past the frame header\n\n frameStart += frameSize; // advance past the frame body\n } while (frameStart < tagSize);\n this.trigger('data', tag);\n };\n };\n MetadataStream.prototype = new Stream$5();\n var metadataStream = MetadataStream;\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * A stream-based mp2t to mp4 converter. This utility can be used to\n * deliver mp4s to a SourceBuffer on platforms that support native\n * Media Source Extensions.\n */\n\n var Stream$4 = stream,\n CaptionStream$1 = captionStream,\n StreamTypes$2 = streamTypes,\n TimestampRolloverStream = timestampRolloverStream.TimestampRolloverStream; // object types\n\n var TransportPacketStream, TransportParseStream, ElementaryStream; // constants\n\n var MP2T_PACKET_LENGTH$1 = 188,\n // bytes\n SYNC_BYTE$1 = 0x47;\n /**\n * Splits an incoming stream of binary data into MPEG-2 Transport\n * Stream packets.\n */\n\n TransportPacketStream = function () {\n var buffer = new Uint8Array(MP2T_PACKET_LENGTH$1),\n bytesInBuffer = 0;\n TransportPacketStream.prototype.init.call(this); // Deliver new bytes to the stream.\n\n /**\n * Split a stream of data into M2TS packets\n **/\n\n this.push = function (bytes) {\n var startIndex = 0,\n endIndex = MP2T_PACKET_LENGTH$1,\n everything; // If there are bytes remaining from the last segment, prepend them to the\n // bytes that were pushed in\n\n if (bytesInBuffer) {\n everything = new Uint8Array(bytes.byteLength + bytesInBuffer);\n everything.set(buffer.subarray(0, bytesInBuffer));\n everything.set(bytes, bytesInBuffer);\n bytesInBuffer = 0;\n } else {\n everything = bytes;\n } // While we have enough data for a packet\n\n while (endIndex < everything.byteLength) {\n // Look for a pair of start and end sync bytes in the data..\n if (everything[startIndex] === SYNC_BYTE$1 && everything[endIndex] === SYNC_BYTE$1) {\n // We found a packet so emit it and jump one whole packet forward in\n // the stream\n this.trigger('data', everything.subarray(startIndex, endIndex));\n startIndex += MP2T_PACKET_LENGTH$1;\n endIndex += MP2T_PACKET_LENGTH$1;\n continue;\n } // If we get here, we have somehow become de-synchronized and we need to step\n // forward one byte at a time until we find a pair of sync bytes that denote\n // a packet\n\n startIndex++;\n endIndex++;\n } // If there was some data left over at the end of the segment that couldn't\n // possibly be a whole packet, keep it because it might be the start of a packet\n // that continues in the next segment\n\n if (startIndex < everything.byteLength) {\n buffer.set(everything.subarray(startIndex), 0);\n bytesInBuffer = everything.byteLength - startIndex;\n }\n };\n /**\n * Passes identified M2TS packets to the TransportParseStream to be parsed\n **/\n\n this.flush = function () {\n // If the buffer contains a whole packet when we are being flushed, emit it\n // and empty the buffer. Otherwise hold onto the data because it may be\n // important for decoding the next segment\n if (bytesInBuffer === MP2T_PACKET_LENGTH$1 && buffer[0] === SYNC_BYTE$1) {\n this.trigger('data', buffer);\n bytesInBuffer = 0;\n }\n this.trigger('done');\n };\n this.endTimeline = function () {\n this.flush();\n this.trigger('endedtimeline');\n };\n this.reset = function () {\n bytesInBuffer = 0;\n this.trigger('reset');\n };\n };\n TransportPacketStream.prototype = new Stream$4();\n /**\n * Accepts an MP2T TransportPacketStream and emits data events with parsed\n * forms of the individual transport stream packets.\n */\n\n TransportParseStream = function () {\n var parsePsi, parsePat, parsePmt, self;\n TransportParseStream.prototype.init.call(this);\n self = this;\n this.packetsWaitingForPmt = [];\n this.programMapTable = undefined;\n parsePsi = function (payload, psi) {\n var offset = 0; // PSI packets may be split into multiple sections and those\n // sections may be split into multiple packets. If a PSI\n // section starts in this packet, the payload_unit_start_indicator\n // will be true and the first byte of the payload will indicate\n // the offset from the current position to the start of the\n // section.\n\n if (psi.payloadUnitStartIndicator) {\n offset += payload[offset] + 1;\n }\n if (psi.type === 'pat') {\n parsePat(payload.subarray(offset), psi);\n } else {\n parsePmt(payload.subarray(offset), psi);\n }\n };\n parsePat = function (payload, pat) {\n pat.section_number = payload[7]; // eslint-disable-line camelcase\n\n pat.last_section_number = payload[8]; // eslint-disable-line camelcase\n // skip the PSI header and parse the first PMT entry\n\n self.pmtPid = (payload[10] & 0x1F) << 8 | payload[11];\n pat.pmtPid = self.pmtPid;\n };\n /**\n * Parse out the relevant fields of a Program Map Table (PMT).\n * @param payload {Uint8Array} the PMT-specific portion of an MP2T\n * packet. The first byte in this array should be the table_id\n * field.\n * @param pmt {object} the object that should be decorated with\n * fields parsed from the PMT.\n */\n\n parsePmt = function (payload, pmt) {\n var sectionLength, tableEnd, programInfoLength, offset; // PMTs can be sent ahead of the time when they should actually\n // take effect. We don't believe this should ever be the case\n // for HLS but we'll ignore \"forward\" PMT declarations if we see\n // them. Future PMT declarations have the current_next_indicator\n // set to zero.\n\n if (!(payload[5] & 0x01)) {\n return;\n } // overwrite any existing program map table\n\n self.programMapTable = {\n video: null,\n audio: null,\n 'timed-metadata': {}\n }; // the mapping table ends at the end of the current section\n\n sectionLength = (payload[1] & 0x0f) << 8 | payload[2];\n tableEnd = 3 + sectionLength - 4; // to determine where the table is, we have to figure out how\n // long the program info descriptors are\n\n programInfoLength = (payload[10] & 0x0f) << 8 | payload[11]; // advance the offset to the first entry in the mapping table\n\n offset = 12 + programInfoLength;\n while (offset < tableEnd) {\n var streamType = payload[offset];\n var pid = (payload[offset + 1] & 0x1F) << 8 | payload[offset + 2]; // only map a single elementary_pid for audio and video stream types\n // TODO: should this be done for metadata too? for now maintain behavior of\n // multiple metadata streams\n\n if (streamType === StreamTypes$2.H264_STREAM_TYPE && self.programMapTable.video === null) {\n self.programMapTable.video = pid;\n } else if (streamType === StreamTypes$2.ADTS_STREAM_TYPE && self.programMapTable.audio === null) {\n self.programMapTable.audio = pid;\n } else if (streamType === StreamTypes$2.METADATA_STREAM_TYPE) {\n // map pid to stream type for metadata streams\n self.programMapTable['timed-metadata'][pid] = streamType;\n } // move to the next table entry\n // skip past the elementary stream descriptors, if present\n\n offset += ((payload[offset + 3] & 0x0F) << 8 | payload[offset + 4]) + 5;\n } // record the map on the packet as well\n\n pmt.programMapTable = self.programMapTable;\n };\n /**\n * Deliver a new MP2T packet to the next stream in the pipeline.\n */\n\n this.push = function (packet) {\n var result = {},\n offset = 4;\n result.payloadUnitStartIndicator = !!(packet[1] & 0x40); // pid is a 13-bit field starting at the last bit of packet[1]\n\n result.pid = packet[1] & 0x1f;\n result.pid <<= 8;\n result.pid |= packet[2]; // if an adaption field is present, its length is specified by the\n // fifth byte of the TS packet header. The adaptation field is\n // used to add stuffing to PES packets that don't fill a complete\n // TS packet, and to specify some forms of timing and control data\n // that we do not currently use.\n\n if ((packet[3] & 0x30) >>> 4 > 0x01) {\n offset += packet[offset] + 1;\n } // parse the rest of the packet based on the type\n\n if (result.pid === 0) {\n result.type = 'pat';\n parsePsi(packet.subarray(offset), result);\n this.trigger('data', result);\n } else if (result.pid === this.pmtPid) {\n result.type = 'pmt';\n parsePsi(packet.subarray(offset), result);\n this.trigger('data', result); // if there are any packets waiting for a PMT to be found, process them now\n\n while (this.packetsWaitingForPmt.length) {\n this.processPes_.apply(this, this.packetsWaitingForPmt.shift());\n }\n } else if (this.programMapTable === undefined) {\n // When we have not seen a PMT yet, defer further processing of\n // PES packets until one has been parsed\n this.packetsWaitingForPmt.push([packet, offset, result]);\n } else {\n this.processPes_(packet, offset, result);\n }\n };\n this.processPes_ = function (packet, offset, result) {\n // set the appropriate stream type\n if (result.pid === this.programMapTable.video) {\n result.streamType = StreamTypes$2.H264_STREAM_TYPE;\n } else if (result.pid === this.programMapTable.audio) {\n result.streamType = StreamTypes$2.ADTS_STREAM_TYPE;\n } else {\n // if not video or audio, it is timed-metadata or unknown\n // if unknown, streamType will be undefined\n result.streamType = this.programMapTable['timed-metadata'][result.pid];\n }\n result.type = 'pes';\n result.data = packet.subarray(offset);\n this.trigger('data', result);\n };\n };\n TransportParseStream.prototype = new Stream$4();\n TransportParseStream.STREAM_TYPES = {\n h264: 0x1b,\n adts: 0x0f\n };\n /**\n * Reconsistutes program elementary stream (PES) packets from parsed\n * transport stream packets. That is, if you pipe an\n * mp2t.TransportParseStream into a mp2t.ElementaryStream, the output\n * events will be events which capture the bytes for individual PES\n * packets plus relevant metadata that has been extracted from the\n * container.\n */\n\n ElementaryStream = function () {\n var self = this,\n segmentHadPmt = false,\n // PES packet fragments\n video = {\n data: [],\n size: 0\n },\n audio = {\n data: [],\n size: 0\n },\n timedMetadata = {\n data: [],\n size: 0\n },\n programMapTable,\n parsePes = function (payload, pes) {\n var ptsDtsFlags;\n const startPrefix = payload[0] << 16 | payload[1] << 8 | payload[2]; // default to an empty array\n\n pes.data = new Uint8Array(); // In certain live streams, the start of a TS fragment has ts packets\n // that are frame data that is continuing from the previous fragment. This\n // is to check that the pes data is the start of a new pes payload\n\n if (startPrefix !== 1) {\n return;\n } // get the packet length, this will be 0 for video\n\n pes.packetLength = 6 + (payload[4] << 8 | payload[5]); // find out if this packets starts a new keyframe\n\n pes.dataAlignmentIndicator = (payload[6] & 0x04) !== 0; // PES packets may be annotated with a PTS value, or a PTS value\n // and a DTS value. Determine what combination of values is\n // available to work with.\n\n ptsDtsFlags = payload[7]; // PTS and DTS are normally stored as a 33-bit number. Javascript\n // performs all bitwise operations on 32-bit integers but javascript\n // supports a much greater range (52-bits) of integer using standard\n // mathematical operations.\n // We construct a 31-bit value using bitwise operators over the 31\n // most significant bits and then multiply by 4 (equal to a left-shift\n // of 2) before we add the final 2 least significant bits of the\n // timestamp (equal to an OR.)\n\n if (ptsDtsFlags & 0xC0) {\n // the PTS and DTS are not written out directly. For information\n // on how they are encoded, see\n // http://dvd.sourceforge.net/dvdinfo/pes-hdr.html\n pes.pts = (payload[9] & 0x0E) << 27 | (payload[10] & 0xFF) << 20 | (payload[11] & 0xFE) << 12 | (payload[12] & 0xFF) << 5 | (payload[13] & 0xFE) >>> 3;\n pes.pts *= 4; // Left shift by 2\n\n pes.pts += (payload[13] & 0x06) >>> 1; // OR by the two LSBs\n\n pes.dts = pes.pts;\n if (ptsDtsFlags & 0x40) {\n pes.dts = (payload[14] & 0x0E) << 27 | (payload[15] & 0xFF) << 20 | (payload[16] & 0xFE) << 12 | (payload[17] & 0xFF) << 5 | (payload[18] & 0xFE) >>> 3;\n pes.dts *= 4; // Left shift by 2\n\n pes.dts += (payload[18] & 0x06) >>> 1; // OR by the two LSBs\n }\n } // the data section starts immediately after the PES header.\n // pes_header_data_length specifies the number of header bytes\n // that follow the last byte of the field.\n\n pes.data = payload.subarray(9 + payload[8]);\n },\n /**\n * Pass completely parsed PES packets to the next stream in the pipeline\n **/\n flushStream = function (stream, type, forceFlush) {\n var packetData = new Uint8Array(stream.size),\n event = {\n type: type\n },\n i = 0,\n offset = 0,\n packetFlushable = false,\n fragment; // do nothing if there is not enough buffered data for a complete\n // PES header\n\n if (!stream.data.length || stream.size < 9) {\n return;\n }\n event.trackId = stream.data[0].pid; // reassemble the packet\n\n for (i = 0; i < stream.data.length; i++) {\n fragment = stream.data[i];\n packetData.set(fragment.data, offset);\n offset += fragment.data.byteLength;\n } // parse assembled packet's PES header\n\n parsePes(packetData, event); // non-video PES packets MUST have a non-zero PES_packet_length\n // check that there is enough stream data to fill the packet\n\n packetFlushable = type === 'video' || event.packetLength <= stream.size; // flush pending packets if the conditions are right\n\n if (forceFlush || packetFlushable) {\n stream.size = 0;\n stream.data.length = 0;\n } // only emit packets that are complete. this is to avoid assembling\n // incomplete PES packets due to poor segmentation\n\n if (packetFlushable) {\n self.trigger('data', event);\n }\n };\n ElementaryStream.prototype.init.call(this);\n /**\n * Identifies M2TS packet types and parses PES packets using metadata\n * parsed from the PMT\n **/\n\n this.push = function (data) {\n ({\n pat: function () {// we have to wait for the PMT to arrive as well before we\n // have any meaningful metadata\n },\n pes: function () {\n var stream, streamType;\n switch (data.streamType) {\n case StreamTypes$2.H264_STREAM_TYPE:\n stream = video;\n streamType = 'video';\n break;\n case StreamTypes$2.ADTS_STREAM_TYPE:\n stream = audio;\n streamType = 'audio';\n break;\n case StreamTypes$2.METADATA_STREAM_TYPE:\n stream = timedMetadata;\n streamType = 'timed-metadata';\n break;\n default:\n // ignore unknown stream types\n return;\n } // if a new packet is starting, we can flush the completed\n // packet\n\n if (data.payloadUnitStartIndicator) {\n flushStream(stream, streamType, true);\n } // buffer this fragment until we are sure we've received the\n // complete payload\n\n stream.data.push(data);\n stream.size += data.data.byteLength;\n },\n pmt: function () {\n var event = {\n type: 'metadata',\n tracks: []\n };\n programMapTable = data.programMapTable; // translate audio and video streams to tracks\n\n if (programMapTable.video !== null) {\n event.tracks.push({\n timelineStartInfo: {\n baseMediaDecodeTime: 0\n },\n id: +programMapTable.video,\n codec: 'avc',\n type: 'video'\n });\n }\n if (programMapTable.audio !== null) {\n event.tracks.push({\n timelineStartInfo: {\n baseMediaDecodeTime: 0\n },\n id: +programMapTable.audio,\n codec: 'adts',\n type: 'audio'\n });\n }\n segmentHadPmt = true;\n self.trigger('data', event);\n }\n })[data.type]();\n };\n this.reset = function () {\n video.size = 0;\n video.data.length = 0;\n audio.size = 0;\n audio.data.length = 0;\n this.trigger('reset');\n };\n /**\n * Flush any remaining input. Video PES packets may be of variable\n * length. Normally, the start of a new video packet can trigger the\n * finalization of the previous packet. That is not possible if no\n * more video is forthcoming, however. In that case, some other\n * mechanism (like the end of the file) has to be employed. When it is\n * clear that no additional data is forthcoming, calling this method\n * will flush the buffered packets.\n */\n\n this.flushStreams_ = function () {\n // !!THIS ORDER IS IMPORTANT!!\n // video first then audio\n flushStream(video, 'video');\n flushStream(audio, 'audio');\n flushStream(timedMetadata, 'timed-metadata');\n };\n this.flush = function () {\n // if on flush we haven't had a pmt emitted\n // and we have a pmt to emit. emit the pmt\n // so that we trigger a trackinfo downstream.\n if (!segmentHadPmt && programMapTable) {\n var pmt = {\n type: 'metadata',\n tracks: []\n }; // translate audio and video streams to tracks\n\n if (programMapTable.video !== null) {\n pmt.tracks.push({\n timelineStartInfo: {\n baseMediaDecodeTime: 0\n },\n id: +programMapTable.video,\n codec: 'avc',\n type: 'video'\n });\n }\n if (programMapTable.audio !== null) {\n pmt.tracks.push({\n timelineStartInfo: {\n baseMediaDecodeTime: 0\n },\n id: +programMapTable.audio,\n codec: 'adts',\n type: 'audio'\n });\n }\n self.trigger('data', pmt);\n }\n segmentHadPmt = false;\n this.flushStreams_();\n this.trigger('done');\n };\n };\n ElementaryStream.prototype = new Stream$4();\n var m2ts$1 = {\n PAT_PID: 0x0000,\n MP2T_PACKET_LENGTH: MP2T_PACKET_LENGTH$1,\n TransportPacketStream: TransportPacketStream,\n TransportParseStream: TransportParseStream,\n ElementaryStream: ElementaryStream,\n TimestampRolloverStream: TimestampRolloverStream,\n CaptionStream: CaptionStream$1.CaptionStream,\n Cea608Stream: CaptionStream$1.Cea608Stream,\n Cea708Stream: CaptionStream$1.Cea708Stream,\n MetadataStream: metadataStream\n };\n for (var type in StreamTypes$2) {\n if (StreamTypes$2.hasOwnProperty(type)) {\n m2ts$1[type] = StreamTypes$2[type];\n }\n }\n var m2ts_1 = m2ts$1;\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n */\n\n var Stream$3 = stream;\n var ONE_SECOND_IN_TS$2 = clock$2.ONE_SECOND_IN_TS;\n var AdtsStream$1;\n var ADTS_SAMPLING_FREQUENCIES$1 = [96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350];\n /*\n * Accepts a ElementaryStream and emits data events with parsed\n * AAC Audio Frames of the individual packets. Input audio in ADTS\n * format is unpacked and re-emitted as AAC frames.\n *\n * @see http://wiki.multimedia.cx/index.php?title=ADTS\n * @see http://wiki.multimedia.cx/?title=Understanding_AAC\n */\n\n AdtsStream$1 = function (handlePartialSegments) {\n var buffer,\n frameNum = 0;\n AdtsStream$1.prototype.init.call(this);\n this.skipWarn_ = function (start, end) {\n this.trigger('log', {\n level: 'warn',\n message: `adts skiping bytes ${start} to ${end} in frame ${frameNum} outside syncword`\n });\n };\n this.push = function (packet) {\n var i = 0,\n frameLength,\n protectionSkipBytes,\n oldBuffer,\n sampleCount,\n adtsFrameDuration;\n if (!handlePartialSegments) {\n frameNum = 0;\n }\n if (packet.type !== 'audio') {\n // ignore non-audio data\n return;\n } // Prepend any data in the buffer to the input data so that we can parse\n // aac frames the cross a PES packet boundary\n\n if (buffer && buffer.length) {\n oldBuffer = buffer;\n buffer = new Uint8Array(oldBuffer.byteLength + packet.data.byteLength);\n buffer.set(oldBuffer);\n buffer.set(packet.data, oldBuffer.byteLength);\n } else {\n buffer = packet.data;\n } // unpack any ADTS frames which have been fully received\n // for details on the ADTS header, see http://wiki.multimedia.cx/index.php?title=ADTS\n\n var skip; // We use i + 7 here because we want to be able to parse the entire header.\n // If we don't have enough bytes to do that, then we definitely won't have a full frame.\n\n while (i + 7 < buffer.length) {\n // Look for the start of an ADTS header..\n if (buffer[i] !== 0xFF || (buffer[i + 1] & 0xF6) !== 0xF0) {\n if (typeof skip !== 'number') {\n skip = i;\n } // If a valid header was not found, jump one forward and attempt to\n // find a valid ADTS header starting at the next byte\n\n i++;\n continue;\n }\n if (typeof skip === 'number') {\n this.skipWarn_(skip, i);\n skip = null;\n } // The protection skip bit tells us if we have 2 bytes of CRC data at the\n // end of the ADTS header\n\n protectionSkipBytes = (~buffer[i + 1] & 0x01) * 2; // Frame length is a 13 bit integer starting 16 bits from the\n // end of the sync sequence\n // NOTE: frame length includes the size of the header\n\n frameLength = (buffer[i + 3] & 0x03) << 11 | buffer[i + 4] << 3 | (buffer[i + 5] & 0xe0) >> 5;\n sampleCount = ((buffer[i + 6] & 0x03) + 1) * 1024;\n adtsFrameDuration = sampleCount * ONE_SECOND_IN_TS$2 / ADTS_SAMPLING_FREQUENCIES$1[(buffer[i + 2] & 0x3c) >>> 2]; // If we don't have enough data to actually finish this ADTS frame,\n // then we have to wait for more data\n\n if (buffer.byteLength - i < frameLength) {\n break;\n } // Otherwise, deliver the complete AAC frame\n\n this.trigger('data', {\n pts: packet.pts + frameNum * adtsFrameDuration,\n dts: packet.dts + frameNum * adtsFrameDuration,\n sampleCount: sampleCount,\n audioobjecttype: (buffer[i + 2] >>> 6 & 0x03) + 1,\n channelcount: (buffer[i + 2] & 1) << 2 | (buffer[i + 3] & 0xc0) >>> 6,\n samplerate: ADTS_SAMPLING_FREQUENCIES$1[(buffer[i + 2] & 0x3c) >>> 2],\n samplingfrequencyindex: (buffer[i + 2] & 0x3c) >>> 2,\n // assume ISO/IEC 14496-12 AudioSampleEntry default of 16\n samplesize: 16,\n // data is the frame without it's header\n data: buffer.subarray(i + 7 + protectionSkipBytes, i + frameLength)\n });\n frameNum++;\n i += frameLength;\n }\n if (typeof skip === 'number') {\n this.skipWarn_(skip, i);\n skip = null;\n } // remove processed bytes from the buffer.\n\n buffer = buffer.subarray(i);\n };\n this.flush = function () {\n frameNum = 0;\n this.trigger('done');\n };\n this.reset = function () {\n buffer = void 0;\n this.trigger('reset');\n };\n this.endTimeline = function () {\n buffer = void 0;\n this.trigger('endedtimeline');\n };\n };\n AdtsStream$1.prototype = new Stream$3();\n var adts = AdtsStream$1;\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n */\n\n var ExpGolomb$1;\n /**\n * Parser for exponential Golomb codes, a variable-bitwidth number encoding\n * scheme used by h264.\n */\n\n ExpGolomb$1 = function (workingData) {\n var\n // the number of bytes left to examine in workingData\n workingBytesAvailable = workingData.byteLength,\n // the current word being examined\n workingWord = 0,\n // :uint\n // the number of bits left to examine in the current word\n workingBitsAvailable = 0; // :uint;\n // ():uint\n\n this.length = function () {\n return 8 * workingBytesAvailable;\n }; // ():uint\n\n this.bitsAvailable = function () {\n return 8 * workingBytesAvailable + workingBitsAvailable;\n }; // ():void\n\n this.loadWord = function () {\n var position = workingData.byteLength - workingBytesAvailable,\n workingBytes = new Uint8Array(4),\n availableBytes = Math.min(4, workingBytesAvailable);\n if (availableBytes === 0) {\n throw new Error('no bytes available');\n }\n workingBytes.set(workingData.subarray(position, position + availableBytes));\n workingWord = new DataView(workingBytes.buffer).getUint32(0); // track the amount of workingData that has been processed\n\n workingBitsAvailable = availableBytes * 8;\n workingBytesAvailable -= availableBytes;\n }; // (count:int):void\n\n this.skipBits = function (count) {\n var skipBytes; // :int\n\n if (workingBitsAvailable > count) {\n workingWord <<= count;\n workingBitsAvailable -= count;\n } else {\n count -= workingBitsAvailable;\n skipBytes = Math.floor(count / 8);\n count -= skipBytes * 8;\n workingBytesAvailable -= skipBytes;\n this.loadWord();\n workingWord <<= count;\n workingBitsAvailable -= count;\n }\n }; // (size:int):uint\n\n this.readBits = function (size) {\n var bits = Math.min(workingBitsAvailable, size),\n // :uint\n valu = workingWord >>> 32 - bits; // :uint\n // if size > 31, handle error\n\n workingBitsAvailable -= bits;\n if (workingBitsAvailable > 0) {\n workingWord <<= bits;\n } else if (workingBytesAvailable > 0) {\n this.loadWord();\n }\n bits = size - bits;\n if (bits > 0) {\n return valu << bits | this.readBits(bits);\n }\n return valu;\n }; // ():uint\n\n this.skipLeadingZeros = function () {\n var leadingZeroCount; // :uint\n\n for (leadingZeroCount = 0; leadingZeroCount < workingBitsAvailable; ++leadingZeroCount) {\n if ((workingWord & 0x80000000 >>> leadingZeroCount) !== 0) {\n // the first bit of working word is 1\n workingWord <<= leadingZeroCount;\n workingBitsAvailable -= leadingZeroCount;\n return leadingZeroCount;\n }\n } // we exhausted workingWord and still have not found a 1\n\n this.loadWord();\n return leadingZeroCount + this.skipLeadingZeros();\n }; // ():void\n\n this.skipUnsignedExpGolomb = function () {\n this.skipBits(1 + this.skipLeadingZeros());\n }; // ():void\n\n this.skipExpGolomb = function () {\n this.skipBits(1 + this.skipLeadingZeros());\n }; // ():uint\n\n this.readUnsignedExpGolomb = function () {\n var clz = this.skipLeadingZeros(); // :uint\n\n return this.readBits(clz + 1) - 1;\n }; // ():int\n\n this.readExpGolomb = function () {\n var valu = this.readUnsignedExpGolomb(); // :int\n\n if (0x01 & valu) {\n // the number is odd if the low order bit is set\n return 1 + valu >>> 1; // add 1 to make it even, and divide by 2\n }\n\n return -1 * (valu >>> 1); // divide by two then make it negative\n }; // Some convenience functions\n // :Boolean\n\n this.readBoolean = function () {\n return this.readBits(1) === 1;\n }; // ():int\n\n this.readUnsignedByte = function () {\n return this.readBits(8);\n };\n this.loadWord();\n };\n var expGolomb = ExpGolomb$1;\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n */\n\n var Stream$2 = stream;\n var ExpGolomb = expGolomb;\n var H264Stream$1, NalByteStream;\n var PROFILES_WITH_OPTIONAL_SPS_DATA;\n /**\n * Accepts a NAL unit byte stream and unpacks the embedded NAL units.\n */\n\n NalByteStream = function () {\n var syncPoint = 0,\n i,\n buffer;\n NalByteStream.prototype.init.call(this);\n /*\n * Scans a byte stream and triggers a data event with the NAL units found.\n * @param {Object} data Event received from H264Stream\n * @param {Uint8Array} data.data The h264 byte stream to be scanned\n *\n * @see H264Stream.push\n */\n\n this.push = function (data) {\n var swapBuffer;\n if (!buffer) {\n buffer = data.data;\n } else {\n swapBuffer = new Uint8Array(buffer.byteLength + data.data.byteLength);\n swapBuffer.set(buffer);\n swapBuffer.set(data.data, buffer.byteLength);\n buffer = swapBuffer;\n }\n var len = buffer.byteLength; // Rec. ITU-T H.264, Annex B\n // scan for NAL unit boundaries\n // a match looks like this:\n // 0 0 1 .. NAL .. 0 0 1\n // ^ sync point ^ i\n // or this:\n // 0 0 1 .. NAL .. 0 0 0\n // ^ sync point ^ i\n // advance the sync point to a NAL start, if necessary\n\n for (; syncPoint < len - 3; syncPoint++) {\n if (buffer[syncPoint + 2] === 1) {\n // the sync point is properly aligned\n i = syncPoint + 5;\n break;\n }\n }\n while (i < len) {\n // look at the current byte to determine if we've hit the end of\n // a NAL unit boundary\n switch (buffer[i]) {\n case 0:\n // skip past non-sync sequences\n if (buffer[i - 1] !== 0) {\n i += 2;\n break;\n } else if (buffer[i - 2] !== 0) {\n i++;\n break;\n } // deliver the NAL unit if it isn't empty\n\n if (syncPoint + 3 !== i - 2) {\n this.trigger('data', buffer.subarray(syncPoint + 3, i - 2));\n } // drop trailing zeroes\n\n do {\n i++;\n } while (buffer[i] !== 1 && i < len);\n syncPoint = i - 2;\n i += 3;\n break;\n case 1:\n // skip past non-sync sequences\n if (buffer[i - 1] !== 0 || buffer[i - 2] !== 0) {\n i += 3;\n break;\n } // deliver the NAL unit\n\n this.trigger('data', buffer.subarray(syncPoint + 3, i - 2));\n syncPoint = i - 2;\n i += 3;\n break;\n default:\n // the current byte isn't a one or zero, so it cannot be part\n // of a sync sequence\n i += 3;\n break;\n }\n } // filter out the NAL units that were delivered\n\n buffer = buffer.subarray(syncPoint);\n i -= syncPoint;\n syncPoint = 0;\n };\n this.reset = function () {\n buffer = null;\n syncPoint = 0;\n this.trigger('reset');\n };\n this.flush = function () {\n // deliver the last buffered NAL unit\n if (buffer && buffer.byteLength > 3) {\n this.trigger('data', buffer.subarray(syncPoint + 3));\n } // reset the stream state\n\n buffer = null;\n syncPoint = 0;\n this.trigger('done');\n };\n this.endTimeline = function () {\n this.flush();\n this.trigger('endedtimeline');\n };\n };\n NalByteStream.prototype = new Stream$2(); // values of profile_idc that indicate additional fields are included in the SPS\n // see Recommendation ITU-T H.264 (4/2013),\n // 7.3.2.1.1 Sequence parameter set data syntax\n\n PROFILES_WITH_OPTIONAL_SPS_DATA = {\n 100: true,\n 110: true,\n 122: true,\n 244: true,\n 44: true,\n 83: true,\n 86: true,\n 118: true,\n 128: true,\n // TODO: the three profiles below don't\n // appear to have sps data in the specificiation anymore?\n 138: true,\n 139: true,\n 134: true\n };\n /**\n * Accepts input from a ElementaryStream and produces H.264 NAL unit data\n * events.\n */\n\n H264Stream$1 = function () {\n var nalByteStream = new NalByteStream(),\n self,\n trackId,\n currentPts,\n currentDts,\n discardEmulationPreventionBytes,\n readSequenceParameterSet,\n skipScalingList;\n H264Stream$1.prototype.init.call(this);\n self = this;\n /*\n * Pushes a packet from a stream onto the NalByteStream\n *\n * @param {Object} packet - A packet received from a stream\n * @param {Uint8Array} packet.data - The raw bytes of the packet\n * @param {Number} packet.dts - Decode timestamp of the packet\n * @param {Number} packet.pts - Presentation timestamp of the packet\n * @param {Number} packet.trackId - The id of the h264 track this packet came from\n * @param {('video'|'audio')} packet.type - The type of packet\n *\n */\n\n this.push = function (packet) {\n if (packet.type !== 'video') {\n return;\n }\n trackId = packet.trackId;\n currentPts = packet.pts;\n currentDts = packet.dts;\n nalByteStream.push(packet);\n };\n /*\n * Identify NAL unit types and pass on the NALU, trackId, presentation and decode timestamps\n * for the NALUs to the next stream component.\n * Also, preprocess caption and sequence parameter NALUs.\n *\n * @param {Uint8Array} data - A NAL unit identified by `NalByteStream.push`\n * @see NalByteStream.push\n */\n\n nalByteStream.on('data', function (data) {\n var event = {\n trackId: trackId,\n pts: currentPts,\n dts: currentDts,\n data: data,\n nalUnitTypeCode: data[0] & 0x1f\n };\n switch (event.nalUnitTypeCode) {\n case 0x05:\n event.nalUnitType = 'slice_layer_without_partitioning_rbsp_idr';\n break;\n case 0x06:\n event.nalUnitType = 'sei_rbsp';\n event.escapedRBSP = discardEmulationPreventionBytes(data.subarray(1));\n break;\n case 0x07:\n event.nalUnitType = 'seq_parameter_set_rbsp';\n event.escapedRBSP = discardEmulationPreventionBytes(data.subarray(1));\n event.config = readSequenceParameterSet(event.escapedRBSP);\n break;\n case 0x08:\n event.nalUnitType = 'pic_parameter_set_rbsp';\n break;\n case 0x09:\n event.nalUnitType = 'access_unit_delimiter_rbsp';\n break;\n } // This triggers data on the H264Stream\n\n self.trigger('data', event);\n });\n nalByteStream.on('done', function () {\n self.trigger('done');\n });\n nalByteStream.on('partialdone', function () {\n self.trigger('partialdone');\n });\n nalByteStream.on('reset', function () {\n self.trigger('reset');\n });\n nalByteStream.on('endedtimeline', function () {\n self.trigger('endedtimeline');\n });\n this.flush = function () {\n nalByteStream.flush();\n };\n this.partialFlush = function () {\n nalByteStream.partialFlush();\n };\n this.reset = function () {\n nalByteStream.reset();\n };\n this.endTimeline = function () {\n nalByteStream.endTimeline();\n };\n /**\n * Advance the ExpGolomb decoder past a scaling list. The scaling\n * list is optionally transmitted as part of a sequence parameter\n * set and is not relevant to transmuxing.\n * @param count {number} the number of entries in this scaling list\n * @param expGolombDecoder {object} an ExpGolomb pointed to the\n * start of a scaling list\n * @see Recommendation ITU-T H.264, Section 7.3.2.1.1.1\n */\n\n skipScalingList = function (count, expGolombDecoder) {\n var lastScale = 8,\n nextScale = 8,\n j,\n deltaScale;\n for (j = 0; j < count; j++) {\n if (nextScale !== 0) {\n deltaScale = expGolombDecoder.readExpGolomb();\n nextScale = (lastScale + deltaScale + 256) % 256;\n }\n lastScale = nextScale === 0 ? lastScale : nextScale;\n }\n };\n /**\n * Expunge any \"Emulation Prevention\" bytes from a \"Raw Byte\n * Sequence Payload\"\n * @param data {Uint8Array} the bytes of a RBSP from a NAL\n * unit\n * @return {Uint8Array} the RBSP without any Emulation\n * Prevention Bytes\n */\n\n discardEmulationPreventionBytes = function (data) {\n var length = data.byteLength,\n emulationPreventionBytesPositions = [],\n i = 1,\n newLength,\n newData; // Find all `Emulation Prevention Bytes`\n\n while (i < length - 2) {\n if (data[i] === 0 && data[i + 1] === 0 && data[i + 2] === 0x03) {\n emulationPreventionBytesPositions.push(i + 2);\n i += 2;\n } else {\n i++;\n }\n } // If no Emulation Prevention Bytes were found just return the original\n // array\n\n if (emulationPreventionBytesPositions.length === 0) {\n return data;\n } // Create a new array to hold the NAL unit data\n\n newLength = length - emulationPreventionBytesPositions.length;\n newData = new Uint8Array(newLength);\n var sourceIndex = 0;\n for (i = 0; i < newLength; sourceIndex++, i++) {\n if (sourceIndex === emulationPreventionBytesPositions[0]) {\n // Skip this byte\n sourceIndex++; // Remove this position index\n\n emulationPreventionBytesPositions.shift();\n }\n newData[i] = data[sourceIndex];\n }\n return newData;\n };\n /**\n * Read a sequence parameter set and return some interesting video\n * properties. A sequence parameter set is the H264 metadata that\n * describes the properties of upcoming video frames.\n * @param data {Uint8Array} the bytes of a sequence parameter set\n * @return {object} an object with configuration parsed from the\n * sequence parameter set, including the dimensions of the\n * associated video frames.\n */\n\n readSequenceParameterSet = function (data) {\n var frameCropLeftOffset = 0,\n frameCropRightOffset = 0,\n frameCropTopOffset = 0,\n frameCropBottomOffset = 0,\n expGolombDecoder,\n profileIdc,\n levelIdc,\n profileCompatibility,\n chromaFormatIdc,\n picOrderCntType,\n numRefFramesInPicOrderCntCycle,\n picWidthInMbsMinus1,\n picHeightInMapUnitsMinus1,\n frameMbsOnlyFlag,\n scalingListCount,\n sarRatio = [1, 1],\n aspectRatioIdc,\n i;\n expGolombDecoder = new ExpGolomb(data);\n profileIdc = expGolombDecoder.readUnsignedByte(); // profile_idc\n\n profileCompatibility = expGolombDecoder.readUnsignedByte(); // constraint_set[0-5]_flag\n\n levelIdc = expGolombDecoder.readUnsignedByte(); // level_idc u(8)\n\n expGolombDecoder.skipUnsignedExpGolomb(); // seq_parameter_set_id\n // some profiles have more optional data we don't need\n\n if (PROFILES_WITH_OPTIONAL_SPS_DATA[profileIdc]) {\n chromaFormatIdc = expGolombDecoder.readUnsignedExpGolomb();\n if (chromaFormatIdc === 3) {\n expGolombDecoder.skipBits(1); // separate_colour_plane_flag\n }\n\n expGolombDecoder.skipUnsignedExpGolomb(); // bit_depth_luma_minus8\n\n expGolombDecoder.skipUnsignedExpGolomb(); // bit_depth_chroma_minus8\n\n expGolombDecoder.skipBits(1); // qpprime_y_zero_transform_bypass_flag\n\n if (expGolombDecoder.readBoolean()) {\n // seq_scaling_matrix_present_flag\n scalingListCount = chromaFormatIdc !== 3 ? 8 : 12;\n for (i = 0; i < scalingListCount; i++) {\n if (expGolombDecoder.readBoolean()) {\n // seq_scaling_list_present_flag[ i ]\n if (i < 6) {\n skipScalingList(16, expGolombDecoder);\n } else {\n skipScalingList(64, expGolombDecoder);\n }\n }\n }\n }\n }\n expGolombDecoder.skipUnsignedExpGolomb(); // log2_max_frame_num_minus4\n\n picOrderCntType = expGolombDecoder.readUnsignedExpGolomb();\n if (picOrderCntType === 0) {\n expGolombDecoder.readUnsignedExpGolomb(); // log2_max_pic_order_cnt_lsb_minus4\n } else if (picOrderCntType === 1) {\n expGolombDecoder.skipBits(1); // delta_pic_order_always_zero_flag\n\n expGolombDecoder.skipExpGolomb(); // offset_for_non_ref_pic\n\n expGolombDecoder.skipExpGolomb(); // offset_for_top_to_bottom_field\n\n numRefFramesInPicOrderCntCycle = expGolombDecoder.readUnsignedExpGolomb();\n for (i = 0; i < numRefFramesInPicOrderCntCycle; i++) {\n expGolombDecoder.skipExpGolomb(); // offset_for_ref_frame[ i ]\n }\n }\n\n expGolombDecoder.skipUnsignedExpGolomb(); // max_num_ref_frames\n\n expGolombDecoder.skipBits(1); // gaps_in_frame_num_value_allowed_flag\n\n picWidthInMbsMinus1 = expGolombDecoder.readUnsignedExpGolomb();\n picHeightInMapUnitsMinus1 = expGolombDecoder.readUnsignedExpGolomb();\n frameMbsOnlyFlag = expGolombDecoder.readBits(1);\n if (frameMbsOnlyFlag === 0) {\n expGolombDecoder.skipBits(1); // mb_adaptive_frame_field_flag\n }\n\n expGolombDecoder.skipBits(1); // direct_8x8_inference_flag\n\n if (expGolombDecoder.readBoolean()) {\n // frame_cropping_flag\n frameCropLeftOffset = expGolombDecoder.readUnsignedExpGolomb();\n frameCropRightOffset = expGolombDecoder.readUnsignedExpGolomb();\n frameCropTopOffset = expGolombDecoder.readUnsignedExpGolomb();\n frameCropBottomOffset = expGolombDecoder.readUnsignedExpGolomb();\n }\n if (expGolombDecoder.readBoolean()) {\n // vui_parameters_present_flag\n if (expGolombDecoder.readBoolean()) {\n // aspect_ratio_info_present_flag\n aspectRatioIdc = expGolombDecoder.readUnsignedByte();\n switch (aspectRatioIdc) {\n case 1:\n sarRatio = [1, 1];\n break;\n case 2:\n sarRatio = [12, 11];\n break;\n case 3:\n sarRatio = [10, 11];\n break;\n case 4:\n sarRatio = [16, 11];\n break;\n case 5:\n sarRatio = [40, 33];\n break;\n case 6:\n sarRatio = [24, 11];\n break;\n case 7:\n sarRatio = [20, 11];\n break;\n case 8:\n sarRatio = [32, 11];\n break;\n case 9:\n sarRatio = [80, 33];\n break;\n case 10:\n sarRatio = [18, 11];\n break;\n case 11:\n sarRatio = [15, 11];\n break;\n case 12:\n sarRatio = [64, 33];\n break;\n case 13:\n sarRatio = [160, 99];\n break;\n case 14:\n sarRatio = [4, 3];\n break;\n case 15:\n sarRatio = [3, 2];\n break;\n case 16:\n sarRatio = [2, 1];\n break;\n case 255:\n {\n sarRatio = [expGolombDecoder.readUnsignedByte() << 8 | expGolombDecoder.readUnsignedByte(), expGolombDecoder.readUnsignedByte() << 8 | expGolombDecoder.readUnsignedByte()];\n break;\n }\n }\n if (sarRatio) {\n sarRatio[0] / sarRatio[1];\n }\n }\n }\n return {\n profileIdc: profileIdc,\n levelIdc: levelIdc,\n profileCompatibility: profileCompatibility,\n width: (picWidthInMbsMinus1 + 1) * 16 - frameCropLeftOffset * 2 - frameCropRightOffset * 2,\n height: (2 - frameMbsOnlyFlag) * (picHeightInMapUnitsMinus1 + 1) * 16 - frameCropTopOffset * 2 - frameCropBottomOffset * 2,\n // sar is sample aspect ratio\n sarRatio: sarRatio\n };\n };\n };\n H264Stream$1.prototype = new Stream$2();\n var h264 = {\n H264Stream: H264Stream$1,\n NalByteStream: NalByteStream\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * Utilities to detect basic properties and metadata about Aac data.\n */\n\n var ADTS_SAMPLING_FREQUENCIES = [96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350];\n var parseId3TagSize = function (header, byteIndex) {\n var returnSize = header[byteIndex + 6] << 21 | header[byteIndex + 7] << 14 | header[byteIndex + 8] << 7 | header[byteIndex + 9],\n flags = header[byteIndex + 5],\n footerPresent = (flags & 16) >> 4; // if we get a negative returnSize clamp it to 0\n\n returnSize = returnSize >= 0 ? returnSize : 0;\n if (footerPresent) {\n return returnSize + 20;\n }\n return returnSize + 10;\n };\n var getId3Offset = function (data, offset) {\n if (data.length - offset < 10 || data[offset] !== 'I'.charCodeAt(0) || data[offset + 1] !== 'D'.charCodeAt(0) || data[offset + 2] !== '3'.charCodeAt(0)) {\n return offset;\n }\n offset += parseId3TagSize(data, offset);\n return getId3Offset(data, offset);\n }; // TODO: use vhs-utils\n\n var isLikelyAacData$1 = function (data) {\n var offset = getId3Offset(data, 0);\n return data.length >= offset + 2 && (data[offset] & 0xFF) === 0xFF && (data[offset + 1] & 0xF0) === 0xF0 &&\n // verify that the 2 layer bits are 0, aka this\n // is not mp3 data but aac data.\n (data[offset + 1] & 0x16) === 0x10;\n };\n var parseSyncSafeInteger = function (data) {\n return data[0] << 21 | data[1] << 14 | data[2] << 7 | data[3];\n }; // return a percent-encoded representation of the specified byte range\n // @see http://en.wikipedia.org/wiki/Percent-encoding\n\n var percentEncode = function (bytes, start, end) {\n var i,\n result = '';\n for (i = start; i < end; i++) {\n result += '%' + ('00' + bytes[i].toString(16)).slice(-2);\n }\n return result;\n }; // return the string representation of the specified byte range,\n // interpreted as ISO-8859-1.\n\n var parseIso88591 = function (bytes, start, end) {\n return unescape(percentEncode(bytes, start, end)); // jshint ignore:line\n };\n\n var parseAdtsSize = function (header, byteIndex) {\n var lowThree = (header[byteIndex + 5] & 0xE0) >> 5,\n middle = header[byteIndex + 4] << 3,\n highTwo = header[byteIndex + 3] & 0x3 << 11;\n return highTwo | middle | lowThree;\n };\n var parseType$4 = function (header, byteIndex) {\n if (header[byteIndex] === 'I'.charCodeAt(0) && header[byteIndex + 1] === 'D'.charCodeAt(0) && header[byteIndex + 2] === '3'.charCodeAt(0)) {\n return 'timed-metadata';\n } else if (header[byteIndex] & 0xff === 0xff && (header[byteIndex + 1] & 0xf0) === 0xf0) {\n return 'audio';\n }\n return null;\n };\n var parseSampleRate = function (packet) {\n var i = 0;\n while (i + 5 < packet.length) {\n if (packet[i] !== 0xFF || (packet[i + 1] & 0xF6) !== 0xF0) {\n // If a valid header was not found, jump one forward and attempt to\n // find a valid ADTS header starting at the next byte\n i++;\n continue;\n }\n return ADTS_SAMPLING_FREQUENCIES[(packet[i + 2] & 0x3c) >>> 2];\n }\n return null;\n };\n var parseAacTimestamp = function (packet) {\n var frameStart, frameSize, frame, frameHeader; // find the start of the first frame and the end of the tag\n\n frameStart = 10;\n if (packet[5] & 0x40) {\n // advance the frame start past the extended header\n frameStart += 4; // header size field\n\n frameStart += parseSyncSafeInteger(packet.subarray(10, 14));\n } // parse one or more ID3 frames\n // http://id3.org/id3v2.3.0#ID3v2_frame_overview\n\n do {\n // determine the number of bytes in this frame\n frameSize = parseSyncSafeInteger(packet.subarray(frameStart + 4, frameStart + 8));\n if (frameSize < 1) {\n return null;\n }\n frameHeader = String.fromCharCode(packet[frameStart], packet[frameStart + 1], packet[frameStart + 2], packet[frameStart + 3]);\n if (frameHeader === 'PRIV') {\n frame = packet.subarray(frameStart + 10, frameStart + frameSize + 10);\n for (var i = 0; i < frame.byteLength; i++) {\n if (frame[i] === 0) {\n var owner = parseIso88591(frame, 0, i);\n if (owner === 'com.apple.streaming.transportStreamTimestamp') {\n var d = frame.subarray(i + 1);\n var size = (d[3] & 0x01) << 30 | d[4] << 22 | d[5] << 14 | d[6] << 6 | d[7] >>> 2;\n size *= 4;\n size += d[7] & 0x03;\n return size;\n }\n break;\n }\n }\n }\n frameStart += 10; // advance past the frame header\n\n frameStart += frameSize; // advance past the frame body\n } while (frameStart < packet.byteLength);\n return null;\n };\n var utils = {\n isLikelyAacData: isLikelyAacData$1,\n parseId3TagSize: parseId3TagSize,\n parseAdtsSize: parseAdtsSize,\n parseType: parseType$4,\n parseSampleRate: parseSampleRate,\n parseAacTimestamp: parseAacTimestamp\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * A stream-based aac to mp4 converter. This utility can be used to\n * deliver mp4s to a SourceBuffer on platforms that support native\n * Media Source Extensions.\n */\n\n var Stream$1 = stream;\n var aacUtils = utils; // Constants\n\n var AacStream$1;\n /**\n * Splits an incoming stream of binary data into ADTS and ID3 Frames.\n */\n\n AacStream$1 = function () {\n var everything = new Uint8Array(),\n timeStamp = 0;\n AacStream$1.prototype.init.call(this);\n this.setTimestamp = function (timestamp) {\n timeStamp = timestamp;\n };\n this.push = function (bytes) {\n var frameSize = 0,\n byteIndex = 0,\n bytesLeft,\n chunk,\n packet,\n tempLength; // If there are bytes remaining from the last segment, prepend them to the\n // bytes that were pushed in\n\n if (everything.length) {\n tempLength = everything.length;\n everything = new Uint8Array(bytes.byteLength + tempLength);\n everything.set(everything.subarray(0, tempLength));\n everything.set(bytes, tempLength);\n } else {\n everything = bytes;\n }\n while (everything.length - byteIndex >= 3) {\n if (everything[byteIndex] === 'I'.charCodeAt(0) && everything[byteIndex + 1] === 'D'.charCodeAt(0) && everything[byteIndex + 2] === '3'.charCodeAt(0)) {\n // Exit early because we don't have enough to parse\n // the ID3 tag header\n if (everything.length - byteIndex < 10) {\n break;\n } // check framesize\n\n frameSize = aacUtils.parseId3TagSize(everything, byteIndex); // Exit early if we don't have enough in the buffer\n // to emit a full packet\n // Add to byteIndex to support multiple ID3 tags in sequence\n\n if (byteIndex + frameSize > everything.length) {\n break;\n }\n chunk = {\n type: 'timed-metadata',\n data: everything.subarray(byteIndex, byteIndex + frameSize)\n };\n this.trigger('data', chunk);\n byteIndex += frameSize;\n continue;\n } else if ((everything[byteIndex] & 0xff) === 0xff && (everything[byteIndex + 1] & 0xf0) === 0xf0) {\n // Exit early because we don't have enough to parse\n // the ADTS frame header\n if (everything.length - byteIndex < 7) {\n break;\n }\n frameSize = aacUtils.parseAdtsSize(everything, byteIndex); // Exit early if we don't have enough in the buffer\n // to emit a full packet\n\n if (byteIndex + frameSize > everything.length) {\n break;\n }\n packet = {\n type: 'audio',\n data: everything.subarray(byteIndex, byteIndex + frameSize),\n pts: timeStamp,\n dts: timeStamp\n };\n this.trigger('data', packet);\n byteIndex += frameSize;\n continue;\n }\n byteIndex++;\n }\n bytesLeft = everything.length - byteIndex;\n if (bytesLeft > 0) {\n everything = everything.subarray(byteIndex);\n } else {\n everything = new Uint8Array();\n }\n };\n this.reset = function () {\n everything = new Uint8Array();\n this.trigger('reset');\n };\n this.endTimeline = function () {\n everything = new Uint8Array();\n this.trigger('endedtimeline');\n };\n };\n AacStream$1.prototype = new Stream$1();\n var aac = AacStream$1;\n var AUDIO_PROPERTIES$1 = ['audioobjecttype', 'channelcount', 'samplerate', 'samplingfrequencyindex', 'samplesize'];\n var audioProperties = AUDIO_PROPERTIES$1;\n var VIDEO_PROPERTIES$1 = ['width', 'height', 'profileIdc', 'levelIdc', 'profileCompatibility', 'sarRatio'];\n var videoProperties = VIDEO_PROPERTIES$1;\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * A stream-based mp2t to mp4 converter. This utility can be used to\n * deliver mp4s to a SourceBuffer on platforms that support native\n * Media Source Extensions.\n */\n\n var Stream = stream;\n var mp4 = mp4Generator;\n var frameUtils = frameUtils$1;\n var audioFrameUtils = audioFrameUtils$1;\n var trackDecodeInfo = trackDecodeInfo$1;\n var m2ts = m2ts_1;\n var clock = clock$2;\n var AdtsStream = adts;\n var H264Stream = h264.H264Stream;\n var AacStream = aac;\n var isLikelyAacData = utils.isLikelyAacData;\n var ONE_SECOND_IN_TS$1 = clock$2.ONE_SECOND_IN_TS;\n var AUDIO_PROPERTIES = audioProperties;\n var VIDEO_PROPERTIES = videoProperties; // object types\n\n var VideoSegmentStream, AudioSegmentStream, Transmuxer, CoalesceStream;\n var retriggerForStream = function (key, event) {\n event.stream = key;\n this.trigger('log', event);\n };\n var addPipelineLogRetriggers = function (transmuxer, pipeline) {\n var keys = Object.keys(pipeline);\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i]; // skip non-stream keys and headOfPipeline\n // which is just a duplicate\n\n if (key === 'headOfPipeline' || !pipeline[key].on) {\n continue;\n }\n pipeline[key].on('log', retriggerForStream.bind(transmuxer, key));\n }\n };\n /**\n * Compare two arrays (even typed) for same-ness\n */\n\n var arrayEquals = function (a, b) {\n var i;\n if (a.length !== b.length) {\n return false;\n } // compare the value of each element in the array\n\n for (i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n };\n var generateSegmentTimingInfo = function (baseMediaDecodeTime, startDts, startPts, endDts, endPts, prependedContentDuration) {\n var ptsOffsetFromDts = startPts - startDts,\n decodeDuration = endDts - startDts,\n presentationDuration = endPts - startPts; // The PTS and DTS values are based on the actual stream times from the segment,\n // however, the player time values will reflect a start from the baseMediaDecodeTime.\n // In order to provide relevant values for the player times, base timing info on the\n // baseMediaDecodeTime and the DTS and PTS durations of the segment.\n\n return {\n start: {\n dts: baseMediaDecodeTime,\n pts: baseMediaDecodeTime + ptsOffsetFromDts\n },\n end: {\n dts: baseMediaDecodeTime + decodeDuration,\n pts: baseMediaDecodeTime + presentationDuration\n },\n prependedContentDuration: prependedContentDuration,\n baseMediaDecodeTime: baseMediaDecodeTime\n };\n };\n /**\n * Constructs a single-track, ISO BMFF media segment from AAC data\n * events. The output of this stream can be fed to a SourceBuffer\n * configured with a suitable initialization segment.\n * @param track {object} track metadata configuration\n * @param options {object} transmuxer options object\n * @param options.keepOriginalTimestamps {boolean} If true, keep the timestamps\n * in the source; false to adjust the first segment to start at 0.\n */\n\n AudioSegmentStream = function (track, options) {\n var adtsFrames = [],\n sequenceNumber,\n earliestAllowedDts = 0,\n audioAppendStartTs = 0,\n videoBaseMediaDecodeTime = Infinity;\n options = options || {};\n sequenceNumber = options.firstSequenceNumber || 0;\n AudioSegmentStream.prototype.init.call(this);\n this.push = function (data) {\n trackDecodeInfo.collectDtsInfo(track, data);\n if (track) {\n AUDIO_PROPERTIES.forEach(function (prop) {\n track[prop] = data[prop];\n });\n } // buffer audio data until end() is called\n\n adtsFrames.push(data);\n };\n this.setEarliestDts = function (earliestDts) {\n earliestAllowedDts = earliestDts;\n };\n this.setVideoBaseMediaDecodeTime = function (baseMediaDecodeTime) {\n videoBaseMediaDecodeTime = baseMediaDecodeTime;\n };\n this.setAudioAppendStart = function (timestamp) {\n audioAppendStartTs = timestamp;\n };\n this.flush = function () {\n var frames, moof, mdat, boxes, frameDuration, segmentDuration, videoClockCyclesOfSilencePrefixed; // return early if no audio data has been observed\n\n if (adtsFrames.length === 0) {\n this.trigger('done', 'AudioSegmentStream');\n return;\n }\n frames = audioFrameUtils.trimAdtsFramesByEarliestDts(adtsFrames, track, earliestAllowedDts);\n track.baseMediaDecodeTime = trackDecodeInfo.calculateTrackBaseMediaDecodeTime(track, options.keepOriginalTimestamps); // amount of audio filled but the value is in video clock rather than audio clock\n\n videoClockCyclesOfSilencePrefixed = audioFrameUtils.prefixWithSilence(track, frames, audioAppendStartTs, videoBaseMediaDecodeTime); // we have to build the index from byte locations to\n // samples (that is, adts frames) in the audio data\n\n track.samples = audioFrameUtils.generateSampleTable(frames); // concatenate the audio data to constuct the mdat\n\n mdat = mp4.mdat(audioFrameUtils.concatenateFrameData(frames));\n adtsFrames = [];\n moof = mp4.moof(sequenceNumber, [track]);\n boxes = new Uint8Array(moof.byteLength + mdat.byteLength); // bump the sequence number for next time\n\n sequenceNumber++;\n boxes.set(moof);\n boxes.set(mdat, moof.byteLength);\n trackDecodeInfo.clearDtsInfo(track);\n frameDuration = Math.ceil(ONE_SECOND_IN_TS$1 * 1024 / track.samplerate); // TODO this check was added to maintain backwards compatibility (particularly with\n // tests) on adding the timingInfo event. However, it seems unlikely that there's a\n // valid use-case where an init segment/data should be triggered without associated\n // frames. Leaving for now, but should be looked into.\n\n if (frames.length) {\n segmentDuration = frames.length * frameDuration;\n this.trigger('segmentTimingInfo', generateSegmentTimingInfo(\n // The audio track's baseMediaDecodeTime is in audio clock cycles, but the\n // frame info is in video clock cycles. Convert to match expectation of\n // listeners (that all timestamps will be based on video clock cycles).\n clock.audioTsToVideoTs(track.baseMediaDecodeTime, track.samplerate),\n // frame times are already in video clock, as is segment duration\n frames[0].dts, frames[0].pts, frames[0].dts + segmentDuration, frames[0].pts + segmentDuration, videoClockCyclesOfSilencePrefixed || 0));\n this.trigger('timingInfo', {\n start: frames[0].pts,\n end: frames[0].pts + segmentDuration\n });\n }\n this.trigger('data', {\n track: track,\n boxes: boxes\n });\n this.trigger('done', 'AudioSegmentStream');\n };\n this.reset = function () {\n trackDecodeInfo.clearDtsInfo(track);\n adtsFrames = [];\n this.trigger('reset');\n };\n };\n AudioSegmentStream.prototype = new Stream();\n /**\n * Constructs a single-track, ISO BMFF media segment from H264 data\n * events. The output of this stream can be fed to a SourceBuffer\n * configured with a suitable initialization segment.\n * @param track {object} track metadata configuration\n * @param options {object} transmuxer options object\n * @param options.alignGopsAtEnd {boolean} If true, start from the end of the\n * gopsToAlignWith list when attempting to align gop pts\n * @param options.keepOriginalTimestamps {boolean} If true, keep the timestamps\n * in the source; false to adjust the first segment to start at 0.\n */\n\n VideoSegmentStream = function (track, options) {\n var sequenceNumber,\n nalUnits = [],\n gopsToAlignWith = [],\n config,\n pps;\n options = options || {};\n sequenceNumber = options.firstSequenceNumber || 0;\n VideoSegmentStream.prototype.init.call(this);\n delete track.minPTS;\n this.gopCache_ = [];\n /**\n * Constructs a ISO BMFF segment given H264 nalUnits\n * @param {Object} nalUnit A data event representing a nalUnit\n * @param {String} nalUnit.nalUnitType\n * @param {Object} nalUnit.config Properties for a mp4 track\n * @param {Uint8Array} nalUnit.data The nalUnit bytes\n * @see lib/codecs/h264.js\n **/\n\n this.push = function (nalUnit) {\n trackDecodeInfo.collectDtsInfo(track, nalUnit); // record the track config\n\n if (nalUnit.nalUnitType === 'seq_parameter_set_rbsp' && !config) {\n config = nalUnit.config;\n track.sps = [nalUnit.data];\n VIDEO_PROPERTIES.forEach(function (prop) {\n track[prop] = config[prop];\n }, this);\n }\n if (nalUnit.nalUnitType === 'pic_parameter_set_rbsp' && !pps) {\n pps = nalUnit.data;\n track.pps = [nalUnit.data];\n } // buffer video until flush() is called\n\n nalUnits.push(nalUnit);\n };\n /**\n * Pass constructed ISO BMFF track and boxes on to the\n * next stream in the pipeline\n **/\n\n this.flush = function () {\n var frames,\n gopForFusion,\n gops,\n moof,\n mdat,\n boxes,\n prependedContentDuration = 0,\n firstGop,\n lastGop; // Throw away nalUnits at the start of the byte stream until\n // we find the first AUD\n\n while (nalUnits.length) {\n if (nalUnits[0].nalUnitType === 'access_unit_delimiter_rbsp') {\n break;\n }\n nalUnits.shift();\n } // Return early if no video data has been observed\n\n if (nalUnits.length === 0) {\n this.resetStream_();\n this.trigger('done', 'VideoSegmentStream');\n return;\n } // Organize the raw nal-units into arrays that represent\n // higher-level constructs such as frames and gops\n // (group-of-pictures)\n\n frames = frameUtils.groupNalsIntoFrames(nalUnits);\n gops = frameUtils.groupFramesIntoGops(frames); // If the first frame of this fragment is not a keyframe we have\n // a problem since MSE (on Chrome) requires a leading keyframe.\n //\n // We have two approaches to repairing this situation:\n // 1) GOP-FUSION:\n // This is where we keep track of the GOPS (group-of-pictures)\n // from previous fragments and attempt to find one that we can\n // prepend to the current fragment in order to create a valid\n // fragment.\n // 2) KEYFRAME-PULLING:\n // Here we search for the first keyframe in the fragment and\n // throw away all the frames between the start of the fragment\n // and that keyframe. We then extend the duration and pull the\n // PTS of the keyframe forward so that it covers the time range\n // of the frames that were disposed of.\n //\n // #1 is far prefereable over #2 which can cause \"stuttering\" but\n // requires more things to be just right.\n\n if (!gops[0][0].keyFrame) {\n // Search for a gop for fusion from our gopCache\n gopForFusion = this.getGopForFusion_(nalUnits[0], track);\n if (gopForFusion) {\n // in order to provide more accurate timing information about the segment, save\n // the number of seconds prepended to the original segment due to GOP fusion\n prependedContentDuration = gopForFusion.duration;\n gops.unshift(gopForFusion); // Adjust Gops' metadata to account for the inclusion of the\n // new gop at the beginning\n\n gops.byteLength += gopForFusion.byteLength;\n gops.nalCount += gopForFusion.nalCount;\n gops.pts = gopForFusion.pts;\n gops.dts = gopForFusion.dts;\n gops.duration += gopForFusion.duration;\n } else {\n // If we didn't find a candidate gop fall back to keyframe-pulling\n gops = frameUtils.extendFirstKeyFrame(gops);\n }\n } // Trim gops to align with gopsToAlignWith\n\n if (gopsToAlignWith.length) {\n var alignedGops;\n if (options.alignGopsAtEnd) {\n alignedGops = this.alignGopsAtEnd_(gops);\n } else {\n alignedGops = this.alignGopsAtStart_(gops);\n }\n if (!alignedGops) {\n // save all the nals in the last GOP into the gop cache\n this.gopCache_.unshift({\n gop: gops.pop(),\n pps: track.pps,\n sps: track.sps\n }); // Keep a maximum of 6 GOPs in the cache\n\n this.gopCache_.length = Math.min(6, this.gopCache_.length); // Clear nalUnits\n\n nalUnits = []; // return early no gops can be aligned with desired gopsToAlignWith\n\n this.resetStream_();\n this.trigger('done', 'VideoSegmentStream');\n return;\n } // Some gops were trimmed. clear dts info so minSegmentDts and pts are correct\n // when recalculated before sending off to CoalesceStream\n\n trackDecodeInfo.clearDtsInfo(track);\n gops = alignedGops;\n }\n trackDecodeInfo.collectDtsInfo(track, gops); // First, we have to build the index from byte locations to\n // samples (that is, frames) in the video data\n\n track.samples = frameUtils.generateSampleTable(gops); // Concatenate the video data and construct the mdat\n\n mdat = mp4.mdat(frameUtils.concatenateNalData(gops));\n track.baseMediaDecodeTime = trackDecodeInfo.calculateTrackBaseMediaDecodeTime(track, options.keepOriginalTimestamps);\n this.trigger('processedGopsInfo', gops.map(function (gop) {\n return {\n pts: gop.pts,\n dts: gop.dts,\n byteLength: gop.byteLength\n };\n }));\n firstGop = gops[0];\n lastGop = gops[gops.length - 1];\n this.trigger('segmentTimingInfo', generateSegmentTimingInfo(track.baseMediaDecodeTime, firstGop.dts, firstGop.pts, lastGop.dts + lastGop.duration, lastGop.pts + lastGop.duration, prependedContentDuration));\n this.trigger('timingInfo', {\n start: gops[0].pts,\n end: gops[gops.length - 1].pts + gops[gops.length - 1].duration\n }); // save all the nals in the last GOP into the gop cache\n\n this.gopCache_.unshift({\n gop: gops.pop(),\n pps: track.pps,\n sps: track.sps\n }); // Keep a maximum of 6 GOPs in the cache\n\n this.gopCache_.length = Math.min(6, this.gopCache_.length); // Clear nalUnits\n\n nalUnits = [];\n this.trigger('baseMediaDecodeTime', track.baseMediaDecodeTime);\n this.trigger('timelineStartInfo', track.timelineStartInfo);\n moof = mp4.moof(sequenceNumber, [track]); // it would be great to allocate this array up front instead of\n // throwing away hundreds of media segment fragments\n\n boxes = new Uint8Array(moof.byteLength + mdat.byteLength); // Bump the sequence number for next time\n\n sequenceNumber++;\n boxes.set(moof);\n boxes.set(mdat, moof.byteLength);\n this.trigger('data', {\n track: track,\n boxes: boxes\n });\n this.resetStream_(); // Continue with the flush process now\n\n this.trigger('done', 'VideoSegmentStream');\n };\n this.reset = function () {\n this.resetStream_();\n nalUnits = [];\n this.gopCache_.length = 0;\n gopsToAlignWith.length = 0;\n this.trigger('reset');\n };\n this.resetStream_ = function () {\n trackDecodeInfo.clearDtsInfo(track); // reset config and pps because they may differ across segments\n // for instance, when we are rendition switching\n\n config = undefined;\n pps = undefined;\n }; // Search for a candidate Gop for gop-fusion from the gop cache and\n // return it or return null if no good candidate was found\n\n this.getGopForFusion_ = function (nalUnit) {\n var halfSecond = 45000,\n // Half-a-second in a 90khz clock\n allowableOverlap = 10000,\n // About 3 frames @ 30fps\n nearestDistance = Infinity,\n dtsDistance,\n nearestGopObj,\n currentGop,\n currentGopObj,\n i; // Search for the GOP nearest to the beginning of this nal unit\n\n for (i = 0; i < this.gopCache_.length; i++) {\n currentGopObj = this.gopCache_[i];\n currentGop = currentGopObj.gop; // Reject Gops with different SPS or PPS\n\n if (!(track.pps && arrayEquals(track.pps[0], currentGopObj.pps[0])) || !(track.sps && arrayEquals(track.sps[0], currentGopObj.sps[0]))) {\n continue;\n } // Reject Gops that would require a negative baseMediaDecodeTime\n\n if (currentGop.dts < track.timelineStartInfo.dts) {\n continue;\n } // The distance between the end of the gop and the start of the nalUnit\n\n dtsDistance = nalUnit.dts - currentGop.dts - currentGop.duration; // Only consider GOPS that start before the nal unit and end within\n // a half-second of the nal unit\n\n if (dtsDistance >= -allowableOverlap && dtsDistance <= halfSecond) {\n // Always use the closest GOP we found if there is more than\n // one candidate\n if (!nearestGopObj || nearestDistance > dtsDistance) {\n nearestGopObj = currentGopObj;\n nearestDistance = dtsDistance;\n }\n }\n }\n if (nearestGopObj) {\n return nearestGopObj.gop;\n }\n return null;\n }; // trim gop list to the first gop found that has a matching pts with a gop in the list\n // of gopsToAlignWith starting from the START of the list\n\n this.alignGopsAtStart_ = function (gops) {\n var alignIndex, gopIndex, align, gop, byteLength, nalCount, duration, alignedGops;\n byteLength = gops.byteLength;\n nalCount = gops.nalCount;\n duration = gops.duration;\n alignIndex = gopIndex = 0;\n while (alignIndex < gopsToAlignWith.length && gopIndex < gops.length) {\n align = gopsToAlignWith[alignIndex];\n gop = gops[gopIndex];\n if (align.pts === gop.pts) {\n break;\n }\n if (gop.pts > align.pts) {\n // this current gop starts after the current gop we want to align on, so increment\n // align index\n alignIndex++;\n continue;\n } // current gop starts before the current gop we want to align on. so increment gop\n // index\n\n gopIndex++;\n byteLength -= gop.byteLength;\n nalCount -= gop.nalCount;\n duration -= gop.duration;\n }\n if (gopIndex === 0) {\n // no gops to trim\n return gops;\n }\n if (gopIndex === gops.length) {\n // all gops trimmed, skip appending all gops\n return null;\n }\n alignedGops = gops.slice(gopIndex);\n alignedGops.byteLength = byteLength;\n alignedGops.duration = duration;\n alignedGops.nalCount = nalCount;\n alignedGops.pts = alignedGops[0].pts;\n alignedGops.dts = alignedGops[0].dts;\n return alignedGops;\n }; // trim gop list to the first gop found that has a matching pts with a gop in the list\n // of gopsToAlignWith starting from the END of the list\n\n this.alignGopsAtEnd_ = function (gops) {\n var alignIndex, gopIndex, align, gop, alignEndIndex, matchFound;\n alignIndex = gopsToAlignWith.length - 1;\n gopIndex = gops.length - 1;\n alignEndIndex = null;\n matchFound = false;\n while (alignIndex >= 0 && gopIndex >= 0) {\n align = gopsToAlignWith[alignIndex];\n gop = gops[gopIndex];\n if (align.pts === gop.pts) {\n matchFound = true;\n break;\n }\n if (align.pts > gop.pts) {\n alignIndex--;\n continue;\n }\n if (alignIndex === gopsToAlignWith.length - 1) {\n // gop.pts is greater than the last alignment candidate. If no match is found\n // by the end of this loop, we still want to append gops that come after this\n // point\n alignEndIndex = gopIndex;\n }\n gopIndex--;\n }\n if (!matchFound && alignEndIndex === null) {\n return null;\n }\n var trimIndex;\n if (matchFound) {\n trimIndex = gopIndex;\n } else {\n trimIndex = alignEndIndex;\n }\n if (trimIndex === 0) {\n return gops;\n }\n var alignedGops = gops.slice(trimIndex);\n var metadata = alignedGops.reduce(function (total, gop) {\n total.byteLength += gop.byteLength;\n total.duration += gop.duration;\n total.nalCount += gop.nalCount;\n return total;\n }, {\n byteLength: 0,\n duration: 0,\n nalCount: 0\n });\n alignedGops.byteLength = metadata.byteLength;\n alignedGops.duration = metadata.duration;\n alignedGops.nalCount = metadata.nalCount;\n alignedGops.pts = alignedGops[0].pts;\n alignedGops.dts = alignedGops[0].dts;\n return alignedGops;\n };\n this.alignGopsWith = function (newGopsToAlignWith) {\n gopsToAlignWith = newGopsToAlignWith;\n };\n };\n VideoSegmentStream.prototype = new Stream();\n /**\n * A Stream that can combine multiple streams (ie. audio & video)\n * into a single output segment for MSE. Also supports audio-only\n * and video-only streams.\n * @param options {object} transmuxer options object\n * @param options.keepOriginalTimestamps {boolean} If true, keep the timestamps\n * in the source; false to adjust the first segment to start at media timeline start.\n */\n\n CoalesceStream = function (options, metadataStream) {\n // Number of Tracks per output segment\n // If greater than 1, we combine multiple\n // tracks into a single segment\n this.numberOfTracks = 0;\n this.metadataStream = metadataStream;\n options = options || {};\n if (typeof options.remux !== 'undefined') {\n this.remuxTracks = !!options.remux;\n } else {\n this.remuxTracks = true;\n }\n if (typeof options.keepOriginalTimestamps === 'boolean') {\n this.keepOriginalTimestamps = options.keepOriginalTimestamps;\n } else {\n this.keepOriginalTimestamps = false;\n }\n this.pendingTracks = [];\n this.videoTrack = null;\n this.pendingBoxes = [];\n this.pendingCaptions = [];\n this.pendingMetadata = [];\n this.pendingBytes = 0;\n this.emittedTracks = 0;\n CoalesceStream.prototype.init.call(this); // Take output from multiple\n\n this.push = function (output) {\n // buffer incoming captions until the associated video segment\n // finishes\n if (output.content || output.text) {\n return this.pendingCaptions.push(output);\n } // buffer incoming id3 tags until the final flush\n\n if (output.frames) {\n return this.pendingMetadata.push(output);\n } // Add this track to the list of pending tracks and store\n // important information required for the construction of\n // the final segment\n\n this.pendingTracks.push(output.track);\n this.pendingBytes += output.boxes.byteLength; // TODO: is there an issue for this against chrome?\n // We unshift audio and push video because\n // as of Chrome 75 when switching from\n // one init segment to another if the video\n // mdat does not appear after the audio mdat\n // only audio will play for the duration of our transmux.\n\n if (output.track.type === 'video') {\n this.videoTrack = output.track;\n this.pendingBoxes.push(output.boxes);\n }\n if (output.track.type === 'audio') {\n this.audioTrack = output.track;\n this.pendingBoxes.unshift(output.boxes);\n }\n };\n };\n CoalesceStream.prototype = new Stream();\n CoalesceStream.prototype.flush = function (flushSource) {\n var offset = 0,\n event = {\n captions: [],\n captionStreams: {},\n metadata: [],\n info: {}\n },\n caption,\n id3,\n initSegment,\n timelineStartPts = 0,\n i;\n if (this.pendingTracks.length < this.numberOfTracks) {\n if (flushSource !== 'VideoSegmentStream' && flushSource !== 'AudioSegmentStream') {\n // Return because we haven't received a flush from a data-generating\n // portion of the segment (meaning that we have only recieved meta-data\n // or captions.)\n return;\n } else if (this.remuxTracks) {\n // Return until we have enough tracks from the pipeline to remux (if we\n // are remuxing audio and video into a single MP4)\n return;\n } else if (this.pendingTracks.length === 0) {\n // In the case where we receive a flush without any data having been\n // received we consider it an emitted track for the purposes of coalescing\n // `done` events.\n // We do this for the case where there is an audio and video track in the\n // segment but no audio data. (seen in several playlists with alternate\n // audio tracks and no audio present in the main TS segments.)\n this.emittedTracks++;\n if (this.emittedTracks >= this.numberOfTracks) {\n this.trigger('done');\n this.emittedTracks = 0;\n }\n return;\n }\n }\n if (this.videoTrack) {\n timelineStartPts = this.videoTrack.timelineStartInfo.pts;\n VIDEO_PROPERTIES.forEach(function (prop) {\n event.info[prop] = this.videoTrack[prop];\n }, this);\n } else if (this.audioTrack) {\n timelineStartPts = this.audioTrack.timelineStartInfo.pts;\n AUDIO_PROPERTIES.forEach(function (prop) {\n event.info[prop] = this.audioTrack[prop];\n }, this);\n }\n if (this.videoTrack || this.audioTrack) {\n if (this.pendingTracks.length === 1) {\n event.type = this.pendingTracks[0].type;\n } else {\n event.type = 'combined';\n }\n this.emittedTracks += this.pendingTracks.length;\n initSegment = mp4.initSegment(this.pendingTracks); // Create a new typed array to hold the init segment\n\n event.initSegment = new Uint8Array(initSegment.byteLength); // Create an init segment containing a moov\n // and track definitions\n\n event.initSegment.set(initSegment); // Create a new typed array to hold the moof+mdats\n\n event.data = new Uint8Array(this.pendingBytes); // Append each moof+mdat (one per track) together\n\n for (i = 0; i < this.pendingBoxes.length; i++) {\n event.data.set(this.pendingBoxes[i], offset);\n offset += this.pendingBoxes[i].byteLength;\n } // Translate caption PTS times into second offsets to match the\n // video timeline for the segment, and add track info\n\n for (i = 0; i < this.pendingCaptions.length; i++) {\n caption = this.pendingCaptions[i];\n caption.startTime = clock.metadataTsToSeconds(caption.startPts, timelineStartPts, this.keepOriginalTimestamps);\n caption.endTime = clock.metadataTsToSeconds(caption.endPts, timelineStartPts, this.keepOriginalTimestamps);\n event.captionStreams[caption.stream] = true;\n event.captions.push(caption);\n } // Translate ID3 frame PTS times into second offsets to match the\n // video timeline for the segment\n\n for (i = 0; i < this.pendingMetadata.length; i++) {\n id3 = this.pendingMetadata[i];\n id3.cueTime = clock.metadataTsToSeconds(id3.pts, timelineStartPts, this.keepOriginalTimestamps);\n event.metadata.push(id3);\n } // We add this to every single emitted segment even though we only need\n // it for the first\n\n event.metadata.dispatchType = this.metadataStream.dispatchType; // Reset stream state\n\n this.pendingTracks.length = 0;\n this.videoTrack = null;\n this.pendingBoxes.length = 0;\n this.pendingCaptions.length = 0;\n this.pendingBytes = 0;\n this.pendingMetadata.length = 0; // Emit the built segment\n // We include captions and ID3 tags for backwards compatibility,\n // ideally we should send only video and audio in the data event\n\n this.trigger('data', event); // Emit each caption to the outside world\n // Ideally, this would happen immediately on parsing captions,\n // but we need to ensure that video data is sent back first\n // so that caption timing can be adjusted to match video timing\n\n for (i = 0; i < event.captions.length; i++) {\n caption = event.captions[i];\n this.trigger('caption', caption);\n } // Emit each id3 tag to the outside world\n // Ideally, this would happen immediately on parsing the tag,\n // but we need to ensure that video data is sent back first\n // so that ID3 frame timing can be adjusted to match video timing\n\n for (i = 0; i < event.metadata.length; i++) {\n id3 = event.metadata[i];\n this.trigger('id3Frame', id3);\n }\n } // Only emit `done` if all tracks have been flushed and emitted\n\n if (this.emittedTracks >= this.numberOfTracks) {\n this.trigger('done');\n this.emittedTracks = 0;\n }\n };\n CoalesceStream.prototype.setRemux = function (val) {\n this.remuxTracks = val;\n };\n /**\n * A Stream that expects MP2T binary data as input and produces\n * corresponding media segments, suitable for use with Media Source\n * Extension (MSE) implementations that support the ISO BMFF byte\n * stream format, like Chrome.\n */\n\n Transmuxer = function (options) {\n var self = this,\n hasFlushed = true,\n videoTrack,\n audioTrack;\n Transmuxer.prototype.init.call(this);\n options = options || {};\n this.baseMediaDecodeTime = options.baseMediaDecodeTime || 0;\n this.transmuxPipeline_ = {};\n this.setupAacPipeline = function () {\n var pipeline = {};\n this.transmuxPipeline_ = pipeline;\n pipeline.type = 'aac';\n pipeline.metadataStream = new m2ts.MetadataStream(); // set up the parsing pipeline\n\n pipeline.aacStream = new AacStream();\n pipeline.audioTimestampRolloverStream = new m2ts.TimestampRolloverStream('audio');\n pipeline.timedMetadataTimestampRolloverStream = new m2ts.TimestampRolloverStream('timed-metadata');\n pipeline.adtsStream = new AdtsStream();\n pipeline.coalesceStream = new CoalesceStream(options, pipeline.metadataStream);\n pipeline.headOfPipeline = pipeline.aacStream;\n pipeline.aacStream.pipe(pipeline.audioTimestampRolloverStream).pipe(pipeline.adtsStream);\n pipeline.aacStream.pipe(pipeline.timedMetadataTimestampRolloverStream).pipe(pipeline.metadataStream).pipe(pipeline.coalesceStream);\n pipeline.metadataStream.on('timestamp', function (frame) {\n pipeline.aacStream.setTimestamp(frame.timeStamp);\n });\n pipeline.aacStream.on('data', function (data) {\n if (data.type !== 'timed-metadata' && data.type !== 'audio' || pipeline.audioSegmentStream) {\n return;\n }\n audioTrack = audioTrack || {\n timelineStartInfo: {\n baseMediaDecodeTime: self.baseMediaDecodeTime\n },\n codec: 'adts',\n type: 'audio'\n }; // hook up the audio segment stream to the first track with aac data\n\n pipeline.coalesceStream.numberOfTracks++;\n pipeline.audioSegmentStream = new AudioSegmentStream(audioTrack, options);\n pipeline.audioSegmentStream.on('log', self.getLogTrigger_('audioSegmentStream'));\n pipeline.audioSegmentStream.on('timingInfo', self.trigger.bind(self, 'audioTimingInfo')); // Set up the final part of the audio pipeline\n\n pipeline.adtsStream.pipe(pipeline.audioSegmentStream).pipe(pipeline.coalesceStream); // emit pmt info\n\n self.trigger('trackinfo', {\n hasAudio: !!audioTrack,\n hasVideo: !!videoTrack\n });\n }); // Re-emit any data coming from the coalesce stream to the outside world\n\n pipeline.coalesceStream.on('data', this.trigger.bind(this, 'data')); // Let the consumer know we have finished flushing the entire pipeline\n\n pipeline.coalesceStream.on('done', this.trigger.bind(this, 'done'));\n addPipelineLogRetriggers(this, pipeline);\n };\n this.setupTsPipeline = function () {\n var pipeline = {};\n this.transmuxPipeline_ = pipeline;\n pipeline.type = 'ts';\n pipeline.metadataStream = new m2ts.MetadataStream(); // set up the parsing pipeline\n\n pipeline.packetStream = new m2ts.TransportPacketStream();\n pipeline.parseStream = new m2ts.TransportParseStream();\n pipeline.elementaryStream = new m2ts.ElementaryStream();\n pipeline.timestampRolloverStream = new m2ts.TimestampRolloverStream();\n pipeline.adtsStream = new AdtsStream();\n pipeline.h264Stream = new H264Stream();\n pipeline.captionStream = new m2ts.CaptionStream(options);\n pipeline.coalesceStream = new CoalesceStream(options, pipeline.metadataStream);\n pipeline.headOfPipeline = pipeline.packetStream; // disassemble MPEG2-TS packets into elementary streams\n\n pipeline.packetStream.pipe(pipeline.parseStream).pipe(pipeline.elementaryStream).pipe(pipeline.timestampRolloverStream); // !!THIS ORDER IS IMPORTANT!!\n // demux the streams\n\n pipeline.timestampRolloverStream.pipe(pipeline.h264Stream);\n pipeline.timestampRolloverStream.pipe(pipeline.adtsStream);\n pipeline.timestampRolloverStream.pipe(pipeline.metadataStream).pipe(pipeline.coalesceStream); // Hook up CEA-608/708 caption stream\n\n pipeline.h264Stream.pipe(pipeline.captionStream).pipe(pipeline.coalesceStream);\n pipeline.elementaryStream.on('data', function (data) {\n var i;\n if (data.type === 'metadata') {\n i = data.tracks.length; // scan the tracks listed in the metadata\n\n while (i--) {\n if (!videoTrack && data.tracks[i].type === 'video') {\n videoTrack = data.tracks[i];\n videoTrack.timelineStartInfo.baseMediaDecodeTime = self.baseMediaDecodeTime;\n } else if (!audioTrack && data.tracks[i].type === 'audio') {\n audioTrack = data.tracks[i];\n audioTrack.timelineStartInfo.baseMediaDecodeTime = self.baseMediaDecodeTime;\n }\n } // hook up the video segment stream to the first track with h264 data\n\n if (videoTrack && !pipeline.videoSegmentStream) {\n pipeline.coalesceStream.numberOfTracks++;\n pipeline.videoSegmentStream = new VideoSegmentStream(videoTrack, options);\n pipeline.videoSegmentStream.on('log', self.getLogTrigger_('videoSegmentStream'));\n pipeline.videoSegmentStream.on('timelineStartInfo', function (timelineStartInfo) {\n // When video emits timelineStartInfo data after a flush, we forward that\n // info to the AudioSegmentStream, if it exists, because video timeline\n // data takes precedence. Do not do this if keepOriginalTimestamps is set,\n // because this is a particularly subtle form of timestamp alteration.\n if (audioTrack && !options.keepOriginalTimestamps) {\n audioTrack.timelineStartInfo = timelineStartInfo; // On the first segment we trim AAC frames that exist before the\n // very earliest DTS we have seen in video because Chrome will\n // interpret any video track with a baseMediaDecodeTime that is\n // non-zero as a gap.\n\n pipeline.audioSegmentStream.setEarliestDts(timelineStartInfo.dts - self.baseMediaDecodeTime);\n }\n });\n pipeline.videoSegmentStream.on('processedGopsInfo', self.trigger.bind(self, 'gopInfo'));\n pipeline.videoSegmentStream.on('segmentTimingInfo', self.trigger.bind(self, 'videoSegmentTimingInfo'));\n pipeline.videoSegmentStream.on('baseMediaDecodeTime', function (baseMediaDecodeTime) {\n if (audioTrack) {\n pipeline.audioSegmentStream.setVideoBaseMediaDecodeTime(baseMediaDecodeTime);\n }\n });\n pipeline.videoSegmentStream.on('timingInfo', self.trigger.bind(self, 'videoTimingInfo')); // Set up the final part of the video pipeline\n\n pipeline.h264Stream.pipe(pipeline.videoSegmentStream).pipe(pipeline.coalesceStream);\n }\n if (audioTrack && !pipeline.audioSegmentStream) {\n // hook up the audio segment stream to the first track with aac data\n pipeline.coalesceStream.numberOfTracks++;\n pipeline.audioSegmentStream = new AudioSegmentStream(audioTrack, options);\n pipeline.audioSegmentStream.on('log', self.getLogTrigger_('audioSegmentStream'));\n pipeline.audioSegmentStream.on('timingInfo', self.trigger.bind(self, 'audioTimingInfo'));\n pipeline.audioSegmentStream.on('segmentTimingInfo', self.trigger.bind(self, 'audioSegmentTimingInfo')); // Set up the final part of the audio pipeline\n\n pipeline.adtsStream.pipe(pipeline.audioSegmentStream).pipe(pipeline.coalesceStream);\n } // emit pmt info\n\n self.trigger('trackinfo', {\n hasAudio: !!audioTrack,\n hasVideo: !!videoTrack\n });\n }\n }); // Re-emit any data coming from the coalesce stream to the outside world\n\n pipeline.coalesceStream.on('data', this.trigger.bind(this, 'data'));\n pipeline.coalesceStream.on('id3Frame', function (id3Frame) {\n id3Frame.dispatchType = pipeline.metadataStream.dispatchType;\n self.trigger('id3Frame', id3Frame);\n });\n pipeline.coalesceStream.on('caption', this.trigger.bind(this, 'caption')); // Let the consumer know we have finished flushing the entire pipeline\n\n pipeline.coalesceStream.on('done', this.trigger.bind(this, 'done'));\n addPipelineLogRetriggers(this, pipeline);\n }; // hook up the segment streams once track metadata is delivered\n\n this.setBaseMediaDecodeTime = function (baseMediaDecodeTime) {\n var pipeline = this.transmuxPipeline_;\n if (!options.keepOriginalTimestamps) {\n this.baseMediaDecodeTime = baseMediaDecodeTime;\n }\n if (audioTrack) {\n audioTrack.timelineStartInfo.dts = undefined;\n audioTrack.timelineStartInfo.pts = undefined;\n trackDecodeInfo.clearDtsInfo(audioTrack);\n if (pipeline.audioTimestampRolloverStream) {\n pipeline.audioTimestampRolloverStream.discontinuity();\n }\n }\n if (videoTrack) {\n if (pipeline.videoSegmentStream) {\n pipeline.videoSegmentStream.gopCache_ = [];\n }\n videoTrack.timelineStartInfo.dts = undefined;\n videoTrack.timelineStartInfo.pts = undefined;\n trackDecodeInfo.clearDtsInfo(videoTrack);\n pipeline.captionStream.reset();\n }\n if (pipeline.timestampRolloverStream) {\n pipeline.timestampRolloverStream.discontinuity();\n }\n };\n this.setAudioAppendStart = function (timestamp) {\n if (audioTrack) {\n this.transmuxPipeline_.audioSegmentStream.setAudioAppendStart(timestamp);\n }\n };\n this.setRemux = function (val) {\n var pipeline = this.transmuxPipeline_;\n options.remux = val;\n if (pipeline && pipeline.coalesceStream) {\n pipeline.coalesceStream.setRemux(val);\n }\n };\n this.alignGopsWith = function (gopsToAlignWith) {\n if (videoTrack && this.transmuxPipeline_.videoSegmentStream) {\n this.transmuxPipeline_.videoSegmentStream.alignGopsWith(gopsToAlignWith);\n }\n };\n this.getLogTrigger_ = function (key) {\n var self = this;\n return function (event) {\n event.stream = key;\n self.trigger('log', event);\n };\n }; // feed incoming data to the front of the parsing pipeline\n\n this.push = function (data) {\n if (hasFlushed) {\n var isAac = isLikelyAacData(data);\n if (isAac && this.transmuxPipeline_.type !== 'aac') {\n this.setupAacPipeline();\n } else if (!isAac && this.transmuxPipeline_.type !== 'ts') {\n this.setupTsPipeline();\n }\n hasFlushed = false;\n }\n this.transmuxPipeline_.headOfPipeline.push(data);\n }; // flush any buffered data\n\n this.flush = function () {\n hasFlushed = true; // Start at the top of the pipeline and flush all pending work\n\n this.transmuxPipeline_.headOfPipeline.flush();\n };\n this.endTimeline = function () {\n this.transmuxPipeline_.headOfPipeline.endTimeline();\n };\n this.reset = function () {\n if (this.transmuxPipeline_.headOfPipeline) {\n this.transmuxPipeline_.headOfPipeline.reset();\n }\n }; // Caption data has to be reset when seeking outside buffered range\n\n this.resetCaptions = function () {\n if (this.transmuxPipeline_.captionStream) {\n this.transmuxPipeline_.captionStream.reset();\n }\n };\n };\n Transmuxer.prototype = new Stream();\n var transmuxer = {\n Transmuxer: Transmuxer,\n VideoSegmentStream: VideoSegmentStream,\n AudioSegmentStream: AudioSegmentStream,\n AUDIO_PROPERTIES: AUDIO_PROPERTIES,\n VIDEO_PROPERTIES: VIDEO_PROPERTIES,\n // exported for testing\n generateSegmentTimingInfo: generateSegmentTimingInfo\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n */\n\n var toUnsigned$3 = function (value) {\n return value >>> 0;\n };\n var toHexString$1 = function (value) {\n return ('00' + value.toString(16)).slice(-2);\n };\n var bin = {\n toUnsigned: toUnsigned$3,\n toHexString: toHexString$1\n };\n var parseType$3 = function (buffer) {\n var result = '';\n result += String.fromCharCode(buffer[0]);\n result += String.fromCharCode(buffer[1]);\n result += String.fromCharCode(buffer[2]);\n result += String.fromCharCode(buffer[3]);\n return result;\n };\n var parseType_1 = parseType$3;\n var toUnsigned$2 = bin.toUnsigned;\n var parseType$2 = parseType_1;\n var findBox$2 = function (data, path) {\n var results = [],\n i,\n size,\n type,\n end,\n subresults;\n if (!path.length) {\n // short-circuit the search for empty paths\n return null;\n }\n for (i = 0; i < data.byteLength;) {\n size = toUnsigned$2(data[i] << 24 | data[i + 1] << 16 | data[i + 2] << 8 | data[i + 3]);\n type = parseType$2(data.subarray(i + 4, i + 8));\n end = size > 1 ? i + size : data.byteLength;\n if (type === path[0]) {\n if (path.length === 1) {\n // this is the end of the path and we've found the box we were\n // looking for\n results.push(data.subarray(i + 8, end));\n } else {\n // recursively search for the next box along the path\n subresults = findBox$2(data.subarray(i + 8, end), path.slice(1));\n if (subresults.length) {\n results = results.concat(subresults);\n }\n }\n }\n i = end;\n } // we've finished searching all of data\n\n return results;\n };\n var findBox_1 = findBox$2;\n var toUnsigned$1 = bin.toUnsigned;\n var getUint64$2 = numbers.getUint64;\n var tfdt = function (data) {\n var result = {\n version: data[0],\n flags: new Uint8Array(data.subarray(1, 4))\n };\n if (result.version === 1) {\n result.baseMediaDecodeTime = getUint64$2(data.subarray(4));\n } else {\n result.baseMediaDecodeTime = toUnsigned$1(data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]);\n }\n return result;\n };\n var parseTfdt$2 = tfdt;\n var parseSampleFlags$1 = function (flags) {\n return {\n isLeading: (flags[0] & 0x0c) >>> 2,\n dependsOn: flags[0] & 0x03,\n isDependedOn: (flags[1] & 0xc0) >>> 6,\n hasRedundancy: (flags[1] & 0x30) >>> 4,\n paddingValue: (flags[1] & 0x0e) >>> 1,\n isNonSyncSample: flags[1] & 0x01,\n degradationPriority: flags[2] << 8 | flags[3]\n };\n };\n var parseSampleFlags_1 = parseSampleFlags$1;\n var parseSampleFlags = parseSampleFlags_1;\n var trun = function (data) {\n var result = {\n version: data[0],\n flags: new Uint8Array(data.subarray(1, 4)),\n samples: []\n },\n view = new DataView(data.buffer, data.byteOffset, data.byteLength),\n // Flag interpretation\n dataOffsetPresent = result.flags[2] & 0x01,\n // compare with 2nd byte of 0x1\n firstSampleFlagsPresent = result.flags[2] & 0x04,\n // compare with 2nd byte of 0x4\n sampleDurationPresent = result.flags[1] & 0x01,\n // compare with 2nd byte of 0x100\n sampleSizePresent = result.flags[1] & 0x02,\n // compare with 2nd byte of 0x200\n sampleFlagsPresent = result.flags[1] & 0x04,\n // compare with 2nd byte of 0x400\n sampleCompositionTimeOffsetPresent = result.flags[1] & 0x08,\n // compare with 2nd byte of 0x800\n sampleCount = view.getUint32(4),\n offset = 8,\n sample;\n if (dataOffsetPresent) {\n // 32 bit signed integer\n result.dataOffset = view.getInt32(offset);\n offset += 4;\n } // Overrides the flags for the first sample only. The order of\n // optional values will be: duration, size, compositionTimeOffset\n\n if (firstSampleFlagsPresent && sampleCount) {\n sample = {\n flags: parseSampleFlags(data.subarray(offset, offset + 4))\n };\n offset += 4;\n if (sampleDurationPresent) {\n sample.duration = view.getUint32(offset);\n offset += 4;\n }\n if (sampleSizePresent) {\n sample.size = view.getUint32(offset);\n offset += 4;\n }\n if (sampleCompositionTimeOffsetPresent) {\n if (result.version === 1) {\n sample.compositionTimeOffset = view.getInt32(offset);\n } else {\n sample.compositionTimeOffset = view.getUint32(offset);\n }\n offset += 4;\n }\n result.samples.push(sample);\n sampleCount--;\n }\n while (sampleCount--) {\n sample = {};\n if (sampleDurationPresent) {\n sample.duration = view.getUint32(offset);\n offset += 4;\n }\n if (sampleSizePresent) {\n sample.size = view.getUint32(offset);\n offset += 4;\n }\n if (sampleFlagsPresent) {\n sample.flags = parseSampleFlags(data.subarray(offset, offset + 4));\n offset += 4;\n }\n if (sampleCompositionTimeOffsetPresent) {\n if (result.version === 1) {\n sample.compositionTimeOffset = view.getInt32(offset);\n } else {\n sample.compositionTimeOffset = view.getUint32(offset);\n }\n offset += 4;\n }\n result.samples.push(sample);\n }\n return result;\n };\n var parseTrun$2 = trun;\n var tfhd = function (data) {\n var view = new DataView(data.buffer, data.byteOffset, data.byteLength),\n result = {\n version: data[0],\n flags: new Uint8Array(data.subarray(1, 4)),\n trackId: view.getUint32(4)\n },\n baseDataOffsetPresent = result.flags[2] & 0x01,\n sampleDescriptionIndexPresent = result.flags[2] & 0x02,\n defaultSampleDurationPresent = result.flags[2] & 0x08,\n defaultSampleSizePresent = result.flags[2] & 0x10,\n defaultSampleFlagsPresent = result.flags[2] & 0x20,\n durationIsEmpty = result.flags[0] & 0x010000,\n defaultBaseIsMoof = result.flags[0] & 0x020000,\n i;\n i = 8;\n if (baseDataOffsetPresent) {\n i += 4; // truncate top 4 bytes\n // FIXME: should we read the full 64 bits?\n\n result.baseDataOffset = view.getUint32(12);\n i += 4;\n }\n if (sampleDescriptionIndexPresent) {\n result.sampleDescriptionIndex = view.getUint32(i);\n i += 4;\n }\n if (defaultSampleDurationPresent) {\n result.defaultSampleDuration = view.getUint32(i);\n i += 4;\n }\n if (defaultSampleSizePresent) {\n result.defaultSampleSize = view.getUint32(i);\n i += 4;\n }\n if (defaultSampleFlagsPresent) {\n result.defaultSampleFlags = view.getUint32(i);\n }\n if (durationIsEmpty) {\n result.durationIsEmpty = true;\n }\n if (!baseDataOffsetPresent && defaultBaseIsMoof) {\n result.baseDataOffsetIsMoof = true;\n }\n return result;\n };\n var parseTfhd$2 = tfhd;\n var win;\n if (typeof window !== \"undefined\") {\n win = window;\n } else if (typeof commonjsGlobal !== \"undefined\") {\n win = commonjsGlobal;\n } else if (typeof self !== \"undefined\") {\n win = self;\n } else {\n win = {};\n }\n var window_1 = win;\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * Reads in-band CEA-708 captions out of FMP4 segments.\n * @see https://en.wikipedia.org/wiki/CEA-708\n */\n\n var discardEmulationPreventionBytes = captionPacketParser.discardEmulationPreventionBytes;\n var CaptionStream = captionStream.CaptionStream;\n var findBox$1 = findBox_1;\n var parseTfdt$1 = parseTfdt$2;\n var parseTrun$1 = parseTrun$2;\n var parseTfhd$1 = parseTfhd$2;\n var window$2 = window_1;\n /**\n * Maps an offset in the mdat to a sample based on the the size of the samples.\n * Assumes that `parseSamples` has been called first.\n *\n * @param {Number} offset - The offset into the mdat\n * @param {Object[]} samples - An array of samples, parsed using `parseSamples`\n * @return {?Object} The matching sample, or null if no match was found.\n *\n * @see ISO-BMFF-12/2015, Section 8.8.8\n **/\n\n var mapToSample = function (offset, samples) {\n var approximateOffset = offset;\n for (var i = 0; i < samples.length; i++) {\n var sample = samples[i];\n if (approximateOffset < sample.size) {\n return sample;\n }\n approximateOffset -= sample.size;\n }\n return null;\n };\n /**\n * Finds SEI nal units contained in a Media Data Box.\n * Assumes that `parseSamples` has been called first.\n *\n * @param {Uint8Array} avcStream - The bytes of the mdat\n * @param {Object[]} samples - The samples parsed out by `parseSamples`\n * @param {Number} trackId - The trackId of this video track\n * @return {Object[]} seiNals - the parsed SEI NALUs found.\n * The contents of the seiNal should match what is expected by\n * CaptionStream.push (nalUnitType, size, data, escapedRBSP, pts, dts)\n *\n * @see ISO-BMFF-12/2015, Section 8.1.1\n * @see Rec. ITU-T H.264, 7.3.2.3.1\n **/\n\n var findSeiNals = function (avcStream, samples, trackId) {\n var avcView = new DataView(avcStream.buffer, avcStream.byteOffset, avcStream.byteLength),\n result = {\n logs: [],\n seiNals: []\n },\n seiNal,\n i,\n length,\n lastMatchedSample;\n for (i = 0; i + 4 < avcStream.length; i += length) {\n length = avcView.getUint32(i);\n i += 4; // Bail if this doesn't appear to be an H264 stream\n\n if (length <= 0) {\n continue;\n }\n switch (avcStream[i] & 0x1F) {\n case 0x06:\n var data = avcStream.subarray(i + 1, i + 1 + length);\n var matchingSample = mapToSample(i, samples);\n seiNal = {\n nalUnitType: 'sei_rbsp',\n size: length,\n data: data,\n escapedRBSP: discardEmulationPreventionBytes(data),\n trackId: trackId\n };\n if (matchingSample) {\n seiNal.pts = matchingSample.pts;\n seiNal.dts = matchingSample.dts;\n lastMatchedSample = matchingSample;\n } else if (lastMatchedSample) {\n // If a matching sample cannot be found, use the last\n // sample's values as they should be as close as possible\n seiNal.pts = lastMatchedSample.pts;\n seiNal.dts = lastMatchedSample.dts;\n } else {\n result.logs.push({\n level: 'warn',\n message: 'We\\'ve encountered a nal unit without data at ' + i + ' for trackId ' + trackId + '. See mux.js#223.'\n });\n break;\n }\n result.seiNals.push(seiNal);\n break;\n }\n }\n return result;\n };\n /**\n * Parses sample information out of Track Run Boxes and calculates\n * the absolute presentation and decode timestamps of each sample.\n *\n * @param {Array} truns - The Trun Run boxes to be parsed\n * @param {Number|BigInt} baseMediaDecodeTime - base media decode time from tfdt\n @see ISO-BMFF-12/2015, Section 8.8.12\n * @param {Object} tfhd - The parsed Track Fragment Header\n * @see inspect.parseTfhd\n * @return {Object[]} the parsed samples\n *\n * @see ISO-BMFF-12/2015, Section 8.8.8\n **/\n\n var parseSamples = function (truns, baseMediaDecodeTime, tfhd) {\n var currentDts = baseMediaDecodeTime;\n var defaultSampleDuration = tfhd.defaultSampleDuration || 0;\n var defaultSampleSize = tfhd.defaultSampleSize || 0;\n var trackId = tfhd.trackId;\n var allSamples = [];\n truns.forEach(function (trun) {\n // Note: We currently do not parse the sample table as well\n // as the trun. It's possible some sources will require this.\n // moov > trak > mdia > minf > stbl\n var trackRun = parseTrun$1(trun);\n var samples = trackRun.samples;\n samples.forEach(function (sample) {\n if (sample.duration === undefined) {\n sample.duration = defaultSampleDuration;\n }\n if (sample.size === undefined) {\n sample.size = defaultSampleSize;\n }\n sample.trackId = trackId;\n sample.dts = currentDts;\n if (sample.compositionTimeOffset === undefined) {\n sample.compositionTimeOffset = 0;\n }\n if (typeof currentDts === 'bigint') {\n sample.pts = currentDts + window$2.BigInt(sample.compositionTimeOffset);\n currentDts += window$2.BigInt(sample.duration);\n } else {\n sample.pts = currentDts + sample.compositionTimeOffset;\n currentDts += sample.duration;\n }\n });\n allSamples = allSamples.concat(samples);\n });\n return allSamples;\n };\n /**\n * Parses out caption nals from an FMP4 segment's video tracks.\n *\n * @param {Uint8Array} segment - The bytes of a single segment\n * @param {Number} videoTrackId - The trackId of a video track in the segment\n * @return {Object.} A mapping of video trackId to\n * a list of seiNals found in that track\n **/\n\n var parseCaptionNals = function (segment, videoTrackId) {\n // To get the samples\n var trafs = findBox$1(segment, ['moof', 'traf']); // To get SEI NAL units\n\n var mdats = findBox$1(segment, ['mdat']);\n var captionNals = {};\n var mdatTrafPairs = []; // Pair up each traf with a mdat as moofs and mdats are in pairs\n\n mdats.forEach(function (mdat, index) {\n var matchingTraf = trafs[index];\n mdatTrafPairs.push({\n mdat: mdat,\n traf: matchingTraf\n });\n });\n mdatTrafPairs.forEach(function (pair) {\n var mdat = pair.mdat;\n var traf = pair.traf;\n var tfhd = findBox$1(traf, ['tfhd']); // Exactly 1 tfhd per traf\n\n var headerInfo = parseTfhd$1(tfhd[0]);\n var trackId = headerInfo.trackId;\n var tfdt = findBox$1(traf, ['tfdt']); // Either 0 or 1 tfdt per traf\n\n var baseMediaDecodeTime = tfdt.length > 0 ? parseTfdt$1(tfdt[0]).baseMediaDecodeTime : 0;\n var truns = findBox$1(traf, ['trun']);\n var samples;\n var result; // Only parse video data for the chosen video track\n\n if (videoTrackId === trackId && truns.length > 0) {\n samples = parseSamples(truns, baseMediaDecodeTime, headerInfo);\n result = findSeiNals(mdat, samples, trackId);\n if (!captionNals[trackId]) {\n captionNals[trackId] = {\n seiNals: [],\n logs: []\n };\n }\n captionNals[trackId].seiNals = captionNals[trackId].seiNals.concat(result.seiNals);\n captionNals[trackId].logs = captionNals[trackId].logs.concat(result.logs);\n }\n });\n return captionNals;\n };\n /**\n * Parses out inband captions from an MP4 container and returns\n * caption objects that can be used by WebVTT and the TextTrack API.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/VTTCue\n * @see https://developer.mozilla.org/en-US/docs/Web/API/TextTrack\n * Assumes that `probe.getVideoTrackIds` and `probe.timescale` have been called first\n *\n * @param {Uint8Array} segment - The fmp4 segment containing embedded captions\n * @param {Number} trackId - The id of the video track to parse\n * @param {Number} timescale - The timescale for the video track from the init segment\n *\n * @return {?Object[]} parsedCaptions - A list of captions or null if no video tracks\n * @return {Number} parsedCaptions[].startTime - The time to show the caption in seconds\n * @return {Number} parsedCaptions[].endTime - The time to stop showing the caption in seconds\n * @return {Object[]} parsedCaptions[].content - A list of individual caption segments\n * @return {String} parsedCaptions[].content.text - The visible content of the caption segment\n * @return {Number} parsedCaptions[].content.line - The line height from 1-15 for positioning of the caption segment\n * @return {Number} parsedCaptions[].content.position - The column indent percentage for cue positioning from 10-80\n **/\n\n var parseEmbeddedCaptions = function (segment, trackId, timescale) {\n var captionNals; // the ISO-BMFF spec says that trackId can't be zero, but there's some broken content out there\n\n if (trackId === null) {\n return null;\n }\n captionNals = parseCaptionNals(segment, trackId);\n var trackNals = captionNals[trackId] || {};\n return {\n seiNals: trackNals.seiNals,\n logs: trackNals.logs,\n timescale: timescale\n };\n };\n /**\n * Converts SEI NALUs into captions that can be used by video.js\n **/\n\n var CaptionParser = function () {\n var isInitialized = false;\n var captionStream; // Stores segments seen before trackId and timescale are set\n\n var segmentCache; // Stores video track ID of the track being parsed\n\n var trackId; // Stores the timescale of the track being parsed\n\n var timescale; // Stores captions parsed so far\n\n var parsedCaptions; // Stores whether we are receiving partial data or not\n\n var parsingPartial;\n /**\n * A method to indicate whether a CaptionParser has been initalized\n * @returns {Boolean}\n **/\n\n this.isInitialized = function () {\n return isInitialized;\n };\n /**\n * Initializes the underlying CaptionStream, SEI NAL parsing\n * and management, and caption collection\n **/\n\n this.init = function (options) {\n captionStream = new CaptionStream();\n isInitialized = true;\n parsingPartial = options ? options.isPartial : false; // Collect dispatched captions\n\n captionStream.on('data', function (event) {\n // Convert to seconds in the source's timescale\n event.startTime = event.startPts / timescale;\n event.endTime = event.endPts / timescale;\n parsedCaptions.captions.push(event);\n parsedCaptions.captionStreams[event.stream] = true;\n });\n captionStream.on('log', function (log) {\n parsedCaptions.logs.push(log);\n });\n };\n /**\n * Determines if a new video track will be selected\n * or if the timescale changed\n * @return {Boolean}\n **/\n\n this.isNewInit = function (videoTrackIds, timescales) {\n if (videoTrackIds && videoTrackIds.length === 0 || timescales && typeof timescales === 'object' && Object.keys(timescales).length === 0) {\n return false;\n }\n return trackId !== videoTrackIds[0] || timescale !== timescales[trackId];\n };\n /**\n * Parses out SEI captions and interacts with underlying\n * CaptionStream to return dispatched captions\n *\n * @param {Uint8Array} segment - The fmp4 segment containing embedded captions\n * @param {Number[]} videoTrackIds - A list of video tracks found in the init segment\n * @param {Object.} timescales - The timescales found in the init segment\n * @see parseEmbeddedCaptions\n * @see m2ts/caption-stream.js\n **/\n\n this.parse = function (segment, videoTrackIds, timescales) {\n var parsedData;\n if (!this.isInitialized()) {\n return null; // This is not likely to be a video segment\n } else if (!videoTrackIds || !timescales) {\n return null;\n } else if (this.isNewInit(videoTrackIds, timescales)) {\n // Use the first video track only as there is no\n // mechanism to switch to other video tracks\n trackId = videoTrackIds[0];\n timescale = timescales[trackId]; // If an init segment has not been seen yet, hold onto segment\n // data until we have one.\n // the ISO-BMFF spec says that trackId can't be zero, but there's some broken content out there\n } else if (trackId === null || !timescale) {\n segmentCache.push(segment);\n return null;\n } // Now that a timescale and trackId is set, parse cached segments\n\n while (segmentCache.length > 0) {\n var cachedSegment = segmentCache.shift();\n this.parse(cachedSegment, videoTrackIds, timescales);\n }\n parsedData = parseEmbeddedCaptions(segment, trackId, timescale);\n if (parsedData && parsedData.logs) {\n parsedCaptions.logs = parsedCaptions.logs.concat(parsedData.logs);\n }\n if (parsedData === null || !parsedData.seiNals) {\n if (parsedCaptions.logs.length) {\n return {\n logs: parsedCaptions.logs,\n captions: [],\n captionStreams: []\n };\n }\n return null;\n }\n this.pushNals(parsedData.seiNals); // Force the parsed captions to be dispatched\n\n this.flushStream();\n return parsedCaptions;\n };\n /**\n * Pushes SEI NALUs onto CaptionStream\n * @param {Object[]} nals - A list of SEI nals parsed using `parseCaptionNals`\n * Assumes that `parseCaptionNals` has been called first\n * @see m2ts/caption-stream.js\n **/\n\n this.pushNals = function (nals) {\n if (!this.isInitialized() || !nals || nals.length === 0) {\n return null;\n }\n nals.forEach(function (nal) {\n captionStream.push(nal);\n });\n };\n /**\n * Flushes underlying CaptionStream to dispatch processed, displayable captions\n * @see m2ts/caption-stream.js\n **/\n\n this.flushStream = function () {\n if (!this.isInitialized()) {\n return null;\n }\n if (!parsingPartial) {\n captionStream.flush();\n } else {\n captionStream.partialFlush();\n }\n };\n /**\n * Reset caption buckets for new data\n **/\n\n this.clearParsedCaptions = function () {\n parsedCaptions.captions = [];\n parsedCaptions.captionStreams = {};\n parsedCaptions.logs = [];\n };\n /**\n * Resets underlying CaptionStream\n * @see m2ts/caption-stream.js\n **/\n\n this.resetCaptionStream = function () {\n if (!this.isInitialized()) {\n return null;\n }\n captionStream.reset();\n };\n /**\n * Convenience method to clear all captions flushed from the\n * CaptionStream and still being parsed\n * @see m2ts/caption-stream.js\n **/\n\n this.clearAllCaptions = function () {\n this.clearParsedCaptions();\n this.resetCaptionStream();\n };\n /**\n * Reset caption parser\n **/\n\n this.reset = function () {\n segmentCache = [];\n trackId = null;\n timescale = null;\n if (!parsedCaptions) {\n parsedCaptions = {\n captions: [],\n // CC1, CC2, CC3, CC4\n captionStreams: {},\n logs: []\n };\n } else {\n this.clearParsedCaptions();\n }\n this.resetCaptionStream();\n };\n this.reset();\n };\n var captionParser = CaptionParser;\n /**\n * Returns the first string in the data array ending with a null char '\\0'\n * @param {UInt8} data \n * @returns the string with the null char\n */\n\n var uint8ToCString$1 = function (data) {\n var index = 0;\n var curChar = String.fromCharCode(data[index]);\n var retString = '';\n while (curChar !== '\\0') {\n retString += curChar;\n index++;\n curChar = String.fromCharCode(data[index]);\n } // Add nullChar\n\n retString += curChar;\n return retString;\n };\n var string = {\n uint8ToCString: uint8ToCString$1\n };\n var uint8ToCString = string.uint8ToCString;\n var getUint64$1 = numbers.getUint64;\n /**\n * Based on: ISO/IEC 23009 Section: 5.10.3.3\n * References:\n * https://dashif-documents.azurewebsites.net/Events/master/event.html#emsg-format\n * https://aomediacodec.github.io/id3-emsg/\n * \n * Takes emsg box data as a uint8 array and returns a emsg box object\n * @param {UInt8Array} boxData data from emsg box\n * @returns A parsed emsg box object\n */\n\n var parseEmsgBox = function (boxData) {\n // version + flags\n var offset = 4;\n var version = boxData[0];\n var scheme_id_uri, value, timescale, presentation_time, presentation_time_delta, event_duration, id, message_data;\n if (version === 0) {\n scheme_id_uri = uint8ToCString(boxData.subarray(offset));\n offset += scheme_id_uri.length;\n value = uint8ToCString(boxData.subarray(offset));\n offset += value.length;\n var dv = new DataView(boxData.buffer);\n timescale = dv.getUint32(offset);\n offset += 4;\n presentation_time_delta = dv.getUint32(offset);\n offset += 4;\n event_duration = dv.getUint32(offset);\n offset += 4;\n id = dv.getUint32(offset);\n offset += 4;\n } else if (version === 1) {\n var dv = new DataView(boxData.buffer);\n timescale = dv.getUint32(offset);\n offset += 4;\n presentation_time = getUint64$1(boxData.subarray(offset));\n offset += 8;\n event_duration = dv.getUint32(offset);\n offset += 4;\n id = dv.getUint32(offset);\n offset += 4;\n scheme_id_uri = uint8ToCString(boxData.subarray(offset));\n offset += scheme_id_uri.length;\n value = uint8ToCString(boxData.subarray(offset));\n offset += value.length;\n }\n message_data = new Uint8Array(boxData.subarray(offset, boxData.byteLength));\n var emsgBox = {\n scheme_id_uri,\n value,\n // if timescale is undefined or 0 set to 1 \n timescale: timescale ? timescale : 1,\n presentation_time,\n presentation_time_delta,\n event_duration,\n id,\n message_data\n };\n return isValidEmsgBox(version, emsgBox) ? emsgBox : undefined;\n };\n /**\n * Scales a presentation time or time delta with an offset with a provided timescale\n * @param {number} presentationTime \n * @param {number} timescale \n * @param {number} timeDelta \n * @param {number} offset \n * @returns the scaled time as a number\n */\n\n var scaleTime = function (presentationTime, timescale, timeDelta, offset) {\n return presentationTime || presentationTime === 0 ? presentationTime / timescale : offset + timeDelta / timescale;\n };\n /**\n * Checks the emsg box data for validity based on the version\n * @param {number} version of the emsg box to validate\n * @param {Object} emsg the emsg data to validate\n * @returns if the box is valid as a boolean\n */\n\n var isValidEmsgBox = function (version, emsg) {\n var hasScheme = emsg.scheme_id_uri !== '\\0';\n var isValidV0Box = version === 0 && isDefined(emsg.presentation_time_delta) && hasScheme;\n var isValidV1Box = version === 1 && isDefined(emsg.presentation_time) && hasScheme; // Only valid versions of emsg are 0 and 1\n\n return !(version > 1) && isValidV0Box || isValidV1Box;\n }; // Utility function to check if an object is defined\n\n var isDefined = function (data) {\n return data !== undefined || data !== null;\n };\n var emsg$1 = {\n parseEmsgBox: parseEmsgBox,\n scaleTime: scaleTime\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * Utilities to detect basic properties and metadata about MP4s.\n */\n\n var toUnsigned = bin.toUnsigned;\n var toHexString = bin.toHexString;\n var findBox = findBox_1;\n var parseType$1 = parseType_1;\n var emsg = emsg$1;\n var parseTfhd = parseTfhd$2;\n var parseTrun = parseTrun$2;\n var parseTfdt = parseTfdt$2;\n var getUint64 = numbers.getUint64;\n var timescale, startTime, compositionStartTime, getVideoTrackIds, getTracks, getTimescaleFromMediaHeader, getEmsgID3;\n var window$1 = window_1;\n var parseId3Frames = parseId3.parseId3Frames;\n /**\n * Parses an MP4 initialization segment and extracts the timescale\n * values for any declared tracks. Timescale values indicate the\n * number of clock ticks per second to assume for time-based values\n * elsewhere in the MP4.\n *\n * To determine the start time of an MP4, you need two pieces of\n * information: the timescale unit and the earliest base media decode\n * time. Multiple timescales can be specified within an MP4 but the\n * base media decode time is always expressed in the timescale from\n * the media header box for the track:\n * ```\n * moov > trak > mdia > mdhd.timescale\n * ```\n * @param init {Uint8Array} the bytes of the init segment\n * @return {object} a hash of track ids to timescale values or null if\n * the init segment is malformed.\n */\n\n timescale = function (init) {\n var result = {},\n traks = findBox(init, ['moov', 'trak']); // mdhd timescale\n\n return traks.reduce(function (result, trak) {\n var tkhd, version, index, id, mdhd;\n tkhd = findBox(trak, ['tkhd'])[0];\n if (!tkhd) {\n return null;\n }\n version = tkhd[0];\n index = version === 0 ? 12 : 20;\n id = toUnsigned(tkhd[index] << 24 | tkhd[index + 1] << 16 | tkhd[index + 2] << 8 | tkhd[index + 3]);\n mdhd = findBox(trak, ['mdia', 'mdhd'])[0];\n if (!mdhd) {\n return null;\n }\n version = mdhd[0];\n index = version === 0 ? 12 : 20;\n result[id] = toUnsigned(mdhd[index] << 24 | mdhd[index + 1] << 16 | mdhd[index + 2] << 8 | mdhd[index + 3]);\n return result;\n }, result);\n };\n /**\n * Determine the base media decode start time, in seconds, for an MP4\n * fragment. If multiple fragments are specified, the earliest time is\n * returned.\n *\n * The base media decode time can be parsed from track fragment\n * metadata:\n * ```\n * moof > traf > tfdt.baseMediaDecodeTime\n * ```\n * It requires the timescale value from the mdhd to interpret.\n *\n * @param timescale {object} a hash of track ids to timescale values.\n * @return {number} the earliest base media decode start time for the\n * fragment, in seconds\n */\n\n startTime = function (timescale, fragment) {\n var trafs; // we need info from two childrend of each track fragment box\n\n trafs = findBox(fragment, ['moof', 'traf']); // determine the start times for each track\n\n var lowestTime = trafs.reduce(function (acc, traf) {\n var tfhd = findBox(traf, ['tfhd'])[0]; // get the track id from the tfhd\n\n var id = toUnsigned(tfhd[4] << 24 | tfhd[5] << 16 | tfhd[6] << 8 | tfhd[7]); // assume a 90kHz clock if no timescale was specified\n\n var scale = timescale[id] || 90e3; // get the base media decode time from the tfdt\n\n var tfdt = findBox(traf, ['tfdt'])[0];\n var dv = new DataView(tfdt.buffer, tfdt.byteOffset, tfdt.byteLength);\n var baseTime; // version 1 is 64 bit\n\n if (tfdt[0] === 1) {\n baseTime = getUint64(tfdt.subarray(4, 12));\n } else {\n baseTime = dv.getUint32(4);\n } // convert base time to seconds if it is a valid number.\n\n let seconds;\n if (typeof baseTime === 'bigint') {\n seconds = baseTime / window$1.BigInt(scale);\n } else if (typeof baseTime === 'number' && !isNaN(baseTime)) {\n seconds = baseTime / scale;\n }\n if (seconds < Number.MAX_SAFE_INTEGER) {\n seconds = Number(seconds);\n }\n if (seconds < acc) {\n acc = seconds;\n }\n return acc;\n }, Infinity);\n return typeof lowestTime === 'bigint' || isFinite(lowestTime) ? lowestTime : 0;\n };\n /**\n * Determine the composition start, in seconds, for an MP4\n * fragment.\n *\n * The composition start time of a fragment can be calculated using the base\n * media decode time, composition time offset, and timescale, as follows:\n *\n * compositionStartTime = (baseMediaDecodeTime + compositionTimeOffset) / timescale\n *\n * All of the aforementioned information is contained within a media fragment's\n * `traf` box, except for timescale info, which comes from the initialization\n * segment, so a track id (also contained within a `traf`) is also necessary to\n * associate it with a timescale\n *\n *\n * @param timescales {object} - a hash of track ids to timescale values.\n * @param fragment {Unit8Array} - the bytes of a media segment\n * @return {number} the composition start time for the fragment, in seconds\n **/\n\n compositionStartTime = function (timescales, fragment) {\n var trafBoxes = findBox(fragment, ['moof', 'traf']);\n var baseMediaDecodeTime = 0;\n var compositionTimeOffset = 0;\n var trackId;\n if (trafBoxes && trafBoxes.length) {\n // The spec states that track run samples contained within a `traf` box are contiguous, but\n // it does not explicitly state whether the `traf` boxes themselves are contiguous.\n // We will assume that they are, so we only need the first to calculate start time.\n var tfhd = findBox(trafBoxes[0], ['tfhd'])[0];\n var trun = findBox(trafBoxes[0], ['trun'])[0];\n var tfdt = findBox(trafBoxes[0], ['tfdt'])[0];\n if (tfhd) {\n var parsedTfhd = parseTfhd(tfhd);\n trackId = parsedTfhd.trackId;\n }\n if (tfdt) {\n var parsedTfdt = parseTfdt(tfdt);\n baseMediaDecodeTime = parsedTfdt.baseMediaDecodeTime;\n }\n if (trun) {\n var parsedTrun = parseTrun(trun);\n if (parsedTrun.samples && parsedTrun.samples.length) {\n compositionTimeOffset = parsedTrun.samples[0].compositionTimeOffset || 0;\n }\n }\n } // Get timescale for this specific track. Assume a 90kHz clock if no timescale was\n // specified.\n\n var timescale = timescales[trackId] || 90e3; // return the composition start time, in seconds\n\n if (typeof baseMediaDecodeTime === 'bigint') {\n compositionTimeOffset = window$1.BigInt(compositionTimeOffset);\n timescale = window$1.BigInt(timescale);\n }\n var result = (baseMediaDecodeTime + compositionTimeOffset) / timescale;\n if (typeof result === 'bigint' && result < Number.MAX_SAFE_INTEGER) {\n result = Number(result);\n }\n return result;\n };\n /**\n * Find the trackIds of the video tracks in this source.\n * Found by parsing the Handler Reference and Track Header Boxes:\n * moov > trak > mdia > hdlr\n * moov > trak > tkhd\n *\n * @param {Uint8Array} init - The bytes of the init segment for this source\n * @return {Number[]} A list of trackIds\n *\n * @see ISO-BMFF-12/2015, Section 8.4.3\n **/\n\n getVideoTrackIds = function (init) {\n var traks = findBox(init, ['moov', 'trak']);\n var videoTrackIds = [];\n traks.forEach(function (trak) {\n var hdlrs = findBox(trak, ['mdia', 'hdlr']);\n var tkhds = findBox(trak, ['tkhd']);\n hdlrs.forEach(function (hdlr, index) {\n var handlerType = parseType$1(hdlr.subarray(8, 12));\n var tkhd = tkhds[index];\n var view;\n var version;\n var trackId;\n if (handlerType === 'vide') {\n view = new DataView(tkhd.buffer, tkhd.byteOffset, tkhd.byteLength);\n version = view.getUint8(0);\n trackId = version === 0 ? view.getUint32(12) : view.getUint32(20);\n videoTrackIds.push(trackId);\n }\n });\n });\n return videoTrackIds;\n };\n getTimescaleFromMediaHeader = function (mdhd) {\n // mdhd is a FullBox, meaning it will have its own version as the first byte\n var version = mdhd[0];\n var index = version === 0 ? 12 : 20;\n return toUnsigned(mdhd[index] << 24 | mdhd[index + 1] << 16 | mdhd[index + 2] << 8 | mdhd[index + 3]);\n };\n /**\n * Get all the video, audio, and hint tracks from a non fragmented\n * mp4 segment\n */\n\n getTracks = function (init) {\n var traks = findBox(init, ['moov', 'trak']);\n var tracks = [];\n traks.forEach(function (trak) {\n var track = {};\n var tkhd = findBox(trak, ['tkhd'])[0];\n var view, tkhdVersion; // id\n\n if (tkhd) {\n view = new DataView(tkhd.buffer, tkhd.byteOffset, tkhd.byteLength);\n tkhdVersion = view.getUint8(0);\n track.id = tkhdVersion === 0 ? view.getUint32(12) : view.getUint32(20);\n }\n var hdlr = findBox(trak, ['mdia', 'hdlr'])[0]; // type\n\n if (hdlr) {\n var type = parseType$1(hdlr.subarray(8, 12));\n if (type === 'vide') {\n track.type = 'video';\n } else if (type === 'soun') {\n track.type = 'audio';\n } else {\n track.type = type;\n }\n } // codec\n\n var stsd = findBox(trak, ['mdia', 'minf', 'stbl', 'stsd'])[0];\n if (stsd) {\n var sampleDescriptions = stsd.subarray(8); // gives the codec type string\n\n track.codec = parseType$1(sampleDescriptions.subarray(4, 8));\n var codecBox = findBox(sampleDescriptions, [track.codec])[0];\n var codecConfig, codecConfigType;\n if (codecBox) {\n // https://tools.ietf.org/html/rfc6381#section-3.3\n if (/^[asm]vc[1-9]$/i.test(track.codec)) {\n // we don't need anything but the \"config\" parameter of the\n // avc1 codecBox\n codecConfig = codecBox.subarray(78);\n codecConfigType = parseType$1(codecConfig.subarray(4, 8));\n if (codecConfigType === 'avcC' && codecConfig.length > 11) {\n track.codec += '.'; // left padded with zeroes for single digit hex\n // profile idc\n\n track.codec += toHexString(codecConfig[9]); // the byte containing the constraint_set flags\n\n track.codec += toHexString(codecConfig[10]); // level idc\n\n track.codec += toHexString(codecConfig[11]);\n } else {\n // TODO: show a warning that we couldn't parse the codec\n // and are using the default\n track.codec = 'avc1.4d400d';\n }\n } else if (/^mp4[a,v]$/i.test(track.codec)) {\n // we do not need anything but the streamDescriptor of the mp4a codecBox\n codecConfig = codecBox.subarray(28);\n codecConfigType = parseType$1(codecConfig.subarray(4, 8));\n if (codecConfigType === 'esds' && codecConfig.length > 20 && codecConfig[19] !== 0) {\n track.codec += '.' + toHexString(codecConfig[19]); // this value is only a single digit\n\n track.codec += '.' + toHexString(codecConfig[20] >>> 2 & 0x3f).replace(/^0/, '');\n } else {\n // TODO: show a warning that we couldn't parse the codec\n // and are using the default\n track.codec = 'mp4a.40.2';\n }\n } else {\n // flac, opus, etc\n track.codec = track.codec.toLowerCase();\n }\n }\n }\n var mdhd = findBox(trak, ['mdia', 'mdhd'])[0];\n if (mdhd) {\n track.timescale = getTimescaleFromMediaHeader(mdhd);\n }\n tracks.push(track);\n });\n return tracks;\n };\n /**\n * Returns an array of emsg ID3 data from the provided segmentData.\n * An offset can also be provided as the Latest Arrival Time to calculate \n * the Event Start Time of v0 EMSG boxes. \n * See: https://dashif-documents.azurewebsites.net/Events/master/event.html#Inband-event-timing\n * \n * @param {Uint8Array} segmentData the segment byte array.\n * @param {number} offset the segment start time or Latest Arrival Time, \n * @return {Object[]} an array of ID3 parsed from EMSG boxes\n */\n\n getEmsgID3 = function (segmentData, offset = 0) {\n var emsgBoxes = findBox(segmentData, ['emsg']);\n return emsgBoxes.map(data => {\n var parsedBox = emsg.parseEmsgBox(new Uint8Array(data));\n var parsedId3Frames = parseId3Frames(parsedBox.message_data);\n return {\n cueTime: emsg.scaleTime(parsedBox.presentation_time, parsedBox.timescale, parsedBox.presentation_time_delta, offset),\n duration: emsg.scaleTime(parsedBox.event_duration, parsedBox.timescale),\n frames: parsedId3Frames\n };\n });\n };\n var probe$2 = {\n // export mp4 inspector's findBox and parseType for backwards compatibility\n findBox: findBox,\n parseType: parseType$1,\n timescale: timescale,\n startTime: startTime,\n compositionStartTime: compositionStartTime,\n videoTrackIds: getVideoTrackIds,\n tracks: getTracks,\n getTimescaleFromMediaHeader: getTimescaleFromMediaHeader,\n getEmsgID3: getEmsgID3\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * Utilities to detect basic properties and metadata about TS Segments.\n */\n\n var StreamTypes$1 = streamTypes;\n var parsePid = function (packet) {\n var pid = packet[1] & 0x1f;\n pid <<= 8;\n pid |= packet[2];\n return pid;\n };\n var parsePayloadUnitStartIndicator = function (packet) {\n return !!(packet[1] & 0x40);\n };\n var parseAdaptionField = function (packet) {\n var offset = 0; // if an adaption field is present, its length is specified by the\n // fifth byte of the TS packet header. The adaptation field is\n // used to add stuffing to PES packets that don't fill a complete\n // TS packet, and to specify some forms of timing and control data\n // that we do not currently use.\n\n if ((packet[3] & 0x30) >>> 4 > 0x01) {\n offset += packet[4] + 1;\n }\n return offset;\n };\n var parseType = function (packet, pmtPid) {\n var pid = parsePid(packet);\n if (pid === 0) {\n return 'pat';\n } else if (pid === pmtPid) {\n return 'pmt';\n } else if (pmtPid) {\n return 'pes';\n }\n return null;\n };\n var parsePat = function (packet) {\n var pusi = parsePayloadUnitStartIndicator(packet);\n var offset = 4 + parseAdaptionField(packet);\n if (pusi) {\n offset += packet[offset] + 1;\n }\n return (packet[offset + 10] & 0x1f) << 8 | packet[offset + 11];\n };\n var parsePmt = function (packet) {\n var programMapTable = {};\n var pusi = parsePayloadUnitStartIndicator(packet);\n var payloadOffset = 4 + parseAdaptionField(packet);\n if (pusi) {\n payloadOffset += packet[payloadOffset] + 1;\n } // PMTs can be sent ahead of the time when they should actually\n // take effect. We don't believe this should ever be the case\n // for HLS but we'll ignore \"forward\" PMT declarations if we see\n // them. Future PMT declarations have the current_next_indicator\n // set to zero.\n\n if (!(packet[payloadOffset + 5] & 0x01)) {\n return;\n }\n var sectionLength, tableEnd, programInfoLength; // the mapping table ends at the end of the current section\n\n sectionLength = (packet[payloadOffset + 1] & 0x0f) << 8 | packet[payloadOffset + 2];\n tableEnd = 3 + sectionLength - 4; // to determine where the table is, we have to figure out how\n // long the program info descriptors are\n\n programInfoLength = (packet[payloadOffset + 10] & 0x0f) << 8 | packet[payloadOffset + 11]; // advance the offset to the first entry in the mapping table\n\n var offset = 12 + programInfoLength;\n while (offset < tableEnd) {\n var i = payloadOffset + offset; // add an entry that maps the elementary_pid to the stream_type\n\n programMapTable[(packet[i + 1] & 0x1F) << 8 | packet[i + 2]] = packet[i]; // move to the next table entry\n // skip past the elementary stream descriptors, if present\n\n offset += ((packet[i + 3] & 0x0F) << 8 | packet[i + 4]) + 5;\n }\n return programMapTable;\n };\n var parsePesType = function (packet, programMapTable) {\n var pid = parsePid(packet);\n var type = programMapTable[pid];\n switch (type) {\n case StreamTypes$1.H264_STREAM_TYPE:\n return 'video';\n case StreamTypes$1.ADTS_STREAM_TYPE:\n return 'audio';\n case StreamTypes$1.METADATA_STREAM_TYPE:\n return 'timed-metadata';\n default:\n return null;\n }\n };\n var parsePesTime = function (packet) {\n var pusi = parsePayloadUnitStartIndicator(packet);\n if (!pusi) {\n return null;\n }\n var offset = 4 + parseAdaptionField(packet);\n if (offset >= packet.byteLength) {\n // From the H 222.0 MPEG-TS spec\n // \"For transport stream packets carrying PES packets, stuffing is needed when there\n // is insufficient PES packet data to completely fill the transport stream packet\n // payload bytes. Stuffing is accomplished by defining an adaptation field longer than\n // the sum of the lengths of the data elements in it, so that the payload bytes\n // remaining after the adaptation field exactly accommodates the available PES packet\n // data.\"\n //\n // If the offset is >= the length of the packet, then the packet contains no data\n // and instead is just adaption field stuffing bytes\n return null;\n }\n var pes = null;\n var ptsDtsFlags; // PES packets may be annotated with a PTS value, or a PTS value\n // and a DTS value. Determine what combination of values is\n // available to work with.\n\n ptsDtsFlags = packet[offset + 7]; // PTS and DTS are normally stored as a 33-bit number. Javascript\n // performs all bitwise operations on 32-bit integers but javascript\n // supports a much greater range (52-bits) of integer using standard\n // mathematical operations.\n // We construct a 31-bit value using bitwise operators over the 31\n // most significant bits and then multiply by 4 (equal to a left-shift\n // of 2) before we add the final 2 least significant bits of the\n // timestamp (equal to an OR.)\n\n if (ptsDtsFlags & 0xC0) {\n pes = {}; // the PTS and DTS are not written out directly. For information\n // on how they are encoded, see\n // http://dvd.sourceforge.net/dvdinfo/pes-hdr.html\n\n pes.pts = (packet[offset + 9] & 0x0E) << 27 | (packet[offset + 10] & 0xFF) << 20 | (packet[offset + 11] & 0xFE) << 12 | (packet[offset + 12] & 0xFF) << 5 | (packet[offset + 13] & 0xFE) >>> 3;\n pes.pts *= 4; // Left shift by 2\n\n pes.pts += (packet[offset + 13] & 0x06) >>> 1; // OR by the two LSBs\n\n pes.dts = pes.pts;\n if (ptsDtsFlags & 0x40) {\n pes.dts = (packet[offset + 14] & 0x0E) << 27 | (packet[offset + 15] & 0xFF) << 20 | (packet[offset + 16] & 0xFE) << 12 | (packet[offset + 17] & 0xFF) << 5 | (packet[offset + 18] & 0xFE) >>> 3;\n pes.dts *= 4; // Left shift by 2\n\n pes.dts += (packet[offset + 18] & 0x06) >>> 1; // OR by the two LSBs\n }\n }\n\n return pes;\n };\n var parseNalUnitType = function (type) {\n switch (type) {\n case 0x05:\n return 'slice_layer_without_partitioning_rbsp_idr';\n case 0x06:\n return 'sei_rbsp';\n case 0x07:\n return 'seq_parameter_set_rbsp';\n case 0x08:\n return 'pic_parameter_set_rbsp';\n case 0x09:\n return 'access_unit_delimiter_rbsp';\n default:\n return null;\n }\n };\n var videoPacketContainsKeyFrame = function (packet) {\n var offset = 4 + parseAdaptionField(packet);\n var frameBuffer = packet.subarray(offset);\n var frameI = 0;\n var frameSyncPoint = 0;\n var foundKeyFrame = false;\n var nalType; // advance the sync point to a NAL start, if necessary\n\n for (; frameSyncPoint < frameBuffer.byteLength - 3; frameSyncPoint++) {\n if (frameBuffer[frameSyncPoint + 2] === 1) {\n // the sync point is properly aligned\n frameI = frameSyncPoint + 5;\n break;\n }\n }\n while (frameI < frameBuffer.byteLength) {\n // look at the current byte to determine if we've hit the end of\n // a NAL unit boundary\n switch (frameBuffer[frameI]) {\n case 0:\n // skip past non-sync sequences\n if (frameBuffer[frameI - 1] !== 0) {\n frameI += 2;\n break;\n } else if (frameBuffer[frameI - 2] !== 0) {\n frameI++;\n break;\n }\n if (frameSyncPoint + 3 !== frameI - 2) {\n nalType = parseNalUnitType(frameBuffer[frameSyncPoint + 3] & 0x1f);\n if (nalType === 'slice_layer_without_partitioning_rbsp_idr') {\n foundKeyFrame = true;\n }\n } // drop trailing zeroes\n\n do {\n frameI++;\n } while (frameBuffer[frameI] !== 1 && frameI < frameBuffer.length);\n frameSyncPoint = frameI - 2;\n frameI += 3;\n break;\n case 1:\n // skip past non-sync sequences\n if (frameBuffer[frameI - 1] !== 0 || frameBuffer[frameI - 2] !== 0) {\n frameI += 3;\n break;\n }\n nalType = parseNalUnitType(frameBuffer[frameSyncPoint + 3] & 0x1f);\n if (nalType === 'slice_layer_without_partitioning_rbsp_idr') {\n foundKeyFrame = true;\n }\n frameSyncPoint = frameI - 2;\n frameI += 3;\n break;\n default:\n // the current byte isn't a one or zero, so it cannot be part\n // of a sync sequence\n frameI += 3;\n break;\n }\n }\n frameBuffer = frameBuffer.subarray(frameSyncPoint);\n frameI -= frameSyncPoint;\n frameSyncPoint = 0; // parse the final nal\n\n if (frameBuffer && frameBuffer.byteLength > 3) {\n nalType = parseNalUnitType(frameBuffer[frameSyncPoint + 3] & 0x1f);\n if (nalType === 'slice_layer_without_partitioning_rbsp_idr') {\n foundKeyFrame = true;\n }\n }\n return foundKeyFrame;\n };\n var probe$1 = {\n parseType: parseType,\n parsePat: parsePat,\n parsePmt: parsePmt,\n parsePayloadUnitStartIndicator: parsePayloadUnitStartIndicator,\n parsePesType: parsePesType,\n parsePesTime: parsePesTime,\n videoPacketContainsKeyFrame: videoPacketContainsKeyFrame\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * Parse mpeg2 transport stream packets to extract basic timing information\n */\n\n var StreamTypes = streamTypes;\n var handleRollover = timestampRolloverStream.handleRollover;\n var probe = {};\n probe.ts = probe$1;\n probe.aac = utils;\n var ONE_SECOND_IN_TS = clock$2.ONE_SECOND_IN_TS;\n var MP2T_PACKET_LENGTH = 188,\n // bytes\n SYNC_BYTE = 0x47;\n /**\n * walks through segment data looking for pat and pmt packets to parse out\n * program map table information\n */\n\n var parsePsi_ = function (bytes, pmt) {\n var startIndex = 0,\n endIndex = MP2T_PACKET_LENGTH,\n packet,\n type;\n while (endIndex < bytes.byteLength) {\n // Look for a pair of start and end sync bytes in the data..\n if (bytes[startIndex] === SYNC_BYTE && bytes[endIndex] === SYNC_BYTE) {\n // We found a packet\n packet = bytes.subarray(startIndex, endIndex);\n type = probe.ts.parseType(packet, pmt.pid);\n switch (type) {\n case 'pat':\n pmt.pid = probe.ts.parsePat(packet);\n break;\n case 'pmt':\n var table = probe.ts.parsePmt(packet);\n pmt.table = pmt.table || {};\n Object.keys(table).forEach(function (key) {\n pmt.table[key] = table[key];\n });\n break;\n }\n startIndex += MP2T_PACKET_LENGTH;\n endIndex += MP2T_PACKET_LENGTH;\n continue;\n } // If we get here, we have somehow become de-synchronized and we need to step\n // forward one byte at a time until we find a pair of sync bytes that denote\n // a packet\n\n startIndex++;\n endIndex++;\n }\n };\n /**\n * walks through the segment data from the start and end to get timing information\n * for the first and last audio pes packets\n */\n\n var parseAudioPes_ = function (bytes, pmt, result) {\n var startIndex = 0,\n endIndex = MP2T_PACKET_LENGTH,\n packet,\n type,\n pesType,\n pusi,\n parsed;\n var endLoop = false; // Start walking from start of segment to get first audio packet\n\n while (endIndex <= bytes.byteLength) {\n // Look for a pair of start and end sync bytes in the data..\n if (bytes[startIndex] === SYNC_BYTE && (bytes[endIndex] === SYNC_BYTE || endIndex === bytes.byteLength)) {\n // We found a packet\n packet = bytes.subarray(startIndex, endIndex);\n type = probe.ts.parseType(packet, pmt.pid);\n switch (type) {\n case 'pes':\n pesType = probe.ts.parsePesType(packet, pmt.table);\n pusi = probe.ts.parsePayloadUnitStartIndicator(packet);\n if (pesType === 'audio' && pusi) {\n parsed = probe.ts.parsePesTime(packet);\n if (parsed) {\n parsed.type = 'audio';\n result.audio.push(parsed);\n endLoop = true;\n }\n }\n break;\n }\n if (endLoop) {\n break;\n }\n startIndex += MP2T_PACKET_LENGTH;\n endIndex += MP2T_PACKET_LENGTH;\n continue;\n } // If we get here, we have somehow become de-synchronized and we need to step\n // forward one byte at a time until we find a pair of sync bytes that denote\n // a packet\n\n startIndex++;\n endIndex++;\n } // Start walking from end of segment to get last audio packet\n\n endIndex = bytes.byteLength;\n startIndex = endIndex - MP2T_PACKET_LENGTH;\n endLoop = false;\n while (startIndex >= 0) {\n // Look for a pair of start and end sync bytes in the data..\n if (bytes[startIndex] === SYNC_BYTE && (bytes[endIndex] === SYNC_BYTE || endIndex === bytes.byteLength)) {\n // We found a packet\n packet = bytes.subarray(startIndex, endIndex);\n type = probe.ts.parseType(packet, pmt.pid);\n switch (type) {\n case 'pes':\n pesType = probe.ts.parsePesType(packet, pmt.table);\n pusi = probe.ts.parsePayloadUnitStartIndicator(packet);\n if (pesType === 'audio' && pusi) {\n parsed = probe.ts.parsePesTime(packet);\n if (parsed) {\n parsed.type = 'audio';\n result.audio.push(parsed);\n endLoop = true;\n }\n }\n break;\n }\n if (endLoop) {\n break;\n }\n startIndex -= MP2T_PACKET_LENGTH;\n endIndex -= MP2T_PACKET_LENGTH;\n continue;\n } // If we get here, we have somehow become de-synchronized and we need to step\n // forward one byte at a time until we find a pair of sync bytes that denote\n // a packet\n\n startIndex--;\n endIndex--;\n }\n };\n /**\n * walks through the segment data from the start and end to get timing information\n * for the first and last video pes packets as well as timing information for the first\n * key frame.\n */\n\n var parseVideoPes_ = function (bytes, pmt, result) {\n var startIndex = 0,\n endIndex = MP2T_PACKET_LENGTH,\n packet,\n type,\n pesType,\n pusi,\n parsed,\n frame,\n i,\n pes;\n var endLoop = false;\n var currentFrame = {\n data: [],\n size: 0\n }; // Start walking from start of segment to get first video packet\n\n while (endIndex < bytes.byteLength) {\n // Look for a pair of start and end sync bytes in the data..\n if (bytes[startIndex] === SYNC_BYTE && bytes[endIndex] === SYNC_BYTE) {\n // We found a packet\n packet = bytes.subarray(startIndex, endIndex);\n type = probe.ts.parseType(packet, pmt.pid);\n switch (type) {\n case 'pes':\n pesType = probe.ts.parsePesType(packet, pmt.table);\n pusi = probe.ts.parsePayloadUnitStartIndicator(packet);\n if (pesType === 'video') {\n if (pusi && !endLoop) {\n parsed = probe.ts.parsePesTime(packet);\n if (parsed) {\n parsed.type = 'video';\n result.video.push(parsed);\n endLoop = true;\n }\n }\n if (!result.firstKeyFrame) {\n if (pusi) {\n if (currentFrame.size !== 0) {\n frame = new Uint8Array(currentFrame.size);\n i = 0;\n while (currentFrame.data.length) {\n pes = currentFrame.data.shift();\n frame.set(pes, i);\n i += pes.byteLength;\n }\n if (probe.ts.videoPacketContainsKeyFrame(frame)) {\n var firstKeyFrame = probe.ts.parsePesTime(frame); // PTS/DTS may not be available. Simply *not* setting\n // the keyframe seems to work fine with HLS playback\n // and definitely preferable to a crash with TypeError...\n\n if (firstKeyFrame) {\n result.firstKeyFrame = firstKeyFrame;\n result.firstKeyFrame.type = 'video';\n } else {\n // eslint-disable-next-line\n console.warn('Failed to extract PTS/DTS from PES at first keyframe. ' + 'This could be an unusual TS segment, or else mux.js did not ' + 'parse your TS segment correctly. If you know your TS ' + 'segments do contain PTS/DTS on keyframes please file a bug ' + 'report! You can try ffprobe to double check for yourself.');\n }\n }\n currentFrame.size = 0;\n }\n }\n currentFrame.data.push(packet);\n currentFrame.size += packet.byteLength;\n }\n }\n break;\n }\n if (endLoop && result.firstKeyFrame) {\n break;\n }\n startIndex += MP2T_PACKET_LENGTH;\n endIndex += MP2T_PACKET_LENGTH;\n continue;\n } // If we get here, we have somehow become de-synchronized and we need to step\n // forward one byte at a time until we find a pair of sync bytes that denote\n // a packet\n\n startIndex++;\n endIndex++;\n } // Start walking from end of segment to get last video packet\n\n endIndex = bytes.byteLength;\n startIndex = endIndex - MP2T_PACKET_LENGTH;\n endLoop = false;\n while (startIndex >= 0) {\n // Look for a pair of start and end sync bytes in the data..\n if (bytes[startIndex] === SYNC_BYTE && bytes[endIndex] === SYNC_BYTE) {\n // We found a packet\n packet = bytes.subarray(startIndex, endIndex);\n type = probe.ts.parseType(packet, pmt.pid);\n switch (type) {\n case 'pes':\n pesType = probe.ts.parsePesType(packet, pmt.table);\n pusi = probe.ts.parsePayloadUnitStartIndicator(packet);\n if (pesType === 'video' && pusi) {\n parsed = probe.ts.parsePesTime(packet);\n if (parsed) {\n parsed.type = 'video';\n result.video.push(parsed);\n endLoop = true;\n }\n }\n break;\n }\n if (endLoop) {\n break;\n }\n startIndex -= MP2T_PACKET_LENGTH;\n endIndex -= MP2T_PACKET_LENGTH;\n continue;\n } // If we get here, we have somehow become de-synchronized and we need to step\n // forward one byte at a time until we find a pair of sync bytes that denote\n // a packet\n\n startIndex--;\n endIndex--;\n }\n };\n /**\n * Adjusts the timestamp information for the segment to account for\n * rollover and convert to seconds based on pes packet timescale (90khz clock)\n */\n\n var adjustTimestamp_ = function (segmentInfo, baseTimestamp) {\n if (segmentInfo.audio && segmentInfo.audio.length) {\n var audioBaseTimestamp = baseTimestamp;\n if (typeof audioBaseTimestamp === 'undefined' || isNaN(audioBaseTimestamp)) {\n audioBaseTimestamp = segmentInfo.audio[0].dts;\n }\n segmentInfo.audio.forEach(function (info) {\n info.dts = handleRollover(info.dts, audioBaseTimestamp);\n info.pts = handleRollover(info.pts, audioBaseTimestamp); // time in seconds\n\n info.dtsTime = info.dts / ONE_SECOND_IN_TS;\n info.ptsTime = info.pts / ONE_SECOND_IN_TS;\n });\n }\n if (segmentInfo.video && segmentInfo.video.length) {\n var videoBaseTimestamp = baseTimestamp;\n if (typeof videoBaseTimestamp === 'undefined' || isNaN(videoBaseTimestamp)) {\n videoBaseTimestamp = segmentInfo.video[0].dts;\n }\n segmentInfo.video.forEach(function (info) {\n info.dts = handleRollover(info.dts, videoBaseTimestamp);\n info.pts = handleRollover(info.pts, videoBaseTimestamp); // time in seconds\n\n info.dtsTime = info.dts / ONE_SECOND_IN_TS;\n info.ptsTime = info.pts / ONE_SECOND_IN_TS;\n });\n if (segmentInfo.firstKeyFrame) {\n var frame = segmentInfo.firstKeyFrame;\n frame.dts = handleRollover(frame.dts, videoBaseTimestamp);\n frame.pts = handleRollover(frame.pts, videoBaseTimestamp); // time in seconds\n\n frame.dtsTime = frame.dts / ONE_SECOND_IN_TS;\n frame.ptsTime = frame.pts / ONE_SECOND_IN_TS;\n }\n }\n };\n /**\n * inspects the aac data stream for start and end time information\n */\n\n var inspectAac_ = function (bytes) {\n var endLoop = false,\n audioCount = 0,\n sampleRate = null,\n timestamp = null,\n frameSize = 0,\n byteIndex = 0,\n packet;\n while (bytes.length - byteIndex >= 3) {\n var type = probe.aac.parseType(bytes, byteIndex);\n switch (type) {\n case 'timed-metadata':\n // Exit early because we don't have enough to parse\n // the ID3 tag header\n if (bytes.length - byteIndex < 10) {\n endLoop = true;\n break;\n }\n frameSize = probe.aac.parseId3TagSize(bytes, byteIndex); // Exit early if we don't have enough in the buffer\n // to emit a full packet\n\n if (frameSize > bytes.length) {\n endLoop = true;\n break;\n }\n if (timestamp === null) {\n packet = bytes.subarray(byteIndex, byteIndex + frameSize);\n timestamp = probe.aac.parseAacTimestamp(packet);\n }\n byteIndex += frameSize;\n break;\n case 'audio':\n // Exit early because we don't have enough to parse\n // the ADTS frame header\n if (bytes.length - byteIndex < 7) {\n endLoop = true;\n break;\n }\n frameSize = probe.aac.parseAdtsSize(bytes, byteIndex); // Exit early if we don't have enough in the buffer\n // to emit a full packet\n\n if (frameSize > bytes.length) {\n endLoop = true;\n break;\n }\n if (sampleRate === null) {\n packet = bytes.subarray(byteIndex, byteIndex + frameSize);\n sampleRate = probe.aac.parseSampleRate(packet);\n }\n audioCount++;\n byteIndex += frameSize;\n break;\n default:\n byteIndex++;\n break;\n }\n if (endLoop) {\n return null;\n }\n }\n if (sampleRate === null || timestamp === null) {\n return null;\n }\n var audioTimescale = ONE_SECOND_IN_TS / sampleRate;\n var result = {\n audio: [{\n type: 'audio',\n dts: timestamp,\n pts: timestamp\n }, {\n type: 'audio',\n dts: timestamp + audioCount * 1024 * audioTimescale,\n pts: timestamp + audioCount * 1024 * audioTimescale\n }]\n };\n return result;\n };\n /**\n * inspects the transport stream segment data for start and end time information\n * of the audio and video tracks (when present) as well as the first key frame's\n * start time.\n */\n\n var inspectTs_ = function (bytes) {\n var pmt = {\n pid: null,\n table: null\n };\n var result = {};\n parsePsi_(bytes, pmt);\n for (var pid in pmt.table) {\n if (pmt.table.hasOwnProperty(pid)) {\n var type = pmt.table[pid];\n switch (type) {\n case StreamTypes.H264_STREAM_TYPE:\n result.video = [];\n parseVideoPes_(bytes, pmt, result);\n if (result.video.length === 0) {\n delete result.video;\n }\n break;\n case StreamTypes.ADTS_STREAM_TYPE:\n result.audio = [];\n parseAudioPes_(bytes, pmt, result);\n if (result.audio.length === 0) {\n delete result.audio;\n }\n break;\n }\n }\n }\n return result;\n };\n /**\n * Inspects segment byte data and returns an object with start and end timing information\n *\n * @param {Uint8Array} bytes The segment byte data\n * @param {Number} baseTimestamp Relative reference timestamp used when adjusting frame\n * timestamps for rollover. This value must be in 90khz clock.\n * @return {Object} Object containing start and end frame timing info of segment.\n */\n\n var inspect = function (bytes, baseTimestamp) {\n var isAacData = probe.aac.isLikelyAacData(bytes);\n var result;\n if (isAacData) {\n result = inspectAac_(bytes);\n } else {\n result = inspectTs_(bytes);\n }\n if (!result || !result.audio && !result.video) {\n return null;\n }\n adjustTimestamp_(result, baseTimestamp);\n return result;\n };\n var tsInspector = {\n inspect: inspect,\n parseAudioPes_: parseAudioPes_\n };\n /* global self */\n\n /**\n * Re-emits transmuxer events by converting them into messages to the\n * world outside the worker.\n *\n * @param {Object} transmuxer the transmuxer to wire events on\n * @private\n */\n\n const wireTransmuxerEvents = function (self, transmuxer) {\n transmuxer.on('data', function (segment) {\n // transfer ownership of the underlying ArrayBuffer\n // instead of doing a copy to save memory\n // ArrayBuffers are transferable but generic TypedArrays are not\n // @link https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers#Passing_data_by_transferring_ownership_(transferable_objects)\n const initArray = segment.initSegment;\n segment.initSegment = {\n data: initArray.buffer,\n byteOffset: initArray.byteOffset,\n byteLength: initArray.byteLength\n };\n const typedArray = segment.data;\n segment.data = typedArray.buffer;\n self.postMessage({\n action: 'data',\n segment,\n byteOffset: typedArray.byteOffset,\n byteLength: typedArray.byteLength\n }, [segment.data]);\n });\n transmuxer.on('done', function (data) {\n self.postMessage({\n action: 'done'\n });\n });\n transmuxer.on('gopInfo', function (gopInfo) {\n self.postMessage({\n action: 'gopInfo',\n gopInfo\n });\n });\n transmuxer.on('videoSegmentTimingInfo', function (timingInfo) {\n const videoSegmentTimingInfo = {\n start: {\n decode: clock$2.videoTsToSeconds(timingInfo.start.dts),\n presentation: clock$2.videoTsToSeconds(timingInfo.start.pts)\n },\n end: {\n decode: clock$2.videoTsToSeconds(timingInfo.end.dts),\n presentation: clock$2.videoTsToSeconds(timingInfo.end.pts)\n },\n baseMediaDecodeTime: clock$2.videoTsToSeconds(timingInfo.baseMediaDecodeTime)\n };\n if (timingInfo.prependedContentDuration) {\n videoSegmentTimingInfo.prependedContentDuration = clock$2.videoTsToSeconds(timingInfo.prependedContentDuration);\n }\n self.postMessage({\n action: 'videoSegmentTimingInfo',\n videoSegmentTimingInfo\n });\n });\n transmuxer.on('audioSegmentTimingInfo', function (timingInfo) {\n // Note that all times for [audio/video]SegmentTimingInfo events are in video clock\n const audioSegmentTimingInfo = {\n start: {\n decode: clock$2.videoTsToSeconds(timingInfo.start.dts),\n presentation: clock$2.videoTsToSeconds(timingInfo.start.pts)\n },\n end: {\n decode: clock$2.videoTsToSeconds(timingInfo.end.dts),\n presentation: clock$2.videoTsToSeconds(timingInfo.end.pts)\n },\n baseMediaDecodeTime: clock$2.videoTsToSeconds(timingInfo.baseMediaDecodeTime)\n };\n if (timingInfo.prependedContentDuration) {\n audioSegmentTimingInfo.prependedContentDuration = clock$2.videoTsToSeconds(timingInfo.prependedContentDuration);\n }\n self.postMessage({\n action: 'audioSegmentTimingInfo',\n audioSegmentTimingInfo\n });\n });\n transmuxer.on('id3Frame', function (id3Frame) {\n self.postMessage({\n action: 'id3Frame',\n id3Frame\n });\n });\n transmuxer.on('caption', function (caption) {\n self.postMessage({\n action: 'caption',\n caption\n });\n });\n transmuxer.on('trackinfo', function (trackInfo) {\n self.postMessage({\n action: 'trackinfo',\n trackInfo\n });\n });\n transmuxer.on('audioTimingInfo', function (audioTimingInfo) {\n // convert to video TS since we prioritize video time over audio\n self.postMessage({\n action: 'audioTimingInfo',\n audioTimingInfo: {\n start: clock$2.videoTsToSeconds(audioTimingInfo.start),\n end: clock$2.videoTsToSeconds(audioTimingInfo.end)\n }\n });\n });\n transmuxer.on('videoTimingInfo', function (videoTimingInfo) {\n self.postMessage({\n action: 'videoTimingInfo',\n videoTimingInfo: {\n start: clock$2.videoTsToSeconds(videoTimingInfo.start),\n end: clock$2.videoTsToSeconds(videoTimingInfo.end)\n }\n });\n });\n transmuxer.on('log', function (log) {\n self.postMessage({\n action: 'log',\n log\n });\n });\n };\n /**\n * All incoming messages route through this hash. If no function exists\n * to handle an incoming message, then we ignore the message.\n *\n * @class MessageHandlers\n * @param {Object} options the options to initialize with\n */\n\n class MessageHandlers {\n constructor(self, options) {\n this.options = options || {};\n this.self = self;\n this.init();\n }\n /**\n * initialize our web worker and wire all the events.\n */\n\n init() {\n if (this.transmuxer) {\n this.transmuxer.dispose();\n }\n this.transmuxer = new transmuxer.Transmuxer(this.options);\n wireTransmuxerEvents(this.self, this.transmuxer);\n }\n pushMp4Captions(data) {\n if (!this.captionParser) {\n this.captionParser = new captionParser();\n this.captionParser.init();\n }\n const segment = new Uint8Array(data.data, data.byteOffset, data.byteLength);\n const parsed = this.captionParser.parse(segment, data.trackIds, data.timescales);\n this.self.postMessage({\n action: 'mp4Captions',\n captions: parsed && parsed.captions || [],\n logs: parsed && parsed.logs || [],\n data: segment.buffer\n }, [segment.buffer]);\n }\n probeMp4StartTime({\n timescales,\n data\n }) {\n const startTime = probe$2.startTime(timescales, data);\n this.self.postMessage({\n action: 'probeMp4StartTime',\n startTime,\n data\n }, [data.buffer]);\n }\n probeMp4Tracks({\n data\n }) {\n const tracks = probe$2.tracks(data);\n this.self.postMessage({\n action: 'probeMp4Tracks',\n tracks,\n data\n }, [data.buffer]);\n }\n /**\n * Probes an mp4 segment for EMSG boxes containing ID3 data.\n * https://aomediacodec.github.io/id3-emsg/\n *\n * @param {Uint8Array} data segment data\n * @param {number} offset segment start time\n * @return {Object[]} an array of ID3 frames\n */\n\n probeEmsgID3({\n data,\n offset\n }) {\n const id3Frames = probe$2.getEmsgID3(data, offset);\n this.self.postMessage({\n action: 'probeEmsgID3',\n id3Frames,\n emsgData: data\n }, [data.buffer]);\n }\n /**\n * Probe an mpeg2-ts segment to determine the start time of the segment in it's\n * internal \"media time,\" as well as whether it contains video and/or audio.\n *\n * @private\n * @param {Uint8Array} bytes - segment bytes\n * @param {number} baseStartTime\n * Relative reference timestamp used when adjusting frame timestamps for rollover.\n * This value should be in seconds, as it's converted to a 90khz clock within the\n * function body.\n * @return {Object} The start time of the current segment in \"media time\" as well as\n * whether it contains video and/or audio\n */\n\n probeTs({\n data,\n baseStartTime\n }) {\n const tsStartTime = typeof baseStartTime === 'number' && !isNaN(baseStartTime) ? baseStartTime * clock$2.ONE_SECOND_IN_TS : void 0;\n const timeInfo = tsInspector.inspect(data, tsStartTime);\n let result = null;\n if (timeInfo) {\n result = {\n // each type's time info comes back as an array of 2 times, start and end\n hasVideo: timeInfo.video && timeInfo.video.length === 2 || false,\n hasAudio: timeInfo.audio && timeInfo.audio.length === 2 || false\n };\n if (result.hasVideo) {\n result.videoStart = timeInfo.video[0].ptsTime;\n }\n if (result.hasAudio) {\n result.audioStart = timeInfo.audio[0].ptsTime;\n }\n }\n this.self.postMessage({\n action: 'probeTs',\n result,\n data\n }, [data.buffer]);\n }\n clearAllMp4Captions() {\n if (this.captionParser) {\n this.captionParser.clearAllCaptions();\n }\n }\n clearParsedMp4Captions() {\n if (this.captionParser) {\n this.captionParser.clearParsedCaptions();\n }\n }\n /**\n * Adds data (a ts segment) to the start of the transmuxer pipeline for\n * processing.\n *\n * @param {ArrayBuffer} data data to push into the muxer\n */\n\n push(data) {\n // Cast array buffer to correct type for transmuxer\n const segment = new Uint8Array(data.data, data.byteOffset, data.byteLength);\n this.transmuxer.push(segment);\n }\n /**\n * Recreate the transmuxer so that the next segment added via `push`\n * start with a fresh transmuxer.\n */\n\n reset() {\n this.transmuxer.reset();\n }\n /**\n * Set the value that will be used as the `baseMediaDecodeTime` time for the\n * next segment pushed in. Subsequent segments will have their `baseMediaDecodeTime`\n * set relative to the first based on the PTS values.\n *\n * @param {Object} data used to set the timestamp offset in the muxer\n */\n\n setTimestampOffset(data) {\n const timestampOffset = data.timestampOffset || 0;\n this.transmuxer.setBaseMediaDecodeTime(Math.round(clock$2.secondsToVideoTs(timestampOffset)));\n }\n setAudioAppendStart(data) {\n this.transmuxer.setAudioAppendStart(Math.ceil(clock$2.secondsToVideoTs(data.appendStart)));\n }\n setRemux(data) {\n this.transmuxer.setRemux(data.remux);\n }\n /**\n * Forces the pipeline to finish processing the last segment and emit it's\n * results.\n *\n * @param {Object} data event data, not really used\n */\n\n flush(data) {\n this.transmuxer.flush(); // transmuxed done action is fired after both audio/video pipelines are flushed\n\n self.postMessage({\n action: 'done',\n type: 'transmuxed'\n });\n }\n endTimeline() {\n this.transmuxer.endTimeline(); // transmuxed endedtimeline action is fired after both audio/video pipelines end their\n // timelines\n\n self.postMessage({\n action: 'endedtimeline',\n type: 'transmuxed'\n });\n }\n alignGopsWith(data) {\n this.transmuxer.alignGopsWith(data.gopsToAlignWith.slice());\n }\n }\n /**\n * Our web worker interface so that things can talk to mux.js\n * that will be running in a web worker. the scope is passed to this by\n * webworkify.\n *\n * @param {Object} self the scope for the web worker\n */\n\n self.onmessage = function (event) {\n if (event.data.action === 'init' && event.data.options) {\n this.messageHandlers = new MessageHandlers(self, event.data.options);\n return;\n }\n if (!this.messageHandlers) {\n this.messageHandlers = new MessageHandlers(self);\n }\n if (event.data && event.data.action && event.data.action !== 'init') {\n if (this.messageHandlers[event.data.action]) {\n this.messageHandlers[event.data.action](event.data);\n }\n }\n };\n}));\nvar TransmuxWorker = factory(workerCode$1);\n/* rollup-plugin-worker-factory end for worker!/home/runner/work/http-streaming/http-streaming/src/transmuxer-worker.js */\n\nconst handleData_ = (event, transmuxedData, callback) => {\n const {\n type,\n initSegment,\n captions,\n captionStreams,\n metadata,\n videoFrameDtsTime,\n videoFramePtsTime\n } = event.data.segment;\n transmuxedData.buffer.push({\n captions,\n captionStreams,\n metadata\n });\n const boxes = event.data.segment.boxes || {\n data: event.data.segment.data\n };\n const result = {\n type,\n // cast ArrayBuffer to TypedArray\n data: new Uint8Array(boxes.data, boxes.data.byteOffset, boxes.data.byteLength),\n initSegment: new Uint8Array(initSegment.data, initSegment.byteOffset, initSegment.byteLength)\n };\n if (typeof videoFrameDtsTime !== 'undefined') {\n result.videoFrameDtsTime = videoFrameDtsTime;\n }\n if (typeof videoFramePtsTime !== 'undefined') {\n result.videoFramePtsTime = videoFramePtsTime;\n }\n callback(result);\n};\nconst handleDone_ = ({\n transmuxedData,\n callback\n}) => {\n // Previously we only returned data on data events,\n // not on done events. Clear out the buffer to keep that consistent.\n transmuxedData.buffer = []; // all buffers should have been flushed from the muxer, so start processing anything we\n // have received\n\n callback(transmuxedData);\n};\nconst handleGopInfo_ = (event, transmuxedData) => {\n transmuxedData.gopInfo = event.data.gopInfo;\n};\nconst processTransmux = options => {\n const {\n transmuxer,\n bytes,\n audioAppendStart,\n gopsToAlignWith,\n remux,\n onData,\n onTrackInfo,\n onAudioTimingInfo,\n onVideoTimingInfo,\n onVideoSegmentTimingInfo,\n onAudioSegmentTimingInfo,\n onId3,\n onCaptions,\n onDone,\n onEndedTimeline,\n onTransmuxerLog,\n isEndOfTimeline,\n segment,\n triggerSegmentEventFn\n } = options;\n const transmuxedData = {\n buffer: []\n };\n let waitForEndedTimelineEvent = isEndOfTimeline;\n const handleMessage = event => {\n if (transmuxer.currentTransmux !== options) {\n // disposed\n return;\n }\n if (event.data.action === 'data') {\n handleData_(event, transmuxedData, onData);\n }\n if (event.data.action === 'trackinfo') {\n onTrackInfo(event.data.trackInfo);\n }\n if (event.data.action === 'gopInfo') {\n handleGopInfo_(event, transmuxedData);\n }\n if (event.data.action === 'audioTimingInfo') {\n onAudioTimingInfo(event.data.audioTimingInfo);\n }\n if (event.data.action === 'videoTimingInfo') {\n onVideoTimingInfo(event.data.videoTimingInfo);\n }\n if (event.data.action === 'videoSegmentTimingInfo') {\n onVideoSegmentTimingInfo(event.data.videoSegmentTimingInfo);\n }\n if (event.data.action === 'audioSegmentTimingInfo') {\n onAudioSegmentTimingInfo(event.data.audioSegmentTimingInfo);\n }\n if (event.data.action === 'id3Frame') {\n onId3([event.data.id3Frame], event.data.id3Frame.dispatchType);\n }\n if (event.data.action === 'caption') {\n onCaptions(event.data.caption);\n }\n if (event.data.action === 'endedtimeline') {\n waitForEndedTimelineEvent = false;\n onEndedTimeline();\n }\n if (event.data.action === 'log') {\n onTransmuxerLog(event.data.log);\n } // wait for the transmuxed event since we may have audio and video\n\n if (event.data.type !== 'transmuxed') {\n return;\n } // If the \"endedtimeline\" event has not yet fired, and this segment represents the end\n // of a timeline, that means there may still be data events before the segment\n // processing can be considerred complete. In that case, the final event should be\n // an \"endedtimeline\" event with the type \"transmuxed.\"\n\n if (waitForEndedTimelineEvent) {\n return;\n }\n transmuxer.onmessage = null;\n handleDone_({\n transmuxedData,\n callback: onDone\n });\n /* eslint-disable no-use-before-define */\n\n dequeue(transmuxer);\n /* eslint-enable */\n };\n\n const handleError = () => {\n const error = {\n message: 'Received an error message from the transmuxer worker',\n metadata: {\n errorType: videojs.Error.StreamingFailedToTransmuxSegment,\n segmentInfo: segmentInfoPayload({\n segment\n })\n }\n };\n onDone(null, error);\n };\n transmuxer.onmessage = handleMessage;\n transmuxer.onerror = handleError;\n if (audioAppendStart) {\n transmuxer.postMessage({\n action: 'setAudioAppendStart',\n appendStart: audioAppendStart\n });\n } // allow empty arrays to be passed to clear out GOPs\n\n if (Array.isArray(gopsToAlignWith)) {\n transmuxer.postMessage({\n action: 'alignGopsWith',\n gopsToAlignWith\n });\n }\n if (typeof remux !== 'undefined') {\n transmuxer.postMessage({\n action: 'setRemux',\n remux\n });\n }\n if (bytes.byteLength) {\n const buffer = bytes instanceof ArrayBuffer ? bytes : bytes.buffer;\n const byteOffset = bytes instanceof ArrayBuffer ? 0 : bytes.byteOffset;\n triggerSegmentEventFn({\n type: 'segmenttransmuxingstart',\n segment\n });\n transmuxer.postMessage({\n action: 'push',\n // Send the typed-array of data as an ArrayBuffer so that\n // it can be sent as a \"Transferable\" and avoid the costly\n // memory copy\n data: buffer,\n // To recreate the original typed-array, we need information\n // about what portion of the ArrayBuffer it was a view into\n byteOffset,\n byteLength: bytes.byteLength\n }, [buffer]);\n }\n if (isEndOfTimeline) {\n transmuxer.postMessage({\n action: 'endTimeline'\n });\n } // even if we didn't push any bytes, we have to make sure we flush in case we reached\n // the end of the segment\n\n transmuxer.postMessage({\n action: 'flush'\n });\n};\nconst dequeue = transmuxer => {\n transmuxer.currentTransmux = null;\n if (transmuxer.transmuxQueue.length) {\n transmuxer.currentTransmux = transmuxer.transmuxQueue.shift();\n if (typeof transmuxer.currentTransmux === 'function') {\n transmuxer.currentTransmux();\n } else {\n processTransmux(transmuxer.currentTransmux);\n }\n }\n};\nconst processAction = (transmuxer, action) => {\n transmuxer.postMessage({\n action\n });\n dequeue(transmuxer);\n};\nconst enqueueAction = (action, transmuxer) => {\n if (!transmuxer.currentTransmux) {\n transmuxer.currentTransmux = action;\n processAction(transmuxer, action);\n return;\n }\n transmuxer.transmuxQueue.push(processAction.bind(null, transmuxer, action));\n};\nconst reset = transmuxer => {\n enqueueAction('reset', transmuxer);\n};\nconst endTimeline = transmuxer => {\n enqueueAction('endTimeline', transmuxer);\n};\nconst transmux = options => {\n if (!options.transmuxer.currentTransmux) {\n options.transmuxer.currentTransmux = options;\n processTransmux(options);\n return;\n }\n options.transmuxer.transmuxQueue.push(options);\n};\nconst createTransmuxer = options => {\n const transmuxer = new TransmuxWorker();\n transmuxer.currentTransmux = null;\n transmuxer.transmuxQueue = [];\n const term = transmuxer.terminate;\n transmuxer.terminate = () => {\n transmuxer.currentTransmux = null;\n transmuxer.transmuxQueue.length = 0;\n return term.call(transmuxer);\n };\n transmuxer.postMessage({\n action: 'init',\n options\n });\n return transmuxer;\n};\nvar segmentTransmuxer = {\n reset,\n endTimeline,\n transmux,\n createTransmuxer\n};\nconst workerCallback = function (options) {\n const transmuxer = options.transmuxer;\n const endAction = options.endAction || options.action;\n const callback = options.callback;\n const message = _extends({}, options, {\n endAction: null,\n transmuxer: null,\n callback: null\n });\n const listenForEndEvent = event => {\n if (event.data.action !== endAction) {\n return;\n }\n transmuxer.removeEventListener('message', listenForEndEvent); // transfer ownership of bytes back to us.\n\n if (event.data.data) {\n event.data.data = new Uint8Array(event.data.data, options.byteOffset || 0, options.byteLength || event.data.data.byteLength);\n if (options.data) {\n options.data = event.data.data;\n }\n }\n callback(event.data);\n };\n transmuxer.addEventListener('message', listenForEndEvent);\n if (options.data) {\n const isArrayBuffer = options.data instanceof ArrayBuffer;\n message.byteOffset = isArrayBuffer ? 0 : options.data.byteOffset;\n message.byteLength = options.data.byteLength;\n const transfers = [isArrayBuffer ? options.data : options.data.buffer];\n transmuxer.postMessage(message, transfers);\n } else {\n transmuxer.postMessage(message);\n }\n};\nconst REQUEST_ERRORS = {\n FAILURE: 2,\n TIMEOUT: -101,\n ABORTED: -102\n};\n/**\n * Abort all requests\n *\n * @param {Object} activeXhrs - an object that tracks all XHR requests\n */\n\nconst abortAll = activeXhrs => {\n activeXhrs.forEach(xhr => {\n xhr.abort();\n });\n};\n/**\n * Gather important bandwidth stats once a request has completed\n *\n * @param {Object} request - the XHR request from which to gather stats\n */\n\nconst getRequestStats = request => {\n return {\n bandwidth: request.bandwidth,\n bytesReceived: request.bytesReceived || 0,\n roundTripTime: request.roundTripTime || 0\n };\n};\n/**\n * If possible gather bandwidth stats as a request is in\n * progress\n *\n * @param {Event} progressEvent - an event object from an XHR's progress event\n */\n\nconst getProgressStats = progressEvent => {\n const request = progressEvent.target;\n const roundTripTime = Date.now() - request.requestTime;\n const stats = {\n bandwidth: Infinity,\n bytesReceived: 0,\n roundTripTime: roundTripTime || 0\n };\n stats.bytesReceived = progressEvent.loaded; // This can result in Infinity if stats.roundTripTime is 0 but that is ok\n // because we should only use bandwidth stats on progress to determine when\n // abort a request early due to insufficient bandwidth\n\n stats.bandwidth = Math.floor(stats.bytesReceived / stats.roundTripTime * 8 * 1000);\n return stats;\n};\n/**\n * Handle all error conditions in one place and return an object\n * with all the information\n *\n * @param {Error|null} error - if non-null signals an error occured with the XHR\n * @param {Object} request - the XHR request that possibly generated the error\n */\n\nconst handleErrors = (error, request) => {\n const {\n requestType\n } = request;\n const metadata = getStreamingNetworkErrorMetadata({\n requestType,\n request,\n error\n });\n if (request.timedout) {\n return {\n status: request.status,\n message: 'HLS request timed-out at URL: ' + request.uri,\n code: REQUEST_ERRORS.TIMEOUT,\n xhr: request,\n metadata\n };\n }\n if (request.aborted) {\n return {\n status: request.status,\n message: 'HLS request aborted at URL: ' + request.uri,\n code: REQUEST_ERRORS.ABORTED,\n xhr: request,\n metadata\n };\n }\n if (error) {\n return {\n status: request.status,\n message: 'HLS request errored at URL: ' + request.uri,\n code: REQUEST_ERRORS.FAILURE,\n xhr: request,\n metadata\n };\n }\n if (request.responseType === 'arraybuffer' && request.response.byteLength === 0) {\n return {\n status: request.status,\n message: 'Empty HLS response at URL: ' + request.uri,\n code: REQUEST_ERRORS.FAILURE,\n xhr: request,\n metadata\n };\n }\n return null;\n};\n/**\n * Handle responses for key data and convert the key data to the correct format\n * for the decryption step later\n *\n * @param {Object} segment - a simplified copy of the segmentInfo object\n * from SegmentLoader\n * @param {Array} objects - objects to add the key bytes to.\n * @param {Function} finishProcessingFn - a callback to execute to continue processing\n * this request\n */\n\nconst handleKeyResponse = (segment, objects, finishProcessingFn, triggerSegmentEventFn) => (error, request) => {\n const response = request.response;\n const errorObj = handleErrors(error, request);\n if (errorObj) {\n return finishProcessingFn(errorObj, segment);\n }\n if (response.byteLength !== 16) {\n return finishProcessingFn({\n status: request.status,\n message: 'Invalid HLS key at URL: ' + request.uri,\n code: REQUEST_ERRORS.FAILURE,\n xhr: request\n }, segment);\n }\n const view = new DataView(response);\n const bytes = new Uint32Array([view.getUint32(0), view.getUint32(4), view.getUint32(8), view.getUint32(12)]);\n for (let i = 0; i < objects.length; i++) {\n objects[i].bytes = bytes;\n }\n const keyInfo = {\n uri: request.uri\n };\n triggerSegmentEventFn({\n type: 'segmentkeyloadcomplete',\n segment,\n keyInfo\n });\n return finishProcessingFn(null, segment);\n};\nconst parseInitSegment = (segment, callback) => {\n const type = detectContainerForBytes(segment.map.bytes); // TODO: We should also handle ts init segments here, but we\n // only know how to parse mp4 init segments at the moment\n\n if (type !== 'mp4') {\n const uri = segment.map.resolvedUri || segment.map.uri;\n const mediaType = type || 'unknown';\n return callback({\n internal: true,\n message: `Found unsupported ${mediaType} container for initialization segment at URL: ${uri}`,\n code: REQUEST_ERRORS.FAILURE,\n metadata: {\n mediaType\n }\n });\n }\n workerCallback({\n action: 'probeMp4Tracks',\n data: segment.map.bytes,\n transmuxer: segment.transmuxer,\n callback: ({\n tracks,\n data\n }) => {\n // transfer bytes back to us\n segment.map.bytes = data;\n tracks.forEach(function (track) {\n segment.map.tracks = segment.map.tracks || {}; // only support one track of each type for now\n\n if (segment.map.tracks[track.type]) {\n return;\n }\n segment.map.tracks[track.type] = track;\n if (typeof track.id === 'number' && track.timescale) {\n segment.map.timescales = segment.map.timescales || {};\n segment.map.timescales[track.id] = track.timescale;\n }\n });\n return callback(null);\n }\n });\n};\n/**\n * Handle init-segment responses\n *\n * @param {Object} segment - a simplified copy of the segmentInfo object\n * from SegmentLoader\n * @param {Function} finishProcessingFn - a callback to execute to continue processing\n * this request\n */\n\nconst handleInitSegmentResponse = ({\n segment,\n finishProcessingFn,\n triggerSegmentEventFn\n}) => (error, request) => {\n const errorObj = handleErrors(error, request);\n if (errorObj) {\n return finishProcessingFn(errorObj, segment);\n }\n const bytes = new Uint8Array(request.response);\n triggerSegmentEventFn({\n type: 'segmentloaded',\n segment\n }); // init segment is encypted, we will have to wait\n // until the key request is done to decrypt.\n\n if (segment.map.key) {\n segment.map.encryptedBytes = bytes;\n return finishProcessingFn(null, segment);\n }\n segment.map.bytes = bytes;\n parseInitSegment(segment, function (parseError) {\n if (parseError) {\n parseError.xhr = request;\n parseError.status = request.status;\n return finishProcessingFn(parseError, segment);\n }\n finishProcessingFn(null, segment);\n });\n};\n/**\n * Response handler for segment-requests being sure to set the correct\n * property depending on whether the segment is encryped or not\n * Also records and keeps track of stats that are used for ABR purposes\n *\n * @param {Object} segment - a simplified copy of the segmentInfo object\n * from SegmentLoader\n * @param {Function} finishProcessingFn - a callback to execute to continue processing\n * this request\n */\n\nconst handleSegmentResponse = ({\n segment,\n finishProcessingFn,\n responseType,\n triggerSegmentEventFn\n}) => (error, request) => {\n const errorObj = handleErrors(error, request);\n if (errorObj) {\n return finishProcessingFn(errorObj, segment);\n }\n triggerSegmentEventFn({\n type: 'segmentloaded',\n segment\n });\n const newBytes =\n // although responseText \"should\" exist, this guard serves to prevent an error being\n // thrown for two primary cases:\n // 1. the mime type override stops working, or is not implemented for a specific\n // browser\n // 2. when using mock XHR libraries like sinon that do not allow the override behavior\n responseType === 'arraybuffer' || !request.responseText ? request.response : stringToArrayBuffer(request.responseText.substring(segment.lastReachedChar || 0));\n segment.stats = getRequestStats(request);\n if (segment.key) {\n segment.encryptedBytes = new Uint8Array(newBytes);\n } else {\n segment.bytes = new Uint8Array(newBytes);\n }\n return finishProcessingFn(null, segment);\n};\nconst transmuxAndNotify = ({\n segment,\n bytes,\n trackInfoFn,\n timingInfoFn,\n videoSegmentTimingInfoFn,\n audioSegmentTimingInfoFn,\n id3Fn,\n captionsFn,\n isEndOfTimeline,\n endedTimelineFn,\n dataFn,\n doneFn,\n onTransmuxerLog,\n triggerSegmentEventFn\n}) => {\n const fmp4Tracks = segment.map && segment.map.tracks || {};\n const isMuxed = Boolean(fmp4Tracks.audio && fmp4Tracks.video); // Keep references to each function so we can null them out after we're done with them.\n // One reason for this is that in the case of full segments, we want to trust start\n // times from the probe, rather than the transmuxer.\n\n let audioStartFn = timingInfoFn.bind(null, segment, 'audio', 'start');\n const audioEndFn = timingInfoFn.bind(null, segment, 'audio', 'end');\n let videoStartFn = timingInfoFn.bind(null, segment, 'video', 'start');\n const videoEndFn = timingInfoFn.bind(null, segment, 'video', 'end');\n const finish = () => transmux({\n bytes,\n transmuxer: segment.transmuxer,\n audioAppendStart: segment.audioAppendStart,\n gopsToAlignWith: segment.gopsToAlignWith,\n remux: isMuxed,\n onData: result => {\n result.type = result.type === 'combined' ? 'video' : result.type;\n dataFn(segment, result);\n },\n onTrackInfo: trackInfo => {\n if (trackInfoFn) {\n if (isMuxed) {\n trackInfo.isMuxed = true;\n }\n trackInfoFn(segment, trackInfo);\n }\n },\n onAudioTimingInfo: audioTimingInfo => {\n // we only want the first start value we encounter\n if (audioStartFn && typeof audioTimingInfo.start !== 'undefined') {\n audioStartFn(audioTimingInfo.start);\n audioStartFn = null;\n } // we want to continually update the end time\n\n if (audioEndFn && typeof audioTimingInfo.end !== 'undefined') {\n audioEndFn(audioTimingInfo.end);\n }\n },\n onVideoTimingInfo: videoTimingInfo => {\n // we only want the first start value we encounter\n if (videoStartFn && typeof videoTimingInfo.start !== 'undefined') {\n videoStartFn(videoTimingInfo.start);\n videoStartFn = null;\n } // we want to continually update the end time\n\n if (videoEndFn && typeof videoTimingInfo.end !== 'undefined') {\n videoEndFn(videoTimingInfo.end);\n }\n },\n onVideoSegmentTimingInfo: videoSegmentTimingInfo => {\n const timingInfo = {\n pts: {\n start: videoSegmentTimingInfo.start.presentation,\n end: videoSegmentTimingInfo.end.presentation\n },\n dts: {\n start: videoSegmentTimingInfo.start.decode,\n end: videoSegmentTimingInfo.end.decode\n }\n };\n triggerSegmentEventFn({\n type: 'segmenttransmuxingtiminginfoavailable',\n segment,\n timingInfo\n });\n videoSegmentTimingInfoFn(videoSegmentTimingInfo);\n },\n onAudioSegmentTimingInfo: audioSegmentTimingInfo => {\n const timingInfo = {\n pts: {\n start: audioSegmentTimingInfo.start.pts,\n end: audioSegmentTimingInfo.end.pts\n },\n dts: {\n start: audioSegmentTimingInfo.start.dts,\n end: audioSegmentTimingInfo.end.dts\n }\n };\n triggerSegmentEventFn({\n type: 'segmenttransmuxingtiminginfoavailable',\n segment,\n timingInfo\n });\n audioSegmentTimingInfoFn(audioSegmentTimingInfo);\n },\n onId3: (id3Frames, dispatchType) => {\n id3Fn(segment, id3Frames, dispatchType);\n },\n onCaptions: captions => {\n captionsFn(segment, [captions]);\n },\n isEndOfTimeline,\n onEndedTimeline: () => {\n endedTimelineFn();\n },\n onTransmuxerLog,\n onDone: (result, error) => {\n if (!doneFn) {\n return;\n }\n result.type = result.type === 'combined' ? 'video' : result.type;\n triggerSegmentEventFn({\n type: 'segmenttransmuxingcomplete',\n segment\n });\n doneFn(error, segment, result);\n },\n segment,\n triggerSegmentEventFn\n }); // In the transmuxer, we don't yet have the ability to extract a \"proper\" start time.\n // Meaning cached frame data may corrupt our notion of where this segment\n // really starts. To get around this, probe for the info needed.\n\n workerCallback({\n action: 'probeTs',\n transmuxer: segment.transmuxer,\n data: bytes,\n baseStartTime: segment.baseStartTime,\n callback: data => {\n segment.bytes = bytes = data.data;\n const probeResult = data.result;\n if (probeResult) {\n trackInfoFn(segment, {\n hasAudio: probeResult.hasAudio,\n hasVideo: probeResult.hasVideo,\n isMuxed\n });\n trackInfoFn = null;\n }\n finish();\n }\n });\n};\nconst handleSegmentBytes = ({\n segment,\n bytes,\n trackInfoFn,\n timingInfoFn,\n videoSegmentTimingInfoFn,\n audioSegmentTimingInfoFn,\n id3Fn,\n captionsFn,\n isEndOfTimeline,\n endedTimelineFn,\n dataFn,\n doneFn,\n onTransmuxerLog,\n triggerSegmentEventFn\n}) => {\n let bytesAsUint8Array = new Uint8Array(bytes); // TODO:\n // We should have a handler that fetches the number of bytes required\n // to check if something is fmp4. This will allow us to save bandwidth\n // because we can only exclude a playlist and abort requests\n // by codec after trackinfo triggers.\n\n if (isLikelyFmp4MediaSegment(bytesAsUint8Array)) {\n segment.isFmp4 = true;\n const {\n tracks\n } = segment.map;\n const trackInfo = {\n isFmp4: true,\n hasVideo: !!tracks.video,\n hasAudio: !!tracks.audio\n }; // if we have a audio track, with a codec that is not set to\n // encrypted audio\n\n if (tracks.audio && tracks.audio.codec && tracks.audio.codec !== 'enca') {\n trackInfo.audioCodec = tracks.audio.codec;\n } // if we have a video track, with a codec that is not set to\n // encrypted video\n\n if (tracks.video && tracks.video.codec && tracks.video.codec !== 'encv') {\n trackInfo.videoCodec = tracks.video.codec;\n }\n if (tracks.video && tracks.audio) {\n trackInfo.isMuxed = true;\n } // since we don't support appending fmp4 data on progress, we know we have the full\n // segment here\n\n trackInfoFn(segment, trackInfo); // The probe doesn't provide the segment end time, so only callback with the start\n // time. The end time can be roughly calculated by the receiver using the duration.\n //\n // Note that the start time returned by the probe reflects the baseMediaDecodeTime, as\n // that is the true start of the segment (where the playback engine should begin\n // decoding).\n\n const finishLoading = (captions, id3Frames) => {\n // if the track still has audio at this point it is only possible\n // for it to be audio only. See `tracks.video && tracks.audio` if statement\n // above.\n // we make sure to use segment.bytes here as that\n dataFn(segment, {\n data: bytesAsUint8Array,\n type: trackInfo.hasAudio && !trackInfo.isMuxed ? 'audio' : 'video'\n });\n if (id3Frames && id3Frames.length) {\n id3Fn(segment, id3Frames);\n }\n if (captions && captions.length) {\n captionsFn(segment, captions);\n }\n doneFn(null, segment, {});\n };\n workerCallback({\n action: 'probeMp4StartTime',\n timescales: segment.map.timescales,\n data: bytesAsUint8Array,\n transmuxer: segment.transmuxer,\n callback: ({\n data,\n startTime\n }) => {\n // transfer bytes back to us\n bytes = data.buffer;\n segment.bytes = bytesAsUint8Array = data;\n if (trackInfo.hasAudio && !trackInfo.isMuxed) {\n timingInfoFn(segment, 'audio', 'start', startTime);\n }\n if (trackInfo.hasVideo) {\n timingInfoFn(segment, 'video', 'start', startTime);\n }\n workerCallback({\n action: 'probeEmsgID3',\n data: bytesAsUint8Array,\n transmuxer: segment.transmuxer,\n offset: startTime,\n callback: ({\n emsgData,\n id3Frames\n }) => {\n // transfer bytes back to us\n bytes = emsgData.buffer;\n segment.bytes = bytesAsUint8Array = emsgData; // Run through the CaptionParser in case there are captions.\n // Initialize CaptionParser if it hasn't been yet\n\n if (!tracks.video || !emsgData.byteLength || !segment.transmuxer) {\n finishLoading(undefined, id3Frames);\n return;\n }\n workerCallback({\n action: 'pushMp4Captions',\n endAction: 'mp4Captions',\n transmuxer: segment.transmuxer,\n data: bytesAsUint8Array,\n timescales: segment.map.timescales,\n trackIds: [tracks.video.id],\n callback: message => {\n // transfer bytes back to us\n bytes = message.data.buffer;\n segment.bytes = bytesAsUint8Array = message.data;\n message.logs.forEach(function (log) {\n onTransmuxerLog(merge(log, {\n stream: 'mp4CaptionParser'\n }));\n });\n finishLoading(message.captions, id3Frames);\n }\n });\n }\n });\n }\n });\n return;\n } // VTT or other segments that don't need processing\n\n if (!segment.transmuxer) {\n doneFn(null, segment, {});\n return;\n }\n if (typeof segment.container === 'undefined') {\n segment.container = detectContainerForBytes(bytesAsUint8Array);\n }\n if (segment.container !== 'ts' && segment.container !== 'aac') {\n trackInfoFn(segment, {\n hasAudio: false,\n hasVideo: false\n });\n doneFn(null, segment, {});\n return;\n } // ts or aac\n\n transmuxAndNotify({\n segment,\n bytes,\n trackInfoFn,\n timingInfoFn,\n videoSegmentTimingInfoFn,\n audioSegmentTimingInfoFn,\n id3Fn,\n captionsFn,\n isEndOfTimeline,\n endedTimelineFn,\n dataFn,\n doneFn,\n onTransmuxerLog,\n triggerSegmentEventFn\n });\n};\nconst decrypt = function ({\n id,\n key,\n encryptedBytes,\n decryptionWorker,\n segment,\n doneFn\n}, callback) {\n const decryptionHandler = event => {\n if (event.data.source === id) {\n decryptionWorker.removeEventListener('message', decryptionHandler);\n const decrypted = event.data.decrypted;\n callback(new Uint8Array(decrypted.bytes, decrypted.byteOffset, decrypted.byteLength));\n }\n };\n decryptionWorker.onerror = () => {\n const message = 'An error occurred in the decryption worker';\n const segmentInfo = segmentInfoPayload({\n segment\n });\n const decryptError = {\n message,\n metadata: {\n error: new Error(message),\n errorType: videojs.Error.StreamingFailedToDecryptSegment,\n segmentInfo,\n keyInfo: {\n uri: segment.key.resolvedUri || segment.map.key.resolvedUri\n }\n }\n };\n doneFn(decryptError, segment);\n };\n decryptionWorker.addEventListener('message', decryptionHandler);\n let keyBytes;\n if (key.bytes.slice) {\n keyBytes = key.bytes.slice();\n } else {\n keyBytes = new Uint32Array(Array.prototype.slice.call(key.bytes));\n } // incrementally decrypt the bytes\n\n decryptionWorker.postMessage(createTransferableMessage({\n source: id,\n encrypted: encryptedBytes,\n key: keyBytes,\n iv: key.iv\n }), [encryptedBytes.buffer, keyBytes.buffer]);\n};\n/**\n * Decrypt the segment via the decryption web worker\n *\n * @param {WebWorker} decryptionWorker - a WebWorker interface to AES-128 decryption\n * routines\n * @param {Object} segment - a simplified copy of the segmentInfo object\n * from SegmentLoader\n * @param {Function} trackInfoFn - a callback that receives track info\n * @param {Function} timingInfoFn - a callback that receives timing info\n * @param {Function} videoSegmentTimingInfoFn\n * a callback that receives video timing info based on media times and\n * any adjustments made by the transmuxer\n * @param {Function} audioSegmentTimingInfoFn\n * a callback that receives audio timing info based on media times and\n * any adjustments made by the transmuxer\n * @param {boolean} isEndOfTimeline\n * true if this segment represents the last segment in a timeline\n * @param {Function} endedTimelineFn\n * a callback made when a timeline is ended, will only be called if\n * isEndOfTimeline is true\n * @param {Function} dataFn - a callback that is executed when segment bytes are available\n * and ready to use\n * @param {Function} doneFn - a callback that is executed after decryption has completed\n */\n\nconst decryptSegment = ({\n decryptionWorker,\n segment,\n trackInfoFn,\n timingInfoFn,\n videoSegmentTimingInfoFn,\n audioSegmentTimingInfoFn,\n id3Fn,\n captionsFn,\n isEndOfTimeline,\n endedTimelineFn,\n dataFn,\n doneFn,\n onTransmuxerLog,\n triggerSegmentEventFn\n}) => {\n triggerSegmentEventFn({\n type: 'segmentdecryptionstart'\n });\n decrypt({\n id: segment.requestId,\n key: segment.key,\n encryptedBytes: segment.encryptedBytes,\n decryptionWorker,\n segment,\n doneFn\n }, decryptedBytes => {\n segment.bytes = decryptedBytes;\n triggerSegmentEventFn({\n type: 'segmentdecryptioncomplete',\n segment\n });\n handleSegmentBytes({\n segment,\n bytes: segment.bytes,\n trackInfoFn,\n timingInfoFn,\n videoSegmentTimingInfoFn,\n audioSegmentTimingInfoFn,\n id3Fn,\n captionsFn,\n isEndOfTimeline,\n endedTimelineFn,\n dataFn,\n doneFn,\n onTransmuxerLog,\n triggerSegmentEventFn\n });\n });\n};\n/**\n * This function waits for all XHRs to finish (with either success or failure)\n * before continueing processing via it's callback. The function gathers errors\n * from each request into a single errors array so that the error status for\n * each request can be examined later.\n *\n * @param {Object} activeXhrs - an object that tracks all XHR requests\n * @param {WebWorker} decryptionWorker - a WebWorker interface to AES-128 decryption\n * routines\n * @param {Function} trackInfoFn - a callback that receives track info\n * @param {Function} timingInfoFn - a callback that receives timing info\n * @param {Function} videoSegmentTimingInfoFn\n * a callback that receives video timing info based on media times and\n * any adjustments made by the transmuxer\n * @param {Function} audioSegmentTimingInfoFn\n * a callback that receives audio timing info based on media times and\n * any adjustments made by the transmuxer\n * @param {Function} id3Fn - a callback that receives ID3 metadata\n * @param {Function} captionsFn - a callback that receives captions\n * @param {boolean} isEndOfTimeline\n * true if this segment represents the last segment in a timeline\n * @param {Function} endedTimelineFn\n * a callback made when a timeline is ended, will only be called if\n * isEndOfTimeline is true\n * @param {Function} dataFn - a callback that is executed when segment bytes are available\n * and ready to use\n * @param {Function} doneFn - a callback that is executed after all resources have been\n * downloaded and any decryption completed\n */\n\nconst waitForCompletion = ({\n activeXhrs,\n decryptionWorker,\n trackInfoFn,\n timingInfoFn,\n videoSegmentTimingInfoFn,\n audioSegmentTimingInfoFn,\n id3Fn,\n captionsFn,\n isEndOfTimeline,\n endedTimelineFn,\n dataFn,\n doneFn,\n onTransmuxerLog,\n triggerSegmentEventFn\n}) => {\n let count = 0;\n let didError = false;\n return (error, segment) => {\n if (didError) {\n return;\n }\n if (error) {\n didError = true; // If there are errors, we have to abort any outstanding requests\n\n abortAll(activeXhrs); // Even though the requests above are aborted, and in theory we could wait until we\n // handle the aborted events from those requests, there are some cases where we may\n // never get an aborted event. For instance, if the network connection is lost and\n // there were two requests, the first may have triggered an error immediately, while\n // the second request remains unsent. In that case, the aborted algorithm will not\n // trigger an abort: see https://xhr.spec.whatwg.org/#the-abort()-method\n //\n // We also can't rely on the ready state of the XHR, since the request that\n // triggered the connection error may also show as a ready state of 0 (unsent).\n // Therefore, we have to finish this group of requests immediately after the first\n // seen error.\n\n return doneFn(error, segment);\n }\n count += 1;\n if (count === activeXhrs.length) {\n const segmentFinish = function () {\n if (segment.encryptedBytes) {\n return decryptSegment({\n decryptionWorker,\n segment,\n trackInfoFn,\n timingInfoFn,\n videoSegmentTimingInfoFn,\n audioSegmentTimingInfoFn,\n id3Fn,\n captionsFn,\n isEndOfTimeline,\n endedTimelineFn,\n dataFn,\n doneFn,\n onTransmuxerLog,\n triggerSegmentEventFn\n });\n } // Otherwise, everything is ready just continue\n\n handleSegmentBytes({\n segment,\n bytes: segment.bytes,\n trackInfoFn,\n timingInfoFn,\n videoSegmentTimingInfoFn,\n audioSegmentTimingInfoFn,\n id3Fn,\n captionsFn,\n isEndOfTimeline,\n endedTimelineFn,\n dataFn,\n doneFn,\n onTransmuxerLog,\n triggerSegmentEventFn\n });\n }; // Keep track of when *all* of the requests have completed\n\n segment.endOfAllRequests = Date.now();\n if (segment.map && segment.map.encryptedBytes && !segment.map.bytes) {\n triggerSegmentEventFn({\n type: 'segmentdecryptionstart',\n segment\n });\n return decrypt({\n decryptionWorker,\n // add -init to the \"id\" to differentiate between segment\n // and init segment decryption, just in case they happen\n // at the same time at some point in the future.\n id: segment.requestId + '-init',\n encryptedBytes: segment.map.encryptedBytes,\n key: segment.map.key,\n segment,\n doneFn\n }, decryptedBytes => {\n segment.map.bytes = decryptedBytes;\n triggerSegmentEventFn({\n type: 'segmentdecryptioncomplete',\n segment\n });\n parseInitSegment(segment, parseError => {\n if (parseError) {\n abortAll(activeXhrs);\n return doneFn(parseError, segment);\n }\n segmentFinish();\n });\n });\n }\n segmentFinish();\n }\n };\n};\n/**\n * Calls the abort callback if any request within the batch was aborted. Will only call\n * the callback once per batch of requests, even if multiple were aborted.\n *\n * @param {Object} loadendState - state to check to see if the abort function was called\n * @param {Function} abortFn - callback to call for abort\n */\n\nconst handleLoadEnd = ({\n loadendState,\n abortFn\n}) => event => {\n const request = event.target;\n if (request.aborted && abortFn && !loadendState.calledAbortFn) {\n abortFn();\n loadendState.calledAbortFn = true;\n }\n};\n/**\n * Simple progress event callback handler that gathers some stats before\n * executing a provided callback with the `segment` object\n *\n * @param {Object} segment - a simplified copy of the segmentInfo object\n * from SegmentLoader\n * @param {Function} progressFn - a callback that is executed each time a progress event\n * is received\n * @param {Function} trackInfoFn - a callback that receives track info\n * @param {Function} timingInfoFn - a callback that receives timing info\n * @param {Function} videoSegmentTimingInfoFn\n * a callback that receives video timing info based on media times and\n * any adjustments made by the transmuxer\n * @param {Function} audioSegmentTimingInfoFn\n * a callback that receives audio timing info based on media times and\n * any adjustments made by the transmuxer\n * @param {boolean} isEndOfTimeline\n * true if this segment represents the last segment in a timeline\n * @param {Function} endedTimelineFn\n * a callback made when a timeline is ended, will only be called if\n * isEndOfTimeline is true\n * @param {Function} dataFn - a callback that is executed when segment bytes are available\n * and ready to use\n * @param {Event} event - the progress event object from XMLHttpRequest\n */\n\nconst handleProgress = ({\n segment,\n progressFn,\n trackInfoFn,\n timingInfoFn,\n videoSegmentTimingInfoFn,\n audioSegmentTimingInfoFn,\n id3Fn,\n captionsFn,\n isEndOfTimeline,\n endedTimelineFn,\n dataFn\n}) => event => {\n const request = event.target;\n if (request.aborted) {\n return;\n }\n segment.stats = merge(segment.stats, getProgressStats(event)); // record the time that we receive the first byte of data\n\n if (!segment.stats.firstBytesReceivedAt && segment.stats.bytesReceived) {\n segment.stats.firstBytesReceivedAt = Date.now();\n }\n return progressFn(event, segment);\n};\n/**\n * Load all resources and does any processing necessary for a media-segment\n *\n * Features:\n * decrypts the media-segment if it has a key uri and an iv\n * aborts *all* requests if *any* one request fails\n *\n * The segment object, at minimum, has the following format:\n * {\n * resolvedUri: String,\n * [transmuxer]: Object,\n * [byterange]: {\n * offset: Number,\n * length: Number\n * },\n * [key]: {\n * resolvedUri: String\n * [byterange]: {\n * offset: Number,\n * length: Number\n * },\n * iv: {\n * bytes: Uint32Array\n * }\n * },\n * [map]: {\n * resolvedUri: String,\n * [byterange]: {\n * offset: Number,\n * length: Number\n * },\n * [bytes]: Uint8Array\n * }\n * }\n * ...where [name] denotes optional properties\n *\n * @param {Function} xhr - an instance of the xhr wrapper in xhr.js\n * @param {Object} xhrOptions - the base options to provide to all xhr requests\n * @param {WebWorker} decryptionWorker - a WebWorker interface to AES-128\n * decryption routines\n * @param {Object} segment - a simplified copy of the segmentInfo object\n * from SegmentLoader\n * @param {Function} abortFn - a callback called (only once) if any piece of a request was\n * aborted\n * @param {Function} progressFn - a callback that receives progress events from the main\n * segment's xhr request\n * @param {Function} trackInfoFn - a callback that receives track info\n * @param {Function} timingInfoFn - a callback that receives timing info\n * @param {Function} videoSegmentTimingInfoFn\n * a callback that receives video timing info based on media times and\n * any adjustments made by the transmuxer\n * @param {Function} audioSegmentTimingInfoFn\n * a callback that receives audio timing info based on media times and\n * any adjustments made by the transmuxer\n * @param {Function} id3Fn - a callback that receives ID3 metadata\n * @param {Function} captionsFn - a callback that receives captions\n * @param {boolean} isEndOfTimeline\n * true if this segment represents the last segment in a timeline\n * @param {Function} endedTimelineFn\n * a callback made when a timeline is ended, will only be called if\n * isEndOfTimeline is true\n * @param {Function} dataFn - a callback that receives data from the main segment's xhr\n * request, transmuxed if needed\n * @param {Function} doneFn - a callback that is executed only once all requests have\n * succeeded or failed\n * @return {Function} a function that, when invoked, immediately aborts all\n * outstanding requests\n */\n\nconst mediaSegmentRequest = ({\n xhr,\n xhrOptions,\n decryptionWorker,\n segment,\n abortFn,\n progressFn,\n trackInfoFn,\n timingInfoFn,\n videoSegmentTimingInfoFn,\n audioSegmentTimingInfoFn,\n id3Fn,\n captionsFn,\n isEndOfTimeline,\n endedTimelineFn,\n dataFn,\n doneFn,\n onTransmuxerLog,\n triggerSegmentEventFn\n}) => {\n const activeXhrs = [];\n const finishProcessingFn = waitForCompletion({\n activeXhrs,\n decryptionWorker,\n trackInfoFn,\n timingInfoFn,\n videoSegmentTimingInfoFn,\n audioSegmentTimingInfoFn,\n id3Fn,\n captionsFn,\n isEndOfTimeline,\n endedTimelineFn,\n dataFn,\n doneFn,\n onTransmuxerLog,\n triggerSegmentEventFn\n }); // optionally, request the decryption key\n\n if (segment.key && !segment.key.bytes) {\n const objects = [segment.key];\n if (segment.map && !segment.map.bytes && segment.map.key && segment.map.key.resolvedUri === segment.key.resolvedUri) {\n objects.push(segment.map.key);\n }\n const keyRequestOptions = merge(xhrOptions, {\n uri: segment.key.resolvedUri,\n responseType: 'arraybuffer',\n requestType: 'segment-key'\n });\n const keyRequestCallback = handleKeyResponse(segment, objects, finishProcessingFn, triggerSegmentEventFn);\n const keyInfo = {\n uri: segment.key.resolvedUri\n };\n triggerSegmentEventFn({\n type: 'segmentkeyloadstart',\n segment,\n keyInfo\n });\n const keyXhr = xhr(keyRequestOptions, keyRequestCallback);\n activeXhrs.push(keyXhr);\n } // optionally, request the associated media init segment\n\n if (segment.map && !segment.map.bytes) {\n const differentMapKey = segment.map.key && (!segment.key || segment.key.resolvedUri !== segment.map.key.resolvedUri);\n if (differentMapKey) {\n const mapKeyRequestOptions = merge(xhrOptions, {\n uri: segment.map.key.resolvedUri,\n responseType: 'arraybuffer',\n requestType: 'segment-key'\n });\n const mapKeyRequestCallback = handleKeyResponse(segment, [segment.map.key], finishProcessingFn, triggerSegmentEventFn);\n const keyInfo = {\n uri: segment.map.key.resolvedUri\n };\n triggerSegmentEventFn({\n type: 'segmentkeyloadstart',\n segment,\n keyInfo\n });\n const mapKeyXhr = xhr(mapKeyRequestOptions, mapKeyRequestCallback);\n activeXhrs.push(mapKeyXhr);\n }\n const initSegmentOptions = merge(xhrOptions, {\n uri: segment.map.resolvedUri,\n responseType: 'arraybuffer',\n headers: segmentXhrHeaders(segment.map),\n requestType: 'segment-media-initialization'\n });\n const initSegmentRequestCallback = handleInitSegmentResponse({\n segment,\n finishProcessingFn,\n triggerSegmentEventFn\n });\n triggerSegmentEventFn({\n type: 'segmentloadstart',\n segment\n });\n const initSegmentXhr = xhr(initSegmentOptions, initSegmentRequestCallback);\n activeXhrs.push(initSegmentXhr);\n }\n const segmentRequestOptions = merge(xhrOptions, {\n uri: segment.part && segment.part.resolvedUri || segment.resolvedUri,\n responseType: 'arraybuffer',\n headers: segmentXhrHeaders(segment),\n requestType: 'segment'\n });\n const segmentRequestCallback = handleSegmentResponse({\n segment,\n finishProcessingFn,\n responseType: segmentRequestOptions.responseType,\n triggerSegmentEventFn\n });\n triggerSegmentEventFn({\n type: 'segmentloadstart',\n segment\n });\n const segmentXhr = xhr(segmentRequestOptions, segmentRequestCallback);\n segmentXhr.addEventListener('progress', handleProgress({\n segment,\n progressFn,\n trackInfoFn,\n timingInfoFn,\n videoSegmentTimingInfoFn,\n audioSegmentTimingInfoFn,\n id3Fn,\n captionsFn,\n isEndOfTimeline,\n endedTimelineFn,\n dataFn\n }));\n activeXhrs.push(segmentXhr); // since all parts of the request must be considered, but should not make callbacks\n // multiple times, provide a shared state object\n\n const loadendState = {};\n activeXhrs.forEach(activeXhr => {\n activeXhr.addEventListener('loadend', handleLoadEnd({\n loadendState,\n abortFn\n }));\n });\n return () => abortAll(activeXhrs);\n};\n\n/**\n * @file - codecs.js - Handles tasks regarding codec strings such as translating them to\n * codec strings, or translating codec strings into objects that can be examined.\n */\nconst logFn$1 = logger('CodecUtils');\n/**\n * Returns a set of codec strings parsed from the playlist or the default\n * codec strings if no codecs were specified in the playlist\n *\n * @param {Playlist} media the current media playlist\n * @return {Object} an object with the video and audio codecs\n */\n\nconst getCodecs = function (media) {\n // if the codecs were explicitly specified, use them instead of the\n // defaults\n const mediaAttributes = media.attributes || {};\n if (mediaAttributes.CODECS) {\n return parseCodecs(mediaAttributes.CODECS);\n }\n};\nconst isMaat = (main, media) => {\n const mediaAttributes = media.attributes || {};\n return main && main.mediaGroups && main.mediaGroups.AUDIO && mediaAttributes.AUDIO && main.mediaGroups.AUDIO[mediaAttributes.AUDIO];\n};\nconst isMuxed = (main, media) => {\n if (!isMaat(main, media)) {\n return true;\n }\n const mediaAttributes = media.attributes || {};\n const audioGroup = main.mediaGroups.AUDIO[mediaAttributes.AUDIO];\n for (const groupId in audioGroup) {\n // If an audio group has a URI (the case for HLS, as HLS will use external playlists),\n // or there are listed playlists (the case for DASH, as the manifest will have already\n // provided all of the details necessary to generate the audio playlist, as opposed to\n // HLS' externally requested playlists), then the content is demuxed.\n if (!audioGroup[groupId].uri && !audioGroup[groupId].playlists) {\n return true;\n }\n }\n return false;\n};\nconst unwrapCodecList = function (codecList) {\n const codecs = {};\n codecList.forEach(({\n mediaType,\n type,\n details\n }) => {\n codecs[mediaType] = codecs[mediaType] || [];\n codecs[mediaType].push(translateLegacyCodec(`${type}${details}`));\n });\n Object.keys(codecs).forEach(function (mediaType) {\n if (codecs[mediaType].length > 1) {\n logFn$1(`multiple ${mediaType} codecs found as attributes: ${codecs[mediaType].join(', ')}. Setting playlist codecs to null so that we wait for mux.js to probe segments for real codecs.`);\n codecs[mediaType] = null;\n return;\n }\n codecs[mediaType] = codecs[mediaType][0];\n });\n return codecs;\n};\nconst codecCount = function (codecObj) {\n let count = 0;\n if (codecObj.audio) {\n count++;\n }\n if (codecObj.video) {\n count++;\n }\n return count;\n};\n/**\n * Calculates the codec strings for a working configuration of\n * SourceBuffers to play variant streams in a main playlist. If\n * there is no possible working configuration, an empty object will be\n * returned.\n *\n * @param main {Object} the m3u8 object for the main playlist\n * @param media {Object} the m3u8 object for the variant playlist\n * @return {Object} the codec strings.\n *\n * @private\n */\n\nconst codecsForPlaylist = function (main, media) {\n const mediaAttributes = media.attributes || {};\n const codecInfo = unwrapCodecList(getCodecs(media) || []); // HLS with multiple-audio tracks must always get an audio codec.\n // Put another way, there is no way to have a video-only multiple-audio HLS!\n\n if (isMaat(main, media) && !codecInfo.audio) {\n if (!isMuxed(main, media)) {\n // It is possible for codecs to be specified on the audio media group playlist but\n // not on the rendition playlist. This is mostly the case for DASH, where audio and\n // video are always separate (and separately specified).\n const defaultCodecs = unwrapCodecList(codecsFromDefault(main, mediaAttributes.AUDIO) || []);\n if (defaultCodecs.audio) {\n codecInfo.audio = defaultCodecs.audio;\n }\n }\n }\n return codecInfo;\n};\nconst logFn = logger('PlaylistSelector');\nconst representationToString = function (representation) {\n if (!representation || !representation.playlist) {\n return;\n }\n const playlist = representation.playlist;\n return JSON.stringify({\n id: playlist.id,\n bandwidth: representation.bandwidth,\n width: representation.width,\n height: representation.height,\n codecs: playlist.attributes && playlist.attributes.CODECS || ''\n });\n}; // Utilities\n\n/**\n * Returns the CSS value for the specified property on an element\n * using `getComputedStyle`. Firefox has a long-standing issue where\n * getComputedStyle() may return null when running in an iframe with\n * `display: none`.\n *\n * @see https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n * @param {HTMLElement} el the htmlelement to work on\n * @param {string} the proprety to get the style for\n */\n\nconst safeGetComputedStyle = function (el, property) {\n if (!el) {\n return '';\n }\n const result = window$1.getComputedStyle(el);\n if (!result) {\n return '';\n }\n return result[property];\n};\n/**\n * Resuable stable sort function\n *\n * @param {Playlists} array\n * @param {Function} sortFn Different comparators\n * @function stableSort\n */\n\nconst stableSort = function (array, sortFn) {\n const newArray = array.slice();\n array.sort(function (left, right) {\n const cmp = sortFn(left, right);\n if (cmp === 0) {\n return newArray.indexOf(left) - newArray.indexOf(right);\n }\n return cmp;\n });\n};\n/**\n * A comparator function to sort two playlist object by bandwidth.\n *\n * @param {Object} left a media playlist object\n * @param {Object} right a media playlist object\n * @return {number} Greater than zero if the bandwidth attribute of\n * left is greater than the corresponding attribute of right. Less\n * than zero if the bandwidth of right is greater than left and\n * exactly zero if the two are equal.\n */\n\nconst comparePlaylistBandwidth = function (left, right) {\n let leftBandwidth;\n let rightBandwidth;\n if (left.attributes.BANDWIDTH) {\n leftBandwidth = left.attributes.BANDWIDTH;\n }\n leftBandwidth = leftBandwidth || window$1.Number.MAX_VALUE;\n if (right.attributes.BANDWIDTH) {\n rightBandwidth = right.attributes.BANDWIDTH;\n }\n rightBandwidth = rightBandwidth || window$1.Number.MAX_VALUE;\n return leftBandwidth - rightBandwidth;\n};\n/**\n * A comparator function to sort two playlist object by resolution (width).\n *\n * @param {Object} left a media playlist object\n * @param {Object} right a media playlist object\n * @return {number} Greater than zero if the resolution.width attribute of\n * left is greater than the corresponding attribute of right. Less\n * than zero if the resolution.width of right is greater than left and\n * exactly zero if the two are equal.\n */\n\nconst comparePlaylistResolution = function (left, right) {\n let leftWidth;\n let rightWidth;\n if (left.attributes.RESOLUTION && left.attributes.RESOLUTION.width) {\n leftWidth = left.attributes.RESOLUTION.width;\n }\n leftWidth = leftWidth || window$1.Number.MAX_VALUE;\n if (right.attributes.RESOLUTION && right.attributes.RESOLUTION.width) {\n rightWidth = right.attributes.RESOLUTION.width;\n }\n rightWidth = rightWidth || window$1.Number.MAX_VALUE; // NOTE - Fallback to bandwidth sort as appropriate in cases where multiple renditions\n // have the same media dimensions/ resolution\n\n if (leftWidth === rightWidth && left.attributes.BANDWIDTH && right.attributes.BANDWIDTH) {\n return left.attributes.BANDWIDTH - right.attributes.BANDWIDTH;\n }\n return leftWidth - rightWidth;\n};\n/**\n * Chooses the appropriate media playlist based on bandwidth and player size\n *\n * @param {Object} main\n * Object representation of the main manifest\n * @param {number} playerBandwidth\n * Current calculated bandwidth of the player\n * @param {number} playerWidth\n * Current width of the player element (should account for the device pixel ratio)\n * @param {number} playerHeight\n * Current height of the player element (should account for the device pixel ratio)\n * @param {boolean} limitRenditionByPlayerDimensions\n * True if the player width and height should be used during the selection, false otherwise\n * @param {Object} playlistController\n * the current playlistController object\n * @return {Playlist} the highest bitrate playlist less than the\n * currently detected bandwidth, accounting for some amount of\n * bandwidth variance\n */\n\nlet simpleSelector = function (main, playerBandwidth, playerWidth, playerHeight, limitRenditionByPlayerDimensions, playlistController) {\n // If we end up getting called before `main` is available, exit early\n if (!main) {\n return;\n }\n const options = {\n bandwidth: playerBandwidth,\n width: playerWidth,\n height: playerHeight,\n limitRenditionByPlayerDimensions\n };\n let playlists = main.playlists; // if playlist is audio only, select between currently active audio group playlists.\n\n if (Playlist.isAudioOnly(main)) {\n playlists = playlistController.getAudioTrackPlaylists_(); // add audioOnly to options so that we log audioOnly: true\n // at the buttom of this function for debugging.\n\n options.audioOnly = true;\n } // convert the playlists to an intermediary representation to make comparisons easier\n\n let sortedPlaylistReps = playlists.map(playlist => {\n let bandwidth;\n const width = playlist.attributes && playlist.attributes.RESOLUTION && playlist.attributes.RESOLUTION.width;\n const height = playlist.attributes && playlist.attributes.RESOLUTION && playlist.attributes.RESOLUTION.height;\n bandwidth = playlist.attributes && playlist.attributes.BANDWIDTH;\n bandwidth = bandwidth || window$1.Number.MAX_VALUE;\n return {\n bandwidth,\n width,\n height,\n playlist\n };\n });\n stableSort(sortedPlaylistReps, (left, right) => left.bandwidth - right.bandwidth); // filter out any playlists that have been excluded due to\n // incompatible configurations\n\n sortedPlaylistReps = sortedPlaylistReps.filter(rep => !Playlist.isIncompatible(rep.playlist)); // filter out any playlists that have been disabled manually through the representations\n // api or excluded temporarily due to playback errors.\n\n let enabledPlaylistReps = sortedPlaylistReps.filter(rep => Playlist.isEnabled(rep.playlist));\n if (!enabledPlaylistReps.length) {\n // if there are no enabled playlists, then they have all been excluded or disabled\n // by the user through the representations api. In this case, ignore exclusion and\n // fallback to what the user wants by using playlists the user has not disabled.\n enabledPlaylistReps = sortedPlaylistReps.filter(rep => !Playlist.isDisabled(rep.playlist));\n } // filter out any variant that has greater effective bitrate\n // than the current estimated bandwidth\n\n const bandwidthPlaylistReps = enabledPlaylistReps.filter(rep => rep.bandwidth * Config.BANDWIDTH_VARIANCE < playerBandwidth);\n let highestRemainingBandwidthRep = bandwidthPlaylistReps[bandwidthPlaylistReps.length - 1]; // get all of the renditions with the same (highest) bandwidth\n // and then taking the very first element\n\n const bandwidthBestRep = bandwidthPlaylistReps.filter(rep => rep.bandwidth === highestRemainingBandwidthRep.bandwidth)[0]; // if we're not going to limit renditions by player size, make an early decision.\n\n if (limitRenditionByPlayerDimensions === false) {\n const chosenRep = bandwidthBestRep || enabledPlaylistReps[0] || sortedPlaylistReps[0];\n if (chosenRep && chosenRep.playlist) {\n let type = 'sortedPlaylistReps';\n if (bandwidthBestRep) {\n type = 'bandwidthBestRep';\n }\n if (enabledPlaylistReps[0]) {\n type = 'enabledPlaylistReps';\n }\n logFn(`choosing ${representationToString(chosenRep)} using ${type} with options`, options);\n return chosenRep.playlist;\n }\n logFn('could not choose a playlist with options', options);\n return null;\n } // filter out playlists without resolution information\n\n const haveResolution = bandwidthPlaylistReps.filter(rep => rep.width && rep.height); // sort variants by resolution\n\n stableSort(haveResolution, (left, right) => left.width - right.width); // if we have the exact resolution as the player use it\n\n const resolutionBestRepList = haveResolution.filter(rep => rep.width === playerWidth && rep.height === playerHeight);\n highestRemainingBandwidthRep = resolutionBestRepList[resolutionBestRepList.length - 1]; // ensure that we pick the highest bandwidth variant that have exact resolution\n\n const resolutionBestRep = resolutionBestRepList.filter(rep => rep.bandwidth === highestRemainingBandwidthRep.bandwidth)[0];\n let resolutionPlusOneList;\n let resolutionPlusOneSmallest;\n let resolutionPlusOneRep; // find the smallest variant that is larger than the player\n // if there is no match of exact resolution\n\n if (!resolutionBestRep) {\n resolutionPlusOneList = haveResolution.filter(rep => rep.width > playerWidth || rep.height > playerHeight); // find all the variants have the same smallest resolution\n\n resolutionPlusOneSmallest = resolutionPlusOneList.filter(rep => rep.width === resolutionPlusOneList[0].width && rep.height === resolutionPlusOneList[0].height); // ensure that we also pick the highest bandwidth variant that\n // is just-larger-than the video player\n\n highestRemainingBandwidthRep = resolutionPlusOneSmallest[resolutionPlusOneSmallest.length - 1];\n resolutionPlusOneRep = resolutionPlusOneSmallest.filter(rep => rep.bandwidth === highestRemainingBandwidthRep.bandwidth)[0];\n }\n let leastPixelDiffRep; // If this selector proves to be better than others,\n // resolutionPlusOneRep and resolutionBestRep and all\n // the code involving them should be removed.\n\n if (playlistController.leastPixelDiffSelector) {\n // find the variant that is closest to the player's pixel size\n const leastPixelDiffList = haveResolution.map(rep => {\n rep.pixelDiff = Math.abs(rep.width - playerWidth) + Math.abs(rep.height - playerHeight);\n return rep;\n }); // get the highest bandwidth, closest resolution playlist\n\n stableSort(leastPixelDiffList, (left, right) => {\n // sort by highest bandwidth if pixelDiff is the same\n if (left.pixelDiff === right.pixelDiff) {\n return right.bandwidth - left.bandwidth;\n }\n return left.pixelDiff - right.pixelDiff;\n });\n leastPixelDiffRep = leastPixelDiffList[0];\n } // fallback chain of variants\n\n const chosenRep = leastPixelDiffRep || resolutionPlusOneRep || resolutionBestRep || bandwidthBestRep || enabledPlaylistReps[0] || sortedPlaylistReps[0];\n if (chosenRep && chosenRep.playlist) {\n let type = 'sortedPlaylistReps';\n if (leastPixelDiffRep) {\n type = 'leastPixelDiffRep';\n } else if (resolutionPlusOneRep) {\n type = 'resolutionPlusOneRep';\n } else if (resolutionBestRep) {\n type = 'resolutionBestRep';\n } else if (bandwidthBestRep) {\n type = 'bandwidthBestRep';\n } else if (enabledPlaylistReps[0]) {\n type = 'enabledPlaylistReps';\n }\n logFn(`choosing ${representationToString(chosenRep)} using ${type} with options`, options);\n return chosenRep.playlist;\n }\n logFn('could not choose a playlist with options', options);\n return null;\n};\n\n/**\n * Chooses the appropriate media playlist based on the most recent\n * bandwidth estimate and the player size.\n *\n * Expects to be called within the context of an instance of VhsHandler\n *\n * @return {Playlist} the highest bitrate playlist less than the\n * currently detected bandwidth, accounting for some amount of\n * bandwidth variance\n */\n\nconst lastBandwidthSelector = function () {\n let pixelRatio = this.useDevicePixelRatio ? window$1.devicePixelRatio || 1 : 1;\n if (!isNaN(this.customPixelRatio)) {\n pixelRatio = this.customPixelRatio;\n }\n return simpleSelector(this.playlists.main, this.systemBandwidth, parseInt(safeGetComputedStyle(this.tech_.el(), 'width'), 10) * pixelRatio, parseInt(safeGetComputedStyle(this.tech_.el(), 'height'), 10) * pixelRatio, this.limitRenditionByPlayerDimensions, this.playlistController_);\n};\n/**\n * Chooses the appropriate media playlist based on an\n * exponential-weighted moving average of the bandwidth after\n * filtering for player size.\n *\n * Expects to be called within the context of an instance of VhsHandler\n *\n * @param {number} decay - a number between 0 and 1. Higher values of\n * this parameter will cause previous bandwidth estimates to lose\n * significance more quickly.\n * @return {Function} a function which can be invoked to create a new\n * playlist selector function.\n * @see https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average\n */\n\nconst movingAverageBandwidthSelector = function (decay) {\n let average = -1;\n let lastSystemBandwidth = -1;\n if (decay < 0 || decay > 1) {\n throw new Error('Moving average bandwidth decay must be between 0 and 1.');\n }\n return function () {\n let pixelRatio = this.useDevicePixelRatio ? window$1.devicePixelRatio || 1 : 1;\n if (!isNaN(this.customPixelRatio)) {\n pixelRatio = this.customPixelRatio;\n }\n if (average < 0) {\n average = this.systemBandwidth;\n lastSystemBandwidth = this.systemBandwidth;\n } // stop the average value from decaying for every 250ms\n // when the systemBandwidth is constant\n // and\n // stop average from setting to a very low value when the\n // systemBandwidth becomes 0 in case of chunk cancellation\n\n if (this.systemBandwidth > 0 && this.systemBandwidth !== lastSystemBandwidth) {\n average = decay * this.systemBandwidth + (1 - decay) * average;\n lastSystemBandwidth = this.systemBandwidth;\n }\n return simpleSelector(this.playlists.main, average, parseInt(safeGetComputedStyle(this.tech_.el(), 'width'), 10) * pixelRatio, parseInt(safeGetComputedStyle(this.tech_.el(), 'height'), 10) * pixelRatio, this.limitRenditionByPlayerDimensions, this.playlistController_);\n };\n};\n/**\n * Chooses the appropriate media playlist based on the potential to rebuffer\n *\n * @param {Object} settings\n * Object of information required to use this selector\n * @param {Object} settings.main\n * Object representation of the main manifest\n * @param {number} settings.currentTime\n * The current time of the player\n * @param {number} settings.bandwidth\n * Current measured bandwidth\n * @param {number} settings.duration\n * Duration of the media\n * @param {number} settings.segmentDuration\n * Segment duration to be used in round trip time calculations\n * @param {number} settings.timeUntilRebuffer\n * Time left in seconds until the player has to rebuffer\n * @param {number} settings.currentTimeline\n * The current timeline segments are being loaded from\n * @param {SyncController} settings.syncController\n * SyncController for determining if we have a sync point for a given playlist\n * @return {Object|null}\n * {Object} return.playlist\n * The highest bandwidth playlist with the least amount of rebuffering\n * {Number} return.rebufferingImpact\n * The amount of time in seconds switching to this playlist will rebuffer. A\n * negative value means that switching will cause zero rebuffering.\n */\n\nconst minRebufferMaxBandwidthSelector = function (settings) {\n const {\n main,\n currentTime,\n bandwidth,\n duration,\n segmentDuration,\n timeUntilRebuffer,\n currentTimeline,\n syncController\n } = settings; // filter out any playlists that have been excluded due to\n // incompatible configurations\n\n const compatiblePlaylists = main.playlists.filter(playlist => !Playlist.isIncompatible(playlist)); // filter out any playlists that have been disabled manually through the representations\n // api or excluded temporarily due to playback errors.\n\n let enabledPlaylists = compatiblePlaylists.filter(Playlist.isEnabled);\n if (!enabledPlaylists.length) {\n // if there are no enabled playlists, then they have all been excluded or disabled\n // by the user through the representations api. In this case, ignore exclusion and\n // fallback to what the user wants by using playlists the user has not disabled.\n enabledPlaylists = compatiblePlaylists.filter(playlist => !Playlist.isDisabled(playlist));\n }\n const bandwidthPlaylists = enabledPlaylists.filter(Playlist.hasAttribute.bind(null, 'BANDWIDTH'));\n const rebufferingEstimates = bandwidthPlaylists.map(playlist => {\n const syncPoint = syncController.getSyncPoint(playlist, duration, currentTimeline, currentTime); // If there is no sync point for this playlist, switching to it will require a\n // sync request first. This will double the request time\n\n const numRequests = syncPoint ? 1 : 2;\n const requestTimeEstimate = Playlist.estimateSegmentRequestTime(segmentDuration, bandwidth, playlist);\n const rebufferingImpact = requestTimeEstimate * numRequests - timeUntilRebuffer;\n return {\n playlist,\n rebufferingImpact\n };\n });\n const noRebufferingPlaylists = rebufferingEstimates.filter(estimate => estimate.rebufferingImpact <= 0); // Sort by bandwidth DESC\n\n stableSort(noRebufferingPlaylists, (a, b) => comparePlaylistBandwidth(b.playlist, a.playlist));\n if (noRebufferingPlaylists.length) {\n return noRebufferingPlaylists[0];\n }\n stableSort(rebufferingEstimates, (a, b) => a.rebufferingImpact - b.rebufferingImpact);\n return rebufferingEstimates[0] || null;\n};\n/**\n * Chooses the appropriate media playlist, which in this case is the lowest bitrate\n * one with video. If no renditions with video exist, return the lowest audio rendition.\n *\n * Expects to be called within the context of an instance of VhsHandler\n *\n * @return {Object|null}\n * {Object} return.playlist\n * The lowest bitrate playlist that contains a video codec. If no such rendition\n * exists pick the lowest audio rendition.\n */\n\nconst lowestBitrateCompatibleVariantSelector = function () {\n // filter out any playlists that have been excluded due to\n // incompatible configurations or playback errors\n const playlists = this.playlists.main.playlists.filter(Playlist.isEnabled); // Sort ascending by bitrate\n\n stableSort(playlists, (a, b) => comparePlaylistBandwidth(a, b)); // Parse and assume that playlists with no video codec have no video\n // (this is not necessarily true, although it is generally true).\n //\n // If an entire manifest has no valid videos everything will get filtered\n // out.\n\n const playlistsWithVideo = playlists.filter(playlist => !!codecsForPlaylist(this.playlists.main, playlist).video);\n return playlistsWithVideo[0] || null;\n};\n\n/**\n * Combine all segments into a single Uint8Array\n *\n * @param {Object} segmentObj\n * @return {Uint8Array} concatenated bytes\n * @private\n */\nconst concatSegments = segmentObj => {\n let offset = 0;\n let tempBuffer;\n if (segmentObj.bytes) {\n tempBuffer = new Uint8Array(segmentObj.bytes); // combine the individual segments into one large typed-array\n\n segmentObj.segments.forEach(segment => {\n tempBuffer.set(segment, offset);\n offset += segment.byteLength;\n });\n }\n return tempBuffer;\n};\n/**\n * Example:\n * https://host.com/path1/path2/path3/segment.ts?arg1=val1\n * -->\n * path3/segment.ts\n *\n * @param resolvedUri\n * @return {string}\n */\n\nfunction compactSegmentUrlDescription(resolvedUri) {\n try {\n return new URL(resolvedUri).pathname.split('/').slice(-2).join('/');\n } catch (e) {\n return '';\n }\n}\n\n/**\n * @file text-tracks.js\n */\n/**\n * Create captions text tracks on video.js if they do not exist\n *\n * @param {Object} inbandTextTracks a reference to current inbandTextTracks\n * @param {Object} tech the video.js tech\n * @param {Object} captionStream the caption stream to create\n * @private\n */\n\nconst createCaptionsTrackIfNotExists = function (inbandTextTracks, tech, captionStream) {\n if (!inbandTextTracks[captionStream]) {\n tech.trigger({\n type: 'usage',\n name: 'vhs-608'\n });\n let instreamId = captionStream; // we need to translate SERVICEn for 708 to how mux.js currently labels them\n\n if (/^cc708_/.test(captionStream)) {\n instreamId = 'SERVICE' + captionStream.split('_')[1];\n }\n const track = tech.textTracks().getTrackById(instreamId);\n if (track) {\n // Resuse an existing track with a CC# id because this was\n // very likely created by videojs-contrib-hls from information\n // in the m3u8 for us to use\n inbandTextTracks[captionStream] = track;\n } else {\n // This section gets called when we have caption services that aren't specified in the manifest.\n // Manifest level caption services are handled in media-groups.js under CLOSED-CAPTIONS.\n const captionServices = tech.options_.vhs && tech.options_.vhs.captionServices || {};\n let label = captionStream;\n let language = captionStream;\n let def = false;\n const captionService = captionServices[instreamId];\n if (captionService) {\n label = captionService.label;\n language = captionService.language;\n def = captionService.default;\n } // Otherwise, create a track with the default `CC#` label and\n // without a language\n\n inbandTextTracks[captionStream] = tech.addRemoteTextTrack({\n kind: 'captions',\n id: instreamId,\n // TODO: investigate why this doesn't seem to turn the caption on by default\n default: def,\n label,\n language\n }, false).track;\n }\n }\n};\n/**\n * Add caption text track data to a source handler given an array of captions\n *\n * @param {Object}\n * @param {Object} inbandTextTracks the inband text tracks\n * @param {number} timestampOffset the timestamp offset of the source buffer\n * @param {Array} captionArray an array of caption data\n * @private\n */\n\nconst addCaptionData = function ({\n inbandTextTracks,\n captionArray,\n timestampOffset\n}) {\n if (!captionArray) {\n return;\n }\n const Cue = window$1.WebKitDataCue || window$1.VTTCue;\n captionArray.forEach(caption => {\n const track = caption.stream; // in CEA 608 captions, video.js/mux.js sends a content array\n // with positioning data\n\n if (caption.content) {\n caption.content.forEach(value => {\n const cue = new Cue(caption.startTime + timestampOffset, caption.endTime + timestampOffset, value.text);\n cue.line = value.line;\n cue.align = 'left';\n cue.position = value.position;\n cue.positionAlign = 'line-left';\n inbandTextTracks[track].addCue(cue);\n });\n } else {\n // otherwise, a text value with combined captions is sent\n inbandTextTracks[track].addCue(new Cue(caption.startTime + timestampOffset, caption.endTime + timestampOffset, caption.text));\n }\n });\n};\n/**\n * Define properties on a cue for backwards compatability,\n * but warn the user that the way that they are using it\n * is depricated and will be removed at a later date.\n *\n * @param {Cue} cue the cue to add the properties on\n * @private\n */\n\nconst deprecateOldCue = function (cue) {\n Object.defineProperties(cue.frame, {\n id: {\n get() {\n videojs.log.warn('cue.frame.id is deprecated. Use cue.value.key instead.');\n return cue.value.key;\n }\n },\n value: {\n get() {\n videojs.log.warn('cue.frame.value is deprecated. Use cue.value.data instead.');\n return cue.value.data;\n }\n },\n privateData: {\n get() {\n videojs.log.warn('cue.frame.privateData is deprecated. Use cue.value.data instead.');\n return cue.value.data;\n }\n }\n });\n};\n/**\n * Add metadata text track data to a source handler given an array of metadata\n *\n * @param {Object}\n * @param {Object} inbandTextTracks the inband text tracks\n * @param {Array} metadataArray an array of meta data\n * @param {number} timestampOffset the timestamp offset of the source buffer\n * @param {number} videoDuration the duration of the video\n * @private\n */\n\nconst addMetadata = ({\n inbandTextTracks,\n metadataArray,\n timestampOffset,\n videoDuration\n}) => {\n if (!metadataArray) {\n return;\n }\n const Cue = window$1.WebKitDataCue || window$1.VTTCue;\n const metadataTrack = inbandTextTracks.metadataTrack_;\n if (!metadataTrack) {\n return;\n }\n metadataArray.forEach(metadata => {\n const time = metadata.cueTime + timestampOffset; // if time isn't a finite number between 0 and Infinity, like NaN,\n // ignore this bit of metadata.\n // This likely occurs when you have an non-timed ID3 tag like TIT2,\n // which is the \"Title/Songname/Content description\" frame\n\n if (typeof time !== 'number' || window$1.isNaN(time) || time < 0 || !(time < Infinity)) {\n return;\n } // If we have no frames, we can't create a cue.\n\n if (!metadata.frames || !metadata.frames.length) {\n return;\n }\n metadata.frames.forEach(frame => {\n const cue = new Cue(time, time, frame.value || frame.url || frame.data || '');\n cue.frame = frame;\n cue.value = frame;\n deprecateOldCue(cue);\n metadataTrack.addCue(cue);\n });\n });\n if (!metadataTrack.cues || !metadataTrack.cues.length) {\n return;\n } // Updating the metadeta cues so that\n // the endTime of each cue is the startTime of the next cue\n // the endTime of last cue is the duration of the video\n\n const cues = metadataTrack.cues;\n const cuesArray = []; // Create a copy of the TextTrackCueList...\n // ...disregarding cues with a falsey value\n\n for (let i = 0; i < cues.length; i++) {\n if (cues[i]) {\n cuesArray.push(cues[i]);\n }\n } // Group cues by their startTime value\n\n const cuesGroupedByStartTime = cuesArray.reduce((obj, cue) => {\n const timeSlot = obj[cue.startTime] || [];\n timeSlot.push(cue);\n obj[cue.startTime] = timeSlot;\n return obj;\n }, {}); // Sort startTimes by ascending order\n\n const sortedStartTimes = Object.keys(cuesGroupedByStartTime).sort((a, b) => Number(a) - Number(b)); // Map each cue group's endTime to the next group's startTime\n\n sortedStartTimes.forEach((startTime, idx) => {\n const cueGroup = cuesGroupedByStartTime[startTime];\n const finiteDuration = isFinite(videoDuration) ? videoDuration : startTime;\n const nextTime = Number(sortedStartTimes[idx + 1]) || finiteDuration; // Map each cue's endTime the next group's startTime\n\n cueGroup.forEach(cue => {\n cue.endTime = nextTime;\n });\n });\n}; // object for mapping daterange attributes\n\nconst dateRangeAttr = {\n id: 'ID',\n class: 'CLASS',\n startDate: 'START-DATE',\n duration: 'DURATION',\n endDate: 'END-DATE',\n endOnNext: 'END-ON-NEXT',\n plannedDuration: 'PLANNED-DURATION',\n scte35Out: 'SCTE35-OUT',\n scte35In: 'SCTE35-IN'\n};\nconst dateRangeKeysToOmit = new Set(['id', 'class', 'startDate', 'duration', 'endDate', 'endOnNext', 'startTime', 'endTime', 'processDateRange']);\n/**\n * Add DateRange metadata text track to a source handler given an array of metadata\n *\n * @param {Object}\n * @param {Object} inbandTextTracks the inband text tracks\n * @param {Array} dateRanges parsed media playlist\n * @private\n */\n\nconst addDateRangeMetadata = ({\n inbandTextTracks,\n dateRanges\n}) => {\n const metadataTrack = inbandTextTracks.metadataTrack_;\n if (!metadataTrack) {\n return;\n }\n const Cue = window$1.WebKitDataCue || window$1.VTTCue;\n dateRanges.forEach(dateRange => {\n // we generate multiple cues for each date range with different attributes\n for (const key of Object.keys(dateRange)) {\n if (dateRangeKeysToOmit.has(key)) {\n continue;\n }\n const cue = new Cue(dateRange.startTime, dateRange.endTime, '');\n cue.id = dateRange.id;\n cue.type = 'com.apple.quicktime.HLS';\n cue.value = {\n key: dateRangeAttr[key],\n data: dateRange[key]\n };\n if (key === 'scte35Out' || key === 'scte35In') {\n cue.value.data = new Uint8Array(cue.value.data.match(/[\\da-f]{2}/gi)).buffer;\n }\n metadataTrack.addCue(cue);\n }\n dateRange.processDateRange();\n });\n};\n/**\n * Create metadata text track on video.js if it does not exist\n *\n * @param {Object} inbandTextTracks a reference to current inbandTextTracks\n * @param {string} dispatchType the inband metadata track dispatch type\n * @param {Object} tech the video.js tech\n * @private\n */\n\nconst createMetadataTrackIfNotExists = (inbandTextTracks, dispatchType, tech) => {\n if (inbandTextTracks.metadataTrack_) {\n return;\n }\n inbandTextTracks.metadataTrack_ = tech.addRemoteTextTrack({\n kind: 'metadata',\n label: 'Timed Metadata'\n }, false).track;\n if (!videojs.browser.IS_ANY_SAFARI) {\n inbandTextTracks.metadataTrack_.inBandMetadataTrackDispatchType = dispatchType;\n }\n};\n/**\n * Remove cues from a track on video.js.\n *\n * @param {Double} start start of where we should remove the cue\n * @param {Double} end end of where the we should remove the cue\n * @param {Object} track the text track to remove the cues from\n * @private\n */\n\nconst removeCuesFromTrack = function (start, end, track) {\n let i;\n let cue;\n if (!track) {\n return;\n }\n if (!track.cues) {\n return;\n }\n i = track.cues.length;\n while (i--) {\n cue = track.cues[i]; // Remove any cue within the provided start and end time\n\n if (cue.startTime >= start && cue.endTime <= end) {\n track.removeCue(cue);\n }\n }\n};\n/**\n * Remove duplicate cues from a track on video.js (a cue is considered a\n * duplicate if it has the same time interval and text as another)\n *\n * @param {Object} track the text track to remove the duplicate cues from\n * @private\n */\n\nconst removeDuplicateCuesFromTrack = function (track) {\n const cues = track.cues;\n if (!cues) {\n return;\n }\n const uniqueCues = {};\n for (let i = cues.length - 1; i >= 0; i--) {\n const cue = cues[i];\n const cueKey = `${cue.startTime}-${cue.endTime}-${cue.text}`;\n if (uniqueCues[cueKey]) {\n track.removeCue(cue);\n } else {\n uniqueCues[cueKey] = cue;\n }\n }\n};\n\n/**\n * Returns a list of gops in the buffer that have a pts value of 3 seconds or more in\n * front of current time.\n *\n * @param {Array} buffer\n * The current buffer of gop information\n * @param {number} currentTime\n * The current time\n * @param {Double} mapping\n * Offset to map display time to stream presentation time\n * @return {Array}\n * List of gops considered safe to append over\n */\n\nconst gopsSafeToAlignWith = (buffer, currentTime, mapping) => {\n if (typeof currentTime === 'undefined' || currentTime === null || !buffer.length) {\n return [];\n } // pts value for current time + 3 seconds to give a bit more wiggle room\n\n const currentTimePts = Math.ceil((currentTime - mapping + 3) * ONE_SECOND_IN_TS);\n let i;\n for (i = 0; i < buffer.length; i++) {\n if (buffer[i].pts > currentTimePts) {\n break;\n }\n }\n return buffer.slice(i);\n};\n/**\n * Appends gop information (timing and byteLength) received by the transmuxer for the\n * gops appended in the last call to appendBuffer\n *\n * @param {Array} buffer\n * The current buffer of gop information\n * @param {Array} gops\n * List of new gop information\n * @param {boolean} replace\n * If true, replace the buffer with the new gop information. If false, append the\n * new gop information to the buffer in the right location of time.\n * @return {Array}\n * Updated list of gop information\n */\n\nconst updateGopBuffer = (buffer, gops, replace) => {\n if (!gops.length) {\n return buffer;\n }\n if (replace) {\n // If we are in safe append mode, then completely overwrite the gop buffer\n // with the most recent appeneded data. This will make sure that when appending\n // future segments, we only try to align with gops that are both ahead of current\n // time and in the last segment appended.\n return gops.slice();\n }\n const start = gops[0].pts;\n let i = 0;\n for (i; i < buffer.length; i++) {\n if (buffer[i].pts >= start) {\n break;\n }\n }\n return buffer.slice(0, i).concat(gops);\n};\n/**\n * Removes gop information in buffer that overlaps with provided start and end\n *\n * @param {Array} buffer\n * The current buffer of gop information\n * @param {Double} start\n * position to start the remove at\n * @param {Double} end\n * position to end the remove at\n * @param {Double} mapping\n * Offset to map display time to stream presentation time\n */\n\nconst removeGopBuffer = (buffer, start, end, mapping) => {\n const startPts = Math.ceil((start - mapping) * ONE_SECOND_IN_TS);\n const endPts = Math.ceil((end - mapping) * ONE_SECOND_IN_TS);\n const updatedBuffer = buffer.slice();\n let i = buffer.length;\n while (i--) {\n if (buffer[i].pts <= endPts) {\n break;\n }\n }\n if (i === -1) {\n // no removal because end of remove range is before start of buffer\n return updatedBuffer;\n }\n let j = i + 1;\n while (j--) {\n if (buffer[j].pts <= startPts) {\n break;\n }\n } // clamp remove range start to 0 index\n\n j = Math.max(j, 0);\n updatedBuffer.splice(j, i - j + 1);\n return updatedBuffer;\n};\nconst shallowEqual = function (a, b) {\n // if both are undefined\n // or one or the other is undefined\n // they are not equal\n if (!a && !b || !a && b || a && !b) {\n return false;\n } // they are the same object and thus, equal\n\n if (a === b) {\n return true;\n } // sort keys so we can make sure they have\n // all the same keys later.\n\n const akeys = Object.keys(a).sort();\n const bkeys = Object.keys(b).sort(); // different number of keys, not equal\n\n if (akeys.length !== bkeys.length) {\n return false;\n }\n for (let i = 0; i < akeys.length; i++) {\n const key = akeys[i]; // different sorted keys, not equal\n\n if (key !== bkeys[i]) {\n return false;\n } // different values, not equal\n\n if (a[key] !== b[key]) {\n return false;\n }\n }\n return true;\n};\n\n/**\n * The segment loader has no recourse except to fetch a segment in the\n * current playlist and use the internal timestamps in that segment to\n * generate a syncPoint. This function returns a good candidate index\n * for that process.\n *\n * @param {Array} segments - the segments array from a playlist.\n * @return {number} An index of a segment from the playlist to load\n */\n\nconst getSyncSegmentCandidate = function (currentTimeline, segments, targetTime) {\n segments = segments || [];\n const timelineSegments = [];\n let time = 0;\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n if (currentTimeline === segment.timeline) {\n timelineSegments.push(i);\n time += segment.duration;\n if (time > targetTime) {\n return i;\n }\n }\n }\n if (timelineSegments.length === 0) {\n return 0;\n } // default to the last timeline segment\n\n return timelineSegments[timelineSegments.length - 1];\n}; // In the event of a quota exceeded error, keep at least one second of back buffer. This\n// number was arbitrarily chosen and may be updated in the future, but seemed reasonable\n// as a start to prevent any potential issues with removing content too close to the\n// playhead.\n\nconst MIN_BACK_BUFFER = 1; // in ms\n\nconst CHECK_BUFFER_DELAY = 500;\nconst finite = num => typeof num === 'number' && isFinite(num); // With most content hovering around 30fps, if a segment has a duration less than a half\n// frame at 30fps or one frame at 60fps, the bandwidth and throughput calculations will\n// not accurately reflect the rest of the content.\n\nconst MIN_SEGMENT_DURATION_TO_SAVE_STATS = 1 / 60;\nconst illegalMediaSwitch = (loaderType, startingMedia, trackInfo) => {\n // Although these checks should most likely cover non 'main' types, for now it narrows\n // the scope of our checks.\n if (loaderType !== 'main' || !startingMedia || !trackInfo) {\n return null;\n }\n if (!trackInfo.hasAudio && !trackInfo.hasVideo) {\n return 'Neither audio nor video found in segment.';\n }\n if (startingMedia.hasVideo && !trackInfo.hasVideo) {\n return 'Only audio found in segment when we expected video.' + ' We can\\'t switch to audio only from a stream that had video.' + ' To get rid of this message, please add codec information to the manifest.';\n }\n if (!startingMedia.hasVideo && trackInfo.hasVideo) {\n return 'Video found in segment when we expected only audio.' + ' We can\\'t switch to a stream with video from an audio only stream.' + ' To get rid of this message, please add codec information to the manifest.';\n }\n return null;\n};\n/**\n * Calculates a time value that is safe to remove from the back buffer without interrupting\n * playback.\n *\n * @param {TimeRange} seekable\n * The current seekable range\n * @param {number} currentTime\n * The current time of the player\n * @param {number} targetDuration\n * The target duration of the current playlist\n * @return {number}\n * Time that is safe to remove from the back buffer without interrupting playback\n */\n\nconst safeBackBufferTrimTime = (seekable, currentTime, targetDuration) => {\n // 30 seconds before the playhead provides a safe default for trimming.\n //\n // Choosing a reasonable default is particularly important for high bitrate content and\n // VOD videos/live streams with large windows, as the buffer may end up overfilled and\n // throw an APPEND_BUFFER_ERR.\n let trimTime = currentTime - Config.BACK_BUFFER_LENGTH;\n if (seekable.length) {\n // Some live playlists may have a shorter window of content than the full allowed back\n // buffer. For these playlists, don't save content that's no longer within the window.\n trimTime = Math.max(trimTime, seekable.start(0));\n } // Don't remove within target duration of the current time to avoid the possibility of\n // removing the GOP currently being played, as removing it can cause playback stalls.\n\n const maxTrimTime = currentTime - targetDuration;\n return Math.min(maxTrimTime, trimTime);\n};\nconst segmentInfoString = segmentInfo => {\n const {\n startOfSegment,\n duration,\n segment,\n part,\n playlist: {\n mediaSequence: seq,\n id,\n segments = []\n },\n mediaIndex: index,\n partIndex,\n timeline\n } = segmentInfo;\n const segmentLen = segments.length - 1;\n let selection = 'mediaIndex/partIndex increment';\n if (segmentInfo.getMediaInfoForTime) {\n selection = `getMediaInfoForTime (${segmentInfo.getMediaInfoForTime})`;\n } else if (segmentInfo.isSyncRequest) {\n selection = 'getSyncSegmentCandidate (isSyncRequest)';\n }\n if (segmentInfo.independent) {\n selection += ` with independent ${segmentInfo.independent}`;\n }\n const hasPartIndex = typeof partIndex === 'number';\n const name = segmentInfo.segment.uri ? 'segment' : 'pre-segment';\n const zeroBasedPartCount = hasPartIndex ? getKnownPartCount({\n preloadSegment: segment\n }) - 1 : 0;\n return `${name} [${seq + index}/${seq + segmentLen}]` + (hasPartIndex ? ` part [${partIndex}/${zeroBasedPartCount}]` : '') + ` segment start/end [${segment.start} => ${segment.end}]` + (hasPartIndex ? ` part start/end [${part.start} => ${part.end}]` : '') + ` startOfSegment [${startOfSegment}]` + ` duration [${duration}]` + ` timeline [${timeline}]` + ` selected by [${selection}]` + ` playlist [${id}]`;\n};\nconst timingInfoPropertyForMedia = mediaType => `${mediaType}TimingInfo`;\n/**\n * Returns the timestamp offset to use for the segment.\n *\n * @param {number} segmentTimeline\n * The timeline of the segment\n * @param {number} currentTimeline\n * The timeline currently being followed by the loader\n * @param {number} startOfSegment\n * The estimated segment start\n * @param {TimeRange[]} buffered\n * The loader's buffer\n * @param {boolean} overrideCheck\n * If true, no checks are made to see if the timestamp offset value should be set,\n * but sets it directly to a value.\n *\n * @return {number|null}\n * Either a number representing a new timestamp offset, or null if the segment is\n * part of the same timeline\n */\n\nconst timestampOffsetForSegment = ({\n segmentTimeline,\n currentTimeline,\n startOfSegment,\n buffered,\n overrideCheck\n}) => {\n // Check to see if we are crossing a discontinuity to see if we need to set the\n // timestamp offset on the transmuxer and source buffer.\n //\n // Previously, we changed the timestampOffset if the start of this segment was less than\n // the currently set timestampOffset, but this isn't desirable as it can produce bad\n // behavior, especially around long running live streams.\n if (!overrideCheck && segmentTimeline === currentTimeline) {\n return null;\n } // When changing renditions, it's possible to request a segment on an older timeline. For\n // instance, given two renditions with the following:\n //\n // #EXTINF:10\n // segment1\n // #EXT-X-DISCONTINUITY\n // #EXTINF:10\n // segment2\n // #EXTINF:10\n // segment3\n //\n // And the current player state:\n //\n // current time: 8\n // buffer: 0 => 20\n //\n // The next segment on the current rendition would be segment3, filling the buffer from\n // 20s onwards. However, if a rendition switch happens after segment2 was requested,\n // then the next segment to be requested will be segment1 from the new rendition in\n // order to fill time 8 and onwards. Using the buffered end would result in repeated\n // content (since it would position segment1 of the new rendition starting at 20s). This\n // case can be identified when the new segment's timeline is a prior value. Instead of\n // using the buffered end, the startOfSegment can be used, which, hopefully, will be\n // more accurate to the actual start time of the segment.\n\n if (segmentTimeline < currentTimeline) {\n return startOfSegment;\n } // segmentInfo.startOfSegment used to be used as the timestamp offset, however, that\n // value uses the end of the last segment if it is available. While this value\n // should often be correct, it's better to rely on the buffered end, as the new\n // content post discontinuity should line up with the buffered end as if it were\n // time 0 for the new content.\n\n return buffered.length ? buffered.end(buffered.length - 1) : startOfSegment;\n};\n/**\n * Returns whether or not the loader should wait for a timeline change from the timeline\n * change controller before processing the segment.\n *\n * Primary timing in VHS goes by video. This is different from most media players, as\n * audio is more often used as the primary timing source. For the foreseeable future, VHS\n * will continue to use video as the primary timing source, due to the current logic and\n * expectations built around it.\n\n * Since the timing follows video, in order to maintain sync, the video loader is\n * responsible for setting both audio and video source buffer timestamp offsets.\n *\n * Setting different values for audio and video source buffers could lead to\n * desyncing. The following examples demonstrate some of the situations where this\n * distinction is important. Note that all of these cases involve demuxed content. When\n * content is muxed, the audio and video are packaged together, therefore syncing\n * separate media playlists is not an issue.\n *\n * CASE 1: Audio prepares to load a new timeline before video:\n *\n * Timeline: 0 1\n * Audio Segments: 0 1 2 3 4 5 DISCO 6 7 8 9\n * Audio Loader: ^\n * Video Segments: 0 1 2 3 4 5 DISCO 6 7 8 9\n * Video Loader ^\n *\n * In the above example, the audio loader is preparing to load the 6th segment, the first\n * after a discontinuity, while the video loader is still loading the 5th segment, before\n * the discontinuity.\n *\n * If the audio loader goes ahead and loads and appends the 6th segment before the video\n * loader crosses the discontinuity, then when appended, the 6th audio segment will use\n * the timestamp offset from timeline 0. This will likely lead to desyncing. In addition,\n * the audio loader must provide the audioAppendStart value to trim the content in the\n * transmuxer, and that value relies on the audio timestamp offset. Since the audio\n * timestamp offset is set by the video (main) loader, the audio loader shouldn't load the\n * segment until that value is provided.\n *\n * CASE 2: Video prepares to load a new timeline before audio:\n *\n * Timeline: 0 1\n * Audio Segments: 0 1 2 3 4 5 DISCO 6 7 8 9\n * Audio Loader: ^\n * Video Segments: 0 1 2 3 4 5 DISCO 6 7 8 9\n * Video Loader ^\n *\n * In the above example, the video loader is preparing to load the 6th segment, the first\n * after a discontinuity, while the audio loader is still loading the 5th segment, before\n * the discontinuity.\n *\n * If the video loader goes ahead and loads and appends the 6th segment, then once the\n * segment is loaded and processed, both the video and audio timestamp offsets will be\n * set, since video is used as the primary timing source. This is to ensure content lines\n * up appropriately, as any modifications to the video timing are reflected by audio when\n * the video loader sets the audio and video timestamp offsets to the same value. However,\n * setting the timestamp offset for audio before audio has had a chance to change\n * timelines will likely lead to desyncing, as the audio loader will append segment 5 with\n * a timestamp intended to apply to segments from timeline 1 rather than timeline 0.\n *\n * CASE 3: When seeking, audio prepares to load a new timeline before video\n *\n * Timeline: 0 1\n * Audio Segments: 0 1 2 3 4 5 DISCO 6 7 8 9\n * Audio Loader: ^\n * Video Segments: 0 1 2 3 4 5 DISCO 6 7 8 9\n * Video Loader ^\n *\n * In the above example, both audio and video loaders are loading segments from timeline\n * 0, but imagine that the seek originated from timeline 1.\n *\n * When seeking to a new timeline, the timestamp offset will be set based on the expected\n * segment start of the loaded video segment. In order to maintain sync, the audio loader\n * must wait for the video loader to load its segment and update both the audio and video\n * timestamp offsets before it may load and append its own segment. This is the case\n * whether the seek results in a mismatched segment request (e.g., the audio loader\n * chooses to load segment 3 and the video loader chooses to load segment 4) or the\n * loaders choose to load the same segment index from each playlist, as the segments may\n * not be aligned perfectly, even for matching segment indexes.\n *\n * @param {Object} timelinechangeController\n * @param {number} currentTimeline\n * The timeline currently being followed by the loader\n * @param {number} segmentTimeline\n * The timeline of the segment being loaded\n * @param {('main'|'audio')} loaderType\n * The loader type\n * @param {boolean} audioDisabled\n * Whether the audio is disabled for the loader. This should only be true when the\n * loader may have muxed audio in its segment, but should not append it, e.g., for\n * the main loader when an alternate audio playlist is active.\n *\n * @return {boolean}\n * Whether the loader should wait for a timeline change from the timeline change\n * controller before processing the segment\n */\n\nconst shouldWaitForTimelineChange = ({\n timelineChangeController,\n currentTimeline,\n segmentTimeline,\n loaderType,\n audioDisabled\n}) => {\n if (currentTimeline === segmentTimeline) {\n return false;\n }\n if (loaderType === 'audio') {\n const lastMainTimelineChange = timelineChangeController.lastTimelineChange({\n type: 'main'\n }); // Audio loader should wait if:\n //\n // * main hasn't had a timeline change yet (thus has not loaded its first segment)\n // * main hasn't yet changed to the timeline audio is looking to load\n\n return !lastMainTimelineChange || lastMainTimelineChange.to !== segmentTimeline;\n } // The main loader only needs to wait for timeline changes if there's demuxed audio.\n // Otherwise, there's nothing to wait for, since audio would be muxed into the main\n // loader's segments (or the content is audio/video only and handled by the main\n // loader).\n\n if (loaderType === 'main' && audioDisabled) {\n const pendingAudioTimelineChange = timelineChangeController.pendingTimelineChange({\n type: 'audio'\n }); // Main loader should wait for the audio loader if audio is not pending a timeline\n // change to the current timeline.\n //\n // Since the main loader is responsible for setting the timestamp offset for both\n // audio and video, the main loader must wait for audio to be about to change to its\n // timeline before setting the offset, otherwise, if audio is behind in loading,\n // segments from the previous timeline would be adjusted by the new timestamp offset.\n //\n // This requirement means that video will not cross a timeline until the audio is\n // about to cross to it, so that way audio and video will always cross the timeline\n // together.\n //\n // In addition to normal timeline changes, these rules also apply to the start of a\n // stream (going from a non-existent timeline, -1, to timeline 0). It's important\n // that these rules apply to the first timeline change because if they did not, it's\n // possible that the main loader will cross two timelines before the audio loader has\n // crossed one. Logic may be implemented to handle the startup as a special case, but\n // it's easier to simply treat all timeline changes the same.\n\n if (pendingAudioTimelineChange && pendingAudioTimelineChange.to === segmentTimeline) {\n return false;\n }\n return true;\n }\n return false;\n};\nconst mediaDuration = timingInfos => {\n let maxDuration = 0;\n ['video', 'audio'].forEach(function (type) {\n const typeTimingInfo = timingInfos[`${type}TimingInfo`];\n if (!typeTimingInfo) {\n return;\n }\n const {\n start,\n end\n } = typeTimingInfo;\n let duration;\n if (typeof start === 'bigint' || typeof end === 'bigint') {\n duration = window$1.BigInt(end) - window$1.BigInt(start);\n } else if (typeof start === 'number' && typeof end === 'number') {\n duration = end - start;\n }\n if (typeof duration !== 'undefined' && duration > maxDuration) {\n maxDuration = duration;\n }\n }); // convert back to a number if it is lower than MAX_SAFE_INTEGER\n // as we only need BigInt when we are above that.\n\n if (typeof maxDuration === 'bigint' && maxDuration < Number.MAX_SAFE_INTEGER) {\n maxDuration = Number(maxDuration);\n }\n return maxDuration;\n};\nconst segmentTooLong = ({\n segmentDuration,\n maxDuration\n}) => {\n // 0 duration segments are most likely due to metadata only segments or a lack of\n // information.\n if (!segmentDuration) {\n return false;\n } // For HLS:\n //\n // https://tools.ietf.org/html/draft-pantos-http-live-streaming-23#section-4.3.3.1\n // The EXTINF duration of each Media Segment in the Playlist\n // file, when rounded to the nearest integer, MUST be less than or equal\n // to the target duration; longer segments can trigger playback stalls\n // or other errors.\n //\n // For DASH, the mpd-parser uses the largest reported segment duration as the target\n // duration. Although that reported duration is occasionally approximate (i.e., not\n // exact), a strict check may report that a segment is too long more often in DASH.\n\n return Math.round(segmentDuration) > maxDuration + TIME_FUDGE_FACTOR;\n};\nconst getTroublesomeSegmentDurationMessage = (segmentInfo, sourceType) => {\n // Right now we aren't following DASH's timing model exactly, so only perform\n // this check for HLS content.\n if (sourceType !== 'hls') {\n return null;\n }\n const segmentDuration = mediaDuration({\n audioTimingInfo: segmentInfo.audioTimingInfo,\n videoTimingInfo: segmentInfo.videoTimingInfo\n }); // Don't report if we lack information.\n //\n // If the segment has a duration of 0 it is either a lack of information or a\n // metadata only segment and shouldn't be reported here.\n\n if (!segmentDuration) {\n return null;\n }\n const targetDuration = segmentInfo.playlist.targetDuration;\n const isSegmentWayTooLong = segmentTooLong({\n segmentDuration,\n maxDuration: targetDuration * 2\n });\n const isSegmentSlightlyTooLong = segmentTooLong({\n segmentDuration,\n maxDuration: targetDuration\n });\n const segmentTooLongMessage = `Segment with index ${segmentInfo.mediaIndex} ` + `from playlist ${segmentInfo.playlist.id} ` + `has a duration of ${segmentDuration} ` + `when the reported duration is ${segmentInfo.duration} ` + `and the target duration is ${targetDuration}. ` + 'For HLS content, a duration in excess of the target duration may result in ' + 'playback issues. See the HLS specification section on EXT-X-TARGETDURATION for ' + 'more details: ' + 'https://tools.ietf.org/html/draft-pantos-http-live-streaming-23#section-4.3.3.1';\n if (isSegmentWayTooLong || isSegmentSlightlyTooLong) {\n return {\n severity: isSegmentWayTooLong ? 'warn' : 'info',\n message: segmentTooLongMessage\n };\n }\n return null;\n};\n/**\n *\n * @param {Object} options type of segment loader and segment either segmentInfo or simple segment\n * @return a segmentInfo payload for events or errors.\n */\n\nconst segmentInfoPayload = ({\n type,\n segment\n}) => {\n if (!segment) {\n return;\n }\n const isEncrypted = Boolean(segment.key || segment.map && segment.map.ke);\n const isMediaInitialization = Boolean(segment.map && !segment.map.bytes);\n const start = segment.startOfSegment === undefined ? segment.start : segment.startOfSegment;\n return {\n type: type || segment.type,\n uri: segment.resolvedUri || segment.uri,\n start,\n duration: segment.duration,\n isEncrypted,\n isMediaInitialization\n };\n};\n/**\n * An object that manages segment loading and appending.\n *\n * @class SegmentLoader\n * @param {Object} options required and optional options\n * @extends videojs.EventTarget\n */\n\nclass SegmentLoader extends videojs.EventTarget {\n constructor(settings, options = {}) {\n super(); // check pre-conditions\n\n if (!settings) {\n throw new TypeError('Initialization settings are required');\n }\n if (typeof settings.currentTime !== 'function') {\n throw new TypeError('No currentTime getter specified');\n }\n if (!settings.mediaSource) {\n throw new TypeError('No MediaSource specified');\n } // public properties\n\n this.bandwidth = settings.bandwidth;\n this.throughput = {\n rate: 0,\n count: 0\n };\n this.roundTrip = NaN;\n this.resetStats_();\n this.mediaIndex = null;\n this.partIndex = null; // private settings\n\n this.hasPlayed_ = settings.hasPlayed;\n this.currentTime_ = settings.currentTime;\n this.seekable_ = settings.seekable;\n this.seeking_ = settings.seeking;\n this.duration_ = settings.duration;\n this.mediaSource_ = settings.mediaSource;\n this.vhs_ = settings.vhs;\n this.loaderType_ = settings.loaderType;\n this.currentMediaInfo_ = void 0;\n this.startingMediaInfo_ = void 0;\n this.segmentMetadataTrack_ = settings.segmentMetadataTrack;\n this.goalBufferLength_ = settings.goalBufferLength;\n this.sourceType_ = settings.sourceType;\n this.sourceUpdater_ = settings.sourceUpdater;\n this.inbandTextTracks_ = settings.inbandTextTracks;\n this.state_ = 'INIT';\n this.timelineChangeController_ = settings.timelineChangeController;\n this.shouldSaveSegmentTimingInfo_ = true;\n this.parse708captions_ = settings.parse708captions;\n this.useDtsForTimestampOffset_ = settings.useDtsForTimestampOffset;\n this.captionServices_ = settings.captionServices;\n this.exactManifestTimings = settings.exactManifestTimings;\n this.addMetadataToTextTrack = settings.addMetadataToTextTrack; // private instance variables\n\n this.checkBufferTimeout_ = null;\n this.error_ = void 0;\n this.currentTimeline_ = -1;\n this.shouldForceTimestampOffsetAfterResync_ = false;\n this.pendingSegment_ = null;\n this.xhrOptions_ = null;\n this.pendingSegments_ = [];\n this.audioDisabled_ = false;\n this.isPendingTimestampOffset_ = false; // TODO possibly move gopBuffer and timeMapping info to a separate controller\n\n this.gopBuffer_ = [];\n this.timeMapping_ = 0;\n this.safeAppend_ = false;\n this.appendInitSegment_ = {\n audio: true,\n video: true\n };\n this.playlistOfLastInitSegment_ = {\n audio: null,\n video: null\n };\n this.callQueue_ = []; // If the segment loader prepares to load a segment, but does not have enough\n // information yet to start the loading process (e.g., if the audio loader wants to\n // load a segment from the next timeline but the main loader hasn't yet crossed that\n // timeline), then the load call will be added to the queue until it is ready to be\n // processed.\n\n this.loadQueue_ = [];\n this.metadataQueue_ = {\n id3: [],\n caption: []\n };\n this.waitingOnRemove_ = false;\n this.quotaExceededErrorRetryTimeout_ = null; // Fragmented mp4 playback\n\n this.activeInitSegmentId_ = null;\n this.initSegments_ = {}; // HLSe playback\n\n this.cacheEncryptionKeys_ = settings.cacheEncryptionKeys;\n this.keyCache_ = {};\n this.decrypter_ = settings.decrypter; // Manages the tracking and generation of sync-points, mappings\n // between a time in the display time and a segment index within\n // a playlist\n\n this.syncController_ = settings.syncController;\n this.syncPoint_ = {\n segmentIndex: 0,\n time: 0\n };\n this.transmuxer_ = this.createTransmuxer_();\n this.triggerSyncInfoUpdate_ = () => this.trigger('syncinfoupdate');\n this.syncController_.on('syncinfoupdate', this.triggerSyncInfoUpdate_);\n this.mediaSource_.addEventListener('sourceopen', () => {\n if (!this.isEndOfStream_()) {\n this.ended_ = false;\n }\n }); // ...for determining the fetch location\n\n this.fetchAtBuffer_ = false;\n this.logger_ = logger(`SegmentLoader[${this.loaderType_}]`);\n Object.defineProperty(this, 'state', {\n get() {\n return this.state_;\n },\n set(newState) {\n if (newState !== this.state_) {\n this.logger_(`${this.state_} -> ${newState}`);\n this.state_ = newState;\n this.trigger('statechange');\n }\n }\n });\n this.sourceUpdater_.on('ready', () => {\n if (this.hasEnoughInfoToAppend_()) {\n this.processCallQueue_();\n }\n });\n this.sourceUpdater_.on('codecschange', metadata => {\n this.trigger(_extends({\n type: 'codecschange'\n }, metadata));\n }); // Only the main loader needs to listen for pending timeline changes, as the main\n // loader should wait for audio to be ready to change its timeline so that both main\n // and audio timelines change together. For more details, see the\n // shouldWaitForTimelineChange function.\n\n if (this.loaderType_ === 'main') {\n this.timelineChangeController_.on('pendingtimelinechange', () => {\n if (this.hasEnoughInfoToAppend_()) {\n this.processCallQueue_();\n }\n });\n } // The main loader only listens on pending timeline changes, but the audio loader,\n // since its loads follow main, needs to listen on timeline changes. For more details,\n // see the shouldWaitForTimelineChange function.\n\n if (this.loaderType_ === 'audio') {\n this.timelineChangeController_.on('timelinechange', metadata => {\n this.trigger(_extends({\n type: 'timelinechange'\n }, metadata));\n if (this.hasEnoughInfoToLoad_()) {\n this.processLoadQueue_();\n }\n if (this.hasEnoughInfoToAppend_()) {\n this.processCallQueue_();\n }\n });\n }\n }\n /**\n * TODO: Current sync controller consists of many hls-specific strategies\n * media sequence sync is also hls-specific, and we would like to be protocol-agnostic on this level\n * this should be a part of the sync-controller and sync controller should expect different strategy list based on the protocol.\n *\n * @return {MediaSequenceSync|null}\n * @private\n */\n\n get mediaSequenceSync_() {\n return this.syncController_.getMediaSequenceSync(this.loaderType_);\n }\n createTransmuxer_() {\n return segmentTransmuxer.createTransmuxer({\n remux: false,\n alignGopsAtEnd: this.safeAppend_,\n keepOriginalTimestamps: true,\n parse708captions: this.parse708captions_,\n captionServices: this.captionServices_\n });\n }\n /**\n * reset all of our media stats\n *\n * @private\n */\n\n resetStats_() {\n this.mediaBytesTransferred = 0;\n this.mediaRequests = 0;\n this.mediaRequestsAborted = 0;\n this.mediaRequestsTimedout = 0;\n this.mediaRequestsErrored = 0;\n this.mediaTransferDuration = 0;\n this.mediaSecondsLoaded = 0;\n this.mediaAppends = 0;\n }\n /**\n * dispose of the SegmentLoader and reset to the default state\n */\n\n dispose() {\n this.trigger('dispose');\n this.state = 'DISPOSED';\n this.pause();\n this.abort_();\n if (this.transmuxer_) {\n this.transmuxer_.terminate();\n }\n this.resetStats_();\n if (this.checkBufferTimeout_) {\n window$1.clearTimeout(this.checkBufferTimeout_);\n }\n if (this.syncController_ && this.triggerSyncInfoUpdate_) {\n this.syncController_.off('syncinfoupdate', this.triggerSyncInfoUpdate_);\n }\n this.off();\n }\n setAudio(enable) {\n this.audioDisabled_ = !enable;\n if (enable) {\n this.appendInitSegment_.audio = true;\n } else {\n // remove current track audio if it gets disabled\n this.sourceUpdater_.removeAudio(0, this.duration_());\n }\n }\n /**\n * abort anything that is currently doing on with the SegmentLoader\n * and reset to a default state\n */\n\n abort() {\n if (this.state !== 'WAITING') {\n if (this.pendingSegment_) {\n this.pendingSegment_ = null;\n }\n return;\n }\n this.abort_(); // We aborted the requests we were waiting on, so reset the loader's state to READY\n // since we are no longer \"waiting\" on any requests. XHR callback is not always run\n // when the request is aborted. This will prevent the loader from being stuck in the\n // WAITING state indefinitely.\n\n this.state = 'READY'; // don't wait for buffer check timeouts to begin fetching the\n // next segment\n\n if (!this.paused()) {\n this.monitorBuffer_();\n }\n }\n /**\n * abort all pending xhr requests and null any pending segements\n *\n * @private\n */\n\n abort_() {\n if (this.pendingSegment_ && this.pendingSegment_.abortRequests) {\n this.pendingSegment_.abortRequests();\n } // clear out the segment being processed\n\n this.pendingSegment_ = null;\n this.callQueue_ = [];\n this.loadQueue_ = [];\n this.metadataQueue_.id3 = [];\n this.metadataQueue_.caption = [];\n this.timelineChangeController_.clearPendingTimelineChange(this.loaderType_);\n this.waitingOnRemove_ = false;\n window$1.clearTimeout(this.quotaExceededErrorRetryTimeout_);\n this.quotaExceededErrorRetryTimeout_ = null;\n }\n checkForAbort_(requestId) {\n // If the state is APPENDING, then aborts will not modify the state, meaning the first\n // callback that happens should reset the state to READY so that loading can continue.\n if (this.state === 'APPENDING' && !this.pendingSegment_) {\n this.state = 'READY';\n return true;\n }\n if (!this.pendingSegment_ || this.pendingSegment_.requestId !== requestId) {\n return true;\n }\n return false;\n }\n /**\n * set an error on the segment loader and null out any pending segements\n *\n * @param {Error} error the error to set on the SegmentLoader\n * @return {Error} the error that was set or that is currently set\n */\n\n error(error) {\n if (typeof error !== 'undefined') {\n this.logger_('error occurred:', error);\n this.error_ = error;\n }\n this.pendingSegment_ = null;\n return this.error_;\n }\n endOfStream() {\n this.ended_ = true;\n if (this.transmuxer_) {\n // need to clear out any cached data to prepare for the new segment\n segmentTransmuxer.reset(this.transmuxer_);\n }\n this.gopBuffer_.length = 0;\n this.pause();\n this.trigger('ended');\n }\n /**\n * Indicates which time ranges are buffered\n *\n * @return {TimeRange}\n * TimeRange object representing the current buffered ranges\n */\n\n buffered_() {\n const trackInfo = this.getMediaInfo_();\n if (!this.sourceUpdater_ || !trackInfo) {\n return createTimeRanges();\n }\n if (this.loaderType_ === 'main') {\n const {\n hasAudio,\n hasVideo,\n isMuxed\n } = trackInfo;\n if (hasVideo && hasAudio && !this.audioDisabled_ && !isMuxed) {\n return this.sourceUpdater_.buffered();\n }\n if (hasVideo) {\n return this.sourceUpdater_.videoBuffered();\n }\n } // One case that can be ignored for now is audio only with alt audio,\n // as we don't yet have proper support for that.\n\n return this.sourceUpdater_.audioBuffered();\n }\n /**\n * Gets and sets init segment for the provided map\n *\n * @param {Object} map\n * The map object representing the init segment to get or set\n * @param {boolean=} set\n * If true, the init segment for the provided map should be saved\n * @return {Object}\n * map object for desired init segment\n */\n\n initSegmentForMap(map, set = false) {\n if (!map) {\n return null;\n }\n const id = initSegmentId(map);\n let storedMap = this.initSegments_[id];\n if (set && !storedMap && map.bytes) {\n this.initSegments_[id] = storedMap = {\n resolvedUri: map.resolvedUri,\n byterange: map.byterange,\n bytes: map.bytes,\n tracks: map.tracks,\n timescales: map.timescales\n };\n }\n return storedMap || map;\n }\n /**\n * Gets and sets key for the provided key\n *\n * @param {Object} key\n * The key object representing the key to get or set\n * @param {boolean=} set\n * If true, the key for the provided key should be saved\n * @return {Object}\n * Key object for desired key\n */\n\n segmentKey(key, set = false) {\n if (!key) {\n return null;\n }\n const id = segmentKeyId(key);\n let storedKey = this.keyCache_[id]; // TODO: We should use the HTTP Expires header to invalidate our cache per\n // https://tools.ietf.org/html/draft-pantos-http-live-streaming-23#section-6.2.3\n\n if (this.cacheEncryptionKeys_ && set && !storedKey && key.bytes) {\n this.keyCache_[id] = storedKey = {\n resolvedUri: key.resolvedUri,\n bytes: key.bytes\n };\n }\n const result = {\n resolvedUri: (storedKey || key).resolvedUri\n };\n if (storedKey) {\n result.bytes = storedKey.bytes;\n }\n return result;\n }\n /**\n * Returns true if all configuration required for loading is present, otherwise false.\n *\n * @return {boolean} True if the all configuration is ready for loading\n * @private\n */\n\n couldBeginLoading_() {\n return this.playlist_ && !this.paused();\n }\n /**\n * load a playlist and start to fill the buffer\n */\n\n load() {\n // un-pause\n this.monitorBuffer_(); // if we don't have a playlist yet, keep waiting for one to be\n // specified\n\n if (!this.playlist_) {\n return;\n } // if all the configuration is ready, initialize and begin loading\n\n if (this.state === 'INIT' && this.couldBeginLoading_()) {\n return this.init_();\n } // if we're in the middle of processing a segment already, don't\n // kick off an additional segment request\n\n if (!this.couldBeginLoading_() || this.state !== 'READY' && this.state !== 'INIT') {\n return;\n }\n this.state = 'READY';\n }\n /**\n * Once all the starting parameters have been specified, begin\n * operation. This method should only be invoked from the INIT\n * state.\n *\n * @private\n */\n\n init_() {\n this.state = 'READY'; // if this is the audio segment loader, and it hasn't been inited before, then any old\n // audio data from the muxed content should be removed\n\n this.resetEverything();\n return this.monitorBuffer_();\n }\n /**\n * set a playlist on the segment loader\n *\n * @param {PlaylistLoader} media the playlist to set on the segment loader\n */\n\n playlist(newPlaylist, options = {}) {\n if (!newPlaylist) {\n return;\n }\n const oldPlaylist = this.playlist_;\n const segmentInfo = this.pendingSegment_;\n this.playlist_ = newPlaylist;\n this.xhrOptions_ = options; // when we haven't started playing yet, the start of a live playlist\n // is always our zero-time so force a sync update each time the playlist\n // is refreshed from the server\n //\n // Use the INIT state to determine if playback has started, as the playlist sync info\n // should be fixed once requests begin (as sync points are generated based on sync\n // info), but not before then.\n\n if (this.state === 'INIT') {\n newPlaylist.syncInfo = {\n mediaSequence: newPlaylist.mediaSequence,\n time: 0\n }; // Setting the date time mapping means mapping the program date time (if available)\n // to time 0 on the player's timeline. The playlist's syncInfo serves a similar\n // purpose, mapping the initial mediaSequence to time zero. Since the syncInfo can\n // be updated as the playlist is refreshed before the loader starts loading, the\n // program date time mapping needs to be updated as well.\n //\n // This mapping is only done for the main loader because a program date time should\n // map equivalently between playlists.\n\n if (this.loaderType_ === 'main') {\n this.syncController_.setDateTimeMappingForStart(newPlaylist);\n }\n }\n let oldId = null;\n if (oldPlaylist) {\n if (oldPlaylist.id) {\n oldId = oldPlaylist.id;\n } else if (oldPlaylist.uri) {\n oldId = oldPlaylist.uri;\n }\n }\n this.logger_(`playlist update [${oldId} => ${newPlaylist.id || newPlaylist.uri}]`);\n if (this.mediaSequenceSync_) {\n this.mediaSequenceSync_.update(newPlaylist, this.currentTime_());\n this.logger_(`Playlist update:\ncurrentTime: ${this.currentTime_()}\nbufferedEnd: ${lastBufferedEnd(this.buffered_())}\n`, this.mediaSequenceSync_.diagnostics);\n } // in VOD, this is always a rendition switch (or we updated our syncInfo above)\n // in LIVE, we always want to update with new playlists (including refreshes)\n\n this.trigger('syncinfoupdate'); // if we were unpaused but waiting for a playlist, start\n // buffering now\n\n if (this.state === 'INIT' && this.couldBeginLoading_()) {\n return this.init_();\n }\n if (!oldPlaylist || oldPlaylist.uri !== newPlaylist.uri) {\n if (this.mediaIndex !== null) {\n // we must reset/resync the segment loader when we switch renditions and\n // the segment loader is already synced to the previous rendition\n // We only want to reset the loader here for LLHLS playback, as resetLoader sets fetchAtBuffer_\n // to false, resulting in fetching segments at currentTime and causing repeated\n // same-segment requests on playlist change. This erroneously drives up the playback watcher\n // stalled segment count, as re-requesting segments at the currentTime or browser cached segments\n // will not change the buffer.\n // Reference for LLHLS fixes: https://github.com/videojs/http-streaming/pull/1201\n const isLLHLS = !newPlaylist.endList && typeof newPlaylist.partTargetDuration === 'number';\n if (isLLHLS) {\n this.resetLoader();\n } else {\n this.resyncLoader();\n }\n }\n this.currentMediaInfo_ = void 0;\n this.trigger('playlistupdate'); // the rest of this function depends on `oldPlaylist` being defined\n\n return;\n } // we reloaded the same playlist so we are in a live scenario\n // and we will likely need to adjust the mediaIndex\n\n const mediaSequenceDiff = newPlaylist.mediaSequence - oldPlaylist.mediaSequence;\n this.logger_(`live window shift [${mediaSequenceDiff}]`); // update the mediaIndex on the SegmentLoader\n // this is important because we can abort a request and this value must be\n // equal to the last appended mediaIndex\n\n if (this.mediaIndex !== null) {\n this.mediaIndex -= mediaSequenceDiff; // this can happen if we are going to load the first segment, but get a playlist\n // update during that. mediaIndex would go from 0 to -1 if mediaSequence in the\n // new playlist was incremented by 1.\n\n if (this.mediaIndex < 0) {\n this.mediaIndex = null;\n this.partIndex = null;\n } else {\n const segment = this.playlist_.segments[this.mediaIndex]; // partIndex should remain the same for the same segment\n // unless parts fell off of the playlist for this segment.\n // In that case we need to reset partIndex and resync\n\n if (this.partIndex && (!segment.parts || !segment.parts.length || !segment.parts[this.partIndex])) {\n const mediaIndex = this.mediaIndex;\n this.logger_(`currently processing part (index ${this.partIndex}) no longer exists.`);\n this.resetLoader(); // We want to throw away the partIndex and the data associated with it,\n // as the part was dropped from our current playlists segment.\n // The mediaIndex will still be valid so keep that around.\n\n this.mediaIndex = mediaIndex;\n }\n }\n } // update the mediaIndex on the SegmentInfo object\n // this is important because we will update this.mediaIndex with this value\n // in `handleAppendsDone_` after the segment has been successfully appended\n\n if (segmentInfo) {\n segmentInfo.mediaIndex -= mediaSequenceDiff;\n if (segmentInfo.mediaIndex < 0) {\n segmentInfo.mediaIndex = null;\n segmentInfo.partIndex = null;\n } else {\n // we need to update the referenced segment so that timing information is\n // saved for the new playlist's segment, however, if the segment fell off the\n // playlist, we can leave the old reference and just lose the timing info\n if (segmentInfo.mediaIndex >= 0) {\n segmentInfo.segment = newPlaylist.segments[segmentInfo.mediaIndex];\n }\n if (segmentInfo.partIndex >= 0 && segmentInfo.segment.parts) {\n segmentInfo.part = segmentInfo.segment.parts[segmentInfo.partIndex];\n }\n }\n }\n this.syncController_.saveExpiredSegmentInfo(oldPlaylist, newPlaylist);\n }\n /**\n * Prevent the loader from fetching additional segments. If there\n * is a segment request outstanding, it will finish processing\n * before the loader halts. A segment loader can be unpaused by\n * calling load().\n */\n\n pause() {\n if (this.checkBufferTimeout_) {\n window$1.clearTimeout(this.checkBufferTimeout_);\n this.checkBufferTimeout_ = null;\n }\n }\n /**\n * Returns whether the segment loader is fetching additional\n * segments when given the opportunity. This property can be\n * modified through calls to pause() and load().\n */\n\n paused() {\n return this.checkBufferTimeout_ === null;\n }\n /**\n * Delete all the buffered data and reset the SegmentLoader\n *\n * @param {Function} [done] an optional callback to be executed when the remove\n * operation is complete\n */\n\n resetEverything(done) {\n this.ended_ = false;\n this.activeInitSegmentId_ = null;\n this.appendInitSegment_ = {\n audio: true,\n video: true\n };\n this.resetLoader(); // remove from 0, the earliest point, to Infinity, to signify removal of everything.\n // VTT Segment Loader doesn't need to do anything but in the regular SegmentLoader,\n // we then clamp the value to duration if necessary.\n\n this.remove(0, Infinity, done); // clears fmp4 captions\n\n if (this.transmuxer_) {\n this.transmuxer_.postMessage({\n action: 'clearAllMp4Captions'\n }); // reset the cache in the transmuxer\n\n this.transmuxer_.postMessage({\n action: 'reset'\n });\n }\n }\n /**\n * Force the SegmentLoader to resync and start loading around the currentTime instead\n * of starting at the end of the buffer\n *\n * Useful for fast quality changes\n */\n\n resetLoader() {\n this.fetchAtBuffer_ = false;\n if (this.mediaSequenceSync_) {\n this.mediaSequenceSync_.resetAppendedStatus();\n }\n this.resyncLoader();\n }\n /**\n * Force the SegmentLoader to restart synchronization and make a conservative guess\n * before returning to the simple walk-forward method\n */\n\n resyncLoader() {\n if (this.transmuxer_) {\n // need to clear out any cached data to prepare for the new segment\n segmentTransmuxer.reset(this.transmuxer_);\n }\n this.mediaIndex = null;\n this.partIndex = null;\n this.syncPoint_ = null;\n this.isPendingTimestampOffset_ = false; // this is mainly to sync timing-info when switching between renditions with and without timestamp-rollover,\n // so we don't want it for DASH or fragmented mp4 segments.\n\n const isFmp4 = this.currentMediaInfo_ && this.currentMediaInfo_.isFmp4;\n const isHlsTs = this.sourceType_ === 'hls' && !isFmp4;\n if (isHlsTs) {\n this.shouldForceTimestampOffsetAfterResync_ = true;\n }\n this.callQueue_ = [];\n this.loadQueue_ = [];\n this.metadataQueue_.id3 = [];\n this.metadataQueue_.caption = [];\n this.abort();\n if (this.transmuxer_) {\n this.transmuxer_.postMessage({\n action: 'clearParsedMp4Captions'\n });\n }\n }\n /**\n * Remove any data in the source buffer between start and end times\n *\n * @param {number} start - the start time of the region to remove from the buffer\n * @param {number} end - the end time of the region to remove from the buffer\n * @param {Function} [done] - an optional callback to be executed when the remove\n * @param {boolean} force - force all remove operations to happen\n * operation is complete\n */\n\n remove(start, end, done = () => {}, force = false) {\n // clamp end to duration if we need to remove everything.\n // This is due to a browser bug that causes issues if we remove to Infinity.\n // videojs/videojs-contrib-hls#1225\n if (end === Infinity) {\n end = this.duration_();\n } // skip removes that would throw an error\n // commonly happens during a rendition switch at the start of a video\n // from start 0 to end 0\n\n if (end <= start) {\n this.logger_('skipping remove because end ${end} is <= start ${start}');\n return;\n }\n if (!this.sourceUpdater_ || !this.getMediaInfo_()) {\n this.logger_('skipping remove because no source updater or starting media info'); // nothing to remove if we haven't processed any media\n\n return;\n } // set it to one to complete this function's removes\n\n let removesRemaining = 1;\n const removeFinished = () => {\n removesRemaining--;\n if (removesRemaining === 0) {\n done();\n }\n };\n if (force || !this.audioDisabled_) {\n removesRemaining++;\n this.sourceUpdater_.removeAudio(start, end, removeFinished);\n } // While it would be better to only remove video if the main loader has video, this\n // should be safe with audio only as removeVideo will call back even if there's no\n // video buffer.\n //\n // In theory we can check to see if there's video before calling the remove, but in\n // the event that we're switching between renditions and from video to audio only\n // (when we add support for that), we may need to clear the video contents despite\n // what the new media will contain.\n\n if (force || this.loaderType_ === 'main') {\n this.gopBuffer_ = removeGopBuffer(this.gopBuffer_, start, end, this.timeMapping_);\n removesRemaining++;\n this.sourceUpdater_.removeVideo(start, end, removeFinished);\n } // remove any captions and ID3 tags\n\n for (const track in this.inbandTextTracks_) {\n removeCuesFromTrack(start, end, this.inbandTextTracks_[track]);\n }\n removeCuesFromTrack(start, end, this.segmentMetadataTrack_); // finished this function's removes\n\n removeFinished();\n }\n /**\n * (re-)schedule monitorBufferTick_ to run as soon as possible\n *\n * @private\n */\n\n monitorBuffer_() {\n if (this.checkBufferTimeout_) {\n window$1.clearTimeout(this.checkBufferTimeout_);\n }\n this.checkBufferTimeout_ = window$1.setTimeout(this.monitorBufferTick_.bind(this), 1);\n }\n /**\n * As long as the SegmentLoader is in the READY state, periodically\n * invoke fillBuffer_().\n *\n * @private\n */\n\n monitorBufferTick_() {\n if (this.state === 'READY') {\n this.fillBuffer_();\n }\n if (this.checkBufferTimeout_) {\n window$1.clearTimeout(this.checkBufferTimeout_);\n }\n this.checkBufferTimeout_ = window$1.setTimeout(this.monitorBufferTick_.bind(this), CHECK_BUFFER_DELAY);\n }\n /**\n * fill the buffer with segements unless the sourceBuffers are\n * currently updating\n *\n * Note: this function should only ever be called by monitorBuffer_\n * and never directly\n *\n * @private\n */\n\n fillBuffer_() {\n // TODO since the source buffer maintains a queue, and we shouldn't call this function\n // except when we're ready for the next segment, this check can most likely be removed\n if (this.sourceUpdater_.updating()) {\n return;\n } // see if we need to begin loading immediately\n\n const segmentInfo = this.chooseNextRequest_();\n if (!segmentInfo) {\n return;\n }\n const metadata = {\n segmentInfo: segmentInfoPayload({\n type: this.loaderType_,\n segment: segmentInfo\n })\n };\n this.trigger({\n type: 'segmentselected',\n metadata\n });\n if (typeof segmentInfo.timestampOffset === 'number') {\n this.isPendingTimestampOffset_ = false;\n this.timelineChangeController_.pendingTimelineChange({\n type: this.loaderType_,\n from: this.currentTimeline_,\n to: segmentInfo.timeline\n });\n }\n this.loadSegment_(segmentInfo);\n }\n /**\n * Determines if we should call endOfStream on the media source based\n * on the state of the buffer or if appened segment was the final\n * segment in the playlist.\n *\n * @param {number} [mediaIndex] the media index of segment we last appended\n * @param {Object} [playlist] a media playlist object\n * @return {boolean} do we need to call endOfStream on the MediaSource\n */\n\n isEndOfStream_(mediaIndex = this.mediaIndex, playlist = this.playlist_, partIndex = this.partIndex) {\n if (!playlist || !this.mediaSource_) {\n return false;\n }\n const segment = typeof mediaIndex === 'number' && playlist.segments[mediaIndex]; // mediaIndex is zero based but length is 1 based\n\n const appendedLastSegment = mediaIndex + 1 === playlist.segments.length; // true if there are no parts, or this is the last part.\n\n const appendedLastPart = !segment || !segment.parts || partIndex + 1 === segment.parts.length; // if we've buffered to the end of the video, we need to call endOfStream\n // so that MediaSources can trigger the `ended` event when it runs out of\n // buffered data instead of waiting for me\n\n return playlist.endList && this.mediaSource_.readyState === 'open' && appendedLastSegment && appendedLastPart;\n }\n /**\n * Determines what request should be made given current segment loader state.\n *\n * @return {Object} a request object that describes the segment/part to load\n */\n\n chooseNextRequest_() {\n const buffered = this.buffered_();\n const bufferedEnd = lastBufferedEnd(buffered) || 0;\n const bufferedTime = timeAheadOf(buffered, this.currentTime_());\n const preloaded = !this.hasPlayed_() && bufferedTime >= 1;\n const haveEnoughBuffer = bufferedTime >= this.goalBufferLength_();\n const segments = this.playlist_.segments; // return no segment if:\n // 1. we don't have segments\n // 2. The video has not yet played and we already downloaded a segment\n // 3. we already have enough buffered time\n\n if (!segments.length || preloaded || haveEnoughBuffer) {\n return null;\n }\n this.syncPoint_ = this.syncPoint_ || this.syncController_.getSyncPoint(this.playlist_, this.duration_(), this.currentTimeline_, this.currentTime_(), this.loaderType_);\n const next = {\n partIndex: null,\n mediaIndex: null,\n startOfSegment: null,\n playlist: this.playlist_,\n isSyncRequest: Boolean(!this.syncPoint_)\n };\n if (next.isSyncRequest) {\n next.mediaIndex = getSyncSegmentCandidate(this.currentTimeline_, segments, bufferedEnd);\n this.logger_(`choose next request. Can not find sync point. Fallback to media Index: ${next.mediaIndex}`);\n } else if (this.mediaIndex !== null) {\n const segment = segments[this.mediaIndex];\n const partIndex = typeof this.partIndex === 'number' ? this.partIndex : -1;\n next.startOfSegment = segment.end ? segment.end : bufferedEnd;\n if (segment.parts && segment.parts[partIndex + 1]) {\n next.mediaIndex = this.mediaIndex;\n next.partIndex = partIndex + 1;\n } else {\n next.mediaIndex = this.mediaIndex + 1;\n }\n } else {\n let segmentIndex;\n let partIndex;\n let startTime;\n const targetTime = this.fetchAtBuffer_ ? bufferedEnd : this.currentTime_();\n if (this.mediaSequenceSync_) {\n this.logger_(`chooseNextRequest_ request after Quality Switch:\nFor TargetTime: ${targetTime}.\nCurrentTime: ${this.currentTime_()}\nBufferedEnd: ${bufferedEnd}\nFetch At Buffer: ${this.fetchAtBuffer_}\n`, this.mediaSequenceSync_.diagnostics);\n }\n if (this.mediaSequenceSync_ && this.mediaSequenceSync_.isReliable) {\n const syncInfo = this.getSyncInfoFromMediaSequenceSync_(targetTime);\n if (!syncInfo) {\n const message = 'No sync info found while using media sequence sync';\n this.error({\n message,\n metadata: {\n errorType: videojs.Error.StreamingFailedToSelectNextSegment,\n error: new Error(message)\n }\n });\n this.logger_('chooseNextRequest_ - no sync info found using media sequence sync'); // no match\n\n return null;\n }\n this.logger_(`chooseNextRequest_ mediaSequence syncInfo (${syncInfo.start} --> ${syncInfo.end})`);\n segmentIndex = syncInfo.segmentIndex;\n partIndex = syncInfo.partIndex;\n startTime = syncInfo.start;\n } else {\n this.logger_('chooseNextRequest_ - fallback to a regular segment selection algorithm, based on a syncPoint.'); // fallback\n\n const mediaInfoForTime = Playlist.getMediaInfoForTime({\n exactManifestTimings: this.exactManifestTimings,\n playlist: this.playlist_,\n currentTime: targetTime,\n startingPartIndex: this.syncPoint_.partIndex,\n startingSegmentIndex: this.syncPoint_.segmentIndex,\n startTime: this.syncPoint_.time\n });\n segmentIndex = mediaInfoForTime.segmentIndex;\n partIndex = mediaInfoForTime.partIndex;\n startTime = mediaInfoForTime.startTime;\n }\n next.getMediaInfoForTime = this.fetchAtBuffer_ ? `bufferedEnd ${targetTime}` : `currentTime ${targetTime}`;\n next.mediaIndex = segmentIndex;\n next.startOfSegment = startTime;\n next.partIndex = partIndex;\n this.logger_(`choose next request. Playlist switched and we have a sync point. Media Index: ${next.mediaIndex} `);\n }\n const nextSegment = segments[next.mediaIndex];\n let nextPart = nextSegment && typeof next.partIndex === 'number' && nextSegment.parts && nextSegment.parts[next.partIndex]; // if the next segment index is invalid or\n // the next partIndex is invalid do not choose a next segment.\n\n if (!nextSegment || typeof next.partIndex === 'number' && !nextPart) {\n return null;\n } // if the next segment has parts, and we don't have a partIndex.\n // Set partIndex to 0\n\n if (typeof next.partIndex !== 'number' && nextSegment.parts) {\n next.partIndex = 0;\n nextPart = nextSegment.parts[0];\n } // independentSegments applies to every segment in a playlist. If independentSegments appears in a main playlist,\n // it applies to each segment in each media playlist.\n // https://datatracker.ietf.org/doc/html/draft-pantos-http-live-streaming-23#section-4.3.5.1\n\n const hasIndependentSegments = this.vhs_.playlists && this.vhs_.playlists.main && this.vhs_.playlists.main.independentSegments || this.playlist_.independentSegments; // if we have no buffered data then we need to make sure\n // that the next part we append is \"independent\" if possible.\n // So we check if the previous part is independent, and request\n // it if it is.\n\n if (!bufferedTime && nextPart && !hasIndependentSegments && !nextPart.independent) {\n if (next.partIndex === 0) {\n const lastSegment = segments[next.mediaIndex - 1];\n const lastSegmentLastPart = lastSegment.parts && lastSegment.parts.length && lastSegment.parts[lastSegment.parts.length - 1];\n if (lastSegmentLastPart && lastSegmentLastPart.independent) {\n next.mediaIndex -= 1;\n next.partIndex = lastSegment.parts.length - 1;\n next.independent = 'previous segment';\n }\n } else if (nextSegment.parts[next.partIndex - 1].independent) {\n next.partIndex -= 1;\n next.independent = 'previous part';\n }\n }\n const ended = this.mediaSource_ && this.mediaSource_.readyState === 'ended'; // do not choose a next segment if all of the following:\n // 1. this is the last segment in the playlist\n // 2. end of stream has been called on the media source already\n // 3. the player is not seeking\n\n if (next.mediaIndex >= segments.length - 1 && ended && !this.seeking_()) {\n return null;\n }\n if (this.shouldForceTimestampOffsetAfterResync_) {\n this.shouldForceTimestampOffsetAfterResync_ = false;\n next.forceTimestampOffset = true;\n this.logger_('choose next request. Force timestamp offset after loader resync');\n }\n return this.generateSegmentInfo_(next);\n }\n getSyncInfoFromMediaSequenceSync_(targetTime) {\n if (!this.mediaSequenceSync_) {\n return null;\n } // we should pull the target time to the least available time if we drop out of sync for any reason\n\n const finalTargetTime = Math.max(targetTime, this.mediaSequenceSync_.start);\n if (targetTime !== finalTargetTime) {\n this.logger_(`getSyncInfoFromMediaSequenceSync_. Pulled target time from ${targetTime} to ${finalTargetTime}`);\n }\n const mediaSequenceSyncInfo = this.mediaSequenceSync_.getSyncInfoForTime(finalTargetTime);\n if (!mediaSequenceSyncInfo) {\n // no match at all\n return null;\n }\n if (!mediaSequenceSyncInfo.isAppended) {\n // has a perfect match\n return mediaSequenceSyncInfo;\n } // has match, but segment was already appended.\n // attempt to auto-advance to the nearest next segment:\n\n const nextMediaSequenceSyncInfo = this.mediaSequenceSync_.getSyncInfoForTime(mediaSequenceSyncInfo.end);\n if (!nextMediaSequenceSyncInfo) {\n // no match at all\n return null;\n }\n if (nextMediaSequenceSyncInfo.isAppended) {\n this.logger_('getSyncInfoFromMediaSequenceSync_: We encounter unexpected scenario where next media sequence sync info is also appended!');\n } // got match with the nearest next segment\n\n return nextMediaSequenceSyncInfo;\n }\n generateSegmentInfo_(options) {\n const {\n independent,\n playlist,\n mediaIndex,\n startOfSegment,\n isSyncRequest,\n partIndex,\n forceTimestampOffset,\n getMediaInfoForTime\n } = options;\n const segment = playlist.segments[mediaIndex];\n const part = typeof partIndex === 'number' && segment.parts[partIndex];\n const segmentInfo = {\n requestId: 'segment-loader-' + Math.random(),\n // resolve the segment URL relative to the playlist\n uri: part && part.resolvedUri || segment.resolvedUri,\n // the segment's mediaIndex at the time it was requested\n mediaIndex,\n partIndex: part ? partIndex : null,\n // whether or not to update the SegmentLoader's state with this\n // segment's mediaIndex\n isSyncRequest,\n startOfSegment,\n // the segment's playlist\n playlist,\n // unencrypted bytes of the segment\n bytes: null,\n // when a key is defined for this segment, the encrypted bytes\n encryptedBytes: null,\n // The target timestampOffset for this segment when we append it\n // to the source buffer\n timestampOffset: null,\n // The timeline that the segment is in\n timeline: segment.timeline,\n // The expected duration of the segment in seconds\n duration: part && part.duration || segment.duration,\n // retain the segment in case the playlist updates while doing an async process\n segment,\n part,\n byteLength: 0,\n transmuxer: this.transmuxer_,\n // type of getMediaInfoForTime that was used to get this segment\n getMediaInfoForTime,\n independent\n };\n const overrideCheck = typeof forceTimestampOffset !== 'undefined' ? forceTimestampOffset : this.isPendingTimestampOffset_;\n segmentInfo.timestampOffset = this.timestampOffsetForSegment_({\n segmentTimeline: segment.timeline,\n currentTimeline: this.currentTimeline_,\n startOfSegment,\n buffered: this.buffered_(),\n overrideCheck\n });\n const audioBufferedEnd = lastBufferedEnd(this.sourceUpdater_.audioBuffered());\n if (typeof audioBufferedEnd === 'number') {\n // since the transmuxer is using the actual timing values, but the buffer is\n // adjusted by the timestamp offset, we must adjust the value here\n segmentInfo.audioAppendStart = audioBufferedEnd - this.sourceUpdater_.audioTimestampOffset();\n }\n if (this.sourceUpdater_.videoBuffered().length) {\n segmentInfo.gopsToAlignWith = gopsSafeToAlignWith(this.gopBuffer_,\n // since the transmuxer is using the actual timing values, but the time is\n // adjusted by the timestmap offset, we must adjust the value here\n this.currentTime_() - this.sourceUpdater_.videoTimestampOffset(), this.timeMapping_);\n }\n return segmentInfo;\n } // get the timestampoffset for a segment,\n // added so that vtt segment loader can override and prevent\n // adding timestamp offsets.\n\n timestampOffsetForSegment_(options) {\n return timestampOffsetForSegment(options);\n }\n /**\n * Determines if the network has enough bandwidth to complete the current segment\n * request in a timely manner. If not, the request will be aborted early and bandwidth\n * updated to trigger a playlist switch.\n *\n * @param {Object} stats\n * Object containing stats about the request timing and size\n * @private\n */\n\n earlyAbortWhenNeeded_(stats) {\n if (this.vhs_.tech_.paused() ||\n // Don't abort if the current playlist is on the lowestEnabledRendition\n // TODO: Replace using timeout with a boolean indicating whether this playlist is\n // the lowestEnabledRendition.\n !this.xhrOptions_.timeout ||\n // Don't abort if we have no bandwidth information to estimate segment sizes\n !this.playlist_.attributes.BANDWIDTH) {\n return;\n } // Wait at least 1 second since the first byte of data has been received before\n // using the calculated bandwidth from the progress event to allow the bitrate\n // to stabilize\n\n if (Date.now() - (stats.firstBytesReceivedAt || Date.now()) < 1000) {\n return;\n }\n const currentTime = this.currentTime_();\n const measuredBandwidth = stats.bandwidth;\n const segmentDuration = this.pendingSegment_.duration;\n const requestTimeRemaining = Playlist.estimateSegmentRequestTime(segmentDuration, measuredBandwidth, this.playlist_, stats.bytesReceived); // Subtract 1 from the timeUntilRebuffer so we still consider an early abort\n // if we are only left with less than 1 second when the request completes.\n // A negative timeUntilRebuffering indicates we are already rebuffering\n\n const timeUntilRebuffer$1 = timeUntilRebuffer(this.buffered_(), currentTime, this.vhs_.tech_.playbackRate()) - 1; // Only consider aborting early if the estimated time to finish the download\n // is larger than the estimated time until the player runs out of forward buffer\n\n if (requestTimeRemaining <= timeUntilRebuffer$1) {\n return;\n }\n const switchCandidate = minRebufferMaxBandwidthSelector({\n main: this.vhs_.playlists.main,\n currentTime,\n bandwidth: measuredBandwidth,\n duration: this.duration_(),\n segmentDuration,\n timeUntilRebuffer: timeUntilRebuffer$1,\n currentTimeline: this.currentTimeline_,\n syncController: this.syncController_\n });\n if (!switchCandidate) {\n return;\n }\n const rebufferingImpact = requestTimeRemaining - timeUntilRebuffer$1;\n const timeSavedBySwitching = rebufferingImpact - switchCandidate.rebufferingImpact;\n let minimumTimeSaving = 0.5; // If we are already rebuffering, increase the amount of variance we add to the\n // potential round trip time of the new request so that we are not too aggressive\n // with switching to a playlist that might save us a fraction of a second.\n\n if (timeUntilRebuffer$1 <= TIME_FUDGE_FACTOR) {\n minimumTimeSaving = 1;\n }\n if (!switchCandidate.playlist || switchCandidate.playlist.uri === this.playlist_.uri || timeSavedBySwitching < minimumTimeSaving) {\n return;\n } // set the bandwidth to that of the desired playlist being sure to scale by\n // BANDWIDTH_VARIANCE and add one so the playlist selector does not exclude it\n // don't trigger a bandwidthupdate as the bandwidth is artifial\n\n this.bandwidth = switchCandidate.playlist.attributes.BANDWIDTH * Config.BANDWIDTH_VARIANCE + 1;\n this.trigger('earlyabort');\n }\n handleAbort_(segmentInfo) {\n this.logger_(`Aborting ${segmentInfoString(segmentInfo)}`);\n this.mediaRequestsAborted += 1;\n }\n /**\n * XHR `progress` event handler\n *\n * @param {Event}\n * The XHR `progress` event\n * @param {Object} simpleSegment\n * A simplified segment object copy\n * @private\n */\n\n handleProgress_(event, simpleSegment) {\n this.earlyAbortWhenNeeded_(simpleSegment.stats);\n if (this.checkForAbort_(simpleSegment.requestId)) {\n return;\n }\n this.trigger('progress');\n }\n handleTrackInfo_(simpleSegment, trackInfo) {\n const {\n hasAudio,\n hasVideo\n } = trackInfo;\n const metadata = {\n segmentInfo: segmentInfoPayload({\n type: this.loaderType_,\n segment: simpleSegment\n }),\n trackInfo: {\n hasAudio,\n hasVideo\n }\n };\n this.trigger({\n type: 'segmenttransmuxingtrackinfoavailable',\n metadata\n });\n this.earlyAbortWhenNeeded_(simpleSegment.stats);\n if (this.checkForAbort_(simpleSegment.requestId)) {\n return;\n }\n if (this.checkForIllegalMediaSwitch(trackInfo)) {\n return;\n }\n trackInfo = trackInfo || {}; // When we have track info, determine what media types this loader is dealing with.\n // Guard against cases where we're not getting track info at all until we are\n // certain that all streams will provide it.\n\n if (!shallowEqual(this.currentMediaInfo_, trackInfo)) {\n this.appendInitSegment_ = {\n audio: true,\n video: true\n };\n this.startingMediaInfo_ = trackInfo;\n this.currentMediaInfo_ = trackInfo;\n this.logger_('trackinfo update', trackInfo);\n this.trigger('trackinfo');\n } // trackinfo may cause an abort if the trackinfo\n // causes a codec change to an unsupported codec.\n\n if (this.checkForAbort_(simpleSegment.requestId)) {\n return;\n } // set trackinfo on the pending segment so that\n // it can append.\n\n this.pendingSegment_.trackInfo = trackInfo; // check if any calls were waiting on the track info\n\n if (this.hasEnoughInfoToAppend_()) {\n this.processCallQueue_();\n }\n }\n handleTimingInfo_(simpleSegment, mediaType, timeType, time) {\n this.earlyAbortWhenNeeded_(simpleSegment.stats);\n if (this.checkForAbort_(simpleSegment.requestId)) {\n return;\n }\n const segmentInfo = this.pendingSegment_;\n const timingInfoProperty = timingInfoPropertyForMedia(mediaType);\n segmentInfo[timingInfoProperty] = segmentInfo[timingInfoProperty] || {};\n segmentInfo[timingInfoProperty][timeType] = time;\n this.logger_(`timinginfo: ${mediaType} - ${timeType} - ${time}`); // check if any calls were waiting on the timing info\n\n if (this.hasEnoughInfoToAppend_()) {\n this.processCallQueue_();\n }\n }\n handleCaptions_(simpleSegment, captionData) {\n this.earlyAbortWhenNeeded_(simpleSegment.stats);\n if (this.checkForAbort_(simpleSegment.requestId)) {\n return;\n } // This could only happen with fmp4 segments, but\n // should still not happen in general\n\n if (captionData.length === 0) {\n this.logger_('SegmentLoader received no captions from a caption event');\n return;\n }\n const segmentInfo = this.pendingSegment_; // Wait until we have some video data so that caption timing\n // can be adjusted by the timestamp offset\n\n if (!segmentInfo.hasAppendedData_) {\n this.metadataQueue_.caption.push(this.handleCaptions_.bind(this, simpleSegment, captionData));\n return;\n }\n const timestampOffset = this.sourceUpdater_.videoTimestampOffset() === null ? this.sourceUpdater_.audioTimestampOffset() : this.sourceUpdater_.videoTimestampOffset();\n const captionTracks = {}; // get total start/end and captions for each track/stream\n\n captionData.forEach(caption => {\n // caption.stream is actually a track name...\n // set to the existing values in tracks or default values\n captionTracks[caption.stream] = captionTracks[caption.stream] || {\n // Infinity, as any other value will be less than this\n startTime: Infinity,\n captions: [],\n // 0 as an other value will be more than this\n endTime: 0\n };\n const captionTrack = captionTracks[caption.stream];\n captionTrack.startTime = Math.min(captionTrack.startTime, caption.startTime + timestampOffset);\n captionTrack.endTime = Math.max(captionTrack.endTime, caption.endTime + timestampOffset);\n captionTrack.captions.push(caption);\n });\n Object.keys(captionTracks).forEach(trackName => {\n const {\n startTime,\n endTime,\n captions\n } = captionTracks[trackName];\n const inbandTextTracks = this.inbandTextTracks_;\n this.logger_(`adding cues from ${startTime} -> ${endTime} for ${trackName}`);\n createCaptionsTrackIfNotExists(inbandTextTracks, this.vhs_.tech_, trackName); // clear out any cues that start and end at the same time period for the same track.\n // We do this because a rendition change that also changes the timescale for captions\n // will result in captions being re-parsed for certain segments. If we add them again\n // without clearing we will have two of the same captions visible.\n\n removeCuesFromTrack(startTime, endTime, inbandTextTracks[trackName]);\n addCaptionData({\n captionArray: captions,\n inbandTextTracks,\n timestampOffset\n });\n }); // Reset stored captions since we added parsed\n // captions to a text track at this point\n\n if (this.transmuxer_) {\n this.transmuxer_.postMessage({\n action: 'clearParsedMp4Captions'\n });\n }\n }\n handleId3_(simpleSegment, id3Frames, dispatchType) {\n this.earlyAbortWhenNeeded_(simpleSegment.stats);\n if (this.checkForAbort_(simpleSegment.requestId)) {\n return;\n }\n const segmentInfo = this.pendingSegment_; // we need to have appended data in order for the timestamp offset to be set\n\n if (!segmentInfo.hasAppendedData_) {\n this.metadataQueue_.id3.push(this.handleId3_.bind(this, simpleSegment, id3Frames, dispatchType));\n return;\n }\n this.addMetadataToTextTrack(dispatchType, id3Frames, this.duration_());\n }\n processMetadataQueue_() {\n this.metadataQueue_.id3.forEach(fn => fn());\n this.metadataQueue_.caption.forEach(fn => fn());\n this.metadataQueue_.id3 = [];\n this.metadataQueue_.caption = [];\n }\n processCallQueue_() {\n const callQueue = this.callQueue_; // Clear out the queue before the queued functions are run, since some of the\n // functions may check the length of the load queue and default to pushing themselves\n // back onto the queue.\n\n this.callQueue_ = [];\n callQueue.forEach(fun => fun());\n }\n processLoadQueue_() {\n const loadQueue = this.loadQueue_; // Clear out the queue before the queued functions are run, since some of the\n // functions may check the length of the load queue and default to pushing themselves\n // back onto the queue.\n\n this.loadQueue_ = [];\n loadQueue.forEach(fun => fun());\n }\n /**\n * Determines whether the loader has enough info to load the next segment.\n *\n * @return {boolean}\n * Whether or not the loader has enough info to load the next segment\n */\n\n hasEnoughInfoToLoad_() {\n // Since primary timing goes by video, only the audio loader potentially needs to wait\n // to load.\n if (this.loaderType_ !== 'audio') {\n return true;\n }\n const segmentInfo = this.pendingSegment_; // A fill buffer must have already run to establish a pending segment before there's\n // enough info to load.\n\n if (!segmentInfo) {\n return false;\n } // The first segment can and should be loaded immediately so that source buffers are\n // created together (before appending). Source buffer creation uses the presence of\n // audio and video data to determine whether to create audio/video source buffers, and\n // uses processed (transmuxed or parsed) media to determine the types required.\n\n if (!this.getCurrentMediaInfo_()) {\n return true;\n }\n if (\n // Technically, instead of waiting to load a segment on timeline changes, a segment\n // can be requested and downloaded and only wait before it is transmuxed or parsed.\n // But in practice, there are a few reasons why it is better to wait until a loader\n // is ready to append that segment before requesting and downloading:\n //\n // 1. Because audio and main loaders cross discontinuities together, if this loader\n // is waiting for the other to catch up, then instead of requesting another\n // segment and using up more bandwidth, by not yet loading, more bandwidth is\n // allotted to the loader currently behind.\n // 2. media-segment-request doesn't have to have logic to consider whether a segment\n // is ready to be processed or not, isolating the queueing behavior to the loader.\n // 3. The audio loader bases some of its segment properties on timing information\n // provided by the main loader, meaning that, if the logic for waiting on\n // processing was in media-segment-request, then it would also need to know how\n // to re-generate the segment information after the main loader caught up.\n shouldWaitForTimelineChange({\n timelineChangeController: this.timelineChangeController_,\n currentTimeline: this.currentTimeline_,\n segmentTimeline: segmentInfo.timeline,\n loaderType: this.loaderType_,\n audioDisabled: this.audioDisabled_\n })) {\n return false;\n }\n return true;\n }\n getCurrentMediaInfo_(segmentInfo = this.pendingSegment_) {\n return segmentInfo && segmentInfo.trackInfo || this.currentMediaInfo_;\n }\n getMediaInfo_(segmentInfo = this.pendingSegment_) {\n return this.getCurrentMediaInfo_(segmentInfo) || this.startingMediaInfo_;\n }\n getPendingSegmentPlaylist() {\n return this.pendingSegment_ ? this.pendingSegment_.playlist : null;\n }\n hasEnoughInfoToAppend_() {\n if (!this.sourceUpdater_.ready()) {\n return false;\n } // If content needs to be removed or the loader is waiting on an append reattempt,\n // then no additional content should be appended until the prior append is resolved.\n\n if (this.waitingOnRemove_ || this.quotaExceededErrorRetryTimeout_) {\n return false;\n }\n const segmentInfo = this.pendingSegment_;\n const trackInfo = this.getCurrentMediaInfo_(); // no segment to append any data for or\n // we do not have information on this specific\n // segment yet\n\n if (!segmentInfo || !trackInfo) {\n return false;\n }\n const {\n hasAudio,\n hasVideo,\n isMuxed\n } = trackInfo;\n if (hasVideo && !segmentInfo.videoTimingInfo) {\n return false;\n } // muxed content only relies on video timing information for now.\n\n if (hasAudio && !this.audioDisabled_ && !isMuxed && !segmentInfo.audioTimingInfo) {\n return false;\n }\n if (shouldWaitForTimelineChange({\n timelineChangeController: this.timelineChangeController_,\n currentTimeline: this.currentTimeline_,\n segmentTimeline: segmentInfo.timeline,\n loaderType: this.loaderType_,\n audioDisabled: this.audioDisabled_\n })) {\n return false;\n }\n return true;\n }\n handleData_(simpleSegment, result) {\n this.earlyAbortWhenNeeded_(simpleSegment.stats);\n if (this.checkForAbort_(simpleSegment.requestId)) {\n return;\n } // If there's anything in the call queue, then this data came later and should be\n // executed after the calls currently queued.\n\n if (this.callQueue_.length || !this.hasEnoughInfoToAppend_()) {\n this.callQueue_.push(this.handleData_.bind(this, simpleSegment, result));\n return;\n }\n const segmentInfo = this.pendingSegment_; // update the time mapping so we can translate from display time to media time\n\n this.setTimeMapping_(segmentInfo.timeline); // for tracking overall stats\n\n this.updateMediaSecondsLoaded_(segmentInfo.part || segmentInfo.segment); // Note that the state isn't changed from loading to appending. This is because abort\n // logic may change behavior depending on the state, and changing state too early may\n // inflate our estimates of bandwidth. In the future this should be re-examined to\n // note more granular states.\n // don't process and append data if the mediaSource is closed\n\n if (this.mediaSource_.readyState === 'closed') {\n return;\n } // if this request included an initialization segment, save that data\n // to the initSegment cache\n\n if (simpleSegment.map) {\n simpleSegment.map = this.initSegmentForMap(simpleSegment.map, true); // move over init segment properties to media request\n\n segmentInfo.segment.map = simpleSegment.map;\n } // if this request included a segment key, save that data in the cache\n\n if (simpleSegment.key) {\n this.segmentKey(simpleSegment.key, true);\n }\n segmentInfo.isFmp4 = simpleSegment.isFmp4;\n segmentInfo.timingInfo = segmentInfo.timingInfo || {};\n if (segmentInfo.isFmp4) {\n this.trigger('fmp4');\n segmentInfo.timingInfo.start = segmentInfo[timingInfoPropertyForMedia(result.type)].start;\n } else {\n const trackInfo = this.getCurrentMediaInfo_();\n const useVideoTimingInfo = this.loaderType_ === 'main' && trackInfo && trackInfo.hasVideo;\n let firstVideoFrameTimeForData;\n if (useVideoTimingInfo) {\n firstVideoFrameTimeForData = segmentInfo.videoTimingInfo.start;\n } // Segment loader knows more about segment timing than the transmuxer (in certain\n // aspects), so make any changes required for a more accurate start time.\n // Don't set the end time yet, as the segment may not be finished processing.\n\n segmentInfo.timingInfo.start = this.trueSegmentStart_({\n currentStart: segmentInfo.timingInfo.start,\n playlist: segmentInfo.playlist,\n mediaIndex: segmentInfo.mediaIndex,\n currentVideoTimestampOffset: this.sourceUpdater_.videoTimestampOffset(),\n useVideoTimingInfo,\n firstVideoFrameTimeForData,\n videoTimingInfo: segmentInfo.videoTimingInfo,\n audioTimingInfo: segmentInfo.audioTimingInfo\n });\n } // Init segments for audio and video only need to be appended in certain cases. Now\n // that data is about to be appended, we can check the final cases to determine\n // whether we should append an init segment.\n\n this.updateAppendInitSegmentStatus(segmentInfo, result.type); // Timestamp offset should be updated once we get new data and have its timing info,\n // as we use the start of the segment to offset the best guess (playlist provided)\n // timestamp offset.\n\n this.updateSourceBufferTimestampOffset_(segmentInfo); // if this is a sync request we need to determine whether it should\n // be appended or not.\n\n if (segmentInfo.isSyncRequest) {\n // first save/update our timing info for this segment.\n // this is what allows us to choose an accurate segment\n // and the main reason we make a sync request.\n this.updateTimingInfoEnd_(segmentInfo);\n this.syncController_.saveSegmentTimingInfo({\n segmentInfo,\n shouldSaveTimelineMapping: this.loaderType_ === 'main'\n });\n const next = this.chooseNextRequest_(); // If the sync request isn't the segment that would be requested next\n // after taking into account its timing info, do not append it.\n\n if (next.mediaIndex !== segmentInfo.mediaIndex || next.partIndex !== segmentInfo.partIndex) {\n this.logger_('sync segment was incorrect, not appending');\n return;\n } // otherwise append it like any other segment as our guess was correct.\n\n this.logger_('sync segment was correct, appending');\n } // Save some state so that in the future anything waiting on first append (and/or\n // timestamp offset(s)) can process immediately. While the extra state isn't optimal,\n // we need some notion of whether the timestamp offset or other relevant information\n // has had a chance to be set.\n\n segmentInfo.hasAppendedData_ = true; // Now that the timestamp offset should be set, we can append any waiting ID3 tags.\n\n this.processMetadataQueue_();\n this.appendData_(segmentInfo, result);\n }\n updateAppendInitSegmentStatus(segmentInfo, type) {\n // alt audio doesn't manage timestamp offset\n if (this.loaderType_ === 'main' && typeof segmentInfo.timestampOffset === 'number' &&\n // in the case that we're handling partial data, we don't want to append an init\n // segment for each chunk\n !segmentInfo.changedTimestampOffset) {\n // if the timestamp offset changed, the timeline may have changed, so we have to re-\n // append init segments\n this.appendInitSegment_ = {\n audio: true,\n video: true\n };\n }\n if (this.playlistOfLastInitSegment_[type] !== segmentInfo.playlist) {\n // make sure we append init segment on playlist changes, in case the media config\n // changed\n this.appendInitSegment_[type] = true;\n }\n }\n getInitSegmentAndUpdateState_({\n type,\n initSegment,\n map,\n playlist\n }) {\n // \"The EXT-X-MAP tag specifies how to obtain the Media Initialization Section\n // (Section 3) required to parse the applicable Media Segments. It applies to every\n // Media Segment that appears after it in the Playlist until the next EXT-X-MAP tag\n // or until the end of the playlist.\"\n // https://tools.ietf.org/html/draft-pantos-http-live-streaming-23#section-4.3.2.5\n if (map) {\n const id = initSegmentId(map);\n if (this.activeInitSegmentId_ === id) {\n // don't need to re-append the init segment if the ID matches\n return null;\n } // a map-specified init segment takes priority over any transmuxed (or otherwise\n // obtained) init segment\n //\n // this also caches the init segment for later use\n\n initSegment = this.initSegmentForMap(map, true).bytes;\n this.activeInitSegmentId_ = id;\n } // We used to always prepend init segments for video, however, that shouldn't be\n // necessary. Instead, we should only append on changes, similar to what we've always\n // done for audio. This is more important (though may not be that important) for\n // frame-by-frame appending for LHLS, simply because of the increased quantity of\n // appends.\n\n if (initSegment && this.appendInitSegment_[type]) {\n // Make sure we track the playlist that we last used for the init segment, so that\n // we can re-append the init segment in the event that we get data from a new\n // playlist. Discontinuities and track changes are handled in other sections.\n this.playlistOfLastInitSegment_[type] = playlist; // Disable future init segment appends for this type. Until a change is necessary.\n\n this.appendInitSegment_[type] = false; // we need to clear out the fmp4 active init segment id, since\n // we are appending the muxer init segment\n\n this.activeInitSegmentId_ = null;\n return initSegment;\n }\n return null;\n }\n handleQuotaExceededError_({\n segmentInfo,\n type,\n bytes\n }, error) {\n const audioBuffered = this.sourceUpdater_.audioBuffered();\n const videoBuffered = this.sourceUpdater_.videoBuffered(); // For now we're ignoring any notion of gaps in the buffer, but they, in theory,\n // should be cleared out during the buffer removals. However, log in case it helps\n // debug.\n\n if (audioBuffered.length > 1) {\n this.logger_('On QUOTA_EXCEEDED_ERR, found gaps in the audio buffer: ' + timeRangesToArray(audioBuffered).join(', '));\n }\n if (videoBuffered.length > 1) {\n this.logger_('On QUOTA_EXCEEDED_ERR, found gaps in the video buffer: ' + timeRangesToArray(videoBuffered).join(', '));\n }\n const audioBufferStart = audioBuffered.length ? audioBuffered.start(0) : 0;\n const audioBufferEnd = audioBuffered.length ? audioBuffered.end(audioBuffered.length - 1) : 0;\n const videoBufferStart = videoBuffered.length ? videoBuffered.start(0) : 0;\n const videoBufferEnd = videoBuffered.length ? videoBuffered.end(videoBuffered.length - 1) : 0;\n if (audioBufferEnd - audioBufferStart <= MIN_BACK_BUFFER && videoBufferEnd - videoBufferStart <= MIN_BACK_BUFFER) {\n // Can't remove enough buffer to make room for new segment (or the browser doesn't\n // allow for appends of segments this size). In the future, it may be possible to\n // split up the segment and append in pieces, but for now, error out this playlist\n // in an attempt to switch to a more manageable rendition.\n this.logger_('On QUOTA_EXCEEDED_ERR, single segment too large to append to ' + 'buffer, triggering an error. ' + `Appended byte length: ${bytes.byteLength}, ` + `audio buffer: ${timeRangesToArray(audioBuffered).join(', ')}, ` + `video buffer: ${timeRangesToArray(videoBuffered).join(', ')}, `);\n this.error({\n message: 'Quota exceeded error with append of a single segment of content',\n excludeUntil: Infinity\n });\n this.trigger('error');\n return;\n } // To try to resolve the quota exceeded error, clear back buffer and retry. This means\n // that the segment-loader should block on future events until this one is handled, so\n // that it doesn't keep moving onto further segments. Adding the call to the call\n // queue will prevent further appends until waitingOnRemove_ and\n // quotaExceededErrorRetryTimeout_ are cleared.\n //\n // Note that this will only block the current loader. In the case of demuxed content,\n // the other load may keep filling as fast as possible. In practice, this should be\n // OK, as it is a rare case when either audio has a high enough bitrate to fill up a\n // source buffer, or video fills without enough room for audio to append (and without\n // the availability of clearing out seconds of back buffer to make room for audio).\n // But it might still be good to handle this case in the future as a TODO.\n\n this.waitingOnRemove_ = true;\n this.callQueue_.push(this.appendToSourceBuffer_.bind(this, {\n segmentInfo,\n type,\n bytes\n }));\n const currentTime = this.currentTime_(); // Try to remove as much audio and video as possible to make room for new content\n // before retrying.\n\n const timeToRemoveUntil = currentTime - MIN_BACK_BUFFER;\n this.logger_(`On QUOTA_EXCEEDED_ERR, removing audio/video from 0 to ${timeToRemoveUntil}`);\n this.remove(0, timeToRemoveUntil, () => {\n this.logger_(`On QUOTA_EXCEEDED_ERR, retrying append in ${MIN_BACK_BUFFER}s`);\n this.waitingOnRemove_ = false; // wait the length of time alotted in the back buffer to prevent wasted\n // attempts (since we can't clear less than the minimum)\n\n this.quotaExceededErrorRetryTimeout_ = window$1.setTimeout(() => {\n this.logger_('On QUOTA_EXCEEDED_ERR, re-processing call queue');\n this.quotaExceededErrorRetryTimeout_ = null;\n this.processCallQueue_();\n }, MIN_BACK_BUFFER * 1000);\n }, true);\n }\n handleAppendError_({\n segmentInfo,\n type,\n bytes\n }, error) {\n // if there's no error, nothing to do\n if (!error) {\n return;\n }\n if (error.code === QUOTA_EXCEEDED_ERR) {\n this.handleQuotaExceededError_({\n segmentInfo,\n type,\n bytes\n }); // A quota exceeded error should be recoverable with a future re-append, so no need\n // to trigger an append error.\n\n return;\n }\n this.logger_('Received non QUOTA_EXCEEDED_ERR on append', error); // If an append errors, we often can't recover.\n // (see https://w3c.github.io/media-source/#sourcebuffer-append-error).\n //\n // Trigger a special error so that it can be handled separately from normal,\n // recoverable errors.\n\n this.error({\n message: `${type} append of ${bytes.length}b failed for segment ` + `#${segmentInfo.mediaIndex} in playlist ${segmentInfo.playlist.id}`,\n metadata: {\n errorType: videojs.Error.StreamingFailedToAppendSegment\n }\n });\n this.trigger('appenderror');\n }\n appendToSourceBuffer_({\n segmentInfo,\n type,\n initSegment,\n data,\n bytes\n }) {\n // If this is a re-append, bytes were already created and don't need to be recreated\n if (!bytes) {\n const segments = [data];\n let byteLength = data.byteLength;\n if (initSegment) {\n // if the media initialization segment is changing, append it before the content\n // segment\n segments.unshift(initSegment);\n byteLength += initSegment.byteLength;\n } // Technically we should be OK appending the init segment separately, however, we\n // haven't yet tested that, and prepending is how we have always done things.\n\n bytes = concatSegments({\n bytes: byteLength,\n segments\n });\n }\n const metadata = {\n segmentInfo: segmentInfoPayload({\n type: this.loaderType_,\n segment: segmentInfo\n })\n };\n this.trigger({\n type: 'segmentappendstart',\n metadata\n });\n this.sourceUpdater_.appendBuffer({\n segmentInfo,\n type,\n bytes\n }, this.handleAppendError_.bind(this, {\n segmentInfo,\n type,\n bytes\n }));\n }\n handleSegmentTimingInfo_(type, requestId, segmentTimingInfo) {\n if (!this.pendingSegment_ || requestId !== this.pendingSegment_.requestId) {\n return;\n }\n const segment = this.pendingSegment_.segment;\n const timingInfoProperty = `${type}TimingInfo`;\n if (!segment[timingInfoProperty]) {\n segment[timingInfoProperty] = {};\n }\n segment[timingInfoProperty].transmuxerPrependedSeconds = segmentTimingInfo.prependedContentDuration || 0;\n segment[timingInfoProperty].transmuxedPresentationStart = segmentTimingInfo.start.presentation;\n segment[timingInfoProperty].transmuxedDecodeStart = segmentTimingInfo.start.decode;\n segment[timingInfoProperty].transmuxedPresentationEnd = segmentTimingInfo.end.presentation;\n segment[timingInfoProperty].transmuxedDecodeEnd = segmentTimingInfo.end.decode; // mainly used as a reference for debugging\n\n segment[timingInfoProperty].baseMediaDecodeTime = segmentTimingInfo.baseMediaDecodeTime;\n }\n appendData_(segmentInfo, result) {\n const {\n type,\n data\n } = result;\n if (!data || !data.byteLength) {\n return;\n }\n if (type === 'audio' && this.audioDisabled_) {\n return;\n }\n const initSegment = this.getInitSegmentAndUpdateState_({\n type,\n initSegment: result.initSegment,\n playlist: segmentInfo.playlist,\n map: segmentInfo.isFmp4 ? segmentInfo.segment.map : null\n });\n this.appendToSourceBuffer_({\n segmentInfo,\n type,\n initSegment,\n data\n });\n }\n /**\n * load a specific segment from a request into the buffer\n *\n * @private\n */\n\n loadSegment_(segmentInfo) {\n this.state = 'WAITING';\n this.pendingSegment_ = segmentInfo;\n this.trimBackBuffer_(segmentInfo);\n if (typeof segmentInfo.timestampOffset === 'number') {\n if (this.transmuxer_) {\n this.transmuxer_.postMessage({\n action: 'clearAllMp4Captions'\n });\n }\n }\n if (!this.hasEnoughInfoToLoad_()) {\n this.loadQueue_.push(() => {\n // regenerate the audioAppendStart, timestampOffset, etc as they\n // may have changed since this function was added to the queue.\n const options = _extends({}, segmentInfo, {\n forceTimestampOffset: true\n });\n _extends(segmentInfo, this.generateSegmentInfo_(options));\n this.isPendingTimestampOffset_ = false;\n this.updateTransmuxerAndRequestSegment_(segmentInfo);\n });\n return;\n }\n this.updateTransmuxerAndRequestSegment_(segmentInfo);\n }\n updateTransmuxerAndRequestSegment_(segmentInfo) {\n // We'll update the source buffer's timestamp offset once we have transmuxed data, but\n // the transmuxer still needs to be updated before then.\n //\n // Even though keepOriginalTimestamps is set to true for the transmuxer, timestamp\n // offset must be passed to the transmuxer for stream correcting adjustments.\n if (this.shouldUpdateTransmuxerTimestampOffset_(segmentInfo.timestampOffset)) {\n this.gopBuffer_.length = 0; // gopsToAlignWith was set before the GOP buffer was cleared\n\n segmentInfo.gopsToAlignWith = [];\n this.timeMapping_ = 0; // reset values in the transmuxer since a discontinuity should start fresh\n\n this.transmuxer_.postMessage({\n action: 'reset'\n });\n this.transmuxer_.postMessage({\n action: 'setTimestampOffset',\n timestampOffset: segmentInfo.timestampOffset\n });\n }\n const simpleSegment = this.createSimplifiedSegmentObj_(segmentInfo);\n const isEndOfStream = this.isEndOfStream_(segmentInfo.mediaIndex, segmentInfo.playlist, segmentInfo.partIndex);\n const isWalkingForward = this.mediaIndex !== null;\n const isDiscontinuity = segmentInfo.timeline !== this.currentTimeline_ &&\n // currentTimeline starts at -1, so we shouldn't end the timeline switching to 0,\n // the first timeline\n segmentInfo.timeline > 0;\n const isEndOfTimeline = isEndOfStream || isWalkingForward && isDiscontinuity;\n this.logger_(`Requesting\n${compactSegmentUrlDescription(segmentInfo.uri)}\n${segmentInfoString(segmentInfo)}`); // If there's an init segment associated with this segment, but it is not cached (identified by a lack of bytes),\n // then this init segment has never been seen before and should be appended.\n //\n // At this point the content type (audio/video or both) is not yet known, but it should be safe to set\n // both to true and leave the decision of whether to append the init segment to append time.\n\n if (simpleSegment.map && !simpleSegment.map.bytes) {\n this.logger_('going to request init segment.');\n this.appendInitSegment_ = {\n video: true,\n audio: true\n };\n }\n segmentInfo.abortRequests = mediaSegmentRequest({\n xhr: this.vhs_.xhr,\n xhrOptions: this.xhrOptions_,\n decryptionWorker: this.decrypter_,\n segment: simpleSegment,\n abortFn: this.handleAbort_.bind(this, segmentInfo),\n progressFn: this.handleProgress_.bind(this),\n trackInfoFn: this.handleTrackInfo_.bind(this),\n timingInfoFn: this.handleTimingInfo_.bind(this),\n videoSegmentTimingInfoFn: this.handleSegmentTimingInfo_.bind(this, 'video', segmentInfo.requestId),\n audioSegmentTimingInfoFn: this.handleSegmentTimingInfo_.bind(this, 'audio', segmentInfo.requestId),\n captionsFn: this.handleCaptions_.bind(this),\n isEndOfTimeline,\n endedTimelineFn: () => {\n this.logger_('received endedtimeline callback');\n },\n id3Fn: this.handleId3_.bind(this),\n dataFn: this.handleData_.bind(this),\n doneFn: this.segmentRequestFinished_.bind(this),\n onTransmuxerLog: ({\n message,\n level,\n stream\n }) => {\n this.logger_(`${segmentInfoString(segmentInfo)} logged from transmuxer stream ${stream} as a ${level}: ${message}`);\n },\n triggerSegmentEventFn: ({\n type,\n segment,\n keyInfo,\n trackInfo,\n timingInfo\n }) => {\n const segInfo = segmentInfoPayload({\n segment\n });\n const metadata = {\n segmentInfo: segInfo\n }; // add other properties if necessary.\n\n if (keyInfo) {\n metadata.keyInfo = keyInfo;\n }\n if (trackInfo) {\n metadata.trackInfo = trackInfo;\n }\n if (timingInfo) {\n metadata.timingInfo = timingInfo;\n }\n this.trigger({\n type,\n metadata\n });\n }\n });\n }\n /**\n * trim the back buffer so that we don't have too much data\n * in the source buffer\n *\n * @private\n *\n * @param {Object} segmentInfo - the current segment\n */\n\n trimBackBuffer_(segmentInfo) {\n const removeToTime = safeBackBufferTrimTime(this.seekable_(), this.currentTime_(), this.playlist_.targetDuration || 10); // Chrome has a hard limit of 150MB of\n // buffer and a very conservative \"garbage collector\"\n // We manually clear out the old buffer to ensure\n // we don't trigger the QuotaExceeded error\n // on the source buffer during subsequent appends\n\n if (removeToTime > 0) {\n this.remove(0, removeToTime);\n }\n }\n /**\n * created a simplified copy of the segment object with just the\n * information necessary to perform the XHR and decryption\n *\n * @private\n *\n * @param {Object} segmentInfo - the current segment\n * @return {Object} a simplified segment object copy\n */\n\n createSimplifiedSegmentObj_(segmentInfo) {\n const segment = segmentInfo.segment;\n const part = segmentInfo.part;\n const isEncrypted = segmentInfo.segment.key || segmentInfo.segment.map && segmentInfo.segment.map.key;\n const isMediaInitialization = segmentInfo.segment.map && !segmentInfo.segment.map.bytes;\n const simpleSegment = {\n resolvedUri: part ? part.resolvedUri : segment.resolvedUri,\n byterange: part ? part.byterange : segment.byterange,\n requestId: segmentInfo.requestId,\n transmuxer: segmentInfo.transmuxer,\n audioAppendStart: segmentInfo.audioAppendStart,\n gopsToAlignWith: segmentInfo.gopsToAlignWith,\n part: segmentInfo.part,\n type: this.loaderType_,\n start: segmentInfo.startOfSegment,\n duration: segmentInfo.duration,\n isEncrypted,\n isMediaInitialization\n };\n const previousSegment = segmentInfo.playlist.segments[segmentInfo.mediaIndex - 1];\n if (previousSegment && previousSegment.timeline === segment.timeline) {\n // The baseStartTime of a segment is used to handle rollover when probing the TS\n // segment to retrieve timing information. Since the probe only looks at the media's\n // times (e.g., PTS and DTS values of the segment), and doesn't consider the\n // player's time (e.g., player.currentTime()), baseStartTime should reflect the\n // media time as well. transmuxedDecodeEnd represents the end time of a segment, in\n // seconds of media time, so should be used here. The previous segment is used since\n // the end of the previous segment should represent the beginning of the current\n // segment, so long as they are on the same timeline.\n if (previousSegment.videoTimingInfo) {\n simpleSegment.baseStartTime = previousSegment.videoTimingInfo.transmuxedDecodeEnd;\n } else if (previousSegment.audioTimingInfo) {\n simpleSegment.baseStartTime = previousSegment.audioTimingInfo.transmuxedDecodeEnd;\n }\n }\n if (segment.key) {\n // if the media sequence is greater than 2^32, the IV will be incorrect\n // assuming 10s segments, that would be about 1300 years\n const iv = segment.key.iv || new Uint32Array([0, 0, 0, segmentInfo.mediaIndex + segmentInfo.playlist.mediaSequence]);\n simpleSegment.key = this.segmentKey(segment.key);\n simpleSegment.key.iv = iv;\n }\n if (segment.map) {\n simpleSegment.map = this.initSegmentForMap(segment.map);\n }\n return simpleSegment;\n }\n saveTransferStats_(stats) {\n // every request counts as a media request even if it has been aborted\n // or canceled due to a timeout\n this.mediaRequests += 1;\n if (stats) {\n this.mediaBytesTransferred += stats.bytesReceived;\n this.mediaTransferDuration += stats.roundTripTime;\n }\n }\n saveBandwidthRelatedStats_(duration, stats) {\n // byteLength will be used for throughput, and should be based on bytes receieved,\n // which we only know at the end of the request and should reflect total bytes\n // downloaded rather than just bytes processed from components of the segment\n this.pendingSegment_.byteLength = stats.bytesReceived;\n if (duration < MIN_SEGMENT_DURATION_TO_SAVE_STATS) {\n this.logger_(`Ignoring segment's bandwidth because its duration of ${duration}` + ` is less than the min to record ${MIN_SEGMENT_DURATION_TO_SAVE_STATS}`);\n return;\n }\n const metadata = {\n bandwidthInfo: {\n from: this.bandwidth,\n to: stats.bandwidth\n }\n }; // player event with payload\n\n this.trigger({\n type: 'bandwidthupdated',\n metadata\n });\n this.bandwidth = stats.bandwidth;\n this.roundTrip = stats.roundTripTime;\n }\n handleTimeout_() {\n // although the VTT segment loader bandwidth isn't really used, it's good to\n // maintain functinality between segment loaders\n this.mediaRequestsTimedout += 1;\n this.bandwidth = 1;\n this.roundTrip = NaN;\n this.trigger('bandwidthupdate');\n this.trigger('timeout');\n }\n /**\n * Handle the callback from the segmentRequest function and set the\n * associated SegmentLoader state and errors if necessary\n *\n * @private\n */\n\n segmentRequestFinished_(error, simpleSegment, result) {\n // TODO handle special cases, e.g., muxed audio/video but only audio in the segment\n // check the call queue directly since this function doesn't need to deal with any\n // data, and can continue even if the source buffers are not set up and we didn't get\n // any data from the segment\n if (this.callQueue_.length) {\n this.callQueue_.push(this.segmentRequestFinished_.bind(this, error, simpleSegment, result));\n return;\n }\n this.saveTransferStats_(simpleSegment.stats); // The request was aborted and the SegmentLoader has already been reset\n\n if (!this.pendingSegment_) {\n return;\n } // the request was aborted and the SegmentLoader has already started\n // another request. this can happen when the timeout for an aborted\n // request triggers due to a limitation in the XHR library\n // do not count this as any sort of request or we risk double-counting\n\n if (simpleSegment.requestId !== this.pendingSegment_.requestId) {\n return;\n } // an error occurred from the active pendingSegment_ so reset everything\n\n if (error) {\n this.pendingSegment_ = null;\n this.state = 'READY'; // aborts are not a true error condition and nothing corrective needs to be done\n\n if (error.code === REQUEST_ERRORS.ABORTED) {\n return;\n }\n this.pause(); // the error is really just that at least one of the requests timed-out\n // set the bandwidth to a very low value and trigger an ABR switch to\n // take emergency action\n\n if (error.code === REQUEST_ERRORS.TIMEOUT) {\n this.handleTimeout_();\n return;\n } // if control-flow has arrived here, then the error is real\n // emit an error event to exclude the current playlist\n\n this.mediaRequestsErrored += 1;\n this.error(error);\n this.trigger('error');\n return;\n }\n const segmentInfo = this.pendingSegment_; // the response was a success so set any bandwidth stats the request\n // generated for ABR purposes\n\n this.saveBandwidthRelatedStats_(segmentInfo.duration, simpleSegment.stats);\n segmentInfo.endOfAllRequests = simpleSegment.endOfAllRequests;\n if (result.gopInfo) {\n this.gopBuffer_ = updateGopBuffer(this.gopBuffer_, result.gopInfo, this.safeAppend_);\n } // Although we may have already started appending on progress, we shouldn't switch the\n // state away from loading until we are officially done loading the segment data.\n\n this.state = 'APPENDING'; // used for testing\n\n this.trigger('appending');\n this.waitForAppendsToComplete_(segmentInfo);\n }\n setTimeMapping_(timeline) {\n const timelineMapping = this.syncController_.mappingForTimeline(timeline);\n if (timelineMapping !== null) {\n this.timeMapping_ = timelineMapping;\n }\n }\n updateMediaSecondsLoaded_(segment) {\n if (typeof segment.start === 'number' && typeof segment.end === 'number') {\n this.mediaSecondsLoaded += segment.end - segment.start;\n } else {\n this.mediaSecondsLoaded += segment.duration;\n }\n }\n shouldUpdateTransmuxerTimestampOffset_(timestampOffset) {\n if (timestampOffset === null) {\n return false;\n } // note that we're potentially using the same timestamp offset for both video and\n // audio\n\n if (this.loaderType_ === 'main' && timestampOffset !== this.sourceUpdater_.videoTimestampOffset()) {\n return true;\n }\n if (!this.audioDisabled_ && timestampOffset !== this.sourceUpdater_.audioTimestampOffset()) {\n return true;\n }\n return false;\n }\n trueSegmentStart_({\n currentStart,\n playlist,\n mediaIndex,\n firstVideoFrameTimeForData,\n currentVideoTimestampOffset,\n useVideoTimingInfo,\n videoTimingInfo,\n audioTimingInfo\n }) {\n if (typeof currentStart !== 'undefined') {\n // if start was set once, keep using it\n return currentStart;\n }\n if (!useVideoTimingInfo) {\n return audioTimingInfo.start;\n }\n const previousSegment = playlist.segments[mediaIndex - 1]; // The start of a segment should be the start of the first full frame contained\n // within that segment. Since the transmuxer maintains a cache of incomplete data\n // from and/or the last frame seen, the start time may reflect a frame that starts\n // in the previous segment. Check for that case and ensure the start time is\n // accurate for the segment.\n\n if (mediaIndex === 0 || !previousSegment || typeof previousSegment.start === 'undefined' || previousSegment.end !== firstVideoFrameTimeForData + currentVideoTimestampOffset) {\n return firstVideoFrameTimeForData;\n }\n return videoTimingInfo.start;\n }\n waitForAppendsToComplete_(segmentInfo) {\n const trackInfo = this.getCurrentMediaInfo_(segmentInfo);\n if (!trackInfo) {\n this.error({\n message: 'No starting media returned, likely due to an unsupported media format.',\n playlistExclusionDuration: Infinity\n });\n this.trigger('error');\n return;\n } // Although transmuxing is done, appends may not yet be finished. Throw a marker\n // on each queue this loader is responsible for to ensure that the appends are\n // complete.\n\n const {\n hasAudio,\n hasVideo,\n isMuxed\n } = trackInfo;\n const waitForVideo = this.loaderType_ === 'main' && hasVideo;\n const waitForAudio = !this.audioDisabled_ && hasAudio && !isMuxed;\n segmentInfo.waitingOnAppends = 0; // segments with no data\n\n if (!segmentInfo.hasAppendedData_) {\n if (!segmentInfo.timingInfo && typeof segmentInfo.timestampOffset === 'number') {\n // When there's no audio or video data in the segment, there's no audio or video\n // timing information.\n //\n // If there's no audio or video timing information, then the timestamp offset\n // can't be adjusted to the appropriate value for the transmuxer and source\n // buffers.\n //\n // Therefore, the next segment should be used to set the timestamp offset.\n this.isPendingTimestampOffset_ = true;\n } // override settings for metadata only segments\n\n segmentInfo.timingInfo = {\n start: 0\n };\n segmentInfo.waitingOnAppends++;\n if (!this.isPendingTimestampOffset_) {\n // update the timestampoffset\n this.updateSourceBufferTimestampOffset_(segmentInfo); // make sure the metadata queue is processed even though we have\n // no video/audio data.\n\n this.processMetadataQueue_();\n } // append is \"done\" instantly with no data.\n\n this.checkAppendsDone_(segmentInfo);\n return;\n } // Since source updater could call back synchronously, do the increments first.\n\n if (waitForVideo) {\n segmentInfo.waitingOnAppends++;\n }\n if (waitForAudio) {\n segmentInfo.waitingOnAppends++;\n }\n if (waitForVideo) {\n this.sourceUpdater_.videoQueueCallback(this.checkAppendsDone_.bind(this, segmentInfo));\n }\n if (waitForAudio) {\n this.sourceUpdater_.audioQueueCallback(this.checkAppendsDone_.bind(this, segmentInfo));\n }\n }\n checkAppendsDone_(segmentInfo) {\n if (this.checkForAbort_(segmentInfo.requestId)) {\n return;\n }\n segmentInfo.waitingOnAppends--;\n if (segmentInfo.waitingOnAppends === 0) {\n this.handleAppendsDone_();\n }\n }\n checkForIllegalMediaSwitch(trackInfo) {\n const illegalMediaSwitchError = illegalMediaSwitch(this.loaderType_, this.getCurrentMediaInfo_(), trackInfo);\n if (illegalMediaSwitchError) {\n this.error({\n message: illegalMediaSwitchError,\n playlistExclusionDuration: Infinity\n });\n this.trigger('error');\n return true;\n }\n return false;\n }\n updateSourceBufferTimestampOffset_(segmentInfo) {\n if (segmentInfo.timestampOffset === null ||\n // we don't yet have the start for whatever media type (video or audio) has\n // priority, timing-wise, so we must wait\n typeof segmentInfo.timingInfo.start !== 'number' ||\n // already updated the timestamp offset for this segment\n segmentInfo.changedTimestampOffset ||\n // the alt audio loader should not be responsible for setting the timestamp offset\n this.loaderType_ !== 'main') {\n return;\n }\n let didChange = false; // Primary timing goes by video, and audio is trimmed in the transmuxer, meaning that\n // the timing info here comes from video. In the event that the audio is longer than\n // the video, this will trim the start of the audio.\n // This also trims any offset from 0 at the beginning of the media\n\n segmentInfo.timestampOffset -= this.getSegmentStartTimeForTimestampOffsetCalculation_({\n videoTimingInfo: segmentInfo.segment.videoTimingInfo,\n audioTimingInfo: segmentInfo.segment.audioTimingInfo,\n timingInfo: segmentInfo.timingInfo\n }); // In the event that there are part segment downloads, each will try to update the\n // timestamp offset. Retaining this bit of state prevents us from updating in the\n // future (within the same segment), however, there may be a better way to handle it.\n\n segmentInfo.changedTimestampOffset = true;\n if (segmentInfo.timestampOffset !== this.sourceUpdater_.videoTimestampOffset()) {\n this.sourceUpdater_.videoTimestampOffset(segmentInfo.timestampOffset);\n didChange = true;\n }\n if (segmentInfo.timestampOffset !== this.sourceUpdater_.audioTimestampOffset()) {\n this.sourceUpdater_.audioTimestampOffset(segmentInfo.timestampOffset);\n didChange = true;\n }\n if (didChange) {\n this.trigger('timestampoffset');\n }\n }\n getSegmentStartTimeForTimestampOffsetCalculation_({\n videoTimingInfo,\n audioTimingInfo,\n timingInfo\n }) {\n if (!this.useDtsForTimestampOffset_) {\n return timingInfo.start;\n }\n if (videoTimingInfo && typeof videoTimingInfo.transmuxedDecodeStart === 'number') {\n return videoTimingInfo.transmuxedDecodeStart;\n } // handle audio only\n\n if (audioTimingInfo && typeof audioTimingInfo.transmuxedDecodeStart === 'number') {\n return audioTimingInfo.transmuxedDecodeStart;\n } // handle content not transmuxed (e.g., MP4)\n\n return timingInfo.start;\n }\n updateTimingInfoEnd_(segmentInfo) {\n segmentInfo.timingInfo = segmentInfo.timingInfo || {};\n const trackInfo = this.getMediaInfo_();\n const useVideoTimingInfo = this.loaderType_ === 'main' && trackInfo && trackInfo.hasVideo;\n const prioritizedTimingInfo = useVideoTimingInfo && segmentInfo.videoTimingInfo ? segmentInfo.videoTimingInfo : segmentInfo.audioTimingInfo;\n if (!prioritizedTimingInfo) {\n return;\n }\n segmentInfo.timingInfo.end = typeof prioritizedTimingInfo.end === 'number' ?\n // End time may not exist in a case where we aren't parsing the full segment (one\n // current example is the case of fmp4), so use the rough duration to calculate an\n // end time.\n prioritizedTimingInfo.end : prioritizedTimingInfo.start + segmentInfo.duration;\n }\n /**\n * callback to run when appendBuffer is finished. detects if we are\n * in a good state to do things with the data we got, or if we need\n * to wait for more\n *\n * @private\n */\n\n handleAppendsDone_() {\n // appendsdone can cause an abort\n if (this.pendingSegment_) {\n const metadata = {\n segmentInfo: segmentInfoPayload({\n type: this.loaderType_,\n segment: this.pendingSegment_\n })\n };\n this.trigger({\n type: 'appendsdone',\n metadata\n });\n }\n if (!this.pendingSegment_) {\n this.state = 'READY'; // TODO should this move into this.checkForAbort to speed up requests post abort in\n // all appending cases?\n\n if (!this.paused()) {\n this.monitorBuffer_();\n }\n return;\n }\n const segmentInfo = this.pendingSegment_;\n if (segmentInfo.part && segmentInfo.part.syncInfo) {\n // low-latency flow\n segmentInfo.part.syncInfo.markAppended();\n } else if (segmentInfo.segment.syncInfo) {\n // normal flow\n segmentInfo.segment.syncInfo.markAppended();\n } // Now that the end of the segment has been reached, we can set the end time. It's\n // best to wait until all appends are done so we're sure that the primary media is\n // finished (and we have its end time).\n\n this.updateTimingInfoEnd_(segmentInfo);\n if (this.shouldSaveSegmentTimingInfo_) {\n // Timeline mappings should only be saved for the main loader. This is for multiple\n // reasons:\n //\n // 1) Only one mapping is saved per timeline, meaning that if both the audio loader\n // and the main loader try to save the timeline mapping, whichever comes later\n // will overwrite the first. In theory this is OK, as the mappings should be the\n // same, however, it breaks for (2)\n // 2) In the event of a live stream, the initial live point will make for a somewhat\n // arbitrary mapping. If audio and video streams are not perfectly in-sync, then\n // the mapping will be off for one of the streams, dependent on which one was\n // first saved (see (1)).\n // 3) Primary timing goes by video in VHS, so the mapping should be video.\n //\n // Since the audio loader will wait for the main loader to load the first segment,\n // the main loader will save the first timeline mapping, and ensure that there won't\n // be a case where audio loads two segments without saving a mapping (thus leading\n // to missing segment timing info).\n this.syncController_.saveSegmentTimingInfo({\n segmentInfo,\n shouldSaveTimelineMapping: this.loaderType_ === 'main'\n });\n }\n const segmentDurationMessage = getTroublesomeSegmentDurationMessage(segmentInfo, this.sourceType_);\n if (segmentDurationMessage) {\n if (segmentDurationMessage.severity === 'warn') {\n videojs.log.warn(segmentDurationMessage.message);\n } else {\n this.logger_(segmentDurationMessage.message);\n }\n }\n this.recordThroughput_(segmentInfo);\n this.pendingSegment_ = null;\n this.state = 'READY';\n if (segmentInfo.isSyncRequest) {\n this.trigger('syncinfoupdate'); // if the sync request was not appended\n // then it was not the correct segment.\n // throw it away and use the data it gave us\n // to get the correct one.\n\n if (!segmentInfo.hasAppendedData_) {\n this.logger_(`Throwing away un-appended sync request ${segmentInfoString(segmentInfo)}`);\n return;\n }\n }\n this.logger_(`Appended ${segmentInfoString(segmentInfo)}`);\n this.addSegmentMetadataCue_(segmentInfo);\n this.fetchAtBuffer_ = true;\n if (this.currentTimeline_ !== segmentInfo.timeline) {\n this.timelineChangeController_.lastTimelineChange({\n type: this.loaderType_,\n from: this.currentTimeline_,\n to: segmentInfo.timeline\n }); // If audio is not disabled, the main segment loader is responsible for updating\n // the audio timeline as well. If the content is video only, this won't have any\n // impact.\n\n if (this.loaderType_ === 'main' && !this.audioDisabled_) {\n this.timelineChangeController_.lastTimelineChange({\n type: 'audio',\n from: this.currentTimeline_,\n to: segmentInfo.timeline\n });\n }\n }\n this.currentTimeline_ = segmentInfo.timeline; // We must update the syncinfo to recalculate the seekable range before\n // the following conditional otherwise it may consider this a bad \"guess\"\n // and attempt to resync when the post-update seekable window and live\n // point would mean that this was the perfect segment to fetch\n\n this.trigger('syncinfoupdate');\n const segment = segmentInfo.segment;\n const part = segmentInfo.part;\n const badSegmentGuess = segment.end && this.currentTime_() - segment.end > segmentInfo.playlist.targetDuration * 3;\n const badPartGuess = part && part.end && this.currentTime_() - part.end > segmentInfo.playlist.partTargetDuration * 3; // If we previously appended a segment/part that ends more than 3 part/targetDurations before\n // the currentTime_ that means that our conservative guess was too conservative.\n // In that case, reset the loader state so that we try to use any information gained\n // from the previous request to create a new, more accurate, sync-point.\n\n if (badSegmentGuess || badPartGuess) {\n this.logger_(`bad ${badSegmentGuess ? 'segment' : 'part'} ${segmentInfoString(segmentInfo)}`);\n this.resetEverything();\n return;\n }\n const isWalkingForward = this.mediaIndex !== null; // Don't do a rendition switch unless we have enough time to get a sync segment\n // and conservatively guess\n\n if (isWalkingForward) {\n this.trigger('bandwidthupdate');\n }\n this.trigger('progress');\n this.mediaIndex = segmentInfo.mediaIndex;\n this.partIndex = segmentInfo.partIndex; // any time an update finishes and the last segment is in the\n // buffer, end the stream. this ensures the \"ended\" event will\n // fire if playback reaches that point.\n\n if (this.isEndOfStream_(segmentInfo.mediaIndex, segmentInfo.playlist, segmentInfo.partIndex)) {\n this.endOfStream();\n } // used for testing\n\n this.trigger('appended');\n if (segmentInfo.hasAppendedData_) {\n this.mediaAppends++;\n }\n if (!this.paused()) {\n this.monitorBuffer_();\n }\n }\n /**\n * Records the current throughput of the decrypt, transmux, and append\n * portion of the semgment pipeline. `throughput.rate` is a the cumulative\n * moving average of the throughput. `throughput.count` is the number of\n * data points in the average.\n *\n * @private\n * @param {Object} segmentInfo the object returned by loadSegment\n */\n\n recordThroughput_(segmentInfo) {\n if (segmentInfo.duration < MIN_SEGMENT_DURATION_TO_SAVE_STATS) {\n this.logger_(`Ignoring segment's throughput because its duration of ${segmentInfo.duration}` + ` is less than the min to record ${MIN_SEGMENT_DURATION_TO_SAVE_STATS}`);\n return;\n }\n const rate = this.throughput.rate; // Add one to the time to ensure that we don't accidentally attempt to divide\n // by zero in the case where the throughput is ridiculously high\n\n const segmentProcessingTime = Date.now() - segmentInfo.endOfAllRequests + 1; // Multiply by 8000 to convert from bytes/millisecond to bits/second\n\n const segmentProcessingThroughput = Math.floor(segmentInfo.byteLength / segmentProcessingTime * 8 * 1000); // This is just a cumulative moving average calculation:\n // newAvg = oldAvg + (sample - oldAvg) / (sampleCount + 1)\n\n this.throughput.rate += (segmentProcessingThroughput - rate) / ++this.throughput.count;\n }\n /**\n * Adds a cue to the segment-metadata track with some metadata information about the\n * segment\n *\n * @private\n * @param {Object} segmentInfo\n * the object returned by loadSegment\n * @method addSegmentMetadataCue_\n */\n\n addSegmentMetadataCue_(segmentInfo) {\n if (!this.segmentMetadataTrack_) {\n return;\n }\n const segment = segmentInfo.segment;\n const start = segment.start;\n const end = segment.end; // Do not try adding the cue if the start and end times are invalid.\n\n if (!finite(start) || !finite(end)) {\n return;\n }\n removeCuesFromTrack(start, end, this.segmentMetadataTrack_);\n const Cue = window$1.WebKitDataCue || window$1.VTTCue;\n const value = {\n custom: segment.custom,\n dateTimeObject: segment.dateTimeObject,\n dateTimeString: segment.dateTimeString,\n programDateTime: segment.programDateTime,\n bandwidth: segmentInfo.playlist.attributes.BANDWIDTH,\n resolution: segmentInfo.playlist.attributes.RESOLUTION,\n codecs: segmentInfo.playlist.attributes.CODECS,\n byteLength: segmentInfo.byteLength,\n uri: segmentInfo.uri,\n timeline: segmentInfo.timeline,\n playlist: segmentInfo.playlist.id,\n start,\n end\n };\n const data = JSON.stringify(value);\n const cue = new Cue(start, end, data); // Attach the metadata to the value property of the cue to keep consistency between\n // the differences of WebKitDataCue in safari and VTTCue in other browsers\n\n cue.value = value;\n this.segmentMetadataTrack_.addCue(cue);\n }\n}\nfunction noop() {}\nconst toTitleCase = function (string) {\n if (typeof string !== 'string') {\n return string;\n }\n return string.replace(/./, w => w.toUpperCase());\n};\n\n/**\n * @file source-updater.js\n */\nconst bufferTypes = ['video', 'audio'];\nconst updating = (type, sourceUpdater) => {\n const sourceBuffer = sourceUpdater[`${type}Buffer`];\n return sourceBuffer && sourceBuffer.updating || sourceUpdater.queuePending[type];\n};\nconst nextQueueIndexOfType = (type, queue) => {\n for (let i = 0; i < queue.length; i++) {\n const queueEntry = queue[i];\n if (queueEntry.type === 'mediaSource') {\n // If the next entry is a media source entry (uses multiple source buffers), block\n // processing to allow it to go through first.\n return null;\n }\n if (queueEntry.type === type) {\n return i;\n }\n }\n return null;\n};\nconst shiftQueue = (type, sourceUpdater) => {\n if (sourceUpdater.queue.length === 0) {\n return;\n }\n let queueIndex = 0;\n let queueEntry = sourceUpdater.queue[queueIndex];\n if (queueEntry.type === 'mediaSource') {\n if (!sourceUpdater.updating() && sourceUpdater.mediaSource.readyState !== 'closed') {\n sourceUpdater.queue.shift();\n queueEntry.action(sourceUpdater);\n if (queueEntry.doneFn) {\n queueEntry.doneFn();\n } // Only specific source buffer actions must wait for async updateend events. Media\n // Source actions process synchronously. Therefore, both audio and video source\n // buffers are now clear to process the next queue entries.\n\n shiftQueue('audio', sourceUpdater);\n shiftQueue('video', sourceUpdater);\n } // Media Source actions require both source buffers, so if the media source action\n // couldn't process yet (because one or both source buffers are busy), block other\n // queue actions until both are available and the media source action can process.\n\n return;\n }\n if (type === 'mediaSource') {\n // If the queue was shifted by a media source action (this happens when pushing a\n // media source action onto the queue), then it wasn't from an updateend event from an\n // audio or video source buffer, so there's no change from previous state, and no\n // processing should be done.\n return;\n } // Media source queue entries don't need to consider whether the source updater is\n // started (i.e., source buffers are created) as they don't need the source buffers, but\n // source buffer queue entries do.\n\n if (!sourceUpdater.ready() || sourceUpdater.mediaSource.readyState === 'closed' || updating(type, sourceUpdater)) {\n return;\n }\n if (queueEntry.type !== type) {\n queueIndex = nextQueueIndexOfType(type, sourceUpdater.queue);\n if (queueIndex === null) {\n // Either there's no queue entry that uses this source buffer type in the queue, or\n // there's a media source queue entry before the next entry of this type, in which\n // case wait for that action to process first.\n return;\n }\n queueEntry = sourceUpdater.queue[queueIndex];\n }\n sourceUpdater.queue.splice(queueIndex, 1); // Keep a record that this source buffer type is in use.\n //\n // The queue pending operation must be set before the action is performed in the event\n // that the action results in a synchronous event that is acted upon. For instance, if\n // an exception is thrown that can be handled, it's possible that new actions will be\n // appended to an empty queue and immediately executed, but would not have the correct\n // pending information if this property was set after the action was performed.\n\n sourceUpdater.queuePending[type] = queueEntry;\n queueEntry.action(type, sourceUpdater);\n if (!queueEntry.doneFn) {\n // synchronous operation, process next entry\n sourceUpdater.queuePending[type] = null;\n shiftQueue(type, sourceUpdater);\n return;\n }\n};\nconst cleanupBuffer = (type, sourceUpdater) => {\n const buffer = sourceUpdater[`${type}Buffer`];\n const titleType = toTitleCase(type);\n if (!buffer) {\n return;\n }\n buffer.removeEventListener('updateend', sourceUpdater[`on${titleType}UpdateEnd_`]);\n buffer.removeEventListener('error', sourceUpdater[`on${titleType}Error_`]);\n sourceUpdater.codecs[type] = null;\n sourceUpdater[`${type}Buffer`] = null;\n};\nconst inSourceBuffers = (mediaSource, sourceBuffer) => mediaSource && sourceBuffer && Array.prototype.indexOf.call(mediaSource.sourceBuffers, sourceBuffer) !== -1;\nconst actions = {\n appendBuffer: (bytes, segmentInfo, onError) => (type, sourceUpdater) => {\n const sourceBuffer = sourceUpdater[`${type}Buffer`]; // can't do anything if the media source / source buffer is null\n // or the media source does not contain this source buffer.\n\n if (!inSourceBuffers(sourceUpdater.mediaSource, sourceBuffer)) {\n return;\n }\n sourceUpdater.logger_(`Appending segment ${segmentInfo.mediaIndex}'s ${bytes.length} bytes to ${type}Buffer`);\n try {\n sourceBuffer.appendBuffer(bytes);\n } catch (e) {\n sourceUpdater.logger_(`Error with code ${e.code} ` + (e.code === QUOTA_EXCEEDED_ERR ? '(QUOTA_EXCEEDED_ERR) ' : '') + `when appending segment ${segmentInfo.mediaIndex} to ${type}Buffer`);\n sourceUpdater.queuePending[type] = null;\n onError(e);\n }\n },\n remove: (start, end) => (type, sourceUpdater) => {\n const sourceBuffer = sourceUpdater[`${type}Buffer`]; // can't do anything if the media source / source buffer is null\n // or the media source does not contain this source buffer.\n\n if (!inSourceBuffers(sourceUpdater.mediaSource, sourceBuffer)) {\n return;\n }\n sourceUpdater.logger_(`Removing ${start} to ${end} from ${type}Buffer`);\n try {\n sourceBuffer.remove(start, end);\n } catch (e) {\n sourceUpdater.logger_(`Remove ${start} to ${end} from ${type}Buffer failed`);\n }\n },\n timestampOffset: offset => (type, sourceUpdater) => {\n const sourceBuffer = sourceUpdater[`${type}Buffer`]; // can't do anything if the media source / source buffer is null\n // or the media source does not contain this source buffer.\n\n if (!inSourceBuffers(sourceUpdater.mediaSource, sourceBuffer)) {\n return;\n }\n sourceUpdater.logger_(`Setting ${type}timestampOffset to ${offset}`);\n sourceBuffer.timestampOffset = offset;\n },\n callback: callback => (type, sourceUpdater) => {\n callback();\n },\n endOfStream: error => sourceUpdater => {\n if (sourceUpdater.mediaSource.readyState !== 'open') {\n return;\n }\n sourceUpdater.logger_(`Calling mediaSource endOfStream(${error || ''})`);\n try {\n sourceUpdater.mediaSource.endOfStream(error);\n } catch (e) {\n videojs.log.warn('Failed to call media source endOfStream', e);\n }\n },\n duration: duration => sourceUpdater => {\n sourceUpdater.logger_(`Setting mediaSource duration to ${duration}`);\n try {\n sourceUpdater.mediaSource.duration = duration;\n } catch (e) {\n videojs.log.warn('Failed to set media source duration', e);\n }\n },\n abort: () => (type, sourceUpdater) => {\n if (sourceUpdater.mediaSource.readyState !== 'open') {\n return;\n }\n const sourceBuffer = sourceUpdater[`${type}Buffer`]; // can't do anything if the media source / source buffer is null\n // or the media source does not contain this source buffer.\n\n if (!inSourceBuffers(sourceUpdater.mediaSource, sourceBuffer)) {\n return;\n }\n sourceUpdater.logger_(`calling abort on ${type}Buffer`);\n try {\n sourceBuffer.abort();\n } catch (e) {\n videojs.log.warn(`Failed to abort on ${type}Buffer`, e);\n }\n },\n addSourceBuffer: (type, codec) => sourceUpdater => {\n const titleType = toTitleCase(type);\n const mime = getMimeForCodec(codec);\n sourceUpdater.logger_(`Adding ${type}Buffer with codec ${codec} to mediaSource`);\n const sourceBuffer = sourceUpdater.mediaSource.addSourceBuffer(mime);\n sourceBuffer.addEventListener('updateend', sourceUpdater[`on${titleType}UpdateEnd_`]);\n sourceBuffer.addEventListener('error', sourceUpdater[`on${titleType}Error_`]);\n sourceUpdater.codecs[type] = codec;\n sourceUpdater[`${type}Buffer`] = sourceBuffer;\n },\n removeSourceBuffer: type => sourceUpdater => {\n const sourceBuffer = sourceUpdater[`${type}Buffer`];\n cleanupBuffer(type, sourceUpdater); // can't do anything if the media source / source buffer is null\n // or the media source does not contain this source buffer.\n\n if (!inSourceBuffers(sourceUpdater.mediaSource, sourceBuffer)) {\n return;\n }\n sourceUpdater.logger_(`Removing ${type}Buffer with codec ${sourceUpdater.codecs[type]} from mediaSource`);\n try {\n sourceUpdater.mediaSource.removeSourceBuffer(sourceBuffer);\n } catch (e) {\n videojs.log.warn(`Failed to removeSourceBuffer ${type}Buffer`, e);\n }\n },\n changeType: codec => (type, sourceUpdater) => {\n const sourceBuffer = sourceUpdater[`${type}Buffer`];\n const mime = getMimeForCodec(codec); // can't do anything if the media source / source buffer is null\n // or the media source does not contain this source buffer.\n\n if (!inSourceBuffers(sourceUpdater.mediaSource, sourceBuffer)) {\n return;\n } // do not update codec if we don't need to.\n // Only update if we change the codec base.\n // For example, going from avc1.640028 to avc1.64001f does not require a changeType call.\n\n const newCodecBase = codec.substring(0, codec.indexOf('.'));\n const oldCodec = sourceUpdater.codecs[type];\n const oldCodecBase = oldCodec.substring(0, oldCodec.indexOf('.'));\n if (oldCodecBase === newCodecBase) {\n return;\n }\n const metadata = {\n codecsChangeInfo: {\n from: oldCodec,\n to: codec\n }\n };\n sourceUpdater.trigger({\n type: 'codecschange',\n metadata\n });\n sourceUpdater.logger_(`changing ${type}Buffer codec from ${oldCodec} to ${codec}`); // check if change to the provided type is supported\n\n try {\n sourceBuffer.changeType(mime);\n sourceUpdater.codecs[type] = codec;\n } catch (e) {\n metadata.errorType = videojs.Error.StreamingCodecsChangeError;\n metadata.error = e;\n e.metadata = metadata;\n sourceUpdater.error_ = e;\n sourceUpdater.trigger('error');\n videojs.log.warn(`Failed to changeType on ${type}Buffer`, e);\n }\n }\n};\nconst pushQueue = ({\n type,\n sourceUpdater,\n action,\n doneFn,\n name\n}) => {\n sourceUpdater.queue.push({\n type,\n action,\n doneFn,\n name\n });\n shiftQueue(type, sourceUpdater);\n};\nconst onUpdateend = (type, sourceUpdater) => e => {\n // Although there should, in theory, be a pending action for any updateend receieved,\n // there are some actions that may trigger updateend events without set definitions in\n // the w3c spec. For instance, setting the duration on the media source may trigger\n // updateend events on source buffers. This does not appear to be in the spec. As such,\n // if we encounter an updateend without a corresponding pending action from our queue\n // for that source buffer type, process the next action.\n const bufferedRangesForType = sourceUpdater[`${type}Buffered`]();\n const descriptiveString = bufferedRangesToString(bufferedRangesForType);\n sourceUpdater.logger_(`received \"updateend\" event for ${type} Source Buffer: `, descriptiveString);\n if (sourceUpdater.queuePending[type]) {\n const doneFn = sourceUpdater.queuePending[type].doneFn;\n sourceUpdater.queuePending[type] = null;\n if (doneFn) {\n // if there's an error, report it\n doneFn(sourceUpdater[`${type}Error_`]);\n }\n }\n shiftQueue(type, sourceUpdater);\n};\n/**\n * A queue of callbacks to be serialized and applied when a\n * MediaSource and its associated SourceBuffers are not in the\n * updating state. It is used by the segment loader to update the\n * underlying SourceBuffers when new data is loaded, for instance.\n *\n * @class SourceUpdater\n * @param {MediaSource} mediaSource the MediaSource to create the SourceBuffer from\n * @param {string} mimeType the desired MIME type of the underlying SourceBuffer\n */\n\nclass SourceUpdater extends videojs.EventTarget {\n constructor(mediaSource) {\n super();\n this.mediaSource = mediaSource;\n this.sourceopenListener_ = () => shiftQueue('mediaSource', this);\n this.mediaSource.addEventListener('sourceopen', this.sourceopenListener_);\n this.logger_ = logger('SourceUpdater'); // initial timestamp offset is 0\n\n this.audioTimestampOffset_ = 0;\n this.videoTimestampOffset_ = 0;\n this.queue = [];\n this.queuePending = {\n audio: null,\n video: null\n };\n this.delayedAudioAppendQueue_ = [];\n this.videoAppendQueued_ = false;\n this.codecs = {};\n this.onVideoUpdateEnd_ = onUpdateend('video', this);\n this.onAudioUpdateEnd_ = onUpdateend('audio', this);\n this.onVideoError_ = e => {\n // used for debugging\n this.videoError_ = e;\n };\n this.onAudioError_ = e => {\n // used for debugging\n this.audioError_ = e;\n };\n this.createdSourceBuffers_ = false;\n this.initializedEme_ = false;\n this.triggeredReady_ = false;\n }\n initializedEme() {\n this.initializedEme_ = true;\n this.triggerReady();\n }\n hasCreatedSourceBuffers() {\n // if false, likely waiting on one of the segment loaders to get enough data to create\n // source buffers\n return this.createdSourceBuffers_;\n }\n hasInitializedAnyEme() {\n return this.initializedEme_;\n }\n ready() {\n return this.hasCreatedSourceBuffers() && this.hasInitializedAnyEme();\n }\n createSourceBuffers(codecs) {\n if (this.hasCreatedSourceBuffers()) {\n // already created them before\n return;\n } // the intial addOrChangeSourceBuffers will always be\n // two add buffers.\n\n this.addOrChangeSourceBuffers(codecs);\n this.createdSourceBuffers_ = true;\n this.trigger('createdsourcebuffers');\n this.triggerReady();\n }\n triggerReady() {\n // only allow ready to be triggered once, this prevents the case\n // where:\n // 1. we trigger createdsourcebuffers\n // 2. ie 11 synchronously initializates eme\n // 3. the synchronous initialization causes us to trigger ready\n // 4. We go back to the ready check in createSourceBuffers and ready is triggered again.\n if (this.ready() && !this.triggeredReady_) {\n this.triggeredReady_ = true;\n this.trigger('ready');\n }\n }\n /**\n * Add a type of source buffer to the media source.\n *\n * @param {string} type\n * The type of source buffer to add.\n *\n * @param {string} codec\n * The codec to add the source buffer with.\n */\n\n addSourceBuffer(type, codec) {\n pushQueue({\n type: 'mediaSource',\n sourceUpdater: this,\n action: actions.addSourceBuffer(type, codec),\n name: 'addSourceBuffer'\n });\n }\n /**\n * call abort on a source buffer.\n *\n * @param {string} type\n * The type of source buffer to call abort on.\n */\n\n abort(type) {\n pushQueue({\n type,\n sourceUpdater: this,\n action: actions.abort(type),\n name: 'abort'\n });\n }\n /**\n * Call removeSourceBuffer and remove a specific type\n * of source buffer on the mediaSource.\n *\n * @param {string} type\n * The type of source buffer to remove.\n */\n\n removeSourceBuffer(type) {\n if (!this.canRemoveSourceBuffer()) {\n videojs.log.error('removeSourceBuffer is not supported!');\n return;\n }\n pushQueue({\n type: 'mediaSource',\n sourceUpdater: this,\n action: actions.removeSourceBuffer(type),\n name: 'removeSourceBuffer'\n });\n }\n /**\n * Whether or not the removeSourceBuffer function is supported\n * on the mediaSource.\n *\n * @return {boolean}\n * if removeSourceBuffer can be called.\n */\n\n canRemoveSourceBuffer() {\n // As of Firefox 83 removeSourceBuffer\n // throws errors, so we report that it does not support this.\n return !videojs.browser.IS_FIREFOX && window$1.MediaSource && window$1.MediaSource.prototype && typeof window$1.MediaSource.prototype.removeSourceBuffer === 'function';\n }\n /**\n * Whether or not the changeType function is supported\n * on our SourceBuffers.\n *\n * @return {boolean}\n * if changeType can be called.\n */\n\n static canChangeType() {\n return window$1.SourceBuffer && window$1.SourceBuffer.prototype && typeof window$1.SourceBuffer.prototype.changeType === 'function';\n }\n /**\n * Whether or not the changeType function is supported\n * on our SourceBuffers.\n *\n * @return {boolean}\n * if changeType can be called.\n */\n\n canChangeType() {\n return this.constructor.canChangeType();\n }\n /**\n * Call the changeType function on a source buffer, given the code and type.\n *\n * @param {string} type\n * The type of source buffer to call changeType on.\n *\n * @param {string} codec\n * The codec string to change type with on the source buffer.\n */\n\n changeType(type, codec) {\n if (!this.canChangeType()) {\n videojs.log.error('changeType is not supported!');\n return;\n }\n pushQueue({\n type,\n sourceUpdater: this,\n action: actions.changeType(codec),\n name: 'changeType'\n });\n }\n /**\n * Add source buffers with a codec or, if they are already created,\n * call changeType on source buffers using changeType.\n *\n * @param {Object} codecs\n * Codecs to switch to\n */\n\n addOrChangeSourceBuffers(codecs) {\n if (!codecs || typeof codecs !== 'object' || Object.keys(codecs).length === 0) {\n throw new Error('Cannot addOrChangeSourceBuffers to undefined codecs');\n }\n Object.keys(codecs).forEach(type => {\n const codec = codecs[type];\n if (!this.hasCreatedSourceBuffers()) {\n return this.addSourceBuffer(type, codec);\n }\n if (this.canChangeType()) {\n this.changeType(type, codec);\n }\n });\n }\n /**\n * Queue an update to append an ArrayBuffer.\n *\n * @param {MediaObject} object containing audioBytes and/or videoBytes\n * @param {Function} done the function to call when done\n * @see http://www.w3.org/TR/media-source/#widl-SourceBuffer-appendBuffer-void-ArrayBuffer-data\n */\n\n appendBuffer(options, doneFn) {\n const {\n segmentInfo,\n type,\n bytes\n } = options;\n this.processedAppend_ = true;\n if (type === 'audio' && this.videoBuffer && !this.videoAppendQueued_) {\n this.delayedAudioAppendQueue_.push([options, doneFn]);\n this.logger_(`delayed audio append of ${bytes.length} until video append`);\n return;\n } // In the case of certain errors, for instance, QUOTA_EXCEEDED_ERR, updateend will\n // not be fired. This means that the queue will be blocked until the next action\n // taken by the segment-loader. Provide a mechanism for segment-loader to handle\n // these errors by calling the doneFn with the specific error.\n\n const onError = doneFn;\n pushQueue({\n type,\n sourceUpdater: this,\n action: actions.appendBuffer(bytes, segmentInfo || {\n mediaIndex: -1\n }, onError),\n doneFn,\n name: 'appendBuffer'\n });\n if (type === 'video') {\n this.videoAppendQueued_ = true;\n if (!this.delayedAudioAppendQueue_.length) {\n return;\n }\n const queue = this.delayedAudioAppendQueue_.slice();\n this.logger_(`queuing delayed audio ${queue.length} appendBuffers`);\n this.delayedAudioAppendQueue_.length = 0;\n queue.forEach(que => {\n this.appendBuffer.apply(this, que);\n });\n }\n }\n /**\n * Get the audio buffer's buffered timerange.\n *\n * @return {TimeRange}\n * The audio buffer's buffered time range\n */\n\n audioBuffered() {\n // no media source/source buffer or it isn't in the media sources\n // source buffer list\n if (!inSourceBuffers(this.mediaSource, this.audioBuffer)) {\n return createTimeRanges();\n }\n return this.audioBuffer.buffered ? this.audioBuffer.buffered : createTimeRanges();\n }\n /**\n * Get the video buffer's buffered timerange.\n *\n * @return {TimeRange}\n * The video buffer's buffered time range\n */\n\n videoBuffered() {\n // no media source/source buffer or it isn't in the media sources\n // source buffer list\n if (!inSourceBuffers(this.mediaSource, this.videoBuffer)) {\n return createTimeRanges();\n }\n return this.videoBuffer.buffered ? this.videoBuffer.buffered : createTimeRanges();\n }\n /**\n * Get a combined video/audio buffer's buffered timerange.\n *\n * @return {TimeRange}\n * the combined time range\n */\n\n buffered() {\n const video = inSourceBuffers(this.mediaSource, this.videoBuffer) ? this.videoBuffer : null;\n const audio = inSourceBuffers(this.mediaSource, this.audioBuffer) ? this.audioBuffer : null;\n if (audio && !video) {\n return this.audioBuffered();\n }\n if (video && !audio) {\n return this.videoBuffered();\n }\n return bufferIntersection(this.audioBuffered(), this.videoBuffered());\n }\n /**\n * Add a callback to the queue that will set duration on the mediaSource.\n *\n * @param {number} duration\n * The duration to set\n *\n * @param {Function} [doneFn]\n * function to run after duration has been set.\n */\n\n setDuration(duration, doneFn = noop) {\n // In order to set the duration on the media source, it's necessary to wait for all\n // source buffers to no longer be updating. \"If the updating attribute equals true on\n // any SourceBuffer in sourceBuffers, then throw an InvalidStateError exception and\n // abort these steps.\" (source: https://www.w3.org/TR/media-source/#attributes).\n pushQueue({\n type: 'mediaSource',\n sourceUpdater: this,\n action: actions.duration(duration),\n name: 'duration',\n doneFn\n });\n }\n /**\n * Add a mediaSource endOfStream call to the queue\n *\n * @param {Error} [error]\n * Call endOfStream with an error\n *\n * @param {Function} [doneFn]\n * A function that should be called when the\n * endOfStream call has finished.\n */\n\n endOfStream(error = null, doneFn = noop) {\n if (typeof error !== 'string') {\n error = undefined;\n } // In order to set the duration on the media source, it's necessary to wait for all\n // source buffers to no longer be updating. \"If the updating attribute equals true on\n // any SourceBuffer in sourceBuffers, then throw an InvalidStateError exception and\n // abort these steps.\" (source: https://www.w3.org/TR/media-source/#attributes).\n\n pushQueue({\n type: 'mediaSource',\n sourceUpdater: this,\n action: actions.endOfStream(error),\n name: 'endOfStream',\n doneFn\n });\n }\n /**\n * Queue an update to remove a time range from the buffer.\n *\n * @param {number} start where to start the removal\n * @param {number} end where to end the removal\n * @param {Function} [done=noop] optional callback to be executed when the remove\n * operation is complete\n * @see http://www.w3.org/TR/media-source/#widl-SourceBuffer-remove-void-double-start-unrestricted-double-end\n */\n\n removeAudio(start, end, done = noop) {\n if (!this.audioBuffered().length || this.audioBuffered().end(0) === 0) {\n done();\n return;\n }\n pushQueue({\n type: 'audio',\n sourceUpdater: this,\n action: actions.remove(start, end),\n doneFn: done,\n name: 'remove'\n });\n }\n /**\n * Queue an update to remove a time range from the buffer.\n *\n * @param {number} start where to start the removal\n * @param {number} end where to end the removal\n * @param {Function} [done=noop] optional callback to be executed when the remove\n * operation is complete\n * @see http://www.w3.org/TR/media-source/#widl-SourceBuffer-remove-void-double-start-unrestricted-double-end\n */\n\n removeVideo(start, end, done = noop) {\n if (!this.videoBuffered().length || this.videoBuffered().end(0) === 0) {\n done();\n return;\n }\n pushQueue({\n type: 'video',\n sourceUpdater: this,\n action: actions.remove(start, end),\n doneFn: done,\n name: 'remove'\n });\n }\n /**\n * Whether the underlying sourceBuffer is updating or not\n *\n * @return {boolean} the updating status of the SourceBuffer\n */\n\n updating() {\n // the audio/video source buffer is updating\n if (updating('audio', this) || updating('video', this)) {\n return true;\n }\n return false;\n }\n /**\n * Set/get the timestampoffset on the audio SourceBuffer\n *\n * @return {number} the timestamp offset\n */\n\n audioTimestampOffset(offset) {\n if (typeof offset !== 'undefined' && this.audioBuffer &&\n // no point in updating if it's the same\n this.audioTimestampOffset_ !== offset) {\n pushQueue({\n type: 'audio',\n sourceUpdater: this,\n action: actions.timestampOffset(offset),\n name: 'timestampOffset'\n });\n this.audioTimestampOffset_ = offset;\n }\n return this.audioTimestampOffset_;\n }\n /**\n * Set/get the timestampoffset on the video SourceBuffer\n *\n * @return {number} the timestamp offset\n */\n\n videoTimestampOffset(offset) {\n if (typeof offset !== 'undefined' && this.videoBuffer &&\n // no point in updating if it's the same\n this.videoTimestampOffset !== offset) {\n pushQueue({\n type: 'video',\n sourceUpdater: this,\n action: actions.timestampOffset(offset),\n name: 'timestampOffset'\n });\n this.videoTimestampOffset_ = offset;\n }\n return this.videoTimestampOffset_;\n }\n /**\n * Add a function to the queue that will be called\n * when it is its turn to run in the audio queue.\n *\n * @param {Function} callback\n * The callback to queue.\n */\n\n audioQueueCallback(callback) {\n if (!this.audioBuffer) {\n return;\n }\n pushQueue({\n type: 'audio',\n sourceUpdater: this,\n action: actions.callback(callback),\n name: 'callback'\n });\n }\n /**\n * Add a function to the queue that will be called\n * when it is its turn to run in the video queue.\n *\n * @param {Function} callback\n * The callback to queue.\n */\n\n videoQueueCallback(callback) {\n if (!this.videoBuffer) {\n return;\n }\n pushQueue({\n type: 'video',\n sourceUpdater: this,\n action: actions.callback(callback),\n name: 'callback'\n });\n }\n /**\n * dispose of the source updater and the underlying sourceBuffer\n */\n\n dispose() {\n this.trigger('dispose');\n bufferTypes.forEach(type => {\n this.abort(type);\n if (this.canRemoveSourceBuffer()) {\n this.removeSourceBuffer(type);\n } else {\n this[`${type}QueueCallback`](() => cleanupBuffer(type, this));\n }\n });\n this.videoAppendQueued_ = false;\n this.delayedAudioAppendQueue_.length = 0;\n if (this.sourceopenListener_) {\n this.mediaSource.removeEventListener('sourceopen', this.sourceopenListener_);\n }\n this.off();\n }\n}\nconst uint8ToUtf8 = uintArray => decodeURIComponent(escape(String.fromCharCode.apply(null, uintArray)));\nconst bufferToHexString = buffer => {\n const uInt8Buffer = new Uint8Array(buffer);\n return Array.from(uInt8Buffer).map(byte => byte.toString(16).padStart(2, '0')).join('');\n};\n\n/**\n * @file vtt-segment-loader.js\n */\nconst VTT_LINE_TERMINATORS = new Uint8Array('\\n\\n'.split('').map(char => char.charCodeAt(0)));\nclass NoVttJsError extends Error {\n constructor() {\n super('Trying to parse received VTT cues, but there is no WebVTT. Make sure vtt.js is loaded.');\n }\n}\n/**\n * An object that manages segment loading and appending.\n *\n * @class VTTSegmentLoader\n * @param {Object} options required and optional options\n * @extends videojs.EventTarget\n */\n\nclass VTTSegmentLoader extends SegmentLoader {\n constructor(settings, options = {}) {\n super(settings, options); // SegmentLoader requires a MediaSource be specified or it will throw an error;\n // however, VTTSegmentLoader has no need of a media source, so delete the reference\n\n this.mediaSource_ = null;\n this.subtitlesTrack_ = null;\n this.featuresNativeTextTracks_ = settings.featuresNativeTextTracks;\n this.loadVttJs = settings.loadVttJs; // The VTT segment will have its own time mappings. Saving VTT segment timing info in\n // the sync controller leads to improper behavior.\n\n this.shouldSaveSegmentTimingInfo_ = false;\n }\n createTransmuxer_() {\n // don't need to transmux any subtitles\n return null;\n }\n /**\n * Indicates which time ranges are buffered\n *\n * @return {TimeRange}\n * TimeRange object representing the current buffered ranges\n */\n\n buffered_() {\n if (!this.subtitlesTrack_ || !this.subtitlesTrack_.cues || !this.subtitlesTrack_.cues.length) {\n return createTimeRanges();\n }\n const cues = this.subtitlesTrack_.cues;\n const start = cues[0].startTime;\n const end = cues[cues.length - 1].startTime;\n return createTimeRanges([[start, end]]);\n }\n /**\n * Gets and sets init segment for the provided map\n *\n * @param {Object} map\n * The map object representing the init segment to get or set\n * @param {boolean=} set\n * If true, the init segment for the provided map should be saved\n * @return {Object}\n * map object for desired init segment\n */\n\n initSegmentForMap(map, set = false) {\n if (!map) {\n return null;\n }\n const id = initSegmentId(map);\n let storedMap = this.initSegments_[id];\n if (set && !storedMap && map.bytes) {\n // append WebVTT line terminators to the media initialization segment if it exists\n // to follow the WebVTT spec (https://w3c.github.io/webvtt/#file-structure) that\n // requires two or more WebVTT line terminators between the WebVTT header and the\n // rest of the file\n const combinedByteLength = VTT_LINE_TERMINATORS.byteLength + map.bytes.byteLength;\n const combinedSegment = new Uint8Array(combinedByteLength);\n combinedSegment.set(map.bytes);\n combinedSegment.set(VTT_LINE_TERMINATORS, map.bytes.byteLength);\n this.initSegments_[id] = storedMap = {\n resolvedUri: map.resolvedUri,\n byterange: map.byterange,\n bytes: combinedSegment\n };\n }\n return storedMap || map;\n }\n /**\n * Returns true if all configuration required for loading is present, otherwise false.\n *\n * @return {boolean} True if the all configuration is ready for loading\n * @private\n */\n\n couldBeginLoading_() {\n return this.playlist_ && this.subtitlesTrack_ && !this.paused();\n }\n /**\n * Once all the starting parameters have been specified, begin\n * operation. This method should only be invoked from the INIT\n * state.\n *\n * @private\n */\n\n init_() {\n this.state = 'READY';\n this.resetEverything();\n return this.monitorBuffer_();\n }\n /**\n * Set a subtitle track on the segment loader to add subtitles to\n *\n * @param {TextTrack=} track\n * The text track to add loaded subtitles to\n * @return {TextTrack}\n * Returns the subtitles track\n */\n\n track(track) {\n if (typeof track === 'undefined') {\n return this.subtitlesTrack_;\n }\n this.subtitlesTrack_ = track; // if we were unpaused but waiting for a sourceUpdater, start\n // buffering now\n\n if (this.state === 'INIT' && this.couldBeginLoading_()) {\n this.init_();\n }\n return this.subtitlesTrack_;\n }\n /**\n * Remove any data in the source buffer between start and end times\n *\n * @param {number} start - the start time of the region to remove from the buffer\n * @param {number} end - the end time of the region to remove from the buffer\n */\n\n remove(start, end) {\n removeCuesFromTrack(start, end, this.subtitlesTrack_);\n }\n /**\n * fill the buffer with segements unless the sourceBuffers are\n * currently updating\n *\n * Note: this function should only ever be called by monitorBuffer_\n * and never directly\n *\n * @private\n */\n\n fillBuffer_() {\n // see if we need to begin loading immediately\n const segmentInfo = this.chooseNextRequest_();\n if (!segmentInfo) {\n return;\n }\n if (this.syncController_.timestampOffsetForTimeline(segmentInfo.timeline) === null) {\n // We don't have the timestamp offset that we need to sync subtitles.\n // Rerun on a timestamp offset or user interaction.\n const checkTimestampOffset = () => {\n this.state = 'READY';\n if (!this.paused()) {\n // if not paused, queue a buffer check as soon as possible\n this.monitorBuffer_();\n }\n };\n this.syncController_.one('timestampoffset', checkTimestampOffset);\n this.state = 'WAITING_ON_TIMELINE';\n return;\n }\n this.loadSegment_(segmentInfo);\n } // never set a timestamp offset for vtt segments.\n\n timestampOffsetForSegment_() {\n return null;\n }\n chooseNextRequest_() {\n return this.skipEmptySegments_(super.chooseNextRequest_());\n }\n /**\n * Prevents the segment loader from requesting segments we know contain no subtitles\n * by walking forward until we find the next segment that we don't know whether it is\n * empty or not.\n *\n * @param {Object} segmentInfo\n * a segment info object that describes the current segment\n * @return {Object}\n * a segment info object that describes the current segment\n */\n\n skipEmptySegments_(segmentInfo) {\n while (segmentInfo && segmentInfo.segment.empty) {\n // stop at the last possible segmentInfo\n if (segmentInfo.mediaIndex + 1 >= segmentInfo.playlist.segments.length) {\n segmentInfo = null;\n break;\n }\n segmentInfo = this.generateSegmentInfo_({\n playlist: segmentInfo.playlist,\n mediaIndex: segmentInfo.mediaIndex + 1,\n startOfSegment: segmentInfo.startOfSegment + segmentInfo.duration,\n isSyncRequest: segmentInfo.isSyncRequest\n });\n }\n return segmentInfo;\n }\n stopForError(error) {\n this.error(error);\n this.state = 'READY';\n this.pause();\n this.trigger('error');\n }\n /**\n * append a decrypted segement to the SourceBuffer through a SourceUpdater\n *\n * @private\n */\n\n segmentRequestFinished_(error, simpleSegment, result) {\n if (!this.subtitlesTrack_) {\n this.state = 'READY';\n return;\n }\n this.saveTransferStats_(simpleSegment.stats); // the request was aborted\n\n if (!this.pendingSegment_) {\n this.state = 'READY';\n this.mediaRequestsAborted += 1;\n return;\n }\n if (error) {\n if (error.code === REQUEST_ERRORS.TIMEOUT) {\n this.handleTimeout_();\n }\n if (error.code === REQUEST_ERRORS.ABORTED) {\n this.mediaRequestsAborted += 1;\n } else {\n this.mediaRequestsErrored += 1;\n }\n this.stopForError(error);\n return;\n }\n const segmentInfo = this.pendingSegment_; // although the VTT segment loader bandwidth isn't really used, it's good to\n // maintain functionality between segment loaders\n\n this.saveBandwidthRelatedStats_(segmentInfo.duration, simpleSegment.stats); // if this request included a segment key, save that data in the cache\n\n if (simpleSegment.key) {\n this.segmentKey(simpleSegment.key, true);\n }\n this.state = 'APPENDING'; // used for tests\n\n this.trigger('appending');\n const segment = segmentInfo.segment;\n if (segment.map) {\n segment.map.bytes = simpleSegment.map.bytes;\n }\n segmentInfo.bytes = simpleSegment.bytes; // Make sure that vttjs has loaded, otherwise, load it and wait till it finished loading\n\n if (typeof window$1.WebVTT !== 'function' && typeof this.loadVttJs === 'function') {\n this.state = 'WAITING_ON_VTTJS'; // should be fine to call multiple times\n // script will be loaded once but multiple listeners will be added to the queue, which is expected.\n\n this.loadVttJs().then(() => this.segmentRequestFinished_(error, simpleSegment, result), () => this.stopForError({\n message: 'Error loading vtt.js'\n }));\n return;\n }\n segment.requested = true;\n try {\n this.parseVTTCues_(segmentInfo);\n } catch (e) {\n this.stopForError({\n message: e.message,\n metadata: {\n errorType: videojs.Error.StreamingVttParserError,\n error: e\n }\n });\n return;\n }\n this.updateTimeMapping_(segmentInfo, this.syncController_.timelines[segmentInfo.timeline], this.playlist_);\n if (segmentInfo.cues.length) {\n segmentInfo.timingInfo = {\n start: segmentInfo.cues[0].startTime,\n end: segmentInfo.cues[segmentInfo.cues.length - 1].endTime\n };\n } else {\n segmentInfo.timingInfo = {\n start: segmentInfo.startOfSegment,\n end: segmentInfo.startOfSegment + segmentInfo.duration\n };\n }\n if (segmentInfo.isSyncRequest) {\n this.trigger('syncinfoupdate');\n this.pendingSegment_ = null;\n this.state = 'READY';\n return;\n }\n segmentInfo.byteLength = segmentInfo.bytes.byteLength;\n this.mediaSecondsLoaded += segment.duration; // Create VTTCue instances for each cue in the new segment and add them to\n // the subtitle track\n\n segmentInfo.cues.forEach(cue => {\n this.subtitlesTrack_.addCue(this.featuresNativeTextTracks_ ? new window$1.VTTCue(cue.startTime, cue.endTime, cue.text) : cue);\n }); // Remove any duplicate cues from the subtitle track. The WebVTT spec allows\n // cues to have identical time-intervals, but if the text is also identical\n // we can safely assume it is a duplicate that can be removed (ex. when a cue\n // \"overlaps\" VTT segments)\n\n removeDuplicateCuesFromTrack(this.subtitlesTrack_);\n this.handleAppendsDone_();\n }\n handleData_() {// noop as we shouldn't be getting video/audio data captions\n // that we do not support here.\n }\n updateTimingInfoEnd_() {// noop\n }\n /**\n * Uses the WebVTT parser to parse the segment response\n *\n * @throws NoVttJsError\n *\n * @param {Object} segmentInfo\n * a segment info object that describes the current segment\n * @private\n */\n\n parseVTTCues_(segmentInfo) {\n let decoder;\n let decodeBytesToString = false;\n if (typeof window$1.WebVTT !== 'function') {\n // caller is responsible for exception handling.\n throw new NoVttJsError();\n }\n if (typeof window$1.TextDecoder === 'function') {\n decoder = new window$1.TextDecoder('utf8');\n } else {\n decoder = window$1.WebVTT.StringDecoder();\n decodeBytesToString = true;\n }\n const parser = new window$1.WebVTT.Parser(window$1, window$1.vttjs, decoder);\n segmentInfo.cues = [];\n segmentInfo.timestampmap = {\n MPEGTS: 0,\n LOCAL: 0\n };\n parser.oncue = segmentInfo.cues.push.bind(segmentInfo.cues);\n parser.ontimestampmap = map => {\n segmentInfo.timestampmap = map;\n };\n parser.onparsingerror = error => {\n videojs.log.warn('Error encountered when parsing cues: ' + error.message);\n };\n if (segmentInfo.segment.map) {\n let mapData = segmentInfo.segment.map.bytes;\n if (decodeBytesToString) {\n mapData = uint8ToUtf8(mapData);\n }\n parser.parse(mapData);\n }\n let segmentData = segmentInfo.bytes;\n if (decodeBytesToString) {\n segmentData = uint8ToUtf8(segmentData);\n }\n parser.parse(segmentData);\n parser.flush();\n }\n /**\n * Updates the start and end times of any cues parsed by the WebVTT parser using\n * the information parsed from the X-TIMESTAMP-MAP header and a TS to media time mapping\n * from the SyncController\n *\n * @param {Object} segmentInfo\n * a segment info object that describes the current segment\n * @param {Object} mappingObj\n * object containing a mapping from TS to media time\n * @param {Object} playlist\n * the playlist object containing the segment\n * @private\n */\n\n updateTimeMapping_(segmentInfo, mappingObj, playlist) {\n const segment = segmentInfo.segment;\n if (!mappingObj) {\n // If the sync controller does not have a mapping of TS to Media Time for the\n // timeline, then we don't have enough information to update the cue\n // start/end times\n return;\n }\n if (!segmentInfo.cues.length) {\n // If there are no cues, we also do not have enough information to figure out\n // segment timing. Mark that the segment contains no cues so we don't re-request\n // an empty segment.\n segment.empty = true;\n return;\n }\n const {\n MPEGTS,\n LOCAL\n } = segmentInfo.timestampmap;\n /**\n * From the spec:\n * The MPEGTS media timestamp MUST use a 90KHz timescale,\n * even when non-WebVTT Media Segments use a different timescale.\n */\n\n const mpegTsInSeconds = MPEGTS / ONE_SECOND_IN_TS;\n const diff = mpegTsInSeconds - LOCAL + mappingObj.mapping;\n segmentInfo.cues.forEach(cue => {\n const duration = cue.endTime - cue.startTime;\n const startTime = MPEGTS === 0 ? cue.startTime + diff : this.handleRollover_(cue.startTime + diff, mappingObj.time);\n cue.startTime = Math.max(startTime, 0);\n cue.endTime = Math.max(startTime + duration, 0);\n });\n if (!playlist.syncInfo) {\n const firstStart = segmentInfo.cues[0].startTime;\n const lastStart = segmentInfo.cues[segmentInfo.cues.length - 1].startTime;\n playlist.syncInfo = {\n mediaSequence: playlist.mediaSequence + segmentInfo.mediaIndex,\n time: Math.min(firstStart, lastStart - segment.duration)\n };\n }\n }\n /**\n * MPEG-TS PES timestamps are limited to 2^33.\n * Once they reach 2^33, they roll over to 0.\n * mux.js handles PES timestamp rollover for the following scenarios:\n * [forward rollover(right)] ->\n * PES timestamps monotonically increase, and once they reach 2^33, they roll over to 0\n * [backward rollover(left)] -->\n * we seek back to position before rollover.\n *\n * According to the HLS SPEC:\n * When synchronizing WebVTT with PES timestamps, clients SHOULD account\n * for cases where the 33-bit PES timestamps have wrapped and the WebVTT\n * cue times have not. When the PES timestamp wraps, the WebVTT Segment\n * SHOULD have a X-TIMESTAMP-MAP header that maps the current WebVTT\n * time to the new (low valued) PES timestamp.\n *\n * So we want to handle rollover here and align VTT Cue start/end time to the player's time.\n */\n\n handleRollover_(value, reference) {\n if (reference === null) {\n return value;\n }\n let valueIn90khz = value * ONE_SECOND_IN_TS;\n const referenceIn90khz = reference * ONE_SECOND_IN_TS;\n let offset;\n if (referenceIn90khz < valueIn90khz) {\n // - 2^33\n offset = -8589934592;\n } else {\n // + 2^33\n offset = 8589934592;\n } // distance(value - reference) > 2^32\n\n while (Math.abs(valueIn90khz - referenceIn90khz) > 4294967296) {\n valueIn90khz += offset;\n }\n return valueIn90khz / ONE_SECOND_IN_TS;\n }\n}\n\n/**\n * @file ad-cue-tags.js\n */\n/**\n * Searches for an ad cue that overlaps with the given mediaTime\n *\n * @param {Object} track\n * the track to find the cue for\n *\n * @param {number} mediaTime\n * the time to find the cue at\n *\n * @return {Object|null}\n * the found cue or null\n */\n\nconst findAdCue = function (track, mediaTime) {\n const cues = track.cues;\n for (let i = 0; i < cues.length; i++) {\n const cue = cues[i];\n if (mediaTime >= cue.adStartTime && mediaTime <= cue.adEndTime) {\n return cue;\n }\n }\n return null;\n};\nconst updateAdCues = function (media, track, offset = 0) {\n if (!media.segments) {\n return;\n }\n let mediaTime = offset;\n let cue;\n for (let i = 0; i < media.segments.length; i++) {\n const segment = media.segments[i];\n if (!cue) {\n // Since the cues will span for at least the segment duration, adding a fudge\n // factor of half segment duration will prevent duplicate cues from being\n // created when timing info is not exact (e.g. cue start time initialized\n // at 10.006677, but next call mediaTime is 10.003332 )\n cue = findAdCue(track, mediaTime + segment.duration / 2);\n }\n if (cue) {\n if ('cueIn' in segment) {\n // Found a CUE-IN so end the cue\n cue.endTime = mediaTime;\n cue.adEndTime = mediaTime;\n mediaTime += segment.duration;\n cue = null;\n continue;\n }\n if (mediaTime < cue.endTime) {\n // Already processed this mediaTime for this cue\n mediaTime += segment.duration;\n continue;\n } // otherwise extend cue until a CUE-IN is found\n\n cue.endTime += segment.duration;\n } else {\n if ('cueOut' in segment) {\n cue = new window$1.VTTCue(mediaTime, mediaTime + segment.duration, segment.cueOut);\n cue.adStartTime = mediaTime; // Assumes tag format to be\n // #EXT-X-CUE-OUT:30\n\n cue.adEndTime = mediaTime + parseFloat(segment.cueOut);\n track.addCue(cue);\n }\n if ('cueOutCont' in segment) {\n // Entered into the middle of an ad cue\n // Assumes tag formate to be\n // #EXT-X-CUE-OUT-CONT:10/30\n const [adOffset, adTotal] = segment.cueOutCont.split('/').map(parseFloat);\n cue = new window$1.VTTCue(mediaTime, mediaTime + segment.duration, '');\n cue.adStartTime = mediaTime - adOffset;\n cue.adEndTime = cue.adStartTime + adTotal;\n track.addCue(cue);\n }\n }\n mediaTime += segment.duration;\n }\n};\nclass SyncInfo {\n /**\n * @param {number} start - media sequence start\n * @param {number} end - media sequence end\n * @param {number} segmentIndex - index for associated segment\n * @param {number|null} [partIndex] - index for associated part\n * @param {boolean} [appended] - appended indicator\n *\n */\n constructor({\n start,\n end,\n segmentIndex,\n partIndex = null,\n appended = false\n }) {\n this.start_ = start;\n this.end_ = end;\n this.segmentIndex_ = segmentIndex;\n this.partIndex_ = partIndex;\n this.appended_ = appended;\n }\n isInRange(targetTime) {\n return targetTime >= this.start && targetTime < this.end;\n }\n markAppended() {\n this.appended_ = true;\n }\n resetAppendedStatus() {\n this.appended_ = false;\n }\n get isAppended() {\n return this.appended_;\n }\n get start() {\n return this.start_;\n }\n get end() {\n return this.end_;\n }\n get segmentIndex() {\n return this.segmentIndex_;\n }\n get partIndex() {\n return this.partIndex_;\n }\n}\nclass SyncInfoData {\n /**\n *\n * @param {SyncInfo} segmentSyncInfo - sync info for a given segment\n * @param {Array} [partsSyncInfo] - sync infos for a list of parts for a given segment\n */\n constructor(segmentSyncInfo, partsSyncInfo = []) {\n this.segmentSyncInfo_ = segmentSyncInfo;\n this.partsSyncInfo_ = partsSyncInfo;\n }\n get segmentSyncInfo() {\n return this.segmentSyncInfo_;\n }\n get partsSyncInfo() {\n return this.partsSyncInfo_;\n }\n get hasPartsSyncInfo() {\n return this.partsSyncInfo_.length > 0;\n }\n resetAppendStatus() {\n this.segmentSyncInfo_.resetAppendedStatus();\n this.partsSyncInfo_.forEach(partSyncInfo => partSyncInfo.resetAppendedStatus());\n }\n}\nclass MediaSequenceSync {\n constructor() {\n /**\n * @type {Map}\n * @protected\n */\n this.storage_ = new Map();\n this.diagnostics_ = '';\n this.isReliable_ = false;\n this.start_ = -Infinity;\n this.end_ = Infinity;\n }\n get start() {\n return this.start_;\n }\n get end() {\n return this.end_;\n }\n get diagnostics() {\n return this.diagnostics_;\n }\n get isReliable() {\n return this.isReliable_;\n }\n resetAppendedStatus() {\n this.storage_.forEach(syncInfoData => syncInfoData.resetAppendStatus());\n }\n /**\n * update sync storage\n *\n * @param {Object} playlist\n * @param {number} currentTime\n *\n * @return {void}\n */\n\n update(playlist, currentTime) {\n const {\n mediaSequence,\n segments\n } = playlist;\n this.isReliable_ = this.isReliablePlaylist_(mediaSequence, segments);\n if (!this.isReliable_) {\n return;\n }\n return this.updateStorage_(segments, mediaSequence, this.calculateBaseTime_(mediaSequence, currentTime));\n }\n /**\n * @param {number} targetTime\n * @return {SyncInfo|null}\n */\n\n getSyncInfoForTime(targetTime) {\n for (const {\n segmentSyncInfo,\n partsSyncInfo\n } of this.storage_.values()) {\n // Normal segment flow:\n if (!partsSyncInfo.length) {\n if (segmentSyncInfo.isInRange(targetTime)) {\n return segmentSyncInfo;\n }\n } else {\n // Low latency flow:\n for (const partSyncInfo of partsSyncInfo) {\n if (partSyncInfo.isInRange(targetTime)) {\n return partSyncInfo;\n }\n }\n }\n }\n return null;\n }\n getSyncInfoForMediaSequence(mediaSequence) {\n return this.storage_.get(mediaSequence);\n }\n updateStorage_(segments, startingMediaSequence, startingTime) {\n const newStorage = new Map();\n let newDiagnostics = '\\n';\n let currentStart = startingTime;\n let currentMediaSequence = startingMediaSequence;\n this.start_ = currentStart;\n segments.forEach((segment, segmentIndex) => {\n const prevSyncInfoData = this.storage_.get(currentMediaSequence);\n const segmentStart = currentStart;\n const segmentEnd = segmentStart + segment.duration;\n const segmentIsAppended = Boolean(prevSyncInfoData && prevSyncInfoData.segmentSyncInfo && prevSyncInfoData.segmentSyncInfo.isAppended);\n const segmentSyncInfo = new SyncInfo({\n start: segmentStart,\n end: segmentEnd,\n appended: segmentIsAppended,\n segmentIndex\n });\n segment.syncInfo = segmentSyncInfo;\n let currentPartStart = currentStart;\n const partsSyncInfo = (segment.parts || []).map((part, partIndex) => {\n const partStart = currentPartStart;\n const partEnd = currentPartStart + part.duration;\n const partIsAppended = Boolean(prevSyncInfoData && prevSyncInfoData.partsSyncInfo && prevSyncInfoData.partsSyncInfo[partIndex] && prevSyncInfoData.partsSyncInfo[partIndex].isAppended);\n const partSyncInfo = new SyncInfo({\n start: partStart,\n end: partEnd,\n appended: partIsAppended,\n segmentIndex,\n partIndex\n });\n currentPartStart = partEnd;\n newDiagnostics += `Media Sequence: ${currentMediaSequence}.${partIndex} | Range: ${partStart} --> ${partEnd} | Appended: ${partIsAppended}\\n`;\n part.syncInfo = partSyncInfo;\n return partSyncInfo;\n });\n newStorage.set(currentMediaSequence, new SyncInfoData(segmentSyncInfo, partsSyncInfo));\n newDiagnostics += `${compactSegmentUrlDescription(segment.resolvedUri)} | Media Sequence: ${currentMediaSequence} | Range: ${segmentStart} --> ${segmentEnd} | Appended: ${segmentIsAppended}\\n`;\n currentMediaSequence++;\n currentStart = segmentEnd;\n });\n this.end_ = currentStart;\n this.storage_ = newStorage;\n this.diagnostics_ = newDiagnostics;\n }\n calculateBaseTime_(mediaSequence, fallback) {\n if (!this.storage_.size) {\n // Initial setup flow.\n return 0;\n }\n if (this.storage_.has(mediaSequence)) {\n // Normal flow.\n return this.storage_.get(mediaSequence).segmentSyncInfo.start;\n } // Fallback flow.\n // There is a gap between last recorded playlist and a new one received.\n\n return fallback;\n }\n isReliablePlaylist_(mediaSequence, segments) {\n return mediaSequence !== undefined && mediaSequence !== null && Array.isArray(segments) && segments.length;\n }\n}\nclass DependantMediaSequenceSync extends MediaSequenceSync {\n constructor(parent) {\n super();\n this.parent_ = parent;\n }\n calculateBaseTime_(mediaSequence, fallback) {\n if (!this.storage_.size) {\n const info = this.parent_.getSyncInfoForMediaSequence(mediaSequence);\n if (info) {\n return info.segmentSyncInfo.start;\n }\n return 0;\n }\n return super.calculateBaseTime_(mediaSequence, fallback);\n }\n}\n\n/**\n * @file sync-controller.js\n */\n// synchronize expired playlist segments.\n// the max media sequence diff is 48 hours of live stream\n// content with two second segments. Anything larger than that\n// will likely be invalid.\n\nconst MAX_MEDIA_SEQUENCE_DIFF_FOR_SYNC = 86400;\nconst syncPointStrategies = [\n// Stategy \"VOD\": Handle the VOD-case where the sync-point is *always*\n// the equivalence display-time 0 === segment-index 0\n{\n name: 'VOD',\n run: (syncController, playlist, duration, currentTimeline, currentTime) => {\n if (duration !== Infinity) {\n const syncPoint = {\n time: 0,\n segmentIndex: 0,\n partIndex: null\n };\n return syncPoint;\n }\n return null;\n }\n}, {\n name: 'MediaSequence',\n /**\n * run media sequence strategy\n *\n * @param {SyncController} syncController\n * @param {Object} playlist\n * @param {number} duration\n * @param {number} currentTimeline\n * @param {number} currentTime\n * @param {string} type\n */\n run: (syncController, playlist, duration, currentTimeline, currentTime, type) => {\n const mediaSequenceSync = syncController.getMediaSequenceSync(type);\n if (!mediaSequenceSync) {\n return null;\n }\n if (!mediaSequenceSync.isReliable) {\n return null;\n }\n const syncInfo = mediaSequenceSync.getSyncInfoForTime(currentTime);\n if (!syncInfo) {\n return null;\n }\n return {\n time: syncInfo.start,\n partIndex: syncInfo.partIndex,\n segmentIndex: syncInfo.segmentIndex\n };\n }\n},\n// Stategy \"ProgramDateTime\": We have a program-date-time tag in this playlist\n{\n name: 'ProgramDateTime',\n run: (syncController, playlist, duration, currentTimeline, currentTime) => {\n if (!Object.keys(syncController.timelineToDatetimeMappings).length) {\n return null;\n }\n let syncPoint = null;\n let lastDistance = null;\n const partsAndSegments = getPartsAndSegments(playlist);\n currentTime = currentTime || 0;\n for (let i = 0; i < partsAndSegments.length; i++) {\n // start from the end and loop backwards for live\n // or start from the front and loop forwards for non-live\n const index = playlist.endList || currentTime === 0 ? i : partsAndSegments.length - (i + 1);\n const partAndSegment = partsAndSegments[index];\n const segment = partAndSegment.segment;\n const datetimeMapping = syncController.timelineToDatetimeMappings[segment.timeline];\n if (!datetimeMapping || !segment.dateTimeObject) {\n continue;\n }\n const segmentTime = segment.dateTimeObject.getTime() / 1000;\n let start = segmentTime + datetimeMapping; // take part duration into account.\n\n if (segment.parts && typeof partAndSegment.partIndex === 'number') {\n for (let z = 0; z < partAndSegment.partIndex; z++) {\n start += segment.parts[z].duration;\n }\n }\n const distance = Math.abs(currentTime - start); // Once the distance begins to increase, or if distance is 0, we have passed\n // currentTime and can stop looking for better candidates\n\n if (lastDistance !== null && (distance === 0 || lastDistance < distance)) {\n break;\n }\n lastDistance = distance;\n syncPoint = {\n time: start,\n segmentIndex: partAndSegment.segmentIndex,\n partIndex: partAndSegment.partIndex\n };\n }\n return syncPoint;\n }\n},\n// Stategy \"Segment\": We have a known time mapping for a timeline and a\n// segment in the current timeline with timing data\n{\n name: 'Segment',\n run: (syncController, playlist, duration, currentTimeline, currentTime) => {\n let syncPoint = null;\n let lastDistance = null;\n currentTime = currentTime || 0;\n const partsAndSegments = getPartsAndSegments(playlist);\n for (let i = 0; i < partsAndSegments.length; i++) {\n // start from the end and loop backwards for live\n // or start from the front and loop forwards for non-live\n const index = playlist.endList || currentTime === 0 ? i : partsAndSegments.length - (i + 1);\n const partAndSegment = partsAndSegments[index];\n const segment = partAndSegment.segment;\n const start = partAndSegment.part && partAndSegment.part.start || segment && segment.start;\n if (segment.timeline === currentTimeline && typeof start !== 'undefined') {\n const distance = Math.abs(currentTime - start); // Once the distance begins to increase, we have passed\n // currentTime and can stop looking for better candidates\n\n if (lastDistance !== null && lastDistance < distance) {\n break;\n }\n if (!syncPoint || lastDistance === null || lastDistance >= distance) {\n lastDistance = distance;\n syncPoint = {\n time: start,\n segmentIndex: partAndSegment.segmentIndex,\n partIndex: partAndSegment.partIndex\n };\n }\n }\n }\n return syncPoint;\n }\n},\n// Stategy \"Discontinuity\": We have a discontinuity with a known\n// display-time\n{\n name: 'Discontinuity',\n run: (syncController, playlist, duration, currentTimeline, currentTime) => {\n let syncPoint = null;\n currentTime = currentTime || 0;\n if (playlist.discontinuityStarts && playlist.discontinuityStarts.length) {\n let lastDistance = null;\n for (let i = 0; i < playlist.discontinuityStarts.length; i++) {\n const segmentIndex = playlist.discontinuityStarts[i];\n const discontinuity = playlist.discontinuitySequence + i + 1;\n const discontinuitySync = syncController.discontinuities[discontinuity];\n if (discontinuitySync) {\n const distance = Math.abs(currentTime - discontinuitySync.time); // Once the distance begins to increase, we have passed\n // currentTime and can stop looking for better candidates\n\n if (lastDistance !== null && lastDistance < distance) {\n break;\n }\n if (!syncPoint || lastDistance === null || lastDistance >= distance) {\n lastDistance = distance;\n syncPoint = {\n time: discontinuitySync.time,\n segmentIndex,\n partIndex: null\n };\n }\n }\n }\n }\n return syncPoint;\n }\n},\n// Stategy \"Playlist\": We have a playlist with a known mapping of\n// segment index to display time\n{\n name: 'Playlist',\n run: (syncController, playlist, duration, currentTimeline, currentTime) => {\n if (playlist.syncInfo) {\n const syncPoint = {\n time: playlist.syncInfo.time,\n segmentIndex: playlist.syncInfo.mediaSequence - playlist.mediaSequence,\n partIndex: null\n };\n return syncPoint;\n }\n return null;\n }\n}];\nclass SyncController extends videojs.EventTarget {\n constructor(options = {}) {\n super(); // ...for synching across variants\n\n this.timelines = [];\n this.discontinuities = [];\n this.timelineToDatetimeMappings = {}; // TODO: this map should be only available for HLS. Since only HLS has MediaSequence.\n // For some reason this map helps with syncing between quality switch for MPEG-DASH as well.\n // Moreover if we disable this map for MPEG-DASH - quality switch will be broken.\n // MPEG-DASH should have its own separate sync strategy\n\n const main = new MediaSequenceSync();\n const audio = new DependantMediaSequenceSync(main);\n const vtt = new DependantMediaSequenceSync(main);\n this.mediaSequenceStorage_ = {\n main,\n audio,\n vtt\n };\n this.logger_ = logger('SyncController');\n }\n /**\n *\n * @param {string} loaderType\n * @return {MediaSequenceSync|null}\n */\n\n getMediaSequenceSync(loaderType) {\n return this.mediaSequenceStorage_[loaderType] || null;\n }\n /**\n * Find a sync-point for the playlist specified\n *\n * A sync-point is defined as a known mapping from display-time to\n * a segment-index in the current playlist.\n *\n * @param {Playlist} playlist\n * The playlist that needs a sync-point\n * @param {number} duration\n * Duration of the MediaSource (Infinite if playing a live source)\n * @param {number} currentTimeline\n * The last timeline from which a segment was loaded\n * @param {number} currentTime\n * Current player's time\n * @param {string} type\n * Segment loader type\n * @return {Object}\n * A sync-point object\n */\n\n getSyncPoint(playlist, duration, currentTimeline, currentTime, type) {\n // Always use VOD sync point for VOD\n if (duration !== Infinity) {\n const vodSyncPointStrategy = syncPointStrategies.find(({\n name\n }) => name === 'VOD');\n return vodSyncPointStrategy.run(this, playlist, duration);\n }\n const syncPoints = this.runStrategies_(playlist, duration, currentTimeline, currentTime, type);\n if (!syncPoints.length) {\n // Signal that we need to attempt to get a sync-point manually\n // by fetching a segment in the playlist and constructing\n // a sync-point from that information\n return null;\n } // If we have exact match just return it instead of finding the nearest distance\n\n for (const syncPointInfo of syncPoints) {\n const {\n syncPoint,\n strategy\n } = syncPointInfo;\n const {\n segmentIndex,\n time\n } = syncPoint;\n if (segmentIndex < 0) {\n continue;\n }\n const selectedSegment = playlist.segments[segmentIndex];\n const start = time;\n const end = start + selectedSegment.duration;\n this.logger_(`Strategy: ${strategy}. Current time: ${currentTime}. selected segment: ${segmentIndex}. Time: [${start} -> ${end}]}`);\n if (currentTime >= start && currentTime < end) {\n this.logger_('Found sync point with exact match: ', syncPoint);\n return syncPoint;\n }\n } // Now find the sync-point that is closest to the currentTime because\n // that should result in the most accurate guess about which segment\n // to fetch\n\n return this.selectSyncPoint_(syncPoints, {\n key: 'time',\n value: currentTime\n });\n }\n /**\n * Calculate the amount of time that has expired off the playlist during playback\n *\n * @param {Playlist} playlist\n * Playlist object to calculate expired from\n * @param {number} duration\n * Duration of the MediaSource (Infinity if playling a live source)\n * @return {number|null}\n * The amount of time that has expired off the playlist during playback. Null\n * if no sync-points for the playlist can be found.\n */\n\n getExpiredTime(playlist, duration) {\n if (!playlist || !playlist.segments) {\n return null;\n }\n const syncPoints = this.runStrategies_(playlist, duration, playlist.discontinuitySequence, 0); // Without sync-points, there is not enough information to determine the expired time\n\n if (!syncPoints.length) {\n return null;\n }\n const syncPoint = this.selectSyncPoint_(syncPoints, {\n key: 'segmentIndex',\n value: 0\n }); // If the sync-point is beyond the start of the playlist, we want to subtract the\n // duration from index 0 to syncPoint.segmentIndex instead of adding.\n\n if (syncPoint.segmentIndex > 0) {\n syncPoint.time *= -1;\n }\n return Math.abs(syncPoint.time + sumDurations({\n defaultDuration: playlist.targetDuration,\n durationList: playlist.segments,\n startIndex: syncPoint.segmentIndex,\n endIndex: 0\n }));\n }\n /**\n * Runs each sync-point strategy and returns a list of sync-points returned by the\n * strategies\n *\n * @private\n * @param {Playlist} playlist\n * The playlist that needs a sync-point\n * @param {number} duration\n * Duration of the MediaSource (Infinity if playing a live source)\n * @param {number} currentTimeline\n * The last timeline from which a segment was loaded\n * @param {number} currentTime\n * Current player's time\n * @param {string} type\n * Segment loader type\n * @return {Array}\n * A list of sync-point objects\n */\n\n runStrategies_(playlist, duration, currentTimeline, currentTime, type) {\n const syncPoints = []; // Try to find a sync-point in by utilizing various strategies...\n\n for (let i = 0; i < syncPointStrategies.length; i++) {\n const strategy = syncPointStrategies[i];\n const syncPoint = strategy.run(this, playlist, duration, currentTimeline, currentTime, type);\n if (syncPoint) {\n syncPoint.strategy = strategy.name;\n syncPoints.push({\n strategy: strategy.name,\n syncPoint\n });\n }\n }\n return syncPoints;\n }\n /**\n * Selects the sync-point nearest the specified target\n *\n * @private\n * @param {Array} syncPoints\n * List of sync-points to select from\n * @param {Object} target\n * Object specifying the property and value we are targeting\n * @param {string} target.key\n * Specifies the property to target. Must be either 'time' or 'segmentIndex'\n * @param {number} target.value\n * The value to target for the specified key.\n * @return {Object}\n * The sync-point nearest the target\n */\n\n selectSyncPoint_(syncPoints, target) {\n let bestSyncPoint = syncPoints[0].syncPoint;\n let bestDistance = Math.abs(syncPoints[0].syncPoint[target.key] - target.value);\n let bestStrategy = syncPoints[0].strategy;\n for (let i = 1; i < syncPoints.length; i++) {\n const newDistance = Math.abs(syncPoints[i].syncPoint[target.key] - target.value);\n if (newDistance < bestDistance) {\n bestDistance = newDistance;\n bestSyncPoint = syncPoints[i].syncPoint;\n bestStrategy = syncPoints[i].strategy;\n }\n }\n this.logger_(`syncPoint for [${target.key}: ${target.value}] chosen with strategy` + ` [${bestStrategy}]: [time:${bestSyncPoint.time},` + ` segmentIndex:${bestSyncPoint.segmentIndex}` + (typeof bestSyncPoint.partIndex === 'number' ? `,partIndex:${bestSyncPoint.partIndex}` : '') + ']');\n return bestSyncPoint;\n }\n /**\n * Save any meta-data present on the segments when segments leave\n * the live window to the playlist to allow for synchronization at the\n * playlist level later.\n *\n * @param {Playlist} oldPlaylist - The previous active playlist\n * @param {Playlist} newPlaylist - The updated and most current playlist\n */\n\n saveExpiredSegmentInfo(oldPlaylist, newPlaylist) {\n const mediaSequenceDiff = newPlaylist.mediaSequence - oldPlaylist.mediaSequence; // Ignore large media sequence gaps\n\n if (mediaSequenceDiff > MAX_MEDIA_SEQUENCE_DIFF_FOR_SYNC) {\n videojs.log.warn(`Not saving expired segment info. Media sequence gap ${mediaSequenceDiff} is too large.`);\n return;\n } // When a segment expires from the playlist and it has a start time\n // save that information as a possible sync-point reference in future\n\n for (let i = mediaSequenceDiff - 1; i >= 0; i--) {\n const lastRemovedSegment = oldPlaylist.segments[i];\n if (lastRemovedSegment && typeof lastRemovedSegment.start !== 'undefined') {\n newPlaylist.syncInfo = {\n mediaSequence: oldPlaylist.mediaSequence + i,\n time: lastRemovedSegment.start\n };\n this.logger_(`playlist refresh sync: [time:${newPlaylist.syncInfo.time},` + ` mediaSequence: ${newPlaylist.syncInfo.mediaSequence}]`);\n this.trigger('syncinfoupdate');\n break;\n }\n }\n }\n /**\n * Save the mapping from playlist's ProgramDateTime to display. This should only happen\n * before segments start to load.\n *\n * @param {Playlist} playlist - The currently active playlist\n */\n\n setDateTimeMappingForStart(playlist) {\n // It's possible for the playlist to be updated before playback starts, meaning time\n // zero is not yet set. If, during these playlist refreshes, a discontinuity is\n // crossed, then the old time zero mapping (for the prior timeline) would be retained\n // unless the mappings are cleared.\n this.timelineToDatetimeMappings = {};\n if (playlist.segments && playlist.segments.length && playlist.segments[0].dateTimeObject) {\n const firstSegment = playlist.segments[0];\n const playlistTimestamp = firstSegment.dateTimeObject.getTime() / 1000;\n this.timelineToDatetimeMappings[firstSegment.timeline] = -playlistTimestamp;\n }\n }\n /**\n * Calculates and saves timeline mappings, playlist sync info, and segment timing values\n * based on the latest timing information.\n *\n * @param {Object} options\n * Options object\n * @param {SegmentInfo} options.segmentInfo\n * The current active request information\n * @param {boolean} options.shouldSaveTimelineMapping\n * If there's a timeline change, determines if the timeline mapping should be\n * saved for timeline mapping and program date time mappings.\n */\n\n saveSegmentTimingInfo({\n segmentInfo,\n shouldSaveTimelineMapping\n }) {\n const didCalculateSegmentTimeMapping = this.calculateSegmentTimeMapping_(segmentInfo, segmentInfo.timingInfo, shouldSaveTimelineMapping);\n const segment = segmentInfo.segment;\n if (didCalculateSegmentTimeMapping) {\n this.saveDiscontinuitySyncInfo_(segmentInfo); // If the playlist does not have sync information yet, record that information\n // now with segment timing information\n\n if (!segmentInfo.playlist.syncInfo) {\n segmentInfo.playlist.syncInfo = {\n mediaSequence: segmentInfo.playlist.mediaSequence + segmentInfo.mediaIndex,\n time: segment.start\n };\n }\n }\n const dateTime = segment.dateTimeObject;\n if (segment.discontinuity && shouldSaveTimelineMapping && dateTime) {\n this.timelineToDatetimeMappings[segment.timeline] = -(dateTime.getTime() / 1000);\n }\n }\n timestampOffsetForTimeline(timeline) {\n if (typeof this.timelines[timeline] === 'undefined') {\n return null;\n }\n return this.timelines[timeline].time;\n }\n mappingForTimeline(timeline) {\n if (typeof this.timelines[timeline] === 'undefined') {\n return null;\n }\n return this.timelines[timeline].mapping;\n }\n /**\n * Use the \"media time\" for a segment to generate a mapping to \"display time\" and\n * save that display time to the segment.\n *\n * @private\n * @param {SegmentInfo} segmentInfo\n * The current active request information\n * @param {Object} timingInfo\n * The start and end time of the current segment in \"media time\"\n * @param {boolean} shouldSaveTimelineMapping\n * If there's a timeline change, determines if the timeline mapping should be\n * saved in timelines.\n * @return {boolean}\n * Returns false if segment time mapping could not be calculated\n */\n\n calculateSegmentTimeMapping_(segmentInfo, timingInfo, shouldSaveTimelineMapping) {\n // TODO: remove side effects\n const segment = segmentInfo.segment;\n const part = segmentInfo.part;\n let mappingObj = this.timelines[segmentInfo.timeline];\n let start;\n let end;\n if (typeof segmentInfo.timestampOffset === 'number') {\n mappingObj = {\n time: segmentInfo.startOfSegment,\n mapping: segmentInfo.startOfSegment - timingInfo.start\n };\n if (shouldSaveTimelineMapping) {\n this.timelines[segmentInfo.timeline] = mappingObj;\n this.trigger('timestampoffset');\n this.logger_(`time mapping for timeline ${segmentInfo.timeline}: ` + `[time: ${mappingObj.time}] [mapping: ${mappingObj.mapping}]`);\n }\n start = segmentInfo.startOfSegment;\n end = timingInfo.end + mappingObj.mapping;\n } else if (mappingObj) {\n start = timingInfo.start + mappingObj.mapping;\n end = timingInfo.end + mappingObj.mapping;\n } else {\n return false;\n }\n if (part) {\n part.start = start;\n part.end = end;\n } // If we don't have a segment start yet or the start value we got\n // is less than our current segment.start value, save a new start value.\n // We have to do this because parts will have segment timing info saved\n // multiple times and we want segment start to be the earliest part start\n // value for that segment.\n\n if (!segment.start || start < segment.start) {\n segment.start = start;\n }\n segment.end = end;\n return true;\n }\n /**\n * Each time we have discontinuity in the playlist, attempt to calculate the location\n * in display of the start of the discontinuity and save that. We also save an accuracy\n * value so that we save values with the most accuracy (closest to 0.)\n *\n * @private\n * @param {SegmentInfo} segmentInfo - The current active request information\n */\n\n saveDiscontinuitySyncInfo_(segmentInfo) {\n const playlist = segmentInfo.playlist;\n const segment = segmentInfo.segment; // If the current segment is a discontinuity then we know exactly where\n // the start of the range and it's accuracy is 0 (greater accuracy values\n // mean more approximation)\n\n if (segment.discontinuity) {\n this.discontinuities[segment.timeline] = {\n time: segment.start,\n accuracy: 0\n };\n } else if (playlist.discontinuityStarts && playlist.discontinuityStarts.length) {\n // Search for future discontinuities that we can provide better timing\n // information for and save that information for sync purposes\n for (let i = 0; i < playlist.discontinuityStarts.length; i++) {\n const segmentIndex = playlist.discontinuityStarts[i];\n const discontinuity = playlist.discontinuitySequence + i + 1;\n const mediaIndexDiff = segmentIndex - segmentInfo.mediaIndex;\n const accuracy = Math.abs(mediaIndexDiff);\n if (!this.discontinuities[discontinuity] || this.discontinuities[discontinuity].accuracy > accuracy) {\n let time;\n if (mediaIndexDiff < 0) {\n time = segment.start - sumDurations({\n defaultDuration: playlist.targetDuration,\n durationList: playlist.segments,\n startIndex: segmentInfo.mediaIndex,\n endIndex: segmentIndex\n });\n } else {\n time = segment.end + sumDurations({\n defaultDuration: playlist.targetDuration,\n durationList: playlist.segments,\n startIndex: segmentInfo.mediaIndex + 1,\n endIndex: segmentIndex\n });\n }\n this.discontinuities[discontinuity] = {\n time,\n accuracy\n };\n }\n }\n }\n }\n dispose() {\n this.trigger('dispose');\n this.off();\n }\n}\n\n/**\n * The TimelineChangeController acts as a source for segment loaders to listen for and\n * keep track of latest and pending timeline changes. This is useful to ensure proper\n * sync, as each loader may need to make a consideration for what timeline the other\n * loader is on before making changes which could impact the other loader's media.\n *\n * @class TimelineChangeController\n * @extends videojs.EventTarget\n */\n\nclass TimelineChangeController extends videojs.EventTarget {\n constructor() {\n super();\n this.pendingTimelineChanges_ = {};\n this.lastTimelineChanges_ = {};\n }\n clearPendingTimelineChange(type) {\n this.pendingTimelineChanges_[type] = null;\n this.trigger('pendingtimelinechange');\n }\n pendingTimelineChange({\n type,\n from,\n to\n }) {\n if (typeof from === 'number' && typeof to === 'number') {\n this.pendingTimelineChanges_[type] = {\n type,\n from,\n to\n };\n this.trigger('pendingtimelinechange');\n }\n return this.pendingTimelineChanges_[type];\n }\n lastTimelineChange({\n type,\n from,\n to\n }) {\n if (typeof from === 'number' && typeof to === 'number') {\n this.lastTimelineChanges_[type] = {\n type,\n from,\n to\n };\n delete this.pendingTimelineChanges_[type];\n const metadata = {\n timelineChangeInfo: {\n from,\n to\n }\n };\n this.trigger({\n type: 'timelinechange',\n metadata\n });\n }\n return this.lastTimelineChanges_[type];\n }\n dispose() {\n this.trigger('dispose');\n this.pendingTimelineChanges_ = {};\n this.lastTimelineChanges_ = {};\n this.off();\n }\n}\n\n/* rollup-plugin-worker-factory start for worker!/home/runner/work/http-streaming/http-streaming/src/decrypter-worker.js */\nconst workerCode = transform(getWorkerString(function () {\n /**\n * @file stream.js\n */\n\n /**\n * A lightweight readable stream implemention that handles event dispatching.\n *\n * @class Stream\n */\n\n var Stream = /*#__PURE__*/function () {\n function Stream() {\n this.listeners = {};\n }\n /**\n * Add a listener for a specified event type.\n *\n * @param {string} type the event name\n * @param {Function} listener the callback to be invoked when an event of\n * the specified type occurs\n */\n\n var _proto = Stream.prototype;\n _proto.on = function on(type, listener) {\n if (!this.listeners[type]) {\n this.listeners[type] = [];\n }\n this.listeners[type].push(listener);\n }\n /**\n * Remove a listener for a specified event type.\n *\n * @param {string} type the event name\n * @param {Function} listener a function previously registered for this\n * type of event through `on`\n * @return {boolean} if we could turn it off or not\n */;\n\n _proto.off = function off(type, listener) {\n if (!this.listeners[type]) {\n return false;\n }\n var index = this.listeners[type].indexOf(listener); // TODO: which is better?\n // In Video.js we slice listener functions\n // on trigger so that it does not mess up the order\n // while we loop through.\n //\n // Here we slice on off so that the loop in trigger\n // can continue using it's old reference to loop without\n // messing up the order.\n\n this.listeners[type] = this.listeners[type].slice(0);\n this.listeners[type].splice(index, 1);\n return index > -1;\n }\n /**\n * Trigger an event of the specified type on this stream. Any additional\n * arguments to this function are passed as parameters to event listeners.\n *\n * @param {string} type the event name\n */;\n\n _proto.trigger = function trigger(type) {\n var callbacks = this.listeners[type];\n if (!callbacks) {\n return;\n } // Slicing the arguments on every invocation of this method\n // can add a significant amount of overhead. Avoid the\n // intermediate object creation for the common case of a\n // single callback argument\n\n if (arguments.length === 2) {\n var length = callbacks.length;\n for (var i = 0; i < length; ++i) {\n callbacks[i].call(this, arguments[1]);\n }\n } else {\n var args = Array.prototype.slice.call(arguments, 1);\n var _length = callbacks.length;\n for (var _i = 0; _i < _length; ++_i) {\n callbacks[_i].apply(this, args);\n }\n }\n }\n /**\n * Destroys the stream and cleans up.\n */;\n\n _proto.dispose = function dispose() {\n this.listeners = {};\n }\n /**\n * Forwards all `data` events on this stream to the destination stream. The\n * destination stream should provide a method `push` to receive the data\n * events as they arrive.\n *\n * @param {Stream} destination the stream that will receive all `data` events\n * @see http://nodejs.org/api/stream.html#stream_readable_pipe_destination_options\n */;\n\n _proto.pipe = function pipe(destination) {\n this.on('data', function (data) {\n destination.push(data);\n });\n };\n return Stream;\n }();\n /*! @name pkcs7 @version 1.0.4 @license Apache-2.0 */\n\n /**\n * Returns the subarray of a Uint8Array without PKCS#7 padding.\n *\n * @param padded {Uint8Array} unencrypted bytes that have been padded\n * @return {Uint8Array} the unpadded bytes\n * @see http://tools.ietf.org/html/rfc5652\n */\n\n function unpad(padded) {\n return padded.subarray(0, padded.byteLength - padded[padded.byteLength - 1]);\n }\n /*! @name aes-decrypter @version 4.0.1 @license Apache-2.0 */\n\n /**\n * @file aes.js\n *\n * This file contains an adaptation of the AES decryption algorithm\n * from the Standford Javascript Cryptography Library. That work is\n * covered by the following copyright and permissions notice:\n *\n * Copyright 2009-2010 Emily Stark, Mike Hamburg, Dan Boneh.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * 1. Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following\n * disclaimer in the documentation and/or other materials provided\n * with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN\n * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * The views and conclusions contained in the software and documentation\n * are those of the authors and should not be interpreted as representing\n * official policies, either expressed or implied, of the authors.\n */\n\n /**\n * Expand the S-box tables.\n *\n * @private\n */\n\n const precompute = function () {\n const tables = [[[], [], [], [], []], [[], [], [], [], []]];\n const encTable = tables[0];\n const decTable = tables[1];\n const sbox = encTable[4];\n const sboxInv = decTable[4];\n let i;\n let x;\n let xInv;\n const d = [];\n const th = [];\n let x2;\n let x4;\n let x8;\n let s;\n let tEnc;\n let tDec; // Compute double and third tables\n\n for (i = 0; i < 256; i++) {\n th[(d[i] = i << 1 ^ (i >> 7) * 283) ^ i] = i;\n }\n for (x = xInv = 0; !sbox[x]; x ^= x2 || 1, xInv = th[xInv] || 1) {\n // Compute sbox\n s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;\n s = s >> 8 ^ s & 255 ^ 99;\n sbox[x] = s;\n sboxInv[s] = x; // Compute MixColumns\n\n x8 = d[x4 = d[x2 = d[x]]];\n tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;\n tEnc = d[s] * 0x101 ^ s * 0x1010100;\n for (i = 0; i < 4; i++) {\n encTable[i][x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n decTable[i][s] = tDec = tDec << 24 ^ tDec >>> 8;\n }\n } // Compactify. Considerable speedup on Firefox.\n\n for (i = 0; i < 5; i++) {\n encTable[i] = encTable[i].slice(0);\n decTable[i] = decTable[i].slice(0);\n }\n return tables;\n };\n let aesTables = null;\n /**\n * Schedule out an AES key for both encryption and decryption. This\n * is a low-level class. Use a cipher mode to do bulk encryption.\n *\n * @class AES\n * @param key {Array} The key as an array of 4, 6 or 8 words.\n */\n\n class AES {\n constructor(key) {\n /**\n * The expanded S-box and inverse S-box tables. These will be computed\n * on the client so that we don't have to send them down the wire.\n *\n * There are two tables, _tables[0] is for encryption and\n * _tables[1] is for decryption.\n *\n * The first 4 sub-tables are the expanded S-box with MixColumns. The\n * last (_tables[01][4]) is the S-box itself.\n *\n * @private\n */\n // if we have yet to precompute the S-box tables\n // do so now\n if (!aesTables) {\n aesTables = precompute();\n } // then make a copy of that object for use\n\n this._tables = [[aesTables[0][0].slice(), aesTables[0][1].slice(), aesTables[0][2].slice(), aesTables[0][3].slice(), aesTables[0][4].slice()], [aesTables[1][0].slice(), aesTables[1][1].slice(), aesTables[1][2].slice(), aesTables[1][3].slice(), aesTables[1][4].slice()]];\n let i;\n let j;\n let tmp;\n const sbox = this._tables[0][4];\n const decTable = this._tables[1];\n const keyLen = key.length;\n let rcon = 1;\n if (keyLen !== 4 && keyLen !== 6 && keyLen !== 8) {\n throw new Error('Invalid aes key size');\n }\n const encKey = key.slice(0);\n const decKey = [];\n this._key = [encKey, decKey]; // schedule encryption keys\n\n for (i = keyLen; i < 4 * keyLen + 28; i++) {\n tmp = encKey[i - 1]; // apply sbox\n\n if (i % keyLen === 0 || keyLen === 8 && i % keyLen === 4) {\n tmp = sbox[tmp >>> 24] << 24 ^ sbox[tmp >> 16 & 255] << 16 ^ sbox[tmp >> 8 & 255] << 8 ^ sbox[tmp & 255]; // shift rows and add rcon\n\n if (i % keyLen === 0) {\n tmp = tmp << 8 ^ tmp >>> 24 ^ rcon << 24;\n rcon = rcon << 1 ^ (rcon >> 7) * 283;\n }\n }\n encKey[i] = encKey[i - keyLen] ^ tmp;\n } // schedule decryption keys\n\n for (j = 0; i; j++, i--) {\n tmp = encKey[j & 3 ? i : i - 4];\n if (i <= 4 || j < 4) {\n decKey[j] = tmp;\n } else {\n decKey[j] = decTable[0][sbox[tmp >>> 24]] ^ decTable[1][sbox[tmp >> 16 & 255]] ^ decTable[2][sbox[tmp >> 8 & 255]] ^ decTable[3][sbox[tmp & 255]];\n }\n }\n }\n /**\n * Decrypt 16 bytes, specified as four 32-bit words.\n *\n * @param {number} encrypted0 the first word to decrypt\n * @param {number} encrypted1 the second word to decrypt\n * @param {number} encrypted2 the third word to decrypt\n * @param {number} encrypted3 the fourth word to decrypt\n * @param {Int32Array} out the array to write the decrypted words\n * into\n * @param {number} offset the offset into the output array to start\n * writing results\n * @return {Array} The plaintext.\n */\n\n decrypt(encrypted0, encrypted1, encrypted2, encrypted3, out, offset) {\n const key = this._key[1]; // state variables a,b,c,d are loaded with pre-whitened data\n\n let a = encrypted0 ^ key[0];\n let b = encrypted3 ^ key[1];\n let c = encrypted2 ^ key[2];\n let d = encrypted1 ^ key[3];\n let a2;\n let b2;\n let c2; // key.length === 2 ?\n\n const nInnerRounds = key.length / 4 - 2;\n let i;\n let kIndex = 4;\n const table = this._tables[1]; // load up the tables\n\n const table0 = table[0];\n const table1 = table[1];\n const table2 = table[2];\n const table3 = table[3];\n const sbox = table[4]; // Inner rounds. Cribbed from OpenSSL.\n\n for (i = 0; i < nInnerRounds; i++) {\n a2 = table0[a >>> 24] ^ table1[b >> 16 & 255] ^ table2[c >> 8 & 255] ^ table3[d & 255] ^ key[kIndex];\n b2 = table0[b >>> 24] ^ table1[c >> 16 & 255] ^ table2[d >> 8 & 255] ^ table3[a & 255] ^ key[kIndex + 1];\n c2 = table0[c >>> 24] ^ table1[d >> 16 & 255] ^ table2[a >> 8 & 255] ^ table3[b & 255] ^ key[kIndex + 2];\n d = table0[d >>> 24] ^ table1[a >> 16 & 255] ^ table2[b >> 8 & 255] ^ table3[c & 255] ^ key[kIndex + 3];\n kIndex += 4;\n a = a2;\n b = b2;\n c = c2;\n } // Last round.\n\n for (i = 0; i < 4; i++) {\n out[(3 & -i) + offset] = sbox[a >>> 24] << 24 ^ sbox[b >> 16 & 255] << 16 ^ sbox[c >> 8 & 255] << 8 ^ sbox[d & 255] ^ key[kIndex++];\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n }\n }\n /**\n * @file async-stream.js\n */\n\n /**\n * A wrapper around the Stream class to use setTimeout\n * and run stream \"jobs\" Asynchronously\n *\n * @class AsyncStream\n * @extends Stream\n */\n\n class AsyncStream extends Stream {\n constructor() {\n super(Stream);\n this.jobs = [];\n this.delay = 1;\n this.timeout_ = null;\n }\n /**\n * process an async job\n *\n * @private\n */\n\n processJob_() {\n this.jobs.shift()();\n if (this.jobs.length) {\n this.timeout_ = setTimeout(this.processJob_.bind(this), this.delay);\n } else {\n this.timeout_ = null;\n }\n }\n /**\n * push a job into the stream\n *\n * @param {Function} job the job to push into the stream\n */\n\n push(job) {\n this.jobs.push(job);\n if (!this.timeout_) {\n this.timeout_ = setTimeout(this.processJob_.bind(this), this.delay);\n }\n }\n }\n /**\n * @file decrypter.js\n *\n * An asynchronous implementation of AES-128 CBC decryption with\n * PKCS#7 padding.\n */\n\n /**\n * Convert network-order (big-endian) bytes into their little-endian\n * representation.\n */\n\n const ntoh = function (word) {\n return word << 24 | (word & 0xff00) << 8 | (word & 0xff0000) >> 8 | word >>> 24;\n };\n /**\n * Decrypt bytes using AES-128 with CBC and PKCS#7 padding.\n *\n * @param {Uint8Array} encrypted the encrypted bytes\n * @param {Uint32Array} key the bytes of the decryption key\n * @param {Uint32Array} initVector the initialization vector (IV) to\n * use for the first round of CBC.\n * @return {Uint8Array} the decrypted bytes\n *\n * @see http://en.wikipedia.org/wiki/Advanced_Encryption_Standard\n * @see http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher_Block_Chaining_.28CBC.29\n * @see https://tools.ietf.org/html/rfc2315\n */\n\n const decrypt = function (encrypted, key, initVector) {\n // word-level access to the encrypted bytes\n const encrypted32 = new Int32Array(encrypted.buffer, encrypted.byteOffset, encrypted.byteLength >> 2);\n const decipher = new AES(Array.prototype.slice.call(key)); // byte and word-level access for the decrypted output\n\n const decrypted = new Uint8Array(encrypted.byteLength);\n const decrypted32 = new Int32Array(decrypted.buffer); // temporary variables for working with the IV, encrypted, and\n // decrypted data\n\n let init0;\n let init1;\n let init2;\n let init3;\n let encrypted0;\n let encrypted1;\n let encrypted2;\n let encrypted3; // iteration variable\n\n let wordIx; // pull out the words of the IV to ensure we don't modify the\n // passed-in reference and easier access\n\n init0 = initVector[0];\n init1 = initVector[1];\n init2 = initVector[2];\n init3 = initVector[3]; // decrypt four word sequences, applying cipher-block chaining (CBC)\n // to each decrypted block\n\n for (wordIx = 0; wordIx < encrypted32.length; wordIx += 4) {\n // convert big-endian (network order) words into little-endian\n // (javascript order)\n encrypted0 = ntoh(encrypted32[wordIx]);\n encrypted1 = ntoh(encrypted32[wordIx + 1]);\n encrypted2 = ntoh(encrypted32[wordIx + 2]);\n encrypted3 = ntoh(encrypted32[wordIx + 3]); // decrypt the block\n\n decipher.decrypt(encrypted0, encrypted1, encrypted2, encrypted3, decrypted32, wordIx); // XOR with the IV, and restore network byte-order to obtain the\n // plaintext\n\n decrypted32[wordIx] = ntoh(decrypted32[wordIx] ^ init0);\n decrypted32[wordIx + 1] = ntoh(decrypted32[wordIx + 1] ^ init1);\n decrypted32[wordIx + 2] = ntoh(decrypted32[wordIx + 2] ^ init2);\n decrypted32[wordIx + 3] = ntoh(decrypted32[wordIx + 3] ^ init3); // setup the IV for the next round\n\n init0 = encrypted0;\n init1 = encrypted1;\n init2 = encrypted2;\n init3 = encrypted3;\n }\n return decrypted;\n };\n /**\n * The `Decrypter` class that manages decryption of AES\n * data through `AsyncStream` objects and the `decrypt`\n * function\n *\n * @param {Uint8Array} encrypted the encrypted bytes\n * @param {Uint32Array} key the bytes of the decryption key\n * @param {Uint32Array} initVector the initialization vector (IV) to\n * @param {Function} done the function to run when done\n * @class Decrypter\n */\n\n class Decrypter {\n constructor(encrypted, key, initVector, done) {\n const step = Decrypter.STEP;\n const encrypted32 = new Int32Array(encrypted.buffer);\n const decrypted = new Uint8Array(encrypted.byteLength);\n let i = 0;\n this.asyncStream_ = new AsyncStream(); // split up the encryption job and do the individual chunks asynchronously\n\n this.asyncStream_.push(this.decryptChunk_(encrypted32.subarray(i, i + step), key, initVector, decrypted));\n for (i = step; i < encrypted32.length; i += step) {\n initVector = new Uint32Array([ntoh(encrypted32[i - 4]), ntoh(encrypted32[i - 3]), ntoh(encrypted32[i - 2]), ntoh(encrypted32[i - 1])]);\n this.asyncStream_.push(this.decryptChunk_(encrypted32.subarray(i, i + step), key, initVector, decrypted));\n } // invoke the done() callback when everything is finished\n\n this.asyncStream_.push(function () {\n // remove pkcs#7 padding from the decrypted bytes\n done(null, unpad(decrypted));\n });\n }\n /**\n * a getter for step the maximum number of bytes to process at one time\n *\n * @return {number} the value of step 32000\n */\n\n static get STEP() {\n // 4 * 8000;\n return 32000;\n }\n /**\n * @private\n */\n\n decryptChunk_(encrypted, key, initVector, decrypted) {\n return function () {\n const bytes = decrypt(encrypted, key, initVector);\n decrypted.set(bytes, encrypted.byteOffset);\n };\n }\n }\n var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n var win;\n if (typeof window !== \"undefined\") {\n win = window;\n } else if (typeof commonjsGlobal !== \"undefined\") {\n win = commonjsGlobal;\n } else if (typeof self !== \"undefined\") {\n win = self;\n } else {\n win = {};\n }\n var window_1 = win;\n var isArrayBufferView = function isArrayBufferView(obj) {\n if (ArrayBuffer.isView === 'function') {\n return ArrayBuffer.isView(obj);\n }\n return obj && obj.buffer instanceof ArrayBuffer;\n };\n var BigInt = window_1.BigInt || Number;\n [BigInt('0x1'), BigInt('0x100'), BigInt('0x10000'), BigInt('0x1000000'), BigInt('0x100000000'), BigInt('0x10000000000'), BigInt('0x1000000000000'), BigInt('0x100000000000000'), BigInt('0x10000000000000000')];\n (function () {\n var a = new Uint16Array([0xFFCC]);\n var b = new Uint8Array(a.buffer, a.byteOffset, a.byteLength);\n if (b[0] === 0xFF) {\n return 'big';\n }\n if (b[0] === 0xCC) {\n return 'little';\n }\n return 'unknown';\n })();\n /**\n * Creates an object for sending to a web worker modifying properties that are TypedArrays\n * into a new object with seperated properties for the buffer, byteOffset, and byteLength.\n *\n * @param {Object} message\n * Object of properties and values to send to the web worker\n * @return {Object}\n * Modified message with TypedArray values expanded\n * @function createTransferableMessage\n */\n\n const createTransferableMessage = function (message) {\n const transferable = {};\n Object.keys(message).forEach(key => {\n const value = message[key];\n if (isArrayBufferView(value)) {\n transferable[key] = {\n bytes: value.buffer,\n byteOffset: value.byteOffset,\n byteLength: value.byteLength\n };\n } else {\n transferable[key] = value;\n }\n });\n return transferable;\n };\n /* global self */\n\n /**\n * Our web worker interface so that things can talk to aes-decrypter\n * that will be running in a web worker. the scope is passed to this by\n * webworkify.\n */\n\n self.onmessage = function (event) {\n const data = event.data;\n const encrypted = new Uint8Array(data.encrypted.bytes, data.encrypted.byteOffset, data.encrypted.byteLength);\n const key = new Uint32Array(data.key.bytes, data.key.byteOffset, data.key.byteLength / 4);\n const iv = new Uint32Array(data.iv.bytes, data.iv.byteOffset, data.iv.byteLength / 4);\n /* eslint-disable no-new, handle-callback-err */\n\n new Decrypter(encrypted, key, iv, function (err, bytes) {\n self.postMessage(createTransferableMessage({\n source: data.source,\n decrypted: bytes\n }), [bytes.buffer]);\n });\n /* eslint-enable */\n };\n}));\n\nvar Decrypter = factory(workerCode);\n/* rollup-plugin-worker-factory end for worker!/home/runner/work/http-streaming/http-streaming/src/decrypter-worker.js */\n\n/**\n * Convert the properties of an HLS track into an audioTrackKind.\n *\n * @private\n */\n\nconst audioTrackKind_ = properties => {\n let kind = properties.default ? 'main' : 'alternative';\n if (properties.characteristics && properties.characteristics.indexOf('public.accessibility.describes-video') >= 0) {\n kind = 'main-desc';\n }\n return kind;\n};\n/**\n * Pause provided segment loader and playlist loader if active\n *\n * @param {SegmentLoader} segmentLoader\n * SegmentLoader to pause\n * @param {Object} mediaType\n * Active media type\n * @function stopLoaders\n */\n\nconst stopLoaders = (segmentLoader, mediaType) => {\n segmentLoader.abort();\n segmentLoader.pause();\n if (mediaType && mediaType.activePlaylistLoader) {\n mediaType.activePlaylistLoader.pause();\n mediaType.activePlaylistLoader = null;\n }\n};\n/**\n * Start loading provided segment loader and playlist loader\n *\n * @param {PlaylistLoader} playlistLoader\n * PlaylistLoader to start loading\n * @param {Object} mediaType\n * Active media type\n * @function startLoaders\n */\n\nconst startLoaders = (playlistLoader, mediaType) => {\n // Segment loader will be started after `loadedmetadata` or `loadedplaylist` from the\n // playlist loader\n mediaType.activePlaylistLoader = playlistLoader;\n playlistLoader.load();\n};\n/**\n * Returns a function to be called when the media group changes. It performs a\n * non-destructive (preserve the buffer) resync of the SegmentLoader. This is because a\n * change of group is merely a rendition switch of the same content at another encoding,\n * rather than a change of content, such as switching audio from English to Spanish.\n *\n * @param {string} type\n * MediaGroup type\n * @param {Object} settings\n * Object containing required information for media groups\n * @return {Function}\n * Handler for a non-destructive resync of SegmentLoader when the active media\n * group changes.\n * @function onGroupChanged\n */\n\nconst onGroupChanged = (type, settings) => () => {\n const {\n segmentLoaders: {\n [type]: segmentLoader,\n main: mainSegmentLoader\n },\n mediaTypes: {\n [type]: mediaType\n }\n } = settings;\n const activeTrack = mediaType.activeTrack();\n const activeGroup = mediaType.getActiveGroup();\n const previousActiveLoader = mediaType.activePlaylistLoader;\n const lastGroup = mediaType.lastGroup_; // the group did not change do nothing\n\n if (activeGroup && lastGroup && activeGroup.id === lastGroup.id) {\n return;\n }\n mediaType.lastGroup_ = activeGroup;\n mediaType.lastTrack_ = activeTrack;\n stopLoaders(segmentLoader, mediaType);\n if (!activeGroup || activeGroup.isMainPlaylist) {\n // there is no group active or active group is a main playlist and won't change\n return;\n }\n if (!activeGroup.playlistLoader) {\n if (previousActiveLoader) {\n // The previous group had a playlist loader but the new active group does not\n // this means we are switching from demuxed to muxed audio. In this case we want to\n // do a destructive reset of the main segment loader and not restart the audio\n // loaders.\n mainSegmentLoader.resetEverything();\n }\n return;\n } // Non-destructive resync\n\n segmentLoader.resyncLoader();\n startLoaders(activeGroup.playlistLoader, mediaType);\n};\nconst onGroupChanging = (type, settings) => () => {\n const {\n segmentLoaders: {\n [type]: segmentLoader\n },\n mediaTypes: {\n [type]: mediaType\n }\n } = settings;\n mediaType.lastGroup_ = null;\n segmentLoader.abort();\n segmentLoader.pause();\n};\n/**\n * Returns a function to be called when the media track changes. It performs a\n * destructive reset of the SegmentLoader to ensure we start loading as close to\n * currentTime as possible.\n *\n * @param {string} type\n * MediaGroup type\n * @param {Object} settings\n * Object containing required information for media groups\n * @return {Function}\n * Handler for a destructive reset of SegmentLoader when the active media\n * track changes.\n * @function onTrackChanged\n */\n\nconst onTrackChanged = (type, settings) => () => {\n const {\n mainPlaylistLoader,\n segmentLoaders: {\n [type]: segmentLoader,\n main: mainSegmentLoader\n },\n mediaTypes: {\n [type]: mediaType\n }\n } = settings;\n const activeTrack = mediaType.activeTrack();\n const activeGroup = mediaType.getActiveGroup();\n const previousActiveLoader = mediaType.activePlaylistLoader;\n const lastTrack = mediaType.lastTrack_; // track did not change, do nothing\n\n if (lastTrack && activeTrack && lastTrack.id === activeTrack.id) {\n return;\n }\n mediaType.lastGroup_ = activeGroup;\n mediaType.lastTrack_ = activeTrack;\n stopLoaders(segmentLoader, mediaType);\n if (!activeGroup) {\n // there is no group active so we do not want to restart loaders\n return;\n }\n if (activeGroup.isMainPlaylist) {\n // track did not change, do nothing\n if (!activeTrack || !lastTrack || activeTrack.id === lastTrack.id) {\n return;\n }\n const pc = settings.vhs.playlistController_;\n const newPlaylist = pc.selectPlaylist(); // media will not change do nothing\n\n if (pc.media() === newPlaylist) {\n return;\n }\n mediaType.logger_(`track change. Switching main audio from ${lastTrack.id} to ${activeTrack.id}`);\n mainPlaylistLoader.pause();\n mainSegmentLoader.resetEverything();\n pc.fastQualityChange_(newPlaylist);\n return;\n }\n if (type === 'AUDIO') {\n if (!activeGroup.playlistLoader) {\n // when switching from demuxed audio/video to muxed audio/video (noted by no\n // playlist loader for the audio group), we want to do a destructive reset of the\n // main segment loader and not restart the audio loaders\n mainSegmentLoader.setAudio(true); // don't have to worry about disabling the audio of the audio segment loader since\n // it should be stopped\n\n mainSegmentLoader.resetEverything();\n return;\n } // although the segment loader is an audio segment loader, call the setAudio\n // function to ensure it is prepared to re-append the init segment (or handle other\n // config changes)\n\n segmentLoader.setAudio(true);\n mainSegmentLoader.setAudio(false);\n }\n if (previousActiveLoader === activeGroup.playlistLoader) {\n // Nothing has actually changed. This can happen because track change events can fire\n // multiple times for a \"single\" change. One for enabling the new active track, and\n // one for disabling the track that was active\n startLoaders(activeGroup.playlistLoader, mediaType);\n return;\n }\n if (segmentLoader.track) {\n // For WebVTT, set the new text track in the segmentloader\n segmentLoader.track(activeTrack);\n } // destructive reset\n\n segmentLoader.resetEverything();\n startLoaders(activeGroup.playlistLoader, mediaType);\n};\nconst onError = {\n /**\n * Returns a function to be called when a SegmentLoader or PlaylistLoader encounters\n * an error.\n *\n * @param {string} type\n * MediaGroup type\n * @param {Object} settings\n * Object containing required information for media groups\n * @return {Function}\n * Error handler. Logs warning (or error if the playlist is excluded) to\n * console and switches back to default audio track.\n * @function onError.AUDIO\n */\n AUDIO: (type, settings) => () => {\n const {\n mediaTypes: {\n [type]: mediaType\n },\n excludePlaylist\n } = settings; // switch back to default audio track\n\n const activeTrack = mediaType.activeTrack();\n const activeGroup = mediaType.activeGroup();\n const id = (activeGroup.filter(group => group.default)[0] || activeGroup[0]).id;\n const defaultTrack = mediaType.tracks[id];\n if (activeTrack === defaultTrack) {\n // Default track encountered an error. All we can do now is exclude the current\n // rendition and hope another will switch audio groups\n excludePlaylist({\n error: {\n message: 'Problem encountered loading the default audio track.'\n }\n });\n return;\n }\n videojs.log.warn('Problem encountered loading the alternate audio track.' + 'Switching back to default.');\n for (const trackId in mediaType.tracks) {\n mediaType.tracks[trackId].enabled = mediaType.tracks[trackId] === defaultTrack;\n }\n mediaType.onTrackChanged();\n },\n /**\n * Returns a function to be called when a SegmentLoader or PlaylistLoader encounters\n * an error.\n *\n * @param {string} type\n * MediaGroup type\n * @param {Object} settings\n * Object containing required information for media groups\n * @return {Function}\n * Error handler. Logs warning to console and disables the active subtitle track\n * @function onError.SUBTITLES\n */\n SUBTITLES: (type, settings) => () => {\n const {\n mediaTypes: {\n [type]: mediaType\n }\n } = settings;\n videojs.log.warn('Problem encountered loading the subtitle track.' + 'Disabling subtitle track.');\n const track = mediaType.activeTrack();\n if (track) {\n track.mode = 'disabled';\n }\n mediaType.onTrackChanged();\n }\n};\nconst setupListeners = {\n /**\n * Setup event listeners for audio playlist loader\n *\n * @param {string} type\n * MediaGroup type\n * @param {PlaylistLoader|null} playlistLoader\n * PlaylistLoader to register listeners on\n * @param {Object} settings\n * Object containing required information for media groups\n * @function setupListeners.AUDIO\n */\n AUDIO: (type, playlistLoader, settings) => {\n if (!playlistLoader) {\n // no playlist loader means audio will be muxed with the video\n return;\n }\n const {\n tech,\n requestOptions,\n segmentLoaders: {\n [type]: segmentLoader\n }\n } = settings;\n playlistLoader.on('loadedmetadata', () => {\n const media = playlistLoader.media();\n segmentLoader.playlist(media, requestOptions); // if the video is already playing, or if this isn't a live video and preload\n // permits, start downloading segments\n\n if (!tech.paused() || media.endList && tech.preload() !== 'none') {\n segmentLoader.load();\n }\n });\n playlistLoader.on('loadedplaylist', () => {\n segmentLoader.playlist(playlistLoader.media(), requestOptions); // If the player isn't paused, ensure that the segment loader is running\n\n if (!tech.paused()) {\n segmentLoader.load();\n }\n });\n playlistLoader.on('error', onError[type](type, settings));\n },\n /**\n * Setup event listeners for subtitle playlist loader\n *\n * @param {string} type\n * MediaGroup type\n * @param {PlaylistLoader|null} playlistLoader\n * PlaylistLoader to register listeners on\n * @param {Object} settings\n * Object containing required information for media groups\n * @function setupListeners.SUBTITLES\n */\n SUBTITLES: (type, playlistLoader, settings) => {\n const {\n tech,\n requestOptions,\n segmentLoaders: {\n [type]: segmentLoader\n },\n mediaTypes: {\n [type]: mediaType\n }\n } = settings;\n playlistLoader.on('loadedmetadata', () => {\n const media = playlistLoader.media();\n segmentLoader.playlist(media, requestOptions);\n segmentLoader.track(mediaType.activeTrack()); // if the video is already playing, or if this isn't a live video and preload\n // permits, start downloading segments\n\n if (!tech.paused() || media.endList && tech.preload() !== 'none') {\n segmentLoader.load();\n }\n });\n playlistLoader.on('loadedplaylist', () => {\n segmentLoader.playlist(playlistLoader.media(), requestOptions); // If the player isn't paused, ensure that the segment loader is running\n\n if (!tech.paused()) {\n segmentLoader.load();\n }\n });\n playlistLoader.on('error', onError[type](type, settings));\n }\n};\nconst initialize = {\n /**\n * Setup PlaylistLoaders and AudioTracks for the audio groups\n *\n * @param {string} type\n * MediaGroup type\n * @param {Object} settings\n * Object containing required information for media groups\n * @function initialize.AUDIO\n */\n 'AUDIO': (type, settings) => {\n const {\n vhs,\n sourceType,\n segmentLoaders: {\n [type]: segmentLoader\n },\n requestOptions,\n main: {\n mediaGroups\n },\n mediaTypes: {\n [type]: {\n groups,\n tracks,\n logger_\n }\n },\n mainPlaylistLoader\n } = settings;\n const audioOnlyMain = isAudioOnly(mainPlaylistLoader.main); // force a default if we have none\n\n if (!mediaGroups[type] || Object.keys(mediaGroups[type]).length === 0) {\n mediaGroups[type] = {\n main: {\n default: {\n default: true\n }\n }\n };\n if (audioOnlyMain) {\n mediaGroups[type].main.default.playlists = mainPlaylistLoader.main.playlists;\n }\n }\n for (const groupId in mediaGroups[type]) {\n if (!groups[groupId]) {\n groups[groupId] = [];\n }\n for (const variantLabel in mediaGroups[type][groupId]) {\n let properties = mediaGroups[type][groupId][variantLabel];\n let playlistLoader;\n if (audioOnlyMain) {\n logger_(`AUDIO group '${groupId}' label '${variantLabel}' is a main playlist`);\n properties.isMainPlaylist = true;\n playlistLoader = null; // if vhs-json was provided as the source, and the media playlist was resolved,\n // use the resolved media playlist object\n } else if (sourceType === 'vhs-json' && properties.playlists) {\n playlistLoader = new PlaylistLoader(properties.playlists[0], vhs, requestOptions);\n } else if (properties.resolvedUri) {\n playlistLoader = new PlaylistLoader(properties.resolvedUri, vhs, requestOptions); // TODO: dash isn't the only type with properties.playlists\n // should we even have properties.playlists in this check.\n } else if (properties.playlists && sourceType === 'dash') {\n playlistLoader = new DashPlaylistLoader(properties.playlists[0], vhs, requestOptions, mainPlaylistLoader);\n } else {\n // no resolvedUri means the audio is muxed with the video when using this\n // audio track\n playlistLoader = null;\n }\n properties = merge({\n id: variantLabel,\n playlistLoader\n }, properties);\n setupListeners[type](type, properties.playlistLoader, settings);\n groups[groupId].push(properties);\n if (typeof tracks[variantLabel] === 'undefined') {\n const track = new videojs.AudioTrack({\n id: variantLabel,\n kind: audioTrackKind_(properties),\n enabled: false,\n language: properties.language,\n default: properties.default,\n label: variantLabel\n });\n tracks[variantLabel] = track;\n }\n }\n } // setup single error event handler for the segment loader\n\n segmentLoader.on('error', onError[type](type, settings));\n },\n /**\n * Setup PlaylistLoaders and TextTracks for the subtitle groups\n *\n * @param {string} type\n * MediaGroup type\n * @param {Object} settings\n * Object containing required information for media groups\n * @function initialize.SUBTITLES\n */\n 'SUBTITLES': (type, settings) => {\n const {\n tech,\n vhs,\n sourceType,\n segmentLoaders: {\n [type]: segmentLoader\n },\n requestOptions,\n main: {\n mediaGroups\n },\n mediaTypes: {\n [type]: {\n groups,\n tracks\n }\n },\n mainPlaylistLoader\n } = settings;\n for (const groupId in mediaGroups[type]) {\n if (!groups[groupId]) {\n groups[groupId] = [];\n }\n for (const variantLabel in mediaGroups[type][groupId]) {\n if (!vhs.options_.useForcedSubtitles && mediaGroups[type][groupId][variantLabel].forced) {\n // Subtitle playlists with the forced attribute are not selectable in Safari.\n // According to Apple's HLS Authoring Specification:\n // If content has forced subtitles and regular subtitles in a given language,\n // the regular subtitles track in that language MUST contain both the forced\n // subtitles and the regular subtitles for that language.\n // Because of this requirement and that Safari does not add forced subtitles,\n // forced subtitles are skipped here to maintain consistent experience across\n // all platforms\n continue;\n }\n let properties = mediaGroups[type][groupId][variantLabel];\n let playlistLoader;\n if (sourceType === 'hls') {\n playlistLoader = new PlaylistLoader(properties.resolvedUri, vhs, requestOptions);\n } else if (sourceType === 'dash') {\n const playlists = properties.playlists.filter(p => p.excludeUntil !== Infinity);\n if (!playlists.length) {\n return;\n }\n playlistLoader = new DashPlaylistLoader(properties.playlists[0], vhs, requestOptions, mainPlaylistLoader);\n } else if (sourceType === 'vhs-json') {\n playlistLoader = new PlaylistLoader(\n // if the vhs-json object included the media playlist, use the media playlist\n // as provided, otherwise use the resolved URI to load the playlist\n properties.playlists ? properties.playlists[0] : properties.resolvedUri, vhs, requestOptions);\n }\n properties = merge({\n id: variantLabel,\n playlistLoader\n }, properties);\n setupListeners[type](type, properties.playlistLoader, settings);\n groups[groupId].push(properties);\n if (typeof tracks[variantLabel] === 'undefined') {\n const track = tech.addRemoteTextTrack({\n id: variantLabel,\n kind: 'subtitles',\n default: properties.default && properties.autoselect,\n language: properties.language,\n label: variantLabel\n }, false).track;\n tracks[variantLabel] = track;\n }\n }\n } // setup single error event handler for the segment loader\n\n segmentLoader.on('error', onError[type](type, settings));\n },\n /**\n * Setup TextTracks for the closed-caption groups\n *\n * @param {String} type\n * MediaGroup type\n * @param {Object} settings\n * Object containing required information for media groups\n * @function initialize['CLOSED-CAPTIONS']\n */\n 'CLOSED-CAPTIONS': (type, settings) => {\n const {\n tech,\n main: {\n mediaGroups\n },\n mediaTypes: {\n [type]: {\n groups,\n tracks\n }\n }\n } = settings;\n for (const groupId in mediaGroups[type]) {\n if (!groups[groupId]) {\n groups[groupId] = [];\n }\n for (const variantLabel in mediaGroups[type][groupId]) {\n const properties = mediaGroups[type][groupId][variantLabel]; // Look for either 608 (CCn) or 708 (SERVICEn) caption services\n\n if (!/^(?:CC|SERVICE)/.test(properties.instreamId)) {\n continue;\n }\n const captionServices = tech.options_.vhs && tech.options_.vhs.captionServices || {};\n let newProps = {\n label: variantLabel,\n language: properties.language,\n instreamId: properties.instreamId,\n default: properties.default && properties.autoselect\n };\n if (captionServices[newProps.instreamId]) {\n newProps = merge(newProps, captionServices[newProps.instreamId]);\n }\n if (newProps.default === undefined) {\n delete newProps.default;\n } // No PlaylistLoader is required for Closed-Captions because the captions are\n // embedded within the video stream\n\n groups[groupId].push(merge({\n id: variantLabel\n }, properties));\n if (typeof tracks[variantLabel] === 'undefined') {\n const track = tech.addRemoteTextTrack({\n id: newProps.instreamId,\n kind: 'captions',\n default: newProps.default,\n language: newProps.language,\n label: newProps.label\n }, false).track;\n tracks[variantLabel] = track;\n }\n }\n }\n }\n};\nconst groupMatch = (list, media) => {\n for (let i = 0; i < list.length; i++) {\n if (playlistMatch(media, list[i])) {\n return true;\n }\n if (list[i].playlists && groupMatch(list[i].playlists, media)) {\n return true;\n }\n }\n return false;\n};\n/**\n * Returns a function used to get the active group of the provided type\n *\n * @param {string} type\n * MediaGroup type\n * @param {Object} settings\n * Object containing required information for media groups\n * @return {Function}\n * Function that returns the active media group for the provided type. Takes an\n * optional parameter {TextTrack} track. If no track is provided, a list of all\n * variants in the group, otherwise the variant corresponding to the provided\n * track is returned.\n * @function activeGroup\n */\n\nconst activeGroup = (type, settings) => track => {\n const {\n mainPlaylistLoader,\n mediaTypes: {\n [type]: {\n groups\n }\n }\n } = settings;\n const media = mainPlaylistLoader.media();\n if (!media) {\n return null;\n }\n let variants = null; // set to variants to main media active group\n\n if (media.attributes[type]) {\n variants = groups[media.attributes[type]];\n }\n const groupKeys = Object.keys(groups);\n if (!variants) {\n // find the mainPlaylistLoader media\n // that is in a media group if we are dealing\n // with audio only\n if (type === 'AUDIO' && groupKeys.length > 1 && isAudioOnly(settings.main)) {\n for (let i = 0; i < groupKeys.length; i++) {\n const groupPropertyList = groups[groupKeys[i]];\n if (groupMatch(groupPropertyList, media)) {\n variants = groupPropertyList;\n break;\n }\n } // use the main group if it exists\n } else if (groups.main) {\n variants = groups.main; // only one group, use that one\n } else if (groupKeys.length === 1) {\n variants = groups[groupKeys[0]];\n }\n }\n if (typeof track === 'undefined') {\n return variants;\n }\n if (track === null || !variants) {\n // An active track was specified so a corresponding group is expected. track === null\n // means no track is currently active so there is no corresponding group\n return null;\n }\n return variants.filter(props => props.id === track.id)[0] || null;\n};\nconst activeTrack = {\n /**\n * Returns a function used to get the active track of type provided\n *\n * @param {string} type\n * MediaGroup type\n * @param {Object} settings\n * Object containing required information for media groups\n * @return {Function}\n * Function that returns the active media track for the provided type. Returns\n * null if no track is active\n * @function activeTrack.AUDIO\n */\n AUDIO: (type, settings) => () => {\n const {\n mediaTypes: {\n [type]: {\n tracks\n }\n }\n } = settings;\n for (const id in tracks) {\n if (tracks[id].enabled) {\n return tracks[id];\n }\n }\n return null;\n },\n /**\n * Returns a function used to get the active track of type provided\n *\n * @param {string} type\n * MediaGroup type\n * @param {Object} settings\n * Object containing required information for media groups\n * @return {Function}\n * Function that returns the active media track for the provided type. Returns\n * null if no track is active\n * @function activeTrack.SUBTITLES\n */\n SUBTITLES: (type, settings) => () => {\n const {\n mediaTypes: {\n [type]: {\n tracks\n }\n }\n } = settings;\n for (const id in tracks) {\n if (tracks[id].mode === 'showing' || tracks[id].mode === 'hidden') {\n return tracks[id];\n }\n }\n return null;\n }\n};\nconst getActiveGroup = (type, {\n mediaTypes\n}) => () => {\n const activeTrack_ = mediaTypes[type].activeTrack();\n if (!activeTrack_) {\n return null;\n }\n return mediaTypes[type].activeGroup(activeTrack_);\n};\n/**\n * Setup PlaylistLoaders and Tracks for media groups (Audio, Subtitles,\n * Closed-Captions) specified in the main manifest.\n *\n * @param {Object} settings\n * Object containing required information for setting up the media groups\n * @param {Tech} settings.tech\n * The tech of the player\n * @param {Object} settings.requestOptions\n * XHR request options used by the segment loaders\n * @param {PlaylistLoader} settings.mainPlaylistLoader\n * PlaylistLoader for the main source\n * @param {VhsHandler} settings.vhs\n * VHS SourceHandler\n * @param {Object} settings.main\n * The parsed main manifest\n * @param {Object} settings.mediaTypes\n * Object to store the loaders, tracks, and utility methods for each media type\n * @param {Function} settings.excludePlaylist\n * Excludes the current rendition and forces a rendition switch.\n * @function setupMediaGroups\n */\n\nconst setupMediaGroups = settings => {\n ['AUDIO', 'SUBTITLES', 'CLOSED-CAPTIONS'].forEach(type => {\n initialize[type](type, settings);\n });\n const {\n mediaTypes,\n mainPlaylistLoader,\n tech,\n vhs,\n segmentLoaders: {\n ['AUDIO']: audioSegmentLoader,\n main: mainSegmentLoader\n }\n } = settings; // setup active group and track getters and change event handlers\n\n ['AUDIO', 'SUBTITLES'].forEach(type => {\n mediaTypes[type].activeGroup = activeGroup(type, settings);\n mediaTypes[type].activeTrack = activeTrack[type](type, settings);\n mediaTypes[type].onGroupChanged = onGroupChanged(type, settings);\n mediaTypes[type].onGroupChanging = onGroupChanging(type, settings);\n mediaTypes[type].onTrackChanged = onTrackChanged(type, settings);\n mediaTypes[type].getActiveGroup = getActiveGroup(type, settings);\n }); // DO NOT enable the default subtitle or caption track.\n // DO enable the default audio track\n\n const audioGroup = mediaTypes.AUDIO.activeGroup();\n if (audioGroup) {\n const groupId = (audioGroup.filter(group => group.default)[0] || audioGroup[0]).id;\n mediaTypes.AUDIO.tracks[groupId].enabled = true;\n mediaTypes.AUDIO.onGroupChanged();\n mediaTypes.AUDIO.onTrackChanged();\n const activeAudioGroup = mediaTypes.AUDIO.getActiveGroup(); // a similar check for handling setAudio on each loader is run again each time the\n // track is changed, but needs to be handled here since the track may not be considered\n // changed on the first call to onTrackChanged\n\n if (!activeAudioGroup.playlistLoader) {\n // either audio is muxed with video or the stream is audio only\n mainSegmentLoader.setAudio(true);\n } else {\n // audio is demuxed\n mainSegmentLoader.setAudio(false);\n audioSegmentLoader.setAudio(true);\n }\n }\n mainPlaylistLoader.on('mediachange', () => {\n ['AUDIO', 'SUBTITLES'].forEach(type => mediaTypes[type].onGroupChanged());\n });\n mainPlaylistLoader.on('mediachanging', () => {\n ['AUDIO', 'SUBTITLES'].forEach(type => mediaTypes[type].onGroupChanging());\n }); // custom audio track change event handler for usage event\n\n const onAudioTrackChanged = () => {\n mediaTypes.AUDIO.onTrackChanged();\n tech.trigger({\n type: 'usage',\n name: 'vhs-audio-change'\n });\n };\n tech.audioTracks().addEventListener('change', onAudioTrackChanged);\n tech.remoteTextTracks().addEventListener('change', mediaTypes.SUBTITLES.onTrackChanged);\n vhs.on('dispose', () => {\n tech.audioTracks().removeEventListener('change', onAudioTrackChanged);\n tech.remoteTextTracks().removeEventListener('change', mediaTypes.SUBTITLES.onTrackChanged);\n }); // clear existing audio tracks and add the ones we just created\n\n tech.clearTracks('audio');\n for (const id in mediaTypes.AUDIO.tracks) {\n tech.audioTracks().addTrack(mediaTypes.AUDIO.tracks[id]);\n }\n};\n/**\n * Creates skeleton object used to store the loaders, tracks, and utility methods for each\n * media type\n *\n * @return {Object}\n * Object to store the loaders, tracks, and utility methods for each media type\n * @function createMediaTypes\n */\n\nconst createMediaTypes = () => {\n const mediaTypes = {};\n ['AUDIO', 'SUBTITLES', 'CLOSED-CAPTIONS'].forEach(type => {\n mediaTypes[type] = {\n groups: {},\n tracks: {},\n activePlaylistLoader: null,\n activeGroup: noop,\n activeTrack: noop,\n getActiveGroup: noop,\n onGroupChanged: noop,\n onTrackChanged: noop,\n lastTrack_: null,\n logger_: logger(`MediaGroups[${type}]`)\n };\n });\n return mediaTypes;\n};\n\n/**\n * A utility class for setting properties and maintaining the state of the content steering manifest.\n *\n * Content Steering manifest format:\n * VERSION: number (required) currently only version 1 is supported.\n * TTL: number in seconds (optional) until the next content steering manifest reload.\n * RELOAD-URI: string (optional) uri to fetch the next content steering manifest.\n * SERVICE-LOCATION-PRIORITY or PATHWAY-PRIORITY a non empty array of unique string values.\n * PATHWAY-CLONES: array (optional) (HLS only) pathway clone objects to copy from other playlists.\n */\n\nclass SteeringManifest {\n constructor() {\n this.priority_ = [];\n this.pathwayClones_ = new Map();\n }\n set version(number) {\n // Only version 1 is currently supported for both DASH and HLS.\n if (number === 1) {\n this.version_ = number;\n }\n }\n set ttl(seconds) {\n // TTL = time-to-live, default = 300 seconds.\n this.ttl_ = seconds || 300;\n }\n set reloadUri(uri) {\n if (uri) {\n // reload URI can be relative to the previous reloadUri.\n this.reloadUri_ = resolveUrl(this.reloadUri_, uri);\n }\n }\n set priority(array) {\n // priority must be non-empty and unique values.\n if (array && array.length) {\n this.priority_ = array;\n }\n }\n set pathwayClones(array) {\n // pathwayClones must be non-empty.\n if (array && array.length) {\n this.pathwayClones_ = new Map(array.map(clone => [clone.ID, clone]));\n }\n }\n get version() {\n return this.version_;\n }\n get ttl() {\n return this.ttl_;\n }\n get reloadUri() {\n return this.reloadUri_;\n }\n get priority() {\n return this.priority_;\n }\n get pathwayClones() {\n return this.pathwayClones_;\n }\n}\n/**\n * This class represents a content steering manifest and associated state. See both HLS and DASH specifications.\n * HLS: https://developer.apple.com/streaming/HLSContentSteeringSpecification.pdf and\n * https://datatracker.ietf.org/doc/draft-pantos-hls-rfc8216bis/ section 4.4.6.6.\n * DASH: https://dashif.org/docs/DASH-IF-CTS-00XX-Content-Steering-Community-Review.pdf\n *\n * @param {function} xhr for making a network request from the browser.\n * @param {function} bandwidth for fetching the current bandwidth from the main segment loader.\n */\n\nclass ContentSteeringController extends videojs.EventTarget {\n constructor(xhr, bandwidth) {\n super();\n this.currentPathway = null;\n this.defaultPathway = null;\n this.queryBeforeStart = false;\n this.availablePathways_ = new Set();\n this.steeringManifest = new SteeringManifest();\n this.proxyServerUrl_ = null;\n this.manifestType_ = null;\n this.ttlTimeout_ = null;\n this.request_ = null;\n this.currentPathwayClones = new Map();\n this.nextPathwayClones = new Map();\n this.excludedSteeringManifestURLs = new Set();\n this.logger_ = logger('Content Steering');\n this.xhr_ = xhr;\n this.getBandwidth_ = bandwidth;\n }\n /**\n * Assigns the content steering tag properties to the steering controller\n *\n * @param {string} baseUrl the baseURL from the main manifest for resolving the steering manifest url\n * @param {Object} steeringTag the content steering tag from the main manifest\n */\n\n assignTagProperties(baseUrl, steeringTag) {\n this.manifestType_ = steeringTag.serverUri ? 'HLS' : 'DASH'; // serverUri is HLS serverURL is DASH\n\n const steeringUri = steeringTag.serverUri || steeringTag.serverURL;\n if (!steeringUri) {\n this.logger_(`steering manifest URL is ${steeringUri}, cannot request steering manifest.`);\n this.trigger('error');\n return;\n } // Content steering manifests can be encoded as a data URI. We can decode, parse and return early if that's the case.\n\n if (steeringUri.startsWith('data:')) {\n this.decodeDataUriManifest_(steeringUri.substring(steeringUri.indexOf(',') + 1));\n return;\n } // reloadUri is the resolution of the main manifest URL and steering URL.\n\n this.steeringManifest.reloadUri = resolveUrl(baseUrl, steeringUri); // pathwayId is HLS defaultServiceLocation is DASH\n\n this.defaultPathway = steeringTag.pathwayId || steeringTag.defaultServiceLocation; // currently only DASH supports the following properties on tags.\n\n this.queryBeforeStart = steeringTag.queryBeforeStart;\n this.proxyServerUrl_ = steeringTag.proxyServerURL; // trigger a steering event if we have a pathway from the content steering tag.\n // this tells VHS which segment pathway to start with.\n // If queryBeforeStart is true we need to wait for the steering manifest response.\n\n if (this.defaultPathway && !this.queryBeforeStart) {\n this.trigger('content-steering');\n }\n }\n /**\n * Requests the content steering manifest and parse the response. This should only be called after\n * assignTagProperties was called with a content steering tag.\n *\n * @param {string} initialUri The optional uri to make the request with.\n * If set, the request should be made with exactly what is passed in this variable.\n * This scenario should only happen once on initalization.\n */\n\n requestSteeringManifest(initial) {\n const reloadUri = this.steeringManifest.reloadUri;\n if (!reloadUri) {\n return;\n } // We currently don't support passing MPD query parameters directly to the content steering URL as this requires\n // ExtUrlQueryInfo tag support. See the DASH content steering spec section 8.1.\n // This request URI accounts for manifest URIs that have been excluded.\n\n const uri = initial ? reloadUri : this.getRequestURI(reloadUri); // If there are no valid manifest URIs, we should stop content steering.\n\n if (!uri) {\n this.logger_('No valid content steering manifest URIs. Stopping content steering.');\n this.trigger('error');\n this.dispose();\n return;\n }\n const metadata = {\n contentSteeringInfo: {\n uri\n }\n };\n this.trigger({\n type: 'contentsteeringloadstart',\n metadata\n });\n this.request_ = this.xhr_({\n uri,\n requestType: 'content-steering-manifest'\n }, (error, errorInfo) => {\n if (error) {\n // If the client receives HTTP 410 Gone in response to a manifest request,\n // it MUST NOT issue another request for that URI for the remainder of the\n // playback session. It MAY continue to use the most-recently obtained set\n // of Pathways.\n if (errorInfo.status === 410) {\n this.logger_(`manifest request 410 ${error}.`);\n this.logger_(`There will be no more content steering requests to ${uri} this session.`);\n this.excludedSteeringManifestURLs.add(uri);\n return;\n } // If the client receives HTTP 429 Too Many Requests with a Retry-After\n // header in response to a manifest request, it SHOULD wait until the time\n // specified by the Retry-After header to reissue the request.\n\n if (errorInfo.status === 429) {\n const retrySeconds = errorInfo.responseHeaders['retry-after'];\n this.logger_(`manifest request 429 ${error}.`);\n this.logger_(`content steering will retry in ${retrySeconds} seconds.`);\n this.startTTLTimeout_(parseInt(retrySeconds, 10));\n return;\n } // If the Steering Manifest cannot be loaded and parsed correctly, the\n // client SHOULD continue to use the previous values and attempt to reload\n // it after waiting for the previously-specified TTL (or 5 minutes if\n // none).\n\n this.logger_(`manifest failed to load ${error}.`);\n this.startTTLTimeout_();\n return;\n }\n this.trigger({\n type: 'contentsteeringloadcomplete',\n metadata\n });\n let steeringManifestJson;\n try {\n steeringManifestJson = JSON.parse(this.request_.responseText);\n } catch (parseError) {\n const errorMetadata = {\n errorType: videojs.Error.StreamingContentSteeringParserError,\n error: parseError\n };\n this.trigger({\n type: 'error',\n metadata: errorMetadata\n });\n }\n this.assignSteeringProperties_(steeringManifestJson);\n const parsedMetadata = {\n contentSteeringInfo: metadata.contentSteeringInfo,\n contentSteeringManifest: {\n version: this.steeringManifest.version,\n reloadUri: this.steeringManifest.reloadUri,\n priority: this.steeringManifest.priority\n }\n };\n this.trigger({\n type: 'contentsteeringparsed',\n metadata: parsedMetadata\n });\n this.startTTLTimeout_();\n });\n }\n /**\n * Set the proxy server URL and add the steering manifest url as a URI encoded parameter.\n *\n * @param {string} steeringUrl the steering manifest url\n * @return the steering manifest url to a proxy server with all parameters set\n */\n\n setProxyServerUrl_(steeringUrl) {\n const steeringUrlObject = new window$1.URL(steeringUrl);\n const proxyServerUrlObject = new window$1.URL(this.proxyServerUrl_);\n proxyServerUrlObject.searchParams.set('url', encodeURI(steeringUrlObject.toString()));\n return this.setSteeringParams_(proxyServerUrlObject.toString());\n }\n /**\n * Decodes and parses the data uri encoded steering manifest\n *\n * @param {string} dataUri the data uri to be decoded and parsed.\n */\n\n decodeDataUriManifest_(dataUri) {\n const steeringManifestJson = JSON.parse(window$1.atob(dataUri));\n this.assignSteeringProperties_(steeringManifestJson);\n }\n /**\n * Set the HLS or DASH content steering manifest request query parameters. For example:\n * _HLS_pathway=\"\" and _HLS_throughput=\n * _DASH_pathway and _DASH_throughput\n *\n * @param {string} uri to add content steering server parameters to.\n * @return a new uri as a string with the added steering query parameters.\n */\n\n setSteeringParams_(url) {\n const urlObject = new window$1.URL(url);\n const path = this.getPathway();\n const networkThroughput = this.getBandwidth_();\n if (path) {\n const pathwayKey = `_${this.manifestType_}_pathway`;\n urlObject.searchParams.set(pathwayKey, path);\n }\n if (networkThroughput) {\n const throughputKey = `_${this.manifestType_}_throughput`;\n urlObject.searchParams.set(throughputKey, networkThroughput);\n }\n return urlObject.toString();\n }\n /**\n * Assigns the current steering manifest properties and to the SteeringManifest object\n *\n * @param {Object} steeringJson the raw JSON steering manifest\n */\n\n assignSteeringProperties_(steeringJson) {\n this.steeringManifest.version = steeringJson.VERSION;\n if (!this.steeringManifest.version) {\n this.logger_(`manifest version is ${steeringJson.VERSION}, which is not supported.`);\n this.trigger('error');\n return;\n }\n this.steeringManifest.ttl = steeringJson.TTL;\n this.steeringManifest.reloadUri = steeringJson['RELOAD-URI']; // HLS = PATHWAY-PRIORITY required. DASH = SERVICE-LOCATION-PRIORITY optional\n\n this.steeringManifest.priority = steeringJson['PATHWAY-PRIORITY'] || steeringJson['SERVICE-LOCATION-PRIORITY']; // Pathway clones to be created/updated in HLS.\n // See section 7.2 https://datatracker.ietf.org/doc/draft-pantos-hls-rfc8216bis/\n\n this.steeringManifest.pathwayClones = steeringJson['PATHWAY-CLONES'];\n this.nextPathwayClones = this.steeringManifest.pathwayClones; // 1. apply first pathway from the array.\n // 2. if first pathway doesn't exist in manifest, try next pathway.\n // a. if all pathways are exhausted, ignore the steering manifest priority.\n // 3. if segments fail from an established pathway, try all variants/renditions, then exclude the failed pathway.\n // a. exclude a pathway for a minimum of the last TTL duration. Meaning, from the next steering response,\n // the excluded pathway will be ignored.\n // See excludePathway usage in excludePlaylist().\n // If there are no available pathways, we need to stop content steering.\n\n if (!this.availablePathways_.size) {\n this.logger_('There are no available pathways for content steering. Ending content steering.');\n this.trigger('error');\n this.dispose();\n }\n const chooseNextPathway = pathwaysByPriority => {\n for (const path of pathwaysByPriority) {\n if (this.availablePathways_.has(path)) {\n return path;\n }\n } // If no pathway matches, ignore the manifest and choose the first available.\n\n return [...this.availablePathways_][0];\n };\n const nextPathway = chooseNextPathway(this.steeringManifest.priority);\n if (this.currentPathway !== nextPathway) {\n this.currentPathway = nextPathway;\n this.trigger('content-steering');\n }\n }\n /**\n * Returns the pathway to use for steering decisions\n *\n * @return {string} returns the current pathway or the default\n */\n\n getPathway() {\n return this.currentPathway || this.defaultPathway;\n }\n /**\n * Chooses the manifest request URI based on proxy URIs and server URLs.\n * Also accounts for exclusion on certain manifest URIs.\n *\n * @param {string} reloadUri the base uri before parameters\n *\n * @return {string} the final URI for the request to the manifest server.\n */\n\n getRequestURI(reloadUri) {\n if (!reloadUri) {\n return null;\n }\n const isExcluded = uri => this.excludedSteeringManifestURLs.has(uri);\n if (this.proxyServerUrl_) {\n const proxyURI = this.setProxyServerUrl_(reloadUri);\n if (!isExcluded(proxyURI)) {\n return proxyURI;\n }\n }\n const steeringURI = this.setSteeringParams_(reloadUri);\n if (!isExcluded(steeringURI)) {\n return steeringURI;\n } // Return nothing if all valid manifest URIs are excluded.\n\n return null;\n }\n /**\n * Start the timeout for re-requesting the steering manifest at the TTL interval.\n *\n * @param {number} ttl time in seconds of the timeout. Defaults to the\n * ttl interval in the steering manifest\n */\n\n startTTLTimeout_(ttl = this.steeringManifest.ttl) {\n // 300 (5 minutes) is the default value.\n const ttlMS = ttl * 1000;\n this.ttlTimeout_ = window$1.setTimeout(() => {\n this.requestSteeringManifest();\n }, ttlMS);\n }\n /**\n * Clear the TTL timeout if necessary.\n */\n\n clearTTLTimeout_() {\n window$1.clearTimeout(this.ttlTimeout_);\n this.ttlTimeout_ = null;\n }\n /**\n * aborts any current steering xhr and sets the current request object to null\n */\n\n abort() {\n if (this.request_) {\n this.request_.abort();\n }\n this.request_ = null;\n }\n /**\n * aborts steering requests clears the ttl timeout and resets all properties.\n */\n\n dispose() {\n this.off('content-steering');\n this.off('error');\n this.abort();\n this.clearTTLTimeout_();\n this.currentPathway = null;\n this.defaultPathway = null;\n this.queryBeforeStart = null;\n this.proxyServerUrl_ = null;\n this.manifestType_ = null;\n this.ttlTimeout_ = null;\n this.request_ = null;\n this.excludedSteeringManifestURLs = new Set();\n this.availablePathways_ = new Set();\n this.steeringManifest = new SteeringManifest();\n }\n /**\n * adds a pathway to the available pathways set\n *\n * @param {string} pathway the pathway string to add\n */\n\n addAvailablePathway(pathway) {\n if (pathway) {\n this.availablePathways_.add(pathway);\n }\n }\n /**\n * Clears all pathways from the available pathways set\n */\n\n clearAvailablePathways() {\n this.availablePathways_.clear();\n }\n /**\n * Removes a pathway from the available pathways set.\n */\n\n excludePathway(pathway) {\n return this.availablePathways_.delete(pathway);\n }\n /**\n * Checks the refreshed DASH manifest content steering tag for changes.\n *\n * @param {string} baseURL new steering tag on DASH manifest refresh\n * @param {Object} newTag the new tag to check for changes\n * @return a true or false whether the new tag has different values\n */\n\n didDASHTagChange(baseURL, newTag) {\n return !newTag && this.steeringManifest.reloadUri || newTag && (resolveUrl(baseURL, newTag.serverURL) !== this.steeringManifest.reloadUri || newTag.defaultServiceLocation !== this.defaultPathway || newTag.queryBeforeStart !== this.queryBeforeStart || newTag.proxyServerURL !== this.proxyServerUrl_);\n }\n getAvailablePathways() {\n return this.availablePathways_;\n }\n}\nconst ABORT_EARLY_EXCLUSION_SECONDS = 10;\nlet Vhs$1; // SegmentLoader stats that need to have each loader's\n// values summed to calculate the final value\n\nconst loaderStats = ['mediaRequests', 'mediaRequestsAborted', 'mediaRequestsTimedout', 'mediaRequestsErrored', 'mediaTransferDuration', 'mediaBytesTransferred', 'mediaAppends'];\nconst sumLoaderStat = function (stat) {\n return this.audioSegmentLoader_[stat] + this.mainSegmentLoader_[stat];\n};\nconst shouldSwitchToMedia = function ({\n currentPlaylist,\n buffered,\n currentTime,\n nextPlaylist,\n bufferLowWaterLine,\n bufferHighWaterLine,\n duration,\n bufferBasedABR,\n log\n}) {\n // we have no other playlist to switch to\n if (!nextPlaylist) {\n videojs.log.warn('We received no playlist to switch to. Please check your stream.');\n return false;\n }\n const sharedLogLine = `allowing switch ${currentPlaylist && currentPlaylist.id || 'null'} -> ${nextPlaylist.id}`;\n if (!currentPlaylist) {\n log(`${sharedLogLine} as current playlist is not set`);\n return true;\n } // no need to switch if playlist is the same\n\n if (nextPlaylist.id === currentPlaylist.id) {\n return false;\n } // determine if current time is in a buffered range.\n\n const isBuffered = Boolean(findRange(buffered, currentTime).length); // If the playlist is live, then we want to not take low water line into account.\n // This is because in LIVE, the player plays 3 segments from the end of the\n // playlist, and if `BUFFER_LOW_WATER_LINE` is greater than the duration availble\n // in those segments, a viewer will never experience a rendition upswitch.\n\n if (!currentPlaylist.endList) {\n // For LLHLS live streams, don't switch renditions before playback has started, as it almost\n // doubles the time to first playback.\n if (!isBuffered && typeof currentPlaylist.partTargetDuration === 'number') {\n log(`not ${sharedLogLine} as current playlist is live llhls, but currentTime isn't in buffered.`);\n return false;\n }\n log(`${sharedLogLine} as current playlist is live`);\n return true;\n }\n const forwardBuffer = timeAheadOf(buffered, currentTime);\n const maxBufferLowWaterLine = bufferBasedABR ? Config.EXPERIMENTAL_MAX_BUFFER_LOW_WATER_LINE : Config.MAX_BUFFER_LOW_WATER_LINE; // For the same reason as LIVE, we ignore the low water line when the VOD\n // duration is below the max potential low water line\n\n if (duration < maxBufferLowWaterLine) {\n log(`${sharedLogLine} as duration < max low water line (${duration} < ${maxBufferLowWaterLine})`);\n return true;\n }\n const nextBandwidth = nextPlaylist.attributes.BANDWIDTH;\n const currBandwidth = currentPlaylist.attributes.BANDWIDTH; // when switching down, if our buffer is lower than the high water line,\n // we can switch down\n\n if (nextBandwidth < currBandwidth && (!bufferBasedABR || forwardBuffer < bufferHighWaterLine)) {\n let logLine = `${sharedLogLine} as next bandwidth < current bandwidth (${nextBandwidth} < ${currBandwidth})`;\n if (bufferBasedABR) {\n logLine += ` and forwardBuffer < bufferHighWaterLine (${forwardBuffer} < ${bufferHighWaterLine})`;\n }\n log(logLine);\n return true;\n } // and if our buffer is higher than the low water line,\n // we can switch up\n\n if ((!bufferBasedABR || nextBandwidth > currBandwidth) && forwardBuffer >= bufferLowWaterLine) {\n let logLine = `${sharedLogLine} as forwardBuffer >= bufferLowWaterLine (${forwardBuffer} >= ${bufferLowWaterLine})`;\n if (bufferBasedABR) {\n logLine += ` and next bandwidth > current bandwidth (${nextBandwidth} > ${currBandwidth})`;\n }\n log(logLine);\n return true;\n }\n log(`not ${sharedLogLine} as no switching criteria met`);\n return false;\n};\n/**\n * the main playlist controller controller all interactons\n * between playlists and segmentloaders. At this time this mainly\n * involves a main playlist and a series of audio playlists\n * if they are available\n *\n * @class PlaylistController\n * @extends videojs.EventTarget\n */\n\nclass PlaylistController extends videojs.EventTarget {\n constructor(options) {\n super();\n const {\n src,\n withCredentials,\n tech,\n bandwidth,\n externVhs,\n useCueTags,\n playlistExclusionDuration,\n enableLowInitialPlaylist,\n sourceType,\n cacheEncryptionKeys,\n bufferBasedABR,\n leastPixelDiffSelector,\n captionServices\n } = options;\n if (!src) {\n throw new Error('A non-empty playlist URL or JSON manifest string is required');\n }\n let {\n maxPlaylistRetries\n } = options;\n if (maxPlaylistRetries === null || typeof maxPlaylistRetries === 'undefined') {\n maxPlaylistRetries = Infinity;\n }\n Vhs$1 = externVhs;\n this.bufferBasedABR = Boolean(bufferBasedABR);\n this.leastPixelDiffSelector = Boolean(leastPixelDiffSelector);\n this.withCredentials = withCredentials;\n this.tech_ = tech;\n this.vhs_ = tech.vhs;\n this.player_ = options.player_;\n this.sourceType_ = sourceType;\n this.useCueTags_ = useCueTags;\n this.playlistExclusionDuration = playlistExclusionDuration;\n this.maxPlaylistRetries = maxPlaylistRetries;\n this.enableLowInitialPlaylist = enableLowInitialPlaylist;\n if (this.useCueTags_) {\n this.cueTagsTrack_ = this.tech_.addTextTrack('metadata', 'ad-cues');\n this.cueTagsTrack_.inBandMetadataTrackDispatchType = '';\n }\n this.requestOptions_ = {\n withCredentials,\n maxPlaylistRetries,\n timeout: null\n };\n this.on('error', this.pauseLoading);\n this.mediaTypes_ = createMediaTypes();\n this.mediaSource = new window$1.MediaSource();\n this.handleDurationChange_ = this.handleDurationChange_.bind(this);\n this.handleSourceOpen_ = this.handleSourceOpen_.bind(this);\n this.handleSourceEnded_ = this.handleSourceEnded_.bind(this);\n this.mediaSource.addEventListener('durationchange', this.handleDurationChange_); // load the media source into the player\n\n this.mediaSource.addEventListener('sourceopen', this.handleSourceOpen_);\n this.mediaSource.addEventListener('sourceended', this.handleSourceEnded_); // we don't have to handle sourceclose since dispose will handle termination of\n // everything, and the MediaSource should not be detached without a proper disposal\n\n this.seekable_ = createTimeRanges();\n this.hasPlayed_ = false;\n this.syncController_ = new SyncController(options);\n this.segmentMetadataTrack_ = tech.addRemoteTextTrack({\n kind: 'metadata',\n label: 'segment-metadata'\n }, false).track;\n this.decrypter_ = new Decrypter();\n this.sourceUpdater_ = new SourceUpdater(this.mediaSource);\n this.inbandTextTracks_ = {};\n this.timelineChangeController_ = new TimelineChangeController();\n this.keyStatusMap_ = new Map();\n const segmentLoaderSettings = {\n vhs: this.vhs_,\n parse708captions: options.parse708captions,\n useDtsForTimestampOffset: options.useDtsForTimestampOffset,\n captionServices,\n mediaSource: this.mediaSource,\n currentTime: this.tech_.currentTime.bind(this.tech_),\n seekable: () => this.seekable(),\n seeking: () => this.tech_.seeking(),\n duration: () => this.duration(),\n hasPlayed: () => this.hasPlayed_,\n goalBufferLength: () => this.goalBufferLength(),\n bandwidth,\n syncController: this.syncController_,\n decrypter: this.decrypter_,\n sourceType: this.sourceType_,\n inbandTextTracks: this.inbandTextTracks_,\n cacheEncryptionKeys,\n sourceUpdater: this.sourceUpdater_,\n timelineChangeController: this.timelineChangeController_,\n exactManifestTimings: options.exactManifestTimings,\n addMetadataToTextTrack: this.addMetadataToTextTrack.bind(this)\n }; // The source type check not only determines whether a special DASH playlist loader\n // should be used, but also covers the case where the provided src is a vhs-json\n // manifest object (instead of a URL). In the case of vhs-json, the default\n // PlaylistLoader should be used.\n\n this.mainPlaylistLoader_ = this.sourceType_ === 'dash' ? new DashPlaylistLoader(src, this.vhs_, merge(this.requestOptions_, {\n addMetadataToTextTrack: this.addMetadataToTextTrack.bind(this)\n })) : new PlaylistLoader(src, this.vhs_, merge(this.requestOptions_, {\n addDateRangesToTextTrack: this.addDateRangesToTextTrack_.bind(this)\n }));\n this.setupMainPlaylistLoaderListeners_(); // setup segment loaders\n // combined audio/video or just video when alternate audio track is selected\n\n this.mainSegmentLoader_ = new SegmentLoader(merge(segmentLoaderSettings, {\n segmentMetadataTrack: this.segmentMetadataTrack_,\n loaderType: 'main'\n }), options); // alternate audio track\n\n this.audioSegmentLoader_ = new SegmentLoader(merge(segmentLoaderSettings, {\n loaderType: 'audio'\n }), options);\n this.subtitleSegmentLoader_ = new VTTSegmentLoader(merge(segmentLoaderSettings, {\n loaderType: 'vtt',\n featuresNativeTextTracks: this.tech_.featuresNativeTextTracks,\n loadVttJs: () => new Promise((resolve, reject) => {\n function onLoad() {\n tech.off('vttjserror', onError);\n resolve();\n }\n function onError() {\n tech.off('vttjsloaded', onLoad);\n reject();\n }\n tech.one('vttjsloaded', onLoad);\n tech.one('vttjserror', onError); // safe to call multiple times, script will be loaded only once:\n\n tech.addWebVttScript_();\n })\n }), options);\n const getBandwidth = () => {\n return this.mainSegmentLoader_.bandwidth;\n };\n this.contentSteeringController_ = new ContentSteeringController(this.vhs_.xhr, getBandwidth);\n this.setupSegmentLoaderListeners_();\n if (this.bufferBasedABR) {\n this.mainPlaylistLoader_.one('loadedplaylist', () => this.startABRTimer_());\n this.tech_.on('pause', () => this.stopABRTimer_());\n this.tech_.on('play', () => this.startABRTimer_());\n } // Create SegmentLoader stat-getters\n // mediaRequests_\n // mediaRequestsAborted_\n // mediaRequestsTimedout_\n // mediaRequestsErrored_\n // mediaTransferDuration_\n // mediaBytesTransferred_\n // mediaAppends_\n\n loaderStats.forEach(stat => {\n this[stat + '_'] = sumLoaderStat.bind(this, stat);\n });\n this.logger_ = logger('pc');\n this.triggeredFmp4Usage = false;\n if (this.tech_.preload() === 'none') {\n this.loadOnPlay_ = () => {\n this.loadOnPlay_ = null;\n this.mainPlaylistLoader_.load();\n };\n this.tech_.one('play', this.loadOnPlay_);\n } else {\n this.mainPlaylistLoader_.load();\n }\n this.timeToLoadedData__ = -1;\n this.mainAppendsToLoadedData__ = -1;\n this.audioAppendsToLoadedData__ = -1;\n const event = this.tech_.preload() === 'none' ? 'play' : 'loadstart'; // start the first frame timer on loadstart or play (for preload none)\n\n this.tech_.one(event, () => {\n const timeToLoadedDataStart = Date.now();\n this.tech_.one('loadeddata', () => {\n this.timeToLoadedData__ = Date.now() - timeToLoadedDataStart;\n this.mainAppendsToLoadedData__ = this.mainSegmentLoader_.mediaAppends;\n this.audioAppendsToLoadedData__ = this.audioSegmentLoader_.mediaAppends;\n });\n });\n }\n mainAppendsToLoadedData_() {\n return this.mainAppendsToLoadedData__;\n }\n audioAppendsToLoadedData_() {\n return this.audioAppendsToLoadedData__;\n }\n appendsToLoadedData_() {\n const main = this.mainAppendsToLoadedData_();\n const audio = this.audioAppendsToLoadedData_();\n if (main === -1 || audio === -1) {\n return -1;\n }\n return main + audio;\n }\n timeToLoadedData_() {\n return this.timeToLoadedData__;\n }\n /**\n * Run selectPlaylist and switch to the new playlist if we should\n *\n * @param {string} [reason=abr] a reason for why the ABR check is made\n * @private\n */\n\n checkABR_(reason = 'abr') {\n const nextPlaylist = this.selectPlaylist();\n if (nextPlaylist && this.shouldSwitchToMedia_(nextPlaylist)) {\n this.switchMedia_(nextPlaylist, reason);\n }\n }\n switchMedia_(playlist, cause, delay) {\n const oldMedia = this.media();\n const oldId = oldMedia && (oldMedia.id || oldMedia.uri);\n const newId = playlist && (playlist.id || playlist.uri);\n if (oldId && oldId !== newId) {\n this.logger_(`switch media ${oldId} -> ${newId} from ${cause}`);\n const metadata = {\n renditionInfo: {\n id: newId,\n bandwidth: playlist.attributes.BANDWIDTH,\n resolution: playlist.attributes.RESOLUTION,\n codecs: playlist.attributes.CODECS\n },\n cause\n };\n this.trigger({\n type: 'renditionselected',\n metadata\n });\n this.tech_.trigger({\n type: 'usage',\n name: `vhs-rendition-change-${cause}`\n });\n }\n this.mainPlaylistLoader_.media(playlist, delay);\n }\n /**\n * A function that ensures we switch our playlists inside of `mediaTypes`\n * to match the current `serviceLocation` provided by the contentSteering controller.\n * We want to check media types of `AUDIO`, `SUBTITLES`, and `CLOSED-CAPTIONS`.\n *\n * This should only be called on a DASH playback scenario while using content steering.\n * This is necessary due to differences in how media in HLS manifests are generally tied to\n * a video playlist, where in DASH that is not always the case.\n */\n\n switchMediaForDASHContentSteering_() {\n ['AUDIO', 'SUBTITLES', 'CLOSED-CAPTIONS'].forEach(type => {\n const mediaType = this.mediaTypes_[type];\n const activeGroup = mediaType ? mediaType.activeGroup() : null;\n const pathway = this.contentSteeringController_.getPathway();\n if (activeGroup && pathway) {\n // activeGroup can be an array or a single group\n const mediaPlaylists = activeGroup.length ? activeGroup[0].playlists : activeGroup.playlists;\n const dashMediaPlaylists = mediaPlaylists.filter(p => p.attributes.serviceLocation === pathway); // Switch the current active playlist to the correct CDN\n\n if (dashMediaPlaylists.length) {\n this.mediaTypes_[type].activePlaylistLoader.media(dashMediaPlaylists[0]);\n }\n }\n });\n }\n /**\n * Start a timer that periodically calls checkABR_\n *\n * @private\n */\n\n startABRTimer_() {\n this.stopABRTimer_();\n this.abrTimer_ = window$1.setInterval(() => this.checkABR_(), 250);\n }\n /**\n * Stop the timer that periodically calls checkABR_\n *\n * @private\n */\n\n stopABRTimer_() {\n // if we're scrubbing, we don't need to pause.\n // This getter will be added to Video.js in version 7.11.\n if (this.tech_.scrubbing && this.tech_.scrubbing()) {\n return;\n }\n window$1.clearInterval(this.abrTimer_);\n this.abrTimer_ = null;\n }\n /**\n * Get a list of playlists for the currently selected audio playlist\n *\n * @return {Array} the array of audio playlists\n */\n\n getAudioTrackPlaylists_() {\n const main = this.main();\n const defaultPlaylists = main && main.playlists || []; // if we don't have any audio groups then we can only\n // assume that the audio tracks are contained in main\n // playlist array, use that or an empty array.\n\n if (!main || !main.mediaGroups || !main.mediaGroups.AUDIO) {\n return defaultPlaylists;\n }\n const AUDIO = main.mediaGroups.AUDIO;\n const groupKeys = Object.keys(AUDIO);\n let track; // get the current active track\n\n if (Object.keys(this.mediaTypes_.AUDIO.groups).length) {\n track = this.mediaTypes_.AUDIO.activeTrack(); // or get the default track from main if mediaTypes_ isn't setup yet\n } else {\n // default group is `main` or just the first group.\n const defaultGroup = AUDIO.main || groupKeys.length && AUDIO[groupKeys[0]];\n for (const label in defaultGroup) {\n if (defaultGroup[label].default) {\n track = {\n label\n };\n break;\n }\n }\n } // no active track no playlists.\n\n if (!track) {\n return defaultPlaylists;\n }\n const playlists = []; // get all of the playlists that are possible for the\n // active track.\n\n for (const group in AUDIO) {\n if (AUDIO[group][track.label]) {\n const properties = AUDIO[group][track.label];\n if (properties.playlists && properties.playlists.length) {\n playlists.push.apply(playlists, properties.playlists);\n } else if (properties.uri) {\n playlists.push(properties);\n } else if (main.playlists.length) {\n // if an audio group does not have a uri\n // see if we have main playlists that use it as a group.\n // if we do then add those to the playlists list.\n for (let i = 0; i < main.playlists.length; i++) {\n const playlist = main.playlists[i];\n if (playlist.attributes && playlist.attributes.AUDIO && playlist.attributes.AUDIO === group) {\n playlists.push(playlist);\n }\n }\n }\n }\n }\n if (!playlists.length) {\n return defaultPlaylists;\n }\n return playlists;\n }\n /**\n * Register event handlers on the main playlist loader. A helper\n * function for construction time.\n *\n * @private\n */\n\n setupMainPlaylistLoaderListeners_() {\n this.mainPlaylistLoader_.on('loadedmetadata', () => {\n const media = this.mainPlaylistLoader_.media();\n const requestTimeout = media.targetDuration * 1.5 * 1000; // If we don't have any more available playlists, we don't want to\n // timeout the request.\n\n if (isLowestEnabledRendition(this.mainPlaylistLoader_.main, this.mainPlaylistLoader_.media())) {\n this.requestOptions_.timeout = 0;\n } else {\n this.requestOptions_.timeout = requestTimeout;\n } // if this isn't a live video and preload permits, start\n // downloading segments\n\n if (media.endList && this.tech_.preload() !== 'none') {\n this.mainSegmentLoader_.playlist(media, this.requestOptions_);\n this.mainSegmentLoader_.load();\n }\n setupMediaGroups({\n sourceType: this.sourceType_,\n segmentLoaders: {\n AUDIO: this.audioSegmentLoader_,\n SUBTITLES: this.subtitleSegmentLoader_,\n main: this.mainSegmentLoader_\n },\n tech: this.tech_,\n requestOptions: this.requestOptions_,\n mainPlaylistLoader: this.mainPlaylistLoader_,\n vhs: this.vhs_,\n main: this.main(),\n mediaTypes: this.mediaTypes_,\n excludePlaylist: this.excludePlaylist.bind(this)\n });\n this.triggerPresenceUsage_(this.main(), media);\n this.setupFirstPlay();\n if (!this.mediaTypes_.AUDIO.activePlaylistLoader || this.mediaTypes_.AUDIO.activePlaylistLoader.media()) {\n this.trigger('selectedinitialmedia');\n } else {\n // We must wait for the active audio playlist loader to\n // finish setting up before triggering this event so the\n // representations API and EME setup is correct\n this.mediaTypes_.AUDIO.activePlaylistLoader.one('loadedmetadata', () => {\n this.trigger('selectedinitialmedia');\n });\n }\n });\n this.mainPlaylistLoader_.on('loadedplaylist', () => {\n if (this.loadOnPlay_) {\n this.tech_.off('play', this.loadOnPlay_);\n }\n let updatedPlaylist = this.mainPlaylistLoader_.media();\n if (!updatedPlaylist) {\n // Add content steering listeners on first load and init.\n this.attachContentSteeringListeners_();\n this.initContentSteeringController_(); // exclude any variants that are not supported by the browser before selecting\n // an initial media as the playlist selectors do not consider browser support\n\n this.excludeUnsupportedVariants_();\n let selectedMedia;\n if (this.enableLowInitialPlaylist) {\n selectedMedia = this.selectInitialPlaylist();\n }\n if (!selectedMedia) {\n selectedMedia = this.selectPlaylist();\n }\n if (!selectedMedia || !this.shouldSwitchToMedia_(selectedMedia)) {\n return;\n }\n this.initialMedia_ = selectedMedia;\n this.switchMedia_(this.initialMedia_, 'initial'); // Under the standard case where a source URL is provided, loadedplaylist will\n // fire again since the playlist will be requested. In the case of vhs-json\n // (where the manifest object is provided as the source), when the media\n // playlist's `segments` list is already available, a media playlist won't be\n // requested, and loadedplaylist won't fire again, so the playlist handler must be\n // called on its own here.\n\n const haveJsonSource = this.sourceType_ === 'vhs-json' && this.initialMedia_.segments;\n if (!haveJsonSource) {\n return;\n }\n updatedPlaylist = this.initialMedia_;\n }\n this.handleUpdatedMediaPlaylist(updatedPlaylist);\n });\n this.mainPlaylistLoader_.on('error', () => {\n const error = this.mainPlaylistLoader_.error;\n this.excludePlaylist({\n playlistToExclude: error.playlist,\n error\n });\n });\n this.mainPlaylistLoader_.on('mediachanging', () => {\n this.mainSegmentLoader_.abort();\n this.mainSegmentLoader_.pause();\n });\n this.mainPlaylistLoader_.on('mediachange', () => {\n const media = this.mainPlaylistLoader_.media();\n const requestTimeout = media.targetDuration * 1.5 * 1000; // If we don't have any more available playlists, we don't want to\n // timeout the request.\n\n if (isLowestEnabledRendition(this.mainPlaylistLoader_.main, this.mainPlaylistLoader_.media())) {\n this.requestOptions_.timeout = 0;\n } else {\n this.requestOptions_.timeout = requestTimeout;\n }\n if (this.sourceType_ === 'dash') {\n // we don't want to re-request the same hls playlist right after it was changed\n this.mainPlaylistLoader_.load();\n } // TODO: Create a new event on the PlaylistLoader that signals\n // that the segments have changed in some way and use that to\n // update the SegmentLoader instead of doing it twice here and\n // on `loadedplaylist`\n\n this.mainSegmentLoader_.pause();\n this.mainSegmentLoader_.playlist(media, this.requestOptions_);\n if (this.waitingForFastQualityPlaylistReceived_) {\n this.runFastQualitySwitch_();\n } else {\n this.mainSegmentLoader_.load();\n }\n this.tech_.trigger({\n type: 'mediachange',\n bubbles: true\n });\n });\n this.mainPlaylistLoader_.on('playlistunchanged', () => {\n const updatedPlaylist = this.mainPlaylistLoader_.media(); // ignore unchanged playlists that have already been\n // excluded for not-changing. We likely just have a really slowly updating\n // playlist.\n\n if (updatedPlaylist.lastExcludeReason_ === 'playlist-unchanged') {\n return;\n }\n const playlistOutdated = this.stuckAtPlaylistEnd_(updatedPlaylist);\n if (playlistOutdated) {\n // Playlist has stopped updating and we're stuck at its end. Try to\n // exclude it and switch to another playlist in the hope that that\n // one is updating (and give the player a chance to re-adjust to the\n // safe live point).\n this.excludePlaylist({\n error: {\n message: 'Playlist no longer updating.',\n reason: 'playlist-unchanged'\n }\n }); // useful for monitoring QoS\n\n this.tech_.trigger('playliststuck');\n }\n });\n this.mainPlaylistLoader_.on('renditiondisabled', () => {\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-rendition-disabled'\n });\n });\n this.mainPlaylistLoader_.on('renditionenabled', () => {\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-rendition-enabled'\n });\n });\n const playlistLoaderEvents = ['manifestrequeststart', 'manifestrequestcomplete', 'manifestparsestart', 'manifestparsecomplete', 'playlistrequeststart', 'playlistrequestcomplete', 'playlistparsestart', 'playlistparsecomplete', 'renditiondisabled', 'renditionenabled'];\n playlistLoaderEvents.forEach(eventName => {\n this.mainPlaylistLoader_.on(eventName, metadata => {\n // trigger directly on the player to ensure early events are fired.\n this.player_.trigger(_extends({}, metadata));\n });\n });\n }\n /**\n * Given an updated media playlist (whether it was loaded for the first time, or\n * refreshed for live playlists), update any relevant properties and state to reflect\n * changes in the media that should be accounted for (e.g., cues and duration).\n *\n * @param {Object} updatedPlaylist the updated media playlist object\n *\n * @private\n */\n\n handleUpdatedMediaPlaylist(updatedPlaylist) {\n if (this.useCueTags_) {\n this.updateAdCues_(updatedPlaylist);\n } // TODO: Create a new event on the PlaylistLoader that signals\n // that the segments have changed in some way and use that to\n // update the SegmentLoader instead of doing it twice here and\n // on `mediachange`\n\n this.mainSegmentLoader_.pause();\n this.mainSegmentLoader_.playlist(updatedPlaylist, this.requestOptions_);\n if (this.waitingForFastQualityPlaylistReceived_) {\n this.runFastQualitySwitch_();\n }\n this.updateDuration(!updatedPlaylist.endList); // If the player isn't paused, ensure that the segment loader is running,\n // as it is possible that it was temporarily stopped while waiting for\n // a playlist (e.g., in case the playlist errored and we re-requested it).\n\n if (!this.tech_.paused()) {\n this.mainSegmentLoader_.load();\n if (this.audioSegmentLoader_) {\n this.audioSegmentLoader_.load();\n }\n }\n }\n /**\n * A helper function for triggerring presence usage events once per source\n *\n * @private\n */\n\n triggerPresenceUsage_(main, media) {\n const mediaGroups = main.mediaGroups || {};\n let defaultDemuxed = true;\n const audioGroupKeys = Object.keys(mediaGroups.AUDIO);\n for (const mediaGroup in mediaGroups.AUDIO) {\n for (const label in mediaGroups.AUDIO[mediaGroup]) {\n const properties = mediaGroups.AUDIO[mediaGroup][label];\n if (!properties.uri) {\n defaultDemuxed = false;\n }\n }\n }\n if (defaultDemuxed) {\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-demuxed'\n });\n }\n if (Object.keys(mediaGroups.SUBTITLES).length) {\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-webvtt'\n });\n }\n if (Vhs$1.Playlist.isAes(media)) {\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-aes'\n });\n }\n if (audioGroupKeys.length && Object.keys(mediaGroups.AUDIO[audioGroupKeys[0]]).length > 1) {\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-alternate-audio'\n });\n }\n if (this.useCueTags_) {\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-playlist-cue-tags'\n });\n }\n }\n shouldSwitchToMedia_(nextPlaylist) {\n const currentPlaylist = this.mainPlaylistLoader_.media() || this.mainPlaylistLoader_.pendingMedia_;\n const currentTime = this.tech_.currentTime();\n const bufferLowWaterLine = this.bufferLowWaterLine();\n const bufferHighWaterLine = this.bufferHighWaterLine();\n const buffered = this.tech_.buffered();\n return shouldSwitchToMedia({\n buffered,\n currentTime,\n currentPlaylist,\n nextPlaylist,\n bufferLowWaterLine,\n bufferHighWaterLine,\n duration: this.duration(),\n bufferBasedABR: this.bufferBasedABR,\n log: this.logger_\n });\n }\n /**\n * Register event handlers on the segment loaders. A helper function\n * for construction time.\n *\n * @private\n */\n\n setupSegmentLoaderListeners_() {\n this.mainSegmentLoader_.on('bandwidthupdate', () => {\n // Whether or not buffer based ABR or another ABR is used, on a bandwidth change it's\n // useful to check to see if a rendition switch should be made.\n this.checkABR_('bandwidthupdate');\n this.tech_.trigger('bandwidthupdate');\n });\n this.mainSegmentLoader_.on('timeout', () => {\n if (this.bufferBasedABR) {\n // If a rendition change is needed, then it would've be done on `bandwidthupdate`.\n // Here the only consideration is that for buffer based ABR there's no guarantee\n // of an immediate switch (since the bandwidth is averaged with a timeout\n // bandwidth value of 1), so force a load on the segment loader to keep it going.\n this.mainSegmentLoader_.load();\n }\n }); // `progress` events are not reliable enough of a bandwidth measure to trigger buffer\n // based ABR.\n\n if (!this.bufferBasedABR) {\n this.mainSegmentLoader_.on('progress', () => {\n this.trigger('progress');\n });\n }\n this.mainSegmentLoader_.on('error', () => {\n const error = this.mainSegmentLoader_.error();\n this.excludePlaylist({\n playlistToExclude: error.playlist,\n error\n });\n });\n this.mainSegmentLoader_.on('appenderror', () => {\n this.error = this.mainSegmentLoader_.error_;\n this.trigger('error');\n });\n this.mainSegmentLoader_.on('syncinfoupdate', () => {\n this.onSyncInfoUpdate_();\n });\n this.mainSegmentLoader_.on('timestampoffset', () => {\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-timestamp-offset'\n });\n });\n this.audioSegmentLoader_.on('syncinfoupdate', () => {\n this.onSyncInfoUpdate_();\n });\n this.audioSegmentLoader_.on('appenderror', () => {\n this.error = this.audioSegmentLoader_.error_;\n this.trigger('error');\n });\n this.mainSegmentLoader_.on('ended', () => {\n this.logger_('main segment loader ended');\n this.onEndOfStream();\n });\n this.mainSegmentLoader_.on('earlyabort', event => {\n // never try to early abort with the new ABR algorithm\n if (this.bufferBasedABR) {\n return;\n }\n this.delegateLoaders_('all', ['abort']);\n this.excludePlaylist({\n error: {\n message: 'Aborted early because there isn\\'t enough bandwidth to complete ' + 'the request without rebuffering.'\n },\n playlistExclusionDuration: ABORT_EARLY_EXCLUSION_SECONDS\n });\n });\n const updateCodecs = () => {\n if (!this.sourceUpdater_.hasCreatedSourceBuffers()) {\n return this.tryToCreateSourceBuffers_();\n }\n const codecs = this.getCodecsOrExclude_(); // no codecs means that the playlist was excluded\n\n if (!codecs) {\n return;\n }\n this.sourceUpdater_.addOrChangeSourceBuffers(codecs);\n };\n this.mainSegmentLoader_.on('trackinfo', updateCodecs);\n this.audioSegmentLoader_.on('trackinfo', updateCodecs);\n this.mainSegmentLoader_.on('fmp4', () => {\n if (!this.triggeredFmp4Usage) {\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-fmp4'\n });\n this.triggeredFmp4Usage = true;\n }\n });\n this.audioSegmentLoader_.on('fmp4', () => {\n if (!this.triggeredFmp4Usage) {\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-fmp4'\n });\n this.triggeredFmp4Usage = true;\n }\n });\n this.audioSegmentLoader_.on('ended', () => {\n this.logger_('audioSegmentLoader ended');\n this.onEndOfStream();\n });\n const segmentLoaderEvents = ['segmentselected', 'segmentloadstart', 'segmentloaded', 'segmentkeyloadstart', 'segmentkeyloadcomplete', 'segmentdecryptionstart', 'segmentdecryptioncomplete', 'segmenttransmuxingstart', 'segmenttransmuxingcomplete', 'segmenttransmuxingtrackinfoavailable', 'segmenttransmuxingtiminginfoavailable', 'segmentappendstart', 'appendsdone', 'bandwidthupdated', 'timelinechange', 'codecschange'];\n segmentLoaderEvents.forEach(eventName => {\n this.mainSegmentLoader_.on(eventName, metadata => {\n this.player_.trigger(_extends({}, metadata));\n });\n this.audioSegmentLoader_.on(eventName, metadata => {\n this.player_.trigger(_extends({}, metadata));\n });\n this.subtitleSegmentLoader_.on(eventName, metadata => {\n this.player_.trigger(_extends({}, metadata));\n });\n });\n }\n mediaSecondsLoaded_() {\n return Math.max(this.audioSegmentLoader_.mediaSecondsLoaded + this.mainSegmentLoader_.mediaSecondsLoaded);\n }\n /**\n * Call load on our SegmentLoaders\n */\n\n load() {\n this.mainSegmentLoader_.load();\n if (this.mediaTypes_.AUDIO.activePlaylistLoader) {\n this.audioSegmentLoader_.load();\n }\n if (this.mediaTypes_.SUBTITLES.activePlaylistLoader) {\n this.subtitleSegmentLoader_.load();\n }\n }\n /**\n * Re-tune playback quality level for the current player\n * conditions. This method will perform destructive actions like removing\n * already buffered content in order to readjust the currently active\n * playlist quickly. This is good for manual quality changes\n *\n * @private\n */\n\n fastQualityChange_(media = this.selectPlaylist()) {\n if (media && media === this.mainPlaylistLoader_.media()) {\n this.logger_('skipping fastQualityChange because new media is same as old');\n return;\n }\n this.switchMedia_(media, 'fast-quality'); // we would like to avoid race condition when we call fastQuality,\n // reset everything and start loading segments from prev segments instead of new because new playlist is not received yet\n\n this.waitingForFastQualityPlaylistReceived_ = true;\n }\n runFastQualitySwitch_() {\n this.waitingForFastQualityPlaylistReceived_ = false; // Delete all buffered data to allow an immediate quality switch, then seek to give\n // the browser a kick to remove any cached frames from the previous rendtion (.04 seconds\n // ahead was roughly the minimum that will accomplish this across a variety of content\n // in IE and Edge, but seeking in place is sufficient on all other browsers)\n // Edge/IE bug: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/14600375/\n // Chrome bug: https://bugs.chromium.org/p/chromium/issues/detail?id=651904\n\n this.mainSegmentLoader_.pause();\n this.mainSegmentLoader_.resetEverything(() => {\n this.tech_.setCurrentTime(this.tech_.currentTime());\n }); // don't need to reset audio as it is reset when media changes\n }\n /**\n * Begin playback.\n */\n\n play() {\n if (this.setupFirstPlay()) {\n return;\n }\n if (this.tech_.ended()) {\n this.tech_.setCurrentTime(0);\n }\n if (this.hasPlayed_) {\n this.load();\n }\n const seekable = this.tech_.seekable(); // if the viewer has paused and we fell out of the live window,\n // seek forward to the live point\n\n if (this.tech_.duration() === Infinity) {\n if (this.tech_.currentTime() < seekable.start(0)) {\n return this.tech_.setCurrentTime(seekable.end(seekable.length - 1));\n }\n }\n }\n /**\n * Seek to the latest media position if this is a live video and the\n * player and video are loaded and initialized.\n */\n\n setupFirstPlay() {\n const media = this.mainPlaylistLoader_.media(); // Check that everything is ready to begin buffering for the first call to play\n // If 1) there is no active media\n // 2) the player is paused\n // 3) the first play has already been setup\n // then exit early\n\n if (!media || this.tech_.paused() || this.hasPlayed_) {\n return false;\n } // when the video is a live stream and/or has a start time\n\n if (!media.endList || media.start) {\n const seekable = this.seekable();\n if (!seekable.length) {\n // without a seekable range, the player cannot seek to begin buffering at the\n // live or start point\n return false;\n }\n const seekableEnd = seekable.end(0);\n let startPoint = seekableEnd;\n if (media.start) {\n const offset = media.start.timeOffset;\n if (offset < 0) {\n startPoint = Math.max(seekableEnd + offset, seekable.start(0));\n } else {\n startPoint = Math.min(seekableEnd, offset);\n }\n } // trigger firstplay to inform the source handler to ignore the next seek event\n\n this.trigger('firstplay'); // seek to the live point\n\n this.tech_.setCurrentTime(startPoint);\n }\n this.hasPlayed_ = true; // we can begin loading now that everything is ready\n\n this.load();\n return true;\n }\n /**\n * handle the sourceopen event on the MediaSource\n *\n * @private\n */\n\n handleSourceOpen_() {\n // Only attempt to create the source buffer if none already exist.\n // handleSourceOpen is also called when we are \"re-opening\" a source buffer\n // after `endOfStream` has been called (in response to a seek for instance)\n this.tryToCreateSourceBuffers_(); // if autoplay is enabled, begin playback. This is duplicative of\n // code in video.js but is required because play() must be invoked\n // *after* the media source has opened.\n\n if (this.tech_.autoplay()) {\n const playPromise = this.tech_.play(); // Catch/silence error when a pause interrupts a play request\n // on browsers which return a promise\n\n if (typeof playPromise !== 'undefined' && typeof playPromise.then === 'function') {\n playPromise.then(null, e => {});\n }\n }\n this.trigger('sourceopen');\n }\n /**\n * handle the sourceended event on the MediaSource\n *\n * @private\n */\n\n handleSourceEnded_() {\n if (!this.inbandTextTracks_.metadataTrack_) {\n return;\n }\n const cues = this.inbandTextTracks_.metadataTrack_.cues;\n if (!cues || !cues.length) {\n return;\n }\n const duration = this.duration();\n cues[cues.length - 1].endTime = isNaN(duration) || Math.abs(duration) === Infinity ? Number.MAX_VALUE : duration;\n }\n /**\n * handle the durationchange event on the MediaSource\n *\n * @private\n */\n\n handleDurationChange_() {\n this.tech_.trigger('durationchange');\n }\n /**\n * Calls endOfStream on the media source when all active stream types have called\n * endOfStream\n *\n * @param {string} streamType\n * Stream type of the segment loader that called endOfStream\n * @private\n */\n\n onEndOfStream() {\n let isEndOfStream = this.mainSegmentLoader_.ended_;\n if (this.mediaTypes_.AUDIO.activePlaylistLoader) {\n const mainMediaInfo = this.mainSegmentLoader_.getCurrentMediaInfo_(); // if the audio playlist loader exists, then alternate audio is active\n\n if (!mainMediaInfo || mainMediaInfo.hasVideo) {\n // if we do not know if the main segment loader contains video yet or if we\n // definitively know the main segment loader contains video, then we need to wait\n // for both main and audio segment loaders to call endOfStream\n isEndOfStream = isEndOfStream && this.audioSegmentLoader_.ended_;\n } else {\n // otherwise just rely on the audio loader\n isEndOfStream = this.audioSegmentLoader_.ended_;\n }\n }\n if (!isEndOfStream) {\n return;\n }\n this.stopABRTimer_();\n this.sourceUpdater_.endOfStream();\n }\n /**\n * Check if a playlist has stopped being updated\n *\n * @param {Object} playlist the media playlist object\n * @return {boolean} whether the playlist has stopped being updated or not\n */\n\n stuckAtPlaylistEnd_(playlist) {\n const seekable = this.seekable();\n if (!seekable.length) {\n // playlist doesn't have enough information to determine whether we are stuck\n return false;\n }\n const expired = this.syncController_.getExpiredTime(playlist, this.duration());\n if (expired === null) {\n return false;\n } // does not use the safe live end to calculate playlist end, since we\n // don't want to say we are stuck while there is still content\n\n const absolutePlaylistEnd = Vhs$1.Playlist.playlistEnd(playlist, expired);\n const currentTime = this.tech_.currentTime();\n const buffered = this.tech_.buffered();\n if (!buffered.length) {\n // return true if the playhead reached the absolute end of the playlist\n return absolutePlaylistEnd - currentTime <= SAFE_TIME_DELTA;\n }\n const bufferedEnd = buffered.end(buffered.length - 1); // return true if there is too little buffer left and buffer has reached absolute\n // end of playlist\n\n return bufferedEnd - currentTime <= SAFE_TIME_DELTA && absolutePlaylistEnd - bufferedEnd <= SAFE_TIME_DELTA;\n }\n /**\n * Exclude a playlist for a set amount of time, making it unavailable for selection by\n * the rendition selection algorithm, then force a new playlist (rendition) selection.\n *\n * @param {Object=} playlistToExclude\n * the playlist to exclude, defaults to the currently selected playlist\n * @param {Object=} error\n * an optional error\n * @param {number=} playlistExclusionDuration\n * an optional number of seconds to exclude the playlist\n */\n\n excludePlaylist({\n playlistToExclude = this.mainPlaylistLoader_.media(),\n error = {},\n playlistExclusionDuration\n }) {\n // If the `error` was generated by the playlist loader, it will contain\n // the playlist we were trying to load (but failed) and that should be\n // excluded instead of the currently selected playlist which is likely\n // out-of-date in this scenario\n playlistToExclude = playlistToExclude || this.mainPlaylistLoader_.media();\n playlistExclusionDuration = playlistExclusionDuration || error.playlistExclusionDuration || this.playlistExclusionDuration; // If there is no current playlist, then an error occurred while we were\n // trying to load the main OR while we were disposing of the tech\n\n if (!playlistToExclude) {\n this.error = error;\n if (this.mediaSource.readyState !== 'open') {\n this.trigger('error');\n } else {\n this.sourceUpdater_.endOfStream('network');\n }\n return;\n }\n playlistToExclude.playlistErrors_++;\n const playlists = this.mainPlaylistLoader_.main.playlists;\n const enabledPlaylists = playlists.filter(isEnabled);\n const isFinalRendition = enabledPlaylists.length === 1 && enabledPlaylists[0] === playlistToExclude; // Don't exclude the only playlist unless it was excluded\n // forever\n\n if (playlists.length === 1 && playlistExclusionDuration !== Infinity) {\n videojs.log.warn(`Problem encountered with playlist ${playlistToExclude.id}. ` + 'Trying again since it is the only playlist.');\n this.tech_.trigger('retryplaylist'); // if this is a final rendition, we should delay\n\n return this.mainPlaylistLoader_.load(isFinalRendition);\n }\n if (isFinalRendition) {\n // If we're content steering, try other pathways.\n if (this.main().contentSteering) {\n const pathway = this.pathwayAttribute_(playlistToExclude); // Ignore at least 1 steering manifest refresh.\n\n const reIncludeDelay = this.contentSteeringController_.steeringManifest.ttl * 1000;\n this.contentSteeringController_.excludePathway(pathway);\n this.excludeThenChangePathway_();\n setTimeout(() => {\n this.contentSteeringController_.addAvailablePathway(pathway);\n }, reIncludeDelay);\n return;\n } // Since we're on the final non-excluded playlist, and we're about to exclude\n // it, instead of erring the player or retrying this playlist, clear out the current\n // exclusion list. This allows other playlists to be attempted in case any have been\n // fixed.\n\n let reincluded = false;\n playlists.forEach(playlist => {\n // skip current playlist which is about to be excluded\n if (playlist === playlistToExclude) {\n return;\n }\n const excludeUntil = playlist.excludeUntil; // a playlist cannot be reincluded if it wasn't excluded to begin with.\n\n if (typeof excludeUntil !== 'undefined' && excludeUntil !== Infinity) {\n reincluded = true;\n delete playlist.excludeUntil;\n }\n });\n if (reincluded) {\n videojs.log.warn('Removing other playlists from the exclusion list because the last ' + 'rendition is about to be excluded.'); // Technically we are retrying a playlist, in that we are simply retrying a previous\n // playlist. This is needed for users relying on the retryplaylist event to catch a\n // case where the player might be stuck and looping through \"dead\" playlists.\n\n this.tech_.trigger('retryplaylist');\n }\n } // Exclude this playlist\n\n let excludeUntil;\n if (playlistToExclude.playlistErrors_ > this.maxPlaylistRetries) {\n excludeUntil = Infinity;\n } else {\n excludeUntil = Date.now() + playlistExclusionDuration * 1000;\n }\n playlistToExclude.excludeUntil = excludeUntil;\n if (error.reason) {\n playlistToExclude.lastExcludeReason_ = error.reason;\n }\n this.tech_.trigger('excludeplaylist');\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-rendition-excluded'\n }); // TODO: only load a new playlist if we're excluding the current playlist\n // If this function was called with a playlist that's not the current active playlist\n // (e.g., media().id !== playlistToExclude.id),\n // then a new playlist should not be selected and loaded, as there's nothing wrong with the current playlist.\n\n const nextPlaylist = this.selectPlaylist();\n if (!nextPlaylist) {\n this.error = 'Playback cannot continue. No available working or supported playlists.';\n this.trigger('error');\n return;\n }\n const logFn = error.internal ? this.logger_ : videojs.log.warn;\n const errorMessage = error.message ? ' ' + error.message : '';\n logFn(`${error.internal ? 'Internal problem' : 'Problem'} encountered with playlist ${playlistToExclude.id}.` + `${errorMessage} Switching to playlist ${nextPlaylist.id}.`); // if audio group changed reset audio loaders\n\n if (nextPlaylist.attributes.AUDIO !== playlistToExclude.attributes.AUDIO) {\n this.delegateLoaders_('audio', ['abort', 'pause']);\n } // if subtitle group changed reset subtitle loaders\n\n if (nextPlaylist.attributes.SUBTITLES !== playlistToExclude.attributes.SUBTITLES) {\n this.delegateLoaders_('subtitle', ['abort', 'pause']);\n }\n this.delegateLoaders_('main', ['abort', 'pause']);\n const delayDuration = nextPlaylist.targetDuration / 2 * 1000 || 5 * 1000;\n const shouldDelay = typeof nextPlaylist.lastRequest === 'number' && Date.now() - nextPlaylist.lastRequest <= delayDuration; // delay if it's a final rendition or if the last refresh is sooner than half targetDuration\n\n return this.switchMedia_(nextPlaylist, 'exclude', isFinalRendition || shouldDelay);\n }\n /**\n * Pause all segment/playlist loaders\n */\n\n pauseLoading() {\n this.delegateLoaders_('all', ['abort', 'pause']);\n this.stopABRTimer_();\n }\n /**\n * Call a set of functions in order on playlist loaders, segment loaders,\n * or both types of loaders.\n *\n * @param {string} filter\n * Filter loaders that should call fnNames using a string. Can be:\n * * all - run on all loaders\n * * audio - run on all audio loaders\n * * subtitle - run on all subtitle loaders\n * * main - run on the main loaders\n *\n * @param {Array|string} fnNames\n * A string or array of function names to call.\n */\n\n delegateLoaders_(filter, fnNames) {\n const loaders = [];\n const dontFilterPlaylist = filter === 'all';\n if (dontFilterPlaylist || filter === 'main') {\n loaders.push(this.mainPlaylistLoader_);\n }\n const mediaTypes = [];\n if (dontFilterPlaylist || filter === 'audio') {\n mediaTypes.push('AUDIO');\n }\n if (dontFilterPlaylist || filter === 'subtitle') {\n mediaTypes.push('CLOSED-CAPTIONS');\n mediaTypes.push('SUBTITLES');\n }\n mediaTypes.forEach(mediaType => {\n const loader = this.mediaTypes_[mediaType] && this.mediaTypes_[mediaType].activePlaylistLoader;\n if (loader) {\n loaders.push(loader);\n }\n });\n ['main', 'audio', 'subtitle'].forEach(name => {\n const loader = this[`${name}SegmentLoader_`];\n if (loader && (filter === name || filter === 'all')) {\n loaders.push(loader);\n }\n });\n loaders.forEach(loader => fnNames.forEach(fnName => {\n if (typeof loader[fnName] === 'function') {\n loader[fnName]();\n }\n }));\n }\n /**\n * set the current time on all segment loaders\n *\n * @param {TimeRange} currentTime the current time to set\n * @return {TimeRange} the current time\n */\n\n setCurrentTime(currentTime) {\n const buffered = findRange(this.tech_.buffered(), currentTime);\n if (!(this.mainPlaylistLoader_ && this.mainPlaylistLoader_.media())) {\n // return immediately if the metadata is not ready yet\n return 0;\n } // it's clearly an edge-case but don't thrown an error if asked to\n // seek within an empty playlist\n\n if (!this.mainPlaylistLoader_.media().segments) {\n return 0;\n } // if the seek location is already buffered, continue buffering as usual\n\n if (buffered && buffered.length) {\n return currentTime;\n } // cancel outstanding requests so we begin buffering at the new\n // location\n\n this.mainSegmentLoader_.pause();\n this.mainSegmentLoader_.resetEverything();\n if (this.mediaTypes_.AUDIO.activePlaylistLoader) {\n this.audioSegmentLoader_.pause();\n this.audioSegmentLoader_.resetEverything();\n }\n if (this.mediaTypes_.SUBTITLES.activePlaylistLoader) {\n this.subtitleSegmentLoader_.pause();\n this.subtitleSegmentLoader_.resetEverything();\n } // start segment loader loading in case they are paused\n\n this.load();\n }\n /**\n * get the current duration\n *\n * @return {TimeRange} the duration\n */\n\n duration() {\n if (!this.mainPlaylistLoader_) {\n return 0;\n }\n const media = this.mainPlaylistLoader_.media();\n if (!media) {\n // no playlists loaded yet, so can't determine a duration\n return 0;\n } // Don't rely on the media source for duration in the case of a live playlist since\n // setting the native MediaSource's duration to infinity ends up with consequences to\n // seekable behavior. See https://github.com/w3c/media-source/issues/5 for details.\n //\n // This is resolved in the spec by https://github.com/w3c/media-source/pull/92,\n // however, few browsers have support for setLiveSeekableRange()\n // https://developer.mozilla.org/en-US/docs/Web/API/MediaSource/setLiveSeekableRange\n //\n // Until a time when the duration of the media source can be set to infinity, and a\n // seekable range specified across browsers, just return Infinity.\n\n if (!media.endList) {\n return Infinity;\n } // Since this is a VOD video, it is safe to rely on the media source's duration (if\n // available). If it's not available, fall back to a playlist-calculated estimate.\n\n if (this.mediaSource) {\n return this.mediaSource.duration;\n }\n return Vhs$1.Playlist.duration(media);\n }\n /**\n * check the seekable range\n *\n * @return {TimeRange} the seekable range\n */\n\n seekable() {\n return this.seekable_;\n }\n onSyncInfoUpdate_() {\n let audioSeekable; // TODO check for creation of both source buffers before updating seekable\n //\n // A fix was made to this function where a check for\n // this.sourceUpdater_.hasCreatedSourceBuffers\n // was added to ensure that both source buffers were created before seekable was\n // updated. However, it originally had a bug where it was checking for a true and\n // returning early instead of checking for false. Setting it to check for false to\n // return early though created other issues. A call to play() would check for seekable\n // end without verifying that a seekable range was present. In addition, even checking\n // for that didn't solve some issues, as handleFirstPlay is sometimes worked around\n // due to a media update calling load on the segment loaders, skipping a seek to live,\n // thereby starting live streams at the beginning of the stream rather than at the end.\n //\n // This conditional should be fixed to wait for the creation of two source buffers at\n // the same time as the other sections of code are fixed to properly seek to live and\n // not throw an error due to checking for a seekable end when no seekable range exists.\n //\n // For now, fall back to the older behavior, with the understanding that the seekable\n // range may not be completely correct, leading to a suboptimal initial live point.\n\n if (!this.mainPlaylistLoader_) {\n return;\n }\n let media = this.mainPlaylistLoader_.media();\n if (!media) {\n return;\n }\n let expired = this.syncController_.getExpiredTime(media, this.duration());\n if (expired === null) {\n // not enough information to update seekable\n return;\n }\n const main = this.mainPlaylistLoader_.main;\n const mainSeekable = Vhs$1.Playlist.seekable(media, expired, Vhs$1.Playlist.liveEdgeDelay(main, media));\n if (mainSeekable.length === 0) {\n return;\n }\n if (this.mediaTypes_.AUDIO.activePlaylistLoader) {\n media = this.mediaTypes_.AUDIO.activePlaylistLoader.media();\n expired = this.syncController_.getExpiredTime(media, this.duration());\n if (expired === null) {\n return;\n }\n audioSeekable = Vhs$1.Playlist.seekable(media, expired, Vhs$1.Playlist.liveEdgeDelay(main, media));\n if (audioSeekable.length === 0) {\n return;\n }\n }\n let oldEnd;\n let oldStart;\n if (this.seekable_ && this.seekable_.length) {\n oldEnd = this.seekable_.end(0);\n oldStart = this.seekable_.start(0);\n }\n if (!audioSeekable) {\n // seekable has been calculated based on buffering video data so it\n // can be returned directly\n this.seekable_ = mainSeekable;\n } else if (audioSeekable.start(0) > mainSeekable.end(0) || mainSeekable.start(0) > audioSeekable.end(0)) {\n // seekables are pretty far off, rely on main\n this.seekable_ = mainSeekable;\n } else {\n this.seekable_ = createTimeRanges([[audioSeekable.start(0) > mainSeekable.start(0) ? audioSeekable.start(0) : mainSeekable.start(0), audioSeekable.end(0) < mainSeekable.end(0) ? audioSeekable.end(0) : mainSeekable.end(0)]]);\n } // seekable is the same as last time\n\n if (this.seekable_ && this.seekable_.length) {\n if (this.seekable_.end(0) === oldEnd && this.seekable_.start(0) === oldStart) {\n return;\n }\n }\n this.logger_(`seekable updated [${printableRange(this.seekable_)}]`);\n const metadata = {\n seekableRanges: this.seekable_\n };\n this.trigger({\n type: 'seekablerangeschanged',\n metadata\n });\n this.tech_.trigger('seekablechanged');\n }\n /**\n * Update the player duration\n */\n\n updateDuration(isLive) {\n if (this.updateDuration_) {\n this.mediaSource.removeEventListener('sourceopen', this.updateDuration_);\n this.updateDuration_ = null;\n }\n if (this.mediaSource.readyState !== 'open') {\n this.updateDuration_ = this.updateDuration.bind(this, isLive);\n this.mediaSource.addEventListener('sourceopen', this.updateDuration_);\n return;\n }\n if (isLive) {\n const seekable = this.seekable();\n if (!seekable.length) {\n return;\n } // Even in the case of a live playlist, the native MediaSource's duration should not\n // be set to Infinity (even though this would be expected for a live playlist), since\n // setting the native MediaSource's duration to infinity ends up with consequences to\n // seekable behavior. See https://github.com/w3c/media-source/issues/5 for details.\n //\n // This is resolved in the spec by https://github.com/w3c/media-source/pull/92,\n // however, few browsers have support for setLiveSeekableRange()\n // https://developer.mozilla.org/en-US/docs/Web/API/MediaSource/setLiveSeekableRange\n //\n // Until a time when the duration of the media source can be set to infinity, and a\n // seekable range specified across browsers, the duration should be greater than or\n // equal to the last possible seekable value.\n // MediaSource duration starts as NaN\n // It is possible (and probable) that this case will never be reached for many\n // sources, since the MediaSource reports duration as the highest value without\n // accounting for timestamp offset. For example, if the timestamp offset is -100 and\n // we buffered times 0 to 100 with real times of 100 to 200, even though current\n // time will be between 0 and 100, the native media source may report the duration\n // as 200. However, since we report duration separate from the media source (as\n // Infinity), and as long as the native media source duration value is greater than\n // our reported seekable range, seeks will work as expected. The large number as\n // duration for live is actually a strategy used by some players to work around the\n // issue of live seekable ranges cited above.\n\n if (isNaN(this.mediaSource.duration) || this.mediaSource.duration < seekable.end(seekable.length - 1)) {\n this.sourceUpdater_.setDuration(seekable.end(seekable.length - 1));\n }\n return;\n }\n const buffered = this.tech_.buffered();\n let duration = Vhs$1.Playlist.duration(this.mainPlaylistLoader_.media());\n if (buffered.length > 0) {\n duration = Math.max(duration, buffered.end(buffered.length - 1));\n }\n if (this.mediaSource.duration !== duration) {\n this.sourceUpdater_.setDuration(duration);\n }\n }\n /**\n * dispose of the PlaylistController and everything\n * that it controls\n */\n\n dispose() {\n this.trigger('dispose');\n this.decrypter_.terminate();\n this.mainPlaylistLoader_.dispose();\n this.mainSegmentLoader_.dispose();\n this.contentSteeringController_.dispose();\n this.keyStatusMap_.clear();\n if (this.loadOnPlay_) {\n this.tech_.off('play', this.loadOnPlay_);\n }\n ['AUDIO', 'SUBTITLES'].forEach(type => {\n const groups = this.mediaTypes_[type].groups;\n for (const id in groups) {\n groups[id].forEach(group => {\n if (group.playlistLoader) {\n group.playlistLoader.dispose();\n }\n });\n }\n });\n this.audioSegmentLoader_.dispose();\n this.subtitleSegmentLoader_.dispose();\n this.sourceUpdater_.dispose();\n this.timelineChangeController_.dispose();\n this.stopABRTimer_();\n if (this.updateDuration_) {\n this.mediaSource.removeEventListener('sourceopen', this.updateDuration_);\n }\n this.mediaSource.removeEventListener('durationchange', this.handleDurationChange_); // load the media source into the player\n\n this.mediaSource.removeEventListener('sourceopen', this.handleSourceOpen_);\n this.mediaSource.removeEventListener('sourceended', this.handleSourceEnded_);\n this.off();\n }\n /**\n * return the main playlist object if we have one\n *\n * @return {Object} the main playlist object that we parsed\n */\n\n main() {\n return this.mainPlaylistLoader_.main;\n }\n /**\n * return the currently selected playlist\n *\n * @return {Object} the currently selected playlist object that we parsed\n */\n\n media() {\n // playlist loader will not return media if it has not been fully loaded\n return this.mainPlaylistLoader_.media() || this.initialMedia_;\n }\n areMediaTypesKnown_() {\n const usingAudioLoader = !!this.mediaTypes_.AUDIO.activePlaylistLoader;\n const hasMainMediaInfo = !!this.mainSegmentLoader_.getCurrentMediaInfo_(); // if we are not using an audio loader, then we have audio media info\n // otherwise check on the segment loader.\n\n const hasAudioMediaInfo = !usingAudioLoader ? true : !!this.audioSegmentLoader_.getCurrentMediaInfo_(); // one or both loaders has not loaded sufficently to get codecs\n\n if (!hasMainMediaInfo || !hasAudioMediaInfo) {\n return false;\n }\n return true;\n } // find from and to for codec switch event\n\n getCodecsOrExclude_() {\n const media = {\n main: this.mainSegmentLoader_.getCurrentMediaInfo_() || {},\n audio: this.audioSegmentLoader_.getCurrentMediaInfo_() || {}\n };\n const playlist = this.mainSegmentLoader_.getPendingSegmentPlaylist() || this.media(); // set \"main\" media equal to video\n\n media.video = media.main;\n const playlistCodecs = codecsForPlaylist(this.main(), playlist);\n const codecs = {};\n const usingAudioLoader = !!this.mediaTypes_.AUDIO.activePlaylistLoader;\n if (media.main.hasVideo) {\n codecs.video = playlistCodecs.video || media.main.videoCodec || DEFAULT_VIDEO_CODEC;\n }\n if (media.main.isMuxed) {\n codecs.video += `,${playlistCodecs.audio || media.main.audioCodec || DEFAULT_AUDIO_CODEC}`;\n }\n if (media.main.hasAudio && !media.main.isMuxed || media.audio.hasAudio || usingAudioLoader) {\n codecs.audio = playlistCodecs.audio || media.main.audioCodec || media.audio.audioCodec || DEFAULT_AUDIO_CODEC; // set audio isFmp4 so we use the correct \"supports\" function below\n\n media.audio.isFmp4 = media.main.hasAudio && !media.main.isMuxed ? media.main.isFmp4 : media.audio.isFmp4;\n } // no codecs, no playback.\n\n if (!codecs.audio && !codecs.video) {\n this.excludePlaylist({\n playlistToExclude: playlist,\n error: {\n message: 'Could not determine codecs for playlist.'\n },\n playlistExclusionDuration: Infinity\n });\n return;\n } // fmp4 relies on browser support, while ts relies on muxer support\n\n const supportFunction = (isFmp4, codec) => isFmp4 ? browserSupportsCodec(codec) : muxerSupportsCodec(codec);\n const unsupportedCodecs = {};\n let unsupportedAudio;\n ['video', 'audio'].forEach(function (type) {\n if (codecs.hasOwnProperty(type) && !supportFunction(media[type].isFmp4, codecs[type])) {\n const supporter = media[type].isFmp4 ? 'browser' : 'muxer';\n unsupportedCodecs[supporter] = unsupportedCodecs[supporter] || [];\n unsupportedCodecs[supporter].push(codecs[type]);\n if (type === 'audio') {\n unsupportedAudio = supporter;\n }\n }\n });\n if (usingAudioLoader && unsupportedAudio && playlist.attributes.AUDIO) {\n const audioGroup = playlist.attributes.AUDIO;\n this.main().playlists.forEach(variant => {\n const variantAudioGroup = variant.attributes && variant.attributes.AUDIO;\n if (variantAudioGroup === audioGroup && variant !== playlist) {\n variant.excludeUntil = Infinity;\n }\n });\n this.logger_(`excluding audio group ${audioGroup} as ${unsupportedAudio} does not support codec(s): \"${codecs.audio}\"`);\n } // if we have any unsupported codecs exclude this playlist.\n\n if (Object.keys(unsupportedCodecs).length) {\n const message = Object.keys(unsupportedCodecs).reduce((acc, supporter) => {\n if (acc) {\n acc += ', ';\n }\n acc += `${supporter} does not support codec(s): \"${unsupportedCodecs[supporter].join(',')}\"`;\n return acc;\n }, '') + '.';\n this.excludePlaylist({\n playlistToExclude: playlist,\n error: {\n internal: true,\n message\n },\n playlistExclusionDuration: Infinity\n });\n return;\n } // check if codec switching is happening\n\n if (this.sourceUpdater_.hasCreatedSourceBuffers() && !this.sourceUpdater_.canChangeType()) {\n const switchMessages = [];\n ['video', 'audio'].forEach(type => {\n const newCodec = (parseCodecs(this.sourceUpdater_.codecs[type] || '')[0] || {}).type;\n const oldCodec = (parseCodecs(codecs[type] || '')[0] || {}).type;\n if (newCodec && oldCodec && newCodec.toLowerCase() !== oldCodec.toLowerCase()) {\n switchMessages.push(`\"${this.sourceUpdater_.codecs[type]}\" -> \"${codecs[type]}\"`);\n }\n });\n if (switchMessages.length) {\n this.excludePlaylist({\n playlistToExclude: playlist,\n error: {\n message: `Codec switching not supported: ${switchMessages.join(', ')}.`,\n internal: true\n },\n playlistExclusionDuration: Infinity\n });\n return;\n }\n } // TODO: when using the muxer shouldn't we just return\n // the codecs that the muxer outputs?\n\n return codecs;\n }\n /**\n * Create source buffers and exlude any incompatible renditions.\n *\n * @private\n */\n\n tryToCreateSourceBuffers_() {\n // media source is not ready yet or sourceBuffers are already\n // created.\n if (this.mediaSource.readyState !== 'open' || this.sourceUpdater_.hasCreatedSourceBuffers()) {\n return;\n }\n if (!this.areMediaTypesKnown_()) {\n return;\n }\n const codecs = this.getCodecsOrExclude_(); // no codecs means that the playlist was excluded\n\n if (!codecs) {\n return;\n }\n this.sourceUpdater_.createSourceBuffers(codecs);\n const codecString = [codecs.video, codecs.audio].filter(Boolean).join(',');\n this.excludeIncompatibleVariants_(codecString);\n }\n /**\n * Excludes playlists with codecs that are unsupported by the muxer and browser.\n */\n\n excludeUnsupportedVariants_() {\n const playlists = this.main().playlists;\n const ids = []; // TODO: why don't we have a property to loop through all\n // playlist? Why did we ever mix indexes and keys?\n\n Object.keys(playlists).forEach(key => {\n const variant = playlists[key]; // check if we already processed this playlist.\n\n if (ids.indexOf(variant.id) !== -1) {\n return;\n }\n ids.push(variant.id);\n const codecs = codecsForPlaylist(this.main, variant);\n const unsupported = [];\n if (codecs.audio && !muxerSupportsCodec(codecs.audio) && !browserSupportsCodec(codecs.audio)) {\n unsupported.push(`audio codec ${codecs.audio}`);\n }\n if (codecs.video && !muxerSupportsCodec(codecs.video) && !browserSupportsCodec(codecs.video)) {\n unsupported.push(`video codec ${codecs.video}`);\n }\n if (codecs.text && codecs.text === 'stpp.ttml.im1t') {\n unsupported.push(`text codec ${codecs.text}`);\n }\n if (unsupported.length) {\n variant.excludeUntil = Infinity;\n this.logger_(`excluding ${variant.id} for unsupported: ${unsupported.join(', ')}`);\n }\n });\n }\n /**\n * Exclude playlists that are known to be codec or\n * stream-incompatible with the SourceBuffer configuration. For\n * instance, Media Source Extensions would cause the video element to\n * stall waiting for video data if you switched from a variant with\n * video and audio to an audio-only one.\n *\n * @param {Object} media a media playlist compatible with the current\n * set of SourceBuffers. Variants in the current main playlist that\n * do not appear to have compatible codec or stream configurations\n * will be excluded from the default playlist selection algorithm\n * indefinitely.\n * @private\n */\n\n excludeIncompatibleVariants_(codecString) {\n const ids = [];\n const playlists = this.main().playlists;\n const codecs = unwrapCodecList(parseCodecs(codecString));\n const codecCount_ = codecCount(codecs);\n const videoDetails = codecs.video && parseCodecs(codecs.video)[0] || null;\n const audioDetails = codecs.audio && parseCodecs(codecs.audio)[0] || null;\n Object.keys(playlists).forEach(key => {\n const variant = playlists[key]; // check if we already processed this playlist.\n // or it if it is already excluded forever.\n\n if (ids.indexOf(variant.id) !== -1 || variant.excludeUntil === Infinity) {\n return;\n }\n ids.push(variant.id);\n const exclusionReasons = []; // get codecs from the playlist for this variant\n\n const variantCodecs = codecsForPlaylist(this.mainPlaylistLoader_.main, variant);\n const variantCodecCount = codecCount(variantCodecs); // if no codecs are listed, we cannot determine that this\n // variant is incompatible. Wait for mux.js to probe\n\n if (!variantCodecs.audio && !variantCodecs.video) {\n return;\n } // TODO: we can support this by removing the\n // old media source and creating a new one, but it will take some work.\n // The number of streams cannot change\n\n if (variantCodecCount !== codecCount_) {\n exclusionReasons.push(`codec count \"${variantCodecCount}\" !== \"${codecCount_}\"`);\n } // only exclude playlists by codec change, if codecs cannot switch\n // during playback.\n\n if (!this.sourceUpdater_.canChangeType()) {\n const variantVideoDetails = variantCodecs.video && parseCodecs(variantCodecs.video)[0] || null;\n const variantAudioDetails = variantCodecs.audio && parseCodecs(variantCodecs.audio)[0] || null; // the video codec cannot change\n\n if (variantVideoDetails && videoDetails && variantVideoDetails.type.toLowerCase() !== videoDetails.type.toLowerCase()) {\n exclusionReasons.push(`video codec \"${variantVideoDetails.type}\" !== \"${videoDetails.type}\"`);\n } // the audio codec cannot change\n\n if (variantAudioDetails && audioDetails && variantAudioDetails.type.toLowerCase() !== audioDetails.type.toLowerCase()) {\n exclusionReasons.push(`audio codec \"${variantAudioDetails.type}\" !== \"${audioDetails.type}\"`);\n }\n }\n if (exclusionReasons.length) {\n variant.excludeUntil = Infinity;\n this.logger_(`excluding ${variant.id}: ${exclusionReasons.join(' && ')}`);\n }\n });\n }\n updateAdCues_(media) {\n let offset = 0;\n const seekable = this.seekable();\n if (seekable.length) {\n offset = seekable.start(0);\n }\n updateAdCues(media, this.cueTagsTrack_, offset);\n }\n /**\n * Calculates the desired forward buffer length based on current time\n *\n * @return {number} Desired forward buffer length in seconds\n */\n\n goalBufferLength() {\n const currentTime = this.tech_.currentTime();\n const initial = Config.GOAL_BUFFER_LENGTH;\n const rate = Config.GOAL_BUFFER_LENGTH_RATE;\n const max = Math.max(initial, Config.MAX_GOAL_BUFFER_LENGTH);\n return Math.min(initial + currentTime * rate, max);\n }\n /**\n * Calculates the desired buffer low water line based on current time\n *\n * @return {number} Desired buffer low water line in seconds\n */\n\n bufferLowWaterLine() {\n const currentTime = this.tech_.currentTime();\n const initial = Config.BUFFER_LOW_WATER_LINE;\n const rate = Config.BUFFER_LOW_WATER_LINE_RATE;\n const max = Math.max(initial, Config.MAX_BUFFER_LOW_WATER_LINE);\n const newMax = Math.max(initial, Config.EXPERIMENTAL_MAX_BUFFER_LOW_WATER_LINE);\n return Math.min(initial + currentTime * rate, this.bufferBasedABR ? newMax : max);\n }\n bufferHighWaterLine() {\n return Config.BUFFER_HIGH_WATER_LINE;\n }\n addDateRangesToTextTrack_(dateRanges) {\n createMetadataTrackIfNotExists(this.inbandTextTracks_, 'com.apple.streaming', this.tech_);\n addDateRangeMetadata({\n inbandTextTracks: this.inbandTextTracks_,\n dateRanges\n });\n }\n addMetadataToTextTrack(dispatchType, metadataArray, videoDuration) {\n const timestampOffset = this.sourceUpdater_.videoBuffer ? this.sourceUpdater_.videoTimestampOffset() : this.sourceUpdater_.audioTimestampOffset(); // There's potentially an issue where we could double add metadata if there's a muxed\n // audio/video source with a metadata track, and an alt audio with a metadata track.\n // However, this probably won't happen, and if it does it can be handled then.\n\n createMetadataTrackIfNotExists(this.inbandTextTracks_, dispatchType, this.tech_);\n addMetadata({\n inbandTextTracks: this.inbandTextTracks_,\n metadataArray,\n timestampOffset,\n videoDuration\n });\n }\n /**\n * Utility for getting the pathway or service location from an HLS or DASH playlist.\n *\n * @param {Object} playlist for getting pathway from.\n * @return the pathway attribute of a playlist\n */\n\n pathwayAttribute_(playlist) {\n return playlist.attributes['PATHWAY-ID'] || playlist.attributes.serviceLocation;\n }\n /**\n * Initialize available pathways and apply the tag properties.\n */\n\n initContentSteeringController_() {\n const main = this.main();\n if (!main.contentSteering) {\n return;\n }\n for (const playlist of main.playlists) {\n this.contentSteeringController_.addAvailablePathway(this.pathwayAttribute_(playlist));\n }\n this.contentSteeringController_.assignTagProperties(main.uri, main.contentSteering); // request the steering manifest immediately if queryBeforeStart is set.\n\n if (this.contentSteeringController_.queryBeforeStart) {\n // When queryBeforeStart is true, initial request should omit steering parameters.\n this.contentSteeringController_.requestSteeringManifest(true);\n return;\n } // otherwise start content steering after playback starts\n\n this.tech_.one('canplay', () => {\n this.contentSteeringController_.requestSteeringManifest();\n });\n }\n /**\n * Reset the content steering controller and re-init.\n */\n\n resetContentSteeringController_() {\n this.contentSteeringController_.clearAvailablePathways();\n this.contentSteeringController_.dispose();\n this.initContentSteeringController_();\n }\n /**\n * Attaches the listeners for content steering.\n */\n\n attachContentSteeringListeners_() {\n this.contentSteeringController_.on('content-steering', this.excludeThenChangePathway_.bind(this));\n const contentSteeringEvents = ['contentsteeringloadstart', 'contentsteeringloadcomplete', 'contentsteeringparsed'];\n contentSteeringEvents.forEach(eventName => {\n this.contentSteeringController_.on(eventName, metadata => {\n this.trigger(_extends({}, metadata));\n });\n });\n if (this.sourceType_ === 'dash') {\n this.mainPlaylistLoader_.on('loadedplaylist', () => {\n const main = this.main(); // check if steering tag or pathways changed.\n\n const didDashTagChange = this.contentSteeringController_.didDASHTagChange(main.uri, main.contentSteering);\n const didPathwaysChange = () => {\n const availablePathways = this.contentSteeringController_.getAvailablePathways();\n const newPathways = [];\n for (const playlist of main.playlists) {\n const serviceLocation = playlist.attributes.serviceLocation;\n if (serviceLocation) {\n newPathways.push(serviceLocation);\n if (!availablePathways.has(serviceLocation)) {\n return true;\n }\n }\n } // If we have no new serviceLocations and previously had availablePathways\n\n if (!newPathways.length && availablePathways.size) {\n return true;\n }\n return false;\n };\n if (didDashTagChange || didPathwaysChange()) {\n this.resetContentSteeringController_();\n }\n });\n }\n }\n /**\n * Simple exclude and change playlist logic for content steering.\n */\n\n excludeThenChangePathway_() {\n const currentPathway = this.contentSteeringController_.getPathway();\n if (!currentPathway) {\n return;\n }\n this.handlePathwayClones_();\n const main = this.main();\n const playlists = main.playlists;\n const ids = new Set();\n let didEnablePlaylists = false;\n Object.keys(playlists).forEach(key => {\n const variant = playlists[key];\n const pathwayId = this.pathwayAttribute_(variant);\n const differentPathwayId = pathwayId && currentPathway !== pathwayId;\n const steeringExclusion = variant.excludeUntil === Infinity && variant.lastExcludeReason_ === 'content-steering';\n if (steeringExclusion && !differentPathwayId) {\n delete variant.excludeUntil;\n delete variant.lastExcludeReason_;\n didEnablePlaylists = true;\n }\n const noExcludeUntil = !variant.excludeUntil && variant.excludeUntil !== Infinity;\n const shouldExclude = !ids.has(variant.id) && differentPathwayId && noExcludeUntil;\n if (!shouldExclude) {\n return;\n }\n ids.add(variant.id);\n variant.excludeUntil = Infinity;\n variant.lastExcludeReason_ = 'content-steering'; // TODO: kind of spammy, maybe move this.\n\n this.logger_(`excluding ${variant.id} for ${variant.lastExcludeReason_}`);\n });\n if (this.contentSteeringController_.manifestType_ === 'DASH') {\n Object.keys(this.mediaTypes_).forEach(key => {\n const type = this.mediaTypes_[key];\n if (type.activePlaylistLoader) {\n const currentPlaylist = type.activePlaylistLoader.media_; // Check if the current media playlist matches the current CDN\n\n if (currentPlaylist && currentPlaylist.attributes.serviceLocation !== currentPathway) {\n didEnablePlaylists = true;\n }\n }\n });\n }\n if (didEnablePlaylists) {\n this.changeSegmentPathway_();\n }\n }\n /**\n * Add, update, or delete playlists and media groups for\n * the pathway clones for HLS Content Steering.\n *\n * See https://datatracker.ietf.org/doc/draft-pantos-hls-rfc8216bis/\n *\n * NOTE: Pathway cloning does not currently support the `PER_VARIANT_URIS` and\n * `PER_RENDITION_URIS` as we do not handle `STABLE-VARIANT-ID` or\n * `STABLE-RENDITION-ID` values.\n */\n\n handlePathwayClones_() {\n const main = this.main();\n const playlists = main.playlists;\n const currentPathwayClones = this.contentSteeringController_.currentPathwayClones;\n const nextPathwayClones = this.contentSteeringController_.nextPathwayClones;\n const hasClones = currentPathwayClones && currentPathwayClones.size || nextPathwayClones && nextPathwayClones.size;\n if (!hasClones) {\n return;\n }\n for (const [id, clone] of currentPathwayClones.entries()) {\n const newClone = nextPathwayClones.get(id); // Delete the old pathway clone.\n\n if (!newClone) {\n this.mainPlaylistLoader_.updateOrDeleteClone(clone);\n this.contentSteeringController_.excludePathway(id);\n }\n }\n for (const [id, clone] of nextPathwayClones.entries()) {\n const oldClone = currentPathwayClones.get(id); // Create a new pathway if it is a new pathway clone object.\n\n if (!oldClone) {\n const playlistsToClone = playlists.filter(p => {\n return p.attributes['PATHWAY-ID'] === clone['BASE-ID'];\n });\n playlistsToClone.forEach(p => {\n this.mainPlaylistLoader_.addClonePathway(clone, p);\n });\n this.contentSteeringController_.addAvailablePathway(id);\n continue;\n } // There have not been changes to the pathway clone object, so skip.\n\n if (this.equalPathwayClones_(oldClone, clone)) {\n continue;\n } // Update a preexisting cloned pathway.\n // True is set for the update flag.\n\n this.mainPlaylistLoader_.updateOrDeleteClone(clone, true);\n this.contentSteeringController_.addAvailablePathway(id);\n } // Deep copy contents of next to current pathways.\n\n this.contentSteeringController_.currentPathwayClones = new Map(JSON.parse(JSON.stringify([...nextPathwayClones])));\n }\n /**\n * Determines whether two pathway clone objects are equivalent.\n *\n * @param {Object} a The first pathway clone object.\n * @param {Object} b The second pathway clone object.\n * @return {boolean} True if the pathway clone objects are equal, false otherwise.\n */\n\n equalPathwayClones_(a, b) {\n if (a['BASE-ID'] !== b['BASE-ID'] || a.ID !== b.ID || a['URI-REPLACEMENT'].HOST !== b['URI-REPLACEMENT'].HOST) {\n return false;\n }\n const aParams = a['URI-REPLACEMENT'].PARAMS;\n const bParams = b['URI-REPLACEMENT'].PARAMS; // We need to iterate through both lists of params because one could be\n // missing a parameter that the other has.\n\n for (const p in aParams) {\n if (aParams[p] !== bParams[p]) {\n return false;\n }\n }\n for (const p in bParams) {\n if (aParams[p] !== bParams[p]) {\n return false;\n }\n }\n return true;\n }\n /**\n * Changes the current playlists for audio, video and subtitles after a new pathway\n * is chosen from content steering.\n */\n\n changeSegmentPathway_() {\n const nextPlaylist = this.selectPlaylist();\n this.pauseLoading(); // Switch audio and text track playlists if necessary in DASH\n\n if (this.contentSteeringController_.manifestType_ === 'DASH') {\n this.switchMediaForDASHContentSteering_();\n }\n this.switchMedia_(nextPlaylist, 'content-steering');\n }\n /**\n * Iterates through playlists and check their keyId set and compare with the\n * keyStatusMap, only enable playlists that have a usable key. If the playlist\n * has no keyId leave it enabled by default.\n */\n\n excludeNonUsablePlaylistsByKeyId_() {\n if (!this.mainPlaylistLoader_ || !this.mainPlaylistLoader_.main) {\n return;\n }\n let nonUsableKeyStatusCount = 0;\n const NON_USABLE = 'non-usable';\n this.mainPlaylistLoader_.main.playlists.forEach(playlist => {\n const keyIdSet = this.mainPlaylistLoader_.getKeyIdSet(playlist); // If the playlist doesn't have keyIDs lets not exclude it.\n\n if (!keyIdSet || !keyIdSet.size) {\n return;\n }\n keyIdSet.forEach(key => {\n const USABLE = 'usable';\n const hasUsableKeyStatus = this.keyStatusMap_.has(key) && this.keyStatusMap_.get(key) === USABLE;\n const nonUsableExclusion = playlist.lastExcludeReason_ === NON_USABLE && playlist.excludeUntil === Infinity;\n if (!hasUsableKeyStatus) {\n // Only exclude playlists that haven't already been excluded as non-usable.\n if (playlist.excludeUntil !== Infinity && playlist.lastExcludeReason_ !== NON_USABLE) {\n playlist.excludeUntil = Infinity;\n playlist.lastExcludeReason_ = NON_USABLE;\n this.logger_(`excluding playlist ${playlist.id} because the key ID ${key} doesn't exist in the keyStatusMap or is not ${USABLE}`);\n } // count all nonUsableKeyStatus\n\n nonUsableKeyStatusCount++;\n } else if (hasUsableKeyStatus && nonUsableExclusion) {\n delete playlist.excludeUntil;\n delete playlist.lastExcludeReason_;\n this.logger_(`enabling playlist ${playlist.id} because key ID ${key} is ${USABLE}`);\n }\n });\n }); // If for whatever reason every playlist has a non usable key status. Lets try re-including the SD renditions as a failsafe.\n\n if (nonUsableKeyStatusCount >= this.mainPlaylistLoader_.main.playlists.length) {\n this.mainPlaylistLoader_.main.playlists.forEach(playlist => {\n const isNonHD = playlist && playlist.attributes && playlist.attributes.RESOLUTION && playlist.attributes.RESOLUTION.height < 720;\n const excludedForNonUsableKey = playlist.excludeUntil === Infinity && playlist.lastExcludeReason_ === NON_USABLE;\n if (isNonHD && excludedForNonUsableKey) {\n // Only delete the excludeUntil so we don't try and re-exclude these playlists.\n delete playlist.excludeUntil;\n videojs.log.warn(`enabling non-HD playlist ${playlist.id} because all playlists were excluded due to ${NON_USABLE} key IDs`);\n }\n });\n }\n }\n /**\n * Adds a keystatus to the keystatus map, tries to convert to string if necessary.\n *\n * @param {any} keyId the keyId to add a status for\n * @param {string} status the status of the keyId\n */\n\n addKeyStatus_(keyId, status) {\n const isString = typeof keyId === 'string';\n const keyIdHexString = isString ? keyId : bufferToHexString(keyId);\n const formattedKeyIdString = keyIdHexString.slice(0, 32).toLowerCase();\n this.logger_(`KeyStatus '${status}' with key ID ${formattedKeyIdString} added to the keyStatusMap`);\n this.keyStatusMap_.set(formattedKeyIdString, status);\n }\n /**\n * Utility function for adding key status to the keyStatusMap and filtering usable encrypted playlists.\n *\n * @param {any} keyId the keyId from the keystatuschange event\n * @param {string} status the key status string\n */\n\n updatePlaylistByKeyStatus(keyId, status) {\n this.addKeyStatus_(keyId, status);\n if (!this.waitingForFastQualityPlaylistReceived_) {\n this.excludeNonUsableThenChangePlaylist_();\n } // Listen to loadedplaylist with a single listener and check for new contentProtection elements when a playlist is updated.\n\n this.mainPlaylistLoader_.off('loadedplaylist', this.excludeNonUsableThenChangePlaylist_.bind(this));\n this.mainPlaylistLoader_.on('loadedplaylist', this.excludeNonUsableThenChangePlaylist_.bind(this));\n }\n excludeNonUsableThenChangePlaylist_() {\n this.excludeNonUsablePlaylistsByKeyId_();\n this.fastQualityChange_();\n }\n}\n\n/**\n * Returns a function that acts as the Enable/disable playlist function.\n *\n * @param {PlaylistLoader} loader - The main playlist loader\n * @param {string} playlistID - id of the playlist\n * @param {Function} changePlaylistFn - A function to be called after a\n * playlist's enabled-state has been changed. Will NOT be called if a\n * playlist's enabled-state is unchanged\n * @param {boolean=} enable - Value to set the playlist enabled-state to\n * or if undefined returns the current enabled-state for the playlist\n * @return {Function} Function for setting/getting enabled\n */\n\nconst enableFunction = (loader, playlistID, changePlaylistFn) => enable => {\n const playlist = loader.main.playlists[playlistID];\n const incompatible = isIncompatible(playlist);\n const currentlyEnabled = isEnabled(playlist);\n if (typeof enable === 'undefined') {\n return currentlyEnabled;\n }\n if (enable) {\n delete playlist.disabled;\n } else {\n playlist.disabled = true;\n }\n const metadata = {\n renditionInfo: {\n id: playlistID,\n bandwidth: playlist.attributes.BANDWIDTH,\n resolution: playlist.attributes.RESOLUTION,\n codecs: playlist.attributes.CODECS\n },\n cause: 'fast-quality'\n };\n if (enable !== currentlyEnabled && !incompatible) {\n // Ensure the outside world knows about our changes\n changePlaylistFn(playlist);\n if (enable) {\n loader.trigger({\n type: 'renditionenabled',\n metadata\n });\n } else {\n loader.trigger({\n type: 'renditiondisabled',\n metadata\n });\n }\n }\n return enable;\n};\n/**\n * The representation object encapsulates the publicly visible information\n * in a media playlist along with a setter/getter-type function (enabled)\n * for changing the enabled-state of a particular playlist entry\n *\n * @class Representation\n */\n\nclass Representation {\n constructor(vhsHandler, playlist, id) {\n const {\n playlistController_: pc\n } = vhsHandler;\n const qualityChangeFunction = pc.fastQualityChange_.bind(pc); // some playlist attributes are optional\n\n if (playlist.attributes) {\n const resolution = playlist.attributes.RESOLUTION;\n this.width = resolution && resolution.width;\n this.height = resolution && resolution.height;\n this.bandwidth = playlist.attributes.BANDWIDTH;\n this.frameRate = playlist.attributes['FRAME-RATE'];\n }\n this.codecs = codecsForPlaylist(pc.main(), playlist);\n this.playlist = playlist; // The id is simply the ordinality of the media playlist\n // within the main playlist\n\n this.id = id; // Partially-apply the enableFunction to create a playlist-\n // specific variant\n\n this.enabled = enableFunction(vhsHandler.playlists, playlist.id, qualityChangeFunction);\n }\n}\n/**\n * A mixin function that adds the `representations` api to an instance\n * of the VhsHandler class\n *\n * @param {VhsHandler} vhsHandler - An instance of VhsHandler to add the\n * representation API into\n */\n\nconst renditionSelectionMixin = function (vhsHandler) {\n // Add a single API-specific function to the VhsHandler instance\n vhsHandler.representations = () => {\n const main = vhsHandler.playlistController_.main();\n const playlists = isAudioOnly(main) ? vhsHandler.playlistController_.getAudioTrackPlaylists_() : main.playlists;\n if (!playlists) {\n return [];\n }\n return playlists.filter(media => !isIncompatible(media)).map((e, i) => new Representation(vhsHandler, e, e.id));\n };\n};\n\n/**\n * @file playback-watcher.js\n *\n * Playback starts, and now my watch begins. It shall not end until my death. I shall\n * take no wait, hold no uncleared timeouts, father no bad seeks. I shall wear no crowns\n * and win no glory. I shall live and die at my post. I am the corrector of the underflow.\n * I am the watcher of gaps. I am the shield that guards the realms of seekable. I pledge\n * my life and honor to the Playback Watch, for this Player and all the Players to come.\n */\n\nconst timerCancelEvents = ['seeking', 'seeked', 'pause', 'playing', 'error'];\n/**\n * @class PlaybackWatcher\n */\n\nclass PlaybackWatcher extends videojs.EventTarget {\n /**\n * Represents an PlaybackWatcher object.\n *\n * @class\n * @param {Object} options an object that includes the tech and settings\n */\n constructor(options) {\n super();\n this.playlistController_ = options.playlistController;\n this.tech_ = options.tech;\n this.seekable = options.seekable;\n this.allowSeeksWithinUnsafeLiveWindow = options.allowSeeksWithinUnsafeLiveWindow;\n this.liveRangeSafeTimeDelta = options.liveRangeSafeTimeDelta;\n this.media = options.media;\n this.playedRanges_ = [];\n this.consecutiveUpdates = 0;\n this.lastRecordedTime = null;\n this.checkCurrentTimeTimeout_ = null;\n this.logger_ = logger('PlaybackWatcher');\n this.logger_('initialize');\n const playHandler = () => this.monitorCurrentTime_();\n const canPlayHandler = () => this.monitorCurrentTime_();\n const waitingHandler = () => this.techWaiting_();\n const cancelTimerHandler = () => this.resetTimeUpdate_();\n const pc = this.playlistController_;\n const loaderTypes = ['main', 'subtitle', 'audio'];\n const loaderChecks = {};\n loaderTypes.forEach(type => {\n loaderChecks[type] = {\n reset: () => this.resetSegmentDownloads_(type),\n updateend: () => this.checkSegmentDownloads_(type)\n };\n pc[`${type}SegmentLoader_`].on('appendsdone', loaderChecks[type].updateend); // If a rendition switch happens during a playback stall where the buffer\n // isn't changing we want to reset. We cannot assume that the new rendition\n // will also be stalled, until after new appends.\n\n pc[`${type}SegmentLoader_`].on('playlistupdate', loaderChecks[type].reset); // Playback stalls should not be detected right after seeking.\n // This prevents one segment playlists (single vtt or single segment content)\n // from being detected as stalling. As the buffer will not change in those cases, since\n // the buffer is the entire video duration.\n\n this.tech_.on(['seeked', 'seeking'], loaderChecks[type].reset);\n });\n /**\n * We check if a seek was into a gap through the following steps:\n * 1. We get a seeking event and we do not get a seeked event. This means that\n * a seek was attempted but not completed.\n * 2. We run `fixesBadSeeks_` on segment loader appends. This means that we already\n * removed everything from our buffer and appended a segment, and should be ready\n * to check for gaps.\n */\n\n const setSeekingHandlers = fn => {\n ['main', 'audio'].forEach(type => {\n pc[`${type}SegmentLoader_`][fn]('appended', this.seekingAppendCheck_);\n });\n };\n this.seekingAppendCheck_ = () => {\n if (this.fixesBadSeeks_()) {\n this.consecutiveUpdates = 0;\n this.lastRecordedTime = this.tech_.currentTime();\n setSeekingHandlers('off');\n }\n };\n this.clearSeekingAppendCheck_ = () => setSeekingHandlers('off');\n this.watchForBadSeeking_ = () => {\n this.clearSeekingAppendCheck_();\n setSeekingHandlers('on');\n };\n this.tech_.on('seeked', this.clearSeekingAppendCheck_);\n this.tech_.on('seeking', this.watchForBadSeeking_);\n this.tech_.on('waiting', waitingHandler);\n this.tech_.on(timerCancelEvents, cancelTimerHandler);\n this.tech_.on('canplay', canPlayHandler);\n /*\n An edge case exists that results in gaps not being skipped when they exist at the beginning of a stream. This case\n is surfaced in one of two ways:\n 1) The `waiting` event is fired before the player has buffered content, making it impossible\n to find or skip the gap. The `waiting` event is followed by a `play` event. On first play\n we can check if playback is stalled due to a gap, and skip the gap if necessary.\n 2) A source with a gap at the beginning of the stream is loaded programatically while the player\n is in a playing state. To catch this case, it's important that our one-time play listener is setup\n even if the player is in a playing state\n */\n\n this.tech_.one('play', playHandler); // Define the dispose function to clean up our events\n\n this.dispose = () => {\n this.clearSeekingAppendCheck_();\n this.logger_('dispose');\n this.tech_.off('waiting', waitingHandler);\n this.tech_.off(timerCancelEvents, cancelTimerHandler);\n this.tech_.off('canplay', canPlayHandler);\n this.tech_.off('play', playHandler);\n this.tech_.off('seeking', this.watchForBadSeeking_);\n this.tech_.off('seeked', this.clearSeekingAppendCheck_);\n loaderTypes.forEach(type => {\n pc[`${type}SegmentLoader_`].off('appendsdone', loaderChecks[type].updateend);\n pc[`${type}SegmentLoader_`].off('playlistupdate', loaderChecks[type].reset);\n this.tech_.off(['seeked', 'seeking'], loaderChecks[type].reset);\n });\n if (this.checkCurrentTimeTimeout_) {\n window$1.clearTimeout(this.checkCurrentTimeTimeout_);\n }\n this.resetTimeUpdate_();\n };\n }\n /**\n * Periodically check current time to see if playback stopped\n *\n * @private\n */\n\n monitorCurrentTime_() {\n this.checkCurrentTime_();\n if (this.checkCurrentTimeTimeout_) {\n window$1.clearTimeout(this.checkCurrentTimeTimeout_);\n } // 42 = 24 fps // 250 is what Webkit uses // FF uses 15\n\n this.checkCurrentTimeTimeout_ = window$1.setTimeout(this.monitorCurrentTime_.bind(this), 250);\n }\n /**\n * Reset stalled download stats for a specific type of loader\n *\n * @param {string} type\n * The segment loader type to check.\n *\n * @listens SegmentLoader#playlistupdate\n * @listens Tech#seeking\n * @listens Tech#seeked\n */\n\n resetSegmentDownloads_(type) {\n const loader = this.playlistController_[`${type}SegmentLoader_`];\n if (this[`${type}StalledDownloads_`] > 0) {\n this.logger_(`resetting possible stalled download count for ${type} loader`);\n }\n this[`${type}StalledDownloads_`] = 0;\n this[`${type}Buffered_`] = loader.buffered_();\n }\n /**\n * Checks on every segment `appendsdone` to see\n * if segment appends are making progress. If they are not\n * and we are still downloading bytes. We exclude the playlist.\n *\n * @param {string} type\n * The segment loader type to check.\n *\n * @listens SegmentLoader#appendsdone\n */\n\n checkSegmentDownloads_(type) {\n const pc = this.playlistController_;\n const loader = pc[`${type}SegmentLoader_`];\n const buffered = loader.buffered_();\n const isBufferedDifferent = isRangeDifferent(this[`${type}Buffered_`], buffered);\n this[`${type}Buffered_`] = buffered; // if another watcher is going to fix the issue or\n // the buffered value for this loader changed\n // appends are working\n\n if (isBufferedDifferent) {\n const metadata = {\n bufferedRanges: buffered\n };\n pc.trigger({\n type: 'bufferedrangeschanged',\n metadata\n });\n this.resetSegmentDownloads_(type);\n return;\n }\n this[`${type}StalledDownloads_`]++;\n this.logger_(`found #${this[`${type}StalledDownloads_`]} ${type} appends that did not increase buffer (possible stalled download)`, {\n playlistId: loader.playlist_ && loader.playlist_.id,\n buffered: timeRangesToArray(buffered)\n }); // after 10 possibly stalled appends with no reset, exclude\n\n if (this[`${type}StalledDownloads_`] < 10) {\n return;\n }\n this.logger_(`${type} loader stalled download exclusion`);\n this.resetSegmentDownloads_(type);\n this.tech_.trigger({\n type: 'usage',\n name: `vhs-${type}-download-exclusion`\n });\n if (type === 'subtitle') {\n return;\n } // TODO: should we exclude audio tracks rather than main tracks\n // when type is audio?\n\n pc.excludePlaylist({\n error: {\n message: `Excessive ${type} segment downloading detected.`\n },\n playlistExclusionDuration: Infinity\n });\n }\n /**\n * The purpose of this function is to emulate the \"waiting\" event on\n * browsers that do not emit it when they are waiting for more\n * data to continue playback\n *\n * @private\n */\n\n checkCurrentTime_() {\n if (this.tech_.paused() || this.tech_.seeking()) {\n return;\n }\n const currentTime = this.tech_.currentTime();\n const buffered = this.tech_.buffered();\n if (this.lastRecordedTime === currentTime && (!buffered.length || currentTime + SAFE_TIME_DELTA >= buffered.end(buffered.length - 1))) {\n // If current time is at the end of the final buffered region, then any playback\n // stall is most likely caused by buffering in a low bandwidth environment. The tech\n // should fire a `waiting` event in this scenario, but due to browser and tech\n // inconsistencies. Calling `techWaiting_` here allows us to simulate\n // responding to a native `waiting` event when the tech fails to emit one.\n return this.techWaiting_();\n }\n if (this.consecutiveUpdates >= 5 && currentTime === this.lastRecordedTime) {\n this.consecutiveUpdates++;\n this.waiting_();\n } else if (currentTime === this.lastRecordedTime) {\n this.consecutiveUpdates++;\n } else {\n this.playedRanges_.push(createTimeRanges([this.lastRecordedTime, currentTime]));\n const metadata = {\n playedRanges: this.playedRanges_\n };\n this.playlistController_.trigger({\n type: 'playedrangeschanged',\n metadata\n });\n this.consecutiveUpdates = 0;\n this.lastRecordedTime = currentTime;\n }\n }\n /**\n * Resets the 'timeupdate' mechanism designed to detect that we are stalled\n *\n * @private\n */\n\n resetTimeUpdate_() {\n this.consecutiveUpdates = 0;\n }\n /**\n * Fixes situations where there's a bad seek\n *\n * @return {boolean} whether an action was taken to fix the seek\n * @private\n */\n\n fixesBadSeeks_() {\n const seeking = this.tech_.seeking();\n if (!seeking) {\n return false;\n } // TODO: It's possible that these seekable checks should be moved out of this function\n // and into a function that runs on seekablechange. It's also possible that we only need\n // afterSeekableWindow as the buffered check at the bottom is good enough to handle before\n // seekable range.\n\n const seekable = this.seekable();\n const currentTime = this.tech_.currentTime();\n const isAfterSeekableRange = this.afterSeekableWindow_(seekable, currentTime, this.media(), this.allowSeeksWithinUnsafeLiveWindow);\n let seekTo;\n if (isAfterSeekableRange) {\n const seekableEnd = seekable.end(seekable.length - 1); // sync to live point (if VOD, our seekable was updated and we're simply adjusting)\n\n seekTo = seekableEnd;\n }\n if (this.beforeSeekableWindow_(seekable, currentTime)) {\n const seekableStart = seekable.start(0); // sync to the beginning of the live window\n // provide a buffer of .1 seconds to handle rounding/imprecise numbers\n\n seekTo = seekableStart + (\n // if the playlist is too short and the seekable range is an exact time (can\n // happen in live with a 3 segment playlist), then don't use a time delta\n seekableStart === seekable.end(0) ? 0 : SAFE_TIME_DELTA);\n }\n if (typeof seekTo !== 'undefined') {\n this.logger_(`Trying to seek outside of seekable at time ${currentTime} with ` + `seekable range ${printableRange(seekable)}. Seeking to ` + `${seekTo}.`);\n this.tech_.setCurrentTime(seekTo);\n return true;\n }\n const sourceUpdater = this.playlistController_.sourceUpdater_;\n const buffered = this.tech_.buffered();\n const audioBuffered = sourceUpdater.audioBuffer ? sourceUpdater.audioBuffered() : null;\n const videoBuffered = sourceUpdater.videoBuffer ? sourceUpdater.videoBuffered() : null;\n const media = this.media(); // verify that at least two segment durations or one part duration have been\n // appended before checking for a gap.\n\n const minAppendedDuration = media.partTargetDuration ? media.partTargetDuration : (media.targetDuration - TIME_FUDGE_FACTOR) * 2; // verify that at least two segment durations have been\n // appended before checking for a gap.\n\n const bufferedToCheck = [audioBuffered, videoBuffered];\n for (let i = 0; i < bufferedToCheck.length; i++) {\n // skip null buffered\n if (!bufferedToCheck[i]) {\n continue;\n }\n const timeAhead = timeAheadOf(bufferedToCheck[i], currentTime); // if we are less than two video/audio segment durations or one part\n // duration behind we haven't appended enough to call this a bad seek.\n\n if (timeAhead < minAppendedDuration) {\n return false;\n }\n }\n const nextRange = findNextRange(buffered, currentTime); // we have appended enough content, but we don't have anything buffered\n // to seek over the gap\n\n if (nextRange.length === 0) {\n return false;\n }\n seekTo = nextRange.start(0) + SAFE_TIME_DELTA;\n this.logger_(`Buffered region starts (${nextRange.start(0)}) ` + ` just beyond seek point (${currentTime}). Seeking to ${seekTo}.`);\n this.tech_.setCurrentTime(seekTo);\n return true;\n }\n /**\n * Handler for situations when we determine the player is waiting.\n *\n * @private\n */\n\n waiting_() {\n if (this.techWaiting_()) {\n return;\n } // All tech waiting checks failed. Use last resort correction\n\n const currentTime = this.tech_.currentTime();\n const buffered = this.tech_.buffered();\n const currentRange = findRange(buffered, currentTime); // Sometimes the player can stall for unknown reasons within a contiguous buffered\n // region with no indication that anything is amiss (seen in Firefox). Seeking to\n // currentTime is usually enough to kickstart the player. This checks that the player\n // is currently within a buffered region before attempting a corrective seek.\n // Chrome does not appear to continue `timeupdate` events after a `waiting` event\n // until there is ~ 3 seconds of forward buffer available. PlaybackWatcher should also\n // make sure there is ~3 seconds of forward buffer before taking any corrective action\n // to avoid triggering an `unknownwaiting` event when the network is slow.\n\n if (currentRange.length && currentTime + 3 <= currentRange.end(0)) {\n this.resetTimeUpdate_();\n this.tech_.setCurrentTime(currentTime);\n this.logger_(`Stopped at ${currentTime} while inside a buffered region ` + `[${currentRange.start(0)} -> ${currentRange.end(0)}]. Attempting to resume ` + 'playback by seeking to the current time.'); // unknown waiting corrections may be useful for monitoring QoS\n\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-unknown-waiting'\n });\n return;\n }\n }\n /**\n * Handler for situations when the tech fires a `waiting` event\n *\n * @return {boolean}\n * True if an action (or none) was needed to correct the waiting. False if no\n * checks passed\n * @private\n */\n\n techWaiting_() {\n const seekable = this.seekable();\n const currentTime = this.tech_.currentTime();\n if (this.tech_.seeking()) {\n // Tech is seeking or already waiting on another action, no action needed\n return true;\n }\n if (this.beforeSeekableWindow_(seekable, currentTime)) {\n const livePoint = seekable.end(seekable.length - 1);\n this.logger_(`Fell out of live window at time ${currentTime}. Seeking to ` + `live point (seekable end) ${livePoint}`);\n this.resetTimeUpdate_();\n this.tech_.setCurrentTime(livePoint); // live window resyncs may be useful for monitoring QoS\n\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-live-resync'\n });\n return true;\n }\n const sourceUpdater = this.tech_.vhs.playlistController_.sourceUpdater_;\n const buffered = this.tech_.buffered();\n const videoUnderflow = this.videoUnderflow_({\n audioBuffered: sourceUpdater.audioBuffered(),\n videoBuffered: sourceUpdater.videoBuffered(),\n currentTime\n });\n if (videoUnderflow) {\n // Even though the video underflowed and was stuck in a gap, the audio overplayed\n // the gap, leading currentTime into a buffered range. Seeking to currentTime\n // allows the video to catch up to the audio position without losing any audio\n // (only suffering ~3 seconds of frozen video and a pause in audio playback).\n this.resetTimeUpdate_();\n this.tech_.setCurrentTime(currentTime); // video underflow may be useful for monitoring QoS\n\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-video-underflow'\n });\n return true;\n }\n const nextRange = findNextRange(buffered, currentTime); // check for gap\n\n if (nextRange.length > 0) {\n this.logger_(`Stopped at ${currentTime} and seeking to ${nextRange.start(0)}`);\n this.resetTimeUpdate_();\n this.skipTheGap_(currentTime);\n return true;\n } // All checks failed. Returning false to indicate failure to correct waiting\n\n return false;\n }\n afterSeekableWindow_(seekable, currentTime, playlist, allowSeeksWithinUnsafeLiveWindow = false) {\n if (!seekable.length) {\n // we can't make a solid case if there's no seekable, default to false\n return false;\n }\n let allowedEnd = seekable.end(seekable.length - 1) + SAFE_TIME_DELTA;\n const isLive = !playlist.endList;\n const isLLHLS = typeof playlist.partTargetDuration === 'number';\n if (isLive && (isLLHLS || allowSeeksWithinUnsafeLiveWindow)) {\n allowedEnd = seekable.end(seekable.length - 1) + playlist.targetDuration * 3;\n }\n if (currentTime > allowedEnd) {\n return true;\n }\n return false;\n }\n beforeSeekableWindow_(seekable, currentTime) {\n if (seekable.length &&\n // can't fall before 0 and 0 seekable start identifies VOD stream\n seekable.start(0) > 0 && currentTime < seekable.start(0) - this.liveRangeSafeTimeDelta) {\n return true;\n }\n return false;\n }\n videoUnderflow_({\n videoBuffered,\n audioBuffered,\n currentTime\n }) {\n // audio only content will not have video underflow :)\n if (!videoBuffered) {\n return;\n }\n let gap; // find a gap in demuxed content.\n\n if (videoBuffered.length && audioBuffered.length) {\n // in Chrome audio will continue to play for ~3s when we run out of video\n // so we have to check that the video buffer did have some buffer in the\n // past.\n const lastVideoRange = findRange(videoBuffered, currentTime - 3);\n const videoRange = findRange(videoBuffered, currentTime);\n const audioRange = findRange(audioBuffered, currentTime);\n if (audioRange.length && !videoRange.length && lastVideoRange.length) {\n gap = {\n start: lastVideoRange.end(0),\n end: audioRange.end(0)\n };\n } // find a gap in muxed content.\n } else {\n const nextRange = findNextRange(videoBuffered, currentTime); // Even if there is no available next range, there is still a possibility we are\n // stuck in a gap due to video underflow.\n\n if (!nextRange.length) {\n gap = this.gapFromVideoUnderflow_(videoBuffered, currentTime);\n }\n }\n if (gap) {\n this.logger_(`Encountered a gap in video from ${gap.start} to ${gap.end}. ` + `Seeking to current time ${currentTime}`);\n return true;\n }\n return false;\n }\n /**\n * Timer callback. If playback still has not proceeded, then we seek\n * to the start of the next buffered region.\n *\n * @private\n */\n\n skipTheGap_(scheduledCurrentTime) {\n const buffered = this.tech_.buffered();\n const currentTime = this.tech_.currentTime();\n const nextRange = findNextRange(buffered, currentTime);\n this.resetTimeUpdate_();\n if (nextRange.length === 0 || currentTime !== scheduledCurrentTime) {\n return;\n }\n this.logger_('skipTheGap_:', 'currentTime:', currentTime, 'scheduled currentTime:', scheduledCurrentTime, 'nextRange start:', nextRange.start(0)); // only seek if we still have not played\n\n this.tech_.setCurrentTime(nextRange.start(0) + TIME_FUDGE_FACTOR);\n const metadata = {\n gapInfo: {\n from: currentTime,\n to: nextRange.start(0)\n }\n };\n this.playlistController_.trigger({\n type: 'gapjumped',\n metadata\n });\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-gap-skip'\n });\n }\n gapFromVideoUnderflow_(buffered, currentTime) {\n // At least in Chrome, if there is a gap in the video buffer, the audio will continue\n // playing for ~3 seconds after the video gap starts. This is done to account for\n // video buffer underflow/underrun (note that this is not done when there is audio\n // buffer underflow/underrun -- in that case the video will stop as soon as it\n // encounters the gap, as audio stalls are more noticeable/jarring to a user than\n // video stalls). The player's time will reflect the playthrough of audio, so the\n // time will appear as if we are in a buffered region, even if we are stuck in a\n // \"gap.\"\n //\n // Example:\n // video buffer: 0 => 10.1, 10.2 => 20\n // audio buffer: 0 => 20\n // overall buffer: 0 => 10.1, 10.2 => 20\n // current time: 13\n //\n // Chrome's video froze at 10 seconds, where the video buffer encountered the gap,\n // however, the audio continued playing until it reached ~3 seconds past the gap\n // (13 seconds), at which point it stops as well. Since current time is past the\n // gap, findNextRange will return no ranges.\n //\n // To check for this issue, we see if there is a gap that starts somewhere within\n // a 3 second range (3 seconds +/- 1 second) back from our current time.\n const gaps = findGaps(buffered);\n for (let i = 0; i < gaps.length; i++) {\n const start = gaps.start(i);\n const end = gaps.end(i); // gap is starts no more than 4 seconds back\n\n if (currentTime - start < 4 && currentTime - start > 2) {\n return {\n start,\n end\n };\n }\n }\n return null;\n }\n}\nconst defaultOptions = {\n errorInterval: 30,\n getSource(next) {\n const tech = this.tech({\n IWillNotUseThisInPlugins: true\n });\n const sourceObj = tech.currentSource_ || this.currentSource();\n return next(sourceObj);\n }\n};\n/**\n * Main entry point for the plugin\n *\n * @param {Player} player a reference to a videojs Player instance\n * @param {Object} [options] an object with plugin options\n * @private\n */\n\nconst initPlugin = function (player, options) {\n let lastCalled = 0;\n let seekTo = 0;\n const localOptions = merge(defaultOptions, options);\n player.ready(() => {\n player.trigger({\n type: 'usage',\n name: 'vhs-error-reload-initialized'\n });\n });\n /**\n * Player modifications to perform that must wait until `loadedmetadata`\n * has been triggered\n *\n * @private\n */\n\n const loadedMetadataHandler = function () {\n if (seekTo) {\n player.currentTime(seekTo);\n }\n };\n /**\n * Set the source on the player element, play, and seek if necessary\n *\n * @param {Object} sourceObj An object specifying the source url and mime-type to play\n * @private\n */\n\n const setSource = function (sourceObj) {\n if (sourceObj === null || sourceObj === undefined) {\n return;\n }\n seekTo = player.duration() !== Infinity && player.currentTime() || 0;\n player.one('loadedmetadata', loadedMetadataHandler);\n player.src(sourceObj);\n player.trigger({\n type: 'usage',\n name: 'vhs-error-reload'\n });\n player.play();\n };\n /**\n * Attempt to get a source from either the built-in getSource function\n * or a custom function provided via the options\n *\n * @private\n */\n\n const errorHandler = function () {\n // Do not attempt to reload the source if a source-reload occurred before\n // 'errorInterval' time has elapsed since the last source-reload\n if (Date.now() - lastCalled < localOptions.errorInterval * 1000) {\n player.trigger({\n type: 'usage',\n name: 'vhs-error-reload-canceled'\n });\n return;\n }\n if (!localOptions.getSource || typeof localOptions.getSource !== 'function') {\n videojs.log.error('ERROR: reloadSourceOnError - The option getSource must be a function!');\n return;\n }\n lastCalled = Date.now();\n return localOptions.getSource.call(player, setSource);\n };\n /**\n * Unbind any event handlers that were bound by the plugin\n *\n * @private\n */\n\n const cleanupEvents = function () {\n player.off('loadedmetadata', loadedMetadataHandler);\n player.off('error', errorHandler);\n player.off('dispose', cleanupEvents);\n };\n /**\n * Cleanup before re-initializing the plugin\n *\n * @param {Object} [newOptions] an object with plugin options\n * @private\n */\n\n const reinitPlugin = function (newOptions) {\n cleanupEvents();\n initPlugin(player, newOptions);\n };\n player.on('error', errorHandler);\n player.on('dispose', cleanupEvents); // Overwrite the plugin function so that we can correctly cleanup before\n // initializing the plugin\n\n player.reloadSourceOnError = reinitPlugin;\n};\n/**\n * Reload the source when an error is detected as long as there\n * wasn't an error previously within the last 30 seconds\n *\n * @param {Object} [options] an object with plugin options\n */\n\nconst reloadSourceOnError = function (options) {\n initPlugin(this, options);\n};\nvar version$4 = \"3.13.1\";\nvar version$3 = \"7.0.3\";\nvar version$2 = \"1.3.0\";\nvar version$1 = \"7.1.0\";\nvar version = \"4.0.1\";\nconst Vhs = {\n PlaylistLoader,\n Playlist,\n utils,\n STANDARD_PLAYLIST_SELECTOR: lastBandwidthSelector,\n INITIAL_PLAYLIST_SELECTOR: lowestBitrateCompatibleVariantSelector,\n lastBandwidthSelector,\n movingAverageBandwidthSelector,\n comparePlaylistBandwidth,\n comparePlaylistResolution,\n xhr: xhrFactory()\n}; // Define getter/setters for config properties\n\nObject.keys(Config).forEach(prop => {\n Object.defineProperty(Vhs, prop, {\n get() {\n videojs.log.warn(`using Vhs.${prop} is UNSAFE be sure you know what you are doing`);\n return Config[prop];\n },\n set(value) {\n videojs.log.warn(`using Vhs.${prop} is UNSAFE be sure you know what you are doing`);\n if (typeof value !== 'number' || value < 0) {\n videojs.log.warn(`value of Vhs.${prop} must be greater than or equal to 0`);\n return;\n }\n Config[prop] = value;\n }\n });\n});\nconst LOCAL_STORAGE_KEY = 'videojs-vhs';\n/**\n * Updates the selectedIndex of the QualityLevelList when a mediachange happens in vhs.\n *\n * @param {QualityLevelList} qualityLevels The QualityLevelList to update.\n * @param {PlaylistLoader} playlistLoader PlaylistLoader containing the new media info.\n * @function handleVhsMediaChange\n */\n\nconst handleVhsMediaChange = function (qualityLevels, playlistLoader) {\n const newPlaylist = playlistLoader.media();\n let selectedIndex = -1;\n for (let i = 0; i < qualityLevels.length; i++) {\n if (qualityLevels[i].id === newPlaylist.id) {\n selectedIndex = i;\n break;\n }\n }\n qualityLevels.selectedIndex_ = selectedIndex;\n qualityLevels.trigger({\n selectedIndex,\n type: 'change'\n });\n};\n/**\n * Adds quality levels to list once playlist metadata is available\n *\n * @param {QualityLevelList} qualityLevels The QualityLevelList to attach events to.\n * @param {Object} vhs Vhs object to listen to for media events.\n * @function handleVhsLoadedMetadata\n */\n\nconst handleVhsLoadedMetadata = function (qualityLevels, vhs) {\n vhs.representations().forEach(rep => {\n qualityLevels.addQualityLevel(rep);\n });\n handleVhsMediaChange(qualityLevels, vhs.playlists);\n}; // VHS is a source handler, not a tech. Make sure attempts to use it\n// as one do not cause exceptions.\n\nVhs.canPlaySource = function () {\n return videojs.log.warn('VHS is no longer a tech. Please remove it from ' + 'your player\\'s techOrder.');\n};\nconst emeKeySystems = (keySystemOptions, mainPlaylist, audioPlaylist) => {\n if (!keySystemOptions) {\n return keySystemOptions;\n }\n let codecs = {};\n if (mainPlaylist && mainPlaylist.attributes && mainPlaylist.attributes.CODECS) {\n codecs = unwrapCodecList(parseCodecs(mainPlaylist.attributes.CODECS));\n }\n if (audioPlaylist && audioPlaylist.attributes && audioPlaylist.attributes.CODECS) {\n codecs.audio = audioPlaylist.attributes.CODECS;\n }\n const videoContentType = getMimeForCodec(codecs.video);\n const audioContentType = getMimeForCodec(codecs.audio); // upsert the content types based on the selected playlist\n\n const keySystemContentTypes = {};\n for (const keySystem in keySystemOptions) {\n keySystemContentTypes[keySystem] = {};\n if (audioContentType) {\n keySystemContentTypes[keySystem].audioContentType = audioContentType;\n }\n if (videoContentType) {\n keySystemContentTypes[keySystem].videoContentType = videoContentType;\n } // Default to using the video playlist's PSSH even though they may be different, as\n // videojs-contrib-eme will only accept one in the options.\n //\n // This shouldn't be an issue for most cases as early intialization will handle all\n // unique PSSH values, and if they aren't, then encrypted events should have the\n // specific information needed for the unique license.\n\n if (mainPlaylist.contentProtection && mainPlaylist.contentProtection[keySystem] && mainPlaylist.contentProtection[keySystem].pssh) {\n keySystemContentTypes[keySystem].pssh = mainPlaylist.contentProtection[keySystem].pssh;\n } // videojs-contrib-eme accepts the option of specifying: 'com.some.cdm': 'url'\n // so we need to prevent overwriting the URL entirely\n\n if (typeof keySystemOptions[keySystem] === 'string') {\n keySystemContentTypes[keySystem].url = keySystemOptions[keySystem];\n }\n }\n return merge(keySystemOptions, keySystemContentTypes);\n};\n/**\n * @typedef {Object} KeySystems\n *\n * keySystems configuration for https://github.com/videojs/videojs-contrib-eme\n * Note: not all options are listed here.\n *\n * @property {Uint8Array} [pssh]\n * Protection System Specific Header\n */\n\n/**\n * Goes through all the playlists and collects an array of KeySystems options objects\n * containing each playlist's keySystems and their pssh values, if available.\n *\n * @param {Object[]} playlists\n * The playlists to look through\n * @param {string[]} keySystems\n * The keySystems to collect pssh values for\n *\n * @return {KeySystems[]}\n * An array of KeySystems objects containing available key systems and their\n * pssh values\n */\n\nconst getAllPsshKeySystemsOptions = (playlists, keySystems) => {\n return playlists.reduce((keySystemsArr, playlist) => {\n if (!playlist.contentProtection) {\n return keySystemsArr;\n }\n const keySystemsOptions = keySystems.reduce((keySystemsObj, keySystem) => {\n const keySystemOptions = playlist.contentProtection[keySystem];\n if (keySystemOptions && keySystemOptions.pssh) {\n keySystemsObj[keySystem] = {\n pssh: keySystemOptions.pssh\n };\n }\n return keySystemsObj;\n }, {});\n if (Object.keys(keySystemsOptions).length) {\n keySystemsArr.push(keySystemsOptions);\n }\n return keySystemsArr;\n }, []);\n};\n/**\n * Returns a promise that waits for the\n * [eme plugin](https://github.com/videojs/videojs-contrib-eme) to create a key session.\n *\n * Works around https://bugs.chromium.org/p/chromium/issues/detail?id=895449 in non-IE11\n * browsers.\n *\n * As per the above ticket, this is particularly important for Chrome, where, if\n * unencrypted content is appended before encrypted content and the key session has not\n * been created, a MEDIA_ERR_DECODE will be thrown once the encrypted content is reached\n * during playback.\n *\n * @param {Object} player\n * The player instance\n * @param {Object[]} sourceKeySystems\n * The key systems options from the player source\n * @param {Object} [audioMedia]\n * The active audio media playlist (optional)\n * @param {Object[]} mainPlaylists\n * The playlists found on the main playlist object\n *\n * @return {Object}\n * Promise that resolves when the key session has been created\n */\n\nconst waitForKeySessionCreation = ({\n player,\n sourceKeySystems,\n audioMedia,\n mainPlaylists\n}) => {\n if (!player.eme.initializeMediaKeys) {\n return Promise.resolve();\n } // TODO should all audio PSSH values be initialized for DRM?\n //\n // All unique video rendition pssh values are initialized for DRM, but here only\n // the initial audio playlist license is initialized. In theory, an encrypted\n // event should be fired if the user switches to an alternative audio playlist\n // where a license is required, but this case hasn't yet been tested. In addition, there\n // may be many alternate audio playlists unlikely to be used (e.g., multiple different\n // languages).\n\n const playlists = audioMedia ? mainPlaylists.concat([audioMedia]) : mainPlaylists;\n const keySystemsOptionsArr = getAllPsshKeySystemsOptions(playlists, Object.keys(sourceKeySystems));\n const initializationFinishedPromises = [];\n const keySessionCreatedPromises = []; // Since PSSH values are interpreted as initData, EME will dedupe any duplicates. The\n // only place where it should not be deduped is for ms-prefixed APIs, but\n // the existence of modern EME APIs in addition to\n // ms-prefixed APIs on Edge should prevent this from being a concern.\n // initializeMediaKeys also won't use the webkit-prefixed APIs.\n\n keySystemsOptionsArr.forEach(keySystemsOptions => {\n keySessionCreatedPromises.push(new Promise((resolve, reject) => {\n player.tech_.one('keysessioncreated', resolve);\n }));\n initializationFinishedPromises.push(new Promise((resolve, reject) => {\n player.eme.initializeMediaKeys({\n keySystems: keySystemsOptions\n }, err => {\n if (err) {\n reject(err);\n return;\n }\n resolve();\n });\n }));\n }); // The reasons Promise.race is chosen over Promise.any:\n //\n // * Promise.any is only available in Safari 14+.\n // * None of these promises are expected to reject. If they do reject, it might be\n // better here for the race to surface the rejection, rather than mask it by using\n // Promise.any.\n\n return Promise.race([\n // If a session was previously created, these will all finish resolving without\n // creating a new session, otherwise it will take until the end of all license\n // requests, which is why the key session check is used (to make setup much faster).\n Promise.all(initializationFinishedPromises),\n // Once a single session is created, the browser knows DRM will be used.\n Promise.race(keySessionCreatedPromises)]);\n};\n/**\n * If the [eme](https://github.com/videojs/videojs-contrib-eme) plugin is available, and\n * there are keySystems on the source, sets up source options to prepare the source for\n * eme.\n *\n * @param {Object} player\n * The player instance\n * @param {Object[]} sourceKeySystems\n * The key systems options from the player source\n * @param {Object} media\n * The active media playlist\n * @param {Object} [audioMedia]\n * The active audio media playlist (optional)\n *\n * @return {boolean}\n * Whether or not options were configured and EME is available\n */\n\nconst setupEmeOptions = ({\n player,\n sourceKeySystems,\n media,\n audioMedia\n}) => {\n const sourceOptions = emeKeySystems(sourceKeySystems, media, audioMedia);\n if (!sourceOptions) {\n return false;\n }\n player.currentSource().keySystems = sourceOptions; // eme handles the rest of the setup, so if it is missing\n // do nothing.\n\n if (sourceOptions && !player.eme) {\n videojs.log.warn('DRM encrypted source cannot be decrypted without a DRM plugin');\n return false;\n }\n return true;\n};\nconst getVhsLocalStorage = () => {\n if (!window$1.localStorage) {\n return null;\n }\n const storedObject = window$1.localStorage.getItem(LOCAL_STORAGE_KEY);\n if (!storedObject) {\n return null;\n }\n try {\n return JSON.parse(storedObject);\n } catch (e) {\n // someone may have tampered with the value\n return null;\n }\n};\nconst updateVhsLocalStorage = options => {\n if (!window$1.localStorage) {\n return false;\n }\n let objectToStore = getVhsLocalStorage();\n objectToStore = objectToStore ? merge(objectToStore, options) : options;\n try {\n window$1.localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(objectToStore));\n } catch (e) {\n // Throws if storage is full (e.g., always on iOS 5+ Safari private mode, where\n // storage is set to 0).\n // https://developer.mozilla.org/en-US/docs/Web/API/Storage/setItem#Exceptions\n // No need to perform any operation.\n return false;\n }\n return objectToStore;\n};\n/**\n * Parses VHS-supported media types from data URIs. See\n * https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\n * for information on data URIs.\n *\n * @param {string} dataUri\n * The data URI\n *\n * @return {string|Object}\n * The parsed object/string, or the original string if no supported media type\n * was found\n */\n\nconst expandDataUri = dataUri => {\n if (dataUri.toLowerCase().indexOf('data:application/vnd.videojs.vhs+json,') === 0) {\n return JSON.parse(dataUri.substring(dataUri.indexOf(',') + 1));\n } // no known case for this data URI, return the string as-is\n\n return dataUri;\n};\n/**\n * Adds a request hook to an xhr object\n *\n * @param {Object} xhr object to add the onRequest hook to\n * @param {function} callback hook function for an xhr request\n */\n\nconst addOnRequestHook = (xhr, callback) => {\n if (!xhr._requestCallbackSet) {\n xhr._requestCallbackSet = new Set();\n }\n xhr._requestCallbackSet.add(callback);\n};\n/**\n * Adds a response hook to an xhr object\n *\n * @param {Object} xhr object to add the onResponse hook to\n * @param {function} callback hook function for an xhr response\n */\n\nconst addOnResponseHook = (xhr, callback) => {\n if (!xhr._responseCallbackSet) {\n xhr._responseCallbackSet = new Set();\n }\n xhr._responseCallbackSet.add(callback);\n};\n/**\n * Removes a request hook on an xhr object, deletes the onRequest set if empty.\n *\n * @param {Object} xhr object to remove the onRequest hook from\n * @param {function} callback hook function to remove\n */\n\nconst removeOnRequestHook = (xhr, callback) => {\n if (!xhr._requestCallbackSet) {\n return;\n }\n xhr._requestCallbackSet.delete(callback);\n if (!xhr._requestCallbackSet.size) {\n delete xhr._requestCallbackSet;\n }\n};\n/**\n * Removes a response hook on an xhr object, deletes the onResponse set if empty.\n *\n * @param {Object} xhr object to remove the onResponse hook from\n * @param {function} callback hook function to remove\n */\n\nconst removeOnResponseHook = (xhr, callback) => {\n if (!xhr._responseCallbackSet) {\n return;\n }\n xhr._responseCallbackSet.delete(callback);\n if (!xhr._responseCallbackSet.size) {\n delete xhr._responseCallbackSet;\n }\n};\n/**\n * Whether the browser has built-in HLS support.\n */\n\nVhs.supportsNativeHls = function () {\n if (!document$1 || !document$1.createElement) {\n return false;\n }\n const video = document$1.createElement('video'); // native HLS is definitely not supported if HTML5 video isn't\n\n if (!videojs.getTech('Html5').isSupported()) {\n return false;\n } // HLS manifests can go by many mime-types\n\n const canPlay = [\n // Apple santioned\n 'application/vnd.apple.mpegurl',\n // Apple sanctioned for backwards compatibility\n 'audio/mpegurl',\n // Very common\n 'audio/x-mpegurl',\n // Very common\n 'application/x-mpegurl',\n // Included for completeness\n 'video/x-mpegurl', 'video/mpegurl', 'application/mpegurl'];\n return canPlay.some(function (canItPlay) {\n return /maybe|probably/i.test(video.canPlayType(canItPlay));\n });\n}();\nVhs.supportsNativeDash = function () {\n if (!document$1 || !document$1.createElement || !videojs.getTech('Html5').isSupported()) {\n return false;\n }\n return /maybe|probably/i.test(document$1.createElement('video').canPlayType('application/dash+xml'));\n}();\nVhs.supportsTypeNatively = type => {\n if (type === 'hls') {\n return Vhs.supportsNativeHls;\n }\n if (type === 'dash') {\n return Vhs.supportsNativeDash;\n }\n return false;\n};\n/**\n * VHS is a source handler, not a tech. Make sure attempts to use it\n * as one do not cause exceptions.\n */\n\nVhs.isSupported = function () {\n return videojs.log.warn('VHS is no longer a tech. Please remove it from ' + 'your player\\'s techOrder.');\n};\n/**\n * A global function for setting an onRequest hook\n *\n * @param {function} callback for request modifiction\n */\n\nVhs.xhr.onRequest = function (callback) {\n addOnRequestHook(Vhs.xhr, callback);\n};\n/**\n * A global function for setting an onResponse hook\n *\n * @param {callback} callback for response data retrieval\n */\n\nVhs.xhr.onResponse = function (callback) {\n addOnResponseHook(Vhs.xhr, callback);\n};\n/**\n * Deletes a global onRequest callback if it exists\n *\n * @param {function} callback to delete from the global set\n */\n\nVhs.xhr.offRequest = function (callback) {\n removeOnRequestHook(Vhs.xhr, callback);\n};\n/**\n * Deletes a global onResponse callback if it exists\n *\n * @param {function} callback to delete from the global set\n */\n\nVhs.xhr.offResponse = function (callback) {\n removeOnResponseHook(Vhs.xhr, callback);\n};\nconst Component = videojs.getComponent('Component');\n/**\n * The Vhs Handler object, where we orchestrate all of the parts\n * of VHS to interact with video.js\n *\n * @class VhsHandler\n * @extends videojs.Component\n * @param {Object} source the soruce object\n * @param {Tech} tech the parent tech object\n * @param {Object} options optional and required options\n */\n\nclass VhsHandler extends Component {\n constructor(source, tech, options) {\n super(tech, options.vhs); // if a tech level `initialBandwidth` option was passed\n // use that over the VHS level `bandwidth` option\n\n if (typeof options.initialBandwidth === 'number') {\n this.options_.bandwidth = options.initialBandwidth;\n }\n this.logger_ = logger('VhsHandler'); // we need access to the player in some cases,\n // so, get it from Video.js via the `playerId`\n\n if (tech.options_ && tech.options_.playerId) {\n const _player = videojs.getPlayer(tech.options_.playerId);\n this.player_ = _player;\n }\n this.tech_ = tech;\n this.source_ = source;\n this.stats = {};\n this.ignoreNextSeekingEvent_ = false;\n this.setOptions_();\n if (this.options_.overrideNative && tech.overrideNativeAudioTracks && tech.overrideNativeVideoTracks) {\n tech.overrideNativeAudioTracks(true);\n tech.overrideNativeVideoTracks(true);\n } else if (this.options_.overrideNative && (tech.featuresNativeVideoTracks || tech.featuresNativeAudioTracks)) {\n // overriding native VHS only works if audio tracks have been emulated\n // error early if we're misconfigured\n throw new Error('Overriding native VHS requires emulated tracks. ' + 'See https://git.io/vMpjB');\n } // listen for fullscreenchange events for this player so that we\n // can adjust our quality selection quickly\n\n this.on(document$1, ['fullscreenchange', 'webkitfullscreenchange', 'mozfullscreenchange', 'MSFullscreenChange'], event => {\n const fullscreenElement = document$1.fullscreenElement || document$1.webkitFullscreenElement || document$1.mozFullScreenElement || document$1.msFullscreenElement;\n if (fullscreenElement && fullscreenElement.contains(this.tech_.el())) {\n this.playlistController_.fastQualityChange_();\n } else {\n // When leaving fullscreen, since the in page pixel dimensions should be smaller\n // than full screen, see if there should be a rendition switch down to preserve\n // bandwidth.\n this.playlistController_.checkABR_();\n }\n });\n this.on(this.tech_, 'seeking', function () {\n if (this.ignoreNextSeekingEvent_) {\n this.ignoreNextSeekingEvent_ = false;\n return;\n }\n this.setCurrentTime(this.tech_.currentTime());\n });\n this.on(this.tech_, 'error', function () {\n // verify that the error was real and we are loaded\n // enough to have pc loaded.\n if (this.tech_.error() && this.playlistController_) {\n this.playlistController_.pauseLoading();\n }\n });\n this.on(this.tech_, 'play', this.play);\n }\n /**\n * Set VHS options based on options from configuration, as well as partial\n * options to be passed at a later time.\n *\n * @param {Object} options A partial chunk of config options\n */\n\n setOptions_(options = {}) {\n this.options_ = merge(this.options_, options); // defaults\n\n this.options_.withCredentials = this.options_.withCredentials || false;\n this.options_.limitRenditionByPlayerDimensions = this.options_.limitRenditionByPlayerDimensions === false ? false : true;\n this.options_.useDevicePixelRatio = this.options_.useDevicePixelRatio || false;\n this.options_.useBandwidthFromLocalStorage = typeof this.source_.useBandwidthFromLocalStorage !== 'undefined' ? this.source_.useBandwidthFromLocalStorage : this.options_.useBandwidthFromLocalStorage || false;\n this.options_.useForcedSubtitles = this.options_.useForcedSubtitles || false;\n this.options_.useNetworkInformationApi = this.options_.useNetworkInformationApi || false;\n this.options_.useDtsForTimestampOffset = this.options_.useDtsForTimestampOffset || false;\n this.options_.customTagParsers = this.options_.customTagParsers || [];\n this.options_.customTagMappers = this.options_.customTagMappers || [];\n this.options_.cacheEncryptionKeys = this.options_.cacheEncryptionKeys || false;\n this.options_.llhls = this.options_.llhls === false ? false : true;\n this.options_.bufferBasedABR = this.options_.bufferBasedABR || false;\n if (typeof this.options_.playlistExclusionDuration !== 'number') {\n this.options_.playlistExclusionDuration = 60;\n }\n if (typeof this.options_.bandwidth !== 'number') {\n if (this.options_.useBandwidthFromLocalStorage) {\n const storedObject = getVhsLocalStorage();\n if (storedObject && storedObject.bandwidth) {\n this.options_.bandwidth = storedObject.bandwidth;\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-bandwidth-from-local-storage'\n });\n }\n if (storedObject && storedObject.throughput) {\n this.options_.throughput = storedObject.throughput;\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-throughput-from-local-storage'\n });\n }\n }\n } // if bandwidth was not set by options or pulled from local storage, start playlist\n // selection at a reasonable bandwidth\n\n if (typeof this.options_.bandwidth !== 'number') {\n this.options_.bandwidth = Config.INITIAL_BANDWIDTH;\n } // If the bandwidth number is unchanged from the initial setting\n // then this takes precedence over the enableLowInitialPlaylist option\n\n this.options_.enableLowInitialPlaylist = this.options_.enableLowInitialPlaylist && this.options_.bandwidth === Config.INITIAL_BANDWIDTH; // grab options passed to player.src\n\n ['withCredentials', 'useDevicePixelRatio', 'customPixelRatio', 'limitRenditionByPlayerDimensions', 'bandwidth', 'customTagParsers', 'customTagMappers', 'cacheEncryptionKeys', 'playlistSelector', 'initialPlaylistSelector', 'bufferBasedABR', 'liveRangeSafeTimeDelta', 'llhls', 'useForcedSubtitles', 'useNetworkInformationApi', 'useDtsForTimestampOffset', 'exactManifestTimings', 'leastPixelDiffSelector'].forEach(option => {\n if (typeof this.source_[option] !== 'undefined') {\n this.options_[option] = this.source_[option];\n }\n });\n this.limitRenditionByPlayerDimensions = this.options_.limitRenditionByPlayerDimensions;\n this.useDevicePixelRatio = this.options_.useDevicePixelRatio;\n const customPixelRatio = this.options_.customPixelRatio; // Ensure the custom pixel ratio is a number greater than or equal to 0\n\n if (typeof customPixelRatio === 'number' && customPixelRatio >= 0) {\n this.customPixelRatio = customPixelRatio;\n }\n } // alias for public method to set options\n\n setOptions(options = {}) {\n this.setOptions_(options);\n }\n /**\n * called when player.src gets called, handle a new source\n *\n * @param {Object} src the source object to handle\n */\n\n src(src, type) {\n // do nothing if the src is falsey\n if (!src) {\n return;\n }\n this.setOptions_(); // add main playlist controller options\n\n this.options_.src = expandDataUri(this.source_.src);\n this.options_.tech = this.tech_;\n this.options_.externVhs = Vhs;\n this.options_.sourceType = simpleTypeFromSourceType(type); // Whenever we seek internally, we should update the tech\n\n this.options_.seekTo = time => {\n this.tech_.setCurrentTime(time);\n }; // pass player to allow for player level eventing on construction.\n\n this.options_.player_ = this.player_;\n this.playlistController_ = new PlaylistController(this.options_);\n const playbackWatcherOptions = merge({\n liveRangeSafeTimeDelta: SAFE_TIME_DELTA\n }, this.options_, {\n seekable: () => this.seekable(),\n media: () => this.playlistController_.media(),\n playlistController: this.playlistController_\n });\n this.playbackWatcher_ = new PlaybackWatcher(playbackWatcherOptions);\n this.attachStreamingEventListeners_();\n this.playlistController_.on('error', () => {\n const player = videojs.players[this.tech_.options_.playerId];\n let error = this.playlistController_.error;\n if (typeof error === 'object' && !error.code) {\n error.code = 3;\n } else if (typeof error === 'string') {\n error = {\n message: error,\n code: 3\n };\n }\n player.error(error);\n });\n const defaultSelector = this.options_.bufferBasedABR ? Vhs.movingAverageBandwidthSelector(0.55) : Vhs.STANDARD_PLAYLIST_SELECTOR; // `this` in selectPlaylist should be the VhsHandler for backwards\n // compatibility with < v2\n\n this.playlistController_.selectPlaylist = this.selectPlaylist ? this.selectPlaylist.bind(this) : defaultSelector.bind(this);\n this.playlistController_.selectInitialPlaylist = Vhs.INITIAL_PLAYLIST_SELECTOR.bind(this); // re-expose some internal objects for backwards compatibility with < v2\n\n this.playlists = this.playlistController_.mainPlaylistLoader_;\n this.mediaSource = this.playlistController_.mediaSource; // Proxy assignment of some properties to the main playlist\n // controller. Using a custom property for backwards compatibility\n // with < v2\n\n Object.defineProperties(this, {\n selectPlaylist: {\n get() {\n return this.playlistController_.selectPlaylist;\n },\n set(selectPlaylist) {\n this.playlistController_.selectPlaylist = selectPlaylist.bind(this);\n }\n },\n throughput: {\n get() {\n return this.playlistController_.mainSegmentLoader_.throughput.rate;\n },\n set(throughput) {\n this.playlistController_.mainSegmentLoader_.throughput.rate = throughput; // By setting `count` to 1 the throughput value becomes the starting value\n // for the cumulative average\n\n this.playlistController_.mainSegmentLoader_.throughput.count = 1;\n }\n },\n bandwidth: {\n get() {\n let playerBandwidthEst = this.playlistController_.mainSegmentLoader_.bandwidth;\n const networkInformation = window$1.navigator.connection || window$1.navigator.mozConnection || window$1.navigator.webkitConnection;\n const tenMbpsAsBitsPerSecond = 10e6;\n if (this.options_.useNetworkInformationApi && networkInformation) {\n // downlink returns Mbps\n // https://developer.mozilla.org/en-US/docs/Web/API/NetworkInformation/downlink\n const networkInfoBandwidthEstBitsPerSec = networkInformation.downlink * 1000 * 1000; // downlink maxes out at 10 Mbps. In the event that both networkInformationApi and the player\n // estimate a bandwidth greater than 10 Mbps, use the larger of the two estimates to ensure that\n // high quality streams are not filtered out.\n\n if (networkInfoBandwidthEstBitsPerSec >= tenMbpsAsBitsPerSecond && playerBandwidthEst >= tenMbpsAsBitsPerSecond) {\n playerBandwidthEst = Math.max(playerBandwidthEst, networkInfoBandwidthEstBitsPerSec);\n } else {\n playerBandwidthEst = networkInfoBandwidthEstBitsPerSec;\n }\n }\n return playerBandwidthEst;\n },\n set(bandwidth) {\n this.playlistController_.mainSegmentLoader_.bandwidth = bandwidth; // setting the bandwidth manually resets the throughput counter\n // `count` is set to zero that current value of `rate` isn't included\n // in the cumulative average\n\n this.playlistController_.mainSegmentLoader_.throughput = {\n rate: 0,\n count: 0\n };\n }\n },\n /**\n * `systemBandwidth` is a combination of two serial processes bit-rates. The first\n * is the network bitrate provided by `bandwidth` and the second is the bitrate of\n * the entire process after that - decryption, transmuxing, and appending - provided\n * by `throughput`.\n *\n * Since the two process are serial, the overall system bandwidth is given by:\n * sysBandwidth = 1 / (1 / bandwidth + 1 / throughput)\n */\n systemBandwidth: {\n get() {\n const invBandwidth = 1 / (this.bandwidth || 1);\n let invThroughput;\n if (this.throughput > 0) {\n invThroughput = 1 / this.throughput;\n } else {\n invThroughput = 0;\n }\n const systemBitrate = Math.floor(1 / (invBandwidth + invThroughput));\n return systemBitrate;\n },\n set() {\n videojs.log.error('The \"systemBandwidth\" property is read-only');\n }\n }\n });\n if (this.options_.bandwidth) {\n this.bandwidth = this.options_.bandwidth;\n }\n if (this.options_.throughput) {\n this.throughput = this.options_.throughput;\n }\n Object.defineProperties(this.stats, {\n bandwidth: {\n get: () => this.bandwidth || 0,\n enumerable: true\n },\n mediaRequests: {\n get: () => this.playlistController_.mediaRequests_() || 0,\n enumerable: true\n },\n mediaRequestsAborted: {\n get: () => this.playlistController_.mediaRequestsAborted_() || 0,\n enumerable: true\n },\n mediaRequestsTimedout: {\n get: () => this.playlistController_.mediaRequestsTimedout_() || 0,\n enumerable: true\n },\n mediaRequestsErrored: {\n get: () => this.playlistController_.mediaRequestsErrored_() || 0,\n enumerable: true\n },\n mediaTransferDuration: {\n get: () => this.playlistController_.mediaTransferDuration_() || 0,\n enumerable: true\n },\n mediaBytesTransferred: {\n get: () => this.playlistController_.mediaBytesTransferred_() || 0,\n enumerable: true\n },\n mediaSecondsLoaded: {\n get: () => this.playlistController_.mediaSecondsLoaded_() || 0,\n enumerable: true\n },\n mediaAppends: {\n get: () => this.playlistController_.mediaAppends_() || 0,\n enumerable: true\n },\n mainAppendsToLoadedData: {\n get: () => this.playlistController_.mainAppendsToLoadedData_() || 0,\n enumerable: true\n },\n audioAppendsToLoadedData: {\n get: () => this.playlistController_.audioAppendsToLoadedData_() || 0,\n enumerable: true\n },\n appendsToLoadedData: {\n get: () => this.playlistController_.appendsToLoadedData_() || 0,\n enumerable: true\n },\n timeToLoadedData: {\n get: () => this.playlistController_.timeToLoadedData_() || 0,\n enumerable: true\n },\n buffered: {\n get: () => timeRangesToArray(this.tech_.buffered()),\n enumerable: true\n },\n currentTime: {\n get: () => this.tech_.currentTime(),\n enumerable: true\n },\n currentSource: {\n get: () => this.tech_.currentSource_,\n enumerable: true\n },\n currentTech: {\n get: () => this.tech_.name_,\n enumerable: true\n },\n duration: {\n get: () => this.tech_.duration(),\n enumerable: true\n },\n main: {\n get: () => this.playlists.main,\n enumerable: true\n },\n playerDimensions: {\n get: () => this.tech_.currentDimensions(),\n enumerable: true\n },\n seekable: {\n get: () => timeRangesToArray(this.tech_.seekable()),\n enumerable: true\n },\n timestamp: {\n get: () => Date.now(),\n enumerable: true\n },\n videoPlaybackQuality: {\n get: () => this.tech_.getVideoPlaybackQuality(),\n enumerable: true\n }\n });\n this.tech_.one('canplay', this.playlistController_.setupFirstPlay.bind(this.playlistController_));\n this.tech_.on('bandwidthupdate', () => {\n if (this.options_.useBandwidthFromLocalStorage) {\n updateVhsLocalStorage({\n bandwidth: this.bandwidth,\n throughput: Math.round(this.throughput)\n });\n }\n });\n this.playlistController_.on('selectedinitialmedia', () => {\n // Add the manual rendition mix-in to VhsHandler\n renditionSelectionMixin(this);\n });\n this.playlistController_.sourceUpdater_.on('createdsourcebuffers', () => {\n this.setupEme_();\n }); // the bandwidth of the primary segment loader is our best\n // estimate of overall bandwidth\n\n this.on(this.playlistController_, 'progress', function () {\n this.tech_.trigger('progress');\n }); // In the live case, we need to ignore the very first `seeking` event since\n // that will be the result of the seek-to-live behavior\n\n this.on(this.playlistController_, 'firstplay', function () {\n this.ignoreNextSeekingEvent_ = true;\n });\n this.setupQualityLevels_(); // do nothing if the tech has been disposed already\n // this can occur if someone sets the src in player.ready(), for instance\n\n if (!this.tech_.el()) {\n return;\n }\n this.mediaSourceUrl_ = window$1.URL.createObjectURL(this.playlistController_.mediaSource);\n this.tech_.src(this.mediaSourceUrl_);\n }\n createKeySessions_() {\n const audioPlaylistLoader = this.playlistController_.mediaTypes_.AUDIO.activePlaylistLoader;\n this.logger_('waiting for EME key session creation');\n waitForKeySessionCreation({\n player: this.player_,\n sourceKeySystems: this.source_.keySystems,\n audioMedia: audioPlaylistLoader && audioPlaylistLoader.media(),\n mainPlaylists: this.playlists.main.playlists\n }).then(() => {\n this.logger_('created EME key session');\n this.playlistController_.sourceUpdater_.initializedEme();\n }).catch(err => {\n this.logger_('error while creating EME key session', err);\n this.player_.error({\n message: 'Failed to initialize media keys for EME',\n code: 3\n });\n });\n }\n handleWaitingForKey_() {\n // If waitingforkey is fired, it's possible that the data that's necessary to retrieve\n // the key is in the manifest. While this should've happened on initial source load, it\n // may happen again in live streams where the keys change, and the manifest info\n // reflects the update.\n //\n // Because videojs-contrib-eme compares the PSSH data we send to that of PSSH data it's\n // already requested keys for, we don't have to worry about this generating extraneous\n // requests.\n this.logger_('waitingforkey fired, attempting to create any new key sessions');\n this.createKeySessions_();\n }\n /**\n * If necessary and EME is available, sets up EME options and waits for key session\n * creation.\n *\n * This function also updates the source updater so taht it can be used, as for some\n * browsers, EME must be configured before content is appended (if appending unencrypted\n * content before encrypted content).\n */\n\n setupEme_() {\n const audioPlaylistLoader = this.playlistController_.mediaTypes_.AUDIO.activePlaylistLoader;\n const didSetupEmeOptions = setupEmeOptions({\n player: this.player_,\n sourceKeySystems: this.source_.keySystems,\n media: this.playlists.media(),\n audioMedia: audioPlaylistLoader && audioPlaylistLoader.media()\n });\n this.player_.tech_.on('keystatuschange', e => {\n this.playlistController_.updatePlaylistByKeyStatus(e.keyId, e.status);\n });\n this.handleWaitingForKey_ = this.handleWaitingForKey_.bind(this);\n this.player_.tech_.on('waitingforkey', this.handleWaitingForKey_);\n if (!didSetupEmeOptions) {\n // If EME options were not set up, we've done all we could to initialize EME.\n this.playlistController_.sourceUpdater_.initializedEme();\n return;\n }\n this.createKeySessions_();\n }\n /**\n * Initializes the quality levels and sets listeners to update them.\n *\n * @method setupQualityLevels_\n * @private\n */\n\n setupQualityLevels_() {\n const player = videojs.players[this.tech_.options_.playerId]; // if there isn't a player or there isn't a qualityLevels plugin\n // or qualityLevels_ listeners have already been setup, do nothing.\n\n if (!player || !player.qualityLevels || this.qualityLevels_) {\n return;\n }\n this.qualityLevels_ = player.qualityLevels();\n this.playlistController_.on('selectedinitialmedia', () => {\n handleVhsLoadedMetadata(this.qualityLevels_, this);\n });\n this.playlists.on('mediachange', () => {\n handleVhsMediaChange(this.qualityLevels_, this.playlists);\n });\n }\n /**\n * return the version\n */\n\n static version() {\n return {\n '@videojs/http-streaming': version$4,\n 'mux.js': version$3,\n 'mpd-parser': version$2,\n 'm3u8-parser': version$1,\n 'aes-decrypter': version\n };\n }\n /**\n * return the version\n */\n\n version() {\n return this.constructor.version();\n }\n canChangeType() {\n return SourceUpdater.canChangeType();\n }\n /**\n * Begin playing the video.\n */\n\n play() {\n this.playlistController_.play();\n }\n /**\n * a wrapper around the function in PlaylistController\n */\n\n setCurrentTime(currentTime) {\n this.playlistController_.setCurrentTime(currentTime);\n }\n /**\n * a wrapper around the function in PlaylistController\n */\n\n duration() {\n return this.playlistController_.duration();\n }\n /**\n * a wrapper around the function in PlaylistController\n */\n\n seekable() {\n return this.playlistController_.seekable();\n }\n /**\n * Abort all outstanding work and cleanup.\n */\n\n dispose() {\n if (this.playbackWatcher_) {\n this.playbackWatcher_.dispose();\n }\n if (this.playlistController_) {\n this.playlistController_.dispose();\n }\n if (this.qualityLevels_) {\n this.qualityLevels_.dispose();\n }\n if (this.tech_ && this.tech_.vhs) {\n delete this.tech_.vhs;\n }\n if (this.mediaSourceUrl_ && window$1.URL.revokeObjectURL) {\n window$1.URL.revokeObjectURL(this.mediaSourceUrl_);\n this.mediaSourceUrl_ = null;\n }\n if (this.tech_) {\n this.tech_.off('waitingforkey', this.handleWaitingForKey_);\n }\n super.dispose();\n }\n convertToProgramTime(time, callback) {\n return getProgramTime({\n playlist: this.playlistController_.media(),\n time,\n callback\n });\n } // the player must be playing before calling this\n\n seekToProgramTime(programTime, callback, pauseAfterSeek = true, retryCount = 2) {\n return seekToProgramTime({\n programTime,\n playlist: this.playlistController_.media(),\n retryCount,\n pauseAfterSeek,\n seekTo: this.options_.seekTo,\n tech: this.options_.tech,\n callback\n });\n }\n /**\n * Adds the onRequest, onResponse, offRequest and offResponse functions\n * to the VhsHandler xhr Object.\n */\n\n setupXhrHooks_() {\n /**\n * A player function for setting an onRequest hook\n *\n * @param {function} callback for request modifiction\n */\n this.xhr.onRequest = callback => {\n addOnRequestHook(this.xhr, callback);\n };\n /**\n * A player function for setting an onResponse hook\n *\n * @param {callback} callback for response data retrieval\n */\n\n this.xhr.onResponse = callback => {\n addOnResponseHook(this.xhr, callback);\n };\n /**\n * Deletes a player onRequest callback if it exists\n *\n * @param {function} callback to delete from the player set\n */\n\n this.xhr.offRequest = callback => {\n removeOnRequestHook(this.xhr, callback);\n };\n /**\n * Deletes a player onResponse callback if it exists\n *\n * @param {function} callback to delete from the player set\n */\n\n this.xhr.offResponse = callback => {\n removeOnResponseHook(this.xhr, callback);\n }; // Trigger an event on the player to notify the user that vhs is ready to set xhr hooks.\n // This allows hooks to be set before the source is set to vhs when handleSource is called.\n\n this.player_.trigger('xhr-hooks-ready');\n }\n attachStreamingEventListeners_() {\n const playlistControllerEvents = ['seekablerangeschanged', 'bufferedrangeschanged', 'contentsteeringloadstart', 'contentsteeringloadcomplete', 'contentsteeringparsed'];\n const playbackWatcher = ['gapjumped', 'playedrangeschanged']; // re-emit streaming events and payloads on the player.\n\n playlistControllerEvents.forEach(eventName => {\n this.playlistController_.on(eventName, metadata => {\n this.player_.trigger(_extends({}, metadata));\n });\n });\n playbackWatcher.forEach(eventName => {\n this.playbackWatcher_.on(eventName, metadata => {\n this.player_.trigger(_extends({}, metadata));\n });\n });\n }\n}\n/**\n * The Source Handler object, which informs video.js what additional\n * MIME types are supported and sets up playback. It is registered\n * automatically to the appropriate tech based on the capabilities of\n * the browser it is running in. It is not necessary to use or modify\n * this object in normal usage.\n */\n\nconst VhsSourceHandler = {\n name: 'videojs-http-streaming',\n VERSION: version$4,\n canHandleSource(srcObj, options = {}) {\n const localOptions = merge(videojs.options, options);\n return VhsSourceHandler.canPlayType(srcObj.type, localOptions);\n },\n handleSource(source, tech, options = {}) {\n const localOptions = merge(videojs.options, options);\n tech.vhs = new VhsHandler(source, tech, localOptions);\n tech.vhs.xhr = xhrFactory();\n tech.vhs.setupXhrHooks_();\n tech.vhs.src(source.src, source.type);\n return tech.vhs;\n },\n canPlayType(type, options) {\n const simpleType = simpleTypeFromSourceType(type);\n if (!simpleType) {\n return '';\n }\n const overrideNative = VhsSourceHandler.getOverrideNative(options);\n const supportsTypeNatively = Vhs.supportsTypeNatively(simpleType);\n const canUseMsePlayback = !supportsTypeNatively || overrideNative;\n return canUseMsePlayback ? 'maybe' : '';\n },\n getOverrideNative(options = {}) {\n const {\n vhs = {}\n } = options;\n const defaultOverrideNative = !(videojs.browser.IS_ANY_SAFARI || videojs.browser.IS_IOS);\n const {\n overrideNative = defaultOverrideNative\n } = vhs;\n return overrideNative;\n }\n};\n/**\n * Check to see if the native MediaSource object exists and supports\n * an MP4 container with both H.264 video and AAC-LC audio.\n *\n * @return {boolean} if native media sources are supported\n */\n\nconst supportsNativeMediaSources = () => {\n return browserSupportsCodec('avc1.4d400d,mp4a.40.2');\n}; // register source handlers with the appropriate techs\n\nif (supportsNativeMediaSources()) {\n videojs.getTech('Html5').registerSourceHandler(VhsSourceHandler, 0);\n}\nvideojs.VhsHandler = VhsHandler;\nvideojs.VhsSourceHandler = VhsSourceHandler;\nvideojs.Vhs = Vhs;\nif (!videojs.use) {\n videojs.registerComponent('Vhs', Vhs);\n}\nvideojs.options.vhs = videojs.options.vhs || {};\nif (!videojs.getPlugin || !videojs.getPlugin('reloadSourceOnError')) {\n videojs.registerPlugin('reloadSourceOnError', reloadSourceOnError);\n}\n\nexport { videojs as default };\n"],"names":["win","global","window_1","__viteBrowserExternal","topLevel","minDoc","require$$0","doccy","document_1","tuple","SafeParseTuple","obj","reviver","json","error","err","_extends","n","r","isFunction_1","isFunction","toString","fn","string","_createForOfIteratorHelperLoose","o","allowArrayLike","it","_unsupportedIterableToArray","i","minLen","_arrayLikeToArray","arr","len","arr2","InterceptorsStorage","_proto","type","interceptor","interceptorsSet","payload","interceptors","_iterator","_step","RetryManager","maxAttempts","delayFactor","fuzzFactor","initialDelay","_temp","_ref","Retry","options","_proto2","delayDelta","lowValue","highValue","retry","window","httpResponseHandler","callback","decodeResponseBody","response","responseBody","cause","charset","getCharset","contentTypeHeader","contentType","_contentType$split","value","httpHandler","require$$1","require$$2","require$$3","require$$4","createXHR","require$$5","parseHeaders","headers","result","row","index","key","libModule","noop","forEachArray","method","uri","initParams","_createXHR","array","iterator","isEmpty","params","requestInterceptorPayload","updatedPayload","called","body","readystatechange","xhr","loadFunc","getBody","getXml","isJson","errorFunc","evt","timeoutTimer","aborted","responseInterceptorPayload","failureResponse","_updatedPayload","status","_updatedPayload2","sync","e","firefoxBugTakenEffect","document","_objCreate","F","ParsingError","errorData","message","parseTimeStamp","input","computeSeconds","h","m","s","f","Settings","k","v","dflt","defaultKey","a","parseOptions","keyValueDelim","groupDelim","groups","kv","parseCue","cue","regionList","oInput","consumeTimeStamp","ts","consumeCueSettings","settings","vals","vals0","skipWhitespace","TEXTAREA_ELEMENT","TAG_NAME","DEFAULT_COLOR_CLASS","TAG_ANNOTATION","NEEDS_PARENT","parseContent","nextToken","consume","unescape","shouldAdd","current","element","createElement","annotation","tagName","name","rootDiv","t","tagStack","node","classes","cl","bgColor","colorName","propName","propValue","strongRTLRanges","isStrongRTLChar","charCode","currentRange","determineBidi","cueDiv","nodeStack","text","pushNodes","nextTextNode","computeLinePos","track","trackList","count","StyleBox","styles","div","prop","val","unit","CueStyleBox","styleOptions","textPos","box","BoxPosition","lh","height","width","top","rects","axis","toMove","b2","boxes","container","x","y","intersectArea","reference","ret","moveBoxToLinePosition","styleBox","containerBox","boxPositions","findBestPosition","b","bestPosition","specifiedPosition","percentage","p","boxPosition","linePos","size","step","position","maxPosition","initialAxis","calculatedPercentage","WebVTT","data","cuetext","FONT_SIZE_PERCENT","FONT_STYLE","CUE_BACKGROUND_PADDING","cues","overlay","paddedOverlay","shouldCompute","fontSize","vttjs","decoder","self","collectNextLine","buffer","pos","line","parseRegion","xy","anchor","region","parseTimestampMap","parseHeader","alreadyCollectedLine","hasSubstring","vtt","autoKeyword","directionSetting","alignSetting","findDirectionSetting","dir","findAlignSetting","align","VTTCue","startTime","endTime","_id","_pauseOnExit","_startTime","_endTime","_text","_region","_vertical","_snapToLines","_line","_lineAlign","_position","_positionAlign","_size","_align","setting","vttcue","scrollSetting","findScrollSetting","scroll","isValidPercentValue","VTTRegion","_width","_lines","_regionAnchorX","_regionAnchorY","_viewportAnchorX","_viewportAnchorY","_scroll","vttregion","browserIndexModule","cueShim","regionShim","nativeVTTCue","nativeVTTRegion","root","URL_REGEX","FIRST_SEGMENT_REGEX","SLASH_DOT_REGEX","SLASH_DOT_DOT_REGEX","URLToolkit","baseURL","relativeURL","opts","basePartsForNormalise","relativeParts","baseParts","pathParts","builtParts","baseURLPath","newPath","url","parts","path","module","DEFAULT_LOCATION","resolveUrl","baseUrl","relativeUrl","nativeURL","protocolLess","removeLocation","newUrl","Stream","listener","callbacks","length","args","_length","_i","destination","atob","decodeB64ToUint8Array","b64Text","decodedString","LineStream","nextNewline","TAB","parseByterange","byterangeString","match","attributeSeparator","keyvalue","parseAttributes","attributes","attrs","attr","ParseStream","event","acc","mapper","mappedLine","newLine","split","resolution","subkey","clientAttributePattern","isHexaDecimal","isDecimalFloating","expression","customType","dataParser","segment","map","mapFn","camelCase","str","camelCaseKeys","setHoldBack","manifest","serverControl","targetDuration","partTargetDuration","tag","hb","phb","minTargetDuration","minPartDuration","Parser","uris","currentUri","currentMap","hasParts","defaultMediaGroups","widevineUuid","currentTimeline","lastByterangeEnd","lastPartByterangeEnd","dateRangeTags","entry","mediaGroup","rendition","byterange","mediaGroupType","lastProgramDateTime","programDateTime","segmentIndex","part","partIndex","hint","isPart","otherHint","report","required","dateRange","endOnNextYes","newDateInSeconds","attribute","dateRangeWithSameId","dateRangeToFind","identifier","missing","chunk","regexs","mediaTypes","upperMediaTypes","translateLegacyCodec","codec","orig","profile","avcLevel","profileHex","avcLevelHex","parseCodecs","codecString","codecs","codecType","details","codecsFromDefault","master","audioGroupId","audioGroup","audioType","isAudioCodec","isTextCodec","getMimeForCodec","c","browserSupportsCodec","muxerSupportsCodec","DEFAULT_AUDIO_CODEC","DEFAULT_VIDEO_CODEC","MPEGURL_REGEX","DASH_REGEX","simpleTypeFromSourceType","countBits","countBytes","isArrayBufferView","isTypedArray","toUint8","bytes","BigInt","BYTE_TABLE","bytesToNumber","_ref$signed","signed","_ref$le","le","number","total","byte","exponent","max","numberToBytes","_temp2","_ref2","_ref2$le","byteCount","byteIndex","stringToBytes","stringIsBytes","view","concatTypedArrays","_len","buffers","_key","totalLen","buf","tempBuffer","offset","bytesMatch","_temp3","_ref3","_ref3$offset","_ref3$mask","mask","bByte","aByte","forEachMediaGroup","mediaType","groupKey","labelKey","mediaProperties","find","list","predicate","ac","item","freeze","object","oc","assign","target","source","MIME_TYPE","NAMESPACE","conventions","notEmptyString","splitOnASCIIWhitespace","orderedSetReducer","toOrderedSet","arrayIncludes","copy","src","dest","Class","Super","pt","NodeType","ELEMENT_NODE","ATTRIBUTE_NODE","TEXT_NODE","CDATA_SECTION_NODE","ENTITY_REFERENCE_NODE","ENTITY_NODE","PROCESSING_INSTRUCTION_NODE","COMMENT_NODE","DOCUMENT_NODE","DOCUMENT_TYPE_NODE","DOCUMENT_FRAGMENT_NODE","NOTATION_NODE","ExceptionCode","ExceptionMessage","HIERARCHY_REQUEST_ERR","NOT_FOUND_ERR","INUSE_ATTRIBUTE_ERR","DOMException","code","NodeList","isHTML","nodeFilter","serializeToString","LiveNodeList","refresh","_updateLiveList","inc","ls","__set__","NamedNodeMap","_findNodeIndex","_addNamedNode","el","newAttr","oldAttr","doc","_onRemoveAttribute","_onAddAttribute","_removeNamedNode","lastIndex","namespaceURI","localName","DOMImplementation","feature","version","qualifiedName","doctype","Document","publicId","systemId","DocumentType","Node","newChild","refChild","_insertBefore","oldChild","assertPreReplacementValidityInDocument","_removeChild","deep","cloneNode","child","next","prefix","_xmlEncoder","_visitNode","ns","remove","_onUpdateChild","cs","parentNode","previous","hasValidParentNodeType","hasInsertableNodeType","isElementNode","isTextNode","isDocTypeNode","isElementInsertionPossible","parentChildNodes","docTypeNode","isElementReplacementPossible","hasElementChildThatIsNotChild","assertPreInsertionValidity1to5","parent","assertPreInsertionValidityInDocument","nodeChildNodes","nodeChildElements","parentElementChild","_inDocumentAssertion","cp","newFirst","newLast","pre","_appendSingleChild","importedNode","importNode","id","rtv","classNames","classNamesSet","base","nodeClassNames","matches","nodeClassNamesSet","Element","DocumentFragment","Text","Comment","CDATASection","ProcessingInstruction","Attr","EntityReference","pl","old","CharacterData","start","end","newText","newNode","Notation","Entity","XMLSerializer","isHtml","nodeSerializeToString","refNode","visibleNamespaces","needNamespaceDefine","addSerializedAttribute","nodeName","prefixedNodeName","defaultNS","ai","nsi","namespace","pubid","sysid","sub","node2","attrs2","getTextContent","dom","exports","nameStartChar","nameChar","tagNamePattern","S_TAG","S_ATTR","S_ATTR_SPACE","S_EQ","S_ATTR_NOQUOT_VALUE","S_ATTR_END","S_TAG_SPACE","S_TAG_CLOSE","ParseError","locator","XMLReader","defaultNSMap","entityMap","domBuilder","_copy","parse","defaultNSMapCopy","errorHandler","fixedFromCharCode","surrogate1","surrogate2","entityReplacer","appendText","xt","lineEnd","linePattern","lineStart","parseStack","closeMap","tagStart","config","localNSMap","endMatch","endIgnoreCaseMach","parseInstruction","parseDCC","ElementAttributes","currentNSMap","parseElementStartPart","fixSelfClosed","locator2","copyLocator","appendElement","parseHtmlSpecialContent","addAttribute","qname","startIndex","attrName","qName","nsp","nsPrefix","elStartEnd","elEndStart","matchs","lastMatch","reg","sax","entities","normalizeLineEndings","DOMParser","mimeType","DOMHandler","buildErrorHandler","normalize","errorImpl","isCallback","build","msg","_locator","ins","ch","chars","_toString","charNode","comm","impl","dt","l","hander","domParser","isObject","merge","objects","values","range","flatten","lists","from","findIndexes","union","keyFunction","errors","urlTypeToSegment","indexRange","ranges","startRange","endRange","byteRangeToString","parseEndNumber","endNumber","segmentRange","duration","timescale","sourceDuration","periodDuration","segmentDuration","NOW","clientOffset","availabilityStartTime","periodStart","minimumUpdatePeriod","timeShiftBufferDepth","now","periodStartWC","segmentCount","availableStart","availableEnd","toSegments","startNumber","parseByDuration","segments","sectionDuration","segmentsFromBase","initialization","presentationTime","initSegment","segmentTimeInfo","addSidxSegmentsToPlaylist$1","playlist","sidx","timeline","sidxByteRange","sidxEnd","mediaReferences","endIndex","SUPPORTED_MEDIA_TYPES","TIME_FUDGE","getUniqueTimelineStarts","timelineStarts","findPlaylistWithName","playlists","getMediaGroupPlaylists","mediaGroupPlaylists","properties","group","label","updateMediaSequenceForPlaylist","mediaSequence","updateSequenceNumbers","oldPlaylists","newPlaylists","oldPlaylist","firstNewSegment","oldMatchingSegmentIndex","oldSegment","positionManifestOnTimeline","oldManifest","newManifest","generateSidxKey","mergeDiscontiguousPlaylists","playlistsByBaseUrl","cur","allPlaylists","playlistGroup","mergedPlaylists","addSidxSegmentsToPlaylist","sidxMapping","sidxKey","sidxMatch","addSidxSegmentsToPlaylists","formatAudioPlaylist","discontinuitySequence","discontinuityStarts","isAudioOnly","formatVttPlaylist","m3u8Attributes","vttPlaylist","organizeAudioPlaylists","mainPlaylist","formattedPlaylists","role","language","roleLabel","formatted","firstLabel","organizeVttPlaylists","organizeCaptionServices","captionServices","svcObj","svc","service","channel","formatVideoPlaylist","videoOnly","audioOnly","vttOnly","addMediaSequenceValues","flattenMediaGroupPlaylists","mediaGroupObject","labelContents","toM3u8","dashPlaylists","locations","contentSteering","previousManifest","eventStream","suggestedPresentationDelay","videoPlaylists","audioPlaylists","vttPlaylists","captions","organizedAudioGroup","organizedVttGroup","playlistTimelineStarts","getLiveRValue","time","parseByTimeline","segmentTimeline","media","sIndex","S","repeat","segmentTime","nextS","identifierPattern","identifierReplacement","format","constructTemplateUrl","parseTemplateInfo","segmentsFromTemplate","templateValues","mapSegment","presentationTimeOffset","SegmentURLToSegmentObject","segmentUrl","segmentsFromList","segmentUrls","segmentUrlMap","segmentUrlObject","generateSegments","segmentInfo","segmentAttributes","segmentsFn","segmentsInfo","toPlaylists","representations","findChildren","getContent","parseDivisionValue","prev","parseDuration","year","month","day","hour","minute","second","parseDate","parsers","parsedValue","parseFn","keySystemsMap","buildBaseUrls","references","baseUrlElements","baseUrlElement","initialBaseUrl","resolvedBaseUrl","finalBaseUrl","getSegmentInformation","adaptationSet","segmentTemplate","segmentList","segmentBase","segmentTimelineParentNode","segmentInitializationParentNode","segmentInitialization","template","inheritBaseUrls","adaptationSetAttributes","adaptationSetBaseUrls","adaptationSetSegmentInfo","representation","repBaseUrlElements","repBaseUrls","representationSegmentInfo","generateKeySystemInformation","contentProtectionNodes","keySystem","psshNode","pssh","parseCaptionServiceMetadata","flags","opt","toEventStream","period","eventStreamAttributes","schemeIdUri","eventAttributes","toRepresentations","periodAttributes","periodBaseUrls","periodSegmentInfo","roleAttributes","accessibility","labelVal","contentProtection","toAdaptationSets","mpdAttributes","mpdBaseUrls","adaptationSets","generateContentSteeringInformation","contentSteeringNodes","eventHandler","infoFromContentSteeringTag","getPeriodStart","priorPeriodAttributes","mpdType","inheritAttributes","mpd","manifestUri","periodNodes","periods","priorPeriod","stringToMpdXml","manifestString","parser","xml","parseUTCTimingScheme","UTCTimingNode","parsedManifestInfo","parseUTCTiming","MAX_UINT32","getUint64","uint8","dv","numbers","parseSidx","referenceCount","parseSidx_1","ID3","getId3Size","returnSize","footerPresent","getId3Offset","normalizePath","normalizePaths","paths","findBox","complete","results","EBML_TAGS","LENGTH_TABLE","getLength","getvint","removeLength","valueBytes","getInfinityDataSize","innerid","dataHeader","findEbml","dataStart","dataEnd","totalLength","NAL_TYPE_ONE","NAL_TYPE_TWO","EMULATION_PREVENTION","discardEmulationPreventionBytes","positions","newLength","newData","sourceIndex","findNal","dataType","types","nalLimit","nalStart","nalsFound","nalOffset","nalType","findH264Nal","findH265Nal","CONSTANTS","_isLikely","docType","isLikelyTypes","isLikelyFn","isLikely","detectContainerForBytes","isLikelyFmp4MediaSegment","clock","version$6","hooks_","hooks","hook","removeHook","hookOnce","original","wrapper","FullscreenApi","apiMap","specApi","browserApi","document$1","history","LogByTypeFactory","log","level","lvl","lvlRegExp","resultName","splice","window$1","createLogger$1","delimiter","logByType","subName","subDelimiter","subStyles","resultDelimiter","resultStyles","newName","newDelimiter","newStyles","fname","historyItem","log$1","createLogger","keys","each","reduce","initial","accum","isPlain","merge$1","sources","defineLazyProperty","getValue","setter","set","Obj","IS_IPOD","IOS_VERSION","IS_ANDROID","ANDROID_VERSION","IS_FIREFOX","IS_EDGE","IS_CHROMIUM","IS_CHROME","CHROMIUM_VERSION","CHROME_VERSION","IS_CHROMECAST_RECEIVER","IE_VERSION","IS_SAFARI","IS_WINDOWS","IS_IPAD","IS_IPHONE","IS_TIZEN","IS_WEBOS","IS_SMART_TV","TOUCH_ENABLED","isReal","UAD","USER_AGENT","major","minor","IS_IOS","IS_ANY_SAFARI","browser","isNonBlankString","throwIfWhitespace","isEl","isInFrame","createQuerier","selector","context","ctx","createEl","content","textContent","appendContent","prependTo","hasClass","classToCheck","addClass","classesToAdd","removeClass","classesToRemove","toggleClass","classToToggle","className","setAttributes","attrValue","getAttributes","knownBooleans","attrVal","getAttribute","setAttribute","removeAttribute","blockTextSelection","unblockTextSelection","getBoundingClientRect","rect","computedStyle","findPosition","left","getPointerPosition","translated","transform","transformValue","matrix","boxTarget","boxW","boxH","offsetY","offsetX","emptyEl","normalizeContent","insertContent","isSingleLeftClick","$","$$","computedStyleValue","copyStyleSheetsToWindow","styleSheet","cssRules","rule","style","link","Dom","_windowLoaded","videojs$1","autoSetup","vids","audios","divs","mediaEls","mediaEl","autoSetupTimeout","wait","vjs","setWindowLoaded","createStyleElement","setTextContent","DomData","_initialGuid","_guid","newGUID","_cleanUpEvents","elem","_handleMultipleEvents","fixEvent","returnTrue","returnFalse","deprecatedProps","_supportsPassive","supportsPassive","passiveEvents","on","hash","handlers","handlersCopy","off","removeType","trigger","elemData","targetData","one","func","any","Events","UPDATE_REFRESH_INTERVAL","bind_","uid","bound","throttle","last","debounce","immediate","timeout","cancel","debounced","later","Fn","EVENT_MAP","EventTarget$2","ael","oldTimeout","objName","isEvented","addEventedCallback","isValidEventType","validateTarget","fnName","validateEventType","validateListener","normalizeListenArgs","isTargetingSelf","listen","EventedMixin","removeListenerOnDispose","removeRemoverOnTargetDispose","largs","targetOrType","typeOrListener","evented","eventBusKey","StatefulMixin","stateUpdates","changes","stateful","defaultState","toLowerCase","w","toTitleCase$1","titleCaseEquals","str1","str2","Str","Component$1","player","ready","tokens","defaultValue","languages","primaryCode","primaryLang","localizedString","names","currentChild","iconName","xmlnsURL","iconContainer","svgEl","useEl","component","componentName","componentClassName","ComponentClass","childFound","compEl","children","parentOptions","handleAdd","workingChildren","Tech","wchild","readyQueue","num","skipListeners","widthOrHeight","pxIndex","computedWidthOrHeight","boundingClientRect","center","touchStart","firstTouch","tapMovementThreshold","touchTimeThreshold","couldBeTap","xdiff","ydiff","noTap","touchHolding","touchEnd","timeoutId","interval","intervalId","idName","cancelName","isVisibleStyleProperty","elementStyle","thisVisibility","isBeingRendered","isVisible","elementCenter","pointContainer","ComponentToRegister","isTech","isComp","reason","Player","players","playerNames","pname","rangeCheck","maxIndex","getRange","valueIndex","rangeIndex","createTimeRangesObj","timeRangesObj","createTimeRanges$1","defaultImplementation","seconds","guide","gm","gh","implementation","setFormatTime","customImplementation","resetFormatTime","formatTime","Time","bufferedPercent","buffered","bufferedDuration","MediaError","isPromise","silencePromise","trackToJson_","textTracksToJson","tech","trackEls","trackObjs","trackEl","jsonToTextTracks","addedTrack","textTrackConverter","MODAL_CLASS_NAME","ModalDialog","desc","closeable","close","temp","contentEl","parentEl","nextSiblingEl","closeButton","activeEl","playerEl","focusableEls","focusIndex","allChildren","TrackList","tracks","rtrack","disableOthers$1","AudioTrackList","disableOthers","VideoTrackList","TextTrackList","HtmlTrackElementList","trackElements","trackElement","trackElement_","TextTrackCueList","oldLength","defineProp","VideoTrackKind","AudioTrackKind","TextTrackKind","TextTrackMode","Track","trackProps","newLabel","parseUrl","getAbsoluteURL","getFileExtension","isCrossOrigin","winLoc","Url","parseCues","srcContent","loadTrack","crossOrigin","withCredentials","XHR","TextTrack","mode","default_","activeCues","changed","disposeHandler","newMode","ct","active","originalCue","removeCue","AudioTrack","enabled","newEnabled","VideoTrack","selected","newSelected","HTMLTrackElement","readyState","NORMAL","REMOTE","ALL","createTrackHelper","kind","props","numBufferedPercent","_isScrubbing","_seconds","trackListChanges","script","remoteTracks","handleAddTrack","handleRemoveTrack","updateDisplay","textTracksChanges","manualCleanup","htmlTrackElement","cb","override","_type","srcObj","_Tech","handler","can","sh","originalFn","middlewares","middlewareInstances","TERMINATOR","use","middleware","setSource","setSourceHelper","setTech","mw","get","middlewareIterator","arg","mediate","callMethod","middlewareValue","terminated","returnValue","executeRight","allowedGetters","allowedSetters","allowedMediators","mws","clearCacheForPlayer","getOrCreateFactory","mwFactory","mwf","mwi","lastRun","mwrest","_src","MimetypesKind","getMimetype","ext","findMimetype","matchingSources","filterSource","newsrc","srcobj","fixSource","mimetype","icons","backKeyCode","SpatialNavKeyCodes","keyName","STEP_SECONDS$1","SpatialNavigation","actualEvent","direction","action","nextFocusedElement","isChildrenOfPlayer","currentComponent","focusableComponents","searchForChildrenCandidates","componentsArray","searchForSuitableChild","suitableChild","curComp","currentFocusedComponent","currentPositions","candidates","bestCandidate","currentCenter","minDistance","candidate","candidateCenter","distance","srcRect","targetRect","center1","center2","dx","dy","spatialNavigation","MediaLoader","options_","j","techName","ClickableComponent","localizedText","PosterImage","darkGray","lightGray","fontMap","constructColor","color","opacity","hex","tryUpdateStyle","getCSSPositionValue","TextTrackDisplay","updateDisplayTextHandler","updateDisplayHandler","screenOrientation","changeOrientationEvent","modes","userPref","firstDesc","firstCaptions","preferredTrack","allowMultipleShowingTracks","showingTracks","descriptionsTrack","captionsSubtitlesTrack","playerWidth","playerHeight","playerAspectRatio","videoAspectRatio","insetInlineMatch","insetBlockMatch","overrides","cueEl","LoadingSpinner","isAudio","playerType","controlText","Button","BigPlayButton","playPromise","playToggle","playFocus","CloseButton","PlayToggle","TimeDisplay","span","oldNode","CurrentTimeDisplay","DurationDisplay","updateContent","TimeDivider","RemainingTimeDisplay","LiveDisplay","SeekToLive","clamp","min","Num","Slider","progress","sizeKey","spatialNavOptions","spatialNavEnabled","horizontalSeek","bool","percentify","LoadProgressBar","loadedText","separator","liveTracker","bufferedEnd","percent","TimeTooltip","seekBarRect","seekBarPoint","tooltipRect","playerRect","seekBarPointPx","spaceLeftOfPoint","spaceRightOfPoint","pullTooltipBy","liveWindow","secondsBehind","PlayProgressBar","timeTooltip","MouseTimeDisplay","STEP_SECONDS","PAGE_KEY_MULTIPLIER","SeekBar","currentTime","mouseDown","newTime","seekableStart","seekableEnd","mouseTimeDisplay","gotoFraction","ProgressControl","seekBar","playProgressBar","seekBarEl","PictureInPictureToggle","FullscreenToggle","checkVolumeSupport","VolumeLevel","VolumeLevelTooltip","rangeBarRect","rangeBarPoint","vertical","volumeBarPointPx","volume","MouseVolumeLevelDisplay","VolumeBar","mouseVolumeLevelDisplay","volumeBarEl","volumeBarRect","volumeBarPoint","ariaValue","volumeBeforeDrag","VolumeControl","orientationClass","checkMuteSupport","MuteToggle","vol","lastVolume","volumeToSet","VolumePanel","SkipForward","playerOptions","currentVideoTime","SkipBackward","Menu","childComponent","contentElType","relatedTarget","btn","childComponents","foundComponent","stepChild","MenuButton","buttonClass","handleClick","menu","titleEl","titleComponent","menuButtonClass","TrackButton","updateHandler","MenuItem","menuItemEl","TextTrackMenuItem","changeHandler","selectedLanguageChangeHandler","referenceTrack","shouldBeSelected","selectedLanguage","OffTextTrackMenuItem","allHidden","TextTrackButton","items","TrackMenuItem","ChaptersTrackMenuItem","ChaptersButton","remoteTextTrackEl","mi","DescriptionsButton","disabled","SubtitlesButton","CaptionSettingsMenuItem","CaptionsButton","SubsCapsMenuItem","parentSpan","SubsCapsButton","AudioTrackMenuItem","AudioTrackButton","PlaybackRateMenuItem","rate","PlaybackRateMenuButton","rates","Spacer","CustomControlSpacer","ControlBar","ErrorDisplay","TextTrackSelect","optionText","optionId","option","TextTrackFieldset","legendElement","selects","selectConfig","selectClassName","guid","textTrackSelect","TextTrackSettingsColors","id_","ElFgColorFieldset","ElBgColorFieldset","ElWinColorFieldset","TextTrackSettingsFont","TrackSettingsControls","defaultsDescription","resetButton","doneButton","LOCAL_STORAGE_KEY$1","COLOR_BLACK","COLOR_BLUE","COLOR_CYAN","COLOR_GREEN","COLOR_MAGENTA","COLOR_RED","COLOR_WHITE","COLOR_YELLOW","OPACITY_OPAQUE","OPACITY_SEMI","OPACITY_TRANS","selectConfigs","parseOptionValue","getSelectedOptionValue","setSelectedOption","TextTrackSettings","textTrackSettingsColors","textTrackSettingsFont","trackSettingsControls","ttDisplay","ResizeManager","RESIZE_OBSERVER_AVAILABLE","debouncedHandler_","unloadListener_","defaults$1","LiveTracker","seekable","deltaTime","liveCurrentTime","isBehind","timeDiff","seekableEnds","seekableStarts","TitleBar","techEl","techAriaAttrs","techAriaAttr","defaults","TransientButton","sourcesetLoad","srcUrls","innerHTMLDescriptorPolyfill","dummy","docFrag","getDescriptor","priority","descriptor","getInnerHTMLDescriptor","firstSourceWatch","innerDescriptor","appendWrapper","appendFn","retval","srcDescriptorPolyfill","getSrcDescriptor","setupSourceset","srcDescriptor","oldSetAttribute","oldLoad","Html5","crossoriginTracks","nodes","nodesLength","removeNodes","textTracks","metadataTracksPreFullscreenState","takeMetadataTrackSnapshot","restoreTrackMode","storedTrack","lowerCaseType","eventName","elTracks","techTracks","listeners","removeOldTracks","removeTracks","found","clone","tagAttributes","settingsAttrs","loadstartFired","setLoadstartFired","triggerLoadstart","eventsToTrigger","isScrubbing","checkProgress","endFn","beginFn","video","videoPlaybackQuality","canControl","muted","playbackRate","TECH_EVENTS_RETRIGGER","TECH_EVENTS_QUEUE","BREAKPOINT_ORDER","BREAKPOINT_CLASSES","DEFAULT_BREAKPOINTS","closest","languagesToLower","playerOptionsCopy","parsedSVG","sprite","majorVersion","playerElIngest","divEmbed","deviceClassNames","defaultsStyleEl","head","links","linkEl","dimension","privDimension","parsedVal","ratio","aspectRatio","idClass","ratioParts","ratioMultiplier","titleTechName","camelTechName","autoplay","techOptions","TechClass","eventObj","safety","resolveMuted","previouslyMuted","restoreMuted","mutedPromise","promise","sourceElSources","sourceEls","matchingSourceEls","sourceObj","updateSourceCaches","playerSrc","eventSrc","techSrc","request","queued","timeWhenWaiting","timeUpdateListener","targetPlayer","isFs","resolve","isSrcReady","isSafariOrIOS","queue","q","percentAsDecimal","defaultMuted","isFS","oldValue","fullscreenOptions","reject","offHandler","fsOptions","isPiP","pipContainer","pipWindow","pipVideo","userActions","allowedInputTypes","hotkeys","fullscreenKey","keydownEvent","muteKey","playPauseKey","FSToggle","techs","findFirstPassingTechSourcePair","outerArray","innerArray","tester","outerChoice","innerChoice","foundSourceAndTech","flip","finder","isRetry","middlewareSource","stopListeningForErrors","sourceTech","currentTimeDisplay","durationDisplay","progressControl","remainingTimeDisplay","techAutoplay","newPoster","hookFunction","newErr","triggerSuppressedError","mouseInProgress","lastMoveX","lastMoveY","handleActivity","handleMouseMove","handleMouseDown","handleMouseUpAndMouseLeave","controlBar","inactivityTimeout","activityCheck","playerChildren","controlBarHeight","exitPromises","modal","currentBreakpoint","currentWidth","candidateBreakpoint","maxWidth","breakpoints","artist","artwork","description","poster","title","tt","baseOptions","tagOptions","dataSetup","safeParseTuple","childName","newRates","navigator","BASE_PLUGIN_NAME","PLUGIN_CACHE_KEY","pluginStorage","pluginExists","getPlugin","markPluginAsActive","triggerSetupEvent","before","createBasicPlugin","plugin","basicPluginWrapper","instance","createPluginFactory","PluginSubClass","Plugin","deprecate","warned","deprecateForMajor","oldName","VjsErrors","normalizeId","videojs","rootNode","PlayerComponent","nId","playerId","comp","QualityLevel","enable","QualityLevelList","qualityLevel","removed","version$5","initPlugin$1","originalPluginFn","qualityLevelList","qualityLevels","_resolveUrl","resolveManifestRedirect","req","logger","createTimeRanges","bufferedRangesToString","bufferedRangesStr","TIME_FUDGE_FACTOR","SAFE_TIME_DELTA","filterRanges","timeRanges","findRange","findNextRange","findGaps","bufferIntersection","bufferA","bufferB","arity","extents","printableRange","strArr","timeUntilRebuffer","timeRangesToArray","timeRangesList","isRangeDifferent","lastBufferedEnd","timeAheadOf","segmentDurationWithParts","getPartsAndSegments","si","pi","getLastParts","lastSegment","getKnownPartCount","preloadSegment","preloadHints","partCount","liveEdgeDelay","main","backwardDuration","endSequence","forwardDuration","intervalDuration","expired","backward","forward","sumDurations","defaultDuration","durationList","durations","playlistEnd","useSafeLiveEnd","liveEdgePadding","lastSegmentEndTime","getMediaInfoForTime","startingSegmentIndex","startingPartIndex","exactManifestTimings","partsAndSegments","partAndSegment","canUseFudgeFactor","isExactlyAtTheEnd","isExtremelyCloseToTheEnd","isExcluded","isIncompatible","isEnabled","excluded","isDisabled","isAes","hasAttribute","estimateSegmentRequestTime","bandwidth","bytesReceived","isLowestEnabledRendition","currentBandwidth","playlistMatch","someAudioVariant","AUDIO","groupName","variant","CODECS","Playlist","createPlaylistID","groupID","parseManifest","onwarn","oninfo","customTagParsers","customTagMappers","llhls","customParser","setupMediaPlaylist","setupMediaPlaylists","resolveMediaGroupUris","mainForMedia","addPropertiesToMain","createGroupID","phonyUri","audioOnlyMain","groupId","DateRangesStorage","firstSegment","dateRanges","pendingDateRange","dateRangeClasses","dateRangesToProcess","classList","QUOTA_EXCEEDED_ERR","getStreamingNetworkErrorMetadata","requestType","parseFailure","isBadStatus","isFailure","errorMetadata","isBadStatusOrParseFailure","errorType","EventTarget$1","addLLHLSQueryDirectives","parameters","nextMSN","nextPart","parsedUri","updateSegment","updateSegments","update","oldSegments","newSegments","newIndex","newSegment","resolveSegmentUris","baseUri","getAllSegments","isPlaylistUnchanged","updateMain$1","newMedia","unchangedCheck","oldMedia","mergedPlaylist","refreshDelay","lastPart","lastDuration","playlistMetadataPayload","isLive","renditions","BANDWIDTH","RESOLUTION","PlaylistLoader","vhs","vhsOptions","mediaPlaylist","availableDateRanges","startingState","playlistString","playlistObject","metadata","oldRequest","shouldDelay","delay","mediaChange","mainPlaylistRef","isUpdate","pathway","oldPlaylistUri","oldPlaylistId","newPlaylistUri","newPlaylistId","updatedPlaylist","oldMediaPlaylist","basePlaylist","playlistId","baseID","newUri","newPlaylistID","newMediaPlaylist","newProps","baseURI","oldAttributes","keyIds","keysystem","keyId","callbackWrapper","reqResponse","callAllRequestHooks","requestSet","newOptions","requestCallback","callAllResponseHooks","responseSet","responseCallback","xhrFactory","XhrFunction","beforeRequest","_requestCallbackSet","_responseCallbackSet","xhrMethod","beforeRequestOptions","originalAbort","byterangeStr","byterangeEnd","byterangeStart","segmentXhrHeaders","textRange","formatHexString","formatAsciiString","createTransferableMessage","transferable","initSegmentId","segmentKeyId","hexDump","ascii","tagDump","textRanges","utils","SEGMENT_END_FUDGE_PERCENT","playerTimeToProgramTime","playerTime","transmuxerPrependedSeconds","startOfSegment","offsetFromSegmentStart","originalSegmentVideoDuration","videoTimingInfo","findSegmentForProgramTime","programTime","dateTimeObject","nextSegmentStart","lastSegmentStart","lastSegmentDuration","lastSegmentEnd","findSegmentForPlayerTime","segmentEnd","getOffsetFromTimestamp","comparisonTimeStamp","segmentDateTime","segmentTimeEpoch","verifyProgramDateTimeTags","getProgramTime","matchedSegment","programTimeObject","seekToProgramTime","retryCount","seekTo","pauseAfterSeek","mediaOffset","seekToTime","seekedCallback","callbackOnCompleted","containerRequest","id3Offset","finished","endRequestAndCallback","_bytes","progressListener","newPart","loaded","EventTarget","dashPlaylistUnchanged","aSegment","bSegment","aByterange","bByterange","dashGroupId","parseMainXml","mainXml","srcUrl","removeOldMediaGroupLabels","newMain","updateMain","oldMain","noChanges","playlistUpdate","equivalentSidx","compareSidxEntry","oldSidxMapping","newSidxMapping","currentSidxInfo","savedSidxInfo","filterChangedSidxMappings","mediaGroupSidx","DashPlaylistLoader","srcUrlOrPlaylist","mainPlaylistLoader","fin","REQUEST_TYPE","sidxContainer","sidxChanged","isFinalRendition","mainChanged","done","utcTiming","serverTime","location","endList","parsedManifest","mpl","mup","mediaID","mediaChanged","createMediaUpdateTimeout","metadataArray","eventStreamNode","defaultKID","Config","stringToArrayBuffer","browserWorkerPolyFill","workerObj","createObjectURL","blob","factory","objectUrl","worker","terminate","getWorkerString","workerCode$1","commonjsGlobal","Stream$8","flushSource","stream","MAX_UINT32$1","getUint64$3","dinf","esds","ftyp","mdat","mfhd","minf","moof","moov","mvex","mvhd","trak","tkhd","mdia","mdhd","hdlr","sdtp","stbl","stsd","traf","trex","trun$1","MAJOR_BRAND","MINOR_VERSION","AVC1_BRAND","VIDEO_HDLR","AUDIO_HDLR","HDLR_TYPES","VMHD","SMHD","DREF","STCO","STSC","STSZ","STTS","sequenceNumber","trackFragments","samples","videoSample","audioSample","sps","pps","sequenceParameterSets","pictureParameterSets","avc1Box","hSpacing","vSpacing","trackFragmentHeader","trackFragmentDecodeTime","trackFragmentRun","sampleDependencyTable","dataOffset","upperWordBaseMediaDecodeTime","lowerWordBaseMediaDecodeTime","audioTrun","videoTrun","trunHeader","durationPresent","sizePresent","flagsPresent","compositionTimeOffset","bytesOffest","header","sample","mp4Generator","fileType","movie","groupNalsIntoFrames","nalUnits","currentNal","currentFrame","frames","groupFramesIntoGops","currentGop","gops","extendFirstKeyFrame","createDefaultSample","sampleForFrame","frame","generateSampleTable$1","baseDataOffset","concatenateNalData","nalsByteLength","numberOfNals","totalByteLength","generateSampleTableForFrame","concatenateNalDataForFrame","frameUtils$1","highPrefix","lowPrefix","zeroFill","makeTable","metaTable","silence","silence_1","coneOfSilence","ONE_SECOND_IN_TS$4","secondsToVideoTs","secondsToAudioTs","videoTsToSeconds","audioTsToSeconds","audioTsToVideoTs","videoTsToAudioTs","metadataTsToSeconds","sampleRate","timestamp","timelineStartPts","keepOriginalTimestamps","clock$2","clock$1","sumFrameByteLengths","currentObj","sum","prefixWithSilence","audioAppendStartTs","videoBaseMediaDecodeTime","baseMediaDecodeTimeTs","frameDuration","audioGapDuration","audioFillFrameCount","audioFillDuration","silentFrame","firstFrame","trimAdtsFramesByEarliestDts","adtsFrames","earliestAllowedDts","generateSampleTable","concatenateFrameData","audioFrameUtils$1","ONE_SECOND_IN_TS$3","collectDtsInfo","clearDtsInfo","calculateTrackBaseMediaDecodeTime","baseMediaDecodeTime","scale","minSegmentDts","trackDecodeInfo$1","USER_DATA_REGISTERED_ITU_T_T35","RBSP_TRAILING_BITS","parseSei","payloadType","payloadSize","userIdentifier","parseUserData","sei","parseCaptionPackets","pts","userData","discardEmulationPreventionBytes$1","emulationPreventionBytesPositions","captionPacketParser","Stream$7","cea708Parser","CaptionStream$2","Cea608Stream","Cea708Stream","cc","newCaptionPackets","flushType","idx","packet","ccStream","CHARACTER_TRANSLATION_708","get708CharFromCode","newCode","within708TextBlock","Cea708Window","windowNum","Cea708Service","serviceNum","encoding","beforeRowOverflow","captionServiceEncodings","serviceProps","serviceName","byte0","byte1","packet708","packetData","blockSize","isExtended","isMultiByte","extended","currentByte","nextByte","char","charCodeArray","toHexString","byteArray","unicode","firstByte","secondByte","winAttr","displayedText","winId","penAttr","penColor","penLoc","CHARACTER_TRANSLATION","getCharFromCode","BOTTOM_ROW","ROWS","createDisplayBuffer","field","dataChannel","swap","char0","char1","indentations","logWarning","newBaseRow","baseRow","captionStream","streamTypes","Stream$6","MAX_TS","RO_THRESH","TYPE_SHARED","handleRollover$1","TimestampRolloverStream$1","lastDTS","referenceDTS","timestampRolloverStream","typedArrayIndexOf$1","typedArray","fromIndex","currentIndex","typedArrayIndexOf","textEncodingDescriptionByte","percentEncode$1","parseUtf8","parseIso88591$1","parseSyncSafeInteger$1","frameParsers","mimeTypeEndIndex","descriptionEndIndex","LINK_MIME_TYPE","parseId3Frames$1","frameSize","frameHeader","frameStart","tagSize","hasExtendedHeader","parseId3","Stream$5","StreamTypes$3","id3","MetadataStream","bufferSize","d","metadataStream","Stream$4","CaptionStream$1","StreamTypes$2","TimestampRolloverStream","TransportPacketStream","TransportParseStream","ElementaryStream","MP2T_PACKET_LENGTH$1","SYNC_BYTE$1","bytesInBuffer","everything","parsePsi","parsePat","parsePmt","psi","pat","pmt","sectionLength","tableEnd","programInfoLength","streamType","pid","segmentHadPmt","audio","timedMetadata","programMapTable","parsePes","pes","ptsDtsFlags","startPrefix","flushStream","forceFlush","packetFlushable","fragment","m2ts$1","m2ts_1","Stream$3","ONE_SECOND_IN_TS$2","AdtsStream$1","ADTS_SAMPLING_FREQUENCIES$1","handlePartialSegments","frameNum","frameLength","protectionSkipBytes","oldBuffer","sampleCount","adtsFrameDuration","skip","adts","ExpGolomb$1","workingData","workingBytesAvailable","workingWord","workingBitsAvailable","workingBytes","availableBytes","skipBytes","bits","valu","leadingZeroCount","clz","expGolomb","Stream$2","ExpGolomb","H264Stream$1","NalByteStream","PROFILES_WITH_OPTIONAL_SPS_DATA","syncPoint","swapBuffer","nalByteStream","trackId","currentPts","currentDts","readSequenceParameterSet","skipScalingList","expGolombDecoder","lastScale","nextScale","deltaScale","frameCropLeftOffset","frameCropRightOffset","frameCropTopOffset","frameCropBottomOffset","profileIdc","levelIdc","profileCompatibility","chromaFormatIdc","picOrderCntType","numRefFramesInPicOrderCntCycle","picWidthInMbsMinus1","picHeightInMapUnitsMinus1","frameMbsOnlyFlag","scalingListCount","sarRatio","aspectRatioIdc","h264","ADTS_SAMPLING_FREQUENCIES","parseId3TagSize","isLikelyAacData$1","parseSyncSafeInteger","percentEncode","parseIso88591","parseAdtsSize","lowThree","middle","highTwo","parseType$4","parseSampleRate","parseAacTimestamp","owner","Stream$1","aacUtils","AacStream$1","timeStamp","bytesLeft","tempLength","aac","AUDIO_PROPERTIES$1","audioProperties","VIDEO_PROPERTIES$1","videoProperties","mp4","frameUtils","audioFrameUtils","trackDecodeInfo","m2ts","AdtsStream","H264Stream","AacStream","isLikelyAacData","ONE_SECOND_IN_TS$1","AUDIO_PROPERTIES","VIDEO_PROPERTIES","VideoSegmentStream","AudioSegmentStream","Transmuxer","CoalesceStream","retriggerForStream","addPipelineLogRetriggers","transmuxer","pipeline","arrayEquals","generateSegmentTimingInfo","startDts","startPts","endDts","endPts","prependedContentDuration","ptsOffsetFromDts","decodeDuration","presentationDuration","earliestDts","videoClockCyclesOfSilencePrefixed","gopsToAlignWith","nalUnit","gopForFusion","firstGop","lastGop","alignedGops","gop","halfSecond","nearestDistance","dtsDistance","nearestGopObj","currentGopObj","alignIndex","gopIndex","byteLength","nalCount","alignEndIndex","matchFound","trimIndex","newGopsToAlignWith","output","caption","hasFlushed","videoTrack","audioTrack","timelineStartInfo","id3Frame","isAac","toUnsigned$3","toHexString$1","bin","parseType$3","parseType_1","toUnsigned$2","parseType$2","findBox$2","subresults","findBox_1","toUnsigned$1","getUint64$2","tfdt","parseTfdt$2","parseSampleFlags$1","parseSampleFlags_1","parseSampleFlags","trun","dataOffsetPresent","firstSampleFlagsPresent","sampleDurationPresent","sampleSizePresent","sampleFlagsPresent","sampleCompositionTimeOffsetPresent","parseTrun$2","tfhd","baseDataOffsetPresent","sampleDescriptionIndexPresent","defaultSampleDurationPresent","defaultSampleSizePresent","defaultSampleFlagsPresent","durationIsEmpty","defaultBaseIsMoof","parseTfhd$2","CaptionStream","findBox$1","parseTfdt$1","parseTrun$1","parseTfhd$1","window$2","mapToSample","approximateOffset","findSeiNals","avcStream","avcView","seiNal","lastMatchedSample","matchingSample","parseSamples","truns","defaultSampleDuration","defaultSampleSize","allSamples","trackRun","parseCaptionNals","videoTrackId","trafs","mdats","captionNals","mdatTrafPairs","matchingTraf","pair","headerInfo","parseEmbeddedCaptions","trackNals","CaptionParser","isInitialized","segmentCache","parsedCaptions","parsingPartial","videoTrackIds","timescales","parsedData","cachedSegment","nals","nal","captionParser","uint8ToCString$1","curChar","retString","uint8ToCString","getUint64$1","parseEmsgBox","boxData","scheme_id_uri","presentation_time","presentation_time_delta","event_duration","message_data","emsgBox","isValidEmsgBox","scaleTime","timeDelta","emsg","hasScheme","isValidV0Box","isDefined","isValidV1Box","emsg$1","toUnsigned","parseType$1","parseTfhd","parseTrun","parseTfdt","compositionStartTime","getVideoTrackIds","getTracks","getTimescaleFromMediaHeader","getEmsgID3","parseId3Frames","init","traks","lowestTime","baseTime","trafBoxes","parsedTfhd","parsedTfdt","parsedTrun","hdlrs","tkhds","handlerType","tkhdVersion","sampleDescriptions","codecBox","codecConfig","codecConfigType","segmentData","emsgBoxes","parsedBox","parsedId3Frames","probe$2","StreamTypes$1","parsePid","parsePayloadUnitStartIndicator","parseAdaptionField","parseType","pmtPid","pusi","payloadOffset","parsePesType","parsePesTime","parseNalUnitType","videoPacketContainsKeyFrame","frameBuffer","frameI","frameSyncPoint","foundKeyFrame","probe$1","StreamTypes","handleRollover","probe","ONE_SECOND_IN_TS","MP2T_PACKET_LENGTH","SYNC_BYTE","parsePsi_","table","parseAudioPes_","pesType","parsed","endLoop","parseVideoPes_","firstKeyFrame","adjustTimestamp_","baseTimestamp","audioBaseTimestamp","info","videoBaseTimestamp","inspectAac_","audioCount","audioTimescale","inspectTs_","inspect","isAacData","tsInspector","wireTransmuxerEvents","initArray","gopInfo","timingInfo","videoSegmentTimingInfo","audioSegmentTimingInfo","trackInfo","audioTimingInfo","MessageHandlers","id3Frames","baseStartTime","tsStartTime","timeInfo","timestampOffset","TransmuxWorker","handleData_","transmuxedData","captionStreams","videoFrameDtsTime","videoFramePtsTime","handleDone_","handleGopInfo_","processTransmux","audioAppendStart","remux","onData","onTrackInfo","onAudioTimingInfo","onVideoTimingInfo","onVideoSegmentTimingInfo","onAudioSegmentTimingInfo","onId3","onCaptions","onDone","onEndedTimeline","onTransmuxerLog","isEndOfTimeline","triggerSegmentEventFn","waitForEndedTimelineEvent","handleMessage","dequeue","handleError","segmentInfoPayload","byteOffset","processAction","enqueueAction","reset","endTimeline","transmux","createTransmuxer","term","segmentTransmuxer","workerCallback","endAction","listenForEndEvent","isArrayBuffer","transfers","REQUEST_ERRORS","abortAll","activeXhrs","getRequestStats","getProgressStats","progressEvent","stats","handleErrors","handleKeyResponse","finishProcessingFn","errorObj","keyInfo","parseInitSegment","handleInitSegmentResponse","parseError","handleSegmentResponse","responseType","newBytes","transmuxAndNotify","trackInfoFn","timingInfoFn","videoSegmentTimingInfoFn","audioSegmentTimingInfoFn","id3Fn","captionsFn","endedTimelineFn","dataFn","doneFn","fmp4Tracks","isMuxed","audioStartFn","audioEndFn","videoStartFn","videoEndFn","finish","dispatchType","probeResult","handleSegmentBytes","bytesAsUint8Array","finishLoading","emsgData","decrypt","encryptedBytes","decryptionWorker","decryptionHandler","decrypted","decryptError","keyBytes","decryptSegment","decryptedBytes","waitForCompletion","didError","segmentFinish","handleLoadEnd","loadendState","abortFn","handleProgress","progressFn","mediaSegmentRequest","xhrOptions","keyRequestOptions","keyRequestCallback","keyXhr","mapKeyRequestOptions","mapKeyRequestCallback","mapKeyXhr","initSegmentOptions","initSegmentRequestCallback","initSegmentXhr","segmentRequestOptions","segmentRequestCallback","segmentXhr","activeXhr","logFn$1","getCodecs","mediaAttributes","isMaat","unwrapCodecList","codecList","codecCount","codecObj","codecsForPlaylist","codecInfo","defaultCodecs","logFn","representationToString","safeGetComputedStyle","property","stableSort","sortFn","newArray","right","cmp","comparePlaylistBandwidth","leftBandwidth","rightBandwidth","comparePlaylistResolution","leftWidth","rightWidth","simpleSelector","playerBandwidth","limitRenditionByPlayerDimensions","playlistController","sortedPlaylistReps","rep","enabledPlaylistReps","bandwidthPlaylistReps","highestRemainingBandwidthRep","bandwidthBestRep","chosenRep","haveResolution","resolutionBestRepList","resolutionBestRep","resolutionPlusOneList","resolutionPlusOneSmallest","resolutionPlusOneRep","leastPixelDiffRep","leastPixelDiffList","lastBandwidthSelector","pixelRatio","movingAverageBandwidthSelector","decay","average","lastSystemBandwidth","minRebufferMaxBandwidthSelector","syncController","compatiblePlaylists","enabledPlaylists","rebufferingEstimates","numRequests","rebufferingImpact","noRebufferingPlaylists","estimate","lowestBitrateCompatibleVariantSelector","concatSegments","segmentObj","compactSegmentUrlDescription","resolvedUri","createCaptionsTrackIfNotExists","inbandTextTracks","instreamId","def","captionService","addCaptionData","captionArray","Cue","deprecateOldCue","addMetadata","videoDuration","metadataTrack","cuesArray","cuesGroupedByStartTime","timeSlot","sortedStartTimes","cueGroup","finiteDuration","nextTime","dateRangeAttr","dateRangeKeysToOmit","addDateRangeMetadata","createMetadataTrackIfNotExists","removeCuesFromTrack","removeDuplicateCuesFromTrack","uniqueCues","cueKey","gopsSafeToAlignWith","mapping","currentTimePts","updateGopBuffer","replace","removeGopBuffer","updatedBuffer","shallowEqual","akeys","bkeys","getSyncSegmentCandidate","targetTime","timelineSegments","MIN_BACK_BUFFER","CHECK_BUFFER_DELAY","finite","MIN_SEGMENT_DURATION_TO_SAVE_STATS","illegalMediaSwitch","loaderType","startingMedia","safeBackBufferTrimTime","trimTime","maxTrimTime","segmentInfoString","seq","segmentLen","selection","hasPartIndex","zeroBasedPartCount","timingInfoPropertyForMedia","timestampOffsetForSegment","overrideCheck","shouldWaitForTimelineChange","timelineChangeController","audioDisabled","lastMainTimelineChange","pendingAudioTimelineChange","mediaDuration","timingInfos","maxDuration","typeTimingInfo","segmentTooLong","getTroublesomeSegmentDurationMessage","sourceType","isSegmentWayTooLong","isSegmentSlightlyTooLong","segmentTooLongMessage","isEncrypted","isMediaInitialization","SegmentLoader","newState","requestId","hasAudio","hasVideo","storedMap","storedKey","newPlaylist","oldId","mediaSequenceDiff","mediaIndex","isFmp4","force","removesRemaining","removeFinished","appendedLastSegment","appendedLastPart","bufferedTime","preloaded","haveEnoughBuffer","syncInfo","mediaInfoForTime","nextSegment","hasIndependentSegments","lastSegmentLastPart","ended","finalTargetTime","mediaSequenceSyncInfo","nextMediaSequenceSyncInfo","independent","isSyncRequest","forceTimestampOffset","audioBufferedEnd","measuredBandwidth","requestTimeRemaining","timeUntilRebuffer$1","switchCandidate","timeSavedBySwitching","minimumTimeSaving","simpleSegment","timeType","timingInfoProperty","captionData","captionTracks","captionTrack","trackName","callQueue","fun","loadQueue","useVideoTimingInfo","firstVideoFrameTimeForData","audioBuffered","videoBuffered","audioBufferStart","audioBufferEnd","videoBufferStart","videoBufferEnd","timeToRemoveUntil","segmentTimingInfo","isEndOfStream","isWalkingForward","isDiscontinuity","removeToTime","previousSegment","iv","timelineMapping","currentStart","currentVideoTimestampOffset","waitForVideo","waitForAudio","illegalMediaSwitchError","didChange","prioritizedTimingInfo","segmentDurationMessage","badSegmentGuess","badPartGuess","segmentProcessingTime","segmentProcessingThroughput","toTitleCase","bufferTypes","updating","sourceUpdater","sourceBuffer","nextQueueIndexOfType","queueEntry","shiftQueue","queueIndex","cleanupBuffer","titleType","inSourceBuffers","mediaSource","actions","onError","mime","newCodecBase","oldCodec","pushQueue","onUpdateend","bufferedRangesForType","descriptiveString","SourceUpdater","que","uint8ToUtf8","uintArray","bufferToHexString","uInt8Buffer","VTT_LINE_TERMINATORS","NoVttJsError","VTTSegmentLoader","combinedByteLength","combinedSegment","checkTimestampOffset","decodeBytesToString","mapData","mappingObj","MPEGTS","LOCAL","diff","firstStart","lastStart","valueIn90khz","referenceIn90khz","findAdCue","mediaTime","updateAdCues","adOffset","adTotal","SyncInfo","appended","SyncInfoData","segmentSyncInfo","partsSyncInfo","partSyncInfo","MediaSequenceSync","syncInfoData","startingMediaSequence","startingTime","newStorage","newDiagnostics","currentMediaSequence","prevSyncInfoData","segmentStart","segmentIsAppended","currentPartStart","partStart","partEnd","partIsAppended","fallback","DependantMediaSequenceSync","MAX_MEDIA_SEQUENCE_DIFF_FOR_SYNC","syncPointStrategies","mediaSequenceSync","lastDistance","datetimeMapping","z","discontinuity","discontinuitySync","SyncController","syncPoints","syncPointInfo","strategy","selectedSegment","bestSyncPoint","bestDistance","bestStrategy","newDistance","lastRemovedSegment","playlistTimestamp","shouldSaveTimelineMapping","didCalculateSegmentTimeMapping","dateTime","mediaIndexDiff","accuracy","TimelineChangeController","to","workerCode","unpad","padded","precompute","tables","encTable","decTable","sbox","sboxInv","xInv","th","x2","x4","x8","tEnc","tDec","aesTables","AES","tmp","keyLen","rcon","encKey","decKey","encrypted0","encrypted1","encrypted2","encrypted3","out","a2","c2","nInnerRounds","kIndex","table0","table1","table2","table3","AsyncStream","job","ntoh","word","encrypted","initVector","encrypted32","decipher","decrypted32","init0","init1","init2","init3","wordIx","Decrypter","audioTrackKind_","stopLoaders","segmentLoader","startLoaders","playlistLoader","onGroupChanged","mainSegmentLoader","activeTrack","activeGroup","previousActiveLoader","lastGroup","onGroupChanging","onTrackChanged","lastTrack","pc","excludePlaylist","defaultTrack","setupListeners","requestOptions","initialize","mediaGroups","logger_","variantLabel","groupMatch","variants","groupKeys","groupPropertyList","getActiveGroup","activeTrack_","setupMediaGroups","audioSegmentLoader","onAudioTrackChanged","createMediaTypes","SteeringManifest","ContentSteeringController","steeringTag","steeringUri","reloadUri","errorInfo","retrySeconds","steeringManifestJson","parsedMetadata","steeringUrl","steeringUrlObject","proxyServerUrlObject","dataUri","urlObject","networkThroughput","pathwayKey","throughputKey","steeringJson","nextPathway","pathwaysByPriority","proxyURI","steeringURI","ttl","ttlMS","newTag","ABORT_EARLY_EXCLUSION_SECONDS","Vhs$1","loaderStats","sumLoaderStat","stat","shouldSwitchToMedia","currentPlaylist","nextPlaylist","bufferLowWaterLine","bufferHighWaterLine","bufferBasedABR","sharedLogLine","isBuffered","forwardBuffer","maxBufferLowWaterLine","nextBandwidth","currBandwidth","logLine","PlaylistController","externVhs","useCueTags","playlistExclusionDuration","enableLowInitialPlaylist","cacheEncryptionKeys","leastPixelDiffSelector","maxPlaylistRetries","segmentLoaderSettings","onLoad","getBandwidth","timeToLoadedDataStart","newId","dashMediaPlaylists","defaultPlaylists","defaultGroup","requestTimeout","selectedMedia","defaultDemuxed","audioGroupKeys","updateCodecs","startPoint","mainMediaInfo","absolutePlaylistEnd","playlistToExclude","reIncludeDelay","reincluded","excludeUntil","errorMessage","delayDuration","filter","fnNames","loaders","dontFilterPlaylist","loader","audioSeekable","mainSeekable","oldEnd","oldStart","usingAudioLoader","hasMainMediaInfo","hasAudioMediaInfo","playlistCodecs","supportFunction","unsupportedCodecs","unsupportedAudio","supporter","switchMessages","newCodec","ids","unsupported","codecCount_","videoDetails","audioDetails","exclusionReasons","variantCodecs","variantCodecCount","variantVideoDetails","variantAudioDetails","newMax","availablePathways","newPathways","serviceLocation","currentPathway","didEnablePlaylists","pathwayId","differentPathwayId","noExcludeUntil","currentPathwayClones","nextPathwayClones","oldClone","aParams","bParams","nonUsableKeyStatusCount","NON_USABLE","keyIdSet","USABLE","hasUsableKeyStatus","nonUsableExclusion","isNonHD","excludedForNonUsableKey","formattedKeyIdString","enableFunction","playlistID","changePlaylistFn","incompatible","currentlyEnabled","Representation","vhsHandler","qualityChangeFunction","renditionSelectionMixin","timerCancelEvents","PlaybackWatcher","playHandler","canPlayHandler","waitingHandler","cancelTimerHandler","loaderTypes","loaderChecks","setSeekingHandlers","isBufferedDifferent","isAfterSeekableRange","minAppendedDuration","bufferedToCheck","nextRange","livePoint","allowSeeksWithinUnsafeLiveWindow","allowedEnd","isLLHLS","gap","lastVideoRange","videoRange","audioRange","scheduledCurrentTime","gaps","defaultOptions","initPlugin","lastCalled","localOptions","loadedMetadataHandler","cleanupEvents","reinitPlugin","reloadSourceOnError","version$4","version$3","version$2","version$1","Vhs","LOCAL_STORAGE_KEY","handleVhsMediaChange","selectedIndex","handleVhsLoadedMetadata","emeKeySystems","keySystemOptions","audioPlaylist","videoContentType","audioContentType","keySystemContentTypes","getAllPsshKeySystemsOptions","keySystems","keySystemsArr","keySystemsOptions","keySystemsObj","waitForKeySessionCreation","sourceKeySystems","audioMedia","mainPlaylists","keySystemsOptionsArr","initializationFinishedPromises","keySessionCreatedPromises","setupEmeOptions","sourceOptions","getVhsLocalStorage","storedObject","updateVhsLocalStorage","objectToStore","expandDataUri","addOnRequestHook","addOnResponseHook","removeOnRequestHook","removeOnResponseHook","canItPlay","Component","VhsHandler","_player","fullscreenElement","customPixelRatio","playbackWatcherOptions","defaultSelector","selectPlaylist","throughput","playerBandwidthEst","networkInformation","tenMbpsAsBitsPerSecond","networkInfoBandwidthEstBitsPerSec","invBandwidth","invThroughput","audioPlaylistLoader","didSetupEmeOptions","playlistControllerEvents","playbackWatcher","VhsSourceHandler","simpleType","overrideNative","defaultOverrideNative","supportsNativeMediaSources"],"mappings":"wpBAAA,IAAIA,GAEA,OAAO,OAAW,IAClBA,GAAM,OACC,OAAOC,GAAW,IACzBD,GAAMC,GACC,OAAO,KAAS,IACvBD,GAAM,KAENA,GAAM,CAAE,EAGZ,IAAAE,GAAiBF,kBCZFG,GAAA,CAAA,qHCAf,IAAIC,GAAW,OAAOH,GAAW,IAAcA,GAC3C,OAAO,OAAW,IAAc,OAAS,CAAA,EACzCI,GAASC,GAETC,GAEA,OAAO,SAAa,IACpBA,GAAQ,UAERA,GAAQH,GAAS,2BAA2B,EAEvCG,KACDA,GAAQH,GAAS,2BAA2B,EAAIC,KAIxD,IAAAG,GAAiBD,kBChBjB,IAAAE,GAAiBC,GAEjB,SAASA,GAAeC,EAAKC,EAAS,CAClC,IAAIC,EACAC,EAAQ,KAEZ,GAAI,CACAD,EAAO,KAAK,MAAMF,EAAKC,CAAO,CACjC,OAAQG,EAAK,CACVD,EAAQC,CAChB,CAEI,MAAO,CAACD,EAAOD,CAAI,CACvB,qCCbA,SAASG,IAAW,CAClB,OAAOA,GAAW,OAAO,OAAS,OAAO,OAAO,KAAI,EAAK,SAAUC,EAAG,CACpE,QAAS,EAAI,EAAG,EAAI,UAAU,OAAQ,IAAK,CACzC,IAAI,EAAI,UAAU,CAAC,EACnB,QAASC,KAAK,GAAI,CAAE,GAAE,eAAe,KAAK,EAAGA,CAAC,IAAMD,EAAEC,CAAC,EAAI,EAAEA,CAAC,EACpE,CACI,OAAOD,CACR,EAAED,GAAS,MAAM,KAAM,SAAS,CACnC,wICRA,IAAAG,GAAiBC,GAEbC,GAAW,OAAO,UAAU,SAEhC,SAASD,GAAYE,EAAI,CACvB,GAAI,CAACA,EACH,MAAO,GAET,IAAIC,EAASF,GAAS,KAAKC,CAAE,EAC7B,OAAOC,IAAW,qBACf,OAAOD,GAAO,YAAcC,IAAW,mBACvC,OAAO,OAAW,MAEjBD,IAAO,OAAO,YACdA,IAAO,OAAO,OACdA,IAAO,OAAO,SACdA,IAAO,OAAO,OACpB,CCfA,SAASE,GAAgCC,EAAGC,EAAgB,CAAE,IAAIC,EAAK,OAAO,OAAW,KAAeF,EAAE,OAAO,QAAQ,GAAKA,EAAE,YAAY,EAAG,GAAIE,EAAI,OAAQA,EAAKA,EAAG,KAAKF,CAAC,GAAG,KAAK,KAAKE,CAAE,EAAG,GAAI,MAAM,QAAQF,CAAC,IAAME,EAAKC,GAA4BH,CAAC,IAAMC,EAAqD,CAAMC,IAAIF,EAAIE,GAAI,IAAIE,EAAI,EAAG,OAAO,UAAY,CAAE,OAAIA,GAAKJ,EAAE,OAAe,CAAE,KAAM,EAAI,EAAW,CAAE,KAAM,GAAO,MAAOA,EAAEI,GAAG,CAAC,CAAG,CAAG,CAAG,MAAM,IAAI,UAAU;AAAA,mFAAuI,CAAE,CAE1lB,SAASD,GAA4BH,EAAGK,EAAQ,CAAE,GAAKL,EAAW,IAAI,OAAOA,GAAM,SAAU,OAAOM,GAAkBN,EAAGK,CAAM,EAAG,IAAIb,EAAI,OAAO,UAAU,SAAS,KAAKQ,CAAC,EAAE,MAAM,EAAG,EAAE,EAAgE,GAAzDR,IAAM,UAAYQ,EAAE,cAAaR,EAAIQ,EAAE,YAAY,MAAUR,IAAM,OAASA,IAAM,MAAO,OAAO,MAAM,KAAKQ,CAAC,EAAG,GAAIR,IAAM,aAAe,2CAA2C,KAAKA,CAAC,EAAG,OAAOc,GAAkBN,EAAGK,CAAM,EAAE,CAE9Z,SAASC,GAAkBC,EAAKC,EAAK,EAAMA,GAAO,MAAQA,EAAMD,EAAI,UAAQC,EAAMD,EAAI,QAAQ,QAASH,EAAI,EAAGK,EAAO,IAAI,MAAMD,CAAG,EAAGJ,EAAII,EAAKJ,IAAOK,EAAKL,CAAC,EAAIG,EAAIH,CAAC,EAAK,OAAOK,CAAK,CAErL,IAAIC,GAAmC,UAAY,CACjD,SAASA,GAAsB,CAC7B,KAAK,uBAAyB,IAAI,IAClC,KAAK,SAAW,EACpB,CAEE,IAAIC,EAASD,EAAoB,UAEjC,OAAAC,EAAO,aAAe,UAAwB,CAC5C,OAAO,KAAK,QACb,EAEDA,EAAO,OAAS,UAAkB,CAChC,KAAK,SAAW,EACjB,EAEDA,EAAO,QAAU,UAAmB,CAClC,KAAK,SAAW,EACjB,EAEDA,EAAO,MAAQ,UAAiB,CAC9B,KAAK,uBAAyB,IAAI,IAClC,KAAK,SAAW,EACjB,EAEDA,EAAO,eAAiB,SAAwBC,EAAMC,EAAa,CAC5D,KAAK,uBAAuB,IAAID,CAAI,GACvC,KAAK,uBAAuB,IAAIA,EAAM,IAAI,GAAK,EAGjD,IAAIE,EAAkB,KAAK,uBAAuB,IAAIF,CAAI,EAE1D,OAAIE,EAAgB,IAAID,CAAW,EAE1B,IAGTC,EAAgB,IAAID,CAAW,EACxB,GACR,EAEDF,EAAO,kBAAoB,SAA2BC,EAAMC,EAAa,CACvE,IAAIC,EAAkB,KAAK,uBAAuB,IAAIF,CAAI,EAE1D,OAAIE,GAAmBA,EAAgB,IAAID,CAAW,GACpDC,EAAgB,OAAOD,CAAW,EAC3B,IAGF,EACR,EAEDF,EAAO,wBAA0B,SAAiCC,EAAM,CACtE,IAAIE,EAAkB,KAAK,uBAAuB,IAAIF,CAAI,EAE1D,OAAKE,GAIL,KAAK,uBAAuB,OAAOF,CAAI,EACvC,KAAK,uBAAuB,IAAIA,EAAM,IAAI,GAAK,EACxC,IALE,EAMV,EAEDD,EAAO,MAAQ,UAAiB,CAC9B,OAAK,KAAK,uBAAuB,MAIjC,KAAK,uBAAyB,IAAI,IAC3B,IAJE,EAKV,EAEDA,EAAO,WAAa,SAAoBC,EAAM,CAC5C,OAAO,KAAK,uBAAuB,IAAIA,CAAI,GAAK,IAAI,GACrD,EAEDD,EAAO,QAAU,SAAiBC,EAAMG,EAAS,CAG/C,QAFIC,EAAe,KAAK,WAAWJ,CAAI,EAE9BK,EAAYlB,GAAgCiB,CAAY,EAAGE,EAAO,EAAEA,EAAQD,EAAW,GAAE,MAAO,CACvG,IAAIJ,EAAcK,EAAM,MAExB,GAAI,CACFH,EAAUF,EAAYE,CAAO,CAC9B,MAAW,CAClB,CACA,CAEI,OAAOA,CACR,EAEML,CACT,EAAG,EAEHM,GAAiBN,GCrGbS,GAA4B,UAAY,CAC1C,SAASA,GAAe,CACtB,KAAK,aAAe,EACpB,KAAK,aAAe,GACpB,KAAK,YAAc,GACnB,KAAK,cAAgB,IACrB,KAAK,SAAW,EACpB,CAEE,IAAIR,EAASQ,EAAa,UAE1B,OAAAR,EAAO,aAAe,UAAwB,CAC5C,OAAO,KAAK,QACb,EAEDA,EAAO,OAAS,UAAkB,CAChC,KAAK,SAAW,EACjB,EAEDA,EAAO,QAAU,UAAmB,CAClC,KAAK,SAAW,EACjB,EAEDA,EAAO,MAAQ,UAAiB,CAC9B,KAAK,aAAe,EACpB,KAAK,aAAe,GACpB,KAAK,YAAc,GACnB,KAAK,cAAgB,IACrB,KAAK,SAAW,EACjB,EAEDA,EAAO,eAAiB,UAA0B,CAChD,OAAO,KAAK,YACb,EAEDA,EAAO,eAAiB,SAAwBS,EAAa,CAC3D,KAAK,aAAeA,CACrB,EAEDT,EAAO,eAAiB,UAA0B,CAChD,OAAO,KAAK,YACb,EAEDA,EAAO,eAAiB,SAAwBU,EAAa,CAC3D,KAAK,aAAeA,CACrB,EAEDV,EAAO,cAAgB,UAAyB,CAC9C,OAAO,KAAK,WACb,EAEDA,EAAO,cAAgB,SAAuBW,EAAY,CACxD,KAAK,YAAcA,CACpB,EAEDX,EAAO,gBAAkB,UAA2B,CAClD,OAAO,KAAK,aACb,EAEDA,EAAO,gBAAkB,SAAyBY,EAAc,CAC9D,KAAK,cAAgBA,CACtB,EAEDZ,EAAO,YAAc,SAAqBa,EAAO,CAC/C,IAAIC,EAAOD,IAAU,OAAS,CAAE,EAAGA,EAC/BJ,EAAcK,EAAK,YACnBJ,EAAcI,EAAK,YACnBH,EAAaG,EAAK,WAClBF,EAAeE,EAAK,aAExB,OAAO,IAAIC,GAAM,CACf,YAAaN,GAAe,KAAK,aACjC,YAAaC,GAAe,KAAK,aACjC,WAAYC,GAAc,KAAK,YAC/B,aAAcC,GAAgB,KAAK,aACzC,CAAK,CACF,EAEMJ,CACT,EAAG,EAECO,GAAqB,UAAY,CACnC,SAASA,EAAMC,EAAS,CACtB,KAAK,aAAeA,EAAQ,YAC5B,KAAK,aAAeA,EAAQ,YAC5B,KAAK,YAAcA,EAAQ,WAC3B,KAAK,cAAgBA,EAAQ,aAC7B,KAAK,gBAAkB,CAC3B,CAEE,IAAIC,EAAUF,EAAM,UAEpB,OAAAE,EAAQ,kBAAoB,UAA6B,CACvD,KAAK,kBACL,IAAIC,EAAa,KAAK,cAAgB,KAAK,aAC3C,KAAK,cAAgB,KAAK,cAAgBA,CAC3C,EAEDD,EAAQ,YAAc,UAAuB,CAC3C,OAAO,KAAK,gBAAkB,KAAK,YACpC,EAEDA,EAAQ,gBAAkB,UAA2B,CACnD,OAAO,KAAK,aACb,EAEDA,EAAQ,2BAA6B,UAAsC,CACzE,OAAQ,EAAI,KAAK,aAAe,KAAK,aACtC,EAEDA,EAAQ,2BAA6B,UAAsC,CACzE,OAAQ,EAAI,KAAK,aAAe,KAAK,aACzC,EASEA,EAAQ,sBAAwB,UAAiC,CAC/D,IAAIE,EAAW,KAAK,2BAA4B,EAC5CC,EAAY,KAAK,2BAA4B,EACjD,OAAOD,EAAW,KAAK,OAAM,GAAMC,EAAYD,EAChD,EAEMJ,CACT,EAAG,EAEHM,GAAiBb,GClIbc,GAASpD,GAETqD,GAAsB,SAA6BC,EAAUC,EAAoB,CACnF,OAAIA,IAAuB,SACzBA,EAAqB,IAGhB,SAAU9C,EAAK+C,EAAUC,EAAc,CAE5C,GAAIhD,EAAK,CACP6C,EAAS7C,CAAG,EACZ,MACD,CAGD,GAAI+C,EAAS,YAAc,KAAOA,EAAS,YAAc,IAAK,CAC5D,IAAIE,EAAQD,EAEZ,GAAIF,EACF,GAAIH,GAAO,YAAa,CACtB,IAAIO,EAAUC,GAAWJ,EAAS,SAAWA,EAAS,QAAQ,cAAc,CAAC,EAE7E,GAAI,CACFE,EAAQ,IAAI,YAAYC,CAAO,EAAE,OAAOF,CAAY,CACrD,MAAW,CAAA,CACtB,MACUC,EAAQ,OAAO,aAAa,MAAM,KAAM,IAAI,WAAWD,CAAY,CAAC,EAIxEH,EAAS,CACP,MAAOI,CACf,CAAO,EACD,MACD,CAGDJ,EAAS,KAAMG,CAAY,CAC5B,CACH,EAEA,SAASG,GAAWC,EAAmB,CACrC,OAAIA,IAAsB,SACxBA,EAAoB,IAGfA,EAAkB,YAAW,EAAG,MAAM,GAAG,EAAE,OAAO,SAAUF,EAASG,EAAa,CACvF,IAAIC,EAAqBD,EAAY,MAAM,GAAG,EAC1C/B,EAAOgC,EAAmB,CAAC,EAC3BC,EAAQD,EAAmB,CAAC,EAEhC,OAAIhC,EAAK,KAAM,IAAK,UACXiC,EAAM,KAAM,EAGdL,CACR,EAAE,OAAO,CACZ,CAEA,IAAAM,GAAiBZ,GC3DbD,GAASpD,GAETU,GAAWwD,GAEXpD,GAAaqD,GAEbtC,GAAsBuC,GAEtB9B,GAAe+B,GAEnBC,GAAU,YAAcC,GACxBD,GAAU,2BAA6B,IAAIzC,GAC3CyC,GAAU,4BAA8B,IAAIzC,GAC5CyC,GAAU,aAAe,IAAIhC,GAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAQA,IAAIkC,GAAe,SAAsBC,EAAS,CAChD,IAAIC,EAAS,CAAE,EAEf,OAAKD,GAILA,EAAQ,KAAI,EAAG,MAAM;AAAA,CAAI,EAAE,QAAQ,SAAUE,EAAK,CAChD,IAAIC,EAAQD,EAAI,QAAQ,GAAG,EACvBE,EAAMF,EAAI,MAAM,EAAGC,CAAK,EAAE,KAAM,EAAC,YAAa,EAC9CZ,EAAQW,EAAI,MAAMC,EAAQ,CAAC,EAAE,KAAM,EAEnC,OAAOF,EAAOG,CAAG,EAAM,IACzBH,EAAOG,CAAG,EAAIb,EACL,MAAM,QAAQU,EAAOG,CAAG,CAAC,EAClCH,EAAOG,CAAG,EAAE,KAAKb,CAAK,EAEtBU,EAAOG,CAAG,EAAI,CAACH,EAAOG,CAAG,EAAGb,CAAK,CAEvC,CAAG,EACMU,CACT,EAEAI,GAAc,QAAGR,GAEKQ,GAAA,QAAA,QAAGR,GACzBA,GAAU,eAAiBlB,GAAO,gBAAkB2B,GACpDT,GAAU,eAAiB,oBAAqB,IAAIA,GAAU,eAAmBA,GAAU,eAAiBlB,GAAO,eACnH4B,GAAa,CAAC,MAAO,MAAO,OAAQ,QAAS,OAAQ,QAAQ,EAAG,SAAUC,EAAQ,CAChFX,GAAUW,IAAW,SAAW,MAAQA,CAAM,EAAI,SAAUC,EAAKpC,EAASQ,EAAU,CAClF,OAAAR,EAAUqC,GAAWD,EAAKpC,EAASQ,CAAQ,EAC3CR,EAAQ,OAASmC,EAAO,YAAa,EAC9BG,GAAWtC,CAAO,CAC1B,CACH,CAAC,EAED,SAASkC,GAAaK,EAAOC,EAAU,CACrC,QAAS/D,EAAI,EAAGA,EAAI8D,EAAM,OAAQ9D,IAChC+D,EAASD,EAAM9D,CAAC,CAAC,CAErB,CAEA,SAASgE,GAAQlF,EAAK,CACpB,QAASkB,KAAKlB,EACZ,GAAIA,EAAI,eAAekB,CAAC,EAAG,MAAO,GAGpC,MAAO,EACT,CAEA,SAAS4D,GAAWD,EAAKpC,EAASQ,EAAU,CAC1C,IAAIkC,EAASN,EAEb,OAAIpE,GAAWgC,CAAO,GACpBQ,EAAWR,EAEP,OAAOoC,GAAQ,WACjBM,EAAS,CACP,IAAKN,CACN,IAGHM,EAAS9E,GAAS,CAAE,EAAEoC,EAAS,CAC7B,IAAKoC,CACX,CAAK,EAGHM,EAAO,SAAWlC,EACXkC,CACT,CAEA,SAASlB,GAAUY,EAAKpC,EAASQ,EAAU,CACzC,OAAAR,EAAUqC,GAAWD,EAAKpC,EAASQ,CAAQ,EACpC8B,GAAWtC,CAAO,CAC3B,CAEA,SAASsC,GAAWtC,EAAS,CAC3B,GAAI,OAAOA,EAAQ,SAAa,IAC9B,MAAM,IAAI,MAAM,2BAA2B,EAI7C,GAAIA,EAAQ,aAAewB,GAAU,2BAA2B,aAAY,EAAI,CAC9E,IAAImB,EAA4B,CAC9B,IAAK3C,EAAQ,KAAOA,EAAQ,IAC5B,QAASA,EAAQ,SAAW,CAAE,EAC9B,KAAMA,EAAQ,KACd,SAAUA,EAAQ,UAAY,CAAE,EAChC,MAAOA,EAAQ,MACf,QAASA,EAAQ,OAClB,EACG4C,EAAiBpB,GAAU,2BAA2B,QAAQxB,EAAQ,YAAa2C,CAAyB,EAChH3C,EAAQ,IAAM4C,EAAe,IAC7B5C,EAAQ,QAAU4C,EAAe,QACjC5C,EAAQ,KAAO4C,EAAe,KAC9B5C,EAAQ,SAAW4C,EAAe,SAClC5C,EAAQ,MAAQ4C,EAAe,MAC/B5C,EAAQ,QAAU4C,EAAe,OACrC,CAEE,IAAIC,EAAS,GAETrC,EAAW,SAAgB7C,EAAK+C,EAAUoC,EAAM,CAC7CD,IACHA,EAAS,GACT7C,EAAQ,SAASrC,EAAK+C,EAAUoC,CAAI,EAEvC,EAED,SAASC,GAAmB,CAGtBC,EAAI,aAAe,GAAK,CAACxB,GAAU,4BAA4B,gBACjE,WAAWyB,EAAU,CAAC,CAE5B,CAEE,SAASC,GAAU,CAEjB,IAAIJ,EAAO,OAQX,GANIE,EAAI,SACNF,EAAOE,EAAI,SAEXF,EAAOE,EAAI,cAAgBG,GAAOH,CAAG,EAGnCI,EACF,GAAI,CACFN,EAAO,KAAK,MAAMA,CAAI,CACvB,MAAW,CAAA,CAGd,OAAOA,CACX,CAEE,SAASO,EAAUC,EAAK,CAUtB,GATA,aAAaC,CAAY,EACzB,aAAavD,EAAQ,YAAY,EAE3BsD,aAAe,QACnBA,EAAM,IAAI,MAAM,IAAMA,GAAO,+BAA+B,GAG9DA,EAAI,WAAa,EAEb,CAACE,GAAWhC,GAAU,aAAa,aAAY,GAAMxB,EAAQ,OAASA,EAAQ,MAAM,YAAW,EAAI,CACrGA,EAAQ,aAAe,WAAW,UAAY,CAC5CA,EAAQ,MAAM,oBAEdA,EAAQ,IAAMgD,EAEdV,GAAWtC,CAAO,CAC1B,EAASA,EAAQ,MAAM,uBAAuB,EACxC,MACD,CAGD,GAAIA,EAAQ,aAAewB,GAAU,4BAA4B,aAAY,EAAI,CAC/E,IAAIiC,EAA6B,CAC/B,QAASC,EAAgB,SAAW,CAAE,EACtC,KAAMA,EAAgB,KACtB,YAAaV,EAAI,YACjB,aAAcA,EAAI,YACnB,EAEGW,EAAkBnC,GAAU,4BAA4B,QAAQxB,EAAQ,YAAayD,CAA0B,EAEnHC,EAAgB,KAAOC,EAAgB,KACvCD,EAAgB,QAAUC,EAAgB,OAChD,CAEI,OAAOnD,EAAS8C,EAAKI,CAAe,CACrC,CAGD,SAAST,GAAW,CAClB,GAAI,CAAAO,EACJ,KAAII,EACJ,aAAaL,CAAY,EACzB,aAAavD,EAAQ,YAAY,EAE7BA,EAAQ,QAAUgD,EAAI,SAAW,OAEnCY,EAAS,IAETA,EAASZ,EAAI,SAAW,KAAO,IAAMA,EAAI,OAG3C,IAAItC,EAAWgD,EACX/F,EAAM,KAqBV,GAnBIiG,IAAW,GACblD,EAAW,CACT,KAAMwC,EAAS,EACf,WAAYU,EACZ,OAAQzB,EACR,QAAS,CAAE,EACX,IAAKC,EACL,WAAYY,CACb,EAEGA,EAAI,wBAENtC,EAAS,QAAUgB,GAAasB,EAAI,sBAAqB,CAAE,IAG7DrF,EAAM,IAAI,MAAM,+BAA+B,EAI7CqC,EAAQ,aAAewB,GAAU,4BAA4B,aAAY,EAAI,CAC/E,IAAIiC,EAA6B,CAC/B,QAAS/C,EAAS,SAAW,CAAE,EAC/B,KAAMA,EAAS,KACf,YAAasC,EAAI,YACjB,aAAcA,EAAI,YACnB,EAEGa,EAAmBrC,GAAU,4BAA4B,QAAQxB,EAAQ,YAAayD,CAA0B,EAEpH/C,EAAS,KAAOmD,EAAiB,KACjCnD,EAAS,QAAUmD,EAAiB,OAC1C,CAEI,OAAOrD,EAAS7C,EAAK+C,EAAUA,EAAS,IAAI,EAChD,CAEE,IAAIsC,EAAMhD,EAAQ,KAAO,KAEpBgD,IACChD,EAAQ,MAAQA,EAAQ,OAC1BgD,EAAM,IAAIxB,GAAU,eAEpBwB,EAAM,IAAIxB,GAAU,gBAIxB,IAAIO,EACAyB,EACApB,EAAMY,EAAI,IAAMhD,EAAQ,KAAOA,EAAQ,IACvCmC,EAASa,EAAI,OAAShD,EAAQ,QAAU,MACxC8C,EAAO9C,EAAQ,MAAQA,EAAQ,KAC/B2B,EAAUqB,EAAI,QAAUhD,EAAQ,SAAW,CAAE,EAC7C8D,EAAO,CAAC,CAAC9D,EAAQ,KACjBoD,EAAS,GACTG,EACAG,EAAkB,CACpB,KAAM,OACN,QAAS,CAAE,EACX,WAAY,EACZ,OAAQvB,EACR,IAAKC,EACL,WAAYY,CACb,EA+CD,GA7CI,SAAUhD,GAAWA,EAAQ,OAAS,KACxCoD,EAAS,GACTzB,EAAQ,QAAaA,EAAQ,SAAcA,EAAQ,OAAY,oBAE3DQ,IAAW,OAASA,IAAW,SACjCR,EAAQ,cAAc,GAAKA,EAAQ,cAAc,IAAMA,EAAQ,cAAc,EAAI,oBAEjFmB,EAAO,KAAK,UAAU9C,EAAQ,OAAS,GAAO8C,EAAO9C,EAAQ,IAAI,IAIrEgD,EAAI,mBAAqBD,EACzBC,EAAI,OAASC,EACbD,EAAI,QAAUK,EAEdL,EAAI,WAAa,UAAY,CAC5B,EAEDA,EAAI,QAAU,UAAY,CACxBQ,EAAU,GACV,aAAaxD,EAAQ,YAAY,CAClC,EAEDgD,EAAI,UAAYK,EAChBL,EAAI,KAAKb,EAAQC,EAAK,CAAC0B,EAAM9D,EAAQ,SAAUA,EAAQ,QAAQ,EAE1D8D,IACHd,EAAI,gBAAkB,CAAC,CAAChD,EAAQ,iBAM9B,CAAC8D,GAAQ9D,EAAQ,QAAU,IAC7BuD,EAAe,WAAW,UAAY,CACpC,GAAI,CAAAC,EACJ,CAAAA,EAAU,GAEVR,EAAI,MAAM,SAAS,EACnB,IAAIe,EAAI,IAAI,MAAM,wBAAwB,EAC1CA,EAAE,KAAO,YACTV,EAAUU,CAAC,EACjB,EAAO/D,EAAQ,OAAO,GAGhBgD,EAAI,iBACN,IAAKjB,KAAOJ,EACNA,EAAQ,eAAeI,CAAG,GAC5BiB,EAAI,iBAAiBjB,EAAKJ,EAAQI,CAAG,CAAC,UAGjC/B,EAAQ,SAAW,CAACyC,GAAQzC,EAAQ,OAAO,EACpD,MAAM,IAAI,MAAM,mDAAmD,EAGrE,MAAI,iBAAkBA,IACpBgD,EAAI,aAAehD,EAAQ,cAGzB,eAAgBA,GAAW,OAAOA,EAAQ,YAAe,YAC3DA,EAAQ,WAAWgD,CAAG,EAMxBA,EAAI,KAAKF,GAAQ,IAAI,EACdE,CACT,CAEA,SAASG,GAAOH,EAAK,CAGnB,GAAI,CACF,GAAIA,EAAI,eAAiB,WACvB,OAAOA,EAAI,YAGb,IAAIgB,EAAwBhB,EAAI,aAAeA,EAAI,YAAY,gBAAgB,WAAa,cAE5F,GAAIA,EAAI,eAAiB,IAAM,CAACgB,EAC9B,OAAOhB,EAAI,WAEd,MAAW,CAAA,CAEZ,OAAO,IACT,CAEA,SAASf,IAAO,CAAA,uDC9VZgC,GAAW/G,GAEXgH,GAAa,OAAO,QAAW,UAAW,CAC5C,SAASC,GAAI,CAAA,CACb,OAAO,SAAS9F,EAAG,CACjB,GAAI,UAAU,SAAW,EACvB,MAAM,IAAI,MAAM,gDAAgD,EAElE,OAAA8F,EAAE,UAAY9F,EACP,IAAI8F,CACZ,CACH,EAAI,EAMJ,SAASC,GAAaC,EAAWC,EAAS,CACxC,KAAK,KAAO,eACZ,KAAK,KAAOD,EAAU,KACtB,KAAK,QAAUC,GAAWD,EAAU,OACtC,CACAD,GAAa,UAAYF,GAAW,MAAM,SAAS,EACnDE,GAAa,UAAU,YAAcA,GAGrCA,GAAa,OAAS,CACpB,aAAc,CACZ,KAAM,EACN,QAAS,6BACV,EACD,aAAc,CACZ,KAAM,EACN,QAAS,uBACb,CACA,EAGA,SAASG,GAAeC,EAAO,CAE7B,SAASC,EAAeC,EAAGC,EAAGC,EAAGC,EAAG,CAClC,OAAQH,EAAI,GAAK,MAAQC,EAAI,GAAK,IAAMC,EAAI,IAAMC,EAAI,GAAK,GAC/D,CAEE,IAAIF,EAAIH,EAAM,MAAM,sCAAsC,EAC1D,OAAKG,EAIDA,EAAE,CAAC,EAEEF,EAAeE,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAE,QAAQ,IAAK,EAAE,EAAGA,EAAE,CAAC,CAAC,EACpDA,EAAE,CAAC,EAAI,GAGTF,EAAeE,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAG,EAAIA,EAAE,CAAC,CAAC,EAGnCF,EAAe,EAAGE,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EAZlC,IAcX,CAIA,SAASG,IAAW,CAClB,KAAK,OAASZ,GAAW,IAAI,CAC/B,CAEAY,GAAS,UAAY,CAEnB,IAAK,SAASC,EAAGC,EAAG,CACd,CAAC,KAAK,IAAID,CAAC,GAAKC,IAAM,KACxB,KAAK,OAAOD,CAAC,EAAIC,EAEpB,EAMD,IAAK,SAASD,EAAGE,EAAMC,EAAY,CACjC,OAAIA,EACK,KAAK,IAAIH,CAAC,EAAI,KAAK,OAAOA,CAAC,EAAIE,EAAKC,CAAU,EAEhD,KAAK,IAAIH,CAAC,EAAI,KAAK,OAAOA,CAAC,EAAIE,CACvC,EAED,IAAK,SAASF,EAAG,CACf,OAAOA,KAAK,KAAK,MAClB,EAED,IAAK,SAASA,EAAGC,EAAGG,EAAG,CACrB,QAAStH,EAAI,EAAGA,EAAIsH,EAAE,OAAQ,EAAEtH,EAC9B,GAAImH,IAAMG,EAAEtH,CAAC,EAAG,CACd,KAAK,IAAIkH,EAAGC,CAAC,EACb,KACR,CAEG,EAED,QAAS,SAASD,EAAGC,EAAG,CAClB,UAAU,KAAKA,CAAC,GAClB,KAAK,IAAID,EAAG,SAASC,EAAG,EAAE,CAAC,CAE9B,EAED,QAAS,SAASD,EAAGC,EAAG,CAEtB,OAASA,EAAE,MAAM,0BAA0B,IACzCA,EAAI,WAAWA,CAAC,EACZA,GAAK,GAAKA,GAAK,MACjB,KAAK,IAAID,EAAGC,CAAC,EACN,IAGJ,EACX,CACA,EAIA,SAASI,GAAaZ,EAAOhE,EAAU6E,EAAeC,EAAY,CAChE,IAAIC,EAASD,EAAad,EAAM,MAAMc,CAAU,EAAI,CAACd,CAAK,EAC1D,QAAS/F,KAAK8G,EACZ,GAAI,OAAOA,EAAO9G,CAAC,GAAM,SAGzB,KAAI+G,EAAKD,EAAO9G,CAAC,EAAE,MAAM4G,CAAa,EACtC,GAAIG,EAAG,SAAW,EAGlB,KAAIT,EAAIS,EAAG,CAAC,EAAE,KAAM,EAChBR,EAAIQ,EAAG,CAAC,EAAE,KAAM,EACpBhF,EAASuE,EAAGC,CAAC,GAEjB,CAEA,SAASS,GAASjB,EAAOkB,EAAKC,EAAY,CAExC,IAAIC,EAASpB,EAEb,SAASqB,GAAmB,CAC1B,IAAIC,EAAKvB,GAAeC,CAAK,EAC7B,GAAIsB,IAAO,KACT,MAAM,IAAI1B,GAAaA,GAAa,OAAO,aACrB,wBAA0BwB,CAAM,EAGxD,OAAApB,EAAQA,EAAM,QAAQ,iBAAkB,EAAE,EACnCsB,CACX,CAGE,SAASC,EAAmBvB,EAAOkB,EAAK,CACtC,IAAIM,EAAW,IAAIlB,GAEnBM,GAAaZ,EAAO,SAAUO,EAAGC,EAAG,CAClC,OAAQD,EAAC,CACT,IAAK,SAEH,QAAStG,EAAIkH,EAAW,OAAS,EAAGlH,GAAK,EAAGA,IAC1C,GAAIkH,EAAWlH,CAAC,EAAE,KAAOuG,EAAG,CAC1BgB,EAAS,IAAIjB,EAAGY,EAAWlH,CAAC,EAAE,MAAM,EACpC,KACZ,CAEQ,MACF,IAAK,WACHuH,EAAS,IAAIjB,EAAGC,EAAG,CAAC,KAAM,IAAI,CAAC,EAC/B,MACF,IAAK,OACH,IAAIiB,EAAOjB,EAAE,MAAM,GAAG,EAClBkB,EAAQD,EAAK,CAAC,EAClBD,EAAS,QAAQjB,EAAGmB,CAAK,EACzBF,EAAS,QAAQjB,EAAGmB,CAAK,GAAIF,EAAS,IAAI,cAAe,EAAK,EAC9DA,EAAS,IAAIjB,EAAGmB,EAAO,CAAC,MAAM,CAAC,EAC3BD,EAAK,SAAW,GAClBD,EAAS,IAAI,YAAaC,EAAK,CAAC,EAAG,CAAC,QAAS,SAAU,KAAK,CAAC,EAE/D,MACF,IAAK,WACHA,EAAOjB,EAAE,MAAM,GAAG,EAClBgB,EAAS,QAAQjB,EAAGkB,EAAK,CAAC,CAAC,EACvBA,EAAK,SAAW,GAClBD,EAAS,IAAI,gBAAiBC,EAAK,CAAC,EAAG,CAAC,QAAS,SAAU,KAAK,CAAC,EAEnE,MACF,IAAK,OACHD,EAAS,QAAQjB,EAAGC,CAAC,EACrB,MACF,IAAK,QACHgB,EAAS,IAAIjB,EAAGC,EAAG,CAAC,QAAS,SAAU,MAAO,OAAQ,OAAO,CAAC,EAC9D,KACR,CACA,EAAO,IAAK,IAAI,EAGZU,EAAI,OAASM,EAAS,IAAI,SAAU,IAAI,EACxCN,EAAI,SAAWM,EAAS,IAAI,WAAY,EAAE,EAC1C,GAAI,CACFN,EAAI,KAAOM,EAAS,IAAI,OAAQ,MAAM,CACvC,MAAW,CAAA,CACZN,EAAI,UAAYM,EAAS,IAAI,YAAa,OAAO,EACjDN,EAAI,YAAcM,EAAS,IAAI,cAAe,EAAI,EAClDN,EAAI,KAAOM,EAAS,IAAI,OAAQ,GAAG,EAEnC,GAAI,CACFN,EAAI,MAAQM,EAAS,IAAI,QAAS,QAAQ,CAC3C,MAAW,CACVN,EAAI,MAAQM,EAAS,IAAI,QAAS,QAAQ,CAChD,CACI,GAAI,CACFN,EAAI,SAAWM,EAAS,IAAI,WAAY,MAAM,CAC/C,MAAW,CACVN,EAAI,SAAWM,EAAS,IAAI,WAAY,CACtC,MAAO,EACP,KAAM,EACN,OAAQ,GACR,OAAQ,GACR,IAAK,IACL,MAAO,GACf,EAASN,EAAI,KAAK,CAClB,CAGIA,EAAI,cAAgBM,EAAS,IAAI,gBAAiB,CAChD,MAAO,QACP,KAAM,QACN,OAAQ,SACR,OAAQ,SACR,IAAK,MACL,MAAO,KACb,EAAON,EAAI,KAAK,CAChB,CAEE,SAASS,GAAiB,CACxB3B,EAAQA,EAAM,QAAQ,OAAQ,EAAE,CACpC,CAME,GAHA2B,EAAgB,EAChBT,EAAI,UAAYG,IAChBM,EAAgB,EACZ3B,EAAM,OAAO,EAAG,CAAC,IAAM,MACzB,MAAM,IAAIJ,GAAaA,GAAa,OAAO,aACpB,kEACAwB,CAAM,EAE/BpB,EAAQA,EAAM,OAAO,CAAC,EACtB2B,EAAgB,EAChBT,EAAI,QAAUG,IAGdM,EAAgB,EAChBJ,EAAmBvB,EAAOkB,CAAG,CAC/B,CAIA,IAAIU,GAAmBnC,GAAS,eAAiBA,GAAS,cAAc,UAAU,EAE9EoC,GAAW,CACb,EAAG,OACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,KAAM,OACN,GAAI,KACJ,EAAG,OACH,KAAM,MACR,EAIIC,GAAsB,CACxB,MAAO,sBACP,KAAM,kBACN,KAAM,oBACN,IAAK,kBACL,OAAQ,oBACR,QAAS,oBACT,KAAM,kBACN,MAAO,eACT,EAEIC,GAAiB,CACnB,EAAG,QACH,KAAM,MACR,EAEIC,GAAe,CACjB,GAAI,MACN,EAGA,SAASC,GAAanG,EAAQkE,EAAO,CACnC,SAASkC,GAAY,CAEnB,GAAI,CAAClC,EACH,OAAO,KAIT,SAASmC,EAAQ/E,EAAQ,CACvB,OAAA4C,EAAQA,EAAM,OAAO5C,EAAO,MAAM,EAC3BA,CACb,CAEI,IAAI+C,EAAIH,EAAM,MAAM,qBAAqB,EAGzC,OAAOmC,EAAQhC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,CAAC,CACrC,CAEE,SAASiC,EAAShC,EAAG,CACnB,OAAAwB,GAAiB,UAAYxB,EAC7BA,EAAIwB,GAAiB,YACrBA,GAAiB,YAAc,GACxBxB,CACX,CAEE,SAASiC,EAAUC,EAASC,EAAS,CACnC,MAAO,CAACP,GAAaO,EAAQ,SAAS,GAC/BP,GAAaO,EAAQ,SAAS,IAAMD,EAAQ,SACvD,CAGE,SAASE,EAAc/H,EAAMgI,EAAY,CACvC,IAAIC,EAAUb,GAASpH,CAAI,EAC3B,GAAI,CAACiI,EACH,OAAO,KAET,IAAIH,EAAUzG,EAAO,SAAS,cAAc4G,CAAO,EAC/CC,EAAOZ,GAAetH,CAAI,EAC9B,OAAIkI,GAAQF,IACVF,EAAQI,CAAI,EAAIF,EAAW,KAAM,GAE5BF,CACX,CAOE,QALIK,EAAU9G,EAAO,SAAS,cAAc,KAAK,EAC7CwG,EAAUM,EACVC,EACAC,EAAW,CAAE,GAETD,EAAIX,EAAW,KAAM,MAAM,CACjC,GAAIW,EAAE,CAAC,IAAM,IAAK,CAChB,GAAIA,EAAE,CAAC,IAAM,IAAK,CAEZC,EAAS,QACTA,EAASA,EAAS,OAAS,CAAC,IAAMD,EAAE,OAAO,CAAC,EAAE,QAAQ,IAAK,EAAE,IAC/DC,EAAS,IAAK,EACdR,EAAUA,EAAQ,YAGpB,QACR,CACM,IAAIhB,EAAKvB,GAAe8C,EAAE,OAAO,EAAGA,EAAE,OAAS,CAAC,CAAC,EAC7CE,EACJ,GAAIzB,EAAI,CAENyB,EAAOjH,EAAO,SAAS,4BAA4B,YAAawF,CAAE,EAClEgB,EAAQ,YAAYS,CAAI,EACxB,QACR,CACM,IAAI5C,EAAI0C,EAAE,MAAM,kDAAkD,EAYlE,GAVI,CAAC1C,IAIL4C,EAAOP,EAAcrC,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EAC3B,CAAC4C,IAKD,CAACV,EAAUC,EAASS,CAAI,EAC1B,SAGF,GAAI5C,EAAE,CAAC,EAAG,CACR,IAAI6C,EAAU7C,EAAE,CAAC,EAAE,MAAM,GAAG,EAE5B6C,EAAQ,QAAQ,SAASC,EAAI,CAC3B,IAAIC,EAAU,OAAO,KAAKD,CAAE,EAExBE,EAAYD,EAAUD,EAAG,MAAM,CAAC,EAAIA,EAExC,GAAInB,GAAoB,eAAeqB,CAAS,EAAG,CACjD,IAAIC,EAAWF,EAAU,mBAAqB,QAC1CG,EAAYvB,GAAoBqB,CAAS,EAE7CJ,EAAK,MAAMK,CAAQ,EAAIC,CACnC,CACA,CAAS,EAEDN,EAAK,UAAYC,EAAQ,KAAK,GAAG,CACzC,CAGMF,EAAS,KAAK3C,EAAE,CAAC,CAAC,EAClBmC,EAAQ,YAAYS,CAAI,EACxBT,EAAUS,EACV,QACN,CAGIT,EAAQ,YAAYxG,EAAO,SAAS,eAAesG,EAASS,CAAC,CAAC,CAAC,CACnE,CAEE,OAAOD,CACT,CAOA,IAAIU,GAAkB,CAAC,CAAC,KAAO,IAAK,EAAG,CAAC,KAAO,IAAK,EAAG,CAAC,KAAO,IAAK,EAAG,CAAC,KAAO,IAAK,EACnF,CAAC,KAAO,IAAK,EAAG,CAAC,KAAO,IAAK,EAAG,CAAC,KAAO,IAAK,EAAG,CAAC,KAAO,IAAK,EAAG,CAAC,KAAO,IAAK,EAC7E,CAAC,KAAO,IAAK,EAAG,CAAC,KAAO,IAAK,EAAG,CAAC,KAAO,IAAK,EAAG,CAAC,KAAO,IAAK,EAAG,CAAC,KAAO,IAAK,EAC7E,CAAC,KAAO,IAAK,EAAG,CAAC,KAAO,IAAK,EAAG,CAAC,KAAO,IAAK,EAAG,CAAC,KAAO,IAAK,EAAG,CAAC,KAAO,IAAK,EAC7E,CAAC,KAAO,IAAK,EAAG,CAAC,KAAO,IAAK,EAAG,CAAC,KAAO,IAAK,EAAG,CAAC,KAAO,IAAK,EAAG,CAAC,KAAO,IAAK,EAC7E,CAAC,KAAO,IAAK,EAAG,CAAC,KAAO,IAAK,EAAG,CAAC,KAAO,IAAK,EAAG,CAAC,KAAO,IAAK,EAAG,CAAC,KAAO,IAAK,EAC7E,CAAC,KAAO,IAAK,EAAG,CAAC,KAAO,IAAK,EAAG,CAAC,KAAO,IAAK,EAAG,CAAC,KAAQ,IAAM,EAC/D,CAAC,MAAQ,KAAM,EAAG,CAAC,MAAQ,KAAM,EAAG,CAAC,MAAQ,KAAM,EAAG,CAAC,MAAQ,KAAM,EACrE,CAAC,MAAQ,KAAM,EAAG,CAAC,MAAQ,KAAM,EAAG,CAAC,MAAQ,KAAM,EAAG,CAAC,MAAQ,KAAM,EACrE,CAAC,MAAQ,KAAM,EAAG,CAAC,MAAQ,KAAM,EAAG,CAAC,MAAQ,KAAM,EAAG,CAAC,MAAQ,KAAM,EACrE,CAAC,MAAQ,KAAM,EAAG,CAAC,MAAQ,KAAM,EAAG,CAAC,MAAS,KAAO,EAAG,CAAC,MAAS,KAAO,EACzE,CAAC,MAAS,KAAO,EAAG,CAAC,MAAS,KAAO,EAAG,CAAC,MAAS,KAAO,EAAG,CAAC,MAAS,KAAO,EAC7E,CAAC,MAAS,KAAO,EAAG,CAAC,MAAS,KAAO,EAAG,CAAC,MAAS,KAAO,EAAG,CAAC,MAAS,KAAO,EAC7E,CAAC,MAAS,KAAO,EAAG,CAAC,MAAS,KAAO,EAAG,CAAC,MAAS,KAAO,EAAG,CAAC,MAAS,KAAO,EAC7E,CAAC,MAAS,KAAO,EAAG,CAAC,MAAS,KAAO,EAAG,CAAC,MAAS,KAAO,EAAG,CAAC,MAAS,KAAO,EAC7E,CAAC,MAAS,KAAO,EAAG,CAAC,MAAS,KAAO,EAAG,CAAC,MAAS,KAAO,EAAG,CAAC,MAAS,KAAO,EAC7E,CAAC,MAAS,KAAO,EAAG,CAAC,MAAS,KAAO,EAAG,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EAC7E,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EAC7E,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EAC7E,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EAC7E,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EAC7E,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EAC7E,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EAC7E,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EAC7E,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EAAG,CAAC,QAAU,OAAQ,CAAC,EAEjF,SAASC,GAAgBC,EAAU,CACjC,QAASvJ,EAAI,EAAGA,EAAIqJ,GAAgB,OAAQrJ,IAAK,CAC/C,IAAIwJ,EAAeH,GAAgBrJ,CAAC,EACpC,GAAIuJ,GAAYC,EAAa,CAAC,GAAKD,GAAYC,EAAa,CAAC,EAC3D,MAAO,EAEb,CAEE,MAAO,EACT,CAEA,SAASC,GAAcC,EAAQ,CAC7B,IAAIC,EAAY,CAAE,EACdC,EAAO,GACPL,EAEJ,GAAI,CAACG,GAAU,CAACA,EAAO,WACrB,MAAO,MAGT,SAASG,EAAUF,EAAWb,EAAM,CAClC,QAAS9I,EAAI8I,EAAK,WAAW,OAAS,EAAG9I,GAAK,EAAGA,IAC/C2J,EAAU,KAAKb,EAAK,WAAW9I,CAAC,CAAC,CAEvC,CAEE,SAAS8J,EAAaH,EAAW,CAC/B,GAAI,CAACA,GAAa,CAACA,EAAU,OAC3B,OAAO,KAGT,IAAIb,EAAOa,EAAU,IAAK,EACtBC,EAAOd,EAAK,aAAeA,EAAK,UACpC,GAAIc,EAAM,CAGR,IAAI,EAAIA,EAAK,MAAM,YAAY,EAC/B,OAAI,GACFD,EAAU,OAAS,EACZ,EAAE,CAAC,GAELC,CACb,CACI,GAAId,EAAK,UAAY,OACnB,OAAOgB,EAAaH,CAAS,EAE/B,GAAIb,EAAK,WACP,OAAAe,EAAUF,EAAWb,CAAI,EAClBgB,EAAaH,CAAS,CAEnC,CAGE,IADAE,EAAUF,EAAWD,CAAM,EACnBE,EAAOE,EAAaH,CAAS,GACnC,QAAS3J,EAAI,EAAGA,EAAI4J,EAAK,OAAQ5J,IAE/B,GADAuJ,EAAWK,EAAK,WAAW5J,CAAC,EACxBsJ,GAAgBC,CAAQ,EAC1B,MAAO,MAIb,MAAO,KACT,CAEA,SAASQ,GAAe9C,EAAK,CAC3B,GAAI,OAAOA,EAAI,MAAS,WACnBA,EAAI,aAAgBA,EAAI,MAAQ,GAAKA,EAAI,MAAQ,KACpD,OAAOA,EAAI,KAEb,GAAI,CAACA,EAAI,OAAS,CAACA,EAAI,MAAM,eACzB,CAACA,EAAI,MAAM,cAAc,aAC3B,MAAO,GAKT,QAHI+C,EAAQ/C,EAAI,MACZgD,EAAYD,EAAM,cAClBE,EAAQ,EACHlK,EAAI,EAAGA,EAAIiK,EAAU,QAAUA,EAAUjK,CAAC,IAAMgK,EAAOhK,IAC1DiK,EAAUjK,CAAC,EAAE,OAAS,WACxBkK,IAGJ,MAAO,EAAEA,EAAQ,EACnB,CAEA,SAASC,IAAW,CACpB,CAIAA,GAAS,UAAU,YAAc,SAASC,EAAQC,EAAK,CACrDA,EAAMA,GAAO,KAAK,IAClB,QAASC,KAAQF,EACXA,EAAO,eAAeE,CAAI,IAC5BD,EAAI,MAAMC,CAAI,EAAIF,EAAOE,CAAI,EAGnC,EAEAH,GAAS,UAAU,YAAc,SAASI,EAAKC,EAAM,CACnD,OAAOD,IAAQ,EAAI,EAAIA,EAAMC,CAC/B,EAIA,SAASC,GAAY5I,EAAQoF,EAAKyD,EAAc,CAC9CP,GAAS,KAAK,IAAI,EAClB,KAAK,IAAMlD,EAIX,KAAK,OAASe,GAAanG,EAAQoF,EAAI,IAAI,EAC3C,IAAImD,EAAS,CACX,MAAO,yBACP,gBAAkB,qBAClB,SAAU,WACV,KAAM,EACN,MAAO,EACP,IAAK,EACL,OAAQ,EACR,QAAS,SACT,YAAanD,EAAI,WAAa,GAAK,gBACAA,EAAI,WAAa,KAAO,cACA,cAC3D,YAAa,WACd,EAED,KAAK,YAAYmD,EAAQ,KAAK,MAAM,EAKpC,KAAK,IAAMvI,EAAO,SAAS,cAAc,KAAK,EAC9CuI,EAAS,CACP,UAAWX,GAAc,KAAK,MAAM,EACpC,YAAaxC,EAAI,WAAa,GAAK,gBACAA,EAAI,WAAa,KAAO,cACA,cAC3D,YAAa,YACb,UAAWA,EAAI,QAAU,SAAW,SAAWA,EAAI,MACnD,KAAMyD,EAAa,KACnB,WAAY,WACZ,SAAU,UACX,EAED,KAAK,YAAYN,CAAM,EACvB,KAAK,IAAI,YAAY,KAAK,MAAM,EAKhC,IAAIO,EAAU,EACd,OAAQ1D,EAAI,cAAa,CACzB,IAAK,QACL,IAAK,YACH0D,EAAU1D,EAAI,SACd,MACF,IAAK,SACH0D,EAAU1D,EAAI,SAAYA,EAAI,KAAO,EACrC,MACF,IAAK,MACL,IAAK,aACH0D,EAAU1D,EAAI,SAAWA,EAAI,KAC7B,KACJ,CAKMA,EAAI,WAAa,GACnB,KAAK,YAAY,CACf,KAAO,KAAK,YAAY0D,EAAS,GAAG,EACpC,MAAO,KAAK,YAAY1D,EAAI,KAAM,GAAG,CAC3C,CAAK,EAKD,KAAK,YAAY,CACf,IAAK,KAAK,YAAY0D,EAAS,GAAG,EAClC,OAAQ,KAAK,YAAY1D,EAAI,KAAM,GAAG,CAC5C,CAAK,EAGH,KAAK,KAAO,SAAS2D,EAAK,CACxB,KAAK,YAAY,CACf,IAAK,KAAK,YAAYA,EAAI,IAAK,IAAI,EACnC,OAAQ,KAAK,YAAYA,EAAI,OAAQ,IAAI,EACzC,KAAM,KAAK,YAAYA,EAAI,KAAM,IAAI,EACrC,MAAO,KAAK,YAAYA,EAAI,MAAO,IAAI,EACvC,OAAQ,KAAK,YAAYA,EAAI,OAAQ,IAAI,EACzC,MAAO,KAAK,YAAYA,EAAI,MAAO,IAAI,CAC7C,CAAK,CACF,CACH,CACAH,GAAY,UAAYhF,GAAW0E,GAAS,SAAS,EACrDM,GAAY,UAAU,YAAcA,GAKpC,SAASI,GAAY/L,EAAK,CAKxB,IAAIgM,EAAIC,EAAQC,EAAOC,EACvB,GAAInM,EAAI,IAAK,CACXiM,EAASjM,EAAI,IAAI,aACjBkM,EAAQlM,EAAI,IAAI,YAChBmM,EAAMnM,EAAI,IAAI,UAEd,IAAIoM,GAASA,EAAQpM,EAAI,IAAI,cAAgBoM,EAAQA,EAAM,CAAC,IAChDA,EAAM,gBAAkBA,EAAM,eAAgB,EAC1DpM,EAAMA,EAAI,IAAI,sBAAuB,EAKrCgM,EAAKI,EAAQ,KAAK,IAAKA,EAAM,CAAC,GAAKA,EAAM,CAAC,EAAE,QAAW,EAAGpM,EAAI,OAASoM,EAAM,MAAM,EACtE,CAEjB,CACE,KAAK,KAAOpM,EAAI,KAChB,KAAK,MAAQA,EAAI,MACjB,KAAK,IAAMA,EAAI,KAAOmM,EACtB,KAAK,OAASnM,EAAI,QAAUiM,EAC5B,KAAK,OAASjM,EAAI,QAAWmM,GAAOnM,EAAI,QAAUiM,GAClD,KAAK,MAAQjM,EAAI,OAASkM,EAC1B,KAAK,WAAaF,IAAO,OAAYA,EAAKhM,EAAI,UAChD,CAKA+L,GAAY,UAAU,KAAO,SAASM,EAAMC,EAAQ,CAElD,OADAA,EAASA,IAAW,OAAYA,EAAS,KAAK,WACtCD,EAAI,CACZ,IAAK,KACH,KAAK,MAAQC,EACb,KAAK,OAASA,EACd,MACF,IAAK,KACH,KAAK,MAAQA,EACb,KAAK,OAASA,EACd,MACF,IAAK,KACH,KAAK,KAAOA,EACZ,KAAK,QAAUA,EACf,MACF,IAAK,KACH,KAAK,KAAOA,EACZ,KAAK,QAAUA,EACf,KACJ,CACA,EAGAP,GAAY,UAAU,SAAW,SAASQ,EAAI,CAC5C,OAAO,KAAK,KAAOA,EAAG,OACf,KAAK,MAAQA,EAAG,MAChB,KAAK,IAAMA,EAAG,QACd,KAAK,OAASA,EAAG,GAC1B,EAGAR,GAAY,UAAU,YAAc,SAASS,EAAO,CAClD,QAAStL,EAAI,EAAGA,EAAIsL,EAAM,OAAQtL,IAChC,GAAI,KAAK,SAASsL,EAAMtL,CAAC,CAAC,EACxB,MAAO,GAGX,MAAO,EACT,EAGA6K,GAAY,UAAU,OAAS,SAASU,EAAW,CACjD,OAAO,KAAK,KAAOA,EAAU,KACtB,KAAK,QAAUA,EAAU,QACzB,KAAK,MAAQA,EAAU,MACvB,KAAK,OAASA,EAAU,KACjC,EAMAV,GAAY,UAAU,qBAAuB,SAASU,EAAWJ,EAAM,CACrE,OAAQA,EAAI,CACZ,IAAK,KACH,OAAO,KAAK,KAAOI,EAAU,KAC/B,IAAK,KACH,OAAO,KAAK,MAAQA,EAAU,MAChC,IAAK,KACH,OAAO,KAAK,IAAMA,EAAU,IAC9B,IAAK,KACH,OAAO,KAAK,OAASA,EAAU,MACnC,CACA,EAIAV,GAAY,UAAU,oBAAsB,SAASQ,EAAI,CACvD,IAAIG,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,KAAK,MAAOH,EAAG,KAAK,EAAI,KAAK,IAAI,KAAK,KAAMA,EAAG,IAAI,CAAC,EAC7EI,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,KAAK,OAAQJ,EAAG,MAAM,EAAI,KAAK,IAAI,KAAK,IAAKA,EAAG,GAAG,CAAC,EAC7EK,EAAgBF,EAAIC,EACxB,OAAOC,GAAiB,KAAK,OAAS,KAAK,MAC7C,EAMAb,GAAY,UAAU,kBAAoB,SAASc,EAAW,CAC5D,MAAO,CACL,IAAK,KAAK,IAAMA,EAAU,IAC1B,OAAQA,EAAU,OAAS,KAAK,OAChC,KAAM,KAAK,KAAOA,EAAU,KAC5B,MAAOA,EAAU,MAAQ,KAAK,MAC9B,OAAQ,KAAK,OACb,MAAO,KAAK,KACb,CACH,EAIAd,GAAY,qBAAuB,SAAS/L,EAAK,CAC/C,IAAIiM,EAASjM,EAAI,IAAMA,EAAI,IAAI,aAAeA,EAAI,QAAUA,EAAI,aAAe,EAC3EkM,EAAQlM,EAAI,IAAMA,EAAI,IAAI,YAAcA,EAAI,QAAUA,EAAI,YAAc,EACxEmM,EAAMnM,EAAI,IAAMA,EAAI,IAAI,UAAYA,EAAI,QAAUA,EAAI,UAAY,EAEtEA,EAAMA,EAAI,IAAMA,EAAI,IAAI,sBAAuB,EACjCA,EAAI,QAAUA,EAAI,sBAAuB,EAAGA,EAC1D,IAAI8M,EAAM,CACR,KAAM9M,EAAI,KACV,MAAOA,EAAI,MACX,IAAKA,EAAI,KAAOmM,EAChB,OAAQnM,EAAI,QAAUiM,EACtB,OAAQjM,EAAI,QAAWmM,GAAOnM,EAAI,QAAUiM,GAC5C,MAAOjM,EAAI,OAASkM,CACrB,EACD,OAAOY,CACT,EAKA,SAASC,GAAsBhK,EAAQiK,EAAUC,EAAcC,EAAc,CAO3E,SAASC,EAAiBC,EAAGf,EAAM,CAKjC,QAJIgB,EACAC,EAAoB,IAAIvB,GAAYqB,CAAC,EACrCG,EAAa,EAERrM,EAAI,EAAGA,EAAImL,EAAK,OAAQnL,IAAK,CACpC,KAAOkM,EAAE,qBAAqBH,EAAcZ,EAAKnL,CAAC,CAAC,GAC3CkM,EAAE,OAAOH,CAAY,GAAKG,EAAE,YAAYF,CAAY,GAC1DE,EAAE,KAAKf,EAAKnL,CAAC,CAAC,EAIhB,GAAIkM,EAAE,OAAOH,CAAY,EACvB,OAAOG,EAET,IAAII,EAAIJ,EAAE,oBAAoBH,CAAY,EAGtCM,EAAaC,IACfH,EAAe,IAAItB,GAAYqB,CAAC,EAChCG,EAAaC,GAGfJ,EAAI,IAAIrB,GAAYuB,CAAiB,CAC3C,CACI,OAAOD,GAAgBC,CAC3B,CAEE,IAAIG,EAAc,IAAI1B,GAAYiB,CAAQ,EACtC7E,EAAM6E,EAAS,IACfU,EAAUzC,GAAe9C,CAAG,EAC5BkE,EAAO,CAAE,EAGb,GAAIlE,EAAI,YAAa,CACnB,IAAIwF,EACJ,OAAQxF,EAAI,SAAQ,CACpB,IAAK,GACHkE,EAAO,CAAE,KAAM,IAAM,EACrBsB,EAAO,SACP,MACF,IAAK,KACHtB,EAAO,CAAE,KAAM,IAAM,EACrBsB,EAAO,QACP,MACF,IAAK,KACHtB,EAAO,CAAE,KAAM,IAAM,EACrBsB,EAAO,QACP,KACN,CAEI,IAAIC,EAAOH,EAAY,WACnBI,EAAWD,EAAO,KAAK,MAAMF,CAAO,EACpCI,EAAcb,EAAaU,CAAI,EAAIC,EACnCG,EAAc1B,EAAK,CAAC,EAKpB,KAAK,IAAIwB,CAAQ,EAAIC,IACvBD,EAAWA,EAAW,EAAI,GAAK,EAC/BA,GAAY,KAAK,KAAKC,EAAcF,CAAI,EAAIA,GAO1CF,EAAU,IACZG,GAAY1F,EAAI,WAAa,GAAK8E,EAAa,OAASA,EAAa,MACrEZ,EAAOA,EAAK,QAAS,GAKvBoB,EAAY,KAAKM,EAAaF,CAAQ,CAE1C,KAAS,CAEL,IAAIG,EAAwBP,EAAY,WAAaR,EAAa,OAAU,IAE5E,OAAQ9E,EAAI,UAAS,CACrB,IAAK,SACHuF,GAAYM,EAAuB,EACnC,MACF,IAAK,MACHN,GAAWM,EACX,KACN,CAGI,OAAQ7F,EAAI,SAAQ,CACpB,IAAK,GACH6E,EAAS,YAAY,CACnB,IAAKA,EAAS,YAAYU,EAAS,GAAG,CAC9C,CAAO,EACD,MACF,IAAK,KACHV,EAAS,YAAY,CACnB,KAAMA,EAAS,YAAYU,EAAS,GAAG,CAC/C,CAAO,EACD,MACF,IAAK,KACHV,EAAS,YAAY,CACnB,MAAOA,EAAS,YAAYU,EAAS,GAAG,CAChD,CAAO,EACD,KACN,CAEIrB,EAAO,CAAE,KAAM,KAAM,KAAM,IAAM,EAIjCoB,EAAc,IAAI1B,GAAYiB,CAAQ,CAC1C,CAEE,IAAIK,EAAeF,EAAiBM,EAAapB,CAAI,EACrDW,EAAS,KAAKK,EAAa,kBAAkBJ,CAAY,CAAC,CAC5D,CAEA,SAASgB,IAAS,CAElB,CAGAA,GAAO,cAAgB,UAAW,CAChC,MAAO,CACL,OAAQ,SAASC,EAAM,CACrB,GAAI,CAACA,EACH,MAAO,GAET,GAAI,OAAOA,GAAS,SAClB,MAAM,IAAI,MAAM,+BAA+B,EAEjD,OAAO,mBAAmB,mBAAmBA,CAAI,CAAC,CACxD,CACG,CACH,EAEAD,GAAO,oBAAsB,SAASlL,EAAQoL,EAAS,CACrD,MAAI,CAACpL,GAAU,CAACoL,EACP,KAEFjF,GAAanG,EAAQoL,CAAO,CACrC,EAEA,IAAIC,GAAoB,IACpBC,GAAa,aACbC,GAAyB,OAK7BL,GAAO,YAAc,SAASlL,EAAQwL,EAAMC,EAAS,CACnD,GAAI,CAACzL,GAAU,CAACwL,GAAQ,CAACC,EACvB,OAAO,KAIT,KAAOA,EAAQ,YACbA,EAAQ,YAAYA,EAAQ,UAAU,EAGxC,IAAIC,EAAgB1L,EAAO,SAAS,cAAc,KAAK,EACvD0L,EAAc,MAAM,SAAW,WAC/BA,EAAc,MAAM,KAAO,IAC3BA,EAAc,MAAM,MAAQ,IAC5BA,EAAc,MAAM,IAAM,IAC1BA,EAAc,MAAM,OAAS,IAC7BA,EAAc,MAAM,OAASH,GAC7BE,EAAQ,YAAYC,CAAa,EAKjC,SAASC,EAAcH,EAAM,CAC3B,QAASrN,EAAI,EAAGA,EAAIqN,EAAK,OAAQrN,IAC/B,GAAIqN,EAAKrN,CAAC,EAAE,cAAgB,CAACqN,EAAKrN,CAAC,EAAE,aACnC,MAAO,GAGX,MAAO,EACX,CAGE,GAAI,CAACwN,EAAcH,CAAI,EAAG,CACxB,QAASrN,EAAI,EAAGA,EAAIqN,EAAK,OAAQrN,IAC/BuN,EAAc,YAAYF,EAAKrN,CAAC,EAAE,YAAY,EAEhD,MACJ,CAEE,IAAIgM,EAAe,CAAE,EACjBD,EAAelB,GAAY,qBAAqB0C,CAAa,EAC7DE,EAAW,KAAK,MAAM1B,EAAa,OAASmB,GAAoB,GAAG,EAAI,IACvExC,EAAe,CACjB,KAAM+C,EAAW,MAAQN,EAC1B,GAEA,UAAW,CAGV,QAFIrB,EAAU7E,EAELjH,EAAI,EAAGA,EAAIqN,EAAK,OAAQrN,IAC/BiH,EAAMoG,EAAKrN,CAAC,EAGZ8L,EAAW,IAAIrB,GAAY5I,EAAQoF,EAAKyD,CAAY,EACpD6C,EAAc,YAAYzB,EAAS,GAAG,EAGtCD,GAAsBhK,EAAQiK,EAAUC,EAAcC,CAAY,EAIlE/E,EAAI,aAAe6E,EAAS,IAE5BE,EAAa,KAAKnB,GAAY,qBAAqBiB,CAAQ,CAAC,CAElE,GAAM,CACN,EAEAiB,GAAO,OAAS,SAASlL,EAAQ6L,EAAOC,EAAS,CAC1CA,IACHA,EAAUD,EACVA,EAAQ,CAAE,GAEPA,IACHA,EAAQ,CAAE,GAGZ,KAAK,OAAS7L,EACd,KAAK,MAAQ6L,EACb,KAAK,MAAQ,UACb,KAAK,OAAS,GACd,KAAK,QAAUC,GAAW,IAAI,YAAY,MAAM,EAChD,KAAK,WAAa,CAAE,CACtB,EAEAZ,GAAO,OAAO,UAAY,CAGxB,mBAAoB,SAASzH,EAAG,CAC9B,GAAIA,aAAaK,GACf,KAAK,gBAAkB,KAAK,eAAeL,CAAC,MAE5C,OAAMA,CAET,EACD,MAAO,SAAU0H,EAAM,CACrB,IAAIY,EAAO,KAKPZ,IAEFY,EAAK,QAAUA,EAAK,QAAQ,OAAOZ,EAAM,CAAC,OAAQ,EAAI,CAAC,GAGzD,SAASa,GAAkB,CAGzB,QAFIC,EAASF,EAAK,OACdG,EAAM,EACHA,EAAMD,EAAO,QAAUA,EAAOC,CAAG,IAAM,MAAQD,EAAOC,CAAG,IAAM;AAAA,GACpE,EAAEA,EAEJ,IAAIC,EAAOF,EAAO,OAAO,EAAGC,CAAG,EAE/B,OAAID,EAAOC,CAAG,IAAM,MAClB,EAAEA,EAEAD,EAAOC,CAAG,IAAM;AAAA,GAClB,EAAEA,EAEJH,EAAK,OAASE,EAAO,OAAOC,CAAG,EACxBC,CACb,CAGI,SAASC,EAAYlI,EAAO,CAC1B,IAAIwB,EAAW,IAAIlB,GAsCnB,GApCAM,GAAaZ,EAAO,SAAUO,EAAGC,EAAG,CAClC,OAAQD,EAAC,CACT,IAAK,KACHiB,EAAS,IAAIjB,EAAGC,CAAC,EACjB,MACF,IAAK,QACHgB,EAAS,QAAQjB,EAAGC,CAAC,EACrB,MACF,IAAK,QACHgB,EAAS,QAAQjB,EAAGC,CAAC,EACrB,MACF,IAAK,eACL,IAAK,iBACH,IAAI2H,EAAK3H,EAAE,MAAM,GAAG,EACpB,GAAI2H,EAAG,SAAW,EAChB,MAIF,IAAIC,EAAS,IAAI9H,GAGjB,GAFA8H,EAAO,QAAQ,IAAKD,EAAG,CAAC,CAAC,EACzBC,EAAO,QAAQ,IAAKD,EAAG,CAAC,CAAC,EACrB,CAACC,EAAO,IAAI,GAAG,GAAK,CAACA,EAAO,IAAI,GAAG,EACrC,MAEF5G,EAAS,IAAIjB,EAAI,IAAK6H,EAAO,IAAI,GAAG,CAAC,EACrC5G,EAAS,IAAIjB,EAAI,IAAK6H,EAAO,IAAI,GAAG,CAAC,EACrC,MACF,IAAK,SACH5G,EAAS,IAAIjB,EAAGC,EAAG,CAAC,IAAI,CAAC,EACzB,KACV,CACA,EAAS,IAAK,IAAI,EAIRgB,EAAS,IAAI,IAAI,EAAG,CACtB,IAAI6G,EAAS,IAAKR,EAAK,MAAM,WAAaA,EAAK,OAAO,WACtDQ,EAAO,MAAQ7G,EAAS,IAAI,QAAS,GAAG,EACxC6G,EAAO,MAAQ7G,EAAS,IAAI,QAAS,CAAC,EACtC6G,EAAO,cAAgB7G,EAAS,IAAI,gBAAiB,CAAC,EACtD6G,EAAO,cAAgB7G,EAAS,IAAI,gBAAiB,GAAG,EACxD6G,EAAO,gBAAkB7G,EAAS,IAAI,kBAAmB,CAAC,EAC1D6G,EAAO,gBAAkB7G,EAAS,IAAI,kBAAmB,GAAG,EAC5D6G,EAAO,OAAS7G,EAAS,IAAI,SAAU,EAAE,EAEzCqG,EAAK,UAAYA,EAAK,SAASQ,CAAM,EAGrCR,EAAK,WAAW,KAAK,CACnB,GAAIrG,EAAS,IAAI,IAAI,EACrB,OAAQ6G,CAClB,CAAS,CACT,CACA,CAKI,SAASC,EAAkBtI,EAAO,CAChC,IAAIwB,EAAW,IAAIlB,GAEnBM,GAAaZ,EAAO,SAASO,EAAGC,EAAG,CACjC,OAAOD,EAAC,CACR,IAAK,QACHiB,EAAS,QAAQjB,EAAI,IAAKC,CAAC,EAC3B,MACF,IAAK,OACHgB,EAAS,IAAIjB,EAAI,IAAKR,GAAeS,CAAC,CAAC,EACvC,KACV,CACA,EAAS,SAAU,GAAG,EAEhBqH,EAAK,gBAAkBA,EAAK,eAAe,CACzC,OAAUrG,EAAS,IAAI,QAAQ,EAC/B,MAASA,EAAS,IAAI,OAAO,CACrC,CAAO,CACP,CAGI,SAAS+G,EAAYvI,EAAO,CACtBA,EAAM,MAAM,iBAAiB,EAE/BY,GAAaZ,EAAO,SAASO,EAAG,EAAG,CACjC,OAAOA,EAAC,CACR,IAAK,kBACH+H,EAAkB,CAAC,EACnB,KACZ,CACS,EAAE,GAAG,EAEN1H,GAAaZ,EAAO,SAAUO,EAAG,EAAG,CAClC,OAAQA,EAAC,CACT,IAAK,SAEH2H,EAAY,CAAC,EACb,KACZ,CACS,EAAE,GAAG,CAGd,CAGI,GAAI,CACF,IAAID,EACJ,GAAIJ,EAAK,QAAU,UAAW,CAE5B,GAAI,CAAC,UAAU,KAAKA,EAAK,MAAM,EAC7B,OAAO,KAGTI,EAAOH,EAAiB,EAExB,IAAI3H,EAAI8H,EAAK,MAAM,oBAAoB,EACvC,GAAI,CAAC9H,GAAK,CAACA,EAAE,CAAC,EACZ,MAAM,IAAIP,GAAaA,GAAa,OAAO,YAAY,EAGzDiI,EAAK,MAAQ,QACrB,CAGM,QADIW,EAAuB,GACpBX,EAAK,QAAQ,CAElB,GAAI,CAAC,UAAU,KAAKA,EAAK,MAAM,EAC7B,OAAO,KAST,OANKW,EAGHA,EAAuB,GAFvBP,EAAOH,EAAiB,EAKlBD,EAAK,MAAK,CAClB,IAAK,SAEC,IAAI,KAAKI,CAAI,EACfM,EAAYN,CAAI,EACNA,IAEVJ,EAAK,MAAQ,MAEf,SACF,IAAK,OAEEI,IACHJ,EAAK,MAAQ,MAEf,SACF,IAAK,KAEH,GAAI,iBAAiB,KAAKI,CAAI,EAAG,CAC/BJ,EAAK,MAAQ,OACb,KACZ,CAEU,GAAI,CAACI,EACH,SAEFJ,EAAK,IAAM,IAAKA,EAAK,MAAM,QAAUA,EAAK,OAAO,QAAQ,EAAG,EAAG,EAAE,EAEjE,GAAI,CACFA,EAAK,IAAI,MAAQ,QAClB,MAAW,CACVA,EAAK,IAAI,MAAQ,QAC7B,CAGU,GAFAA,EAAK,MAAQ,MAETI,EAAK,QAAQ,KAAK,IAAM,GAAI,CAC9BJ,EAAK,IAAI,GAAKI,EACd,QACZ,CAGQ,IAAK,MAEH,GAAI,CACFhH,GAASgH,EAAMJ,EAAK,IAAKA,EAAK,UAAU,CACzC,OAAQtI,EAAG,CACVsI,EAAK,mBAAmBtI,CAAC,EAEzBsI,EAAK,IAAM,KACXA,EAAK,MAAQ,SACb,QACZ,CACUA,EAAK,MAAQ,UACb,SACF,IAAK,UACH,IAAIY,EAAeR,EAAK,QAAQ,KAAK,IAAM,GAK3C,GAAI,CAACA,GAAQQ,IAAiBD,EAAuB,IAAO,CAE1DX,EAAK,OAASA,EAAK,MAAMA,EAAK,GAAG,EACjCA,EAAK,IAAM,KACXA,EAAK,MAAQ,KACb,QACZ,CACcA,EAAK,IAAI,OACXA,EAAK,IAAI,MAAQ;AAAA,GAEnBA,EAAK,IAAI,MAAQI,EAAK,QAAQ,UAAW;AAAA,CAAI,EAAE,QAAQ,SAAU;AAAA,CAAI,EACrE,SACF,IAAK,SAEEA,IACHJ,EAAK,MAAQ,MAEf,QACV,CACA,CACK,OAAQtI,EAAG,CACVsI,EAAK,mBAAmBtI,CAAC,EAGrBsI,EAAK,QAAU,WAAaA,EAAK,KAAOA,EAAK,OAC/CA,EAAK,MAAMA,EAAK,GAAG,EAErBA,EAAK,IAAM,KAGXA,EAAK,MAAQA,EAAK,QAAU,UAAY,YAAc,QAC5D,CACI,OAAO,IACR,EACD,MAAO,UAAY,CACjB,IAAIA,EAAO,KACX,GAAI,CAWF,GATAA,EAAK,QAAUA,EAAK,QAAQ,OAAQ,GAEhCA,EAAK,KAAOA,EAAK,QAAU,YAC7BA,EAAK,QAAU;AAAA;AAAA,EACfA,EAAK,MAAO,GAKVA,EAAK,QAAU,UACjB,MAAM,IAAIjI,GAAaA,GAAa,OAAO,YAAY,CAE1D,OAAO,EAAG,CACTiI,EAAK,mBAAmB,CAAC,CAC/B,CACI,OAAAA,EAAK,SAAWA,EAAK,QAAS,EACvB,IACX,CACA,EAEA,IAAAa,GAAiB1B,GCtzCb2B,GAAc,OACdC,GAAmB,CACrB,GAAI,EACJ,GAAM,EACN,GAAM,CACR,EACIC,GAAe,CACjB,MAAS,EACT,OAAU,EACV,IAAO,EACP,KAAQ,EACR,MAAS,EACT,KAAQ,EACR,YAAa,EACb,aAAc,CAChB,EAEA,SAASC,GAAqBpM,EAAO,CACnC,GAAI,OAAOA,GAAU,SACnB,MAAO,GAET,IAAIqM,EAAMH,GAAiBlM,EAAM,YAAW,CAAE,EAC9C,OAAOqM,EAAMrM,EAAM,YAAW,EAAK,EACrC,CAEA,SAASsM,GAAiBtM,EAAO,CAC/B,GAAI,OAAOA,GAAU,SACnB,MAAO,GAET,IAAIuM,EAAQJ,GAAanM,EAAM,YAAW,CAAE,EAC5C,OAAOuM,EAAQvM,EAAM,YAAW,EAAK,EACvC,CAEA,SAASwM,GAAOC,EAAWC,EAASvF,EAAM,CASxC,KAAK,aAAe,GAOpB,IAAIwF,EAAM,GACNC,EAAe,GACfC,EAAaJ,EACbK,EAAWJ,EACXK,EAAQ5F,EACR6F,EAAU,KACVC,EAAY,GACZC,EAAe,GACfC,EAAQ,OACRC,EAAa,QACbC,EAAY,OACZC,EAAiB,OACjBC,EAAQ,IACRC,EAAS,SAEb,OAAO,iBAAiB,KAAM,CAC5B,GAAM,CACJ,WAAY,GACZ,IAAK,UAAW,CACd,OAAOb,CACR,EACD,IAAK,SAAS3M,EAAO,CACnB2M,EAAM,GAAK3M,CACnB,CACK,EAED,YAAe,CACb,WAAY,GACZ,IAAK,UAAW,CACd,OAAO4M,CACR,EACD,IAAK,SAAS5M,EAAO,CACnB4M,EAAe,CAAC,CAAC5M,CACzB,CACK,EAED,UAAa,CACX,WAAY,GACZ,IAAK,UAAW,CACd,OAAO6M,CACR,EACD,IAAK,SAAS7M,EAAO,CACnB,GAAI,OAAOA,GAAU,SACnB,MAAM,IAAI,UAAU,qCAAqC,EAE3D6M,EAAa7M,EACb,KAAK,aAAe,EAC5B,CACK,EAED,QAAW,CACT,WAAY,GACZ,IAAK,UAAW,CACd,OAAO8M,CACR,EACD,IAAK,SAAS9M,EAAO,CACnB,GAAI,OAAOA,GAAU,SACnB,MAAM,IAAI,UAAU,mCAAmC,EAEzD8M,EAAW9M,EACX,KAAK,aAAe,EAC5B,CACK,EAED,KAAQ,CACN,WAAY,GACZ,IAAK,UAAW,CACd,OAAO+M,CACR,EACD,IAAK,SAAS/M,EAAO,CACnB+M,EAAQ,GAAK/M,EACb,KAAK,aAAe,EAC5B,CACK,EAED,OAAU,CACR,WAAY,GACZ,IAAK,UAAW,CACd,OAAOgN,CACR,EACD,IAAK,SAAShN,EAAO,CACnBgN,EAAUhN,EACV,KAAK,aAAe,EAC5B,CACK,EAED,SAAY,CACV,WAAY,GACZ,IAAK,UAAW,CACd,OAAOiN,CACR,EACD,IAAK,SAASjN,EAAO,CACnB,IAAIyN,EAAUrB,GAAqBpM,CAAK,EAExC,GAAIyN,IAAY,GACd,MAAM,IAAI,YAAY,iEAAiE,EAEzFR,EAAYQ,EACZ,KAAK,aAAe,EAC5B,CACK,EAED,YAAe,CACb,WAAY,GACZ,IAAK,UAAW,CACd,OAAOP,CACR,EACD,IAAK,SAASlN,EAAO,CACnBkN,EAAe,CAAC,CAAClN,EACjB,KAAK,aAAe,EAC5B,CACK,EAED,KAAQ,CACN,WAAY,GACZ,IAAK,UAAW,CACd,OAAOmN,CACR,EACD,IAAK,SAASnN,EAAO,CACnB,GAAI,OAAOA,GAAU,UAAYA,IAAUiM,GACzC,MAAM,IAAI,YAAY,0DAA0D,EAElFkB,EAAQnN,EACR,KAAK,aAAe,EAC5B,CACK,EAED,UAAa,CACX,WAAY,GACZ,IAAK,UAAW,CACd,OAAOoN,CACR,EACD,IAAK,SAASpN,EAAO,CACnB,IAAIyN,EAAUnB,GAAiBtM,CAAK,EAC/ByN,GAGHL,EAAaK,EACb,KAAK,aAAe,IAHpB,QAAQ,KAAK,wDAAwD,CAK/E,CACK,EAED,SAAY,CACV,WAAY,GACZ,IAAK,UAAW,CACd,OAAOJ,CACR,EACD,IAAK,SAASrN,EAAO,CACnB,GAAIA,EAAQ,GAAKA,EAAQ,IACvB,MAAM,IAAI,MAAM,qCAAqC,EAEvDqN,EAAYrN,EACZ,KAAK,aAAe,EAC5B,CACK,EAED,cAAiB,CACf,WAAY,GACZ,IAAK,UAAW,CACd,OAAOsN,CACR,EACD,IAAK,SAAStN,EAAO,CACnB,IAAIyN,EAAUnB,GAAiBtM,CAAK,EAC/ByN,GAGHH,EAAiBG,EACjB,KAAK,aAAe,IAHpB,QAAQ,KAAK,4DAA4D,CAKnF,CACK,EAED,KAAQ,CACN,WAAY,GACZ,IAAK,UAAW,CACd,OAAOF,CACR,EACD,IAAK,SAASvN,EAAO,CACnB,GAAIA,EAAQ,GAAKA,EAAQ,IACvB,MAAM,IAAI,MAAM,iCAAiC,EAEnDuN,EAAQvN,EACR,KAAK,aAAe,EAC5B,CACK,EAED,MAAS,CACP,WAAY,GACZ,IAAK,UAAW,CACd,OAAOwN,CACR,EACD,IAAK,SAASxN,EAAO,CACnB,IAAIyN,EAAUnB,GAAiBtM,CAAK,EACpC,GAAI,CAACyN,EACH,MAAM,IAAI,YAAY,8DAA8D,EAEtFD,EAASC,EACT,KAAK,aAAe,EAC5B,CACA,CACA,CAAG,EAOD,KAAK,aAAe,MACtB,CAMAjB,GAAO,UAAU,aAAe,UAAW,CAEzC,OAAO,OAAO,oBAAoB,OAAQ,KAAK,IAAI,CACrD,EAEA,IAAAkB,GAAiBlB,GC7QbmB,GAAgB,CAClB,GAAI,GACJ,GAAM,EACR,EAEA,SAASC,GAAkB5N,EAAO,CAChC,GAAI,OAAOA,GAAU,SACnB,MAAO,GAET,IAAI6N,EAASF,GAAc3N,EAAM,YAAW,CAAE,EAC9C,OAAO6N,EAAS7N,EAAM,YAAW,EAAK,EACxC,CAEA,SAAS8N,GAAoB9N,EAAO,CAClC,OAAO,OAAOA,GAAU,UAAaA,GAAS,GAAKA,GAAS,GAC9D,CAGA,SAAS+N,IAAY,CACnB,IAAIC,EAAS,IACTC,EAAS,EACTC,EAAiB,EACjBC,EAAiB,IACjBC,EAAmB,EACnBC,EAAmB,IACnBC,EAAU,GAEd,OAAO,iBAAiB,KAAM,CAC5B,MAAS,CACP,WAAY,GACZ,IAAK,UAAW,CACd,OAAON,CACR,EACD,IAAK,SAAShO,EAAO,CACnB,GAAI,CAAC8N,GAAoB9N,CAAK,EAC5B,MAAM,IAAI,MAAM,kCAAkC,EAEpDgO,EAAShO,CACjB,CACK,EACD,MAAS,CACP,WAAY,GACZ,IAAK,UAAW,CACd,OAAOiO,CACR,EACD,IAAK,SAASjO,EAAO,CACnB,GAAI,OAAOA,GAAU,SACnB,MAAM,IAAI,UAAU,gCAAgC,EAEtDiO,EAASjO,CACjB,CACK,EACD,cAAiB,CACf,WAAY,GACZ,IAAK,UAAW,CACd,OAAOmO,CACR,EACD,IAAK,SAASnO,EAAO,CACnB,GAAI,CAAC8N,GAAoB9N,CAAK,EAC5B,MAAM,IAAI,MAAM,0CAA0C,EAE5DmO,EAAiBnO,CACzB,CACK,EACD,cAAiB,CACf,WAAY,GACZ,IAAK,UAAW,CACd,OAAOkO,CACR,EACD,IAAK,SAASlO,EAAO,CACnB,GAAG,CAAC8N,GAAoB9N,CAAK,EAC3B,MAAM,IAAI,MAAM,0CAA0C,EAE5DkO,EAAiBlO,CACzB,CACK,EACD,gBAAmB,CACjB,WAAY,GACZ,IAAK,UAAW,CACd,OAAOqO,CACR,EACD,IAAK,SAASrO,EAAO,CACnB,GAAI,CAAC8N,GAAoB9N,CAAK,EAC5B,MAAM,IAAI,MAAM,4CAA4C,EAE9DqO,EAAmBrO,CAC3B,CACK,EACD,gBAAmB,CACjB,WAAY,GACZ,IAAK,UAAW,CACd,OAAOoO,CACR,EACD,IAAK,SAASpO,EAAO,CACnB,GAAI,CAAC8N,GAAoB9N,CAAK,EAC5B,MAAM,IAAI,MAAM,4CAA4C,EAE9DoO,EAAmBpO,CAC3B,CACK,EACD,OAAU,CACR,WAAY,GACZ,IAAK,UAAW,CACd,OAAOsO,CACR,EACD,IAAK,SAAStO,EAAO,CACnB,IAAIyN,EAAUG,GAAkB5N,CAAK,EAEjCyN,IAAY,GACd,QAAQ,KAAK,qDAAqD,EAElEa,EAAUb,CAEpB,CACA,CACA,CAAG,CACH,CAEA,IAAAc,GAAiBR,GCjHb3O,GAASpD,GAETiP,GAAQuD,GAAA,QAAiB,CAC3B,OAAQtO,GACR,OAAQC,GACR,UAAWC,EACb,EAEAhB,GAAO,MAAQ6L,GACf7L,GAAO,OAAS6L,GAAM,OAEtB,IAAIwD,GAAUxD,GAAM,OAChByD,GAAazD,GAAM,UACnB0D,GAAevP,GAAO,OACtBwP,GAAkBxP,GAAO,UAE7B6L,GAAM,KAAO,UAAW,CACtB7L,GAAO,OAASqP,GAChBrP,GAAO,UAAYsP,EACrB,EAEAzD,GAAM,QAAU,UAAW,CACzB7L,GAAO,OAASuP,GAChBvP,GAAO,UAAYwP,EACrB,EAEKxP,GAAO,QACV6L,GAAM,KAAM,wEC9Cb,SAAU4D,EAAM,CACf,IAAIC,EACF,iIACEC,EAAsB,2BACtBC,EAAkB,oBAClBC,EAAsB,wCAEtBC,EAAa,CAOf,iBAAkB,SAAUC,EAASC,EAAaC,EAAM,CAKtD,GAJAA,EAAOA,GAAQ,CAAE,EAEjBF,EAAUA,EAAQ,KAAM,EACxBC,EAAcA,EAAY,KAAM,EAC5B,CAACA,EAAa,CAIhB,GAAI,CAACC,EAAK,gBACR,OAAOF,EAET,IAAIG,EAAwBJ,EAAW,SAASC,CAAO,EACvD,GAAI,CAACG,EACH,MAAM,IAAI,MAAM,iCAAiC,EAEnD,OAAAA,EAAsB,KAAOJ,EAAW,cACtCI,EAAsB,IACvB,EACMJ,EAAW,kBAAkBI,CAAqB,EAE3D,IAAIC,EAAgBL,EAAW,SAASE,CAAW,EACnD,GAAI,CAACG,EACH,MAAM,IAAI,MAAM,qCAAqC,EAEvD,GAAIA,EAAc,OAGhB,OAAKF,EAAK,iBAGVE,EAAc,KAAOL,EAAW,cAAcK,EAAc,IAAI,EACzDL,EAAW,kBAAkBK,CAAa,GAHxCH,EAKX,IAAII,EAAYN,EAAW,SAASC,CAAO,EAC3C,GAAI,CAACK,EACH,MAAM,IAAI,MAAM,iCAAiC,EAEnD,GAAI,CAACA,EAAU,QAAUA,EAAU,MAAQA,EAAU,KAAK,CAAC,IAAM,IAAK,CAGpE,IAAIC,EAAYV,EAAoB,KAAKS,EAAU,IAAI,EACvDA,EAAU,OAASC,EAAU,CAAC,EAC9BD,EAAU,KAAOC,EAAU,CAAC,EAE1BD,EAAU,QAAU,CAACA,EAAU,OACjCA,EAAU,KAAO,KAEnB,IAAIE,EAAa,CAGf,OAAQF,EAAU,OAClB,OAAQD,EAAc,OACtB,KAAM,KACN,OAAQA,EAAc,OACtB,MAAOA,EAAc,MACrB,SAAUA,EAAc,QACzB,EACD,GAAI,CAACA,EAAc,SAIjBG,EAAW,OAASF,EAAU,OAG1BD,EAAc,KAAK,CAAC,IAAM,KAC5B,GAAI,CAACA,EAAc,KAGjBG,EAAW,KAAOF,EAAU,KAIvBD,EAAc,SACjBG,EAAW,OAASF,EAAU,OAIzBD,EAAc,QACjBG,EAAW,MAAQF,EAAU,YAG5B,CAKL,IAAIG,EAAcH,EAAU,KACxBI,EACFD,EAAY,UAAU,EAAGA,EAAY,YAAY,GAAG,EAAI,CAAC,EACzDJ,EAAc,KAChBG,EAAW,KAAOR,EAAW,cAAcU,CAAO,EAIxD,OAAIF,EAAW,OAAS,OACtBA,EAAW,KAAOL,EAAK,gBACnBH,EAAW,cAAcK,EAAc,IAAI,EAC3CA,EAAc,MAEbL,EAAW,kBAAkBQ,CAAU,CAC/C,EACD,SAAU,SAAUG,EAAK,CACvB,IAAIC,EAAQhB,EAAU,KAAKe,CAAG,EAC9B,OAAKC,EAGE,CACL,OAAQA,EAAM,CAAC,GAAK,GACpB,OAAQA,EAAM,CAAC,GAAK,GACpB,KAAMA,EAAM,CAAC,GAAK,GAClB,OAAQA,EAAM,CAAC,GAAK,GACpB,MAAOA,EAAM,CAAC,GAAK,GACnB,SAAUA,EAAM,CAAC,GAAK,EACvB,EATQ,IAUV,EACD,cAAe,SAAUC,EAAM,CAgB7B,IATAA,EAAOA,EAAK,MAAM,EAAE,EAAE,QAAO,EAAG,KAAK,EAAE,EAAE,QAAQf,EAAiB,EAAE,EAUlEe,EAAK,UAAYA,EAAOA,EAAK,QAAQd,EAAqB,EAAE,GAAG,QAC/D,CACF,OAAOc,EAAK,MAAM,EAAE,EAAE,QAAS,EAAC,KAAK,EAAE,CACxC,EACD,kBAAmB,SAAUD,EAAO,CAClC,OACEA,EAAM,OACNA,EAAM,OACNA,EAAM,KACNA,EAAM,OACNA,EAAM,MACNA,EAAM,QAET,CACF,EAGCE,EAAA,QAAiBd,CAOpB,GAAM,0CC3KP,IAAIe,GAAmB,qBAEnBC,GAAa,SAAoBC,EAASC,EAAa,CAEzD,GAAI,YAAY,KAAKA,CAAW,EAC9B,OAAOA,EAIL,SAAS,KAAKD,CAAO,IACvBA,EAAU/Q,EAAO,UAAYA,EAAO,SAAS,MAAQ,IAKvD,IAAIiR,EAAY,OAAOjR,EAAO,KAAQ,WAClCkR,EAAe,QAAQ,KAAKH,CAAO,EAGnCI,EAAiB,CAACnR,EAAO,UAAY,CAAC,QAAQ,KAAK+Q,CAAO,EAQ9D,GANIE,EACFF,EAAU,IAAI/Q,EAAO,IAAI+Q,EAAS/Q,EAAO,UAAY6Q,EAAgB,EAC3D,QAAQ,KAAKE,CAAO,IAC9BA,EAAUjB,GAAW,iBAAiB9P,EAAO,UAAYA,EAAO,SAAS,MAAQ,GAAI+Q,CAAO,GAG1FE,EAAW,CACb,IAAIG,EAAS,IAAI,IAAIJ,EAAaD,CAAO,EAIzC,OAAII,EACKC,EAAO,KAAK,MAAMP,GAAiB,MAAM,EACvCK,EACFE,EAAO,KAAK,MAAMA,EAAO,SAAS,MAAM,EAG1CA,EAAO,IAClB,CAEE,OAAOtB,GAAW,iBAAiBiB,EAASC,CAAW,CACzD,ECnCIK,GAAsB,UAAY,CACpC,SAASA,GAAS,CAChB,KAAK,UAAY,CAAE,CACvB,CAUE,IAAI3S,EAAS2S,EAAO,UAEpB,OAAA3S,EAAO,GAAK,SAAYC,EAAM2S,EAAU,CACjC,KAAK,UAAU3S,CAAI,IACtB,KAAK,UAAUA,CAAI,EAAI,CAAE,GAG3B,KAAK,UAAUA,CAAI,EAAE,KAAK2S,CAAQ,CACtC,EAWE5S,EAAO,IAAM,SAAaC,EAAM2S,EAAU,CACxC,GAAI,CAAC,KAAK,UAAU3S,CAAI,EACtB,MAAO,GAGT,IAAI6C,EAAQ,KAAK,UAAU7C,CAAI,EAAE,QAAQ2S,CAAQ,EASjD,YAAK,UAAU3S,CAAI,EAAI,KAAK,UAAUA,CAAI,EAAE,MAAM,CAAC,EACnD,KAAK,UAAUA,CAAI,EAAE,OAAO6C,EAAO,CAAC,EAC7BA,EAAQ,EACnB,EASE9C,EAAO,QAAU,SAAiBC,EAAM,CACtC,IAAI4S,EAAY,KAAK,UAAU5S,CAAI,EAEnC,GAAK4S,EAQL,GAAI,UAAU,SAAW,EAGvB,QAFIC,EAASD,EAAU,OAEdpT,EAAI,EAAGA,EAAIqT,EAAQ,EAAErT,EAC5BoT,EAAUpT,CAAC,EAAE,KAAK,KAAM,UAAU,CAAC,CAAC,MAMtC,SAHIsT,EAAO,MAAM,UAAU,MAAM,KAAK,UAAW,CAAC,EAC9CC,EAAUH,EAAU,OAEfI,EAAK,EAAGA,EAAKD,EAAS,EAAEC,EAC/BJ,EAAUI,CAAE,EAAE,MAAM,KAAMF,CAAI,CAGtC,EAME/S,EAAO,QAAU,UAAmB,CAClC,KAAK,UAAY,CAAE,CACvB,EAWEA,EAAO,KAAO,SAAckT,EAAa,CACvC,KAAK,GAAG,OAAQ,SAAUzG,EAAM,CAC9ByG,EAAY,KAAKzG,CAAI,CAC3B,CAAK,CACF,EAEMkG,CACT,EAAG,ECpHCQ,GAAO,SAAcvN,EAAG,CAC1B,OAAOtE,EAAO,KAAOA,EAAO,KAAKsE,CAAC,EAAI,OAAO,KAAKA,EAAG,QAAQ,EAAE,SAAS,QAAQ,CAClF,EAEe,SAASwN,GAAsBC,EAAS,CAIrD,QAHIC,EAAgBH,GAAKE,CAAO,EAC5B9P,EAAQ,IAAI,WAAW+P,EAAc,MAAM,EAEtC7T,EAAI,EAAGA,EAAI6T,EAAc,OAAQ7T,IACxC8D,EAAM9D,CAAC,EAAI6T,EAAc,WAAW7T,CAAC,EAGvC,OAAO8D,CACT,CCfA,2DAgBA,MAAMgQ,WAAmBZ,EAAO,CAC9B,aAAc,CACZ,MAAO,EACP,KAAK,OAAS,EAClB,CAQE,KAAKlG,EAAM,CACT,IAAI+G,EAIJ,IAHA,KAAK,QAAU/G,EACf+G,EAAc,KAAK,OAAO,QAAQ;AAAA,CAAI,EAE/BA,EAAc,GAAIA,EAAc,KAAK,OAAO,QAAQ;AAAA,CAAI,EAC7D,KAAK,QAAQ,OAAQ,KAAK,OAAO,UAAU,EAAGA,CAAW,CAAC,EAC1D,KAAK,OAAS,KAAK,OAAO,UAAUA,EAAc,CAAC,CAEzD,CAEA,CAEA,MAAMC,GAAM,IAENC,GAAiB,SAAUC,EAAiB,CAGhD,MAAMC,EAAQ,yBAAyB,KAAKD,GAAmB,EAAE,EAC3D/Q,EAAS,CAAE,EAEjB,OAAIgR,EAAM,CAAC,IACThR,EAAO,OAAS,SAASgR,EAAM,CAAC,EAAG,EAAE,GAGnCA,EAAM,CAAC,IACThR,EAAO,OAAS,SAASgR,EAAM,CAAC,EAAG,EAAE,GAGhChR,CACT,EAUMiR,GAAqB,UAAY,CAGrC,MAAMC,EAAW,MAFL,QAEmB,QADjB,gBACmC,IACjD,OAAO,IAAI,OAAO,WAAaA,EAAW,GAAG,CAC/C,EAQMC,GAAkB,SAAUC,EAAY,CAC5C,MAAMpR,EAAS,CAAE,EAEjB,GAAI,CAACoR,EACH,OAAOpR,EAIT,MAAMqR,EAAQD,EAAW,MAAMH,GAAkB,CAAE,EACnD,IAAIpU,EAAIwU,EAAM,OACVC,EAEJ,KAAOzU,KAEDwU,EAAMxU,CAAC,IAAM,KAKjByU,EAAO,eAAe,KAAKD,EAAMxU,CAAC,CAAC,EAAE,MAAM,CAAC,EAE5CyU,EAAK,CAAC,EAAIA,EAAK,CAAC,EAAE,QAAQ,aAAc,EAAE,EAC1CA,EAAK,CAAC,EAAIA,EAAK,CAAC,EAAE,QAAQ,aAAc,EAAE,EAC1CA,EAAK,CAAC,EAAIA,EAAK,CAAC,EAAE,QAAQ,kBAAmB,IAAI,EACjDtR,EAAOsR,EAAK,CAAC,CAAC,EAAIA,EAAK,CAAC,GAG1B,OAAOtR,CACT,EA2BA,MAAMuR,WAAoBxB,EAAO,CAC/B,aAAc,CACZ,MAAO,EACP,KAAK,cAAgB,CAAE,EACvB,KAAK,WAAa,CAAE,CACxB,CAQE,KAAKlF,EAAM,CACT,IAAImG,EACAQ,EAIJ,GAFA3G,EAAOA,EAAK,KAAM,EAEdA,EAAK,SAAW,EAElB,OAIF,GAAIA,EAAK,CAAC,IAAM,IAAK,CACnB,KAAK,QAAQ,OAAQ,CACnB,KAAM,MACN,IAAKA,CACb,CAAO,EACD,MACD,CAGgB,KAAK,WAAW,OAAO,CAAC4G,EAAKC,IAAW,CACvD,MAAMC,EAAaD,EAAO7G,CAAI,EAE9B,OAAI8G,IAAe9G,EACV4G,EAGFA,EAAI,OAAO,CAACE,CAAU,CAAC,CACpC,EAAO,CAAC9G,CAAI,CAAC,EACA,QAAQ+G,GAAW,CAC1B,QAAS/U,EAAI,EAAGA,EAAI,KAAK,cAAc,OAAQA,IAC7C,GAAI,KAAK,cAAcA,CAAC,EAAE,KAAK,KAAM+U,CAAO,EAC1C,OAKJ,GAAIA,EAAQ,QAAQ,MAAM,IAAM,EAAG,CACjC,KAAK,QAAQ,OAAQ,CACnB,KAAM,UACN,KAAMA,EAAQ,MAAM,CAAC,CAC/B,CAAS,EACD,MACD,CAQD,GAJAA,EAAUA,EAAQ,QAAQ,KAAM,EAAE,EAElCZ,EAAQ,WAAW,KAAKY,CAAO,EAE3BZ,EAAO,CACT,KAAK,QAAQ,OAAQ,CACnB,KAAM,MACN,QAAS,KACnB,CAAS,EACD,MACR,CAIM,GAFAA,EAAQ,+BAA+B,KAAKY,CAAO,EAE/CZ,EAAO,CACTQ,EAAQ,CACN,KAAM,MACN,QAAS,KACV,EAEGR,EAAM,CAAC,IACTQ,EAAM,SAAW,WAAWR,EAAM,CAAC,CAAC,GAGlCA,EAAM,CAAC,IACTQ,EAAM,MAAQR,EAAM,CAAC,GAGvB,KAAK,QAAQ,OAAQQ,CAAK,EAC1B,MACR,CAIM,GAFAR,EAAQ,oCAAoC,KAAKY,CAAO,EAEpDZ,EAAO,CACTQ,EAAQ,CACN,KAAM,MACN,QAAS,gBACV,EAEGR,EAAM,CAAC,IACTQ,EAAM,SAAW,SAASR,EAAM,CAAC,EAAG,EAAE,GAGxC,KAAK,QAAQ,OAAQQ,CAAK,EAC1B,MACR,CAIM,GAFAR,EAAQ,6BAA6B,KAAKY,CAAO,EAE7CZ,EAAO,CACTQ,EAAQ,CACN,KAAM,MACN,QAAS,SACV,EAEGR,EAAM,CAAC,IACTQ,EAAM,QAAU,SAASR,EAAM,CAAC,EAAG,EAAE,GAGvC,KAAK,QAAQ,OAAQQ,CAAK,EAC1B,MACR,CAIM,GAFAR,EAAQ,uCAAuC,KAAKY,CAAO,EAEvDZ,EAAO,CACTQ,EAAQ,CACN,KAAM,MACN,QAAS,gBACV,EAEGR,EAAM,CAAC,IACTQ,EAAM,OAAS,SAASR,EAAM,CAAC,EAAG,EAAE,GAGtC,KAAK,QAAQ,OAAQQ,CAAK,EAC1B,MACR,CAIM,GAFAR,EAAQ,+CAA+C,KAAKY,CAAO,EAE/DZ,EAAO,CACTQ,EAAQ,CACN,KAAM,MACN,QAAS,wBACV,EAEGR,EAAM,CAAC,IACTQ,EAAM,OAAS,SAASR,EAAM,CAAC,EAAG,EAAE,GAGtC,KAAK,QAAQ,OAAQQ,CAAK,EAC1B,MACR,CAIM,GAFAR,EAAQ,+BAA+B,KAAKY,CAAO,EAE/CZ,EAAO,CACTQ,EAAQ,CACN,KAAM,MACN,QAAS,eACV,EAEGR,EAAM,CAAC,IACTQ,EAAM,aAAeR,EAAM,CAAC,GAG9B,KAAK,QAAQ,OAAQQ,CAAK,EAC1B,MACR,CAIM,GAFAR,EAAQ,2BAA2B,KAAKY,CAAO,EAE3CZ,EAAO,CACTQ,EAAQxV,GAAS8U,GAAeE,EAAM,CAAC,CAAC,EAAG,CACzC,KAAM,MACN,QAAS,WACnB,CAAS,EACD,KAAK,QAAQ,OAAQQ,CAAK,EAC1B,MACR,CAIM,GAFAR,EAAQ,gCAAgC,KAAKY,CAAO,EAEhDZ,EAAO,CACTQ,EAAQ,CACN,KAAM,MACN,QAAS,aACV,EAEGR,EAAM,CAAC,IACTQ,EAAM,QAAU,CAAC,KAAK,KAAKR,EAAM,CAAC,CAAC,GAGrC,KAAK,QAAQ,OAAQQ,CAAK,EAC1B,MACR,CAIM,GAFAR,EAAQ,oBAAoB,KAAKY,CAAO,EAEpCZ,EAAO,CAMT,GALAQ,EAAQ,CACN,KAAM,MACN,QAAS,KACV,EAEGR,EAAM,CAAC,EAAG,CACZ,MAAMI,EAAaD,GAAgBH,EAAM,CAAC,CAAC,EAEvCI,EAAW,MACbI,EAAM,IAAMJ,EAAW,KAGrBA,EAAW,YACbI,EAAM,UAAYV,GAAeM,EAAW,SAAS,EAEjE,CAEQ,KAAK,QAAQ,OAAQI,CAAK,EAC1B,MACR,CAIM,GAFAR,EAAQ,2BAA2B,KAAKY,CAAO,EAE3CZ,EAAO,CAMT,GALAQ,EAAQ,CACN,KAAM,MACN,QAAS,YACV,EAEGR,EAAM,CAAC,EAAG,CAGZ,GAFAQ,EAAM,WAAaL,GAAgBH,EAAM,CAAC,CAAC,EAEvCQ,EAAM,WAAW,WAAY,CAC/B,MAAMK,EAAQL,EAAM,WAAW,WAAW,MAAM,GAAG,EAC7CM,EAAa,CAAE,EAEjBD,EAAM,CAAC,IACTC,EAAW,MAAQ,SAASD,EAAM,CAAC,EAAG,EAAE,GAGtCA,EAAM,CAAC,IACTC,EAAW,OAAS,SAASD,EAAM,CAAC,EAAG,EAAE,GAG3CL,EAAM,WAAW,WAAaM,CAC1C,CAEcN,EAAM,WAAW,YACnBA,EAAM,WAAW,UAAY,SAASA,EAAM,WAAW,UAAW,EAAE,GAGlEA,EAAM,WAAW,YAAY,IAC/BA,EAAM,WAAW,YAAY,EAAI,WAAWA,EAAM,WAAW,YAAY,CAAC,GAGxEA,EAAM,WAAW,YAAY,IAC/BA,EAAM,WAAW,YAAY,EAAI,SAASA,EAAM,WAAW,YAAY,EAAG,EAAE,EAExF,CAEQ,KAAK,QAAQ,OAAQA,CAAK,EAC1B,MACR,CAIM,GAFAR,EAAQ,sBAAsB,KAAKY,CAAO,EAEtCZ,EAAO,CACTQ,EAAQ,CACN,KAAM,MACN,QAAS,OACV,EAEGR,EAAM,CAAC,IACTQ,EAAM,WAAaL,GAAgBH,EAAM,CAAC,CAAC,GAG7C,KAAK,QAAQ,OAAQQ,CAAK,EAC1B,MACR,CAIM,GAFAR,EAAQ,kBAAkB,KAAKY,CAAO,EAElCZ,EAAO,CACT,KAAK,QAAQ,OAAQ,CACnB,KAAM,MACN,QAAS,SACnB,CAAS,EACD,MACR,CAIM,GAFAA,EAAQ,wBAAwB,KAAKY,CAAO,EAExCZ,EAAO,CACT,KAAK,QAAQ,OAAQ,CACnB,KAAM,MACN,QAAS,eACnB,CAAS,EACD,MACR,CAIM,GAFAA,EAAQ,kCAAkC,KAAKY,CAAO,EAElDZ,EAAO,CACTQ,EAAQ,CACN,KAAM,MACN,QAAS,mBACV,EAEGR,EAAM,CAAC,IACTQ,EAAM,eAAiBR,EAAM,CAAC,EAC9BQ,EAAM,eAAiB,IAAI,KAAKR,EAAM,CAAC,CAAC,GAG1C,KAAK,QAAQ,OAAQQ,CAAK,EAC1B,MACR,CAIM,GAFAR,EAAQ,oBAAoB,KAAKY,CAAO,EAEpCZ,EAAO,CACTQ,EAAQ,CACN,KAAM,MACN,QAAS,KACV,EAEGR,EAAM,CAAC,IACTQ,EAAM,WAAaL,GAAgBH,EAAM,CAAC,CAAC,EAEvCQ,EAAM,WAAW,KACfA,EAAM,WAAW,GAAG,UAAU,EAAG,CAAC,EAAE,YAAa,IAAK,OACxDA,EAAM,WAAW,GAAKA,EAAM,WAAW,GAAG,UAAU,CAAC,GAGvDA,EAAM,WAAW,GAAKA,EAAM,WAAW,GAAG,MAAM,OAAO,EACvDA,EAAM,WAAW,GAAG,CAAC,EAAI,SAASA,EAAM,WAAW,GAAG,CAAC,EAAG,EAAE,EAC5DA,EAAM,WAAW,GAAG,CAAC,EAAI,SAASA,EAAM,WAAW,GAAG,CAAC,EAAG,EAAE,EAC5DA,EAAM,WAAW,GAAG,CAAC,EAAI,SAASA,EAAM,WAAW,GAAG,CAAC,EAAG,EAAE,EAC5DA,EAAM,WAAW,GAAG,CAAC,EAAI,SAASA,EAAM,WAAW,GAAG,CAAC,EAAG,EAAE,EAC5DA,EAAM,WAAW,GAAK,IAAI,YAAYA,EAAM,WAAW,EAAE,IAI7D,KAAK,QAAQ,OAAQA,CAAK,EAC1B,MACR,CAIM,GAFAR,EAAQ,sBAAsB,KAAKY,CAAO,EAEtCZ,EAAO,CACTQ,EAAQ,CACN,KAAM,MACN,QAAS,OACV,EAEGR,EAAM,CAAC,IACTQ,EAAM,WAAaL,GAAgBH,EAAM,CAAC,CAAC,EAC3CQ,EAAM,WAAW,aAAa,EAAI,WAAWA,EAAM,WAAW,aAAa,CAAC,EAC5EA,EAAM,WAAW,QAAU,MAAM,KAAKA,EAAM,WAAW,OAAO,GAGhE,KAAK,QAAQ,OAAQA,CAAK,EAC1B,MACR,CAIM,GAFAR,EAAQ,8BAA8B,KAAKY,CAAO,EAE9CZ,EAAO,CACTQ,EAAQ,CACN,KAAM,MACN,QAAS,cACV,EAEGR,EAAM,CAAC,EACTQ,EAAM,KAAOR,EAAM,CAAC,EAEpBQ,EAAM,KAAO,GAGf,KAAK,QAAQ,OAAQA,CAAK,EAC1B,MACR,CAIM,GAFAR,EAAQ,yBAAyB,KAAKY,CAAO,EAEzCZ,EAAO,CACTQ,EAAQ,CACN,KAAM,MACN,QAAS,SACV,EAEGR,EAAM,CAAC,EACTQ,EAAM,KAAOR,EAAM,CAAC,EAEpBQ,EAAM,KAAO,GAGf,KAAK,QAAQ,OAAQA,CAAK,EAC1B,MACR,CAIM,GAFAR,EAAQ,wBAAwB,KAAKY,CAAO,EAExCZ,EAAO,CACTQ,EAAQ,CACN,KAAM,MACN,QAAS,QACV,EAEGR,EAAM,CAAC,EACTQ,EAAM,KAAOR,EAAM,CAAC,EAEpBQ,EAAM,KAAO,GAGf,KAAK,QAAQ,OAAQA,CAAK,EAC1B,MACR,CAIM,GAFAR,EAAQ,qBAAqB,KAAKY,CAAO,EAErCZ,GAASA,EAAM,CAAC,EAAG,CACrBQ,EAAQ,CACN,KAAM,MACN,QAAS,MACV,EACDA,EAAM,WAAaL,GAAgBH,EAAM,CAAC,CAAC,EAEvCQ,EAAM,WAAW,eAAe,kBAAkB,IACpDA,EAAM,WAAW,kBAAkB,EAAI,SAASA,EAAM,WAAW,kBAAkB,EAAG,EAAE,GAGtFA,EAAM,WAAW,eAAe,6BAA6B,IAC/DA,EAAM,WAAW,6BAA6B,EAAIA,EAAM,WAAW,6BAA6B,EAAE,MAAMX,EAAG,GAG7G,KAAK,QAAQ,OAAQW,CAAK,EAC1B,MACR,CAIM,GAFAR,EAAQ,qBAAqB,KAAKY,CAAO,EAErCZ,GAASA,EAAM,CAAC,EAAG,CACrBQ,EAAQ,CACN,KAAM,MACN,QAAS,MACV,EACDA,EAAM,WAAaL,GAAgBH,EAAM,CAAC,CAAC,EAC3C,CAAC,UAAU,EAAE,QAAQ,SAAU7Q,EAAK,CAC9BqR,EAAM,WAAW,eAAerR,CAAG,IACrCqR,EAAM,WAAWrR,CAAG,EAAI,WAAWqR,EAAM,WAAWrR,CAAG,CAAC,EAEpE,CAAS,EACD,CAAC,cAAe,KAAK,EAAE,QAAQ,SAAUA,EAAK,CACxCqR,EAAM,WAAW,eAAerR,CAAG,IACrCqR,EAAM,WAAWrR,CAAG,EAAI,MAAM,KAAKqR,EAAM,WAAWrR,CAAG,CAAC,EAEpE,CAAS,EAEGqR,EAAM,WAAW,eAAe,WAAW,IAC7CA,EAAM,WAAW,UAAYV,GAAeU,EAAM,WAAW,SAAS,GAGxE,KAAK,QAAQ,OAAQA,CAAK,EAC1B,MACR,CAIM,GAFAR,EAAQ,+BAA+B,KAAKY,CAAO,EAE/CZ,GAASA,EAAM,CAAC,EAAG,CACrBQ,EAAQ,CACN,KAAM,MACN,QAAS,gBACV,EACDA,EAAM,WAAaL,GAAgBH,EAAM,CAAC,CAAC,EAC3C,CAAC,iBAAkB,iBAAkB,WAAW,EAAE,QAAQ,SAAU7Q,EAAK,CACnEqR,EAAM,WAAW,eAAerR,CAAG,IACrCqR,EAAM,WAAWrR,CAAG,EAAI,WAAWqR,EAAM,WAAWrR,CAAG,CAAC,EAEpE,CAAS,EACD,CAAC,sBAAuB,kBAAkB,EAAE,QAAQ,SAAUA,EAAK,CAC7DqR,EAAM,WAAW,eAAerR,CAAG,IACrCqR,EAAM,WAAWrR,CAAG,EAAI,MAAM,KAAKqR,EAAM,WAAWrR,CAAG,CAAC,EAEpE,CAAS,EACD,KAAK,QAAQ,OAAQqR,CAAK,EAC1B,MACR,CAIM,GAFAR,EAAQ,yBAAyB,KAAKY,CAAO,EAEzCZ,GAASA,EAAM,CAAC,EAAG,CACrBQ,EAAQ,CACN,KAAM,MACN,QAAS,UACV,EACDA,EAAM,WAAaL,GAAgBH,EAAM,CAAC,CAAC,EAC3C,CAAC,aAAa,EAAE,QAAQ,SAAU7Q,EAAK,CACjCqR,EAAM,WAAW,eAAerR,CAAG,IACrCqR,EAAM,WAAWrR,CAAG,EAAI,WAAWqR,EAAM,WAAWrR,CAAG,CAAC,EAEpE,CAAS,EACD,KAAK,QAAQ,OAAQqR,CAAK,EAC1B,MACR,CAIM,GAFAR,EAAQ,6BAA6B,KAAKY,CAAO,EAE7CZ,GAASA,EAAM,CAAC,EAAG,CACrBQ,EAAQ,CACN,KAAM,MACN,QAAS,cACV,EACDA,EAAM,WAAaL,GAAgBH,EAAM,CAAC,CAAC,EAC3C,CAAC,kBAAmB,kBAAkB,EAAE,QAAQ,SAAU7Q,EAAK,CAC7D,GAAIqR,EAAM,WAAW,eAAerR,CAAG,EAAG,CACxCqR,EAAM,WAAWrR,CAAG,EAAI,SAASqR,EAAM,WAAWrR,CAAG,EAAG,EAAE,EAC1D,MAAM4R,EAAS5R,IAAQ,mBAAqB,SAAW,SACvDqR,EAAM,WAAW,UAAYA,EAAM,WAAW,WAAa,CAAE,EAC7DA,EAAM,WAAW,UAAUO,CAAM,EAAIP,EAAM,WAAWrR,CAAG,EAEzD,OAAOqR,EAAM,WAAWrR,CAAG,CACvC,CACA,CAAS,EACD,KAAK,QAAQ,OAAQqR,CAAK,EAC1B,MACR,CAIM,GAFAR,EAAQ,iCAAiC,KAAKY,CAAO,EAEjDZ,GAASA,EAAM,CAAC,EAAG,CACrBQ,EAAQ,CACN,KAAM,MACN,QAAS,kBACV,EACDA,EAAM,WAAaL,GAAgBH,EAAM,CAAC,CAAC,EAC3C,CAAC,WAAY,WAAW,EAAE,QAAQ,SAAU7Q,EAAK,CAC3CqR,EAAM,WAAW,eAAerR,CAAG,IACrCqR,EAAM,WAAWrR,CAAG,EAAI,SAASqR,EAAM,WAAWrR,CAAG,EAAG,EAAE,EAEtE,CAAS,EACD,KAAK,QAAQ,OAAQqR,CAAK,EAC1B,MACR,CAIM,GAFAR,EAAQ,0BAA0B,KAAKY,CAAO,EAE1CZ,GAASA,EAAM,CAAC,EAAG,CACrBQ,EAAQ,CACN,KAAM,MACN,QAAS,WACV,EACDA,EAAM,WAAaL,GAAgBH,EAAM,CAAC,CAAC,EAC3C,CAAC,KAAM,OAAO,EAAE,QAAQ,SAAU7Q,EAAK,CACjCqR,EAAM,WAAW,eAAerR,CAAG,IACrCqR,EAAM,WAAWrR,CAAG,EAAI,OAAOqR,EAAM,WAAWrR,CAAG,CAAC,EAEhE,CAAS,EACD,CAAC,aAAc,UAAU,EAAE,QAAQ,SAAUA,EAAK,CAC5CqR,EAAM,WAAW,eAAerR,CAAG,IACrCqR,EAAM,WAAWrR,CAAG,EAAI,IAAI,KAAKqR,EAAM,WAAWrR,CAAG,CAAC,EAElE,CAAS,EACD,CAAC,WAAY,kBAAkB,EAAE,QAAQ,SAAUA,EAAK,CAClDqR,EAAM,WAAW,eAAerR,CAAG,IACrCqR,EAAM,WAAWrR,CAAG,EAAI,WAAWqR,EAAM,WAAWrR,CAAG,CAAC,EAEpE,CAAS,EACD,CAAC,aAAa,EAAE,QAAQ,SAAUA,EAAK,CACjCqR,EAAM,WAAW,eAAerR,CAAG,IACrCqR,EAAM,WAAWrR,CAAG,EAAI,OAAO,KAAKqR,EAAM,WAAWrR,CAAG,CAAC,EAErE,CAAS,EACD,CAAC,aAAc,cAAe,WAAW,EAAE,QAAQ,SAAUA,EAAK,CAC5DqR,EAAM,WAAW,eAAerR,CAAG,IACrCqR,EAAM,WAAWrR,CAAG,EAAIqR,EAAM,WAAWrR,CAAG,EAAE,SAAS,EAAE,EAErE,CAAS,EACD,MAAM6R,EAAyB,uBAE/B,UAAW7R,KAAOqR,EAAM,WAAY,CAClC,GAAI,CAACQ,EAAuB,KAAK7R,CAAG,EAClC,SAGF,MAAM8R,EAAgB,kBAAkB,KAAKT,EAAM,WAAWrR,CAAG,CAAC,EAC5D+R,EAAoB,gBAAgB,KAAKV,EAAM,WAAWrR,CAAG,CAAC,EACpEqR,EAAM,WAAWrR,CAAG,EAAI8R,EAAgBT,EAAM,WAAWrR,CAAG,EAAE,SAAS,EAAE,EAAI+R,EAAoB,WAAWV,EAAM,WAAWrR,CAAG,CAAC,EAAI,OAAOqR,EAAM,WAAWrR,CAAG,CAAC,CAC3K,CAEQ,KAAK,QAAQ,OAAQqR,CAAK,EAC1B,MACR,CAIM,GAFAR,EAAQ,+BAA+B,KAAKY,CAAO,EAE/CZ,EAAO,CACT,KAAK,QAAQ,OAAQ,CACnB,KAAM,MACN,QAAS,sBACnB,CAAS,EACD,MACR,CAIM,GAFAA,EAAQ,iCAAiC,KAAKY,CAAO,EAEjDZ,EAAO,CACTQ,EAAQ,CACN,KAAM,MACN,QAAS,kBACV,EACDA,EAAM,WAAaL,GAAgBH,EAAM,CAAC,CAAC,EAC3C,KAAK,QAAQ,OAAQQ,CAAK,EAC1B,MACD,CAGD,KAAK,QAAQ,OAAQ,CACnB,KAAM,MACN,KAAMI,EAAQ,MAAM,CAAC,CAC7B,CAAO,CACP,CAAK,CACL,CAYE,UAAU,CACR,WAAAO,EACA,WAAAC,EACA,WAAAC,EACA,QAAAC,CACJ,EAAK,CACG,OAAOD,GAAe,aACxBA,EAAaxH,GAAQA,GAGvB,KAAK,cAAc,KAAKA,GAAQ,CAG9B,GAFcsH,EAAW,KAAKtH,CAAI,EAGhC,YAAK,QAAQ,OAAQ,CACnB,KAAM,SACN,KAAMwH,EAAWxH,CAAI,EACrB,WAAAuH,EACA,QAAAE,CACV,CAAS,EACM,EAEf,CAAK,CACL,CAUE,aAAa,CACX,WAAAH,EACA,IAAAI,CACJ,EAAK,CACD,MAAMC,EAAQ3H,GACRsH,EAAW,KAAKtH,CAAI,EACf0H,EAAI1H,CAAI,EAGVA,EAGT,KAAK,WAAW,KAAK2H,CAAK,CAC9B,CAEA,CAEA,MAAMC,GAAYC,GAAOA,EAAI,YAAa,EAAC,QAAQ,SAAUnP,GAAKA,EAAE,CAAC,EAAE,YAAW,CAAE,EAE9EoP,GAAgB,SAAUvB,EAAY,CAC1C,MAAMpR,EAAS,CAAE,EACjB,cAAO,KAAKoR,CAAU,EAAE,QAAQ,SAAUjR,EAAK,CAC7CH,EAAOyS,GAAUtS,CAAG,CAAC,EAAIiR,EAAWjR,CAAG,CAC3C,CAAG,EACMH,CACT,EAMM4S,GAAc,SAAUC,EAAU,CACtC,KAAM,CACJ,cAAAC,EACA,eAAAC,EACA,mBAAAC,CACJ,EAAMH,EAEJ,GAAI,CAACC,EACH,OAGF,MAAMG,EAAM,wBACNC,EAAK,WACLC,EAAM,eACNC,EAAoBL,GAAkBA,EAAiB,EACvDM,EAAkBL,GAAsBA,EAAqB,EAE/DD,GAAkB,CAACD,EAAc,eAAeI,CAAE,IACpDJ,EAAcI,CAAE,EAAIE,EACpB,KAAK,QAAQ,OAAQ,CACnB,QAAS,GAAGH,CAAG,gDAAgDG,CAAiB,IACtF,CAAK,GAGCA,GAAqBN,EAAcI,CAAE,EAAIE,IAC3C,KAAK,QAAQ,OAAQ,CACnB,QAAS,GAAGH,CAAG,wBAAwBH,EAAcI,CAAE,CAAC,4BAA4BE,CAAiB,GAC3G,CAAK,EACDN,EAAcI,CAAE,EAAIE,GAIlBJ,GAAsB,CAACF,EAAc,eAAeK,CAAG,IACzDL,EAAcK,CAAG,EAAIH,EAAqB,EAC1C,KAAK,QAAQ,OAAQ,CACnB,QAAS,GAAGC,CAAG,yDAAyDH,EAAcK,CAAG,CAAC,IAChG,CAAK,GAICH,GAAsBF,EAAcK,CAAG,EAAIE,IAC7C,KAAK,QAAQ,OAAQ,CACnB,QAAS,GAAGJ,CAAG,6BAA6BH,EAAcK,CAAG,CAAC,gCAAgCE,CAAe,IACnH,CAAK,EACDP,EAAcK,CAAG,EAAIE,EAEzB,EAwBA,MAAMC,WAAevD,EAAO,CAC1B,aAAc,CACZ,MAAO,EACP,KAAK,WAAa,IAAIY,GACtB,KAAK,YAAc,IAAIY,GACvB,KAAK,WAAW,KAAK,KAAK,WAAW,EACrC,KAAK,oBAAsB,KAG3B,MAAM9G,EAAO,KAGP8I,EAAO,CAAE,EACf,IAAIC,EAAa,CAAA,EAEbC,EAEAtT,EACAuT,EAAW,GAEf,MAAMrT,EAAO,UAAY,CAAE,EAErBsT,EAAqB,CACzB,MAAS,CAAE,EACX,MAAS,CAAE,EACX,kBAAmB,CAAE,EACrB,UAAa,CAAA,CACnB,EAGUC,EAAe,gDAErB,IAAIC,EAAkB,EAEtB,KAAK,SAAW,CACd,WAAY,GACZ,oBAAqB,CAAE,EACvB,WAAY,CAAE,EACd,SAAU,CAAA,CAChB,EAII,IAAIC,EAAmB,EAEnBC,EAAuB,EAC3B,MAAMC,EAAgB,CAAE,EACxB,KAAK,GAAG,MAAO,IAAM,CAGfR,EAAW,KAAO,CAACA,EAAW,OAAS,CAACA,EAAW,eAInD,CAACA,EAAW,KAAOC,IACrBD,EAAW,IAAMC,GAGf,CAACD,EAAW,KAAOrT,IACrBqT,EAAW,IAAMrT,GAGf,CAACqT,EAAW,UAAY,OAAOK,GAAoB,WACrDL,EAAW,SAAWK,GAGxB,KAAK,SAAS,eAAiBL,EACrC,CAAK,EAED,KAAK,YAAY,GAAG,OAAQ,SAAUS,EAAO,CAC3C,IAAIC,EACAC,GACH,CACC,KAAM,EAEF,CACA,SAAU,CACJF,EAAM,UACR,KAAK,SAAS,QAAUA,EAAM,QAEjC,EAED,eAAgB,CACd,KAAK,SAAS,WAAaA,EAAM,QAE3B,YAAaA,IACjB,KAAK,QAAQ,OAAQ,CACnB,QAAS,8BAC3B,CAAiB,EACD,KAAK,SAAS,WAAa,GAE9B,EAED,WAAY,CACV,MAAMG,EAAY,CAAE,EAEhB,WAAYH,IACdT,EAAW,UAAYY,EACvBA,EAAU,OAASH,EAAM,OAEnB,WAAYA,IAWhBA,EAAM,OAASH,IAIf,WAAYG,IACdT,EAAW,UAAYY,EACvBA,EAAU,OAASH,EAAM,QAG3BH,EAAmBM,EAAU,OAASA,EAAU,MACjD,EAED,SAAU,CACR,KAAK,SAAS,QAAU,EACzB,EAED,KAAM,CACE,kBAAmB,KAAK,WAC5B,KAAK,SAAS,cAAgB,EAC9B,KAAK,QAAQ,OAAQ,CACnB,QAAS,mCAC3B,CAAiB,GAGG,0BAA2B,KAAK,WACpC,KAAK,SAAS,sBAAwB,EACtC,KAAK,QAAQ,OAAQ,CACnB,QAAS,2CAC3B,CAAiB,GAGCH,EAAM,QACRT,EAAW,MAAQS,EAAM,OAGvBA,EAAM,SAAW,IACnBT,EAAW,SAAWS,EAAM,UAG1BA,EAAM,WAAa,IACrBT,EAAW,SAAW,IACtB,KAAK,QAAQ,OAAQ,CACnB,QAAS,iDAC3B,CAAiB,GAGH,KAAK,SAAS,SAAWD,CAC1B,EAED,KAAM,CACJ,GAAI,CAACU,EAAM,WAAY,CACrB,KAAK,QAAQ,OAAQ,CACnB,QAAS,iDAC3B,CAAiB,EACD,MACD,CAGD,GAAIA,EAAM,WAAW,SAAW,OAAQ,CACtC9T,EAAM,KACN,MAChB,CAEc,GAAI,CAAC8T,EAAM,WAAW,IAAK,CACzB,KAAK,QAAQ,OAAQ,CACnB,QAAS,sCAC3B,CAAiB,EACD,MAChB,CAEc,GAAIA,EAAM,WAAW,YAAc,iCAAkC,CACnE,KAAK,SAAS,kBAAoB,KAAK,SAAS,mBAAqB,GAErE,KAAK,SAAS,kBAAkB,mBAAmB,EAAI,CACrD,WAAYA,EAAM,UACnB,EACD,MAChB,CAEc,GAAIA,EAAM,WAAW,YAAc,0BAA2B,CAC5D,KAAK,SAAS,kBAAoB,KAAK,SAAS,mBAAqB,GAErE,KAAK,SAAS,kBAAkB,yBAAyB,EAAI,CAC3D,IAAKA,EAAM,WAAW,GACvB,EACD,MACD,CAID,GAAIA,EAAM,WAAW,YAAcL,EAAc,CAG/C,GAFsB,CAAC,aAAc,iBAAkB,iBAAiB,EAEtD,QAAQK,EAAM,WAAW,MAAM,IAAM,GAAI,CACzD,KAAK,QAAQ,OAAQ,CACnB,QAAS,0CAC7B,CAAmB,EACD,MAClB,CAQgB,GANIA,EAAM,WAAW,SAAW,mBAC9B,KAAK,QAAQ,OAAQ,CACnB,QAAS,kEAC7B,CAAmB,EAGCA,EAAM,WAAW,IAAI,UAAU,EAAG,EAAE,IAAM,0BAA2B,CACvE,KAAK,QAAQ,OAAQ,CACnB,QAAS,uCAC7B,CAAmB,EACD,MAClB,CAEgB,GAAI,EAAEA,EAAM,WAAW,OAASA,EAAM,WAAW,MAAM,UAAU,EAAG,CAAC,IAAM,MAAO,CAChF,KAAK,QAAQ,OAAQ,CACnB,QAAS,sCAC7B,CAAmB,EACD,MACD,CAID,KAAK,SAAS,kBAAoB,KAAK,SAAS,mBAAqB,CAAE,EACvE,KAAK,SAAS,kBAAkB,oBAAoB,EAAI,CACtD,WAAY,CACV,YAAaA,EAAM,WAAW,UAE9B,MAAOA,EAAM,WAAW,MAAM,UAAU,CAAC,CAC1C,EAED,KAAMzD,GAAsByD,EAAM,WAAW,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC,CAC/D,EACD,MAChB,CAEmBA,EAAM,WAAW,QACpB,KAAK,QAAQ,OAAQ,CACnB,QAAS,kCAC3B,CAAiB,EAIH9T,EAAM,CACJ,OAAQ8T,EAAM,WAAW,QAAU,UACnC,IAAKA,EAAM,WAAW,GACvB,EAEG,OAAOA,EAAM,WAAW,GAAO,MACjC9T,EAAI,GAAK8T,EAAM,WAAW,GAE7B,EAED,kBAAmB,CACjB,GAAI,CAAC,SAASA,EAAM,MAAM,EAAG,CAC3B,KAAK,QAAQ,OAAQ,CACnB,QAAS,oCAAsCA,EAAM,MACvE,CAAiB,EACD,MAChB,CAEc,KAAK,SAAS,cAAgBA,EAAM,MACrC,EAED,0BAA2B,CACzB,GAAI,CAAC,SAASA,EAAM,MAAM,EAAG,CAC3B,KAAK,QAAQ,OAAQ,CACnB,QAAS,4CAA8CA,EAAM,MAC/E,CAAiB,EACD,MAChB,CAEc,KAAK,SAAS,sBAAwBA,EAAM,OAC5CJ,EAAkBI,EAAM,MACzB,EAED,iBAAkB,CAChB,GAAI,CAAC,YAAY,KAAKA,EAAM,YAAY,EAAG,CACzC,KAAK,QAAQ,OAAQ,CACnB,QAAS,mCAAqCA,EAAM,QACtE,CAAiB,EACD,MAChB,CAEc,KAAK,SAAS,aAAeA,EAAM,YACpC,EAED,KAAM,CACJR,EAAa,CAAE,EAEXQ,EAAM,MACRR,EAAW,IAAMQ,EAAM,KAGrBA,EAAM,YACRR,EAAW,UAAYQ,EAAM,WAG3B9T,IACFsT,EAAW,IAAMtT,EAEpB,EAED,cAAe,CAIb,GAHA,KAAK,SAAS,UAAYoT,EAC1B,KAAK,SAAS,YAAc,KAAK,SAAS,aAAeI,EAErD,CAACM,EAAM,WAAY,CACrB,KAAK,QAAQ,OAAQ,CACnB,QAAS,sCAC3B,CAAiB,EACD,MAChB,CAEmBT,EAAW,aACdA,EAAW,WAAa,CAAE,GAG5BxX,GAASwX,EAAW,WAAYS,EAAM,UAAU,CACjD,EAED,OAAQ,CAGN,GAFA,KAAK,SAAS,YAAc,KAAK,SAAS,aAAeN,EAErD,EAAEM,EAAM,YAAcA,EAAM,WAAW,MAAQA,EAAM,WAAW,UAAU,GAAKA,EAAM,WAAW,MAAO,CACzG,KAAK,QAAQ,OAAQ,CACnB,QAAS,4CAC3B,CAAiB,EACD,MACD,CAGD,MAAMI,EAAiB,KAAK,SAAS,YAAYJ,EAAM,WAAW,IAAI,EACtEI,EAAeJ,EAAM,WAAW,UAAU,CAAC,EAAII,EAAeJ,EAAM,WAAW,UAAU,CAAC,GAAK,CAAE,EACjGC,EAAaG,EAAeJ,EAAM,WAAW,UAAU,CAAC,EAExDE,EAAY,CACV,QAAS,OAAO,KAAKF,EAAM,WAAW,OAAO,CAC9C,EAEGE,EAAU,QACZA,EAAU,WAAa,GAEvBA,EAAU,WAAa,OAAO,KAAKF,EAAM,WAAW,UAAU,EAG5DA,EAAM,WAAW,WACnBE,EAAU,SAAWF,EAAM,WAAW,UAGpCA,EAAM,WAAW,MACnBE,EAAU,IAAMF,EAAM,WAAW,KAG/BA,EAAM,WAAW,aAAa,IAChCE,EAAU,WAAaF,EAAM,WAAW,aAAa,GAGnDA,EAAM,WAAW,kBACnBE,EAAU,gBAAkBF,EAAM,WAAW,iBAG3CA,EAAM,WAAW,SACnBE,EAAU,OAAS,OAAO,KAAKF,EAAM,WAAW,MAAM,GAIxDC,EAAWD,EAAM,WAAW,IAAI,EAAIE,CACrC,EAED,eAAgB,CACdN,GAAmB,EACnBL,EAAW,cAAgB,GAC3B,KAAK,SAAS,oBAAoB,KAAKD,EAAK,MAAM,CACnD,EAED,qBAAsB,CAChB,OAAO,KAAK,SAAS,eAAmB,MAK1C,KAAK,SAAS,eAAiBU,EAAM,eACrC,KAAK,SAAS,eAAiBA,EAAM,gBAGvCT,EAAW,eAAiBS,EAAM,eAClCT,EAAW,eAAiBS,EAAM,eAClC,KAAM,CACJ,oBAAAK,CAChB,EAAkB,KACJ,KAAK,oBAAsB,IAAI,KAAKL,EAAM,cAAc,EAAE,UAGtDK,IAAwB,MAI1B,KAAK,SAAS,SAAS,YAAY,CAACC,EAAiBjC,KACnDA,EAAQ,gBAAkBiC,EAAkBjC,EAAQ,SAAW,IACxDA,EAAQ,iBACd,KAAK,mBAAmB,CAE9B,EAED,gBAAiB,CACf,GAAI,CAAC,SAAS2B,EAAM,QAAQ,GAAKA,EAAM,SAAW,EAAG,CACnD,KAAK,QAAQ,OAAQ,CACnB,QAAS,qCAAuCA,EAAM,QACxE,CAAiB,EACD,MAChB,CAEc,KAAK,SAAS,eAAiBA,EAAM,SACrCrB,GAAY,KAAK,KAAM,KAAK,QAAQ,CACrC,EAED,OAAQ,CACN,GAAI,CAACqB,EAAM,YAAc,MAAMA,EAAM,WAAW,aAAa,CAAC,EAAG,CAC/D,KAAK,QAAQ,OAAQ,CACnB,QAAS,+DAC3B,CAAiB,EACD,MAChB,CAEc,KAAK,SAAS,MAAQ,CACpB,WAAYA,EAAM,WAAW,aAAa,EAC1C,QAASA,EAAM,WAAW,OAC3B,CACF,EAED,WAAY,CACVT,EAAW,OAASS,EAAM,IAC3B,EAED,gBAAiB,CACfT,EAAW,WAAaS,EAAM,IAC/B,EAED,UAAW,CACTT,EAAW,MAAQS,EAAM,IAC1B,EAED,MAAS,CACP,KAAK,SAAS,KAAOtB,GAAcsB,EAAM,UAAU,EACnD,KAAK,yBAAyB,cAAeA,EAAM,WAAY,CAAC,kBAAkB,CAAC,CACpF,EAED,MAAS,CACPP,EAAW,GAEX,MAAMc,EAAe,KAAK,SAAS,SAAS,OACtCC,EAAO9B,GAAcsB,EAAM,UAAU,EAC3CT,EAAW,MAAQA,EAAW,OAAS,CAAE,EACzCA,EAAW,MAAM,KAAKiB,CAAI,EAEtBA,EAAK,YACFA,EAAK,UAAU,eAAe,QAAQ,IACzCA,EAAK,UAAU,OAASV,GAG1BA,EAAuBU,EAAK,UAAU,OAASA,EAAK,UAAU,QAGhE,MAAMC,EAAYlB,EAAW,MAAM,OAAS,EAC5C,KAAK,yBAAyB,gBAAgBkB,CAAS,iBAAiBF,CAAY,GAAIP,EAAM,WAAY,CAAC,MAAO,UAAU,CAAC,EAEzH,KAAK,SAAS,kBAChB,KAAK,SAAS,iBAAiB,QAAQ,CAAC/X,EAAGW,IAAM,CAC1CX,EAAE,eAAe,UAAU,GAC9B,KAAK,QAAQ,OAAQ,CACnB,QAAS,4BAA4BW,CAAC,yCAC5D,CAAqB,CAErB,CAAiB,CAEJ,EAED,kBAAmB,CACjB,MAAMwU,EAAQ,KAAK,SAAS,cAAgBsB,GAAcsB,EAAM,UAAU,EAErE5C,EAAM,eAAe,gBAAgB,IACxCA,EAAM,eAAiB,GACvB,KAAK,QAAQ,OAAQ,CACnB,QAAS,4DAC3B,CAAiB,GAGHuB,GAAY,KAAK,KAAM,KAAK,QAAQ,EAEhCvB,EAAM,mBAAqB,CAACA,EAAM,eAAe,cAAc,GACjE,KAAK,QAAQ,OAAQ,CACnB,QAAS,iHAC3B,CAAiB,CAEJ,EAED,gBAAiB,CAEf,MAAMmD,EAAe,KAAK,SAAS,SAAS,OACtCG,EAAOhC,GAAcsB,EAAM,UAAU,EACrCW,EAASD,EAAK,MAAQA,EAAK,OAAS,OAC1CnB,EAAW,aAAeA,EAAW,cAAgB,CAAE,EACvDA,EAAW,aAAa,KAAKmB,CAAI,EAE7BA,EAAK,YACFA,EAAK,UAAU,eAAe,QAAQ,IAEzCA,EAAK,UAAU,OAASC,EAASb,EAAuB,EAEpDa,IACFb,EAAuBY,EAAK,UAAU,OAASA,EAAK,UAAU,UAKpE,MAAMzU,EAAQsT,EAAW,aAAa,OAAS,EAG/C,GAFA,KAAK,yBAAyB,wBAAwBtT,CAAK,iBAAiBsU,CAAY,GAAIP,EAAM,WAAY,CAAC,OAAQ,KAAK,CAAC,EAEzH,EAACU,EAAK,KAMV,QAAS9X,EAAI,EAAGA,EAAI2W,EAAW,aAAa,OAAS,EAAG3W,IAAK,CAC3D,MAAMgY,EAAYrB,EAAW,aAAa3W,CAAC,EAEtCgY,EAAU,MAIXA,EAAU,OAASF,EAAK,MAC1B,KAAK,QAAQ,OAAQ,CACnB,QAAS,wBAAwBzU,CAAK,iBAAiBsU,CAAY,sBAAsBG,EAAK,IAAI,qBAAqB9X,CAAC,EAC5I,CAAmB,CAEnB,CACa,EAED,oBAAqB,CACnB,MAAMiY,EAASnC,GAAcsB,EAAM,UAAU,EAC7C,KAAK,SAAS,iBAAmB,KAAK,SAAS,kBAAoB,CAAE,EACrE,KAAK,SAAS,iBAAiB,KAAKa,CAAM,EAC1C,MAAM5U,EAAQ,KAAK,SAAS,iBAAiB,OAAS,EAChD6U,EAAW,CAAC,WAAY,KAAK,EAE/BrB,GACFqB,EAAS,KAAK,WAAW,EAG3B,KAAK,yBAAyB,4BAA4B7U,CAAK,GAAI+T,EAAM,WAAYc,CAAQ,CAC9F,EAED,YAAa,CACX,KAAK,SAAS,QAAUpC,GAAcsB,EAAM,UAAU,EACtD,KAAK,yBAAyB,kBAAmBA,EAAM,WAAY,CAAC,aAAa,CAAC,EAE9E,KAAK,SAAS,QAAQ,aACxB,KAAK,SAAS,mBAAqB,KAAK,SAAS,QAAQ,YAG3DrB,GAAY,KAAK,KAAM,KAAK,QAAQ,CACrC,EAED,WAAc,CACZ,KAAK,SAAS,WAAW,KAAKD,GAAcsB,EAAM,UAAU,CAAC,EAC7D,MAAM/T,EAAQ,KAAK,SAAS,WAAW,OAAS,EAChD,KAAK,yBAAyB,qBAAqBA,CAAK,GAAI+T,EAAM,WAAY,CAAC,KAAM,YAAY,CAAC,EAClG,MAAMe,EAAY,KAAK,SAAS,WAAW9U,CAAK,EAE5C8U,EAAU,SAAWA,EAAU,WAAa,IAAI,KAAKA,EAAU,OAAO,EAAI,IAAI,KAAKA,EAAU,SAAS,GACxG,KAAK,QAAQ,OAAQ,CACnB,QAAS,qFAC3B,CAAiB,EAGCA,EAAU,UAAYA,EAAU,SAAW,GAC7C,KAAK,QAAQ,OAAQ,CACnB,QAAS,+CAC3B,CAAiB,EAGCA,EAAU,iBAAmBA,EAAU,gBAAkB,GAC3D,KAAK,QAAQ,OAAQ,CACnB,QAAS,uDAC3B,CAAiB,EAGH,MAAMC,EAAe,CAAC,CAACD,EAAU,UAcjC,GAZIC,GAAgB,CAACD,EAAU,OAC7B,KAAK,QAAQ,OAAQ,CACnB,QAAS,+EAC3B,CAAiB,EAGCC,IAAiBD,EAAU,UAAYA,EAAU,UACnD,KAAK,QAAQ,OAAQ,CACnB,QAAS,oGAC3B,CAAiB,EAGCA,EAAU,UAAYA,EAAU,QAAS,CAE3C,MAAME,EADYF,EAAU,UACO,QAAS,EAAGA,EAAU,SAAW,IACpE,KAAK,SAAS,WAAW9U,CAAK,EAAE,QAAU,IAAI,KAAKgV,CAAgB,CACnF,CAEc,GAAI,CAAClB,EAAcgB,EAAU,EAAE,EAC7BhB,EAAcgB,EAAU,EAAE,EAAIA,MACzB,CACL,UAAWG,KAAanB,EAAcgB,EAAU,EAAE,EAChD,GAAMA,EAAUG,CAAS,GAAK,KAAK,UAAUnB,EAAcgB,EAAU,EAAE,EAAEG,CAAS,CAAC,IAAM,KAAK,UAAUH,EAAUG,CAAS,CAAC,EAAG,CAC7H,KAAK,QAAQ,OAAQ,CACnB,QAAS,0FAC/B,CAAqB,EACD,KACpB,CAIgB,MAAMC,EAAsB,KAAK,SAAS,WAAW,UAAUC,GAAmBA,EAAgB,KAAOL,EAAU,EAAE,EACrH,KAAK,SAAS,WAAWI,CAAmB,EAAIpZ,GAAS,KAAK,SAAS,WAAWoZ,CAAmB,EAAGJ,CAAS,EACjHhB,EAAcgB,EAAU,EAAE,EAAIhZ,GAASgY,EAAcgB,EAAU,EAAE,EAAGA,CAAS,EAE7E,KAAK,SAAS,WAAW,IAAK,CAC9C,CACa,EAED,wBAAyB,CACvB,KAAK,SAAS,oBAAsB,EACrC,EAED,oBAAqB,CACnB,KAAK,SAAS,gBAAkBrC,GAAcsB,EAAM,UAAU,EAC9D,KAAK,yBAAyB,0BAA2BA,EAAM,WAAY,CAAC,YAAY,CAAC,CACvG,CAEW,EAAEA,EAAM,OAAO,GAAK5T,GAAM,KAAKoK,CAAI,CACrC,EAED,KAAM,CACJ+I,EAAW,IAAMS,EAAM,IACvBV,EAAK,KAAKC,CAAU,EAEhB,KAAK,SAAS,gBAAkB,EAAE,aAAcA,KAClD,KAAK,QAAQ,OAAQ,CACnB,QAAS,oDACvB,CAAa,EACDA,EAAW,SAAW,KAAK,SAAS,gBAIlCrT,IACFqT,EAAW,IAAMrT,GAGnBqT,EAAW,SAAWK,EAElBJ,IACFD,EAAW,IAAMC,GAInBM,EAAuB,EAEnB,KAAK,sBAAwB,OAC/BP,EAAW,gBAAkB,KAAK,oBAClC,KAAK,qBAAuBA,EAAW,SAAW,KAIpDA,EAAa,CAAE,CAChB,EAED,SAAU,CACT,EAED,QAAS,CAEHS,EAAM,SACRT,EAAW,OAASA,EAAW,QAAU,CAAE,EAC3CA,EAAW,OAAOS,EAAM,UAAU,EAAIA,EAAM,OAE5C,KAAK,SAAS,OAAS,KAAK,SAAS,QAAU,CAAE,EACjD,KAAK,SAAS,OAAOA,EAAM,UAAU,EAAIA,EAAM,KAE3D,CAEO,GAAEA,EAAM,IAAI,EAAE,KAAKxJ,CAAI,CAC9B,CAAK,CACL,CAEE,yBAAyB6K,EAAYlE,EAAY2D,EAAU,CACzD,MAAMQ,EAAU,CAAE,EAClBR,EAAS,QAAQ,SAAU5U,EAAK,CACzBiR,EAAW,eAAejR,CAAG,GAChCoV,EAAQ,KAAKpV,CAAG,CAExB,CAAK,EAEGoV,EAAQ,QACV,KAAK,QAAQ,OAAQ,CACnB,QAAS,GAAGD,CAAU,iCAAiCC,EAAQ,KAAK,IAAI,CAAC,EACjF,CAAO,CAEP,CAQE,KAAKC,EAAO,CACV,KAAK,WAAW,KAAKA,CAAK,CAC9B,CAQE,KAAM,CAEJ,KAAK,WAAW,KAAK;AAAA,CAAI,EAErB,KAAK,SAAS,WAAW,QAAU,KAAK,sBAAwB,MAClE,KAAK,QAAQ,OAAQ,CACnB,QAAS,0FACjB,CAAO,EAGH,KAAK,oBAAsB,KAC3B,KAAK,QAAQ,KAAK,CACtB,CAYE,UAAUpX,EAAS,CACjB,KAAK,YAAY,UAAUA,CAAO,CACtC,CAUE,aAAaA,EAAS,CACpB,KAAK,YAAY,aAAaA,CAAO,CACzC,CAEA,CChpDA,IAAIqX,GAAS,CAEX,IAAK,oEACL,KAAM,gCACN,IAAK,sCAEL,MAAO,sDACP,MAAO,2DACP,KAAM,oBAEN,WAAY,YACZ,WAAY,UAIZ,UAAW,IACb,EACIC,GAAa,CAAC,QAAS,QAAS,MAAM,EACtCC,GAAkB,CAAC,QAAS,QAAS,MAAM,EAWpCC,GAAuB,SAA8BC,EAAO,CACrE,OAAKA,GAIEA,EAAM,QAAQ,sBAAuB,SAAUC,EAAMC,EAASC,EAAU,CAC7E,IAAIC,GAAc,KAAO,OAAOF,CAAO,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,EAC3DG,GAAe,KAAO,OAAOF,CAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,EACjE,MAAO,QAAUC,EAAa,KAAOC,CACzC,CAAG,CACH,EAqDWC,GAAc,SAAqBC,EAAa,CACrDA,IAAgB,SAClBA,EAAc,IAGhB,IAAIC,EAASD,EAAY,MAAM,GAAG,EAC9BpW,EAAS,CAAE,EACf,OAAAqW,EAAO,QAAQ,SAAUR,EAAO,CAC9BA,EAAQA,EAAM,KAAM,EACpB,IAAIS,EACJZ,GAAW,QAAQ,SAAUnQ,EAAM,CACjC,IAAIyL,EAAQyE,GAAOlQ,CAAI,EAAE,KAAKsQ,EAAM,aAAa,EAEjD,GAAI,GAAC7E,GAASA,EAAM,QAAU,GAI9B,CAAAsF,EAAY/Q,EAEZ,IAAIlI,EAAOwY,EAAM,UAAU,EAAG7E,EAAM,CAAC,EAAE,MAAM,EACzCuF,EAAUV,EAAM,QAAQxY,EAAM,EAAE,EACpC2C,EAAO,KAAK,CACV,KAAM3C,EACN,QAASkZ,EACT,UAAWhR,CACnB,CAAO,EACP,CAAK,EAEI+Q,GACHtW,EAAO,KAAK,CACV,KAAM6V,EACN,QAAS,GACT,UAAW,SACnB,CAAO,CAEP,CAAG,EACM7V,CACT,EAaWwW,GAAoB,SAA2BC,EAAQC,EAAc,CAC9E,GAAI,CAACD,EAAO,YAAY,OAAS,CAACC,EAChC,OAAO,KAGT,IAAIC,EAAaF,EAAO,YAAY,MAAMC,CAAY,EAEtD,GAAI,CAACC,EACH,OAAO,KAGT,QAASpR,KAAQoR,EAAY,CAC3B,IAAIC,EAAYD,EAAWpR,CAAI,EAE/B,GAAIqR,EAAU,SAAWA,EAAU,UAEjC,OAAOT,GAAYS,EAAU,UAAU,CAAC,EAAE,WAAW,MAAM,CAEjE,CAEE,OAAO,IACT,EAQWC,GAAe,SAAsBhB,EAAO,CACrD,OAAIA,IAAU,SACZA,EAAQ,IAGHJ,GAAO,MAAM,KAAKI,EAAM,KAAI,EAAG,aAAa,CACrD,EACWiB,GAAc,SAAqBjB,EAAO,CACnD,OAAIA,IAAU,SACZA,EAAQ,IAGHJ,GAAO,KAAK,KAAKI,EAAM,KAAI,EAAG,aAAa,CACpD,EACWkB,GAAkB,SAAyBX,EAAa,CACjE,GAAI,GAACA,GAAe,OAAOA,GAAgB,UAI3C,KAAIC,EAASD,EAAY,YAAa,EAAC,MAAM,GAAG,EAAE,IAAI,SAAUY,EAAG,CACjE,OAAOpB,GAAqBoB,EAAE,MAAM,CACxC,CAAG,EAEG3Z,EAAO,QAGPgZ,EAAO,SAAW,GAAKQ,GAAaR,EAAO,CAAC,CAAC,EAC/ChZ,EAAO,QACEgZ,EAAO,SAAW,GAAKS,GAAYT,EAAO,CAAC,CAAC,IAErDhZ,EAAO,eAIT,IAAI+K,EAAY,MAGhB,OAAIiO,EAAO,MAAM,SAAUW,EAAG,CAC5B,OAAOvB,GAAO,IAAI,KAAKuB,CAAC,CAC5B,CAAG,EACC5O,EAAY,MACHiO,EAAO,MAAM,SAAUW,EAAG,CACnC,OAAOvB,GAAO,KAAK,KAAKuB,CAAC,CAC7B,CAAG,EACC5O,EAAY,OACHiO,EAAO,MAAM,SAAUW,EAAG,CACnC,OAAOvB,GAAO,IAAI,KAAKuB,CAAC,CAC5B,CAAG,IACC5O,EAAY,OAGP/K,EAAO,IAAM+K,EAAY,YAAegO,EAAc,IAC/D,EACWa,GAAuB,SAA8Bb,EAAa,CAC3E,OAAIA,IAAgB,SAClBA,EAAc,IAGT1X,EAAO,aAAeA,EAAO,YAAY,iBAAmBA,EAAO,YAAY,gBAAgBqY,GAAgBX,CAAW,CAAC,GAAK,EACzI,EACWc,GAAqB,SAA4Bd,EAAa,CACvE,OAAIA,IAAgB,SAClBA,EAAc,IAGTA,EAAY,cAAc,MAAM,GAAG,EAAE,MAAM,SAAUP,EAAO,CACjEA,EAAQA,EAAM,OAEd,QAAShZ,EAAI,EAAGA,EAAI8Y,GAAgB,OAAQ9Y,IAAK,CAC/C,IAAIQ,EAAOsY,GAAgB9Y,CAAC,EAE5B,GAAI4Y,GAAO,QAAUpY,CAAI,EAAE,KAAKwY,CAAK,EACnC,MAAO,EAEf,CAEI,MAAO,EACX,CAAG,CACH,EACWsB,GAAsB,YACtBC,GAAsB,cC5P7BC,GAAgB,yDAChBC,GAAa,2BAaNC,GAA2B,SAAkCla,EAAM,CAC5E,OAAIga,GAAc,KAAKha,CAAI,EAClB,MAGLia,GAAW,KAAKja,CAAI,EACf,OAULA,IAAS,mCACJ,WAGF,IACT,ECpBWma,GAAY,SAAmBnP,EAAG,CAC3C,OAAOA,EAAE,SAAS,CAAC,EAAE,MACvB,EAEWoP,GAAa,SAAoBpP,EAAG,CAC7C,OAAO,KAAK,KAAKmP,GAAUnP,CAAC,EAAI,CAAC,CACnC,EAQWqP,GAAoB,SAA2B/b,EAAK,CAC7D,OAAI,YAAY,SAAW,WAClB,YAAY,OAAOA,CAAG,EAGxBA,GAAOA,EAAI,kBAAkB,WACtC,EACWgc,GAAe,SAAsBhc,EAAK,CACnD,OAAO+b,GAAkB/b,CAAG,CAC9B,EACWic,EAAU,SAAiBC,EAAO,CAC3C,OAAIA,aAAiB,WACZA,GAGL,CAAC,MAAM,QAAQA,CAAK,GAAK,CAACF,GAAaE,CAAK,GAAK,EAAEA,aAAiB,eAGlE,OAAOA,GAAU,UAAY,OAAOA,GAAU,UAAYA,IAAUA,EACtEA,EAAQ,EAERA,EAAQ,CAACA,CAAK,GAIX,IAAI,WAAWA,GAASA,EAAM,QAAUA,EAAOA,GAASA,EAAM,YAAc,EAAGA,GAASA,EAAM,YAAc,CAAC,EACtH,EAqBIC,GAASpZ,EAAO,QAAU,OAC1BqZ,GAAa,CAACD,GAAO,KAAK,EAAGA,GAAO,OAAO,EAAGA,GAAO,SAAS,EAAGA,GAAO,WAAW,EAAGA,GAAO,aAAa,EAAGA,GAAO,eAAe,EAAGA,GAAO,iBAAiB,EAAGA,GAAO,mBAAmB,EAAGA,GAAO,qBAAqB,CAAC,GACvM,UAAY,CAClC,IAAIvU,EAAI,IAAI,YAAY,CAAC,KAAM,CAAC,EAC5BwF,EAAI,IAAI,WAAWxF,EAAE,OAAQA,EAAE,WAAYA,EAAE,UAAU,EAE3D,OAAIwF,EAAE,CAAC,IAAM,IACJ,MAGLA,EAAE,CAAC,IAAM,IACJ,SAGF,SACT,GAAC,EAGM,IAAIiP,GAAgB,SAAuBH,EAAO5Z,EAAO,CAC9D,IAAIC,EAAOD,IAAU,OAAS,CAAE,EAAGA,EAC/Bga,EAAc/Z,EAAK,OACnBga,EAASD,IAAgB,OAAS,GAAQA,EAC1CE,EAAUja,EAAK,GACfka,EAAKD,IAAY,OAAS,GAAQA,EAEtCN,EAAQD,EAAQC,CAAK,EACrB,IAAIvb,EAAK8b,EAAK,SAAW,cACrBzc,EAAMkc,EAAMvb,CAAE,EAAIub,EAAMvb,CAAE,EAAI,MAAM,UAAUA,CAAE,EAChD+b,EAAS1c,EAAI,KAAKkc,EAAO,SAAUS,EAAOC,EAAM1b,EAAG,CACrD,IAAI2b,EAAWJ,EAAKvb,EAAI,KAAK,IAAIA,EAAI,EAAIgb,EAAM,MAAM,EACrD,OAAOS,EAAQR,GAAOS,CAAI,EAAIR,GAAWS,CAAQ,CACrD,EAAKV,GAAO,CAAC,CAAC,EAEZ,GAAII,EAAQ,CACV,IAAIO,EAAMV,GAAWF,EAAM,MAAM,EAAIC,GAAO,CAAC,EAAIA,GAAO,CAAC,EACzDO,EAASP,GAAOO,CAAM,EAElBA,EAASI,IACXJ,GAAUI,EACVJ,GAAUI,EACVJ,GAAUP,GAAO,CAAC,EAExB,CAEE,OAAO,OAAOO,CAAM,CACtB,EACWK,GAAgB,SAAuBL,EAAQM,EAAQ,CAChE,IAAIC,EAA4B,CAAA,EAC5BC,EAAWD,EAAM,GACjBR,EAAKS,IAAa,OAAS,GAAQA,GAGnC,OAAOR,GAAW,UAAY,OAAOA,GAAW,UAAY,OAAOA,GAAW,UAAYA,IAAWA,KACvGA,EAAS,GAGXA,EAASP,GAAOO,CAAM,EAItB,QAHIS,EAAYrB,GAAWY,CAAM,EAC7BR,EAAQ,IAAI,WAAW,IAAI,YAAYiB,CAAS,CAAC,EAE5Cjc,EAAI,EAAGA,EAAIic,EAAWjc,IAAK,CAClC,IAAIkc,EAAYX,EAAKvb,EAAI,KAAK,IAAIA,EAAI,EAAIgb,EAAM,MAAM,EACtDA,EAAMkB,CAAS,EAAI,OAAOV,EAASN,GAAWlb,CAAC,EAAIib,GAAO,GAAI,CAAC,EAE3DO,EAAS,IACXR,EAAMkB,CAAS,EAAI,KAAK,IAAI,CAAClB,EAAMkB,CAAS,CAAC,EAC7ClB,EAAMkB,CAAS,GAAKlc,IAAM,EAAI,EAAI,EAExC,CAEE,OAAOgb,CACT,EAmBWmB,GAAgB,SAAuBzc,EAAQ0c,EAAe,CAKvE,GAJI,OAAO1c,GAAW,UAAYA,GAAU,OAAOA,EAAO,UAAa,aACrEA,EAASA,EAAO,SAAU,GAGxB,OAAOA,GAAW,SACpB,OAAO,IAAI,WAMR0c,IACH1c,EAAS,SAAS,mBAAmBA,CAAM,CAAC,GAK9C,QAFI2c,EAAO,IAAI,WAAW3c,EAAO,MAAM,EAE9BM,EAAI,EAAGA,EAAIN,EAAO,OAAQM,IACjCqc,EAAKrc,CAAC,EAAIN,EAAO,WAAWM,CAAC,EAG/B,OAAOqc,CACT,EACWC,GAAoB,UAA6B,CAC1D,QAASC,EAAO,UAAU,OAAQC,EAAU,IAAI,MAAMD,CAAI,EAAGE,EAAO,EAAGA,EAAOF,EAAME,IAClFD,EAAQC,CAAI,EAAI,UAAUA,CAAI,EAOhC,GAJAD,EAAUA,EAAQ,OAAO,SAAUtQ,EAAG,CACpC,OAAOA,IAAMA,EAAE,YAAcA,EAAE,SAAW,OAAOA,GAAM,QAC3D,CAAG,EAEGsQ,EAAQ,QAAU,EAGpB,OAAOzB,EAAQyB,EAAQ,CAAC,CAAC,EAG3B,IAAIE,EAAWF,EAAQ,OAAO,SAAUf,EAAOkB,EAAK3c,EAAG,CACrD,OAAOyb,GAASkB,EAAI,YAAcA,EAAI,OACvC,EAAE,CAAC,EACAC,EAAa,IAAI,WAAWF,CAAQ,EACpCG,EAAS,EACb,OAAAL,EAAQ,QAAQ,SAAUG,EAAK,CAC7BA,EAAM5B,EAAQ4B,CAAG,EACjBC,EAAW,IAAID,EAAKE,CAAM,EAC1BA,GAAUF,EAAI,UAClB,CAAG,EACMC,CACT,EAwBWE,GAAa,SAAoBpW,EAAGwF,EAAG6Q,EAAQ,CACxD,IAAIC,EAAQD,IAAW,OAAS,CAAE,EAAGA,EACjCE,EAAeD,EAAM,OACrBH,EAASI,IAAiB,OAAS,EAAIA,EACvCC,EAAaF,EAAM,KACnBG,EAAOD,IAAe,OAAS,CAAA,EAAKA,EAExCxW,EAAIqU,EAAQrU,CAAC,EACbwF,EAAI6O,EAAQ7O,CAAC,EAEb,IAAIzM,EAAKyM,EAAE,MAAQA,EAAE,MAAQ,MAAM,UAAU,MAC7C,OAAOA,EAAE,QAAUxF,EAAE,OAASmW,GAAU3Q,EAAE,QAC1CzM,EAAG,KAAKyM,EAAG,SAAUkR,EAAOpd,EAAG,CAC7B,IAAIqd,EAAQF,EAAKnd,CAAC,EAAImd,EAAKnd,CAAC,EAAI0G,EAAEmW,EAAS7c,CAAC,EAAI0G,EAAEmW,EAAS7c,CAAC,EAC5D,OAAOod,IAAUC,CACrB,CAAG,CACH,ECrPWC,GAAoB,SAA2B1D,EAAQ9S,EAAQ/E,EAAU,CAClF+E,EAAO,QAAQ,SAAUyW,EAAW,CAClC,QAASC,KAAY5D,EAAO,YAAY2D,CAAS,EAC/C,QAASE,KAAY7D,EAAO,YAAY2D,CAAS,EAAEC,CAAQ,EAAG,CAC5D,IAAIE,EAAkB9D,EAAO,YAAY2D,CAAS,EAAEC,CAAQ,EAAEC,CAAQ,EACtE1b,EAAS2b,EAAiBH,EAAWC,EAAUC,CAAQ,CAC/D,CAEA,CAAG,CACH,EClBI/J,GAAO,SAAcvN,EAAG,CAC1B,OAAOtE,EAAO,KAAOA,EAAO,KAAKsE,CAAC,EAAI,OAAO,KAAKA,EAAG,QAAQ,EAAE,SAAS,QAAQ,CAClF,EAEe,SAASwN,GAAsBC,EAAS,CAIrD,QAHIC,EAAgBH,GAAKE,CAAO,EAC5B9P,EAAQ,IAAI,WAAW+P,EAAc,MAAM,EAEtC7T,EAAI,EAAGA,EAAI6T,EAAc,OAAQ7T,IACxC8D,EAAM9D,CAAC,EAAI6T,EAAc,WAAW7T,CAAC,EAGvC,OAAO8D,CACT,iBCEA,SAAS6Z,GAAKC,EAAMC,EAAWC,EAAI,CAIlC,GAHIA,IAAO,SACVA,EAAK,MAAM,WAERF,GAAQ,OAAOE,EAAG,MAAS,WAC9B,OAAOA,EAAG,KAAK,KAAKF,EAAMC,CAAS,EAEpC,QAAS7d,EAAI,EAAGA,EAAI4d,EAAK,OAAQ5d,IAChC,GAAI,OAAO,UAAU,eAAe,KAAK4d,EAAM5d,CAAC,EAAG,CAClD,IAAI+d,EAAOH,EAAK5d,CAAC,EACjB,GAAI6d,EAAU,KAAK,OAAWE,EAAM/d,EAAG4d,CAAI,EAC1C,OAAOG,CAEX,CAEA,CAiBA,SAASC,GAAOC,EAAQC,EAAI,CAC3B,OAAIA,IAAO,SACVA,EAAK,QAECA,GAAM,OAAOA,EAAG,QAAW,WAAaA,EAAG,OAAOD,CAAM,EAAIA,CACpE,CAeA,SAASE,GAAOC,EAAQC,EAAQ,CAC/B,GAAID,IAAW,MAAQ,OAAOA,GAAW,SACxC,MAAM,IAAI,UAAU,yBAAyB,EAE9C,QAAS9a,KAAO+a,EACX,OAAO,UAAU,eAAe,KAAKA,EAAQ/a,CAAG,IACnD8a,EAAO9a,CAAG,EAAI+a,EAAO/a,CAAG,GAG1B,OAAO8a,CACR,CASA,IAAIE,GAAYN,GAAO,CAUtB,KAAM,YAYN,OAAQ,SAAUvb,EAAO,CACxB,OAAOA,IAAU6b,GAAU,IAC3B,EASD,gBAAiB,kBASjB,SAAU,WAUV,sBAAuB,wBASvB,cAAe,eAChB,CAAC,EAOGC,GAAYP,GAAO,CAMtB,KAAM,+BASN,OAAQ,SAAUra,EAAK,CACtB,OAAOA,IAAQ4a,GAAU,IACzB,EAOD,IAAK,6BAOL,IAAK,uCAOL,MAAO,+BACR,CAAC,EAEaC,GAAA,OAAGL,GACLK,GAAA,KAAGb,GACDa,GAAA,OAAGR,GACAQ,GAAA,UAAGF,GACpBE,GAAA,UAAoBD,GC1MpB,IAAIC,GAAc/f,GAEdkf,GAAOa,GAAY,KACnBD,GAAYC,GAAY,UAO5B,SAASC,GAAgB1Y,EAAO,CAC/B,OAAOA,IAAU,EAClB,CAQA,SAAS2Y,GAAuB3Y,EAAO,CAEtC,OAAOA,EAAQA,EAAM,MAAM,cAAc,EAAE,OAAO0Y,EAAc,EAAI,CAAA,CACrE,CASA,SAASE,GAAmBtW,EAASC,EAAS,CAC7C,OAAKD,EAAQ,eAAeC,CAAO,IAClCD,EAAQC,CAAO,EAAI,IAEbD,CACR,CAOA,SAASuW,GAAa7Y,EAAO,CAC5B,GAAI,CAACA,EAAO,MAAO,CAAE,EACrB,IAAI6X,EAAOc,GAAuB3Y,CAAK,EACvC,OAAO,OAAO,KAAK6X,EAAK,OAAOe,GAAmB,CAAA,CAAE,CAAC,CACtD,CASA,SAASE,GAAejB,EAAM,CAC7B,OAAO,SAAStV,EAAS,CACxB,OAAOsV,GAAQA,EAAK,QAAQtV,CAAO,IAAM,EAC3C,CACA,CAEA,SAASwW,GAAKC,EAAIC,EAAK,CACtB,QAAQ1S,KAAKyS,EACR,OAAO,UAAU,eAAe,KAAKA,EAAKzS,CAAC,IAC9C0S,EAAK1S,CAAC,EAAIyS,EAAIzS,CAAC,EAGlB,CAMA,SAASnN,GAAS8f,EAAMC,EAAM,CAC7B,IAAIC,EAAKF,EAAM,UACf,GAAG,EAAEE,aAAcD,GAAO,CACzB,IAAStW,EAAT,UAAY,CACd,EAAEA,EAAE,UAAYsW,EAAM,UACpBtW,EAAI,IAAIA,EACRkW,GAAKK,EAAGvW,CAAC,EACTqW,EAAM,UAAYE,EAAKvW,CACzB,CACIuW,EAAG,aAAeF,IACjB,OAAOA,GAAS,YAClB,QAAQ,MAAM,iBAAiBA,CAAK,EAErCE,EAAG,YAAcF,EAEnB,CAGA,IAAIG,GAAW,CAAA,EACXC,GAA8BD,GAAS,aAA8B,EACrEE,GAA8BF,GAAS,eAA8B,EACrEG,GAA8BH,GAAS,UAA8B,EACrEI,GAA8BJ,GAAS,mBAA8B,EACrEK,GAA8BL,GAAS,sBAA8B,EACrEM,GAA8BN,GAAS,YAA8B,EACrEO,GAA8BP,GAAS,4BAA8B,EACrEQ,GAA8BR,GAAS,aAA8B,EACrES,GAA8BT,GAAS,cAA8B,EACrEU,GAA8BV,GAAS,mBAA8B,GACrEW,GAA8BX,GAAS,uBAA8B,GACrEY,GAA8BZ,GAAS,cAA8B,GAGrEa,GAAgB,CAAA,EAChBC,GAAmB,CAAE,EACSD,GAAc,gBAAgCC,GAAiB,CAAC,EAAE,mBAAoB,GACtFD,GAAc,oBAAgCC,GAAiB,CAAC,EAAE,uBAAwB,GAC5H,IAAIC,GAA8BF,GAAc,uBAAgCC,GAAiB,CAAC,EAAE,0BAA2B,GAC7FD,GAAc,oBAAgCC,GAAiB,CAAC,EAAE,iBAAkB,GACpFD,GAAc,uBAAgCC,GAAiB,CAAC,EAAE,oBAAqB,GACvFD,GAAc,qBAAgCC,GAAiB,CAAC,EAAE,kBAAmB,GACrFD,GAAc,6BAAgCC,GAAiB,CAAC,EAAE,0BAA2B,GAC/H,IAAIE,GAA8BH,GAAc,eAAgCC,GAAiB,CAAC,EAAE,YAAa,GAC/ED,GAAc,mBAAgCC,GAAiB,CAAC,EAAE,gBAAiB,GACrH,IAAIG,GAA8BJ,GAAc,qBAAgCC,GAAiB,EAAE,EAAE,mBAAoB,IAEzFD,GAAc,mBAA8BC,GAAiB,EAAE,EAAE,gBAAiB,IAClFD,GAAc,YAA8BC,GAAiB,EAAE,EAAE,eAAgB,IACjFD,GAAc,0BAA8BC,GAAiB,EAAE,EAAE,uBAAwB,IACzFD,GAAc,eAA6BC,GAAiB,EAAE,EAAE,oBAAqB,IACrFD,GAAc,oBAA6BC,GAAiB,EAAE,EAAE,iBAAkB,IAQlH,SAASI,GAAaC,EAAM1a,EAAS,CACpC,GAAGA,aAAmB,MACrB,IAAI5G,EAAQ4G,OAEZ5G,EAAQ,KACR,MAAM,KAAK,KAAMihB,GAAiBK,CAAI,CAAC,EACvC,KAAK,QAAUL,GAAiBK,CAAI,EACjC,MAAM,mBAAmB,MAAM,kBAAkB,KAAMD,EAAY,EAEvE,OAAArhB,EAAM,KAAOshB,EACV1a,IAAS,KAAK,QAAU,KAAK,QAAU,KAAOA,GAC1C5G,CACR,CACAqhB,GAAa,UAAY,MAAM,UAC/BxB,GAAKmB,GAAcK,EAAY,EAO/B,SAASE,IAAW,CACpB,CACAA,GAAS,UAAY,CAKpB,OAAO,EASP,KAAM,SAASnd,EAAO,CACrB,OAAOA,GAAS,GAAKA,EAAQ,KAAK,OAAS,KAAKA,CAAK,EAAI,IACzD,EACD,SAAS,SAASod,EAAOC,EAAW,CACnC,QAAQ/D,EAAM,CAAE,EAAE3c,EAAI,EAAEA,EAAE,KAAK,OAAOA,IACrC2gB,GAAkB,KAAK3gB,CAAC,EAAE2c,EAAI8D,EAAOC,CAAU,EAEhD,OAAO/D,EAAI,KAAK,EAAE,CAClB,EAMD,OAAQ,SAAUkB,EAAW,CAC5B,OAAO,MAAM,UAAU,OAAO,KAAK,KAAMA,CAAS,CAClD,EAMD,QAAS,SAAUE,EAAM,CACxB,OAAO,MAAM,UAAU,QAAQ,KAAK,KAAMA,CAAI,CAC9C,CACF,EAEA,SAAS6C,GAAa9X,EAAK+X,EAAQ,CAClC,KAAK,MAAQ/X,EACb,KAAK,SAAW+X,EAChBC,GAAgB,IAAI,CACrB,CACA,SAASA,GAAgBlD,EAAK,CAC7B,IAAImD,EAAMnD,EAAK,MAAM,MAAQA,EAAK,MAAM,cAAc,KACtD,GAAIA,EAAK,OAASmD,EAAK,CACtB,IAAIC,EAAKpD,EAAK,SAASA,EAAK,KAAK,EAEjC,GADAqD,GAAQrD,EAAK,SAASoD,EAAG,MAAM,EAC3B,CAACpD,EAAK,UAAYoD,EAAG,OAASpD,EAAK,SACtC,QAAS5d,EAAIghB,EAAG,OAAQhhB,KAAK4d,EAAM5d,IAC9B,OAAO,UAAU,eAAe,KAAK4d,EAAM5d,CAAC,GAC/C,OAAO4d,EAAK5d,CAAC,EAIhB8e,GAAKkC,EAAGpD,CAAI,EACZA,EAAK,KAAOmD,CACd,CACA,CACAH,GAAa,UAAU,KAAO,SAAS,EAAE,CACxC,OAAAE,GAAgB,IAAI,EACb,KAAK,CAAC,GAAK,IACnB,EAEA3hB,GAASyhB,GAAaJ,EAAQ,EAa9B,SAASU,IAAe,CACxB,CAEA,SAASC,GAAevD,EAAK9U,EAAK,CAEjC,QADI9I,EAAI4d,EAAK,OACP5d,KACL,GAAG4d,EAAK5d,CAAC,IAAM8I,EAAM,OAAO9I,CAE9B,CAEA,SAASohB,GAAcC,EAAGzD,EAAK0D,EAAQC,EAAQ,CAM9C,GALGA,EACF3D,EAAKuD,GAAevD,EAAK2D,CAAO,CAAC,EAAID,EAErC1D,EAAKA,EAAK,QAAQ,EAAI0D,EAEpBD,EAAG,CACLC,EAAQ,aAAeD,EACvB,IAAIG,EAAMH,EAAG,cACVG,IACFD,GAAWE,GAAmBD,EAAIH,EAAGE,CAAO,EAC5CG,GAAgBF,EAAIH,EAAGC,CAAO,EAEjC,CACA,CACA,SAASK,GAAiBN,EAAGzD,EAAKnJ,EAAK,CAEtC,IAAIzU,EAAImhB,GAAevD,EAAKnJ,CAAI,EAChC,GAAGzU,GAAG,EAAE,CAEP,QADI4hB,EAAYhE,EAAK,OAAO,EACtB5d,EAAE4hB,GACPhE,EAAK5d,CAAC,EAAI4d,EAAK,EAAE5d,CAAC,EAGnB,GADA4d,EAAK,OAASgE,EACXP,EAAG,CACL,IAAIG,EAAMH,EAAG,cACVG,IACFC,GAAmBD,EAAIH,EAAG5M,CAAI,EAC9BA,EAAK,aAAe,KAExB,CACA,KACE,OAAM,IAAI6L,GAAaF,GAAc,IAAI,MAAMiB,EAAG,QAAQ,IAAI5M,CAAI,CAAC,CAErE,CACAyM,GAAa,UAAY,CACxB,OAAO,EACP,KAAKV,GAAS,UAAU,KACxB,aAAc,SAASld,EAAK,CAM3B,QADItD,EAAI,KAAK,OACPA,KAAI,CACT,IAAIyU,EAAO,KAAKzU,CAAC,EAEjB,GAAGyU,EAAK,UAAYnR,EACnB,OAAOmR,CAEX,CACE,EACD,aAAc,SAASA,EAAM,CAC5B,IAAI4M,EAAK5M,EAAK,aACd,GAAG4M,GAAMA,GAAI,KAAK,cACjB,MAAM,IAAIf,GAAaD,EAAmB,EAE3C,IAAIkB,EAAU,KAAK,aAAa9M,EAAK,QAAQ,EAC7C,OAAA2M,GAAc,KAAK,cAAc,KAAK3M,EAAK8M,CAAO,EAC3CA,CACP,EAED,eAAgB,SAAS9M,EAAM,CAC9B,IAAI4M,EAAK5M,EAAK,aAAc8M,EAC5B,GAAGF,GAAMA,GAAI,KAAK,cACjB,MAAM,IAAIf,GAAaD,EAAmB,EAE3C,OAAAkB,EAAU,KAAK,eAAe9M,EAAK,aAAaA,EAAK,SAAS,EAC9D2M,GAAc,KAAK,cAAc,KAAK3M,EAAK8M,CAAO,EAC3CA,CACP,EAGD,gBAAiB,SAASje,EAAK,CAC9B,IAAImR,EAAO,KAAK,aAAanR,CAAG,EAChC,OAAAqe,GAAiB,KAAK,cAAc,KAAKlN,CAAI,EACtCA,CAGP,EAGD,kBAAkB,SAASoN,EAAaC,EAAU,CACjD,IAAIrN,EAAO,KAAK,eAAeoN,EAAaC,CAAS,EACrD,OAAAH,GAAiB,KAAK,cAAc,KAAKlN,CAAI,EACtCA,CACP,EACD,eAAgB,SAASoN,EAAcC,EAAW,CAEjD,QADI9hB,EAAI,KAAK,OACPA,KAAI,CACT,IAAI8I,EAAO,KAAK9I,CAAC,EACjB,GAAG8I,EAAK,WAAagZ,GAAahZ,EAAK,cAAgB+Y,EACtD,OAAO/Y,CAEX,CACE,OAAO,IACT,CACA,EAiBA,SAASiZ,IAAoB,CAC7B,CAEAA,GAAkB,UAAY,CAgB7B,WAAY,SAASC,EAASC,EAAS,CACrC,MAAO,EACR,EAuBD,eAAgB,SAASJ,EAAeK,EAAeC,EAAQ,CAC9D,IAAIX,EAAM,IAAIY,GAOd,GANAZ,EAAI,eAAiB,KACrBA,EAAI,WAAa,IAAIhB,GACrBgB,EAAI,QAAUW,GAAW,KACrBA,GACHX,EAAI,YAAYW,CAAO,EAEpBD,EAAc,CACjB,IAAI5Q,EAAOkQ,EAAI,gBAAgBK,EAAcK,CAAa,EAC1DV,EAAI,YAAYlQ,CAAI,CACvB,CACE,OAAOkQ,CACP,EAsBD,mBAAoB,SAASU,EAAeG,EAAUC,EAAS,CAC9D,IAAIxZ,EAAO,IAAIyZ,GACf,OAAAzZ,EAAK,KAAOoZ,EACZpZ,EAAK,SAAWoZ,EAChBpZ,EAAK,SAAWuZ,GAAY,GAC5BvZ,EAAK,SAAWwZ,GAAY,GAErBxZ,CACT,CACA,EAOA,SAAS0Z,IAAO,CAChB,CAEAA,GAAK,UAAY,CAChB,WAAa,KACb,UAAY,KACZ,gBAAkB,KAClB,YAAc,KACd,WAAa,KACb,WAAa,KACb,WAAa,KACb,cAAgB,KAChB,UAAY,KACZ,aAAe,KACf,OAAS,KACT,UAAY,KAEZ,aAAa,SAASC,EAAUC,EAAS,CACxC,OAAOC,GAAc,KAAKF,EAASC,CAAQ,CAC3C,EACD,aAAa,SAASD,EAAUG,EAAS,CACxCD,GAAc,KAAMF,EAASG,EAAUC,EAAsC,EAC1ED,GACF,KAAK,YAAYA,CAAQ,CAE1B,EACD,YAAY,SAASA,EAAS,CAC7B,OAAOE,GAAa,KAAKF,CAAQ,CACjC,EACD,YAAY,SAASH,EAAS,CAC7B,OAAO,KAAK,aAAaA,EAAS,IAAI,CACtC,EACD,cAAc,UAAU,CACvB,OAAO,KAAK,YAAc,IAC1B,EACD,UAAU,SAASM,EAAK,CACvB,OAAOC,GAAU,KAAK,eAAe,KAAK,KAAKD,CAAI,CACnD,EAED,UAAU,UAAU,CAEnB,QADIE,EAAQ,KAAK,WACXA,GAAM,CACX,IAAIC,EAAOD,EAAM,YACdC,GAAQA,EAAK,UAAY3D,IAAa0D,EAAM,UAAY1D,IAC1D,KAAK,YAAY2D,CAAI,EACrBD,EAAM,WAAWC,EAAK,IAAI,IAE1BD,EAAM,UAAW,EACjBA,EAAQC,EAEZ,CACE,EAED,YAAY,SAASlB,EAASC,EAAQ,CACrC,OAAO,KAAK,cAAc,eAAe,WAAWD,EAAQC,CAAO,CACnE,EAEE,cAAc,UAAU,CACvB,OAAO,KAAK,WAAW,OAAO,CAC9B,EAeD,aAAa,SAASJ,EAAa,CAElC,QADIR,EAAK,KACHA,GAAG,CACR,IAAI3L,EAAM2L,EAAG,OAEb,GAAG3L,GACF,QAAQtW,KAAKsW,EACd,GAAI,OAAO,UAAU,eAAe,KAAKA,EAAKtW,CAAC,GAAKsW,EAAItW,CAAC,IAAMyiB,EAC9D,OAAOziB,EAIRiiB,EAAKA,EAAG,UAAY/B,GAAe+B,EAAG,cAAgBA,EAAG,UAC/D,CACK,OAAO,IACP,EAED,mBAAmB,SAAS8B,EAAO,CAElC,QADI9B,EAAK,KACHA,GAAG,CACR,IAAI3L,EAAM2L,EAAG,OAEb,GAAG3L,GACC,OAAO,UAAU,eAAe,KAAKA,EAAKyN,CAAM,EAClD,OAAOzN,EAAIyN,CAAM,EAGnB9B,EAAKA,EAAG,UAAY/B,GAAe+B,EAAG,cAAgBA,EAAG,UAC/D,CACK,OAAO,IACP,EAED,mBAAmB,SAASQ,EAAa,CACxC,IAAIsB,EAAS,KAAK,aAAatB,CAAY,EAC3C,OAAOsB,GAAU,IACtB,CACA,EAGA,SAASC,GAAYjJ,EAAE,CACtB,OAAOA,GAAK,KAAO,QACXA,GAAK,KAAO,QACZA,GAAK,KAAO,SACZA,GAAK,KAAO,UACZ,KAAKA,EAAE,aAAa,GAC7B,CAGA2E,GAAKM,GAASoD,EAAI,EAClB1D,GAAKM,GAASoD,GAAK,SAAS,EAM5B,SAASa,GAAWva,EAAK/G,EAAS,CACjC,GAAGA,EAAS+G,CAAI,EACf,MAAO,GAER,GAAGA,EAAOA,EAAK,WACd,EACC,IAAGua,GAAWva,EAAK/G,CAAQ,EAAG,MAAO,SACzB+G,EAAKA,EAAK,YAEzB,CAIA,SAASsZ,IAAU,CAClB,KAAK,cAAgB,IACtB,CAEA,SAASV,GAAgBF,EAAIH,EAAGC,EAAQ,CACvCE,GAAOA,EAAI,OACX,IAAI8B,EAAKhC,EAAQ,aACdgC,IAAO/E,GAAU,QAEnB8C,EAAG,OAAOC,EAAQ,OAAOA,EAAQ,UAAU,EAAE,EAAIA,EAAQ,MAE3D,CAEA,SAASG,GAAmBD,EAAIH,EAAGC,EAAQiC,EAAO,CACjD/B,GAAOA,EAAI,OACX,IAAI8B,EAAKhC,EAAQ,aACdgC,IAAO/E,GAAU,OAEnB,OAAO8C,EAAG,OAAOC,EAAQ,OAAOA,EAAQ,UAAU,EAAE,CAEtD,CAcA,SAASkC,GAAgBhC,EAAKH,EAAIoB,EAAU,CAC3C,GAAGjB,GAAOA,EAAI,KAAK,CAClBA,EAAI,OAEJ,IAAIiC,EAAKpC,EAAG,WACZ,GAAIoB,EACHgB,EAAGA,EAAG,QAAQ,EAAIhB,MACZ,CAGN,QAFIQ,EAAQ5B,EAAG,WACXrhB,EAAI,EACDijB,GACNQ,EAAGzjB,GAAG,EAAIijB,EACVA,EAAQA,EAAM,YAEfQ,EAAG,OAASzjB,EACZ,OAAOyjB,EAAGA,EAAG,MAAM,CACtB,CACA,CACA,CAcA,SAASX,GAAcY,EAAYT,EAAO,CACzC,IAAIU,EAAWV,EAAM,gBACjBC,EAAOD,EAAM,YACjB,OAAIU,EACHA,EAAS,YAAcT,EAEvBQ,EAAW,WAAaR,EAErBA,EACHA,EAAK,gBAAkBS,EAEvBD,EAAW,UAAYC,EAExBV,EAAM,WAAa,KACnBA,EAAM,gBAAkB,KACxBA,EAAM,YAAc,KACpBO,GAAeE,EAAW,cAAeA,CAAU,EAC5CT,CACR,CAOA,SAASW,GAAuB9a,EAAM,CACrC,OACCA,IACCA,EAAK,WAAa0Z,GAAK,eAAiB1Z,EAAK,WAAa0Z,GAAK,wBAA0B1Z,EAAK,WAAa0Z,GAAK,aAEnH,CAOA,SAASqB,GAAsB/a,EAAM,CACpC,OACCA,IACCgb,GAAchb,CAAI,GAClBib,GAAWjb,CAAI,GACfkb,GAAclb,CAAI,GAClBA,EAAK,WAAa0Z,GAAK,wBACvB1Z,EAAK,WAAa0Z,GAAK,cACvB1Z,EAAK,WAAa0Z,GAAK,4BAE1B,CAOA,SAASwB,GAAclb,EAAM,CAC5B,OAAOA,GAAQA,EAAK,WAAa0Z,GAAK,kBACvC,CAOA,SAASsB,GAAchb,EAAM,CAC5B,OAAOA,GAAQA,EAAK,WAAa0Z,GAAK,YACvC,CAMA,SAASuB,GAAWjb,EAAM,CACzB,OAAOA,GAAQA,EAAK,WAAa0Z,GAAK,SACvC,CAYA,SAASyB,GAA2BzC,EAAKyB,EAAO,CAC/C,IAAIiB,EAAmB1C,EAAI,YAAc,CAAE,EAC3C,GAAI7D,GAAKuG,EAAkBJ,EAAa,GAAKE,GAAcf,CAAK,EAC/D,MAAO,GAER,IAAIkB,EAAcxG,GAAKuG,EAAkBF,EAAa,EACtD,MAAO,EAAEf,GAASkB,GAAeD,EAAiB,QAAQC,CAAW,EAAID,EAAiB,QAAQjB,CAAK,EACxG,CAYA,SAASmB,GAA6B5C,EAAKyB,EAAO,CACjD,IAAIiB,EAAmB1C,EAAI,YAAc,CAAE,EAE3C,SAAS6C,EAA8Bvb,EAAM,CAC5C,OAAOgb,GAAchb,CAAI,GAAKA,IAASma,CACzC,CAEC,GAAItF,GAAKuG,EAAkBG,CAA6B,EACvD,MAAO,GAER,IAAIF,EAAcxG,GAAKuG,EAAkBF,EAAa,EACtD,MAAO,EAAEf,GAASkB,GAAeD,EAAiB,QAAQC,CAAW,EAAID,EAAiB,QAAQjB,CAAK,EACxG,CAeA,SAASqB,GAA+BC,EAAQzb,EAAMma,EAAO,CAE5D,GAAI,CAACW,GAAuBW,CAAM,EACjC,MAAM,IAAIjE,GAAaH,GAAuB,+BAAiCoE,EAAO,QAAQ,EAK/F,GAAItB,GAASA,EAAM,aAAesB,EACjC,MAAM,IAAIjE,GAAaF,GAAe,qBAAqB,EAE5D,GAEC,CAACyD,GAAsB/a,CAAI,GAK1Bkb,GAAclb,CAAI,GAAKyb,EAAO,WAAa/B,GAAK,cAEjD,MAAM,IAAIlC,GACTH,GACA,wBAA0BrX,EAAK,SAAW,yBAA2Byb,EAAO,QAC5E,CAEH,CAeA,SAASC,GAAqCD,EAAQzb,EAAMma,EAAO,CAClE,IAAIiB,EAAmBK,EAAO,YAAc,CAAE,EAC1CE,EAAiB3b,EAAK,YAAc,CAAE,EAG1C,GAAIA,EAAK,WAAa0Z,GAAK,uBAAwB,CAClD,IAAIkC,EAAoBD,EAAe,OAAOX,EAAa,EAE3D,GAAIY,EAAkB,OAAS,GAAK/G,GAAK8G,EAAgBV,EAAU,EAClE,MAAM,IAAIzD,GAAaH,GAAuB,2CAA2C,EAI1F,GAAIuE,EAAkB,SAAW,GAAK,CAACT,GAA2BM,EAAQtB,CAAK,EAC9E,MAAM,IAAI3C,GAAaH,GAAuB,wDAAwD,CAEzG,CAEC,GAAI2D,GAAchb,CAAI,GAGjB,CAACmb,GAA2BM,EAAQtB,CAAK,EAC5C,MAAM,IAAI3C,GAAaH,GAAuB,sDAAsD,EAItG,GAAI6D,GAAclb,CAAI,EAAG,CAExB,GAAI6U,GAAKuG,EAAkBF,EAAa,EACvC,MAAM,IAAI1D,GAAaH,GAAuB,6BAA6B,EAE5E,IAAIwE,EAAqBhH,GAAKuG,EAAkBJ,EAAa,EAE7D,GAAIb,GAASiB,EAAiB,QAAQS,CAAkB,EAAIT,EAAiB,QAAQjB,CAAK,EACzF,MAAM,IAAI3C,GAAaH,GAAuB,gDAAgD,EAG/F,GAAI,CAAC8C,GAAS0B,EACb,MAAM,IAAIrE,GAAaH,GAAuB,sDAAsD,CAEvG,CACA,CAeA,SAAS0C,GAAuC0B,EAAQzb,EAAMma,EAAO,CACpE,IAAIiB,EAAmBK,EAAO,YAAc,CAAE,EAC1CE,EAAiB3b,EAAK,YAAc,CAAE,EAG1C,GAAIA,EAAK,WAAa0Z,GAAK,uBAAwB,CAClD,IAAIkC,EAAoBD,EAAe,OAAOX,EAAa,EAE3D,GAAIY,EAAkB,OAAS,GAAK/G,GAAK8G,EAAgBV,EAAU,EAClE,MAAM,IAAIzD,GAAaH,GAAuB,2CAA2C,EAG1F,GAAIuE,EAAkB,SAAW,GAAK,CAACN,GAA6BG,EAAQtB,CAAK,EAChF,MAAM,IAAI3C,GAAaH,GAAuB,wDAAwD,CAEzG,CAEC,GAAI2D,GAAchb,CAAI,GAEjB,CAACsb,GAA6BG,EAAQtB,CAAK,EAC9C,MAAM,IAAI3C,GAAaH,GAAuB,sDAAsD,EAItG,GAAI6D,GAAclb,CAAI,EAAG,CAMxB,GAAI6U,GAAKuG,EALT,SAAuCpb,EAAM,CAC5C,OAAOkb,GAAclb,CAAI,GAAKA,IAASma,CAC1C,CAG0D,EACvD,MAAM,IAAI3C,GAAaH,GAAuB,6BAA6B,EAE5E,IAAIwE,EAAqBhH,GAAKuG,EAAkBJ,EAAa,EAE7D,GAAIb,GAASiB,EAAiB,QAAQS,CAAkB,EAAIT,EAAiB,QAAQjB,CAAK,EACzF,MAAM,IAAI3C,GAAaH,GAAuB,gDAAgD,CAEjG,CACA,CAYA,SAASwC,GAAc4B,EAAQzb,EAAMma,EAAO2B,EAAsB,CAEjEN,GAA+BC,EAAQzb,EAAMma,CAAK,EAI9CsB,EAAO,WAAa/B,GAAK,gBAC3BoC,GAAwBJ,IAAsCD,EAAQzb,EAAMma,CAAK,EAGnF,IAAI4B,EAAK/b,EAAK,WAId,GAHG+b,GACFA,EAAG,YAAY/b,CAAI,EAEjBA,EAAK,WAAaiX,GAAuB,CAC3C,IAAI+E,EAAWhc,EAAK,WACpB,GAAIgc,GAAY,KACf,OAAOhc,EAER,IAAIic,EAAUjc,EAAK,SACrB,MACEgc,EAAWC,EAAUjc,EAEtB,IAAIkc,EAAM/B,EAAQA,EAAM,gBAAkBsB,EAAO,UAEjDO,EAAS,gBAAkBE,EAC3BD,EAAQ,YAAc9B,EAGnB+B,EACFA,EAAI,YAAcF,EAElBP,EAAO,WAAaO,EAElB7B,GAAS,KACXsB,EAAO,UAAYQ,EAEnB9B,EAAM,gBAAkB8B,EAEzB,GACCD,EAAS,WAAaP,QAChBO,IAAaC,IAAYD,EAAUA,EAAS,cACnD,OAAAtB,GAAee,EAAO,eAAeA,EAAQA,CAAM,EAE/Czb,EAAK,UAAYiX,KACpBjX,EAAK,WAAaA,EAAK,UAAY,MAE7BA,CACR,CAaA,SAASmc,GAAoBvB,EAAYjB,EAAU,CAClD,OAAIA,EAAS,YACZA,EAAS,WAAW,YAAYA,CAAQ,EAEzCA,EAAS,WAAaiB,EACtBjB,EAAS,gBAAkBiB,EAAW,UACtCjB,EAAS,YAAc,KACnBA,EAAS,gBACZA,EAAS,gBAAgB,YAAcA,EAEvCiB,EAAW,WAAajB,EAEzBiB,EAAW,UAAYjB,EACvBe,GAAeE,EAAW,cAAeA,EAAYjB,CAAQ,EACtDA,CACR,CAEAL,GAAS,UAAY,CAEpB,SAAY,YACZ,SAAYvC,GAOZ,QAAW,KACX,gBAAmB,KACnB,KAAO,EAEP,aAAgB,SAAS4C,EAAUC,EAAS,CAC3C,GAAGD,EAAS,UAAY1C,GAAuB,CAE9C,QADIkD,EAAQR,EAAS,WACfQ,GAAM,CACX,IAAIC,EAAOD,EAAM,YACjB,KAAK,aAAaA,EAAMP,CAAQ,EAChCO,EAAQC,CACZ,CACG,OAAOT,CACV,CACE,OAAAE,GAAc,KAAMF,EAAUC,CAAQ,EACtCD,EAAS,cAAgB,KACrB,KAAK,kBAAoB,MAAQA,EAAS,WAAapD,KAC1D,KAAK,gBAAkBoD,GAGjBA,CACP,EACD,YAAe,SAASG,EAAS,CAChC,OAAG,KAAK,iBAAmBA,IAC1B,KAAK,gBAAkB,MAEjBE,GAAa,KAAKF,CAAQ,CACjC,EACD,aAAc,SAAUH,EAAUG,EAAU,CAE3CD,GAAc,KAAMF,EAAUG,EAAUC,EAAsC,EAC9EJ,EAAS,cAAgB,KACrBG,GACH,KAAK,YAAYA,CAAQ,EAEtBkB,GAAcrB,CAAQ,IACzB,KAAK,gBAAkBA,EAExB,EAED,WAAa,SAASyC,EAAanC,EAAK,CACvC,OAAOoC,GAAW,KAAKD,EAAanC,CAAI,CACxC,EAED,eAAiB,SAASqC,EAAG,CAC5B,IAAIC,EAAM,KACV,OAAAhC,GAAW,KAAK,gBAAgB,SAASva,EAAK,CAC7C,GAAGA,EAAK,UAAYuW,IAChBvW,EAAK,aAAa,IAAI,GAAKsc,EAC7B,OAAAC,EAAMvc,EACC,EAGT,CAAA,EACMuc,CACP,EAmBD,uBAAwB,SAASC,EAAY,CAC5C,IAAIC,EAAgB3G,GAAa0G,CAAU,EAC3C,OAAO,IAAI1E,GAAa,KAAM,SAAS4E,EAAM,CAC5C,IAAIxE,EAAK,CAAE,EACX,OAAIuE,EAAc,OAAS,GAC1BlC,GAAWmC,EAAK,gBAAiB,SAAS1c,EAAM,CAC/C,GAAGA,IAAS0c,GAAQ1c,EAAK,WAAauW,GAAc,CACnD,IAAIoG,EAAiB3c,EAAK,aAAa,OAAO,EAE9C,GAAI2c,EAAgB,CAEnB,IAAIC,EAAUJ,IAAeG,EAC7B,GAAI,CAACC,EAAS,CACb,IAAIC,EAAoB/G,GAAa6G,CAAc,EACnDC,EAAUH,EAAc,MAAM1G,GAAc8G,CAAiB,CAAC,CACtE,CACUD,GACF1E,EAAG,KAAKlY,CAAI,CAEpB,CACA,CACA,CAAK,EAEKkY,CACV,CAAG,CACD,EAGD,cAAgB,SAASvY,EAAQ,CAChC,IAAIK,EAAO,IAAI8c,GACf9c,EAAK,cAAgB,KACrBA,EAAK,SAAWL,EAChBK,EAAK,QAAUL,EACfK,EAAK,UAAYL,EACjBK,EAAK,WAAa,IAAI0X,GACtB,IAAIhM,EAAQ1L,EAAK,WAAa,IAAIoY,GAClC,OAAA1M,EAAM,cAAgB1L,EACfA,CACP,EACD,uBAAyB,UAAU,CAClC,IAAIA,EAAO,IAAI+c,GACf,OAAA/c,EAAK,cAAgB,KACrBA,EAAK,WAAa,IAAI0X,GACf1X,CACP,EACD,eAAiB,SAASkE,EAAK,CAC9B,IAAIlE,EAAO,IAAIgd,GACf,OAAAhd,EAAK,cAAgB,KACrBA,EAAK,WAAWkE,CAAI,EACblE,CACP,EACD,cAAgB,SAASkE,EAAK,CAC7B,IAAIlE,EAAO,IAAIid,GACf,OAAAjd,EAAK,cAAgB,KACrBA,EAAK,WAAWkE,CAAI,EACblE,CACP,EACD,mBAAqB,SAASkE,EAAK,CAClC,IAAIlE,EAAO,IAAIkd,GACf,OAAAld,EAAK,cAAgB,KACrBA,EAAK,WAAWkE,CAAI,EACblE,CACP,EACD,4BAA8B,SAASsV,EAAOpR,EAAK,CAClD,IAAIlE,EAAO,IAAImd,GACf,OAAAnd,EAAK,cAAgB,KACrBA,EAAK,QAAUA,EAAK,SAAWA,EAAK,OAASsV,EAC7CtV,EAAK,UAAYA,EAAK,KAAOkE,EACtBlE,CACP,EACD,gBAAkB,SAASJ,EAAK,CAC/B,IAAII,EAAO,IAAIod,GACf,OAAApd,EAAK,cAAgB,KACrBA,EAAK,KAAOJ,EACZI,EAAK,SAAWJ,EAChBI,EAAK,UAAYJ,EACjBI,EAAK,UAAY,GACVA,CACP,EACD,sBAAwB,SAASJ,EAAK,CACrC,IAAII,EAAO,IAAIqd,GACf,OAAArd,EAAK,cAAgB,KACrBA,EAAK,SAAWJ,EACTI,CACP,EAED,gBAAkB,SAAS+Y,EAAaK,EAAc,CACrD,IAAIpZ,EAAO,IAAI8c,GACXQ,EAAKlE,EAAc,MAAM,GAAG,EAC5B1N,EAAQ1L,EAAK,WAAa,IAAIoY,GAClC,OAAApY,EAAK,WAAa,IAAI0X,GACtB1X,EAAK,cAAgB,KACrBA,EAAK,SAAWoZ,EAChBpZ,EAAK,QAAUoZ,EACfpZ,EAAK,aAAe+Y,EACjBuE,EAAG,QAAU,GACftd,EAAK,OAASsd,EAAG,CAAC,EAClBtd,EAAK,UAAYsd,EAAG,CAAC,GAGrBtd,EAAK,UAAYoZ,EAElB1N,EAAM,cAAgB1L,EACfA,CACP,EAED,kBAAoB,SAAS+Y,EAAaK,EAAc,CACvD,IAAIpZ,EAAO,IAAIod,GACXE,EAAKlE,EAAc,MAAM,GAAG,EAChC,OAAApZ,EAAK,cAAgB,KACrBA,EAAK,SAAWoZ,EAChBpZ,EAAK,KAAOoZ,EACZpZ,EAAK,aAAe+Y,EACpB/Y,EAAK,UAAY,GACdsd,EAAG,QAAU,GACftd,EAAK,OAASsd,EAAG,CAAC,EAClBtd,EAAK,UAAYsd,EAAG,CAAC,GAGrBtd,EAAK,UAAYoZ,EAEXpZ,CACT,CACA,EACA3J,GAASijB,GAASI,EAAI,EAGtB,SAASoD,IAAU,CAClB,KAAK,OAAS,CAAE,CACjB,CACAA,GAAQ,UAAY,CACnB,SAAWvG,GACX,aAAe,SAAS3W,EAAK,CAC5B,OAAO,KAAK,iBAAiBA,CAAI,GAAG,IACpC,EACD,aAAe,SAASA,EAAK,CAC5B,IAAI+L,EAAO,KAAK,iBAAiB/L,CAAI,EACrC,OAAO+L,GAAQA,EAAK,OAAS,EAC7B,EACD,iBAAmB,SAAS/L,EAAK,CAChC,OAAO,KAAK,WAAW,aAAaA,CAAI,CACxC,EACD,aAAe,SAASA,EAAMjG,EAAM,CACnC,IAAIgS,EAAO,KAAK,cAAc,gBAAgB/L,CAAI,EAClD+L,EAAK,MAAQA,EAAK,UAAY,GAAKhS,EACnC,KAAK,iBAAiBgS,CAAI,CAC1B,EACD,gBAAkB,SAAS/L,EAAK,CAC/B,IAAI+L,EAAO,KAAK,iBAAiB/L,CAAI,EACrC+L,GAAQ,KAAK,oBAAoBA,CAAI,CACrC,EAGD,YAAY,SAASgO,EAAS,CAC7B,OAAGA,EAAS,WAAa1C,GACjB,KAAK,aAAa0C,EAAS,IAAI,EAE/BwC,GAAmB,KAAKxC,CAAQ,CAExC,EACD,iBAAmB,SAASnB,EAAQ,CACnC,OAAO,KAAK,WAAW,aAAaA,CAAO,CAC3C,EACD,mBAAqB,SAASA,EAAQ,CACrC,OAAO,KAAK,WAAW,eAAeA,CAAO,CAC7C,EACD,oBAAsB,SAASC,EAAQ,CAEtC,OAAO,KAAK,WAAW,gBAAgBA,EAAQ,QAAQ,CACvD,EAED,kBAAoB,SAASM,EAAcC,EAAU,CACpD,IAAIuE,EAAM,KAAK,mBAAmBxE,EAAcC,CAAS,EACzDuE,GAAO,KAAK,oBAAoBA,CAAG,CACnC,EAED,eAAiB,SAASxE,EAAcC,EAAU,CACjD,OAAO,KAAK,mBAAmBD,EAAcC,CAAS,GAAG,IACzD,EACD,eAAiB,SAASD,EAAcC,EAAU,CACjD,IAAIrN,EAAO,KAAK,mBAAmBoN,EAAcC,CAAS,EAC1D,OAAOrN,GAAQA,EAAK,OAAS,EAC7B,EACD,eAAiB,SAASoN,EAAcK,EAAezf,EAAM,CAC5D,IAAIgS,EAAO,KAAK,cAAc,kBAAkBoN,EAAcK,CAAa,EAC3EzN,EAAK,MAAQA,EAAK,UAAY,GAAKhS,EACnC,KAAK,iBAAiBgS,CAAI,CAC1B,EACD,mBAAqB,SAASoN,EAAcC,EAAU,CACrD,OAAO,KAAK,WAAW,eAAeD,EAAcC,CAAS,CAC7D,EAED,qBAAuB,SAASrZ,EAAQ,CACvC,OAAO,IAAImY,GAAa,KAAK,SAAS4E,EAAK,CAC1C,IAAIxE,EAAK,CAAE,EACX,OAAAqC,GAAWmC,EAAK,SAAS1c,EAAK,CAC1BA,IAAS0c,GAAQ1c,EAAK,UAAYuW,KAAiB5W,IAAY,KAAOK,EAAK,SAAWL,IACxFuY,EAAG,KAAKlY,CAAI,CAEjB,CAAI,EACMkY,CACV,CAAG,CACD,EACD,uBAAyB,SAASa,EAAcC,EAAU,CACzD,OAAO,IAAIlB,GAAa,KAAK,SAAS4E,EAAK,CAC1C,IAAIxE,EAAK,CAAE,EACX,OAAAqC,GAAWmC,EAAK,SAAS1c,EAAK,CAC1BA,IAAS0c,GAAQ1c,EAAK,WAAauW,KAAiBwC,IAAiB,KAAO/Y,EAAK,eAAiB+Y,KAAkBC,IAAc,KAAOhZ,EAAK,WAAagZ,IAC7Jd,EAAG,KAAKlY,CAAI,CAEjB,CAAI,EACMkY,CAEV,CAAG,CACH,CACA,EACAoB,GAAS,UAAU,qBAAuBwD,GAAQ,UAAU,qBAC5DxD,GAAS,UAAU,uBAAyBwD,GAAQ,UAAU,uBAG9DzmB,GAASymB,GAAQpD,EAAI,EACrB,SAAS0D,IAAO,CAChB,CACAA,GAAK,UAAU,SAAW5G,GAC1BngB,GAAS+mB,GAAK1D,EAAI,EAGlB,SAAS8D,IAAgB,CACzB,CACAA,GAAc,UAAY,CACzB,KAAO,GACP,cAAgB,SAASzJ,EAAQ3S,EAAO,CACvC,OAAO,KAAK,KAAK,UAAU2S,EAAQA,EAAO3S,CAAK,CAC/C,EACD,WAAY,SAASN,EAAM,CAC1BA,EAAO,KAAK,KAAKA,EACjB,KAAK,UAAY,KAAK,KAAOA,EAC7B,KAAK,OAASA,EAAK,MACnB,EACD,WAAY,SAASiT,EAAOjT,EAAM,CACjC,KAAK,YAAYiT,EAAO,EAAEjT,CAAI,CAE9B,EACD,YAAY,SAAS6Y,EAAS,CAC7B,MAAM,IAAI,MAAMvC,GAAiBC,EAAqB,CAAC,CACvD,EACD,WAAY,SAAStD,EAAQ3S,EAAO,CACnC,KAAK,YAAY2S,EAAO3S,EAAM,EAAE,CAChC,EACD,YAAa,SAAS2S,EAAQ3S,EAAON,EAAM,CAC1C,IAAI2c,EAAQ,KAAK,KAAK,UAAU,EAAE1J,CAAM,EACpC2J,EAAM,KAAK,KAAK,UAAU3J,EAAO3S,CAAK,EAC1CN,EAAO2c,EAAQ3c,EAAO4c,EACtB,KAAK,UAAY,KAAK,KAAO5c,EAC7B,KAAK,OAASA,EAAK,MACrB,CACA,EACAzK,GAASmnB,GAAc9D,EAAI,EAC3B,SAASsD,IAAO,CAChB,CACAA,GAAK,UAAY,CAChB,SAAW,QACX,SAAWvG,GACX,UAAY,SAAS1C,EAAQ,CAC5B,IAAIjT,EAAO,KAAK,KACZ6c,EAAU7c,EAAK,UAAUiT,CAAM,EACnCjT,EAAOA,EAAK,UAAU,EAAGiT,CAAM,EAC/B,KAAK,KAAO,KAAK,UAAYjT,EAC7B,KAAK,OAASA,EAAK,OACnB,IAAI8c,EAAU,KAAK,cAAc,eAAeD,CAAO,EACvD,OAAG,KAAK,YACP,KAAK,WAAW,aAAaC,EAAS,KAAK,WAAW,EAEhDA,CACT,CACA,EACAvnB,GAAS2mB,GAAKQ,EAAa,EAC3B,SAASP,IAAU,CACnB,CACAA,GAAQ,UAAY,CACnB,SAAW,WACX,SAAWnG,EACZ,EACAzgB,GAAS4mB,GAAQO,EAAa,EAE9B,SAASN,IAAe,CACxB,CACAA,GAAa,UAAY,CACxB,SAAW,iBACX,SAAWxG,EACZ,EACArgB,GAAS6mB,GAAaM,EAAa,EAGnC,SAAS/D,IAAe,CACxB,CACAA,GAAa,UAAU,SAAWzC,GAClC3gB,GAASojB,GAAaC,EAAI,EAE1B,SAASmE,IAAW,CACpB,CACAA,GAAS,UAAU,SAAW3G,GAC9B7gB,GAASwnB,GAASnE,EAAI,EAEtB,SAASoE,IAAS,CAClB,CACAA,GAAO,UAAU,SAAWlH,GAC5BvgB,GAASynB,GAAOpE,EAAI,EAEpB,SAAS2D,IAAkB,CAC3B,CACAA,GAAgB,UAAU,SAAW1G,GACrCtgB,GAASgnB,GAAgB3D,EAAI,EAE7B,SAASqD,IAAmB,CAC5B,CACAA,GAAiB,UAAU,SAAW,qBACtCA,GAAiB,UAAU,SAAW9F,GACtC5gB,GAAS0mB,GAAiBrD,EAAI,EAG9B,SAASyD,IAAwB,CACjC,CACAA,GAAsB,UAAU,SAAWtG,GAC3CxgB,GAAS8mB,GAAsBzD,EAAI,EACnC,SAASqE,IAAe,CAAA,CACxBA,GAAc,UAAU,kBAAoB,SAAS/d,EAAKge,EAAOpG,EAAW,CAC3E,OAAOqG,GAAsB,KAAKje,EAAKge,EAAOpG,CAAU,CACzD,EACA8B,GAAK,UAAU,SAAWuE,GAC1B,SAASA,GAAsBD,EAAOpG,EAAW,CAChD,IAAI/D,EAAM,CAAE,EACRqK,EAAU,KAAK,UAAY,GAAK,KAAK,iBAAmB,KACxD7D,EAAS6D,EAAQ,OACjBrjB,EAAMqjB,EAAQ,aAElB,GAAGrjB,GAAOwf,GAAU,KAAK,CAExB,IAAIA,EAAS6D,EAAQ,aAAarjB,CAAG,EACrC,GAAGwf,GAAU,KAEZ,IAAI8D,EAAkB,CACtB,CAAC,UAAUtjB,EAAI,OAAO,IAAI,CAE7B,CAEA,CACC,OAAAgd,GAAkB,KAAKhE,EAAImK,EAAOpG,EAAWuG,CAAiB,EAEvDtK,EAAI,KAAK,EAAE,CACnB,CAEA,SAASuK,GAAoBpe,EAAM2X,EAAQwG,EAAmB,CAC7D,IAAI9D,EAASra,EAAK,QAAU,GACxBnF,EAAMmF,EAAK,aAWf,GAHI,CAACnF,GAGDwf,IAAW,OAASxf,IAAQ4a,GAAU,KAAO5a,IAAQ4a,GAAU,MAClE,MAAO,GAIR,QADIve,EAAIinB,EAAkB,OACnBjnB,KAAK,CACX,IAAIsjB,EAAK2D,EAAkBjnB,CAAC,EAE5B,GAAIsjB,EAAG,SAAWH,EACjB,OAAOG,EAAG,YAAc3f,CAE3B,CACC,MAAO,EACR,CAcA,SAASwjB,GAAuBxK,EAAKuF,EAAezf,EAAO,CAC1Dka,EAAI,KAAK,IAAKuF,EAAe,KAAMzf,EAAM,QAAQ,gBAAiB2gB,EAAW,EAAG,GAAG,CACpF,CAEA,SAASzC,GAAkB7X,EAAK6T,EAAI8D,EAAOC,EAAWuG,EAAkB,CAKvE,GAJKA,IACJA,EAAoB,CAAE,GAGpBvG,EAEF,GADA5X,EAAO4X,EAAW5X,CAAI,EACnBA,GACF,GAAG,OAAOA,GAAQ,SAAS,CAC1B6T,EAAI,KAAK7T,CAAI,EACb,MACJ,MAEG,QAKF,OAAOA,EAAK,SAAQ,CACpB,KAAKuW,GACJ,IAAI7K,EAAQ1L,EAAK,WACb1I,EAAMoU,EAAM,OACZyO,EAAQna,EAAK,WACbse,EAAWte,EAAK,QAEpB2X,EAASlC,GAAU,OAAOzV,EAAK,YAAY,GAAK2X,EAEhD,IAAI4G,EAAmBD,EACvB,GAAI,CAAC3G,GAAU,CAAC3X,EAAK,QAAUA,EAAK,aAAc,CAGjD,QAFIwe,EAEKC,EAAK,EAAGA,EAAK/S,EAAM,OAAQ+S,IACnC,GAAI/S,EAAM,KAAK+S,CAAE,EAAE,OAAS,QAAS,CACpCD,EAAY9S,EAAM,KAAK+S,CAAE,EAAE,MAC3B,KACL,CAEG,GAAI,CAACD,EAEJ,QAASE,EAAMP,EAAkB,OAAS,EAAGO,GAAO,EAAGA,IAAO,CAC7D,IAAIC,EAAYR,EAAkBO,CAAG,EACrC,GAAIC,EAAU,SAAW,IAAMA,EAAU,YAAc3e,EAAK,aAAc,CACzEwe,EAAYG,EAAU,UACtB,KACN,CACA,CAEG,GAAIH,IAAcxe,EAAK,aACtB,QAAS0e,EAAMP,EAAkB,OAAS,EAAGO,GAAO,EAAGA,IAAO,CAC7D,IAAIC,EAAYR,EAAkBO,CAAG,EACrC,GAAIC,EAAU,YAAc3e,EAAK,aAAc,CAC1C2e,EAAU,SACbJ,EAAmBI,EAAU,OAAS,IAAML,GAE7C,KACN,CACA,CAEA,CAEEzK,EAAI,KAAK,IAAK0K,CAAgB,EAE9B,QAAQrnB,EAAE,EAAEA,EAAEI,EAAIJ,IAAI,CAErB,IAAIyU,EAAOD,EAAM,KAAKxU,CAAC,EACnByU,EAAK,QAAU,QAClBwS,EAAkB,KAAK,CAAE,OAAQxS,EAAK,UAAW,UAAWA,EAAK,MAAO,EAChEA,EAAK,UAAY,SACzBwS,EAAkB,KAAK,CAAE,OAAQ,GAAI,UAAWxS,EAAK,MAAO,CAEhE,CAEE,QAAQzU,EAAE,EAAEA,EAAEI,EAAIJ,IAAI,CACrB,IAAIyU,EAAOD,EAAM,KAAKxU,CAAC,EACvB,GAAIknB,GAAoBzS,EAAKgM,EAAQwG,CAAiB,EAAG,CACxD,IAAI9D,EAAS1O,EAAK,QAAQ,GACtB9Q,EAAM8Q,EAAK,aACf0S,GAAuBxK,EAAKwG,EAAS,SAAWA,EAAS,QAASxf,CAAG,EACrEsjB,EAAkB,KAAK,CAAE,OAAQ9D,EAAQ,UAAUxf,EAAK,CAC5D,CACGgd,GAAkBlM,EAAKkI,EAAI8D,EAAOC,EAAWuG,CAAiB,CACjE,CAGE,GAAIG,IAAaC,GAAoBH,GAAoBpe,EAAM2X,EAAQwG,CAAiB,EAAG,CAC1F,IAAI9D,EAASra,EAAK,QAAQ,GACtBnF,EAAMmF,EAAK,aACfqe,GAAuBxK,EAAKwG,EAAS,SAAWA,EAAS,QAASxf,CAAG,EACrEsjB,EAAkB,KAAK,CAAE,OAAQ9D,EAAQ,UAAUxf,EAAK,CAC3D,CAEE,GAAGsf,GAASxC,GAAU,CAAC,mCAAmC,KAAK2G,CAAQ,EAAE,CAGxE,GAFAzK,EAAI,KAAK,GAAG,EAET8D,GAAU,YAAY,KAAK2G,CAAQ,EACrC,KAAMnE,GACFA,EAAM,KACRtG,EAAI,KAAKsG,EAAM,IAAI,EAEnBtC,GAAkBsC,EAAOtG,EAAK8D,EAAQC,EAAYuG,EAAkB,OAAO,EAE5EhE,EAAQA,EAAM,gBAIf,MAAMA,GACLtC,GAAkBsC,EAAOtG,EAAK8D,EAAQC,EAAYuG,EAAkB,OAAO,EAC3EhE,EAAQA,EAAM,YAGhBtG,EAAI,KAAK,KAAK0K,EAAiB,GAAG,CACrC,MACG1K,EAAI,KAAK,IAAI,EAId,OACD,KAAKkD,GACL,KAAKE,GAEJ,QADIkD,EAAQna,EAAK,WACXma,GACLtC,GAAkBsC,EAAOtG,EAAK8D,EAAQC,EAAYuG,EAAkB,OAAO,EAC3EhE,EAAQA,EAAM,YAEf,OACD,KAAK3D,GACJ,OAAO6H,GAAuBxK,EAAK7T,EAAK,KAAMA,EAAK,KAAK,EACzD,KAAKyW,GAiBJ,OAAO5C,EAAI,KAAK7T,EAAK,KACnB,QAAQ,SAASsa,EAAW,CAC7B,EACF,KAAK5D,GACJ,OAAO7C,EAAI,KAAM,YAAY7T,EAAK,KAAK,KAAK,EAC7C,KAAK8W,GACJ,OAAOjD,EAAI,KAAM,OAAO7T,EAAK,KAAK,KAAK,EACxC,KAAKgX,GACJ,IAAI4H,EAAQ5e,EAAK,SACb6e,EAAQ7e,EAAK,SAEjB,GADA6T,EAAI,KAAK,aAAa7T,EAAK,IAAI,EAC5B4e,EACF/K,EAAI,KAAK,WAAY+K,CAAK,EACtBC,GAASA,GAAO,KACnBhL,EAAI,KAAK,IAAKgL,CAAK,EAEpBhL,EAAI,KAAK,GAAG,UACJgL,GAASA,GAAO,IACxBhL,EAAI,KAAK,WAAYgL,EAAO,GAAG,MAC3B,CACJ,IAAIC,EAAM9e,EAAK,eACZ8e,GACFjL,EAAI,KAAK,KAAKiL,EAAI,GAAG,EAEtBjL,EAAI,KAAK,GAAG,CACf,CACE,OACD,KAAKgD,GACJ,OAAOhD,EAAI,KAAM,KAAK7T,EAAK,OAAO,IAAIA,EAAK,KAAK,IAAI,EACrD,KAAK2W,GACJ,OAAO9C,EAAI,KAAM,IAAI7T,EAAK,SAAS,GAAG,EAGvC,QACC6T,EAAI,KAAK,KAAK7T,EAAK,QAAQ,CAC7B,CACA,CACA,SAASqc,GAAW3D,EAAI1Y,EAAKia,EAAK,CACjC,IAAI8E,EACJ,OAAQ/e,EAAK,SAAQ,CACrB,KAAKuW,GACJwI,EAAQ/e,EAAK,UAAU,EAAK,EAC5B+e,EAAM,cAAgBrG,EAMvB,KAAKzB,GACJ,MACD,KAAKT,GACJyD,EAAO,GACP,KAeF,CAMC,GALI8E,IACHA,EAAQ/e,EAAK,UAAU,EAAK,GAE7B+e,EAAM,cAAgBrG,EACtBqG,EAAM,WAAa,KAChB9E,EAEF,QADIE,EAAQna,EAAK,WACXma,GACL4E,EAAM,YAAY1C,GAAW3D,EAAIyB,EAAMF,CAAI,CAAC,EAC5CE,EAAQA,EAAM,YAGhB,OAAO4E,CACR,CAIA,SAAS7E,GAAUxB,EAAI1Y,EAAKia,EAAK,CAChC,IAAI8E,EAAQ,IAAI/e,EAAK,YACrB,QAAS1J,KAAK0J,EACb,GAAI,OAAO,UAAU,eAAe,KAAKA,EAAM1J,CAAC,EAAG,CAClD,IAAImH,EAAIuC,EAAK1J,CAAC,EACV,OAAOmH,GAAK,UACXA,GAAKshB,EAAMzoB,CAAC,IACfyoB,EAAMzoB,CAAC,EAAImH,EAGhB,CAMC,OAJGuC,EAAK,aACP+e,EAAM,WAAa,IAAIrH,IAExBqH,EAAM,cAAgBrG,EACdqG,EAAM,SAAQ,CACtB,KAAKxI,GACJ,IAAI7K,EAAQ1L,EAAK,WACbgf,EAASD,EAAM,WAAa,IAAI3G,GAChC9gB,EAAMoU,EAAM,OAChBsT,EAAO,cAAgBD,EACvB,QAAQ7nB,EAAE,EAAEA,EAAEI,EAAIJ,IACjB6nB,EAAM,iBAAiB7E,GAAUxB,EAAIhN,EAAM,KAAKxU,CAAC,EAAE,EAAI,CAAC,EAEzD,MACD,KAAKsf,GACJyD,EAAO,EACT,CACC,GAAGA,EAEF,QADIE,EAAQna,EAAK,WACXma,GACL4E,EAAM,YAAY7E,GAAUxB,EAAIyB,EAAMF,CAAI,CAAC,EAC3CE,EAAQA,EAAM,YAGhB,OAAO4E,CACR,CAEA,SAAS5G,GAAQhD,EAAO3a,EAAIb,EAAM,CACjCwb,EAAO3a,CAAG,EAAIb,CACf,CAEA,GAAG,CACF,GAAG,OAAO,eAAe,CAiCxB,IAASslB,EAAT,SAAwBjf,EAAK,CAC5B,OAAOA,EAAK,SAAQ,CACpB,KAAKuW,GACL,KAAKU,GACJ,IAAIpD,EAAM,CAAE,EAEZ,IADA7T,EAAOA,EAAK,WACNA,GACFA,EAAK,WAAW,GAAKA,EAAK,WAAY,GACxC6T,EAAI,KAAKoL,EAAejf,CAAI,CAAC,EAE9BA,EAAOA,EAAK,YAEb,OAAO6T,EAAI,KAAK,EAAE,EACnB,QACC,OAAO7T,EAAK,SAChB,CACA,EAhDE,OAAO,eAAe8X,GAAa,UAAU,SAAS,CACrD,IAAI,UAAU,CACb,OAAAE,GAAgB,IAAI,EACb,KAAK,QAChB,CACA,CAAG,EAED,OAAO,eAAe0B,GAAK,UAAU,cAAc,CAClD,IAAI,UAAU,CACb,OAAOuF,EAAe,IAAI,CAC1B,EAED,IAAI,SAAS/a,EAAK,CACjB,OAAO,KAAK,SAAQ,CACpB,KAAKqS,GACL,KAAKU,GACJ,KAAM,KAAK,YACV,KAAK,YAAY,KAAK,UAAU,GAE9B/S,GAAQ,OAAOA,CAAI,IACrB,KAAK,YAAY,KAAK,cAAc,eAAeA,CAAI,CAAC,EAEzD,MAED,QACC,KAAK,KAAOA,EACZ,KAAK,MAAQA,EACb,KAAK,UAAYA,CACtB,CACA,CACG,CAAA,EAoBDiU,GAAU,SAAShD,EAAO3a,EAAIb,EAAM,CAEnCwb,EAAO,KAAK3a,CAAG,EAAIb,CACtB,CACA,CACA,MAAS,CACT,CAGCulB,GAAA,aAAuBzF,GACvByF,GAAA,aAAuB1H,GACvB0H,GAAA,kBAA4BjG,GAC5BiG,GAAA,QAAkBpC,GAClBoC,GAAA,KAAexF,GACfwF,GAAA,SAAmBxH,GACnBwH,GAAA,cAAwBnB,gCC5yDzB,IAAI7I,EAASvf,GAAyB,OAStCwpB,EAAA,aAAuBjK,EAAO,CAC7B,IAAK,IACL,KAAM,IACN,GAAI,IACJ,GAAI,IACJ,KAAM,GACP,CAAC,EAgBDiK,EAAA,cAAwBjK,EAAO,CAC9B,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,GAAI,IACJ,IAAK,IACL,IAAK,KACL,MAAO,IACP,MAAO,IACP,MAAO,IACP,IAAK,IACL,IAAK,IACL,MAAO,IACP,MAAO,IACP,GAAI,IACJ,IAAK,KACL,IAAK,KACL,OAAQ,IACR,OAAQ,IACR,QAAS,IACT,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,OAAQ,IACR,KAAM,IACN,SAAU,IACV,KAAM,IACN,IAAK,IACL,KAAM,IACN,MAAO,IACP,OAAQ,IACR,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,MAAO,IACP,QAAS,IACT,SAAU,IACV,OAAQ,IACR,MAAO,IACP,QAAS,IACT,MAAO,IACP,MAAO,IACP,KAAM,KACN,KAAM,KACN,GAAI,IACJ,OAAQ,IACR,IAAK,IACL,IAAK,IACL,KAAM,IACN,KAAM,IACN,cAAe,IACf,OAAQ,IACR,SAAU,IACV,MAAO,IACP,MAAO,IACP,KAAM,KACN,KAAM,KACN,OAAQ,IACR,IAAK,IACL,MAAO,IACP,QAAS,IACT,OAAQ,IACR,OAAQ,IACR,KAAM,IACN,KAAM,IACN,SAAU,IACV,MAAO,IACP,SAAU,IACV,YAAa,IACb,UAAW,IACX,QAAS,IACT,UAAW,IACX,UAAW,IACX,KAAM,IACN,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,SAAU,IACV,KAAM,IACN,SAAU,IACV,MAAO,IACP,IAAK,IACL,IAAK,IACL,MAAO,IACP,OAAQ,IACR,QAAS,IACT,QAAS,IACT,QAAS,IACT,MAAO,IACP,OAAQ,IACR,WAAY,IACZ,KAAM,IACN,KAAM,IACN,KAAM,IACN,QAAS,IACT,IAAK,KACL,IAAK,KACL,OAAQ,IACR,QAAS,IACT,OAAQ,IACR,QAAS,IACT,SAAU,IACV,UAAW,IACX,SAAU,IACV,QAAS,IACT,gBAAiB,IACjB,cAAe,IACf,SAAU,IACV,OAAQ,IACR,SAAU,IACV,OAAQ,IACR,aAAc,IACd,YAAa,IACb,cAAe,IACf,kBAAmB,IACnB,kBAAmB,IACnB,mBAAoB,IACpB,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,IAAK,KACL,QAAS,KACT,KAAM,IACN,KAAM,IACN,KAAM,KACN,KAAM,KACN,IAAK,IACL,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,KAAM,IACN,KAAM,IACN,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,SAAU,IACV,QAAS,IACT,SAAU,IACV,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,KAAM,IACN,KAAM,IACN,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,OAAQ,IACR,MAAO,IACP,MAAO,IACP,OAAQ,IACR,KAAM,IACN,KAAM,KACN,MAAO,IACP,KAAM,IACN,MAAO,IACP,KAAM,KACN,MAAO,IACP,SAAU,IACV,KAAM,IACN,OAAQ,IACR,KAAM,IACN,MAAO,IACP,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,IAAK,IACL,IAAK,IACL,OAAQ,IACR,SAAU,IACV,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,qBAAsB,IACtB,KAAM,KACN,MAAO,IACP,MAAO,IACP,QAAS,IACT,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,MAAO,IACP,QAAS,IACT,MAAO,IACP,QAAS,IACT,KAAM,IACN,KAAM,IACN,MAAO,IACP,QAAS,IACT,QAAS,IACT,KAAM,IACN,UAAW,IACX,UAAW,IACX,IAAK,IACL,IAAK,KACL,KAAM,IACN,KAAM,IACN,MAAO,IACP,UAAW,IACX,IAAK,IACL,IAAK,IACL,IAAK,IACL,KAAM,IACN,OAAQ,IACR,gBAAiB,IACjB,iBAAkB,IAClB,WAAY,IACZ,YAAa,IACb,YAAa,IACb,UAAW,IACX,SAAU,IACV,SAAU,IACV,YAAa,IACb,WAAY,IACZ,YAAa,IACb,KAAM,IACN,KAAM,IACN,SAAU,IACV,OAAQ,IACR,QAAS,IACT,yBAA0B,IAC1B,sBAAuB,IACvB,gBAAiB,IACjB,MAAO,IACP,SAAU,IACV,MAAO,IACP,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,QAAS,IACT,MAAO,IACP,OAAQ,IACR,KAAM,IACN,OAAQ,IACR,WAAY,IACZ,UAAW,IACX,KAAM,IACN,QAAS,IACT,UAAW,IACX,OAAQ,IACR,OAAQ,IACR,gBAAiB,IACjB,KAAM,IACN,KAAM,KACN,OAAQ,IACR,UAAW,IACX,KAAM,IACN,KAAM,IACN,OAAQ,IACR,gCAAiC,IACjC,MAAO,IACP,MAAO,IACP,MAAO,IACP,KAAM,KACN,KAAM,KACN,KAAM,IACN,MAAO,IACP,KAAM,IACN,MAAO,IACP,MAAO,IACP,QAAS,IACT,QAAS,IACT,MAAO,IACP,MAAO,IACP,OAAQ,IACR,QAAS,IACT,IAAK,IACL,IAAK,IACL,SAAU,IACV,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,KAAM,KACN,OAAQ,IACR,QAAS,IACT,YAAa,IACb,YAAa,IACb,SAAU,IACV,WAAY,IACZ,OAAQ,IACR,eAAgB,IAChB,gBAAiB,IACjB,MAAO,IACP,MAAO,IACP,SAAU,IACV,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,KAAM,IACN,KAAM,IACN,KAAM,IACN,KAAM,IACN,MAAO,IACP,MAAO,IACP,QAAS,IACT,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,IAAK,IACL,IAAK,IACL,GAAI,IACJ,GAAI,IACJ,QAAS,IACT,MAAO,IACP,SAAU,IACV,QAAS,IACT,IAAK,IACL,IAAK,IACL,MAAO,IACP,MAAO,IACP,QAAS,IACT,OAAQ,IACR,IAAK,KACL,IAAK,KACL,KAAM,IACN,MAAO,IACP,MAAO,IACP,iBAAkB,IAClB,eAAgB,IAChB,uBAAwB,IACxB,iBAAkB,IAClB,iBAAkB,IAClB,KAAM,IACN,QAAS,IACT,QAAS,IACT,YAAa,IACb,MAAO,IACP,IAAK,IACL,cAAe,IACf,QAAS,IACT,MAAO,IACP,IAAK,IACL,OAAQ,IACR,cAAe,IACf,OAAQ,IACR,KAAM,IACN,KAAM,IACN,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,KAAM,KACN,KAAM,KACN,IAAK,IACL,IAAK,IACL,OAAQ,IACR,MAAO,IACP,SAAU,IACV,SAAU,IACV,SAAU,IACV,QAAS,IACT,UAAW,IACX,eAAgB,IAChB,sBAAuB,IACvB,UAAW,IACX,gBAAiB,IACjB,gBAAiB,IACjB,qBAAsB,IACtB,cAAe,IACf,oBAAqB,IACrB,yBAA0B,IAC1B,qBAAsB,IACtB,iBAAkB,IAClB,eAAgB,IAChB,cAAe,IACf,kBAAmB,IACnB,kBAAmB,IACnB,UAAW,IACX,UAAW,IACX,UAAW,IACX,aAAc,IACd,iBAAkB,IAClB,UAAW,IACX,eAAgB,IAChB,gBAAiB,IACjB,iBAAkB,IAClB,oBAAqB,IACrB,kBAAmB,IACnB,eAAgB,IAChB,kBAAmB,IACnB,mBAAoB,IACpB,gBAAiB,IACjB,mBAAoB,IACpB,QAAS,IACT,aAAc,IACd,SAAU,IACV,OAAQ,IACR,OAAQ,IACR,KAAM,KACN,KAAM,KACN,KAAM,IACN,KAAM,IACN,KAAM,IACN,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,KAAM,IACN,MAAO,IACP,MAAO,IACP,MAAO,IACP,QAAS,IACT,KAAM,IACN,KAAM,IACN,SAAU,IACV,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,KAAM,IACN,MAAO,IACP,MAAO,IACP,OAAQ,IACR,IAAK,IACL,IAAK,IACL,MAAO,IACP,KAAM,IACN,KAAM,IACN,KAAM,IACN,GAAI,IACJ,MAAO,IACP,IAAK,KACL,IAAK,KACL,GAAI,IACJ,OAAQ,IACR,OAAQ,IACR,IAAK,IACL,OAAQ,IACR,GAAI,IACJ,QAAS,IACT,SAAU,IACV,IAAK,IACL,IAAK,IACL,OAAQ,IACR,MAAO,IACP,MAAO,IACP,MAAO,IACP,SAAU,IACV,iBAAkB,IAClB,OAAQ,IACR,qBAAsB,IACtB,KAAM,IACN,OAAQ,IACR,OAAQ,IACR,IAAK,IACL,IAAK,IACL,KAAM,IACN,MAAO,IACP,MAAO,IACP,KAAM,KACN,KAAM,KACN,KAAM,IACN,OAAQ,IACR,MAAO,IACP,KAAM,IACN,QAAS,IACT,QAAS,IACT,MAAO,IACP,OAAQ,IACR,QAAS,IACT,MAAO,IACP,WAAY,IACZ,YAAa,IACb,MAAO,IACP,OAAQ,IACR,WAAY,IACZ,OAAQ,IACR,YAAa,IACb,MAAO,IACP,QAAS,IACT,SAAU,IACV,MAAO,IACP,MAAO,IACP,KAAM,IACN,KAAM,IACN,MAAO,IACP,KAAM,IACN,KAAM,IACN,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,KAAM,IACN,KAAM,IACN,KAAM,IACN,KAAM,IACN,MAAO,IACP,OAAQ,IACR,YAAa,IACb,aAAc,IACd,aAAc,IACd,cAAe,IACf,IAAK,IACL,IAAK,IACL,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,OAAQ,IACR,IAAK,KACL,IAAK,KACL,MAAO,IACP,kBAAmB,IACnB,sBAAuB,IACvB,MAAO,KACP,KAAM,IACN,MAAO,IACP,MAAO,IACP,KAAM,IACN,KAAM,KACN,KAAM,KACN,OAAQ,IACR,OAAQ,IACR,KAAM,IACN,MAAO,IACP,WAAY,IACZ,SAAU,IACV,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,MAAO,IACP,KAAM,IACN,KAAM,KACN,OAAQ,IACR,MAAO,IACP,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,IAAK,IACL,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,MAAO,IACP,IAAK,IACL,IAAK,IACL,KAAM,IACN,KAAM,IACN,GAAI,IACJ,GAAI,IACJ,IAAK,IACL,IAAK,IACL,IAAK,IACL,KAAM,IACN,SAAU,IACV,IAAK,IACL,MAAO,IACP,OAAQ,IACR,QAAS,IACT,SAAU,IACV,KAAM,KACN,OAAQ,IACR,IAAK,KACL,IAAK,KACL,GAAI,IACJ,GAAI,IACJ,IAAK,IACL,MAAO,IACP,KAAM,IACN,KAAM,IACN,GAAI,IACJ,IAAK,IACL,IAAK,IACL,IAAK,IACL,KAAM,IACN,SAAU,IACV,IAAK,IACL,IAAK,IACL,KAAM,IACN,MAAO,IACP,MAAO,IACP,KAAM,KACN,KAAM,KACN,MAAO,IACP,aAAc,IACd,iBAAkB,IAClB,iBAAkB,IAClB,eAAgB,IAChB,YAAa,IACb,kBAAmB,IACnB,aAAc,IACd,KAAM,KACN,KAAM,IACN,KAAM,IACN,MAAO,IACP,MAAO,IACP,GAAI,IACJ,GAAI,IACJ,GAAI,IACJ,KAAM,IACN,MAAO,IACP,MAAO,IACP,OAAQ,IACR,QAAS,IACT,UAAW,IACX,OAAQ,IACR,OAAQ,IACR,UAAW,IACX,WAAY,IACZ,QAAS,IACT,OAAQ,IACR,UAAW,KACX,KAAM,KACN,MAAO,IACP,OAAQ,IACR,KAAM,IACN,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,KAAM,IACN,KAAM,IACN,QAAS,IACT,MAAO,IACP,IAAK,IACL,KAAM,IACN,MAAO,IACP,MAAO,IACP,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,OAAQ,IACR,IAAK,IACL,IAAK,KACL,aAAc,IACd,SAAU,IACV,SAAU,IACV,MAAO,IACP,OAAQ,IACR,cAAe,IACf,eAAgB,IAChB,KAAM,IACN,KAAM,KACN,OAAQ,IACR,eAAgB,IAChB,KAAM,IACN,KAAM,KACN,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,aAAc,IACd,UAAW,IACX,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,GAAI,IACJ,MAAO,IACP,MAAO,IACP,IAAK,IACL,IAAK,IACL,KAAM,IACN,KAAM,IACN,KAAM,IACN,MAAO,IACP,IAAK,IACL,IAAK,IACL,IAAK,KACL,OAAQ,IACR,OAAQ,IACR,GAAI,IACJ,OAAQ,IACR,MAAO,IACP,OAAQ,IACR,MAAO,IACP,MAAO,IACP,MAAO,IACP,GAAI,IACJ,MAAO,IACP,MAAO,IACP,MAAO,IACP,WAAY,IACZ,SAAU,IACV,SAAU,IACV,MAAO,IACP,KAAM,IACN,MAAO,IACP,QAAS,IACT,GAAI,IACJ,OAAQ,IACR,MAAO,IACP,SAAU,IACV,OAAQ,IACR,IAAK,IACL,IAAK,IACL,OAAQ,IACR,SAAU,IACV,SAAU,IACV,SAAU,IACV,aAAc,IACd,SAAU,IACV,QAAS,IACT,eAAgB,IAChB,eAAgB,IAChB,KAAM,IACN,KAAM,IACN,MAAO,IACP,MAAO,IACP,KAAM,KACN,KAAM,KACN,KAAM,IACN,KAAM,IACN,MAAO,IACP,OAAQ,IACR,KAAM,IACN,KAAM,KACN,KAAM,IACN,QAAS,IACT,MAAO,IACP,MAAO,IACP,OAAQ,IACR,MAAO,IACP,GAAI,IACJ,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,MAAO,IACP,KAAM,IACN,KAAM,IACN,MAAO,IACP,MAAO,IACP,IAAK,IACL,IAAK,IACL,IAAK,KACL,IAAK,KACL,MAAO,IACP,KAAM,KACN,KAAM,KACN,KAAM,KACN,KAAM,KACN,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,IAAK,IACL,IAAK,IACL,IAAK,KACL,IAAK,KACL,OAAQ,IACR,KAAM,IACN,KAAM,IACN,KAAM,IACN,KAAM,IACN,KAAM,KACN,KAAM,KACN,KAAM,KACN,KAAM,KACN,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,SAAU,IACV,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,KAAM,IACN,KAAM,IACN,MAAO,IACP,OAAQ,IACR,IAAK,IACL,WAAY,IACZ,MAAO,IACP,KAAM,IACN,KAAM,IACN,KAAM,IACN,MAAO,IACP,QAAS,IACT,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,QAAS,IACT,OAAQ,IACR,IAAK,IACL,OAAQ,IACR,OAAQ,IACR,KAAM,IACN,MAAO,KACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,QAAS,IACT,QAAS,IACT,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,KAAM,IACN,IAAK,IACL,IAAK,IACL,KAAM,IACN,MAAO,IACP,OAAQ,IACR,QAAS,IACT,SAAU,IACV,KAAM,IACN,GAAI,IACJ,GAAI,IACJ,iBAAkB,IAClB,UAAW,IACX,UAAW,IACX,UAAW,IACX,aAAc,IACd,oBAAqB,IACrB,cAAe,IACf,YAAa,IACb,kBAAmB,IACnB,kBAAmB,IACnB,eAAgB,IAChB,kBAAmB,IACnB,UAAW,IACX,gBAAiB,IACjB,cAAe,IACf,eAAgB,IAChB,eAAgB,IAChB,eAAgB,IAChB,eAAgB,IAChB,gBAAiB,IACjB,kBAAmB,IACnB,oBAAqB,IACrB,gBAAiB,IACjB,QAAS,IACT,aAAc,IACd,cAAe,IACf,eAAgB,IAChB,aAAc,IACd,gBAAiB,IACjB,kBAAmB,IACnB,iBAAkB,IAClB,gBAAiB,IACjB,aAAc,IACd,gBAAiB,IACjB,WAAY,IACZ,cAAe,IACf,IAAK,IACL,IAAK,IACL,IAAK,IACL,KAAM,IACN,SAAU,IACV,IAAK,IACL,MAAO,IACP,OAAQ,IACR,QAAS,IACT,SAAU,IACV,KAAM,KACN,OAAQ,IACR,WAAY,IACZ,QAAS,IACT,UAAW,IACX,WAAY,IACZ,iBAAkB,IAClB,cAAe,IACf,YAAa,IACb,QAAS,IACT,SAAU,IACV,QAAS,IACT,eAAgB,IAChB,UAAW,IACX,OAAQ,IACR,OAAQ,IACR,IAAK,KACL,IAAK,KACL,GAAI,IACJ,IAAK,IACL,KAAM,IACN,MAAO,IACP,MAAO,IACP,OAAQ,IACR,MAAO,IACP,KAAM,IACN,KAAM,IACN,GAAI,IACJ,GAAI,IACJ,MAAO,IACP,SAAU,IACV,WAAY,IACZ,OAAQ,IACR,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,WAAY,IACZ,KAAM,IACN,SAAU,IACV,IAAK,IACL,IAAK,IACL,KAAM,IACN,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,cAAe,IACf,cAAe,IACf,cAAe,IACf,mBAAoB,IACpB,mBAAoB,IACpB,mBAAoB,IACpB,WAAY,IACZ,eAAgB,IAChB,eAAgB,IAChB,eAAgB,IAChB,cAAe,IACf,eAAgB,IAChB,MAAO,IACP,KAAM,KACN,KAAM,KACN,OAAQ,IACR,QAAS,IACT,OAAQ,IACR,OAAQ,IACR,eAAgB,IAChB,gBAAiB,IACjB,IAAK,IACL,QAAS,IACT,KAAM,IACN,KAAM,IACN,OAAQ,IACR,MAAO,IACP,SAAU,IACV,MAAO,IACP,OAAQ,IACR,IAAK,IACL,MAAO,IACP,OAAQ,IACR,KAAM,IACN,KAAM,KACN,IAAK,IACL,IAAK,IACL,KAAM,IACN,MAAO,IACP,MAAO,IACP,KAAM,IACN,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,GAAI,IACJ,GAAI,IACJ,GAAI,IACJ,KAAM,IACN,MAAO,IACP,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,QAAS,IACT,KAAM,IACN,MAAO,IACP,MAAO,IACP,OAAQ,IACR,SAAU,IACV,QAAS,IACT,UAAW,KACX,KAAM,KACN,KAAM,IACN,KAAM,IACN,KAAM,IACN,QAAS,IACT,IAAK,IACL,IAAK,IACL,OAAQ,IACR,WAAY,IACZ,WAAY,IACZ,SAAU,IACV,OAAQ,IACR,OAAQ,IACR,IAAK,IACL,IAAK,IACL,MAAO,IACP,MAAO,IACP,cAAe,IACf,YAAa,IACb,UAAW,IACX,IAAK,KACL,IAAK,KACL,IAAK,IACL,MAAO,IACP,IAAK,IACL,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,QAAS,IACT,UAAW,IACX,KAAM,IACN,KAAM,IACN,OAAQ,IACR,OAAQ,IACR,KAAM,KACN,KAAM,KACN,GAAI,IACJ,KAAM,IACN,KAAM,KACN,OAAQ,IACR,GAAI,IACJ,GAAI,IACJ,SAAU,IACV,MAAO,IACP,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,KAAM,KACN,IAAK,IACL,KAAM,KACN,MAAO,KACP,MAAO,IACP,QAAS,IACT,MAAO,IACP,QAAS,IACT,SAAU,IACV,KAAM,IACN,MAAO,KACP,OAAQ,KACR,KAAM,IACN,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,SAAU,KACV,KAAM,IACN,IAAK,IACL,IAAK,IACL,MAAO,IACP,GAAI,IACJ,OAAQ,IACR,MAAO,IACP,MAAO,IACP,QAAS,IACT,MAAO,KACP,oBAAqB,IACrB,mBAAoB,IACpB,kBAAmB,IACnB,sBAAuB,IACvB,OAAQ,IACR,OAAQ,IACR,MAAO,KACP,qBAAsB,IACtB,eAAgB,IAChB,QAAS;AAAA,EACT,OAAQ,IACR,QAAS,IACT,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,IACL,KAAM,IACN,MAAO,KACP,UAAW,KACX,KAAM,KACN,IAAK,KACL,MAAO,IACP,IAAK,KACL,IAAK,IACL,KAAM,IACN,KAAM,KACN,MAAO,IACP,MAAO,IACP,MAAO,IACP,GAAI,IACJ,IAAK,IACL,KAAM,IACN,IAAK,IACL,KAAM,IACN,KAAM,IACN,MAAO,IACP,MAAO,IACP,KAAM,IACN,IAAK,KACL,IAAK,IACL,WAAY,IACZ,WAAY,IACZ,gBAAiB,IACjB,gBAAiB,IACjB,KAAM,IACN,MAAO,KACP,UAAW,KACX,KAAM,KACN,MAAO,IACP,IAAK,KACL,MAAO,IACP,IAAK,KACL,IAAK,IACL,MAAO,IACP,OAAQ,IACR,KAAM,KACN,KAAM,IACN,QAAS,IACT,iBAAkB,IAClB,KAAM,IACN,KAAM,KACN,IAAK,IACL,IAAK,IACL,aAAc,IACd,UAAW,IACX,qBAAsB,IACtB,WAAY,IACZ,SAAU,IACV,cAAe,KACf,UAAW,IACX,WAAY,IACZ,gBAAiB,IACjB,oBAAqB,KACrB,kBAAmB,KACnB,eAAgB,IAChB,qBAAsB,KACtB,gBAAiB,IACjB,gBAAiB,KACjB,aAAc,KACd,MAAO,IACP,SAAU,KACV,OAAQ,KACR,QAAS,IACT,QAAS,IACT,QAAS,IACT,gBAAiB,IACjB,mBAAoB,KACpB,qBAAsB,IACtB,QAAS,IACT,aAAc,IACd,eAAgB,IAChB,YAAa,KACb,kBAAmB,KACnB,aAAc,IACd,wBAAyB,KACzB,kBAAmB,KACnB,MAAO,IACP,QAAS,IACT,QAAS,IACT,QAAS,IACT,YAAa,IACb,iBAAkB,KAClB,sBAAuB,IACvB,kBAAmB,IACnB,iBAAkB,IAClB,oBAAqB,KACrB,sBAAuB,IACvB,gBAAiB,KACjB,qBAAsB,IACtB,kBAAmB,KACnB,uBAAwB,IACxB,UAAW,KACX,eAAgB,IAChB,YAAa,IACb,iBAAkB,KAClB,sBAAuB,IACvB,iBAAkB,KAClB,YAAa,KACb,iBAAkB,IAClB,SAAU,IACV,cAAe,IACf,kBAAmB,IACnB,cAAe,IACf,eAAgB,IAChB,KAAM,IACN,UAAW,IACX,OAAQ,KACR,MAAO,KACP,QAAS,IACT,IAAK,IACL,OAAQ,IACR,KAAM,KACN,MAAO,IACP,QAAS,KACT,MAAO,IACP,MAAO,IACP,OAAQ,KACR,OAAQ,KACR,YAAa,IACb,YAAa,IACb,MAAO,IACP,OAAQ,IACR,IAAK,IACL,OAAQ,IACR,KAAM,KACN,KAAM,KACN,KAAM,KACN,UAAW,IACX,eAAgB,IAChB,KAAM,IACN,MAAO,IACP,OAAQ,IACR,MAAO,IACP,MAAO,IACP,QAAS,IACT,QAAS,IACT,KAAM,IACN,MAAO,KACP,MAAO,IACP,QAAS,KACT,UAAW,IACX,WAAY,KACZ,MAAO,IACP,QAAS,KACT,KAAM,IACN,MAAO,KACP,MAAO,IACP,QAAS,KACT,UAAW,IACX,WAAY,KACZ,KAAM,IACN,OAAQ,IACR,OAAQ,IACR,KAAM,IACN,cAAe,IACf,gBAAiB,IACjB,eAAgB,IAChB,iBAAkB,IAClB,GAAI,IACJ,GAAI,IACJ,IAAK,IACL,OAAQ,IACR,MAAO,IACP,KAAM,KACN,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,KAAM,KACN,KAAM,KACN,OAAQ,IACR,QAAS,IACT,OAAQ,IACR,KAAM,KACN,KAAM,KACN,QAAS,KACT,OAAQ,IACR,QAAS,KACT,MAAO,KACP,OAAQ,IACR,MAAO,IACP,MAAO,IACP,QAAS,IACT,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,KAAM,IACN,KAAM,IACN,MAAO,IACP,MAAO,IACP,IAAK,IACL,IAAK,IACL,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,KAAM,IACN,KAAM,IACN,OAAQ,IACR,MAAO,IACP,MAAO,IACP,MAAO,IACP,IAAK,KACL,IAAK,KACL,KAAM,IACN,OAAQ,IACR,OAAQ,IACR,IAAK,IACL,MAAO,IACP,IAAK,IACL,KAAM,IACN,MAAO,IACP,MAAO,IACP,QAAS,IACT,MAAO,IACP,IAAK,IACL,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,QAAS,IACT,QAAS,IACT,KAAM,IACN,OAAQ,IACR,KAAM,KACN,KAAM,KACN,KAAM,IACN,qBAAsB,IACtB,eAAgB,IAChB,MAAO,IACP,MAAO,IACP,GAAI,IACJ,GAAI,IACJ,MAAO,IACP,IAAK,IACL,MAAO,IACP,QAAS,IACT,KAAM,IACN,KAAM,IACN,OAAQ,IACR,KAAM,IACN,QAAS,IACT,IAAK,IACL,GAAI,IACJ,KAAM,KACN,KAAM,IACN,OAAQ,IACR,OAAQ,IACR,KAAM,IACN,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,SAAU,IACV,KAAM,IACN,KAAM,IACN,MAAO,IACP,QAAS,IACT,UAAW,IACX,YAAa,IACb,gBAAiB,IACjB,IAAK,IACL,KAAM,IACN,SAAU,IACV,OAAQ,IACR,MAAO,IACP,KAAM,IACN,SAAU,IACV,IAAK,IACL,IAAK,IACL,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,KAAM,IACN,QAAS,IACT,IAAK,KACL,IAAK,KACL,IAAK,IACL,IAAK,IACL,KAAM,IACN,OAAQ,IACR,MAAO,IACP,GAAI,IACJ,GAAI,IACJ,UAAW,IACX,IAAK,IACL,OAAQ,IACR,QAAS,IACT,OAAQ,IACR,KAAM,IACN,SAAU,IACV,MAAO,IACP,QAAS,IACT,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,UAAW,IACX,OAAQ,IACR,QAAS,IACT,QAAS,IACT,GAAI,IACJ,cAAe,IACf,SAAU,IACV,KAAM,IACN,KAAM,KACN,MAAO,IACP,GAAI,IACJ,GAAI,IACJ,KAAM,IACN,MAAO,IACP,IAAK,IACL,IAAK,IACL,KAAM,IACN,WAAY,IACZ,YAAa,IACb,SAAU,IACV,cAAe,IACf,mBAAoB,IACpB,cAAe,IACf,OAAQ,IACR,YAAa,IACb,SAAU,IACV,SAAU,IACV,QAAS,IACT,MAAO,IACP,MAAO,IACP,OAAQ,IACR,MAAO,IACP,KAAM,IACN,OAAQ,IACR,KAAM,IACN,QAAS,IACT,SAAU,IACV,SAAU,IACV,SAAU,IACV,KAAM,IACN,WAAY,IACZ,aAAc,IACd,OAAQ,IACR,MAAO,IACP,OAAQ,IACR,KAAM,KACN,KAAM,KACN,IAAK,IACL,IAAK,IACL,OAAQ,IACR,IAAK,KACL,IAAK,KACL,KAAM,IACN,KAAM,IACN,KAAM,KACN,OAAQ,IACR,KAAM,KACN,KAAM,KACN,YAAa,IACb,QAAS,IACT,MAAO,IACP,QAAS,IACT,KAAM,IACN,KAAM,IACN,MAAO,IACP,KAAM,KACN,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,SAAU,IACV,KAAM,IACN,KAAM,IACN,MAAO,IACP,MAAO,IACP,OAAQ,IACR,MAAO,IACP,KAAM,IACN,KAAM,IACN,KAAM,IACN,OAAQ,IACR,MAAO,IACP,QAAS,IACT,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,QAAS,IACT,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,UAAW,IACX,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,QAAS,IACT,QAAS,IACT,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,KAAM,IACN,IAAK,IACL,IAAK,IACL,KAAM,IACN,QAAS,IACT,MAAO,IACP,OAAQ,IACR,KAAM,IACN,GAAI,IACJ,KAAM,IACN,QAAS,IACT,SAAU,IACV,MAAO,IACP,KAAM,IACN,IAAK,IACL,IAAK,IACL,eAAgB,IAChB,mBAAoB,IACpB,qBAAsB,IACtB,OAAQ,IACR,OAAQ,IACR,IAAK,IACL,IAAK,KACL,KAAM,IACN,MAAO,IACP,MAAO,IACP,OAAQ,IACR,IAAK,IACL,IAAK,IACL,KAAM,IACN,kBAAmB,IACnB,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,cAAe,IACf,oBAAqB,IACrB,eAAgB,IAChB,aAAc,IACd,mBAAoB,IACpB,mBAAoB,IACpB,gBAAiB,IACjB,mBAAoB,IACpB,WAAY,IACZ,iBAAkB,IAClB,eAAgB,IAChB,gBAAiB,IACjB,kBAAmB,IACnB,iBAAkB,IAClB,gBAAiB,IACjB,SAAU,IACV,cAAe,IACf,eAAgB,IAChB,gBAAiB,IACjB,cAAe,IACf,iBAAkB,IAClB,mBAAoB,IACpB,kBAAmB,IACnB,iBAAkB,IAClB,cAAe,IACf,iBAAkB,IAClB,YAAa,IACb,eAAgB,IAChB,KAAM,IACN,aAAc,IACd,MAAO,IACP,MAAO,IACP,IAAK,IACL,OAAQ,IACR,WAAY,IACZ,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,KAAM,IACN,KAAM,KACN,OAAQ,IACR,QAAS,IACT,aAAc,IACd,KAAM,IACN,OAAQ,IACR,SAAU,IACV,MAAO,IACP,YAAa,IACb,OAAQ,IACR,KAAM,IACN,KAAM,KACN,IAAK,IACL,IAAK,IACL,KAAM,IACN,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,KAAM,IACN,MAAO,IACP,MAAO,IACP,SAAU,IACV,YAAa,IACb,QAAS,IACT,GAAI,IACJ,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,GAAI,IACJ,GAAI,IACJ,KAAM,IACN,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,IAAK,IACL,IAAK,IACL,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,MAAO,IACP,MAAO,IACP,KAAM,IACN,OAAQ,IACR,SAAU,IACV,MAAO,IACP,IAAK,IACL,IAAK,IACL,KAAM,IACN,MAAO,IACP,MAAO,IACP,OAAQ,IACR,MAAO,IACP,MAAO,IACP,QAAS,IACT,KAAM,IACN,KAAM,IACN,OAAQ,IACR,SAAU,IACV,MAAO,IACP,KAAM,IACN,IAAK,KACL,IAAK,KACL,OAAQ,IACR,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,KAAM,IACN,KAAM,IACN,eAAgB,IAChB,eAAgB,IAChB,SAAU,IACV,cAAe,IACf,gBAAiB,IACjB,aAAc,IACd,IAAK,IACL,MAAO,IACP,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,IAAK,IACL,OAAQ,IACR,KAAM,IACN,MAAO,IACP,KAAM,IACN,MAAO,IACP,KAAM,IACN,MAAO,IACP,MAAO,IACP,QAAS,IACT,QAAS,IACT,MAAO,IACP,YAAa,IACb,cAAe,IACf,OAAQ,IACR,SAAU,IACV,KAAM,IACN,MAAO,IACP,IAAK,IACL,KAAM,IACN,MAAO,KACP,OAAQ,IACR,OAAQ,IACR,IAAK,IACL,KAAM,IACN,OAAQ,IACR,KAAM,KACN,KAAM,KACN,OAAQ,IACR,UAAW,IACX,KAAM,IACN,MAAO,IACP,OAAQ,KACR,MAAO,IACP,OAAQ,KACR,KAAM,IACN,MAAO,IACP,OAAQ,IACR,SAAU,IACV,WAAY,IACZ,MAAO,IACP,OAAQ,IACR,SAAU,IACV,WAAY,IACZ,IAAK,IACL,OAAQ,IACR,OAAQ,IACR,mBAAoB,IACpB,aAAc,IACd,kBAAmB,IACnB,eAAgB,IAChB,oBAAqB,IACrB,YAAa,IACb,OAAQ,IACR,KAAM,IACN,MAAO,IACP,KAAM,KACN,KAAM,KACN,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,KAAM,IACN,KAAM,IACN,MAAO,IACP,gBAAiB,IACjB,YAAa,IACb,MAAO,IACP,IAAK,IACL,IAAK,IACL,OAAQ,IACR,KAAM,IACN,KAAM,IACN,QAAS,IACT,QAAS,IACT,MAAO,IACP,MAAO,IACP,QAAS,IACT,QAAS,IACT,OAAQ,IACR,OAAQ,IACR,SAAU,IACV,UAAW,IACX,YAAa,IACb,UAAW,IACX,WAAY,IACZ,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,KAAM,IACN,WAAY,IACZ,YAAa,IACb,SAAU,IACV,cAAe,IACf,mBAAoB,IACpB,cAAe,IACf,OAAQ,IACR,YAAa,IACb,SAAU,IACV,SAAU,IACV,QAAS,IACT,SAAU,IACV,IAAK,IACL,IAAK,IACL,KAAM,IACN,IAAK,IACL,IAAK,IACL,KAAM,IACN,KAAM,IACN,KAAM,IACN,OAAQ,IACR,QAAS,IACT,KAAM,IACN,KAAM,IACN,QAAS,IACT,SAAU,IACV,cAAe,IACf,QAAS,IACT,QAAS,IACT,QAAS,IACT,QAAS,IACT,MAAO,IACP,MAAO,IACP,QAAS,IACT,OAAQ,IACR,OAAQ,IACR,SAAU,IACV,UAAW,IACX,UAAW,IACX,WAAY,IACZ,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,MAAO,IACP,QAAS,IACT,OAAQ,IACR,MAAO,IACP,IAAK,IACL,OAAQ,IACR,IAAK,IACL,IAAK,IACL,KAAM,IACN,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,IAAK,IACL,IAAK,IACL,KAAM,IACN,OAAQ,IACR,IAAK,KACL,IAAK,KACL,OAAQ,IACR,UAAW,IACX,UAAW,IACX,MAAO,IACP,MAAO,IACP,SAAU,IACV,OAAQ,IACR,YAAa,IACb,SAAU,IACV,WAAY,KACZ,OAAQ,IACR,UAAW,IACX,MAAO,IACP,OAAQ,IACR,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,WAAY,IACZ,eAAgB,IAChB,WAAY,IACZ,MAAO,IACP,OAAQ,IACR,SAAU,IACV,OAAQ,IACR,KAAM,IACN,KAAM,IACN,IAAK,IACL,OAAQ,IACR,OAAQ,IACR,KAAM,KACN,KAAM,KACN,QAAS,IACT,KAAM,IACN,OAAQ,IACR,MAAO,IACP,MAAO,IACP,SAAU,IACV,aAAc,IACd,aAAc,IACd,eAAgB,IAChB,UAAW,IACX,cAAe,IACf,gBAAiB,IACjB,OAAQ,IACR,KAAM,IACN,SAAU,IACV,UAAW,IACX,QAAS,IACT,MAAO,IACP,QAAS,IACT,SAAU,IACV,KAAM,KACN,KAAM,KACN,KAAM,IACN,KAAM,IACN,MAAO,IACP,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,iBAAkB,IAClB,kBAAmB,IACnB,OAAQ,IACR,OAAQ,IACR,KAAM,IACN,KAAM,IACN,KAAM,IACN,SAAU,IACV,MAAO,IACP,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,MAAO,IACP,IAAK,IACL,IAAK,IACL,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,OAAQ,IACR,IAAK,KACL,IAAK,KACL,OAAQ,IACR,OAAQ,IACR,KAAM,IACN,MAAO,IACP,MAAO,IACP,MAAO,IACP,OAAQ,IACR,SAAU,IACV,OAAQ,IACR,MAAO,IACP,MAAO,IACP,MAAO,IACP,IAAK,IACL,SAAU,IACV,WAAY,IACZ,aAAc,IACd,iBAAkB,IAClB,MAAO,IACP,UAAW,IACX,MAAO,IACP,MAAO,IACP,KAAM,KACN,KAAM,KACN,QAAS,IACT,QAAS,IACT,QAAS,IACT,WAAY,IACZ,iBAAkB,IAClB,YAAa,IACb,YAAa,IACb,YAAa,IACb,cAAe,IACf,cAAe,IACf,eAAgB,IAChB,MAAO,IACP,eAAgB,IAChB,gBAAiB,IACjB,KAAM,IACN,KAAM,IACN,MAAO,IACP,QAAS,IACT,QAAS,IACT,MAAO,IACP,WAAY,IACZ,WAAY,IACZ,OAAQ,IACR,SAAU,IACV,OAAQ,IACR,MAAO,IACP,MAAO,IACP,MAAO,IACP,KAAM,KACN,KAAM,KACN,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,KAAM,IACN,MAAO,IACP,MAAO,IACP,KAAM,IACN,KAAM,IACN,QAAS,IACT,OAAQ,IACR,WAAY,IACZ,SAAU,IACV,WAAY,IACZ,OAAQ,IACR,MAAO,IACP,UAAW,IACX,KAAM,IACN,KAAM,IACN,OAAQ,IACR,SAAU,IACV,aAAc,KACd,cAAe,KACf,aAAc,KACd,cAAe,KACf,SAAU,IACV,gBAAiB,IACjB,iBAAkB,IAClB,KAAM,IACN,KAAM,IACN,MAAO,IACP,IAAK,IACL,IAAK,IACL,MAAO,IACP,MAAO,IACP,MAAO,IACP,MAAO,IACP,OAAQ,IACR,IAAK,IACL,IAAK,IACL,OAAQ,IACR,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,KAAM,IACN,KAAM,IACN,YAAa,IACb,aAAc,IACd,kBAAmB,IACnB,cAAe,IACf,cAAe,IACf,IAAK,KACL,IAAK,KACL,MAAO,IACP,MAAO,KACP,MAAO,KACP,KAAM,KACN,KAAM,KACN,MAAO,IACP,MAAO,IACP,KAAM,KACN,KAAM,KACN,OAAQ,KACR,OAAQ,KACR,OAAQ,KACR,OAAQ,KACR,OAAQ,IACR,QAAS,IACT,MAAO,IACP,MAAO,IACP,OAAQ,IACR,MAAO,IACP,MAAO,IACP,OAAQ,IACR,OAAQ,IACR,IAAK,KACL,IAAK,KACL,KAAM,KACN,KAAM,KACN,GAAI,IACJ,GAAI,IACJ,OAAQ,IACR,KAAM,KACN,KAAM,KACN,KAAM,IACN,MAAO,IACP,KAAM,IACN,MAAO,IACP,IAAK,KACL,IAAK,KACL,MAAO,IACP,MAAO,IACP,GAAI,IACJ,GAAI,IACJ,MAAO,IACP,MAAO,IACP,KAAM,IACN,KAAM,IACN,MAAO,IACP,KAAM,KACN,KAAM,KACN,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,MAAO,IACP,KAAM,KACN,KAAM,KACN,OAAQ,IACR,OAAQ,IACR,MAAO,IACP,KAAM,IACN,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,KAAM,IACN,KAAM,IACN,MAAO,IACP,MAAO,IACP,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,KACL,IAAK,KACL,KAAM,IACN,KAAM,IACN,KAAM,KACN,KAAM,KACN,KAAM,KACN,KAAM,KACN,KAAM,IACN,KAAM,IACN,KAAM,IACN,KAAM,IACN,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,OAAQ,IACR,IAAK,IACL,IAAK,IACL,KAAM,IACN,KAAM,IACN,OAAQ,IACR,eAAgB,IAChB,KAAM,IACN,KAAM,IACN,IAAK,IACL,IAAK,KACL,KAAM,IACN,KAAM,IACN,QAAS,IACT,KAAM,IACN,KAAM,KACN,KAAM,KACN,KAAM,KACN,IAAK,IACL,KAAM,GACP,CAAC,EAMDiK,EAAoB,UAAAA,EAAQ,8BCrnExB1J,GAAY9f,GAAyB,UAKrCypB,GAAgB,mJAChBC,GAAW,IAAI,OAAO,aAAaD,GAAc,OAAO,MAAM,EAAE,EAAE,EAAE,wCAAwC,EAC5GE,GAAiB,IAAI,OAAO,IAAIF,GAAc,OAAOC,GAAS,OAAO,QAASD,GAAc,OAAOC,GAAS,OAAO,MAAM,EAMzHE,GAAQ,EACRC,GAAS,EACTC,GAAa,EACbC,GAAO,EACPC,GAAsB,EACtBC,GAAa,EACbC,GAAc,EACdC,GAAc,EASlB,SAASC,GAAWhjB,EAASijB,EAAS,CACrC,KAAK,QAAUjjB,EACf,KAAK,QAAUijB,EACZ,MAAM,mBAAmB,MAAM,kBAAkB,KAAMD,EAAU,CACrE,CACAA,GAAW,UAAY,IAAI,MAC3BA,GAAW,UAAU,KAAOA,GAAW,KAEvC,SAASE,IAAW,CAEpB,CAEAA,GAAU,UAAY,CACrB,MAAM,SAAS1K,EAAO2K,EAAaC,EAAU,CAC5C,IAAIC,EAAa,KAAK,WACtBA,EAAW,cAAe,EAC1BC,GAAMH,EAAcA,EAAe,CAAE,CAAA,EACrCI,GAAM/K,EAAO2K,EAAaC,EACxBC,EAAW,KAAK,YAAY,EAC9BA,EAAW,YAAa,CAC1B,CACA,EACA,SAASE,GAAM/K,EAAOgL,EAAiBJ,EAAUC,EAAWI,EAAa,CACxE,SAASC,EAAkBhJ,GAAM,CAGhC,GAAIA,GAAO,MAAQ,CAClBA,IAAQ,MACR,IAAIiJ,GAAa,OAAUjJ,IAAQ,IAChCkJ,GAAa,OAAUlJ,GAAO,MAEjC,OAAO,OAAO,aAAaiJ,GAAYC,EAAU,CACpD,KACG,QAAO,OAAO,aAAalJ,EAAI,CAElC,CACC,SAASmJ,EAAehjB,GAAE,CACzB,IAAIJ,GAAII,GAAE,MAAM,EAAE,EAAE,EACpB,OAAI,OAAO,eAAe,KAAKuiB,EAAW3iB,EAAC,EACnC2iB,EAAU3iB,EAAC,EACVA,GAAE,OAAO,CAAC,IAAM,IACjBijB,EAAkB,SAASjjB,GAAE,OAAO,CAAC,EAAE,QAAQ,IAAI,IAAI,CAAC,CAAC,GAEhEgjB,EAAa,MAAM,oBAAoB5iB,EAAC,EACjCA,GAEV,CACC,SAASijB,EAAWnD,GAAI,CACvB,GAAGA,GAAID,EAAM,CACZ,IAAIqD,GAAKvL,EAAO,UAAUkI,EAAMC,EAAG,EAAE,QAAQ,WAAWkD,CAAc,EACtEZ,GAASnc,EAAS4Z,CAAK,EACvB2C,EAAW,WAAWU,GAAG,EAAEpD,GAAID,CAAK,EACpCA,EAAQC,EACX,CACA,CACC,SAAS7Z,EAASL,GAAEpG,GAAE,CACrB,KAAMoG,IAAGud,IAAY3jB,GAAI4jB,EAAY,KAAKzL,CAAM,IAC/C0L,EAAY7jB,GAAE,MACd2jB,EAAUE,EAAY7jB,GAAE,CAAC,EAAE,OAC3B4iB,EAAQ,aAGTA,EAAQ,aAAexc,GAAEyd,EAAU,CACrC,CASC,QARIA,EAAY,EACZF,EAAU,EACVC,EAAc,sBACdhB,EAAUI,EAAW,QAErBc,EAAa,CAAC,CAAC,aAAaX,CAAgB,CAAC,EAC7CY,EAAW,CAAE,EACb1D,EAAQ,IACD,CACV,GAAG,CACF,IAAI2D,EAAW7L,EAAO,QAAQ,IAAIkI,CAAK,EACvC,GAAG2D,EAAS,EAAE,CACb,GAAG,CAAC7L,EAAO,OAAOkI,CAAK,EAAE,MAAM,OAAO,EAAE,CACvC,IAAI/E,EAAM0H,EAAW,IACdtf,EAAO4X,EAAI,eAAenD,EAAO,OAAOkI,CAAK,CAAC,EAClD/E,EAAI,YAAY5X,CAAI,EACpBsf,EAAW,eAAiBtf,CACpC,CACI,MACJ,CAIG,OAHGsgB,EAAS3D,GACXoD,EAAWO,CAAQ,EAEb7L,EAAO,OAAO6L,EAAS,CAAC,EAAC,CAChC,IAAK,IACJ,IAAI1D,EAAMnI,EAAO,QAAQ,IAAI6L,EAAS,CAAC,EACnCzhB,EAAU4V,EAAO,UAAU6L,EAAW,EAAG1D,CAAG,EAAE,QAAQ,eAAgB,EAAE,EACxE2D,EAASH,EAAW,IAAK,EAC1BxD,EAAI,GAEA/d,EAAU4V,EAAO,UAAU6L,EAAS,CAAC,EAAE,QAAQ,UAAU,EAAE,EAC3DZ,EAAa,MAAM,iBAAiB7gB,EAAQ,oBAAoB0hB,EAAO,OAAO,EAC9E3D,EAAM0D,EAAS,EAAEzhB,EAAQ,QACjBA,EAAQ,MAAM,KAAK,IAC3BA,EAAUA,EAAQ,QAAQ,UAAU,EAAE,EACtC6gB,EAAa,MAAM,iBAAiB7gB,EAAQ,qBAAqB,EACjE+d,EAAM0D,EAAS,EAAEzhB,EAAQ,QAEhC,IAAI2hB,EAAaD,EAAO,WACpBE,EAAWF,EAAO,SAAW1hB,EAC7B6hB,EAAoBD,GAAYF,EAAO,SAASA,EAAO,QAAQ,eAAiB1hB,EAAQ,YAAW,EACjG,GAAG6hB,EAAkB,CAE1B,GADMpB,EAAW,WAAWiB,EAAO,IAAIA,EAAO,UAAU1hB,CAAO,EAC5D2hB,EACF,QAASjH,KAAUiH,EACd,OAAO,UAAU,eAAe,KAAKA,EAAYjH,CAAM,GAC1D+F,EAAW,iBAAiB/F,CAAM,EAIjCkH,GACMf,EAAa,WAAW,iBAAiB7gB,EAAQ,2CAA2C0hB,EAAO,QAElH,MACWH,EAAW,KAAKG,CAAM,EAG7B3D,IACA,MAED,IAAK,IACJsC,GAASnc,EAASud,CAAQ,EAC1B1D,EAAM+D,GAAiBlM,EAAO6L,EAAShB,CAAU,EACjD,MACD,IAAK,IACJJ,GAASnc,EAASud,CAAQ,EAC1B1D,EAAMgE,GAASnM,EAAO6L,EAAShB,EAAWI,CAAY,EACtD,MACD,QACCR,GAASnc,EAASud,CAAQ,EAC1B,IAAI7I,EAAK,IAAIoJ,GACTC,GAAeV,EAAWA,EAAW,OAAO,CAAC,EAAE,aAE/CxD,EAAMmE,GAAsBtM,EAAO6L,EAAS7I,EAAGqJ,GAAahB,EAAeJ,CAAY,EACvFlpB,GAAMihB,EAAG,OASb,GANG,CAACA,EAAG,QAAUuJ,GAAcvM,EAAOmI,EAAInF,EAAG,QAAQ4I,CAAQ,IAC5D5I,EAAG,OAAS,GACR4H,EAAU,MACbK,EAAa,QAAQ,wBAAwB,GAG5CR,GAAW1oB,GAAI,CAGjB,QAFIyqB,EAAWC,GAAYhC,EAAQ,EAAE,EAE7B9oB,EAAI,EAAEA,EAAEI,GAAIJ,IAAI,CACvB,IAAI0G,GAAI2a,EAAGrhB,CAAC,EACZ2M,EAASjG,GAAE,MAAM,EACjBA,GAAE,QAAUokB,GAAYhC,EAAQ,CAAA,CAAE,CACxC,CACKI,EAAW,QAAU2B,EAClBE,GAAc1J,EAAG6H,EAAWwB,EAAY,GAC1CV,EAAW,KAAK3I,CAAE,EAEnB6H,EAAW,QAAUJ,CAC1B,MACQiC,GAAc1J,EAAG6H,EAAWwB,EAAY,GAC1CV,EAAW,KAAK3I,CAAE,EAIhB9C,GAAU,OAAO8C,EAAG,GAAG,GAAK,CAACA,EAAG,OACnCmF,EAAMwE,GAAwB3M,EAAOmI,EAAInF,EAAG,QAAQqI,EAAeR,CAAU,EAE7E1C,GAEL,CACG,OAAMlhB,GAAE,CACR,GAAIA,cAAaujB,GAChB,MAAMvjB,GAEPgkB,EAAa,MAAM,wBAAwBhkB,EAAC,EAC5CkhB,EAAM,EACT,CACKA,EAAID,EACNA,EAAQC,EAGRmD,EAAW,KAAK,IAAIO,EAAS3D,CAAK,EAAE,CAAC,CAExC,CACA,CACA,SAASuE,GAAY1kB,EAAEwC,EAAE,CACxB,OAAAA,EAAE,WAAaxC,EAAE,WACjBwC,EAAE,aAAexC,EAAE,aACZwC,CACR,CAMA,SAAS+hB,GAAsBtM,EAAOkI,EAAMlF,EAAGqJ,EAAahB,EAAeJ,EAAa,CAOvF,SAAS2B,EAAaC,EAAOzoB,EAAO0oB,EAAY,CAC3C9J,EAAG,eAAe,eAAe6J,CAAK,GACzC5B,EAAa,WAAW,aAAe4B,EAAQ,YAAY,EAE5D7J,EAAG,SACF6J,EAKAzoB,EAAM,QAAQ,YAAa,GAAG,EAAE,QAAQ,WAAYinB,CAAc,EAClEyB,CACH,CACA,CAKC,QAJIC,EACA3oB,EACA6J,EAAI,EAAEia,EACNpgB,EAAIkiB,KACG,CACV,IAAIlO,EAAIkE,EAAO,OAAO/R,CAAC,EACvB,OAAO6N,EAAC,CACR,IAAK,IACJ,GAAGhU,IAAMmiB,GACR8C,EAAW/M,EAAO,MAAMkI,EAAMja,CAAC,EAC/BnG,EAAIqiB,WACIriB,IAAMoiB,GACdpiB,EAAIqiB,OAGJ,OAAM,IAAI,MAAM,qCAAqC,EAEtD,MACD,IAAK,IACL,IAAK,IACJ,GAAGriB,IAAMqiB,IAAQriB,IAAMmiB,GAQtB,GANGniB,IAAMmiB,KACRgB,EAAa,QAAQ,gCAAgC,EACrD8B,EAAW/M,EAAO,MAAMkI,EAAMja,CAAC,GAEhCia,EAAQja,EAAE,EACVA,EAAI+R,EAAO,QAAQlE,EAAEoM,CAAK,EACvBja,EAAE,EACJ7J,EAAQ4b,EAAO,MAAMkI,EAAOja,CAAC,EAC7B2e,EAAaG,EAAU3oB,EAAO8jB,EAAM,CAAC,EACrCpgB,EAAIuiB,OAGJ,OAAM,IAAI,MAAM,2BAA4BvO,EAAE,SAAU,UAEjDhU,GAAKsiB,GACbhmB,EAAQ4b,EAAO,MAAMkI,EAAOja,CAAC,EAC7B2e,EAAaG,EAAU3oB,EAAO8jB,CAAK,EACnC+C,EAAa,QAAQ,cAAc8B,EAAS,uBAAuBjR,EAAE,KAAK,EAC1EoM,EAAQja,EAAE,EACVnG,EAAIuiB,OAGJ,OAAM,IAAI,MAAM,gCAAgC,EAEjD,MACD,IAAK,IACJ,OAAOviB,EAAC,CACR,KAAKkiB,GACJhH,EAAG,WAAWhD,EAAO,MAAMkI,EAAMja,CAAC,CAAC,EACpC,KAAKoc,GACL,KAAKC,GACL,KAAKC,GACJziB,EAAGyiB,GACHvH,EAAG,OAAS,GACb,KAAKoH,GACL,KAAKH,GACJ,MACA,KAAKC,GACJlH,EAAG,OAAS,GACb,MAED,QACC,MAAM,IAAI,MAAM,mCAAmC,CACvD,CACG,MACD,IAAK,GACJ,OAAAiI,EAAa,MAAM,yBAAyB,EACzCnjB,GAAKkiB,IACPhH,EAAG,WAAWhD,EAAO,MAAMkI,EAAMja,CAAC,CAAC,EAE7BA,EACR,IAAK,IACJ,OAAOnG,EAAC,CACR,KAAKkiB,GACJhH,EAAG,WAAWhD,EAAO,MAAMkI,EAAMja,CAAC,CAAC,EACpC,KAAKoc,GACL,KAAKC,GACL,KAAKC,GACJ,MACD,KAAKH,GACL,KAAKH,GACJ7lB,EAAQ4b,EAAO,MAAMkI,EAAMja,CAAC,EACzB7J,EAAM,MAAM,EAAE,IAAM,MACtB4e,EAAG,OAAU,GACb5e,EAAQA,EAAM,MAAM,EAAE,EAAE,GAE1B,KAAK8lB,GACDpiB,IAAMoiB,KACR9lB,EAAQ2oB,GAENjlB,GAAKsiB,IACPa,EAAa,QAAQ,cAAc7mB,EAAM,mBAAmB,EAC5DwoB,EAAaG,EAAU3oB,EAAO8jB,CAAK,KAEhC,CAAChI,GAAU,OAAOmM,EAAa,EAAE,CAAC,GAAK,CAACjoB,EAAM,MAAM,kCAAkC,IACxF6mB,EAAa,QAAQ,cAAc7mB,EAAM,qBAAqBA,EAAM,aAAa,EAElFwoB,EAAaxoB,EAAOA,EAAO8jB,CAAK,GAEjC,MACD,KAAKiC,GACJ,MAAM,IAAI,MAAM,0BAA0B,CAC9C,CAEG,OAAOlc,EAER,IAAK,IACJ6N,EAAI,IACL,QACC,GAAGA,GAAI,IACN,OAAOhU,EAAC,CACR,KAAKkiB,GACJhH,EAAG,WAAWhD,EAAO,MAAMkI,EAAMja,CAAC,CAAC,EACnCnG,EAAIwiB,GACJ,MACD,KAAKL,GACJ8C,EAAW/M,EAAO,MAAMkI,EAAMja,CAAC,EAC/BnG,EAAIoiB,GACJ,MACD,KAAKE,GACJ,IAAIhmB,EAAQ4b,EAAO,MAAMkI,EAAOja,CAAC,EACjCgd,EAAa,QAAQ,cAAc7mB,EAAM,oBAAoB,EAC7DwoB,EAAaG,EAAU3oB,EAAO8jB,CAAK,EACpC,KAAKmC,GACJviB,EAAIwiB,GACJ,KAOL,KAII,QAAOxiB,EAAC,CAIR,KAAKoiB,GACWlH,EAAG,SACd,CAAC9C,GAAU,OAAOmM,EAAa,EAAE,CAAC,GAAK,CAACU,EAAS,MAAM,kCAAkC,IAC5F9B,EAAa,QAAQ,cAAc8B,EAAS,qBAAqBA,EAAS,cAAc,EAEzFH,EAAaG,EAAUA,EAAU7E,CAAK,EACtCA,EAAQja,EACRnG,EAAImiB,GACJ,MACD,KAAKI,GACJY,EAAa,QAAQ,+BAA+B8B,EAAS,KAAK,EACnE,KAAKzC,GACJxiB,EAAImiB,GACJ/B,EAAQja,EACR,MACD,KAAKkc,GACJriB,EAAIsiB,GACJlC,EAAQja,EACR,MACD,KAAKsc,GACJ,MAAM,IAAI,MAAM,4DAA4D,CACjF,CAEG,CAEDtc,GACF,CACA,CAIA,SAASye,GAAc1J,EAAG6H,EAAWwB,EAAa,CAKjD,QAJIjiB,EAAU4Y,EAAG,QACb+I,EAAa,KAEbpqB,EAAIqhB,EAAG,OACLrhB,KAAI,CACT,IAAI0G,EAAI2a,EAAGrhB,CAAC,EACRqrB,EAAQ3kB,EAAE,MACVjE,EAAQiE,EAAE,MACV4kB,EAAMD,EAAM,QAAQ,GAAG,EAC3B,GAAGC,EAAI,EACN,IAAInI,EAASzc,EAAE,OAAS2kB,EAAM,MAAM,EAAEC,CAAG,EACrCxJ,EAAYuJ,EAAM,MAAMC,EAAI,CAAC,EAC7BC,EAAWpI,IAAW,SAAWrB,OAErCA,EAAYuJ,EACZlI,EAAS,KACToI,EAAWF,IAAU,SAAW,GAGjC3kB,EAAE,UAAYob,EAEXyJ,IAAa,KACZnB,GAAc,OAChBA,EAAa,CAAA,EAEbjB,GAAMuB,EAAaA,EAAa,CAAE,CAAA,GAGnCA,EAAaa,CAAQ,EAAInB,EAAWmB,CAAQ,EAAI9oB,EAChDiE,EAAE,IAAM6X,GAAU,MAClB2K,EAAW,mBAAmBqC,EAAU9oB,CAAK,EAEhD,CAEC,QADIzC,EAAIqhB,EAAG,OACLrhB,KAAI,CACT0G,EAAI2a,EAAGrhB,CAAC,EACR,IAAImjB,EAASzc,EAAE,OACZyc,IACCA,IAAW,QACbzc,EAAE,IAAM6X,GAAU,KACf4E,IAAW,UACdzc,EAAE,IAAMgkB,EAAavH,GAAU,EAAE,GAKrC,CACC,IAAImI,EAAM7iB,EAAQ,QAAQ,GAAG,EAC1B6iB,EAAI,GACNnI,EAAS9B,EAAG,OAAS5Y,EAAQ,MAAM,EAAE6iB,CAAG,EACxCxJ,EAAYT,EAAG,UAAY5Y,EAAQ,MAAM6iB,EAAI,CAAC,IAE9CnI,EAAS,KACTrB,EAAYT,EAAG,UAAY5Y,GAG5B,IAAI6a,EAAKjC,EAAG,IAAMqJ,EAAavH,GAAU,EAAE,EAI3C,GAHA+F,EAAW,aAAa5F,EAAGxB,EAAUrZ,EAAQ4Y,CAAE,EAG5CA,EAAG,QAEL,GADA6H,EAAW,WAAW5F,EAAGxB,EAAUrZ,CAAO,EACvC2hB,EACF,IAAKjH,KAAUiH,EACV,OAAO,UAAU,eAAe,KAAKA,EAAYjH,CAAM,GAC1D+F,EAAW,iBAAiB/F,CAAM,MAKrC,QAAA9B,EAAG,aAAeqJ,EAClBrJ,EAAG,WAAa+I,EAET,EAET,CACA,SAASY,GAAwB3M,EAAOmN,EAAW/iB,EAAQihB,EAAeR,EAAW,CACpF,GAAG,yBAAyB,KAAKzgB,CAAO,EAAE,CACzC,IAAIgjB,EAAcpN,EAAO,QAAQ,KAAK5V,EAAQ,IAAI+iB,CAAU,EACxD5hB,EAAOyU,EAAO,UAAUmN,EAAW,EAAEC,CAAU,EACnD,GAAG,OAAO,KAAK7hB,CAAI,EAClB,MAAG,YAAY,KAAKnB,CAAO,GAGzBygB,EAAW,WAAWtf,EAAK,EAAEA,EAAK,MAAM,EAEjC6hB,IAGR7hB,EAAOA,EAAK,QAAQ,WAAW8f,CAAc,EAC7CR,EAAW,WAAWtf,EAAK,EAAEA,EAAK,MAAM,EACjC6hB,EAIX,CACC,OAAOD,EAAW,CACnB,CACA,SAASZ,GAAcvM,EAAOmN,EAAW/iB,EAAQwhB,EAAS,CAEzD,IAAIlc,EAAMkc,EAASxhB,CAAO,EAC1B,OAAGsF,GAAO,OAETA,EAAOsQ,EAAO,YAAY,KAAK5V,EAAQ,GAAG,EACvCsF,EAAIyd,IACNzd,EAAMsQ,EAAO,YAAY,KAAK5V,CAAO,GAEtCwhB,EAASxhB,CAAO,EAAGsF,GAEbA,EAAIyd,CAEZ,CAEA,SAASrC,GAAO9K,EAAQD,EAAQ,CAC/B,QAAShf,KAAKif,EACT,OAAO,UAAU,eAAe,KAAKA,EAAQjf,CAAC,IACjDgf,EAAOhf,CAAC,EAAIif,EAAOjf,CAAC,EAGvB,CAEA,SAASorB,GAASnM,EAAOkI,EAAM2C,EAAWI,EAAa,CACtD,IAAIpG,EAAM7E,EAAO,OAAOkI,EAAM,CAAC,EAC/B,OAAOrD,EAAI,CACX,IAAK,IACJ,GAAG7E,EAAO,OAAOkI,EAAQ,CAAC,IAAM,IAAI,CACnC,IAAIC,EAAMnI,EAAO,QAAQ,MAAMkI,EAAM,CAAC,EAEtC,OAAGC,EAAID,GACN2C,EAAW,QAAQ7K,EAAOkI,EAAM,EAAEC,EAAID,EAAM,CAAC,EACtCC,EAAI,IAEX8C,EAAa,MAAM,kBAAkB,EAC9B,GAEX,KAEG,OAAO,GAET,QACC,GAAGjL,EAAO,OAAOkI,EAAM,EAAE,CAAC,GAAK,SAAS,CACvC,IAAIC,EAAMnI,EAAO,QAAQ,MAAMkI,EAAM,CAAC,EACtC,OAAA2C,EAAW,WAAY,EACvBA,EAAW,WAAW7K,EAAOkI,EAAM,EAAEC,EAAID,EAAM,CAAC,EAChD2C,EAAW,SAAQ,EACZ1C,EAAI,CACd,CAGE,IAAIkF,EAAS1W,GAAMqJ,EAAOkI,CAAK,EAC3BnmB,EAAMsrB,EAAO,OACjB,GAAGtrB,EAAI,GAAK,YAAY,KAAKsrB,EAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAC1C,IAAIhjB,EAAOgjB,EAAO,CAAC,EAAE,CAAC,EAClBhE,EAAQ,GACRC,EAAQ,GACTvnB,EAAI,IACH,YAAY,KAAKsrB,EAAO,CAAC,EAAE,CAAC,CAAC,GAC/BhE,EAAQgE,EAAO,CAAC,EAAE,CAAC,EACnB/D,EAAQvnB,EAAI,GAAKsrB,EAAO,CAAC,EAAE,CAAC,GACpB,YAAY,KAAKA,EAAO,CAAC,EAAE,CAAC,CAAC,IACrC/D,EAAQ+D,EAAO,CAAC,EAAE,CAAC,IAGrB,IAAIC,EAAYD,EAAOtrB,EAAI,CAAC,EAC5B,OAAA8oB,EAAW,SAASxgB,EAAMgf,EAAOC,CAAK,EACtCuB,EAAW,OAAQ,EAEZyC,EAAU,MAAMA,EAAU,CAAC,EAAE,MACvC,CACA,CACC,MAAO,EACR,CAIA,SAASpB,GAAiBlM,EAAOkI,EAAM2C,EAAW,CACjD,IAAI1C,EAAMnI,EAAO,QAAQ,KAAKkI,CAAK,EACnC,GAAGC,EAAI,CACN,IAAIrS,EAAQkK,EAAO,UAAUkI,EAAMC,CAAG,EAAE,MAAM,4BAA4B,EAC1E,OAAGrS,GACQA,EAAM,CAAC,EAAE,OACnB+U,EAAW,sBAAsB/U,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EAC5CqS,EAAI,GAEJ,EAEV,CACC,MAAO,EACR,CAEA,SAASiE,IAAmB,CAC3B,KAAK,eAAiB,CAAA,CACvB,CACAA,GAAkB,UAAY,CAC7B,WAAW,SAAShiB,EAAQ,CAC3B,GAAG,CAAC2f,GAAe,KAAK3f,CAAO,EAC9B,MAAM,IAAI,MAAM,mBAAmBA,CAAO,EAE3C,KAAK,QAAUA,CACf,EACD,SAAS,SAAS4iB,EAAO5oB,EAAOoa,EAAQ,CACvC,GAAG,CAACuL,GAAe,KAAKiD,CAAK,EAC5B,MAAM,IAAI,MAAM,qBAAqBA,CAAK,EAE3C,KAAK,eAAeA,CAAK,EAAI,KAAK,OAClC,KAAK,KAAK,QAAQ,EAAI,CAAC,MAAMA,EAAM,MAAM5oB,EAAM,OAAOoa,CAAM,CAC5D,EACD,OAAO,EACP,aAAa,SAAS,EAAE,CAAC,OAAO,KAAK,CAAC,EAAE,SAAS,EACjD,WAAW,SAAS,EAAE,CAAC,OAAO,KAAK,CAAC,EAAE,OAAO,EAC7C,SAAS,SAAS,EAAE,CAAC,OAAO,KAAK,CAAC,EAAE,KAAK,EACzC,OAAO,SAAS,EAAE,CAAC,OAAO,KAAK,CAAC,EAAE,GAAG,EACrC,SAAS,SAAS,EAAE,CAAC,OAAO,KAAK,CAAC,EAAE,KAAK,CAW1C,EAIA,SAAS7H,GAAMqJ,EAAOkI,EAAM,CAC3B,IAAIpS,EACAwI,EAAM,CAAE,EACRiP,EAAM,6CAGV,IAFAA,EAAI,UAAYrF,EAChBqF,EAAI,KAAKvN,CAAM,EACTlK,EAAQyX,EAAI,KAAKvN,CAAM,GAE5B,GADA1B,EAAI,KAAKxI,CAAK,EACXA,EAAM,CAAC,EAAE,OAAOwI,CAErB,CAEiBkP,GAAA,UAAG9C,GACpB8C,GAAA,WAAqBhD,GCrpBrB,IAAIrK,GAAc/f,GACdupB,GAAMrlB,GACNmpB,GAAWlpB,GACXipB,GAAMhpB,GAENkf,GAAoBiG,GAAI,kBAExBzJ,GAAYC,GAAY,UAExBqK,GAAagD,GAAI,WACjB9C,GAAY8C,GAAI,UAuBpB,SAASE,GAAqBhmB,EAAO,CACpC,OAAOA,EACL,QAAQ,gBAAiB;AAAA,CAAI,EAC7B,QAAQ,oBAAqB;AAAA,CAAI,CACpC,CAiCA,SAASimB,GAAUzqB,EAAQ,CAC1B,KAAK,QAAUA,GAAU,CAAC,QAAQ,CAAA,CAAE,CACrC,CAEAyqB,GAAU,UAAU,gBAAkB,SAAS3N,EAAO4N,EAAS,CAC9D,IAAI1qB,EAAU,KAAK,QACfsqB,EAAO,IAAI9C,GACXG,EAAa3nB,EAAQ,YAAc,IAAI2qB,GACvC5C,EAAe/nB,EAAQ,aACvBunB,EAAUvnB,EAAQ,QAClBynB,EAAeznB,EAAQ,OAAO,CAAE,EAChCkf,EAAS,aAAa,KAAKwL,CAAQ,EACjChD,EAAYxI,EAASqL,GAAS,cAAgBA,GAAS,aAC1DhD,GACFI,EAAW,mBAAmBJ,CAAO,EAGtC+C,EAAI,aAAeM,GAAkB7C,EAAaJ,EAAWJ,CAAO,EACpE+C,EAAI,WAAatqB,EAAQ,YAAc2nB,EACpCzI,IACFuI,EAAa,EAAE,EAAIzK,GAAU,MAE9ByK,EAAa,IAAMA,EAAa,KAAOzK,GAAU,IACjD,IAAI6N,EAAY7qB,EAAQ,sBAAwBwqB,GAChD,OAAI1N,GAAU,OAAOA,GAAW,SAC/BwN,EAAI,MACHO,EAAU/N,CAAM,EAChB2K,EACAC,CACH,EAEE4C,EAAI,aAAa,MAAM,oBAAoB,EAErC3C,EAAW,GACnB,EACA,SAASiD,GAAkBE,EAAUnD,EAAWJ,EAAQ,CACvD,GAAG,CAACuD,EAAU,CACb,GAAGnD,aAAsBgD,GACxB,OAAOhD,EAERmD,EAAYnD,CACd,CACC,IAAII,EAAe,CAAA,EACfgD,EAAaD,aAAqB,SACtCvD,EAAUA,GAAS,CAAA,EACnB,SAASyD,EAAMjpB,EAAI,CAClB,IAAI7D,EAAK4sB,EAAU/oB,CAAG,EACnB,CAAC7D,GAAM6sB,IACT7sB,EAAK4sB,EAAU,QAAU,EAAE,SAASG,EAAI,CAACH,EAAU/oB,EAAIkpB,CAAG,CAAC,EAAEH,GAE9D/C,EAAahmB,CAAG,EAAI7D,GAAM,SAAS+sB,EAAI,CACtC/sB,EAAG,WAAW6D,EAAI,KAAMkpB,EAAIC,GAAS3D,CAAO,CAAC,CAC7C,GAAE,UAAU,CAAE,CACjB,CACC,OAAAyD,EAAM,SAAS,EACfA,EAAM,OAAO,EACbA,EAAM,YAAY,EACXjD,CACR,CAYA,SAAS4C,IAAa,CAClB,KAAK,MAAQ,EACjB,CACA,SAASvf,GAASmc,EAAQhgB,EAAK,CAC9BA,EAAK,WAAaggB,EAAQ,WAC1BhgB,EAAK,aAAeggB,EAAQ,YAC7B,CAKAoD,GAAW,UAAY,CACtB,cAAgB,UAAW,CACvB,KAAK,IAAM,IAAInK,GAAiB,EAAG,eAAe,KAAM,KAAM,IAAI,EAC9D,KAAK,UACL,KAAK,IAAI,YAAc,KAAK,QAAQ,SAE3C,EACD,aAAa,SAASF,EAAcC,EAAWuJ,EAAO7W,EAAO,CAC5D,IAAIgN,EAAM,KAAK,IACRH,EAAKG,EAAI,gBAAgBK,EAAcwJ,GAAOvJ,CAAS,EACvD1hB,EAAMoU,EAAM,OAChBuW,GAAc,KAAM1J,CAAE,EACtB,KAAK,eAAiBA,EAEzB,KAAK,SAAW1U,GAAS,KAAK,QAAQ0U,CAAE,EACrC,QAASrhB,EAAI,EAAIA,EAAII,EAAKJ,IAAK,CAC3B,IAAI6hB,EAAerN,EAAM,OAAOxU,CAAC,EAC7ByC,EAAQ+R,EAAM,SAASxU,CAAC,EACxBqrB,EAAQ7W,EAAM,SAASxU,CAAC,EAC9ByU,EAAO+M,EAAI,kBAAkBK,EAAcwJ,CAAK,EACpD,KAAK,SAAU1e,GAAS6H,EAAM,WAAWxU,CAAC,EAAEyU,CAAI,EAChDA,EAAK,MAAQA,EAAK,UAAYhS,EAC9B4e,EAAG,iBAAiB5M,CAAI,CAC3B,CACE,EACD,WAAW,SAASoN,EAAcC,EAAWuJ,EAAO,CACnD,IAAIhjB,EAAU,KAAK,eACLA,EAAQ,QACtB,KAAK,eAAiBA,EAAQ,UAC9B,EACD,mBAAmB,SAAS8a,EAAQxf,EAAK,CACxC,EACD,iBAAiB,SAASwf,EAAQ,CACjC,EACD,sBAAsB,SAAS/E,EAAQpR,EAAM,CACzC,IAAI0f,EAAM,KAAK,IAAI,4BAA4BtO,EAAQpR,CAAI,EAC3D,KAAK,SAAWL,GAAS,KAAK,QAAQ+f,CAAG,EACzC3B,GAAc,KAAM2B,CAAG,CAC1B,EACD,oBAAoB,SAASC,EAAIpG,EAAOlT,EAAQ,CAC/C,EACD,WAAW,SAASuZ,EAAOrG,EAAOlT,EAAQ,CAGzC,GAFAuZ,EAAQC,GAAU,MAAM,KAAK,SAAS,EAEnCD,EAAM,CACR,GAAI,KAAK,MACR,IAAIE,EAAW,KAAK,IAAI,mBAAmBF,CAAK,MAEhD,KAAIE,EAAW,KAAK,IAAI,eAAeF,CAAK,EAE1C,KAAK,eACP,KAAK,eAAe,YAAYE,CAAQ,EAChC,QAAQ,KAAKF,CAAK,GAC1B,KAAK,IAAI,YAAYE,CAAQ,EAG9B,KAAK,SAAWngB,GAAS,KAAK,QAAQmgB,CAAQ,CACjD,CACE,EACD,cAAc,SAASpkB,EAAM,CAC5B,EACD,YAAY,UAAW,CACtB,KAAK,IAAI,UAAW,CACpB,EACD,mBAAmB,SAAUogB,EAAS,EAC/B,KAAK,QAAUA,KACjBA,EAAQ,WAAa,EAEzB,EAED,QAAQ,SAAS8D,EAAOrG,EAAOlT,EAAQ,CACtCuZ,EAAQC,GAAU,MAAM,KAAK,SAAS,EACnC,IAAIE,EAAO,KAAK,IAAI,cAAcH,CAAK,EACvC,KAAK,SAAWjgB,GAAS,KAAK,QAAQogB,CAAI,EAC1ChC,GAAc,KAAMgC,CAAI,CAC3B,EAED,WAAW,UAAW,CAElB,KAAK,MAAQ,EAChB,EACD,SAAS,UAAW,CAChB,KAAK,MAAQ,EAChB,EAED,SAAS,SAASrkB,EAAM2Z,EAAUC,EAAU,CAC3C,IAAI0K,EAAO,KAAK,IAAI,eACjB,GAAIA,GAAQA,EAAK,mBAAoB,CACjC,IAAIC,EAAKD,EAAK,mBAAmBtkB,EAAM2Z,EAAUC,CAAQ,EACzD,KAAK,SAAW3V,GAAS,KAAK,QAAQsgB,CAAE,EACxClC,GAAc,KAAMkC,CAAE,EAC1B,KAAK,IAAI,QAAUA,CACxB,CACE,EAKD,QAAQ,SAAShuB,EAAO,CACvB,QAAQ,KAAK,oBAAqBA,EAAMwtB,GAAS,KAAK,OAAO,CAAC,CAC9D,EACD,MAAM,SAASxtB,EAAO,CACrB,QAAQ,MAAM,kBAAmBA,EAAMwtB,GAAS,KAAK,OAAO,CAAC,CAC7D,EACD,WAAW,SAASxtB,EAAO,CAC1B,MAAM,IAAI4pB,GAAW5pB,EAAO,KAAK,OAAO,CAC1C,CACA,EACA,SAASwtB,GAASS,EAAE,CACnB,GAAGA,EACF,MAAO;AAAA,IAAOA,EAAE,UAAW,IAAI,UAAUA,EAAE,WAAW,QAAQA,EAAE,aAAa,GAE/E,CACA,SAASL,GAAUD,EAAMrG,EAAMlT,EAAO,CACrC,OAAG,OAAOuZ,GAAS,SACXA,EAAM,OAAOrG,EAAMlT,CAAM,EAE7BuZ,EAAM,QAAUrG,EAAMlT,GAAUkT,EAC3B,IAAI,KAAK,KAAK,OAAOqG,EAAMrG,EAAMlT,CAAM,EAAE,GAE1CuZ,CAET,CAiCA,+JAA+J,QAAQ,OAAO,SAAStpB,EAAI,CAC1L4oB,GAAW,UAAU5oB,CAAG,EAAI,UAAU,CAAC,OAAO,IAAI,CACnD,CAAC,EAGD,SAASynB,GAAeoC,EAAOrkB,EAAM,CAC5BqkB,EAAO,eAGRA,EAAO,eAAe,YAAYrkB,CAAI,EAFtCqkB,EAAO,IAAI,YAAYrkB,CAAI,CAInC,CAEoBskB,GAAA,aAAGlB,GACKkB,GAAA,qBAAGrB,GAC/BqB,GAAA,UAAoBpB,GC9TpB,IAAiBA,GAAGrpB,GAAwB,UCH5C,0DASA,MAAM0qB,GAAWvuB,GACR,CAAC,CAACA,GAAO,OAAOA,GAAQ,SAG3BwuB,GAAQ,IAAIC,IACTA,EAAQ,OAAO,CAACpqB,EAAQkb,KACzB,OAAOA,GAAW,UAItB,OAAO,KAAKA,CAAM,EAAE,QAAQ/a,GAAO,CAC7B,MAAM,QAAQH,EAAOG,CAAG,CAAC,GAAK,MAAM,QAAQ+a,EAAO/a,CAAG,CAAC,EACzDH,EAAOG,CAAG,EAAIH,EAAOG,CAAG,EAAE,OAAO+a,EAAO/a,CAAG,CAAC,EACnC+pB,GAASlqB,EAAOG,CAAG,CAAC,GAAK+pB,GAAShP,EAAO/a,CAAG,CAAC,EACtDH,EAAOG,CAAG,EAAIgqB,GAAMnqB,EAAOG,CAAG,EAAG+a,EAAO/a,CAAG,CAAC,EAE5CH,EAAOG,CAAG,EAAI+a,EAAO/a,CAAG,CAEhC,CAAK,EACMH,GACN,EAAE,EAEDqqB,GAAS5tB,GAAK,OAAO,KAAKA,CAAC,EAAE,IAAI0G,GAAK1G,EAAE0G,CAAC,CAAC,EAE1CmnB,GAAQ,CAAClH,EAAOC,IAAQ,CAC5B,MAAMrjB,EAAS,CAAE,EAEjB,QAASnD,EAAIumB,EAAOvmB,EAAIwmB,EAAKxmB,IAC3BmD,EAAO,KAAKnD,CAAC,EAGf,OAAOmD,CACT,EACMuqB,GAAUC,GAASA,EAAM,OAAO,CAACniB,EAAGC,IAAMD,EAAE,OAAOC,CAAC,EAAG,CAAA,CAAE,EACzDmiB,GAAOhQ,GAAQ,CACnB,GAAI,CAACA,EAAK,OACR,MAAO,CAAE,EAGX,MAAMza,EAAS,CAAE,EAEjB,QAASnD,EAAI,EAAGA,EAAI4d,EAAK,OAAQ5d,IAC/BmD,EAAO,KAAKya,EAAK5d,CAAC,CAAC,EAGrB,OAAOmD,CACT,EACM0qB,GAAc,CAACX,EAAG5pB,IAAQ4pB,EAAE,OAAO,CAACxmB,EAAGpB,EAAGtF,KAC1CsF,EAAEhC,CAAG,GACPoD,EAAE,KAAK1G,CAAC,EAGH0G,GACN,EAAE,EAUConB,GAAQ,CAACH,EAAOI,IACbP,GAAOG,EAAM,OAAO,CAAC/Y,EAAKgJ,KAC/BA,EAAK,QAAQyD,GAAM,CACjBzM,EAAImZ,EAAY1M,CAAE,CAAC,EAAIA,CAC7B,CAAK,EACMzM,GACN,CAAE,CAAA,CAAC,EAGR,IAAIoZ,GAAS,CACX,yBAA0B,2BAE1B,oBAAqB,sBACrB,iBAAkB,mBAClB,YAAa,cAEb,yBAA0B,2BAC1B,8BAA+B,+BACjC,EA4BA,MAAMC,GAAmB,CAAC,CACxB,QAAArb,EAAU,GACV,OAAAyL,EAAS,GACT,MAAAoP,EAAQ,GACR,WAAAS,EAAa,EACf,IAAM,CACJ,MAAMzY,EAAU,CACd,IAAK4I,EACL,YAAa1L,GAAWC,GAAW,GAAIyL,CAAM,CAC9C,EAED,GAAIoP,GAASS,EAAY,CAEvB,MAAMC,GADWV,GAAgBS,GACT,MAAM,GAAG,EAEjC,IAAIE,EAAavsB,EAAO,OAASA,EAAO,OAAOssB,EAAO,CAAC,CAAC,EAAI,SAASA,EAAO,CAAC,EAAG,EAAE,EAC9EE,EAAWxsB,EAAO,OAASA,EAAO,OAAOssB,EAAO,CAAC,CAAC,EAAI,SAASA,EAAO,CAAC,EAAG,EAAE,EAE5EC,EAAa,OAAO,kBAAoB,OAAOA,GAAe,WAChEA,EAAa,OAAOA,CAAU,GAG5BC,EAAW,OAAO,kBAAoB,OAAOA,GAAa,WAC5DA,EAAW,OAAOA,CAAQ,GAG5B,IAAIhb,EAEA,OAAOgb,GAAa,UAAY,OAAOD,GAAe,SACxD/a,EAASxR,EAAO,OAAOwsB,CAAQ,EAAIxsB,EAAO,OAAOusB,CAAU,EAAIvsB,EAAO,OAAO,CAAC,EAE9EwR,EAASgb,EAAWD,EAAa,EAG/B,OAAO/a,GAAW,UAAYA,EAAS,OAAO,mBAChDA,EAAS,OAAOA,CAAM,GAKxBoC,EAAQ,UAAY,CAClB,OAAApC,EACA,OAAQ+a,CACT,CACL,CAEE,OAAO3Y,CACT,EACM6Y,GAAoB/W,GAAa,CAGrC,IAAI8W,EAEJ,OAAI,OAAO9W,EAAU,QAAW,UAAY,OAAOA,EAAU,QAAW,SACtE8W,EAAWxsB,EAAO,OAAO0V,EAAU,MAAM,EAAI1V,EAAO,OAAO0V,EAAU,MAAM,EAAI1V,EAAO,OAAO,CAAC,EAE9FwsB,EAAW9W,EAAU,OAASA,EAAU,OAAS,EAG5C,GAAGA,EAAU,MAAM,IAAI8W,CAAQ,EACxC,EAaME,GAAiBC,IACjBA,GAAa,OAAOA,GAAc,WACpCA,EAAY,SAASA,EAAW,EAAE,GAGhC,MAAMA,CAAS,EACV,KAGFA,GAQHC,GAAe,CASnB,OAAOla,EAAY,CACjB,KAAM,CACJ,SAAAma,EACA,UAAAC,EAAY,EACZ,eAAAC,EACA,eAAAC,CACN,EAAQta,EACEia,EAAYD,GAAeha,EAAW,SAAS,EAC/Cua,EAAkBJ,EAAWC,EAEnC,OAAI,OAAOH,GAAc,SAChB,CACL,MAAO,EACP,IAAKA,CACN,EAGC,OAAOK,GAAmB,SACrB,CACL,MAAO,EACP,IAAKA,EAAiBC,CACvB,EAGI,CACL,MAAO,EACP,IAAKF,EAAiBE,CACvB,CACF,EAUD,QAAQva,EAAY,CAClB,KAAM,CACJ,IAAAwa,EACA,aAAAC,EACA,sBAAAC,EACA,UAAAN,EAAY,EACZ,SAAAD,EACA,YAAAQ,EAAc,EACd,oBAAAC,EAAsB,EACtB,qBAAAC,EAAuB,GAC7B,EAAQ7a,EACEia,EAAYD,GAAeha,EAAW,SAAS,EAG/C8a,GAAON,EAAMC,GAAgB,IAG7BM,EAAgBL,EAAwBC,EAGxCL,EADcQ,EAAMF,EACWG,EAC/BC,EAAe,KAAK,KAAKV,EAAiBF,EAAYD,CAAQ,EAC9Dc,EAAiB,KAAK,OAAOH,EAAMC,EAAgBF,GAAwBT,EAAYD,CAAQ,EAC/Fe,EAAe,KAAK,OAAOJ,EAAMC,GAAiBX,EAAYD,CAAQ,EAC5E,MAAO,CACL,MAAO,KAAK,IAAI,EAAGc,CAAc,EACjC,IAAK,OAAOhB,GAAc,SAAWA,EAAY,KAAK,IAAIe,EAAcE,CAAY,CACrF,CACL,CAEA,EAyBMC,GAAanb,GAAciH,GAAU,CACzC,KAAM,CACJ,SAAAkT,EACA,UAAAC,EAAY,EACZ,YAAAO,EACA,YAAAS,EAAc,CAClB,EAAMpb,EACJ,MAAO,CACL,OAAQob,EAAcnU,EACtB,SAAUkT,EAAWC,EACrB,SAAUO,EACV,KAAM1T,EAASkT,CAChB,CACH,EAYMkB,GAAkBrb,GAAc,CACpC,KAAM,CACJ,KAAA/T,EACA,SAAAkuB,EACA,UAAAC,EAAY,EACZ,eAAAE,EACA,eAAAD,CACJ,EAAMra,EACE,CACJ,MAAAgS,EACA,IAAAC,CACJ,EAAMiI,GAAajuB,CAAI,EAAE+T,CAAU,EAC3Bsb,EAAWpC,GAAMlH,EAAOC,CAAG,EAAE,IAAIkJ,GAAWnb,CAAU,CAAC,EAE7D,GAAI/T,IAAS,SAAU,CACrB,MAAM6C,EAAQwsB,EAAS,OAAS,EAE1BC,EAAkB,OAAOjB,GAAmB,SAAWA,EAAiBD,EAE9EiB,EAASxsB,CAAK,EAAE,SAAWysB,EAAkBpB,EAAWC,EAAYtrB,CACxE,CAEE,OAAOwsB,CACT,EAaME,GAAmBxb,GAAc,CACrC,KAAM,CACJ,QAAA3B,EACA,eAAAod,EAAiB,CAAE,EACnB,eAAApB,EACA,WAAAV,EAAa,GACb,YAAAgB,EACA,iBAAAe,EACA,OAAAzU,EAAS,EACT,SAAAkT,CACD,EAAGna,EAEJ,GAAI,CAAC3B,EACH,MAAM,IAAI,MAAMob,GAAO,WAAW,EAGpC,MAAMkC,EAAcjC,GAAiB,CACnC,QAAArb,EACA,OAAQod,EAAe,UACvB,MAAOA,EAAe,KAC1B,CAAG,EACKva,EAAUwY,GAAiB,CAC/B,QAAArb,EACA,OAAQA,EACR,WAAAsb,CACJ,CAAG,EAID,GAHAzY,EAAQ,IAAMya,EAGVxB,EAAU,CACZ,MAAMyB,EAAkBP,GAAgBrb,CAAU,EAE9C4b,EAAgB,SAClB1a,EAAQ,SAAW0a,EAAgB,CAAC,EAAE,SACtC1a,EAAQ,SAAW0a,EAAgB,CAAC,EAAE,SAEzC,MAAUvB,IACTnZ,EAAQ,SAAWmZ,EACnBnZ,EAAQ,SAAWyZ,GAOrB,OAAAzZ,EAAQ,iBAAmBwa,GAAoBf,EAC/CzZ,EAAQ,OAAS+F,EACV,CAAC/F,CAAO,CACjB,EAaM2a,GAA8B,CAACC,EAAUC,EAAM1d,IAAY,CAE/D,MAAMsd,EAAcG,EAAS,KAAK,IAAMA,EAAS,KAAK,IAAM,KAEtDzB,EAAiByB,EAAS,KAAK,SAE/BE,EAAWF,EAAS,UAAY,EAChCG,EAAgBH,EAAS,KAAK,UAC9BI,EAAUD,EAAc,OAASA,EAAc,OAE/C7B,EAAY2B,EAAK,UAEjBI,EAAkBJ,EAAK,WAAW,OAAOjxB,GAAKA,EAAE,gBAAkB,CAAC,EACnEwwB,EAAW,CAAE,EACbrvB,EAAO6vB,EAAS,QAAU,SAAW,UACrCnB,EAAcmB,EAAS,KAAK,SAClC,IAAIJ,EAAmBf,EACnB1T,EAAS6U,EAAS,eAAiB,EAEnClF,EAEA,OAAOmF,EAAK,aAAgB,SAC9BnF,EAAatpB,EAAO,OAAO4uB,CAAO,EAAIH,EAAK,YAE3CnF,EAAasF,EAAUH,EAAK,YAG9B,QAAStwB,EAAI,EAAGA,EAAI0wB,EAAgB,OAAQ1wB,IAAK,CAC/C,MAAM2L,EAAY2kB,EAAK,WAAWtwB,CAAC,EAE7ByM,EAAOd,EAAU,eAGjB+iB,EAAW/iB,EAAU,mBAE3B,IAAIglB,EAEA,OAAOxF,GAAe,SACxBwF,EAAWxF,EAAatpB,EAAO,OAAO4K,CAAI,EAAI5K,EAAO,OAAO,CAAC,EAE7D8uB,EAAWxF,EAAa1e,EAAO,EAGjC,MAAMyhB,EAAa,GAAG/C,CAAU,IAAIwF,CAAQ,GAatClb,EAAUsa,GAZG,CACjB,QAAAnd,EACA,UAAA+b,EACA,SAAA4B,EACA,YAAArB,EACA,iBAAAe,EACA,OAAAzU,EACA,SAAAkT,EACA,eAAAE,EACA,WAAAV,EACA,KAAA1tB,CACD,CAC0C,EAAE,CAAC,EAE1C0vB,IACFza,EAAQ,IAAMya,GAGhBL,EAAS,KAAKpa,CAAO,EAEjB,OAAO0V,GAAe,SACxBA,GAActpB,EAAO,OAAO4K,CAAI,EAEhC0e,GAAc1e,EAGhBwjB,GAAoBvB,EAAWC,EAC/BnT,GACJ,CAEE,OAAA6U,EAAS,SAAWR,EACbQ,CACT,EAEMO,GAAwB,CAAC,QAAS,WAAW,EAE7CC,GAAa,EAAI,GASjBC,GAA0BC,GACvBjD,GAAMiD,EAAgB,CAAC,CAC5B,SAAAR,CACD,IAAKA,CAAQ,EAAE,KAAK,CAAC7pB,EAAGwF,IAAMxF,EAAE,SAAWwF,EAAE,SAAW,EAAI,EAAE,EAW3D8kB,GAAuB,CAACC,EAAWvoB,IAAS,CAChD,QAAS1I,EAAI,EAAGA,EAAIixB,EAAU,OAAQjxB,IACpC,GAAIixB,EAAUjxB,CAAC,EAAE,WAAW,OAAS0I,EACnC,OAAOuoB,EAAUjxB,CAAC,EAItB,OAAO,IACT,EASMkxB,GAAyBlb,GAAY,CACzC,IAAImb,EAAsB,CAAE,EAC5B7T,OAAAA,GAAkBtH,EAAU4a,GAAuB,CAACQ,EAAY5wB,EAAM6wB,EAAOC,IAAU,CACrFH,EAAsBA,EAAoB,OAAOC,EAAW,WAAa,CAAA,CAAE,CAC/E,CAAG,EACMD,CACT,EASMI,GAAiC,CAAC,CACtC,SAAAlB,EACA,cAAAmB,CACF,IAAM,CACJnB,EAAS,cAAgBmB,EACzBnB,EAAS,SAAS,QAAQ,CAAC5a,EAASpS,IAAU,CAC5CoS,EAAQ,OAAS4a,EAAS,cAAgBhtB,CAC9C,CAAG,CACH,EAgBMouB,GAAwB,CAAC,CAC7B,aAAAC,EACA,aAAAC,EACA,eAAAZ,CACF,IAAM,CACJY,EAAa,QAAQtB,GAAY,CAC/BA,EAAS,sBAAwBU,EAAe,UAAU,SAAU,CAClE,SAAAR,CACN,EAAO,CACD,OAAOA,IAAaF,EAAS,QACnC,CAAK,EAKD,MAAMuB,EAAcZ,GAAqBU,EAAcrB,EAAS,WAAW,IAAI,EAkB/E,GAhBI,CAACuB,GAgBDvB,EAAS,KACX,OAKF,MAAMwB,EAAkBxB,EAAS,SAAS,CAAC,EACrCyB,EAA0BF,EAAY,SAAS,UAAU,SAAUG,EAAY,CACnF,OAAO,KAAK,IAAIA,EAAW,iBAAmBF,EAAgB,gBAAgB,EAAIhB,EACxF,CAAK,EAKD,GAAIiB,IAA4B,GAAI,CAClCP,GAA+B,CAC7B,SAAAlB,EACA,cAAeuB,EAAY,cAAgBA,EAAY,SAAS,MACxE,CAAO,EACDvB,EAAS,SAAS,CAAC,EAAE,cAAgB,GACrCA,EAAS,oBAAoB,QAAQ,CAAC,GAoBlC,CAACuB,EAAY,SAAS,QAAUvB,EAAS,SAAWuB,EAAY,UAAYA,EAAY,SAAS,QAAUvB,EAAS,SAAWuB,EAAY,SAASA,EAAY,SAAS,OAAS,CAAC,EAAE,WACvLvB,EAAS,wBAGX,MACD,CAa0BuB,EAAY,SAASE,CAAuB,EAEhD,eAAiB,CAACD,EAAgB,gBACvDA,EAAgB,cAAgB,GAChCxB,EAAS,oBAAoB,QAAQ,CAAC,EACtCA,EAAS,yBAGXkB,GAA+B,CAC7B,SAAAlB,EACA,cAAeuB,EAAY,SAASE,CAAuB,EAAE,MACnE,CAAK,CACL,CAAG,CACH,EAYME,GAA6B,CAAC,CAClC,YAAAC,EACA,YAAAC,CACF,IAAM,CAoBJ,MAAMR,EAAeO,EAAY,UAAU,OAAOf,GAAuBe,CAAW,CAAC,EAC/EN,EAAeO,EAAY,UAAU,OAAOhB,GAAuBgB,CAAW,CAAC,EAOrF,OAAAA,EAAY,eAAiBpB,GAAwB,CAACmB,EAAY,eAAgBC,EAAY,cAAc,CAAC,EAC7GT,GAAsB,CACpB,aAAAC,EACA,aAAAC,EACA,eAAgBO,EAAY,cAChC,CAAG,EACMA,CACT,EAEMC,GAAkB7B,GAAQA,GAAQA,EAAK,IAAM,IAAMhC,GAAkBgC,EAAK,SAAS,EAEnF8B,GAA8BnB,GAAa,CAE/C,MAAMoB,EAAqBpB,EAAU,OAAO,SAAUrc,EAAK0d,EAAK,CAC9D,OAAK1d,EAAI0d,EAAI,WAAW,OAAO,IAC7B1d,EAAI0d,EAAI,WAAW,OAAO,EAAI,CAAE,GAGlC1d,EAAI0d,EAAI,WAAW,OAAO,EAAE,KAAKA,CAAG,EAC7B1d,CACR,EAAE,EAAE,EACL,IAAI2d,EAAe,CAAE,EACrB,cAAO,OAAOF,CAAkB,EAAE,QAAQG,GAAiB,CACzD,MAAMC,EAAkBjF,GAAOgF,EAAc,OAAO,CAAC5d,EAAKyb,IAAa,CAIrE,MAAM3nB,EAAO2nB,EAAS,WAAW,IAAMA,EAAS,WAAW,MAAQ,IAEnE,OAAKzb,EAAIlM,CAAI,GAMP2nB,EAAS,WAEPA,EAAS,SAAS,CAAC,IACrBA,EAAS,SAAS,CAAC,EAAE,cAAgB,IAGvCzb,EAAIlM,CAAI,EAAE,SAAS,KAAK,GAAG2nB,EAAS,QAAQ,GAK1CA,EAAS,WAAW,oBACtBzb,EAAIlM,CAAI,EAAE,WAAW,kBAAoB2nB,EAAS,WAAW,qBAhB/Dzb,EAAIlM,CAAI,EAAI2nB,EACZzb,EAAIlM,CAAI,EAAE,WAAW,eAAiB,CAAE,GAmB1CkM,EAAIlM,CAAI,EAAE,WAAW,eAAe,KAAK,CAGvC,MAAO2nB,EAAS,WAAW,YAC3B,SAAUA,EAAS,WAAW,WACtC,CAAO,EACMzb,CACR,EAAE,CAAE,CAAA,CAAC,EACN2d,EAAeA,EAAa,OAAOE,CAAe,CACtD,CAAG,EACMF,EAAa,IAAIlC,IACtBA,EAAS,oBAAsBxC,GAAYwC,EAAS,UAAY,CAAE,EAAE,eAAe,EAC5EA,EACR,CACH,EAEMqC,GAA4B,CAACrC,EAAUsC,IAAgB,CAC3D,MAAMC,EAAUT,GAAgB9B,EAAS,IAAI,EACvCwC,EAAYD,GAAWD,EAAYC,CAAO,GAAKD,EAAYC,CAAO,EAAE,KAE1E,OAAIC,GACFzC,GAA4BC,EAAUwC,EAAWxC,EAAS,KAAK,WAAW,EAGrEA,CACT,EACMyC,GAA6B,CAAC7B,EAAW0B,EAAc,KAAO,CAClE,GAAI,CAAC,OAAO,KAAKA,CAAW,EAAE,OAC5B,OAAO1B,EAGT,UAAWjxB,KAAKixB,EACdA,EAAUjxB,CAAC,EAAI0yB,GAA0BzB,EAAUjxB,CAAC,EAAG2yB,CAAW,EAGpE,OAAO1B,CACT,EACM8B,GAAsB,CAAC,CAC3B,WAAAxe,EACA,SAAAsb,EACA,KAAAS,EACA,cAAAkB,EACA,sBAAAwB,EACA,oBAAAC,CACF,EAAGC,IAAgB,CACjB,MAAM7C,EAAW,CACf,WAAY,CACV,KAAM9b,EAAW,GACjB,UAAWA,EAAW,UACtB,OAAQA,EAAW,OAClB,aAAe,CACjB,EACD,IAAK,GACL,QAASA,EAAW,OAAS,SAC7B,SAAUA,EAAW,YACrB,YAAaA,EAAW,SAAW,GACnC,eAAgBA,EAAW,SAC3B,sBAAAye,EACA,oBAAAC,EACA,eAAgB1e,EAAW,eAC3B,cAAAid,EACA,SAAA3B,CACD,EAED,OAAItb,EAAW,oBACb8b,EAAS,kBAAoB9b,EAAW,mBAGtCA,EAAW,kBACb8b,EAAS,WAAW,gBAAkB9b,EAAW,iBAG/C+b,IACFD,EAAS,KAAOC,GAGd4C,IACF7C,EAAS,WAAW,MAAQ,QAC5BA,EAAS,WAAW,UAAY,QAG3BA,CACT,EACM8C,GAAoB,CAAC,CACzB,WAAA5e,EACA,SAAAsb,EACA,cAAA2B,EACA,oBAAAyB,EACA,sBAAAD,CACF,IAAM,CACA,OAAOnD,EAAa,MAEtBA,EAAW,CAAC,CACV,IAAKtb,EAAW,QAChB,SAAUA,EAAW,YACrB,YAAaA,EAAW,SAAW,GACnC,SAAUA,EAAW,eACrB,OAAQ,CACd,CAAK,EAEDA,EAAW,SAAWA,EAAW,gBAGnC,MAAM6e,EAAiB,CACrB,KAAM7e,EAAW,GACjB,UAAWA,EAAW,UACrB,aAAe,CACjB,EAEGA,EAAW,SACb6e,EAAe,OAAS7e,EAAW,QAGrC,MAAM8e,EAAc,CAClB,WAAYD,EACZ,IAAK,GACL,QAAS7e,EAAW,OAAS,SAC7B,SAAUA,EAAW,YACrB,YAAaA,EAAW,SAAW,GACnC,eAAgBA,EAAW,SAC3B,eAAgBA,EAAW,eAC3B,oBAAA0e,EACA,sBAAAD,EACA,cAAAxB,EACA,SAAA3B,CACD,EAED,OAAItb,EAAW,kBACb8e,EAAY,WAAW,gBAAkB9e,EAAW,iBAG/C8e,CACT,EACMC,GAAyB,CAACrC,EAAW0B,EAAc,CAAA,EAAIO,EAAc,KAAU,CACnF,IAAIK,EACJ,MAAMC,EAAqBvC,EAAU,OAAO,CAACvqB,EAAG2pB,IAAa,CAC3D,MAAMoD,EAAOpD,EAAS,WAAW,MAAQA,EAAS,WAAW,KAAK,OAAS,GACrEqD,EAAWrD,EAAS,WAAW,MAAQ,GAC7C,IAAIiB,EAAQjB,EAAS,WAAW,OAAS,OAEzC,GAAIqD,GAAY,CAACrD,EAAS,WAAW,MAAO,CAC1C,MAAMsD,EAAYF,EAAO,KAAKA,CAAI,IAAM,GACxCnC,EAAQ,GAAGjB,EAAS,WAAW,IAAI,GAAGsD,CAAS,EACrD,CAESjtB,EAAE4qB,CAAK,IACV5qB,EAAE4qB,CAAK,EAAI,CACT,SAAAoC,EACA,WAAY,GACZ,QAASD,IAAS,OAClB,UAAW,CAAE,EACb,IAAK,EACN,GAGH,MAAMG,EAAYlB,GAA0BK,GAAoB1C,EAAU6C,CAAW,EAAGP,CAAW,EACnG,OAAAjsB,EAAE4qB,CAAK,EAAE,UAAU,KAAKsC,CAAS,EAE7B,OAAOL,EAAiB,KAAeE,IAAS,SAClDF,EAAelD,EACfkD,EAAa,QAAU,IAGlB7sB,CACR,EAAE,CAAE,CAAA,EAEL,GAAI,CAAC6sB,EAAc,CACjB,MAAMM,EAAa,OAAO,KAAKL,CAAkB,EAAE,CAAC,EACpDA,EAAmBK,CAAU,EAAE,QAAU,EAC7C,CAEE,OAAOL,CACT,EACMM,GAAuB,CAAC7C,EAAW0B,EAAc,KAC9C1B,EAAU,OAAO,CAACvqB,EAAG2pB,IAAa,CACvC,MAAMiB,EAAQjB,EAAS,WAAW,OAASA,EAAS,WAAW,MAAQ,OAEvE,OAAK3pB,EAAE4qB,CAAK,IACV5qB,EAAE4qB,CAAK,EAAI,CACT,SAAUA,EACV,QAAS,GACT,WAAY,GACZ,UAAW,CAAE,EACb,IAAK,EACN,GAGH5qB,EAAE4qB,CAAK,EAAE,UAAU,KAAKoB,GAA0BS,GAAkB9C,CAAQ,EAAGsC,CAAW,CAAC,EACpFjsB,CACR,EAAE,EAAE,EAGDqtB,GAA0BC,GAAmBA,EAAgB,OAAO,CAACC,EAAQC,KAC5EA,GAILA,EAAI,QAAQC,GAAW,CACrB,KAAM,CACJ,QAAAC,EACA,SAAAV,CACN,EAAQS,EACJF,EAAOP,CAAQ,EAAI,CACjB,WAAY,GACZ,QAAS,GACT,WAAYU,EACZ,SAAAV,CACD,EAEGS,EAAQ,eAAe,aAAa,IACtCF,EAAOP,CAAQ,EAAE,YAAcS,EAAQ,aAGrCA,EAAQ,eAAe,YAAY,IACrCF,EAAOP,CAAQ,EAAE,WAAaS,EAAQ,YAGpCA,EAAQ,eAAe,IAAI,IAC7BF,EAAOP,CAAQ,EAAE,IAAI,EAAIS,EAAQ,IAAI,EAE3C,CAAG,EACMF,GACN,EAAE,EAECI,GAAsB,CAAC,CAC3B,WAAA9f,EACA,SAAAsb,EACA,KAAAS,EACA,oBAAA2C,CACF,IAAM,CACJ,MAAM5C,EAAW,CACf,WAAY,CACV,KAAM9b,EAAW,GACjB,MAAO,QACP,UAAW,OACX,WAAY,CACV,MAAOA,EAAW,MAClB,OAAQA,EAAW,MACpB,EACD,OAAQA,EAAW,OACnB,UAAWA,EAAW,UACrB,aAAe,CACjB,EACD,IAAK,GACL,QAASA,EAAW,OAAS,SAC7B,SAAUA,EAAW,YACrB,YAAaA,EAAW,SAAW,GACnC,eAAgBA,EAAW,SAC3B,oBAAA0e,EACA,eAAgB1e,EAAW,eAC3B,SAAAsb,CACD,EAED,OAAItb,EAAW,YACb8b,EAAS,WAAW,YAAY,EAAI9b,EAAW,WAG7CA,EAAW,oBACb8b,EAAS,kBAAoB9b,EAAW,mBAGtCA,EAAW,kBACb8b,EAAS,WAAW,gBAAkB9b,EAAW,iBAG/C+b,IACFD,EAAS,KAAOC,GAGXD,CACT,EAEMiE,GAAY,CAAC,CACjB,WAAA/f,CACF,IAAMA,EAAW,WAAa,aAAeA,EAAW,WAAa,cAAgBA,EAAW,cAAgB,QAE1GggB,GAAY,CAAC,CACjB,WAAAhgB,CACF,IAAMA,EAAW,WAAa,aAAeA,EAAW,WAAa,cAAgBA,EAAW,cAAgB,QAE1GigB,GAAU,CAAC,CACf,WAAAjgB,CACF,IAAMA,EAAW,WAAa,YAAcA,EAAW,cAAgB,OAiCjEkgB,GAAyB,CAACxD,EAAWF,IAAmB,CAE5DE,EAAU,QAAQZ,GAAY,CAC5BA,EAAS,cAAgB,EACzBA,EAAS,sBAAwBU,EAAe,UAAU,SAAU,CAClE,SAAAR,CACN,EAAO,CACD,OAAOA,IAAaF,EAAS,QACnC,CAAK,EAEIA,EAAS,UAIdA,EAAS,SAAS,QAAQ,CAAC5a,EAASpS,IAAU,CAC5CoS,EAAQ,OAASpS,CACvB,CAAK,CACL,CAAG,CACH,EAWMqxB,GAA6BC,GAC5BA,EAIE,OAAO,KAAKA,CAAgB,EAAE,OAAO,CAAC/f,EAAK0c,IAAU,CAC1D,MAAMsD,EAAgBD,EAAiBrD,CAAK,EAC5C,OAAO1c,EAAI,OAAOggB,EAAc,SAAS,CAC1C,EAAE,EAAE,EANI,CAAE,EAQPC,GAAS,CAAC,CACd,cAAAC,EACA,UAAAC,EACA,gBAAAC,EACA,YAAArC,EAAc,CAAE,EAChB,iBAAAsC,EACA,YAAAC,CACF,IAAM,CACJ,GAAI,CAACJ,EAAc,OACjB,MAAO,CAAE,EAIX,KAAM,CACJ,eAAgBpG,EAChB,KAAAluB,EACA,2BAAA20B,EACA,oBAAAhG,CACJ,EAAM2F,EAAc,CAAC,EAAE,WACfM,EAAiBhD,GAA4B0C,EAAc,OAAOR,EAAS,CAAC,EAAE,IAAID,EAAmB,EACrGgB,EAAiBjD,GAA4B0C,EAAc,OAAOP,EAAS,CAAC,EAC5Ee,EAAelD,GAA4B0C,EAAc,OAAON,EAAO,CAAC,EACxEe,EAAWT,EAAc,IAAIzE,GAAYA,EAAS,WAAW,eAAe,EAAE,OAAO,OAAO,EAC5Fra,EAAW,CACf,WAAY,GACZ,oBAAqB,CAAE,EACvB,SAAU,CAAE,EACZ,QAAS,GACT,YAAa,CACX,MAAO,CAAE,EACT,MAAO,CAAE,EACR,kBAAoB,CAAE,EACvB,UAAW,CAAA,CACZ,EACD,IAAK,GACL,SAAA0Y,EACA,UAAWoE,GAA2BsC,EAAgBzC,CAAW,CAClE,EAEGxD,GAAuB,IACzBnZ,EAAS,oBAAsBmZ,EAAsB,KAGnD4F,IACF/e,EAAS,UAAY+e,GAGnBC,IACFhf,EAAS,gBAAkBgf,GAGzBx0B,IAAS,YACXwV,EAAS,2BAA6Bmf,GAGpCD,GAAeA,EAAY,OAAS,IACtClf,EAAS,YAAckf,GAGzB,MAAMhC,EAAcld,EAAS,UAAU,SAAW,EAC5Cwf,EAAsBH,EAAe,OAAS/B,GAAuB+B,EAAgB1C,EAAaO,CAAW,EAAI,KACjHuC,EAAoBH,EAAa,OAASxB,GAAqBwB,EAAc3C,CAAW,EAAI,KAC5Fa,EAAqB4B,EAAe,OAAOV,GAA2Bc,CAAmB,EAAGd,GAA2Be,CAAiB,CAAC,EACzIC,EAAyBlC,EAAmB,IAAI,CAAC,CACrD,eAAAzC,CACD,IAAKA,CAAc,EAgBpB,OAfA/a,EAAS,eAAiB8a,GAAwB4E,CAAsB,EACxEjB,GAAuBjB,EAAoBxd,EAAS,cAAc,EAE9Dwf,IACFxf,EAAS,YAAY,MAAM,MAAQwf,GAGjCC,IACFzf,EAAS,YAAY,UAAU,KAAOyf,GAGpCF,EAAS,SACXvf,EAAS,YAAY,iBAAiB,EAAE,GAAK+d,GAAwBwB,CAAQ,GAG3EN,EACKjD,GAA2B,CAChC,YAAaiD,EACb,YAAajf,CACnB,CAAK,EAGIA,CACT,EAiBM2f,GAAgB,CAACphB,EAAYqhB,EAAMlH,IAAa,CACpD,KAAM,CACJ,IAAAK,EACA,aAAAC,EACA,sBAAAC,EACA,UAAAN,EAAY,EACZ,YAAAO,EAAc,EACd,oBAAAC,EAAsB,CAC1B,EAAM5a,EACE8a,GAAON,EAAMC,GAAgB,IAC7BM,EAAgBL,EAAwBC,EAExCL,EADcQ,EAAMF,EACWG,EACrC,OAAO,KAAK,MAAMT,EAAiBF,EAAYiH,GAAQlH,CAAQ,CACjE,EAgBMmH,GAAkB,CAACthB,EAAYuhB,IAAoB,CACvD,KAAM,CACJ,KAAAt1B,EACA,oBAAA2uB,EAAsB,EACtB,MAAA4G,EAAQ,GACR,eAAAnH,EACA,UAAAD,EAAY,EACZ,YAAAgB,EAAc,EACd,YAAaY,CACjB,EAAMhc,EACEsb,EAAW,CAAE,EACnB,IAAI+F,EAAO,GAEX,QAASI,EAAS,EAAGA,EAASF,EAAgB,OAAQE,IAAU,CAC9D,MAAMC,EAAIH,EAAgBE,CAAM,EAC1BtH,EAAWuH,EAAE,EACbC,EAASD,EAAE,GAAK,EAChBE,EAAcF,EAAE,GAAK,EAEvBL,EAAO,IAETA,EAAOO,GAGLA,GAAeA,EAAcP,IAqB/BA,EAAOO,GAGT,IAAIjsB,EAEJ,GAAIgsB,EAAS,EAAG,CACd,MAAME,EAAQJ,EAAS,EAEnBI,IAAUN,EAAgB,OAExBt1B,IAAS,WAAa2uB,EAAsB,GAAK4G,EAAM,QAAQ,UAAU,EAAI,EAC/E7rB,EAAQyrB,GAAcphB,EAAYqhB,EAAMlH,CAAQ,EAGhDxkB,GAAS0kB,EAAiBD,EAAYiH,GAAQlH,EAGhDxkB,GAAS4rB,EAAgBM,CAAK,EAAE,EAAIR,GAAQlH,CAEpD,MACMxkB,EAAQgsB,EAAS,EAGnB,MAAM1P,EAAMmJ,EAAcE,EAAS,OAAS3lB,EAC5C,IAAIsR,EAASmU,EAAcE,EAAS,OAEpC,KAAOrU,EAASgL,GACdqJ,EAAS,KAAK,CACZ,OAAArU,EACA,SAAUkT,EAAWC,EACrB,KAAAiH,EACA,SAAArF,CACR,CAAO,EACDqF,GAAQlH,EACRlT,GAEN,CAEE,OAAOqU,CACT,EAEMwG,GAAoB,kCAsCpBC,GAAwB9I,GAAU,CAACrZ,EAAOsE,EAAY8d,EAAQvrB,IAAU,CAC5E,GAAImJ,IAAU,KAEZ,MAAO,IAGT,GAAI,OAAOqZ,EAAO/U,CAAU,EAAM,IAChC,OAAOtE,EAGT,MAAM1R,EAAQ,GAAK+qB,EAAO/U,CAAU,EAapC,OAXIA,IAAe,qBAKd8d,EAGHvrB,EAAQ,SAASA,EAAO,EAAE,EAF1BA,EAAQ,EAKNvI,EAAM,QAAUuI,GACXvI,EAGF,GAAG,IAAI,MAAMuI,EAAQvI,EAAM,OAAS,CAAC,EAAE,KAAK,GAAG,CAAC,GAAGA,CAAK,EACjE,EAoBM+zB,GAAuB,CAAClkB,EAAKkb,IAAWlb,EAAI,QAAQ+jB,GAAmBC,GAAsB9I,CAAM,CAAC,EAepGiJ,GAAoB,CAACliB,EAAYuhB,IACjC,CAACvhB,EAAW,UAAY,CAACuhB,EAGpB,CAAC,CACN,OAAQvhB,EAAW,aAAe,EAClC,SAAUA,EAAW,eACrB,KAAM,EACN,SAAUA,EAAW,WAC3B,CAAK,EAGCA,EAAW,SACNqb,GAAgBrb,CAAU,EAG5BshB,GAAgBthB,EAAYuhB,CAAe,EAe9CY,GAAuB,CAACniB,EAAYuhB,IAAoB,CAC5D,MAAMa,EAAiB,CACrB,iBAAkBpiB,EAAW,GAC7B,UAAWA,EAAW,WAAa,CACpC,EACK,CACJ,eAAAyb,EAAiB,CACf,UAAW,GACX,MAAO,EACb,CACA,EAAMzb,EACEqiB,EAAa3I,GAAiB,CAClC,QAAS1Z,EAAW,QACpB,OAAQiiB,GAAqBxG,EAAe,UAAW2G,CAAc,EACrE,MAAO3G,EAAe,KAC1B,CAAG,EAED,OADiByG,GAAkBliB,EAAYuhB,CAAe,EAC9C,IAAIrgB,GAAW,CAC7BkhB,EAAe,OAASlhB,EAAQ,OAChCkhB,EAAe,KAAOlhB,EAAQ,KAC9B,MAAM9R,EAAM6yB,GAAqBjiB,EAAW,OAAS,GAAIoiB,CAAc,EAGjEhI,EAAYpa,EAAW,WAAa,EAEpCsiB,EAAyBtiB,EAAW,wBAA0B,EAC9D0b,EAEN1b,EAAW,aAAekB,EAAQ,KAAOohB,GAA0BlI,EAUnE,MATY,CACV,IAAAhrB,EACA,SAAU8R,EAAQ,SAClB,SAAUA,EAAQ,SAClB,YAAa9C,GAAW4B,EAAW,SAAW,GAAI5Q,CAAG,EACrD,IAAKizB,EACL,OAAQnhB,EAAQ,OAChB,iBAAAwa,CACD,CAEL,CAAG,CACH,EAcM6G,GAA4B,CAACviB,EAAYwiB,IAAe,CAC5D,KAAM,CACJ,QAAAnkB,EACA,eAAAod,EAAiB,CAAA,CACrB,EAAMzb,EACE2b,EAAcjC,GAAiB,CACnC,QAAArb,EACA,OAAQod,EAAe,UACvB,MAAOA,EAAe,KAC1B,CAAG,EACKva,EAAUwY,GAAiB,CAC/B,QAAArb,EACA,OAAQmkB,EAAW,MACnB,MAAOA,EAAW,UACtB,CAAG,EACD,OAAAthB,EAAQ,IAAMya,EACPza,CACT,EAgBMuhB,GAAmB,CAACziB,EAAYuhB,IAAoB,CACxD,KAAM,CACJ,SAAApH,EACA,YAAAuI,EAAc,CAAE,EAChB,YAAA/H,CACD,EAAG3a,EAGJ,GAAI,CAACma,GAAY,CAACoH,GAAmBpH,GAAYoH,EAC/C,MAAM,IAAI,MAAM9H,GAAO,wBAAwB,EAGjD,MAAMkJ,EAAgBD,EAAY,IAAIE,GAAoBL,GAA0BviB,EAAY4iB,CAAgB,CAAC,EACjH,IAAIhH,EAEJ,OAAIzB,IACFyB,EAAkBP,GAAgBrb,CAAU,GAG1CuhB,IACF3F,EAAkB0F,GAAgBthB,EAAYuhB,CAAe,GAG9C3F,EAAgB,IAAI,CAACgG,EAAa9yB,IAAU,CAC3D,GAAI6zB,EAAc7zB,CAAK,EAAG,CACxB,MAAMoS,EAAUyhB,EAAc7zB,CAAK,EAG7BsrB,EAAYpa,EAAW,WAAa,EAEpCsiB,EAAyBtiB,EAAW,wBAA0B,EACpE,OAAAkB,EAAQ,SAAW0gB,EAAY,SAC/B1gB,EAAQ,SAAW0gB,EAAY,SAC/B1gB,EAAQ,OAAS0gB,EAAY,OAC7B1gB,EAAQ,iBAAmByZ,GAAeiH,EAAY,KAAOU,GAA0BlI,EAChFlZ,CACR,CAIL,CAAG,EAAE,OAAOA,GAAWA,CAAO,CAE9B,EAEM2hB,GAAmB,CAAC,CACxB,WAAA7iB,EACA,YAAA8iB,CACF,IAAM,CACJ,IAAIC,EACAC,EAEAF,EAAY,UACdE,EAAab,GACbY,EAAoBhK,GAAM/Y,EAAY8iB,EAAY,QAAQ,GACjDA,EAAY,MACrBE,EAAaxH,GACbuH,EAAoBhK,GAAM/Y,EAAY8iB,EAAY,IAAI,GAC7CA,EAAY,OACrBE,EAAaP,GACbM,EAAoBhK,GAAM/Y,EAAY8iB,EAAY,IAAI,GAGxD,MAAMG,EAAe,CACnB,WAAAjjB,CACD,EAED,GAAI,CAACgjB,EACH,OAAOC,EAGT,MAAM3H,EAAW0H,EAAWD,EAAmBD,EAAY,eAAe,EAI1E,GAAIC,EAAkB,SAAU,CAC9B,KAAM,CACJ,SAAA5I,EACA,UAAAC,EAAY,CAClB,EAAQ2I,EACJA,EAAkB,SAAW5I,EAAWC,CAC5C,MAAakB,EAAS,OAGlByH,EAAkB,SAAWzH,EAAS,OAAO,CAACjU,EAAKnG,IAC1C,KAAK,IAAImG,EAAK,KAAK,KAAKnG,EAAQ,QAAQ,CAAC,EAC/C,CAAC,EAEJ6hB,EAAkB,SAAW,EAG/B,OAAAE,EAAa,WAAaF,EAC1BE,EAAa,SAAW3H,EAEpBwH,EAAY,MAAQC,EAAkB,aACxCE,EAAa,KAAO3H,EAAS,CAAC,EAC9B2H,EAAa,SAAW,CAAE,GAGrBA,CACT,EACMC,GAAcC,GAAmBA,EAAgB,IAAIN,EAAgB,EAErEO,GAAe,CAACrvB,EAASI,IAASklB,GAAKtlB,EAAQ,UAAU,EAAE,OAAO,CAAC,CACvE,QAAAG,CACF,IAAMA,IAAYC,CAAI,EAChBkvB,GAAatvB,GAAWA,EAAQ,YAAY,KAAM,EASlDuvB,GAAqBp1B,GAClB,WAAWA,EAAM,MAAM,GAAG,EAAE,OAAO,CAACq1B,EAAMzvB,IAAYyvB,EAAOzvB,CAAO,CAAC,EAGxE0vB,GAAgBliB,GAAO,CAQ3B,MAAM1B,EADgB,+EACM,KAAK0B,CAAG,EAEpC,GAAI,CAAC1B,EACH,MAAO,GAGT,KAAM,CAAC6jB,EAAMC,EAAOC,EAAKC,EAAMC,EAAQC,CAAM,EAAIlkB,EAAM,MAAM,CAAC,EAC9D,OAAO,WAAW6jB,GAAQ,CAAC,EAAI,QAAkB,WAAWC,GAAS,CAAC,EAAI,OAAmB,WAAWC,GAAO,CAAC,EAAI,MAAiB,WAAWC,GAAQ,CAAC,EAAI,KAAkB,WAAWC,GAAU,CAAC,EAAI,GAAiB,WAAWC,GAAU,CAAC,CAClP,EACMC,GAAYziB,IAGE,oCAGJ,KAAKA,CAAG,IACpBA,GAAO,KAGF,KAAK,MAAMA,CAAG,GAGjB0iB,GAAU,CAUd,0BAA0B91B,EAAO,CAC/B,OAAOs1B,GAAct1B,CAAK,CAC3B,EAYD,sBAAsBA,EAAO,CAC3B,OAAO61B,GAAU71B,CAAK,EAAI,GAC3B,EAWD,oBAAoBA,EAAO,CACzB,OAAOs1B,GAAct1B,CAAK,CAC3B,EAWD,2BAA2BA,EAAO,CAChC,OAAOs1B,GAAct1B,CAAK,CAC3B,EAWD,KAAKA,EAAO,CACV,OAAOA,CACR,EAWD,qBAAqBA,EAAO,CAC1B,OAAOs1B,GAAct1B,CAAK,CAC3B,EAWD,MAAMA,EAAO,CACX,OAAOs1B,GAAct1B,CAAK,CAC3B,EAUD,MAAMA,EAAO,CACX,OAAO,SAASA,EAAO,EAAE,CAC1B,EAUD,OAAOA,EAAO,CACZ,OAAO,SAASA,EAAO,EAAE,CAC1B,EAUD,UAAUA,EAAO,CACf,OAAO,SAASA,EAAO,EAAE,CAC1B,EAUD,UAAUA,EAAO,CACf,OAAOo1B,GAAmBp1B,CAAK,CAChC,EAUD,YAAYA,EAAO,CACjB,OAAO,SAASA,EAAO,EAAE,CAC1B,EAUD,UAAUA,EAAO,CACf,OAAO,SAASA,EAAO,EAAE,CAC1B,EAWD,uBAAuBA,EAAO,CAC5B,OAAO,SAASA,EAAO,EAAE,CAC1B,EAcD,SAASA,EAAO,CACd,MAAM+1B,EAAc,SAAS/1B,EAAO,EAAE,EAEtC,OAAI,MAAM+1B,CAAW,EACZT,GAAct1B,CAAK,EAGrB+1B,CACR,EAUD,EAAE/1B,EAAO,CACP,OAAO,SAASA,EAAO,EAAE,CAC1B,EAWD,EAAEA,EAAO,CACP,OAAO,SAASA,EAAO,EAAE,CAC1B,EAWD,EAAEA,EAAO,CACP,OAAO,SAASA,EAAO,EAAE,CAC1B,EAWD,iBAAiBA,EAAO,CACtB,OAAO,SAASA,EAAO,EAAE,CAC1B,EAWD,QAAQA,EAAO,CACb,OAAOA,CACX,CAEA,EAWM6R,GAAkB+M,GAChBA,GAAMA,EAAG,WAIRuM,GAAKvM,EAAG,UAAU,EAAE,OAAO,CAAC3a,EAAGpB,IAAM,CAC1C,MAAMmzB,EAAUF,GAAQjzB,EAAE,IAAI,GAAKizB,GAAQ,QAC3C,OAAA7xB,EAAEpB,EAAE,IAAI,EAAImzB,EAAQnzB,EAAE,KAAK,EACpBoB,CACR,EAAE,EAAE,EAPI,CAAE,EAUPgyB,GAAgB,CACpB,gDAAiD,kBACjD,gDAAiD,qBACjD,gDAAiD,0BACjD,gDAAiD,sBAEjD,mCAAoC,eACtC,EAYMC,GAAgB,CAACC,EAAYC,IAC5BA,EAAgB,OAIdnL,GAAQkL,EAAW,IAAI,SAAUjtB,EAAW,CACjD,OAAOktB,EAAgB,IAAI,SAAUC,EAAgB,CACnD,MAAMC,EAAiBnB,GAAWkB,CAAc,EAC1CE,EAAkBrmB,GAAWhH,EAAU,QAASotB,CAAc,EAC9DE,EAAe3L,GAAMhZ,GAAgBwkB,CAAc,EAAG,CAC1D,QAASE,CACjB,CAAO,EAGD,OAAIA,IAAoBD,GAAkB,CAACE,EAAa,iBAAmBttB,EAAU,kBACnFstB,EAAa,gBAAkBttB,EAAU,iBAGpCstB,CACb,CAAK,CACL,CAAG,CAAC,EAlBOL,EA2CLM,GAAwBC,GAAiB,CAC7C,MAAMC,EAAkBzB,GAAawB,EAAe,iBAAiB,EAAE,CAAC,EAClEE,EAAc1B,GAAawB,EAAe,aAAa,EAAE,CAAC,EAC1DlC,EAAcoC,GAAe1B,GAAa0B,EAAa,YAAY,EAAE,IAAIlzB,GAAKmnB,GAAM,CACxF,IAAK,YACT,EAAKhZ,GAAgBnO,CAAC,CAAC,CAAC,EAChBmzB,EAAc3B,GAAawB,EAAe,aAAa,EAAE,CAAC,EAC1DI,EAA4BF,GAAeD,EAC3CtD,EAAkByD,GAA6B5B,GAAa4B,EAA2B,iBAAiB,EAAE,CAAC,EAC3GC,EAAkCH,GAAeC,GAAeF,EAChEK,EAAwBD,GAAmC7B,GAAa6B,EAAiC,gBAAgB,EAAE,CAAC,EAM5HE,EAAWN,GAAmB9kB,GAAgB8kB,CAAe,EAE/DM,GAAYD,EACdC,EAAS,eAAiBD,GAAyBnlB,GAAgBmlB,CAAqB,EAC/EC,GAAYA,EAAS,iBAI9BA,EAAS,eAAiB,CACxB,UAAWA,EAAS,cACrB,GAGH,MAAMrC,EAAc,CAClB,SAAAqC,EACA,gBAAiB5D,GAAmB6B,GAAa7B,EAAiB,GAAG,EAAE,IAAI3vB,GAAKmO,GAAgBnO,CAAC,CAAC,EAClG,KAAMkzB,GAAe/L,GAAMhZ,GAAgB+kB,CAAW,EAAG,CACvD,YAAApC,EACA,eAAgB3iB,GAAgBmlB,CAAqB,CAC3D,CAAK,EACD,KAAMH,GAAehM,GAAMhZ,GAAgBglB,CAAW,EAAG,CACvD,eAAgBhlB,GAAgBmlB,CAAqB,CACtD,CAAA,CACF,EACD,cAAO,KAAKpC,CAAW,EAAE,QAAQ/zB,GAAO,CACjC+zB,EAAY/zB,CAAG,GAClB,OAAO+zB,EAAY/zB,CAAG,CAE5B,CAAG,EACM+zB,CACT,EAsCMsC,GAAkB,CAACC,EAAyBC,EAAuBC,IAA6BC,GAAkB,CACtH,MAAMC,EAAqBrC,GAAaoC,EAAgB,SAAS,EAC3DE,EAActB,GAAckB,EAAuBG,CAAkB,EACrEzlB,EAAa+Y,GAAMsM,EAAyBtlB,GAAgBylB,CAAc,CAAC,EAC3EG,EAA4BhB,GAAsBa,CAAc,EACtE,OAAOE,EAAY,IAAIrnB,IACd,CACL,YAAa0a,GAAMwM,EAA0BI,CAAyB,EACtE,WAAY5M,GAAM/Y,EAAY3B,CAAO,CACtC,EACF,CACH,EAWMunB,GAA+BC,GAC5BA,EAAuB,OAAO,CAACxlB,EAAK9L,IAAS,CAClD,MAAMyL,EAAaD,GAAgBxL,CAAI,EAKnCyL,EAAW,cACbA,EAAW,YAAcA,EAAW,YAAY,YAAa,GAG/D,MAAM8lB,EAAY3B,GAAcnkB,EAAW,WAAW,EAEtD,GAAI8lB,EAAW,CACbzlB,EAAIylB,CAAS,EAAI,CACf,WAAA9lB,CACD,EACD,MAAM+lB,EAAW3C,GAAa7uB,EAAM,WAAW,EAAE,CAAC,EAElD,GAAIwxB,EAAU,CACZ,MAAMC,EAAO3C,GAAW0C,CAAQ,EAChC1lB,EAAIylB,CAAS,EAAE,KAAOE,GAAQ5mB,GAAsB4mB,CAAI,CAChE,CACA,CAEI,OAAO3lB,CACR,EAAE,EAAE,EAID4lB,GAA8BrG,GAAW,CAE7C,GAAIA,EAAQ,cAAgB,gCAE1B,OADe,OAAOA,EAAQ,OAAU,SAAW,CAAE,EAAGA,EAAQ,MAAM,MAAM,GAAG,GACjE,IAAI1xB,GAAS,CACzB,IAAI2xB,EACAV,EAEJ,OAAAA,EAAWjxB,EAEP,SAAS,KAAKA,CAAK,EACrB,CAAC2xB,EAASV,CAAQ,EAAIjxB,EAAM,MAAM,GAAG,EAC5B,SAAS,KAAKA,CAAK,IAC5B2xB,EAAU3xB,GAGL,CACL,QAAA2xB,EACA,SAAAV,CACD,CACP,CAAK,EACI,GAAIS,EAAQ,cAAgB,gCAEjC,OADe,OAAOA,EAAQ,OAAU,SAAW,CAAE,EAAGA,EAAQ,MAAM,MAAM,GAAG,GACjE,IAAI1xB,GAAS,CACzB,MAAMg4B,EAAQ,CAEZ,QAAW,OAGX,SAAY,OAGZ,YAAe,EAIf,WAAc,EAId,KAAM,CACP,EAED,GAAI,IAAI,KAAKh4B,CAAK,EAAG,CACnB,KAAM,CAAC2xB,EAAStiB,EAAO,EAAE,EAAIrP,EAAM,MAAM,GAAG,EAC5Cg4B,EAAM,QAAUrG,EAChBqG,EAAM,SAAWh4B,EACjBqP,EAAK,MAAM,GAAG,EAAE,QAAQ4oB,GAAO,CAC7B,KAAM,CAAChyB,EAAM6B,CAAG,EAAImwB,EAAI,MAAM,GAAG,EAE7BhyB,IAAS,OACX+xB,EAAM,SAAWlwB,EACR7B,IAAS,KAClB+xB,EAAM,WAAa,OAAOlwB,CAAG,EACpB7B,IAAS,MAClB+xB,EAAM,YAAc,OAAOlwB,CAAG,EACrB7B,IAAS,OAClB+xB,EAAM,IAAI,EAAI,OAAOlwB,CAAG,EAEpC,CAAS,CACT,MACQkwB,EAAM,SAAWh4B,EAGnB,OAAIg4B,EAAM,UACRA,EAAM,QAAU,UAAYA,EAAM,SAG7BA,CACb,CAAK,CAEL,EAUME,GAAgBC,GAEblN,GAAQiK,GAAaiD,EAAO,KAAM,aAAa,EAAE,IAAI1F,GAAe,CACzE,MAAM2F,EAAwBvmB,GAAgB4gB,CAAW,EACnD4F,EAAcD,EAAsB,YAE1C,OAAOlD,GAAazC,EAAa,OAAO,EAAE,IAAIvgB,GAAS,CACrD,MAAMomB,EAAkBzmB,GAAgBK,CAAK,EACvCsb,EAAmB8K,EAAgB,kBAAoB,EACvDpM,EAAYkM,EAAsB,WAAa,EAC/CnM,EAAWqM,EAAgB,UAAY,EACvCxU,EAAQ0J,EAAmBtB,EAAYiM,EAAO,WAAW,MAC/D,MAAO,CACL,YAAAE,EACA,MAAOD,EAAsB,MAC7B,GAAIE,EAAgB,GACpB,MAAAxU,EACA,IAAKA,EAAQmI,EAAWC,EACxB,YAAaiJ,GAAWjjB,CAAK,GAAKomB,EAAgB,YAClD,gBAAiBF,EAAsB,gBACvC,uBAAwBA,EAAsB,wBAA0B,CACzE,CACP,CAAK,CACL,CAAG,CAAC,EA4BEG,GAAoB,CAACC,EAAkBC,EAAgBC,IAAsBhC,GAAiB,CAClG,MAAMS,EAA0BtlB,GAAgB6kB,CAAa,EACvDU,EAAwBlB,GAAcuC,EAAgBvD,GAAawB,EAAe,SAAS,CAAC,EAC5F1F,EAAOkE,GAAawB,EAAe,MAAM,EAAE,CAAC,EAC5CiC,EAAiB,CACrB,KAAM9mB,GAAgBmf,CAAI,CAC3B,EACD,IAAIjf,EAAQ8Y,GAAM2N,EAAkBrB,EAAyBwB,CAAc,EAC3E,MAAMC,EAAgB1D,GAAawB,EAAe,eAAe,EAAE,CAAC,EAC9DnF,EAAkBwG,GAA4BlmB,GAAgB+mB,CAAa,CAAC,EAE9ErH,IACFxf,EAAQ8Y,GAAM9Y,EAAO,CACnB,gBAAAwf,CACN,CAAK,GAGH,MAAM1C,EAAQqG,GAAawB,EAAe,OAAO,EAAE,CAAC,EAEpD,GAAI7H,GAASA,EAAM,WAAW,OAAQ,CACpC,MAAMgK,EAAWhK,EAAM,WAAW,CAAC,EAAE,UAAU,KAAM,EACrD9c,EAAQ8Y,GAAM9Y,EAAO,CACnB,MAAO8mB,CACb,CAAK,CACL,CAEE,MAAMC,EAAoBpB,GAA6BxC,GAAawB,EAAe,mBAAmB,CAAC,EAEnG,OAAO,KAAKoC,CAAiB,EAAE,SACjC/mB,EAAQ8Y,GAAM9Y,EAAO,CACnB,kBAAA+mB,CACN,CAAK,GAGH,MAAMlE,EAAc6B,GAAsBC,CAAa,EACjDzB,EAAkBC,GAAawB,EAAe,gBAAgB,EAC9DW,EAA2BxM,GAAM6N,EAAmB9D,CAAW,EACrE,OAAO3J,GAAQgK,EAAgB,IAAIiC,GAAgBnlB,EAAOqlB,EAAuBC,CAAwB,CAAC,CAAC,CAC7G,EAsCM0B,GAAmB,CAACC,EAAeC,IAAgB,CAACd,EAAQv3B,IAAU,CAC1E,MAAM63B,EAAiBvC,GAAc+C,EAAa/D,GAAaiD,EAAO,KAAM,SAAS,CAAC,EAChFK,EAAmB3N,GAAMmO,EAAe,CAC5C,YAAab,EAAO,WAAW,KACnC,CAAG,EAEG,OAAOA,EAAO,WAAW,UAAa,WACxCK,EAAiB,eAAiBL,EAAO,WAAW,UAGtD,MAAMe,EAAiBhE,GAAaiD,EAAO,KAAM,eAAe,EAC1DO,EAAoBjC,GAAsB0B,EAAO,IAAI,EAC3D,OAAOlN,GAAQiO,EAAe,IAAIX,GAAkBC,EAAkBC,EAAgBC,CAAiB,CAAC,CAAC,CAC3G,EAgBMS,GAAqC,CAACC,EAAsBC,IAAiB,CAUjF,GARID,EAAqB,OAAS,GAChCC,EAAa,CACX,KAAM,OACN,QAAS,sEACf,CAAK,EAIC,CAACD,EAAqB,OACxB,OAAO,KAGT,MAAME,EAA6BzO,GAAM,CACvC,UAAWsK,GAAWiE,EAAqB,CAAC,CAAC,CAC9C,EAAEvnB,GAAgBunB,EAAqB,CAAC,CAAC,CAAC,EAG3C,OAAAE,EAA2B,iBAAmBA,EAA2B,mBAAqB,OACvFA,CACT,EAgBMC,GAAiB,CAAC,CACtB,WAAAznB,EACA,sBAAA0nB,EACA,QAAAC,CACF,IAeM,OAAO3nB,EAAW,OAAU,SACvBA,EAAW,MAIhB0nB,GAAyB,OAAOA,EAAsB,OAAU,UAAY,OAAOA,EAAsB,UAAa,SACjHA,EAAsB,MAAQA,EAAsB,SAIzD,CAACA,GAAyBC,IAAY,SACjC,EAUF,KAoBHC,GAAoB,CAACC,EAAK76B,EAAU,KAAO,CAC/C,KAAM,CACJ,YAAA86B,EAAc,GACd,IAAAtN,EAAM,KAAK,IAAK,EAChB,aAAAC,EAAe,EAOf,aAAA8M,EAAe,UAAY,CAAA,CAC/B,EAAMv6B,EACE+6B,EAAc3E,GAAayE,EAAK,QAAQ,EAE9C,GAAI,CAACE,EAAY,OACf,MAAM,IAAI,MAAMtO,GAAO,wBAAwB,EAGjD,MAAM+G,EAAY4C,GAAayE,EAAK,UAAU,EACxCX,EAAgBnnB,GAAgB8nB,CAAG,EACnCV,EAAc/C,GAAc,CAAC,CACjC,QAAS0D,CACV,CAAA,EAAG1E,GAAayE,EAAK,SAAS,CAAC,EAC1BP,EAAuBlE,GAAayE,EAAK,iBAAiB,EAEhEX,EAAc,KAAOA,EAAc,MAAQ,SAC3CA,EAAc,eAAiBA,EAAc,2BAA6B,EAC1EA,EAAc,IAAM1M,EACpB0M,EAAc,aAAezM,EAEzB+F,EAAU,SACZ0G,EAAc,UAAY1G,EAAU,IAAI6C,EAAU,GAGpD,MAAM2E,EAAU,CAAA,EAKhB,OAAAD,EAAY,QAAQ,CAACxzB,EAAMzF,IAAU,CACnC,MAAMkR,EAAaD,GAAgBxL,CAAI,EAGjC0zB,EAAcD,EAAQl5B,EAAQ,CAAC,EACrCkR,EAAW,MAAQynB,GAAe,CAChC,WAAAznB,EACA,sBAAuBioB,EAAcA,EAAY,WAAa,KAC9D,QAASf,EAAc,IAC7B,CAAK,EACDc,EAAQ,KAAK,CACX,KAAAzzB,EACA,WAAAyL,CACN,CAAK,CACL,CAAG,EACM,CACL,UAAWknB,EAAc,UACzB,oBAAqBG,GAAmCC,EAAsBC,CAAY,EAQ1F,mBAAoBpO,GAAQ6O,EAAQ,IAAIf,GAAiBC,EAAeC,CAAW,CAAC,CAAC,EACrF,YAAahO,GAAQ6O,EAAQ,IAAI5B,EAAa,CAAC,CAChD,CACH,EAEM8B,GAAiBC,GAAkB,CACvC,GAAIA,IAAmB,GACrB,MAAM,IAAI,MAAM1O,GAAO,mBAAmB,EAG5C,MAAM2O,EAAS,IAAI3Q,GACnB,IAAI4Q,EACAR,EAEJ,GAAI,CACFQ,EAAMD,EAAO,gBAAgBD,EAAgB,iBAAiB,EAC9DN,EAAMQ,GAAOA,EAAI,gBAAgB,UAAY,MAAQA,EAAI,gBAAkB,IAC5E,MAAW,CACd,CAEE,GAAI,CAACR,GAAOA,GAAOA,EAAI,qBAAqB,aAAa,EAAE,OAAS,EAClE,MAAM,IAAI,MAAMpO,GAAO,gBAAgB,EAGzC,OAAOoO,CACT,EAWMS,GAAuBT,GAAO,CAClC,MAAMU,EAAgBnF,GAAayE,EAAK,WAAW,EAAE,CAAC,EAEtD,GAAI,CAACU,EACH,OAAO,KAGT,MAAMvoB,EAAaD,GAAgBwoB,CAAa,EAEhD,OAAQvoB,EAAW,YAAW,CAC5B,IAAK,mCACL,IAAK,mCACHA,EAAW,OAAS,OACpB,MAEF,IAAK,qCACL,IAAK,kCACL,IAAK,qCACL,IAAK,kCACHA,EAAW,OAAS,MACpB,MAEF,IAAK,gCACL,IAAK,gCACHA,EAAW,OAAS,SACpBA,EAAW,MAAQ,KAAK,MAAMA,EAAW,KAAK,EAC9C,MAEF,IAAK,kCACL,IAAK,6BACL,IAAK,8BACL,QACE,MAAM,IAAI,MAAMyZ,GAAO,6BAA6B,CAC1D,CAEE,OAAOzZ,CACT,EAiBM6U,GAAQ,CAACsT,EAAgBn7B,EAAU,KAAO,CAC9C,MAAMw7B,EAAqBZ,GAAkBM,GAAeC,CAAc,EAAGn7B,CAAO,EAC9E0vB,EAAYwG,GAAYsF,EAAmB,kBAAkB,EACnE,OAAOlI,GAAO,CACZ,cAAe5D,EACf,UAAW8L,EAAmB,UAC9B,gBAAiBA,EAAmB,oBACpC,YAAax7B,EAAQ,YACrB,iBAAkBA,EAAQ,iBAC1B,YAAaw7B,EAAmB,WACpC,CAAG,CACH,EAWMC,GAAiBN,GAAkBG,GAAqBJ,GAAeC,CAAc,CAAC,ECzqF5F,IAAIO,GAAa,KAAK,IAAI,EAAG,EAAE,EAE3BC,GAAY,SAASC,EAAO,CAC9B,IAAIC,EAAK,IAAI,SAASD,EAAM,OAAQA,EAAM,WAAYA,EAAM,UAAU,EAClE16B,EAEJ,OAAI26B,EAAG,cACL36B,EAAQ26B,EAAG,aAAa,CAAC,EAErB36B,EAAQ,OAAO,iBACV,OAAOA,CAAK,EAGdA,GAGD26B,EAAG,UAAU,CAAC,EAAIH,GAAcG,EAAG,UAAU,CAAC,CACxD,EAEAC,GAAiB,CACf,UAAWH,EAEb,ECtBIA,GAAYz+B,GAA+B,UAE3C6+B,GAAY,SAAStwB,EAAM,CAC7B,IAAIqP,EAAO,IAAI,SAASrP,EAAK,OAAQA,EAAK,WAAYA,EAAK,UAAU,EACjE7J,EAAS,CACP,QAAS6J,EAAK,CAAC,EACf,MAAO,IAAI,WAAWA,EAAK,SAAS,EAAG,CAAC,CAAC,EACzC,WAAY,CAAE,EACd,YAAaqP,EAAK,UAAU,CAAC,EAC7B,UAAWA,EAAK,UAAU,CAAC,CAC5B,EACHrc,EAAI,GAEFmD,EAAO,UAAY,GACrBA,EAAO,yBAA2BkZ,EAAK,UAAUrc,CAAC,EAClDmD,EAAO,YAAckZ,EAAK,UAAUrc,EAAI,CAAC,EACzCA,GAAK,IAGLmD,EAAO,yBAA2B+5B,GAAUlwB,EAAK,SAAShN,CAAC,CAAC,EAC5DmD,EAAO,YAAc+5B,GAAUlwB,EAAK,SAAShN,EAAI,CAAC,CAAC,EACnDA,GAAK,IAGPA,GAAK,EAEL,IAAIu9B,EAAiBlhB,EAAK,UAAUrc,CAAC,EAIrC,IAFAA,GAAK,EAEEu9B,EAAiB,EAAGv9B,GAAK,GAAIu9B,IAClCp6B,EAAO,WAAW,KAAK,CACrB,eAAgB6J,EAAKhN,CAAC,EAAI,OAAU,EACpC,eAAgBqc,EAAK,UAAUrc,CAAC,EAAI,WACpC,mBAAoBqc,EAAK,UAAUrc,EAAI,CAAC,EACxC,cAAe,CAAC,EAAEgN,EAAKhN,EAAI,CAAC,EAAI,KAChC,SAAUgN,EAAKhN,EAAI,CAAC,EAAI,OAAU,EAClC,aAAcqc,EAAK,UAAUrc,EAAI,CAAC,EAAI,SAC5C,CAAK,EAGH,OAAOmD,CACT,EAGAq6B,GAAiBF,mBC5CjB,IAAIG,GAAM1iB,EAAQ,CAAC,GAAM,GAAM,EAAI,CAAC,EACzB2iB,GAAa,SAAoB1iB,EAAO6B,EAAQ,CACrDA,IAAW,SACbA,EAAS,GAGX7B,EAAQD,EAAQC,CAAK,EACrB,IAAIyf,EAAQzf,EAAM6B,EAAS,CAAC,EACxB8gB,EAAa3iB,EAAM6B,EAAS,CAAC,GAAK,GAAK7B,EAAM6B,EAAS,CAAC,GAAK,GAAK7B,EAAM6B,EAAS,CAAC,GAAK,EAAI7B,EAAM6B,EAAS,CAAC,EAC1G+gB,GAAiBnD,EAAQ,KAAO,EAEpC,OAAImD,EACKD,EAAa,GAGfA,EAAa,EACtB,EACWE,GAAe,SAASA,EAAa7iB,EAAO6B,EAAQ,CAO7D,OANIA,IAAW,SACbA,EAAS,GAGX7B,EAAQD,EAAQC,CAAK,EAEjBA,EAAM,OAAS6B,EAAS,IAAM,CAACC,GAAW9B,EAAOyiB,GAAK,CACxD,OAAQ5gB,CACZ,CAAG,EACQA,GAGTA,GAAU6gB,GAAW1iB,EAAO6B,CAAM,EAI3BghB,EAAa7iB,EAAO6B,CAAM,EACnC,EChCIihB,GAAgB,SAAuBtrB,EAAM,CAC/C,OAAI,OAAOA,GAAS,SACX2J,GAAc3J,CAAI,EAIlBA,CAIX,EAEIurB,GAAiB,SAAwBC,EAAO,CAClD,OAAK,MAAM,QAAQA,CAAK,EAIjBA,EAAM,IAAI,SAAU1xB,EAAG,CAC5B,OAAOwxB,GAAcxxB,CAAC,CAC1B,CAAG,EALQ,CAACwxB,GAAcE,CAAK,CAAC,CAMhC,EAoIWC,GAAU,SAASA,EAAQjjB,EAAOgjB,EAAOE,EAAU,CACxDA,IAAa,SACfA,EAAW,IAGbF,EAAQD,GAAeC,CAAK,EAC5BhjB,EAAQD,EAAQC,CAAK,EACrB,IAAImjB,EAAU,CAAE,EAEhB,GAAI,CAACH,EAAM,OAET,OAAOG,EAKT,QAFIn+B,EAAI,EAEDA,EAAIgb,EAAM,QAAQ,CACvB,IAAIvO,GAAQuO,EAAMhb,CAAC,GAAK,GAAKgb,EAAMhb,EAAI,CAAC,GAAK,GAAKgb,EAAMhb,EAAI,CAAC,GAAK,EAAIgb,EAAMhb,EAAI,CAAC,KAAO,EACpFQ,EAAOwa,EAAM,SAAShb,EAAI,EAAGA,EAAI,CAAC,EAEtC,GAAIyM,IAAS,EACX,MAGF,IAAI+Z,EAAMxmB,EAAIyM,EAEd,GAAI+Z,EAAMxL,EAAM,OAAQ,CAGtB,GAAIkjB,EACF,MAGF1X,EAAMxL,EAAM,MAClB,CAEI,IAAIhO,EAAOgO,EAAM,SAAShb,EAAI,EAAGwmB,CAAG,EAEhC1J,GAAWtc,EAAMw9B,EAAM,CAAC,CAAC,IACvBA,EAAM,SAAW,EAGnBG,EAAQ,KAAKnxB,CAAI,EAGjBmxB,EAAQ,KAAK,MAAMA,EAASF,EAAQjxB,EAAMgxB,EAAM,MAAM,CAAC,EAAGE,CAAQ,CAAC,GAIvEl+B,EAAIwmB,CACL,CAGD,OAAO2X,CACT,EC5MWC,GAAY,CACrB,KAAMrjB,EAAQ,CAAC,GAAM,GAAM,IAAM,GAAI,CAAC,EACtC,QAASA,EAAQ,CAAC,GAAM,GAAI,CAAC,EAC7B,QAASA,EAAQ,CAAC,GAAM,GAAM,IAAM,GAAI,CAAC,EACzC,YAAaA,EAAQ,CAAC,GAAM,GAAM,IAAM,GAAI,CAAC,EAC7C,OAAQA,EAAQ,CAAC,GAAM,GAAM,IAAM,GAAI,CAAC,EACxC,MAAOA,EAAQ,CAAC,GAAI,CAAC,EACrB,YAAaA,EAAQ,CAAC,GAAI,CAAC,EAC3B,gBAAiBA,EAAQ,CAAC,GAAM,IAAM,GAAI,CAAC,EAC3C,WAAYA,EAAQ,CAAC,GAAI,CAAC,EAC1B,UAAWA,EAAQ,CAAC,GAAI,CAAC,EACzB,YAAaA,EAAQ,CAAC,GAAI,CAAC,EAC3B,QAASA,EAAQ,CAAC,GAAI,CAAC,EACvB,aAAcA,EAAQ,CAAC,GAAM,GAAI,CAAC,EAClC,WAAYA,EAAQ,CAAC,GAAI,CAAC,EAC1B,WAAYA,EAAQ,CAAC,GAAI,CAAC,EAI1B,QAASA,EAAQ,CAAC,GAAM,GAAM,IAAM,GAAI,CAAC,EACzC,UAAWA,EAAQ,CAAC,GAAI,CAAC,EACzB,eAAgBA,EAAQ,CAAC,GAAM,IAAM,GAAI,CAAC,EAC1C,WAAYA,EAAQ,CAAC,GAAI,CAAC,EAC1B,cAAeA,EAAQ,CAAC,GAAI,CAAC,EAC7B,MAAOA,EAAQ,CAAC,GAAI,CAAC,EACrB,YAAaA,EAAQ,CAAC,GAAI,CAAC,CAC7B,EASIsjB,GAAe,CAAC,IAAK,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,CAAC,EAE3CC,GAAY,SAAmB5iB,EAAM,CAGvC,QAFItb,EAAM,EAEDJ,EAAI,EAAGA,EAAIq+B,GAAa,QAC3B,EAAA3iB,EAAO2iB,GAAar+B,CAAC,GADcA,IAKvCI,IAGF,OAAOA,CACT,EAOIm+B,GAAU,SAAiBvjB,EAAO6B,EAAQ2hB,EAAcnjB,EAAQ,CAC9DmjB,IAAiB,SACnBA,EAAe,IAGbnjB,IAAW,SACbA,EAAS,IAGX,IAAIhI,EAASirB,GAAUtjB,EAAM6B,CAAM,CAAC,EAChC4hB,EAAazjB,EAAM,SAAS6B,EAAQA,EAASxJ,CAAM,EAKvD,OAAImrB,IACFC,EAAa,MAAM,UAAU,MAAM,KAAKzjB,EAAO6B,EAAQA,EAASxJ,CAAM,EACtEorB,EAAW,CAAC,GAAKJ,GAAahrB,EAAS,CAAC,GAGnC,CACL,OAAQA,EACR,MAAO8H,GAAcsjB,EAAY,CAC/B,OAAQpjB,CACd,CAAK,EACD,MAAOojB,CACR,CACH,EAEIX,GAAgB,SAASA,EAActrB,EAAM,CAC/C,OAAI,OAAOA,GAAS,SACXA,EAAK,MAAM,SAAS,EAAE,IAAI,SAAUlG,EAAG,CAC5C,OAAOwxB,EAAcxxB,CAAC,CAC5B,CAAK,EAGC,OAAOkG,GAAS,SACXqJ,GAAcrJ,CAAI,EAGpBA,CACT,EAEIurB,GAAiB,SAAwBC,EAAO,CAClD,OAAK,MAAM,QAAQA,CAAK,EAIjBA,EAAM,IAAI,SAAU1xB,EAAG,CAC5B,OAAOwxB,GAAcxxB,CAAC,CAC1B,CAAG,EALQ,CAACwxB,GAAcE,CAAK,CAAC,CAMhC,EAEIU,GAAsB,SAASA,EAAoBtZ,EAAIpK,EAAO6B,EAAQ,CACxE,GAAIA,GAAU7B,EAAM,OAClB,OAAOA,EAAM,OAGf,IAAI2jB,EAAUJ,GAAQvjB,EAAO6B,EAAQ,EAAK,EAE1C,GAAIC,GAAWsI,EAAG,MAAOuZ,EAAQ,KAAK,EACpC,OAAO9hB,EAGT,IAAI+hB,EAAaL,GAAQvjB,EAAO6B,EAAS8hB,EAAQ,MAAM,EACvD,OAAOD,EAAoBtZ,EAAIpK,EAAO6B,EAAS+hB,EAAW,OAASA,EAAW,MAAQD,EAAQ,MAAM,CACtG,EAsBWE,GAAW,SAASA,EAAS7jB,EAAOgjB,EAAO,CACpDA,EAAQD,GAAeC,CAAK,EAC5BhjB,EAAQD,EAAQC,CAAK,EACrB,IAAImjB,EAAU,CAAE,EAEhB,GAAI,CAACH,EAAM,OACT,OAAOG,EAKT,QAFIn+B,EAAI,EAEDA,EAAIgb,EAAM,QAAQ,CACvB,IAAIoK,EAAKmZ,GAAQvjB,EAAOhb,EAAG,EAAK,EAC5B4+B,EAAaL,GAAQvjB,EAAOhb,EAAIolB,EAAG,MAAM,EACzC0Z,EAAY9+B,EAAIolB,EAAG,OAASwZ,EAAW,OAEvCA,EAAW,QAAU,MACvBA,EAAW,MAAQF,GAAoBtZ,EAAIpK,EAAO8jB,CAAS,EAEvDF,EAAW,QAAU5jB,EAAM,SAC7B4jB,EAAW,OAASE,IAIxB,IAAIC,EAAUD,EAAYF,EAAW,MAAQ5jB,EAAM,OAASA,EAAM,OAAS8jB,EAAYF,EAAW,MAC9F5xB,EAAOgO,EAAM,SAAS8jB,EAAWC,CAAO,EAExCjiB,GAAWkhB,EAAM,CAAC,EAAG5Y,EAAG,KAAK,IAC3B4Y,EAAM,SAAW,EAGnBG,EAAQ,KAAKnxB,CAAI,EAIjBmxB,EAAUA,EAAQ,OAAOU,EAAS7xB,EAAMgxB,EAAM,MAAM,CAAC,CAAC,CAAC,GAI3D,IAAIgB,EAAc5Z,EAAG,OAASwZ,EAAW,OAAS5xB,EAAK,OAEvDhN,GAAKg/B,CACT,CAEE,OAAOb,CACT,EClMWc,GAAelkB,EAAQ,CAAC,EAAM,EAAM,EAAM,CAAI,CAAC,EAC/CmkB,GAAenkB,EAAQ,CAAC,EAAM,EAAM,CAAI,CAAC,EACzCokB,GAAuBpkB,EAAQ,CAAC,EAAM,EAAM,CAAI,CAAC,EAWjDqkB,GAAkC,SAAyCpkB,EAAO,CAI3F,QAHIqkB,EAAY,CAAE,EACdr/B,EAAI,EAEDA,EAAIgb,EAAM,OAAS,GACpB8B,GAAW9B,EAAM,SAAShb,EAAGA,EAAI,CAAC,EAAGm/B,EAAoB,IAC3DE,EAAU,KAAKr/B,EAAI,CAAC,EACpBA,KAGFA,IAKF,GAAIq/B,EAAU,SAAW,EACvB,OAAOrkB,EAIT,IAAIskB,EAAYtkB,EAAM,OAASqkB,EAAU,OACrCE,EAAU,IAAI,WAAWD,CAAS,EAClCE,EAAc,EAElB,IAAKx/B,EAAI,EAAGA,EAAIs/B,EAAWE,IAAex/B,IACpCw/B,IAAgBH,EAAU,CAAC,IAE7BG,IAEAH,EAAU,MAAO,GAGnBE,EAAQv/B,CAAC,EAAIgb,EAAMwkB,CAAW,EAGhC,OAAOD,CACT,EACWE,GAAU,SAAiBzkB,EAAO0kB,EAAUC,EAAOC,EAAU,CAKtE5kB,EAAQD,EAAQC,CAAK,EACrB2kB,EAAQ,CAAA,EAAG,OAAOA,CAAK,EASvB,QARI3/B,EAAI,EACJ6/B,EACAC,EAAY,EAMT9/B,EAAIgb,EAAM,SAAW8kB,EAAYF,GAAYC,IAAW,CAC7D,IAAIE,EAAY,OAUhB,GARIjjB,GAAW9B,EAAM,SAAShb,CAAC,EAAGi/B,EAAY,EAC5Cc,EAAY,EACHjjB,GAAW9B,EAAM,SAAShb,CAAC,EAAGk/B,EAAY,IACnDa,EAAY,GAKV,CAACA,EAAW,CACd//B,IACA,QACN,CAII,GAFA8/B,IAEID,EACF,OAAOT,GAAgCpkB,EAAM,SAAS6kB,EAAU7/B,CAAC,CAAC,EAGpE,IAAIggC,EAAU,OAEVN,IAAa,OACfM,EAAUhlB,EAAMhb,EAAI+/B,CAAS,EAAI,GACxBL,IAAa,SACtBM,EAAUhlB,EAAMhb,EAAI+/B,CAAS,GAAK,EAAI,IAGpCJ,EAAM,QAAQK,CAAO,IAAM,KAC7BH,EAAW7/B,EAAI+/B,GAIjB//B,GAAK+/B,GAAaL,IAAa,OAAS,EAAI,EAChD,CAEE,OAAO1kB,EAAM,SAAS,EAAG,CAAC,CAC5B,EACWilB,GAAc,SAAqBjlB,EAAOxa,EAAMo/B,EAAU,CACnE,OAAOH,GAAQzkB,EAAO,OAAQxa,EAAMo/B,CAAQ,CAC9C,EACWM,GAAc,SAAqBllB,EAAOxa,EAAMo/B,EAAU,CACnE,OAAOH,GAAQzkB,EAAO,OAAQxa,EAAMo/B,CAAQ,CAC9C,EC1GIO,GAAY,CAEd,KAAQplB,EAAQ,CAAC,IAAM,IAAM,GAAM,GAAI,CAAC,EAExC,SAAYA,EAAQ,CAAC,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,EAAI,CAAC,EAEpE,KAAQA,EAAQ,CAAC,IAAM,GAAM,GAAM,EAAI,CAAC,EAExC,IAAOA,EAAQ,CAAC,GAAM,IAAM,IAAM,EAAI,CAAC,EAGvC,IAAOA,EAAQ,CAAC,GAAM,GAAI,CAAC,EAE3B,KAAQA,EAAQ,CAAC,GAAM,GAAM,GAAM,EAAI,CAAC,EAExC,IAAOA,EAAQ,CAAC,GAAM,GAAM,EAAI,CAAC,EAEjC,IAAOA,EAAQ,CAAC,GAAM,GAAM,GAAM,EAAI,CAAC,EAEvC,MAAOA,EAAQ,CAAC,IAAM,IAAM,IAAM,IAAM,GAAM,GAAI,CAAC,EAEnD,IAAOA,EAAQ,CAAC,IAAM,IAAM,IAAM,GAAI,CAAC,EAEvC,KAAQA,EAAQ,CAAC,IAAM,IAAM,IAAM,GAAI,CAAC,EAExC,IAAOA,EAAQ,CAAC,IAAM,IAAM,IAAM,IAAM,IAAM,GAAI,CAAC,EAEnD,KAAQA,EAAQ,CAAC,IAAM,IAAM,IAAM,GAAI,CAAC,EAExC,KAAQA,EAAQ,CAAC,IAAM,IAAM,IAAM,GAAI,CAAC,CAC1C,EACIqlB,GAAY,CACd,IAAK,SAAaplB,EAAO,CACvB,IAAI6B,EAASghB,GAAa7iB,CAAK,EAC/B,OAAO8B,GAAW9B,EAAO,CAAC,IAAM,EAAI,EAAG,CACrC,OAAQ6B,EACR,KAAM,CAAC,IAAM,EAAI,CACvB,CAAK,CACF,EACD,IAAK,SAAa7B,EAAO,CACvB,IAAI6B,EAASghB,GAAa7iB,CAAK,EAC/B,OAAO8B,GAAW9B,EAAO,CAAC,IAAM,CAAI,EAAG,CACrC,OAAQ6B,EACR,KAAM,CAAC,IAAM,CAAI,CACvB,CAAK,CACF,EACD,KAAM,SAAc7B,EAAO,CACzB,IAAIqlB,EAAUxB,GAAS7jB,EAAO,CAACojB,GAAU,KAAMA,GAAU,OAAO,CAAC,EAAE,CAAC,EAEpE,OAAOthB,GAAWujB,EAASF,GAAU,IAAI,CAC1C,EACD,IAAK,SAAanlB,EAAO,CACvB,IAAIqlB,EAAUxB,GAAS7jB,EAAO,CAACojB,GAAU,KAAMA,GAAU,OAAO,CAAC,EAAE,CAAC,EAEpE,OAAOthB,GAAWujB,EAASF,GAAU,QAAQ,CAC9C,EACD,IAAK,SAAanlB,EAAO,CAEvB,GAAIolB,GAAU,KAAK,EAAEplB,CAAK,GAAKolB,GAAU,IAAIplB,CAAK,EAChD,MAAO,GAaT,GATI8B,GAAW9B,EAAOmlB,GAAU,IAAK,CACnC,OAAQ,CACT,CAAA,GAAKrjB,GAAW9B,EAAOmlB,GAAU,KAAM,CACtC,OAAQ,CACd,CAAK,GAKGrjB,GAAW9B,EAAOmlB,GAAU,KAAM,CACpC,OAAQ,CACT,CAAA,GAAKrjB,GAAW9B,EAAOmlB,GAAU,KAAM,CACtC,OAAQ,CACd,CAAK,EACC,MAAO,EAEV,EACD,IAAK,SAAanlB,EAAO,CACvB,OAAO8B,GAAW9B,EAAOmlB,GAAU,IAAK,CACtC,OAAQ,CACd,CAAK,CACF,EACD,MAAO,SAAYnlB,EAAO,CACxB,OAAO8B,GAAW9B,EAAOmlB,GAAU,KAAK,EAAG,CACzC,OAAQ,CACd,CAAK,CACF,EACD,IAAK,SAAanlB,EAAO,CACvB,IAAI6B,EAASghB,GAAa7iB,CAAK,EAC/B,OAAO8B,GAAW9B,EAAOmlB,GAAU,IAAK,CACtC,OAAQtjB,CACd,CAAK,CACF,EACD,GAAI,SAAY7B,EAAO,CACrB,GAAIA,EAAM,OAAS,KAAOA,EAAM,QAAU,EACxC,OAAOA,EAAM,CAAC,IAAM,GAKtB,QAFIhb,EAAI,EAEDA,EAAI,IAAMgb,EAAM,QAAUhb,EAAI,KAAK,CACxC,GAAIgb,EAAMhb,CAAC,IAAM,IAAQgb,EAAMhb,EAAI,GAAG,IAAM,GAC1C,MAAO,GAGTA,GAAK,CACX,CAEI,MAAO,EACR,EACD,KAAM,SAAcgb,EAAO,CACzB,IAAI6B,EAASghB,GAAa7iB,CAAK,EAC/B,OAAO8B,GAAW9B,EAAOmlB,GAAU,KAAM,CACvC,OAAQtjB,CACd,CAAK,CACF,EACD,IAAK,SAAa7B,EAAO,CACvB,OAAO8B,GAAW9B,EAAOmlB,GAAU,GAAG,CACvC,EACD,IAAK,SAAanlB,EAAO,CACvB,OAAO8B,GAAW9B,EAAOmlB,GAAU,IAAI,GAAKrjB,GAAW9B,EAAOmlB,GAAU,IAAK,CAC3E,OAAQ,CACd,CAAK,CACF,EACD,IAAK,SAAanlB,EAAO,CACvB,OAAO8B,GAAW9B,EAAOmlB,GAAU,IAAI,GAAKrjB,GAAW9B,EAAOmlB,GAAU,IAAK,CAC3E,OAAQ,CACd,CAAK,CACF,EACD,KAAQ,SAAcnlB,EAAO,CAE3B,OAAOilB,GAAYjlB,EAAO,EAAG,CAAC,EAAE,MACjC,EACD,KAAQ,SAAcA,EAAO,CAE3B,OAAOklB,GAAYllB,EAAO,CAAC,GAAI,EAAE,EAAG,CAAC,EAAE,MAC3C,CACA,EAIIslB,GAAgB,OAAO,KAAKF,EAAS,EACxC,OAAO,SAAUx3B,EAAG,CACnB,OAAOA,IAAM,MAAQA,IAAM,QAAUA,IAAM,MAC7C,CAAC,EACA,OAAO,CAAC,KAAM,OAAQ,MAAM,CAAC,EAE9B03B,GAAc,QAAQ,SAAU9/B,EAAM,CACpC,IAAI+/B,EAAaH,GAAU5/B,CAAI,EAE/B4/B,GAAU5/B,CAAI,EAAI,SAAUwa,EAAO,CACjC,OAAOulB,EAAWxlB,EAAQC,CAAK,CAAC,CACjC,CACH,CAAC,EAEM,IAAIwlB,GAAWJ,GAGXK,GAA0B,SAAiCzlB,EAAO,CAC3EA,EAAQD,EAAQC,CAAK,EAErB,QAAShb,EAAI,EAAGA,EAAIsgC,GAAc,OAAQtgC,IAAK,CAC7C,IAAIQ,EAAO8/B,GAActgC,CAAC,EAE1B,GAAIwgC,GAAShgC,CAAI,EAAEwa,CAAK,EACtB,OAAOxa,CAEb,CAEE,MAAO,EACT,EAEWkgC,GAA2B,SAAkC1lB,EAAO,CAC7E,OAAOijB,GAAQjjB,EAAO,CAAC,MAAM,CAAC,EAAE,OAAS,CAC3C,ECtIA2lB,GAAiB,CASjB,ECzDA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA6BA,IAAIC,GAAY,SAQhB,MAAMC,GAAS,CAAE,EAcXC,GAAQ,SAAUtgC,EAAMf,EAAI,CAChC,OAAAohC,GAAOrgC,CAAI,EAAIqgC,GAAOrgC,CAAI,GAAK,CAAE,EAC7Bf,IACFohC,GAAOrgC,CAAI,EAAIqgC,GAAOrgC,CAAI,EAAE,OAAOf,CAAE,GAEhCohC,GAAOrgC,CAAI,CACpB,EAWMugC,GAAO,SAAUvgC,EAAMf,EAAI,CAC/BqhC,GAAMtgC,EAAMf,CAAE,CAChB,EAcMuhC,GAAa,SAAUxgC,EAAMf,EAAI,CACrC,MAAM4D,EAAQy9B,GAAMtgC,CAAI,EAAE,QAAQf,CAAE,EACpC,OAAI4D,GAAS,GACJ,IAETw9B,GAAOrgC,CAAI,EAAIqgC,GAAOrgC,CAAI,EAAE,MAAO,EACnCqgC,GAAOrgC,CAAI,EAAE,OAAO6C,EAAO,CAAC,EACrB,GACT,EAWM49B,GAAW,SAAUzgC,EAAMf,EAAI,CACnCqhC,GAAMtgC,EAAM,GAAG,OAAOf,CAAE,EAAE,IAAIyhC,GAAY,CACxC,MAAMC,EAAU,IAAI7tB,KAClB0tB,GAAWxgC,EAAM2gC,CAAO,EACjBD,EAAS,GAAG5tB,CAAI,GAEzB,OAAO6tB,CACX,CAAG,CAAC,CACJ,EAcMC,GAAgB,CACpB,SAAU,EACZ,EAGMC,GAAS,CAAC,CAAC,oBAAqB,iBAAkB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,YAAY,EAErJ,CAAC,0BAA2B,uBAAwB,0BAA2B,0BAA2B,yBAA0B,wBAAyB,qBAAqB,CAAC,EAC7KC,GAAUD,GAAO,CAAC,EACxB,IAAIE,GAGJ,QAAS,EAAI,EAAG,EAAIF,GAAO,OAAQ,IAEjC,GAAIA,GAAO,CAAC,EAAE,CAAC,IAAKG,EAAY,CAC9BD,GAAaF,GAAO,CAAC,EACrB,KACJ,CAIA,GAAIE,GAAY,CACd,QAAS,EAAI,EAAG,EAAIA,GAAW,OAAQ,IACrCH,GAAcE,GAAQ,CAAC,CAAC,EAAIC,GAAW,CAAC,EAE1CH,GAAc,SAAWG,GAAW,CAAC,IAAMD,GAAQ,CAAC,CACtD,CAQA,IAAIG,GAAU,CAAE,EAehB,MAAMC,GAAmB,CAACh5B,EAAMi5B,EAAKv3B,IAAW,CAAC5J,EAAMohC,EAAOtuB,IAAS,CACrE,MAAMuuB,EAAMF,EAAI,OAAOC,CAAK,EACtBE,EAAY,IAAI,OAAO,KAAKD,CAAG,IAAI,EACzC,IAAIE,EAAar5B,EAcjB,GAbIlI,IAAS,OAEX8S,EAAK,QAAQ9S,EAAK,YAAW,EAAK,GAAG,EAEnC4J,IACF23B,EAAa,KAAKr5B,CAAI,GACtB4K,EAAK,QAAQlJ,CAAM,GAIrBkJ,EAAK,QAAQyuB,EAAa,GAAG,EAGzBN,GAAS,CACXA,GAAQ,KAAK,CAAA,EAAG,OAAOnuB,CAAI,CAAC,EAG5B,MAAM0uB,EAASP,GAAQ,OAAS,IAChCA,GAAQ,OAAO,EAAGO,EAAS,EAAIA,EAAS,CAAC,CAC7C,CAIE,GAAI,CAACC,EAAS,QACZ,OAMF,IAAIxiC,EAAKwiC,EAAS,QAAQzhC,CAAI,EAC1B,CAACf,GAAMe,IAAS,UAGlBf,EAAKwiC,EAAS,QAAQ,MAAQA,EAAS,QAAQ,KAK7C,GAACxiC,GAAM,CAACoiC,GAAO,CAACC,EAAU,KAAKthC,CAAI,IAGvCf,EAAG,MAAM,QAAQ6T,CAAI,EAAI,QAAU,MAAM,EAAE2uB,EAAS,QAAS3uB,CAAI,CACnE,EACA,SAAS4uB,GAAex5B,EAAMy5B,EAAY,IAAK/3B,EAAS,GAAI,CAE1D,IAAIw3B,EAAQ,OAGRQ,EAuBJ,SAAST,KAAOruB,EAAM,CACpB8uB,EAAU,MAAOR,EAAOtuB,CAAI,CAChC,CAGE,OAAA8uB,EAAYV,GAAiBh5B,EAAMi5B,EAAKv3B,CAAM,EAmB9Cu3B,EAAI,aAAe,CAACU,EAASC,EAAcC,IAAc,CACvD,MAAMC,EAAkBF,IAAiB,OAAYA,EAAeH,EAC9DM,EAAeF,IAAc,OAAYA,EAAYn4B,EACrD23B,EAAa,GAAGr5B,CAAI,IAAI85B,CAAe,IAAIH,CAAO,GACxD,OAAOH,GAAeH,EAAYS,EAAiBC,CAAY,CAChE,EAaDd,EAAI,gBAAkB,CAACe,EAASC,EAAcC,IACrCV,GAAeQ,EAASC,EAAcC,CAAS,EAsBxDjB,EAAI,OAAS,CACX,IAAK,uBACL,IAAK,GACL,MAAO,uBACP,KAAM,iBACN,KAAM,aACN,MAAO,QACP,QAASC,CACV,EAcDD,EAAI,MAAQE,GAAO,CACjB,GAAI,OAAOA,GAAQ,SAAU,CAC3B,GAAI,CAACF,EAAI,OAAO,eAAeE,CAAG,EAChC,MAAM,IAAI,MAAM,IAAIA,CAAG,4BAA4B,EAErDD,EAAQC,CACd,CACI,OAAOD,CACR,EAWDD,EAAI,QAAU,IAAMF,GAAU,CAAE,EAAC,OAAOA,EAAO,EAAI,CAAE,EAWrDE,EAAI,QAAQ,OAASkB,IACXpB,IAAW,IAAI,OAAOqB,GAErB,IAAI,OAAO,KAAKD,CAAK,IAAI,EAAE,KAAKC,EAAY,CAAC,CAAC,CACtD,EAOHnB,EAAI,QAAQ,MAAQ,IAAM,CACpBF,KACFA,GAAQ,OAAS,EAEpB,EAKDE,EAAI,QAAQ,QAAU,IAAM,CACtBF,KAAY,OACdA,GAAQ,OAAS,EACjBA,GAAU,KAEb,EAKDE,EAAI,QAAQ,OAAS,IAAM,CACrBF,KAAY,OACdA,GAAU,CAAE,EAEf,EAQDE,EAAI,MAAQ,IAAIruB,IAAS8uB,EAAU,QAASR,EAAOtuB,CAAI,EAQvDquB,EAAI,KAAO,IAAIruB,IAAS8uB,EAAU,OAAQR,EAAOtuB,CAAI,EASrDquB,EAAI,MAAQ,IAAIruB,IAAS8uB,EAAU,QAASR,EAAOtuB,CAAI,EAChDquB,CACT,CAMA,MAAMoB,EAAQb,GAAe,SAAS,EAChCc,GAAeD,EAAM,aAgCrBvjC,GAAW,OAAO,UAAU,SAc5ByjC,GAAO,SAAUhlB,EAAQ,CAC7B,OAAOoP,GAASpP,CAAM,EAAI,OAAO,KAAKA,CAAM,EAAI,CAAE,CACpD,EAWA,SAASilB,GAAKjlB,EAAQxe,EAAI,CACxBwjC,GAAKhlB,CAAM,EAAE,QAAQ3a,GAAO7D,EAAGwe,EAAO3a,CAAG,EAAGA,CAAG,CAAC,CAClD,CAmBA,SAAS6/B,GAAOllB,EAAQxe,EAAI2jC,EAAU,EAAG,CACvC,OAAOH,GAAKhlB,CAAM,EAAE,OAAO,CAAColB,EAAO//B,IAAQ7D,EAAG4jC,EAAOplB,EAAO3a,CAAG,EAAGA,CAAG,EAAG8/B,CAAO,CACjF,CAYA,SAAS/V,GAAS5qB,EAAO,CACvB,MAAO,CAAC,CAACA,GAAS,OAAOA,GAAU,QACrC,CASA,SAAS6gC,GAAQ7gC,EAAO,CACtB,OAAO4qB,GAAS5qB,CAAK,GAAKjD,GAAS,KAAKiD,CAAK,IAAM,mBAAqBA,EAAM,cAAgB,MAChG,CAkBA,SAAS8gC,MAAWC,EAAS,CAC3B,MAAMrgC,EAAS,CAAE,EACjB,OAAAqgC,EAAQ,QAAQnlB,GAAU,CACnBA,GAGL6kB,GAAK7kB,EAAQ,CAAC5b,EAAOa,IAAQ,CAC3B,GAAI,CAACggC,GAAQ7gC,CAAK,EAAG,CACnBU,EAAOG,CAAG,EAAIb,EACd,MACR,CACW6gC,GAAQngC,EAAOG,CAAG,CAAC,IACtBH,EAAOG,CAAG,EAAI,CAAE,GAElBH,EAAOG,CAAG,EAAIigC,GAAQpgC,EAAOG,CAAG,EAAGb,CAAK,CAC9C,CAAK,CACL,CAAG,EACMU,CACT,CAQA,SAASqqB,GAAOnP,EAAS,GAAI,CAC3B,MAAMlb,EAAS,CAAE,EACjB,UAAWG,KAAO+a,EAChB,GAAIA,EAAO,eAAe/a,CAAG,EAAG,CAC9B,MAAMb,EAAQ4b,EAAO/a,CAAG,EACxBH,EAAO,KAAKV,CAAK,CACvB,CAEE,OAAOU,CACT,CAWA,SAASsgC,GAAmB3kC,EAAKwE,EAAKogC,EAAUC,EAAS,GAAM,CAC7D,MAAMC,EAAMnhC,GAAS,OAAO,eAAe3D,EAAKwE,EAAK,CACnD,MAAAb,EACA,WAAY,GACZ,SAAU,EACd,CAAG,EACKlB,EAAU,CACd,aAAc,GACd,WAAY,GACZ,KAAM,CACJ,MAAMkB,EAAQihC,EAAU,EACxB,OAAAE,EAAInhC,CAAK,EACFA,CACb,CACG,EACD,OAAIkhC,IACFpiC,EAAQ,IAAMqiC,GAET,OAAO,eAAe9kC,EAAKwE,EAAK/B,CAAO,CAChD,CAEA,IAAIsiC,GAAmB,OAAO,OAAO,CACnC,UAAW,KACX,KAAMX,GACN,OAAQC,GACR,SAAU9V,GACV,QAASiW,GACT,MAAOC,GACP,OAAQ/V,GACR,mBAAoBiW,EACtB,CAAC,EAaD,IAAIK,GAAU,GAQVC,GAAc,KAQdC,GAAa,GAQbC,GAQAC,GAAa,GAQbC,GAAU,GAQVC,GAAc,GAgBdC,GAAY,GAQZC,GAAmB,KAWnBC,GAAiB,KAQrB,MAAMC,GAAyB,GAAQvC,EAAS,MAAQA,EAAS,KAAK,WAAaA,EAAS,KAAK,UAAU,qBAS3G,IAAIwC,GAAa,KAQbC,GAAY,GAQZC,GAAa,GAQbC,GAAU,GAWVC,GAAY,GAQZC,GAAW,GAQXC,GAAW,GAQXC,GAAc,GASlB,MAAMC,GAAgB,GAAQC,GAAM,IAAO,iBAAkBjD,GAAYA,EAAS,UAAU,gBAAkBA,EAAS,eAAiBA,EAAS,oBAAoBA,EAAS,gBACxKkD,GAAMlD,EAAS,WAAaA,EAAS,UAAU,cACjDkD,IAAOA,GAAI,UAAYA,GAAI,SAK7BnB,GAAamB,GAAI,WAAa,UAC9BhB,GAAU,EAAQgB,GAAI,OAAO,KAAKj5B,GAAKA,EAAE,QAAU,gBAAgB,EACnEk4B,GAAc,EAAQe,GAAI,OAAO,KAAKj5B,GAAKA,EAAE,QAAU,UAAU,EACjEm4B,GAAY,CAACF,IAAWC,GACxBE,GAAmBC,IAAkBY,GAAI,OAAO,KAAKj5B,GAAKA,EAAE,QAAU,UAAU,GAAK,CAAE,GAAE,SAAW,KACpGy4B,GAAaQ,GAAI,WAAa,WAMhC,GAAI,CAACf,GAAa,CAChB,MAAMgB,EAAanD,EAAS,WAAaA,EAAS,UAAU,WAAa,GACzE6B,GAAU,QAAQ,KAAKsB,CAAU,EACjCrB,GAAc,UAAY,CACxB,MAAM5vB,EAAQixB,EAAW,MAAM,YAAY,EAC3C,OAAIjxB,GAASA,EAAM,CAAC,EACXA,EAAM,CAAC,EAET,IACX,EAAK,EACH6vB,GAAa,WAAW,KAAKoB,CAAU,EACvCnB,GAAkB,UAAY,CAG5B,MAAM9vB,EAAQixB,EAAW,MAAM,wCAAwC,EACvE,GAAI,CAACjxB,EACH,OAAO,KAET,MAAMkxB,EAAQlxB,EAAM,CAAC,GAAK,WAAWA,EAAM,CAAC,CAAC,EACvCmxB,EAAQnxB,EAAM,CAAC,GAAK,WAAWA,EAAM,CAAC,CAAC,EAC7C,OAAIkxB,GAASC,EACJ,WAAWnxB,EAAM,CAAC,EAAI,IAAMA,EAAM,CAAC,CAAC,EAClCkxB,GAGJ,IACX,EAAK,EACHnB,GAAa,WAAW,KAAKkB,CAAU,EACvCjB,GAAU,OAAO,KAAKiB,CAAU,EAChChB,GAAc,UAAU,KAAKgB,CAAU,GAAK,SAAS,KAAKA,CAAU,EACpEf,GAAY,CAACF,IAAWC,GACxBE,GAAmBC,GAAiB,UAAY,CAC9C,MAAMpwB,EAAQixB,EAAW,MAAM,uBAAuB,EACtD,OAAIjxB,GAASA,EAAM,CAAC,EACX,WAAWA,EAAM,CAAC,CAAC,EAErB,IACX,EAAK,EACHswB,GAAa,UAAY,CACvB,MAAMthC,EAAS,kBAAkB,KAAKiiC,CAAU,EAChD,IAAInjB,EAAU9e,GAAU,WAAWA,EAAO,CAAC,CAAC,EAC5C,MAAI,CAAC8e,GAAW,gBAAgB,KAAKmjB,CAAU,GAAK,UAAU,KAAKA,CAAU,IAE3EnjB,EAAU,IAELA,CACX,EAAK,EACH6iB,GAAW,SAAS,KAAKM,CAAU,EACnCL,GAAW,SAAS,KAAKK,CAAU,EACnCJ,GAAcF,IAAYC,GAC1BL,GAAY,UAAU,KAAKU,CAAU,GAAK,CAACf,IAAa,CAACL,IAAc,CAACG,IAAW,CAACa,GACpFL,GAAa,WAAW,KAAKS,CAAU,EACvCR,GAAU,QAAQ,KAAKQ,CAAU,GAAKV,IAAaO,IAAiB,CAAC,UAAU,KAAKG,CAAU,EAC9FP,GAAY,UAAU,KAAKO,CAAU,GAAK,CAACR,EAC7C,CASA,MAAMW,GAASV,IAAaD,IAAWd,GASjC0B,IAAiBd,IAAaa,KAAW,CAAClB,GAEhD,IAAIoB,GAAuB,OAAO,OAAO,CACvC,UAAW,KACX,IAAI,SAAW,CAAE,OAAO3B,EAAU,EAClC,IAAI,aAAe,CAAE,OAAOC,EAAc,EAC1C,IAAI,YAAc,CAAE,OAAOC,EAAa,EACxC,IAAI,iBAAmB,CAAE,OAAOC,EAAkB,EAClD,IAAI,YAAc,CAAE,OAAOC,EAAa,EACxC,IAAI,SAAW,CAAE,OAAOC,EAAU,EAClC,IAAI,aAAe,CAAE,OAAOC,EAAc,EAC1C,IAAI,WAAa,CAAE,OAAOC,EAAY,EACtC,IAAI,kBAAoB,CAAE,OAAOC,EAAmB,EACpD,IAAI,gBAAkB,CAAE,OAAOC,EAAiB,EAChD,uBAAwBC,GACxB,IAAI,YAAc,CAAE,OAAOC,EAAa,EACxC,IAAI,WAAa,CAAE,OAAOC,EAAY,EACtC,IAAI,YAAc,CAAE,OAAOC,EAAa,EACxC,IAAI,SAAW,CAAE,OAAOC,EAAU,EAClC,IAAI,WAAa,CAAE,OAAOC,EAAY,EACtC,IAAI,UAAY,CAAE,OAAOC,EAAW,EACpC,IAAI,UAAY,CAAE,OAAOC,EAAW,EACpC,IAAI,aAAe,CAAE,OAAOC,EAAc,EAC1C,cAAeC,GACf,OAAQM,GACR,cAAeC,EACjB,CAAC,EAkBD,SAASE,GAAiB7vB,EAAK,CAM7B,OAAO,OAAOA,GAAQ,UAAY,EAAQA,EAAI,KAAI,CACpD,CAaA,SAAS8vB,GAAkB9vB,EAAK,CAE9B,GAAIA,EAAI,QAAQ,GAAG,GAAK,EACtB,MAAM,IAAI,MAAM,yCAAyC,CAE7D,CAQA,SAASqvB,IAAS,CAEhB,OAAO1D,IAAeS,EAAS,QACjC,CAWA,SAAS2D,GAAKnjC,EAAO,CACnB,OAAO4qB,GAAS5qB,CAAK,GAAKA,EAAM,WAAa,CAC/C,CASA,SAASojC,IAAY,CAGnB,GAAI,CACF,OAAO5D,EAAS,SAAWA,EAAS,IACrC,MAAW,CACV,MAAO,EACX,CACA,CAYA,SAAS6D,GAAcpiC,EAAQ,CAC7B,OAAO,SAAUqiC,EAAUC,EAAS,CAClC,GAAI,CAACN,GAAiBK,CAAQ,EAC5B,OAAOvE,EAAW99B,CAAM,EAAE,IAAI,EAE5BgiC,GAAiBM,CAAO,IAC1BA,EAAUxE,EAAW,cAAcwE,CAAO,GAE5C,MAAMC,EAAML,GAAKI,CAAO,EAAIA,EAAUxE,EACtC,OAAOyE,EAAIviC,CAAM,GAAKuiC,EAAIviC,CAAM,EAAEqiC,CAAQ,CAC3C,CACH,CAoBA,SAASG,EAASz9B,EAAU,MAAO2oB,EAAa,CAAA,EAAI7c,EAAa,CAAE,EAAE4xB,EAAS,CAC5E,MAAM9kB,EAAKmgB,EAAW,cAAc/4B,CAAO,EAC3C,cAAO,oBAAoB2oB,CAAU,EAAE,QAAQ,SAAUjoB,EAAU,CACjE,MAAMoB,EAAM6mB,EAAWjoB,CAAQ,EAI3BA,IAAa,cACfi9B,GAAY/kB,EAAI9W,CAAG,GACV8W,EAAGlY,CAAQ,IAAMoB,GAAOpB,IAAa,cAC9CkY,EAAGlY,CAAQ,EAAIoB,EAErB,CAAG,EACD,OAAO,oBAAoBgK,CAAU,EAAE,QAAQ,SAAU6W,EAAU,CACjE/J,EAAG,aAAa+J,EAAU7W,EAAW6W,CAAQ,CAAC,CAClD,CAAG,EACG+a,GACFE,GAAchlB,EAAI8kB,CAAO,EAEpB9kB,CACT,CAcA,SAAS+kB,GAAY/kB,EAAIzX,EAAM,CAC7B,OAAI,OAAOyX,EAAG,YAAgB,IAC5BA,EAAG,UAAYzX,EAEfyX,EAAG,YAAczX,EAEZyX,CACT,CAWA,SAASilB,GAAUrjB,EAAOsB,EAAQ,CAC5BA,EAAO,WACTA,EAAO,aAAatB,EAAOsB,EAAO,UAAU,EAE5CA,EAAO,YAAYtB,CAAK,CAE5B,CAiBA,SAASsjB,GAASj+B,EAASk+B,EAAc,CACvC,OAAAb,GAAkBa,CAAY,EACvBl+B,EAAQ,UAAU,SAASk+B,CAAY,CAChD,CAcA,SAASC,GAASn+B,KAAYo+B,EAAc,CAC1C,OAAAp+B,EAAQ,UAAU,IAAI,GAAGo+B,EAAa,OAAO,CAAC5O,EAAMzvB,IAAYyvB,EAAK,OAAOzvB,EAAQ,MAAM,KAAK,CAAC,EAAG,CAAA,CAAE,CAAC,EAC/FC,CACT,CAcA,SAASq+B,GAAYr+B,KAAYs+B,EAAiB,CAEhD,OAAKt+B,GAILA,EAAQ,UAAU,OAAO,GAAGs+B,EAAgB,OAAO,CAAC9O,EAAMzvB,IAAYyvB,EAAK,OAAOzvB,EAAQ,MAAM,KAAK,CAAC,EAAG,CAAA,CAAE,CAAC,EACrGC,IAJLy6B,EAAM,KAAK,2DAA2D,EAC/D,KAIX,CAkCA,SAAS8D,GAAYv+B,EAASw+B,EAAejpB,EAAW,CACtD,OAAI,OAAOA,GAAc,aACvBA,EAAYA,EAAUvV,EAASw+B,CAAa,GAE1C,OAAOjpB,GAAc,YACvBA,EAAY,QAEdipB,EAAc,MAAM,KAAK,EAAE,QAAQC,GAAaz+B,EAAQ,UAAU,OAAOy+B,EAAWlpB,CAAS,CAAC,EACvFvV,CACT,CAWA,SAAS0+B,GAAc3lB,EAAI9M,EAAY,CACrC,OAAO,oBAAoBA,CAAU,EAAE,QAAQ,SAAU6W,EAAU,CACjE,MAAM6b,EAAY1yB,EAAW6W,CAAQ,EACjC6b,IAAc,MAAQ,OAAOA,EAAc,KAAeA,IAAc,GAC1E5lB,EAAG,gBAAgB+J,CAAQ,EAE3B/J,EAAG,aAAa+J,EAAU6b,IAAc,GAAO,GAAKA,CAAS,CAEnE,CAAG,CACH,CAeA,SAASC,GAAc9wB,EAAK,CAC1B,MAAMtX,EAAM,CAAE,EAKRqoC,EAAgB,CAAC,WAAY,WAAY,cAAe,OAAQ,QAAS,UAAW,cAAc,EACxG,GAAI/wB,GAAOA,EAAI,YAAcA,EAAI,WAAW,OAAS,EAAG,CACtD,MAAM5B,EAAQ4B,EAAI,WAClB,QAASpW,EAAIwU,EAAM,OAAS,EAAGxU,GAAK,EAAGA,IAAK,CAC1C,MAAMorB,EAAW5W,EAAMxU,CAAC,EAAE,KAE1B,IAAIonC,EAAU5yB,EAAMxU,CAAC,EAAE,MAInBmnC,EAAc,SAAS/b,CAAQ,IAIjCgc,EAAUA,IAAY,MAExBtoC,EAAIssB,CAAQ,EAAIgc,CACtB,CACA,CACE,OAAOtoC,CACT,CAcA,SAASuoC,GAAahmB,EAAI/I,EAAW,CACnC,OAAO+I,EAAG,aAAa/I,CAAS,CAClC,CAcA,SAASgvB,GAAajmB,EAAI/I,EAAW7V,EAAO,CAC1C4e,EAAG,aAAa/I,EAAW7V,CAAK,CAClC,CAWA,SAAS8kC,GAAgBlmB,EAAI/I,EAAW,CACtC+I,EAAG,gBAAgB/I,CAAS,CAC9B,CAKA,SAASkvB,IAAqB,CAC5BhG,EAAW,KAAK,MAAO,EACvBA,EAAW,cAAgB,UAAY,CACrC,MAAO,EACR,CACH,CAKA,SAASiG,IAAuB,CAC9BjG,EAAW,cAAgB,UAAY,CACrC,MAAO,EACR,CACH,CAqBA,SAASkG,GAAsBrmB,EAAI,CACjC,GAAIA,GAAMA,EAAG,uBAAyBA,EAAG,WAAY,CACnD,MAAMsmB,EAAOtmB,EAAG,sBAAuB,EACjCle,EAAS,CAAE,EACjB,OAAC,SAAU,SAAU,OAAQ,QAAS,MAAO,OAAO,EAAE,QAAQmD,GAAK,CAC7DqhC,EAAKrhC,CAAC,IAAM,SACdnD,EAAOmD,CAAC,EAAIqhC,EAAKrhC,CAAC,EAE1B,CAAK,EACInD,EAAO,SACVA,EAAO,OAAS,WAAWykC,GAAcvmB,EAAI,QAAQ,CAAC,GAEnDle,EAAO,QACVA,EAAO,MAAQ,WAAWykC,GAAcvmB,EAAI,OAAO,CAAC,GAE/Cle,CACX,CACA,CA2BA,SAAS0kC,GAAaxmB,EAAI,CACxB,GAAI,CAACA,GAAMA,GAAM,CAACA,EAAG,aACnB,MAAO,CACL,KAAM,EACN,IAAK,EACL,MAAO,EACP,OAAQ,CACT,EAEH,MAAMrW,EAAQqW,EAAG,YACXtW,EAASsW,EAAG,aAClB,IAAIymB,EAAO,EACP78B,EAAM,EACV,KAAOoW,EAAG,cAAgBA,IAAOmgB,EAAWJ,GAAc,iBAAiB,GACzE0G,GAAQzmB,EAAG,WACXpW,GAAOoW,EAAG,UACVA,EAAKA,EAAG,aAEV,MAAO,CACL,KAAAymB,EACA,IAAA78B,EACA,MAAAD,EACA,OAAAD,CACD,CACH,CA6BA,SAASg9B,GAAmB1mB,EAAI1M,EAAO,CACrC,MAAMqzB,EAAa,CACjB,EAAG,EACH,EAAG,CACJ,EACD,GAAIzC,GAAQ,CACV,IAAIxnB,EAAOsD,EACX,KAAOtD,GAAQA,EAAK,SAAS,YAAW,IAAO,QAAQ,CACrD,MAAMkqB,EAAYL,GAAc7pB,EAAM,WAAW,EACjD,GAAI,UAAU,KAAKkqB,CAAS,EAAG,CAC7B,MAAMza,EAASya,EAAU,MAAM,EAAG,EAAE,EAAE,MAAM,KAAK,EAAE,IAAI,MAAM,EAC7DD,EAAW,GAAKxa,EAAO,CAAC,EACxBwa,EAAW,GAAKxa,EAAO,CAAC,CACzB,SAAU,YAAY,KAAKya,CAAS,EAAG,CACtC,MAAMza,EAASya,EAAU,MAAM,EAAG,EAAE,EAAE,MAAM,KAAK,EAAE,IAAI,MAAM,EAC7DD,EAAW,GAAKxa,EAAO,EAAE,EACzBwa,EAAW,GAAKxa,EAAO,EAAE,CACjC,CACM,GAAIzP,EAAK,cAAgBA,EAAK,aAAa,eAAiBkkB,EAAS,gBAAiB,CACpF,MAAMiG,EAAiBjG,EAAS,iBAAiBlkB,EAAK,aAAa,aAAa,EAAE,UAC5EoqB,EAAS,IAAIlG,EAAS,gBAAgBiG,CAAc,EAC1DF,EAAW,GAAKG,EAAO,IACvBH,EAAW,GAAKG,EAAO,GAC/B,CACMpqB,EAAOA,EAAK,YAAcA,EAAK,IACrC,CACA,CACE,MAAMpR,EAAW,CAAE,EACby7B,EAAYP,GAAalzB,EAAM,MAAM,EACrC/J,EAAMi9B,GAAaxmB,CAAE,EACrBgnB,EAAOz9B,EAAI,MACX09B,EAAO19B,EAAI,OACjB,IAAI29B,EAAU5zB,EAAM,SAAW/J,EAAI,IAAMw9B,EAAU,KAC/CI,EAAU7zB,EAAM,SAAW/J,EAAI,KAAOw9B,EAAU,MACpD,OAAIzzB,EAAM,iBACR6zB,EAAU7zB,EAAM,eAAe,CAAC,EAAE,MAAQ/J,EAAI,KAC9C29B,EAAU5zB,EAAM,eAAe,CAAC,EAAE,MAAQ/J,EAAI,IAC1C26B,KACFiD,GAAWR,EAAW,EACtBO,GAAWP,EAAW,IAG1Br7B,EAAS,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG47B,EAAUD,CAAI,CAAC,EACxD37B,EAAS,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG67B,EAAUH,CAAI,CAAC,EAC7C17B,CACT,CAWA,SAASoX,GAAWthB,EAAO,CACzB,OAAO4qB,GAAS5qB,CAAK,GAAKA,EAAM,WAAa,CAC/C,CAWA,SAASgmC,GAAQpnB,EAAI,CACnB,KAAOA,EAAG,YACRA,EAAG,YAAYA,EAAG,UAAU,EAE9B,OAAOA,CACT,CAkCA,SAASqnB,GAAiBvC,EAAS,CAGjC,OAAI,OAAOA,GAAY,aACrBA,EAAUA,EAAS,IAKb,MAAM,QAAQA,CAAO,EAAIA,EAAU,CAACA,CAAO,GAAG,IAAI1jC,GAAS,CAMjE,GAHI,OAAOA,GAAU,aACnBA,EAAQA,EAAO,GAEbmjC,GAAKnjC,CAAK,GAAKshB,GAAWthB,CAAK,EACjC,OAAOA,EAET,GAAI,OAAOA,GAAU,UAAY,KAAK,KAAKA,CAAK,EAC9C,OAAO++B,EAAW,eAAe/+B,CAAK,CAE5C,CAAG,EAAE,OAAOA,GAASA,CAAK,CAC1B,CAcA,SAAS4jC,GAAchlB,EAAI8kB,EAAS,CAClC,OAAAuC,GAAiBvC,CAAO,EAAE,QAAQr9B,GAAQuY,EAAG,YAAYvY,CAAI,CAAC,EACvDuY,CACT,CAeA,SAASsnB,GAActnB,EAAI8kB,EAAS,CAClC,OAAOE,GAAcoC,GAAQpnB,CAAE,EAAG8kB,CAAO,CAC3C,CAWA,SAASyC,GAAkBj0B,EAAO,CAkChC,OA7BIA,EAAM,SAAW,QAAaA,EAAM,UAAY,QAehDA,EAAM,SAAW,GAAKA,EAAM,UAAY,QASxCA,EAAM,OAAS,WAAaA,EAAM,SAAW,GAAKA,EAAM,UAAY,GAKpEA,EAAM,OAAS,aAAeA,EAAM,SAAW,GAAKA,EAAM,UAAY,EACjE,GAEL,EAAAA,EAAM,SAAW,GAAKA,EAAM,UAAY,EAS9C,CAkBA,MAAMk0B,GAAI/C,GAAc,eAAe,EAoBjCgD,GAAKhD,GAAc,kBAAkB,EAiB3C,SAAS8B,GAAcvmB,EAAI/W,EAAM,CAC/B,GAAI,CAAC+W,GAAM,CAAC/W,EACV,MAAO,GAET,GAAI,OAAO23B,EAAS,kBAAqB,WAAY,CACnD,IAAI8G,EACJ,GAAI,CACFA,EAAqB9G,EAAS,iBAAiB5gB,CAAE,CAClD,MAAW,CACV,MAAO,EACb,CACI,OAAO0nB,EAAqBA,EAAmB,iBAAiBz+B,CAAI,GAAKy+B,EAAmBz+B,CAAI,EAAI,EACxG,CACE,MAAO,EACT,CASA,SAAS0+B,GAAwB7qC,EAAK,CACpC,CAAC,GAAGqjC,EAAW,WAAW,EAAE,QAAQyH,GAAc,CAChD,GAAI,CACF,MAAMC,EAAW,CAAC,GAAGD,EAAW,QAAQ,EAAE,IAAIE,GAAQA,EAAK,OAAO,EAAE,KAAK,EAAE,EACrEC,EAAQ5H,EAAW,cAAc,OAAO,EAC9C4H,EAAM,YAAcF,EACpB/qC,EAAI,SAAS,KAAK,YAAYirC,CAAK,CACpC,MAAW,CACV,MAAMC,EAAO7H,EAAW,cAAc,MAAM,EAC5C6H,EAAK,IAAM,aACXA,EAAK,KAAOJ,EAAW,KAEvBI,EAAK,MAAQJ,EAAW,MAAM,UAC9BI,EAAK,KAAOJ,EAAW,KACvB9qC,EAAI,SAAS,KAAK,YAAYkrC,CAAI,CACxC,CACA,CAAG,CACH,CAEA,IAAIC,GAAmB,OAAO,OAAO,CACnC,UAAW,KACX,OAAQpE,GACR,KAAMU,GACN,UAAWC,GACX,SAAUK,EACV,YAAaE,GACb,UAAWE,GACX,SAAUC,GACV,SAAUE,GACV,YAAaE,GACb,YAAaE,GACb,cAAeG,GACf,cAAeE,GACf,aAAcG,GACd,aAAcC,GACd,gBAAiBC,GACjB,mBAAoBC,GACpB,qBAAsBC,GACtB,sBAAuBC,GACvB,aAAcG,GACd,mBAAoBE,GACpB,WAAYhkB,GACZ,QAAS0kB,GACT,iBAAkBC,GAClB,cAAerC,GACf,cAAesC,GACf,kBAAmBC,GACnB,EAAGC,GACH,GAAIC,GACJ,cAAelB,GACf,wBAAyBoB,EAC3B,CAAC,EAQD,IAAIO,GAAgB,GAChBC,GAKJ,MAAMC,GAAY,UAAY,CAC5B,GAAID,GAAU,QAAQ,YAAc,GAClC,OAEF,MAAME,EAAO,MAAM,UAAU,MAAM,KAAKlI,EAAW,qBAAqB,OAAO,CAAC,EAC1EmI,EAAS,MAAM,UAAU,MAAM,KAAKnI,EAAW,qBAAqB,OAAO,CAAC,EAC5EoI,EAAO,MAAM,UAAU,MAAM,KAAKpI,EAAW,qBAAqB,UAAU,CAAC,EAC7EqI,EAAWH,EAAK,OAAOC,EAAQC,CAAI,EAGzC,GAAIC,GAAYA,EAAS,OAAS,EAChC,QAAS7pC,EAAI,EAAGsF,EAAIukC,EAAS,OAAQ7pC,EAAIsF,EAAGtF,IAAK,CAC/C,MAAM8pC,EAAUD,EAAS7pC,CAAC,EAG1B,GAAI8pC,GAAWA,EAAQ,aAEjBA,EAAQ,SAAW,QACLA,EAAQ,aAAa,YAAY,IAIjC,MAEdN,GAAUM,CAAO,MAKhB,CACLC,GAAiB,CAAC,EAClB,KACR,CACA,MAGcR,IACVQ,GAAiB,CAAC,CAEtB,EAYA,SAASA,GAAiBC,EAAMC,EAAK,CAE9B/E,GAAM,IAGP+E,IACFT,GAAYS,GAEdhI,EAAS,WAAWwH,GAAWO,CAAI,EACrC,CAOA,SAASE,IAAkB,CACzBX,GAAgB,GAChBtH,EAAS,oBAAoB,OAAQiI,EAAe,CACtD,CACIhF,OACE1D,EAAW,aAAe,WAC5B0I,GAAiB,EAUjBjI,EAAS,iBAAiB,OAAQiI,EAAe,GAkBrD,MAAMC,GAAqB,SAAUpD,EAAW,CAC9C,MAAMqC,EAAQ5H,EAAW,cAAc,OAAO,EAC9C,OAAA4H,EAAM,UAAYrC,EACXqC,CACT,EAWMgB,GAAiB,SAAU/oB,EAAI8kB,EAAS,CACxC9kB,EAAG,WACLA,EAAG,WAAW,QAAU8kB,EAExB9kB,EAAG,YAAc8kB,CAErB,EAiBA,IAAIkE,GAAU,IAAI,QAalB,MAAMC,GAAe,EAOrB,IAAIC,GAAQD,GAQZ,SAASE,IAAU,CACjB,OAAOD,IACT,CAqBA,SAASE,GAAeC,EAAMlqC,EAAM,CAClC,GAAI,CAAC6pC,GAAQ,IAAIK,CAAI,EACnB,OAEF,MAAM19B,EAAOq9B,GAAQ,IAAIK,CAAI,EAGzB19B,EAAK,SAASxM,CAAI,EAAE,SAAW,IACjC,OAAOwM,EAAK,SAASxM,CAAI,EAKrBkqC,EAAK,oBACPA,EAAK,oBAAoBlqC,EAAMwM,EAAK,WAAY,EAAK,EAC5C09B,EAAK,aACdA,EAAK,YAAY,KAAOlqC,EAAMwM,EAAK,UAAU,GAK7C,OAAO,oBAAoBA,EAAK,QAAQ,EAAE,QAAU,IACtD,OAAOA,EAAK,SACZ,OAAOA,EAAK,WACZ,OAAOA,EAAK,UAIV,OAAO,oBAAoBA,CAAI,EAAE,SAAW,GAC9Cq9B,GAAQ,OAAOK,CAAI,CAEvB,CAiBA,SAASC,GAAsBlrC,EAAIirC,EAAM/K,EAAO59B,EAAU,CACxD49B,EAAM,QAAQ,SAAUn/B,EAAM,CAE5Bf,EAAGirC,EAAMlqC,EAAMuB,CAAQ,CAC3B,CAAG,CACH,CAWA,SAAS6oC,GAASj2B,EAAO,CACvB,GAAIA,EAAM,OACR,OAAOA,EAET,SAASk2B,GAAa,CACpB,MAAO,EACX,CACE,SAASC,GAAc,CACrB,MAAO,EACX,CAOE,GAAI,CAACn2B,GAAS,CAACA,EAAM,sBAAwB,CAACA,EAAM,8BAA+B,CACjF,MAAM0R,EAAM1R,GAASstB,EAAS,MAC9BttB,EAAQ,CAAE,EAOV,MAAMo2B,EAAkB,CAAC,SAAU,SAAU,cAAe,OAAQ,kBAAmB,kBAAmB,cAAe,gBAAgB,EACzI,UAAWznC,KAAO+iB,EAKX0kB,EAAgB,SAASznC,CAAG,GAGzBA,IAAQ,eAAiB+iB,EAAI,iBACjC1R,EAAMrR,CAAG,EAAI+iB,EAAI/iB,CAAG,GAgD1B,GA1CKqR,EAAM,SACTA,EAAM,OAASA,EAAM,YAAc6sB,GAIhC7sB,EAAM,gBACTA,EAAM,cAAgBA,EAAM,cAAgBA,EAAM,OAASA,EAAM,UAAYA,EAAM,aAIrFA,EAAM,eAAiB,UAAY,CAC7B0R,EAAI,gBACNA,EAAI,eAAgB,EAEtB1R,EAAM,YAAc,GACpB0R,EAAI,YAAc,GAClB1R,EAAM,iBAAmB,EAC1B,EACDA,EAAM,iBAAmB,GAGzBA,EAAM,gBAAkB,UAAY,CAC9B0R,EAAI,iBACNA,EAAI,gBAAiB,EAEvB1R,EAAM,aAAe,GACrB0R,EAAI,aAAe,GACnB1R,EAAM,qBAAuBk2B,CAC9B,EACDl2B,EAAM,qBAAuBm2B,EAG7Bn2B,EAAM,yBAA2B,UAAY,CACvC0R,EAAI,0BACNA,EAAI,yBAA0B,EAEhC1R,EAAM,8BAAgCk2B,EACtCl2B,EAAM,gBAAiB,CACxB,EACDA,EAAM,8BAAgCm2B,EAGlCn2B,EAAM,UAAY,MAAQA,EAAM,UAAY,OAAW,CACzD,MAAM6M,EAAMggB,EAAW,gBACjBn9B,EAAOm9B,EAAW,KACxB7sB,EAAM,MAAQA,EAAM,SAAW6M,GAAOA,EAAI,YAAcnd,GAAQA,EAAK,YAAc,IAAMmd,GAAOA,EAAI,YAAcnd,GAAQA,EAAK,YAAc,GAC7IsQ,EAAM,MAAQA,EAAM,SAAW6M,GAAOA,EAAI,WAAand,GAAQA,EAAK,WAAa,IAAMmd,GAAOA,EAAI,WAAand,GAAQA,EAAK,WAAa,EAC/I,CAGIsQ,EAAM,MAAQA,EAAM,UAAYA,EAAM,QAIlCA,EAAM,SAAW,MAAQA,EAAM,SAAW,SAI5CA,EAAM,OAASA,EAAM,OAAS,EAAI,EAAIA,EAAM,OAAS,EAAI,EAAIA,EAAM,OAAS,EAAI,EAAI,EAG1F,CAEE,OAAAA,EAAM,OAAS,GAERA,CACT,CAKA,IAAIq2B,GACJ,MAAMC,GAAkB,UAAY,CAClC,GAAI,OAAOD,IAAqB,UAAW,CACzCA,GAAmB,GACnB,GAAI,CACF,MAAMl5B,EAAO,OAAO,eAAe,CAAA,EAAI,UAAW,CAChD,KAAM,CACJk5B,GAAmB,EAC7B,CACA,CAAO,EACD/I,EAAS,iBAAiB,OAAQ,KAAMnwB,CAAI,EAC5CmwB,EAAS,oBAAoB,OAAQ,KAAMnwB,CAAI,CAChD,MAAW,CAEhB,CACA,CACE,OAAOk5B,EACT,EAKME,GAAgB,CAAC,aAAc,WAAW,EAiBhD,SAASC,GAAGT,EAAMlqC,EAAMf,EAAI,CAC1B,GAAI,MAAM,QAAQe,CAAI,EACpB,OAAOmqC,GAAsBQ,GAAIT,EAAMlqC,EAAMf,CAAE,EAE5C4qC,GAAQ,IAAIK,CAAI,GACnBL,GAAQ,IAAIK,EAAM,EAAE,EAEtB,MAAM19B,EAAOq9B,GAAQ,IAAIK,CAAI,EAsC7B,GAnCK19B,EAAK,WACRA,EAAK,SAAW,CAAE,GAEfA,EAAK,SAASxM,CAAI,IACrBwM,EAAK,SAASxM,CAAI,EAAI,CAAE,GAErBf,EAAG,OACNA,EAAG,KAAO+qC,GAAS,GAErBx9B,EAAK,SAASxM,CAAI,EAAE,KAAKf,CAAE,EACtBuN,EAAK,aACRA,EAAK,SAAW,GAChBA,EAAK,WAAa,SAAU2H,EAAOy2B,EAAM,CACvC,GAAIp+B,EAAK,SACP,OAEF2H,EAAQi2B,GAASj2B,CAAK,EACtB,MAAM02B,EAAWr+B,EAAK,SAAS2H,EAAM,IAAI,EACzC,GAAI02B,EAAU,CAEZ,MAAMC,EAAeD,EAAS,MAAM,CAAC,EACrC,QAASnlC,EAAI,EAAG9G,EAAIksC,EAAa,OAAQplC,EAAI9G,GACvC,CAAAuV,EAAM,gCADoCzO,IAI5C,GAAI,CACFolC,EAAaplC,CAAC,EAAE,KAAKwkC,EAAM/1B,EAAOy2B,CAAI,CACvC,OAAQ9lC,EAAG,CACVy9B,EAAM,MAAMz9B,CAAC,CAC3B,CAGA,CACK,GAEC0H,EAAK,SAASxM,CAAI,EAAE,SAAW,EACjC,GAAIkqC,EAAK,iBAAkB,CACzB,IAAInpC,EAAU,GACV0pC,GAAiB,GAAIC,GAAc,QAAQ1qC,CAAI,EAAI,KACrDe,EAAU,CACR,QAAS,EACV,GAEHmpC,EAAK,iBAAiBlqC,EAAMwM,EAAK,WAAYzL,CAAO,CAC1D,MAAempC,EAAK,aACdA,EAAK,YAAY,KAAOlqC,EAAMwM,EAAK,UAAU,CAGnD,CAeA,SAASu+B,GAAIb,EAAMlqC,EAAMf,EAAI,CAE3B,GAAI,CAAC4qC,GAAQ,IAAIK,CAAI,EACnB,OAEF,MAAM19B,EAAOq9B,GAAQ,IAAIK,CAAI,EAG7B,GAAI,CAAC19B,EAAK,SACR,OAEF,GAAI,MAAM,QAAQxM,CAAI,EACpB,OAAOmqC,GAAsBY,GAAKb,EAAMlqC,EAAMf,CAAE,EAIlD,MAAM+rC,EAAa,SAAUnqB,EAAIzY,EAAG,CAClCoE,EAAK,SAASpE,CAAC,EAAI,CAAE,EACrB6hC,GAAeppB,EAAIzY,CAAC,CACrB,EAGD,GAAIpI,IAAS,OAAW,CACtB,UAAWoI,KAAKoE,EAAK,SACf,OAAO,UAAU,eAAe,KAAKA,EAAK,UAAY,GAAIpE,CAAC,GAC7D4iC,EAAWd,EAAM9hC,CAAC,EAGtB,MACJ,CACE,MAAMyiC,EAAWr+B,EAAK,SAASxM,CAAI,EAGnC,GAAK6qC,EAKL,IAAI,CAAC5rC,EAAI,CACP+rC,EAAWd,EAAMlqC,CAAI,EACrB,MACJ,CAGE,GAAIf,EAAG,KACL,QAASL,EAAI,EAAGA,EAAIisC,EAAS,OAAQjsC,IAC/BisC,EAASjsC,CAAC,EAAE,OAASK,EAAG,MAC1B4rC,EAAS,OAAOjsC,IAAK,CAAC,EAI5BqrC,GAAeC,EAAMlqC,CAAI,EAC3B,CAkBA,SAASirC,GAAQf,EAAM/1B,EAAOy2B,EAAM,CAIlC,MAAMM,EAAWrB,GAAQ,IAAIK,CAAI,EAAIL,GAAQ,IAAIK,CAAI,EAAI,CAAE,EACrDnmB,EAASmmB,EAAK,YAAcA,EAAK,cAwBvC,GAnBI,OAAO/1B,GAAU,SACnBA,EAAQ,CACN,KAAMA,EACN,OAAQ+1B,CACT,EACS/1B,EAAM,SAChBA,EAAM,OAAS+1B,GAIjB/1B,EAAQi2B,GAASj2B,CAAK,EAGlB+2B,EAAS,YACXA,EAAS,WAAW,KAAKhB,EAAM/1B,EAAOy2B,CAAI,EAKxC7mB,GAAU,CAAC5P,EAAM,qBAAsB,GAAIA,EAAM,UAAY,GAC/D82B,GAAQ,KAAK,KAAMlnB,EAAQ5P,EAAOy2B,CAAI,UAG7B,CAAC7mB,GAAU,CAAC5P,EAAM,kBAAoBA,EAAM,QAAUA,EAAM,OAAOA,EAAM,IAAI,EAAG,CACpF01B,GAAQ,IAAI11B,EAAM,MAAM,GAC3B01B,GAAQ,IAAI11B,EAAM,OAAQ,CAAA,CAAE,EAE9B,MAAMg3B,EAAatB,GAAQ,IAAI11B,EAAM,MAAM,EAGvCA,EAAM,OAAOA,EAAM,IAAI,IAEzBg3B,EAAW,SAAW,GAElB,OAAOh3B,EAAM,OAAOA,EAAM,IAAI,GAAM,YACtCA,EAAM,OAAOA,EAAM,IAAI,EAAG,EAG5Bg3B,EAAW,SAAW,GAE5B,CAGE,MAAO,CAACh3B,EAAM,gBAChB,CAcA,SAASi3B,GAAIlB,EAAMlqC,EAAMf,EAAI,CAC3B,GAAI,MAAM,QAAQe,CAAI,EACpB,OAAOmqC,GAAsBiB,GAAKlB,EAAMlqC,EAAMf,CAAE,EAElD,MAAMosC,EAAO,UAAY,CACvBN,GAAIb,EAAMlqC,EAAMqrC,CAAI,EACpBpsC,EAAG,MAAM,KAAM,SAAS,CACzB,EAGDosC,EAAK,KAAOpsC,EAAG,KAAOA,EAAG,MAAQ+qC,GAAS,EAC1CW,GAAGT,EAAMlqC,EAAMqrC,CAAI,CACrB,CAeA,SAASC,GAAIpB,EAAMlqC,EAAMf,EAAI,CAC3B,MAAMosC,EAAO,UAAY,CACvBN,GAAIb,EAAMlqC,EAAMqrC,CAAI,EACpBpsC,EAAG,MAAM,KAAM,SAAS,CACzB,EAGDosC,EAAK,KAAOpsC,EAAG,KAAOA,EAAG,MAAQ+qC,GAAS,EAG1CW,GAAGT,EAAMlqC,EAAMqrC,CAAI,CACrB,CAEA,IAAIE,GAAsB,OAAO,OAAO,CACtC,UAAW,KACX,SAAUnB,GACV,GAAIO,GACJ,IAAKI,GACL,QAASE,GACT,IAAKG,GACL,IAAKE,EACP,CAAC,EAMD,MAAME,GAA0B,GAsB1BC,GAAQ,SAAUjG,EAASvmC,EAAIysC,EAAK,CAEnCzsC,EAAG,OACNA,EAAG,KAAO+qC,GAAS,GAIrB,MAAM2B,EAAQ1sC,EAAG,KAAKumC,CAAO,EAQ7B,OAAAmG,EAAM,KAAOD,EAAMA,EAAM,IAAMzsC,EAAG,KAAOA,EAAG,KACrC0sC,CACT,EAeMC,GAAW,SAAU3sC,EAAIuqC,EAAM,CACnC,IAAIqC,EAAOpK,EAAS,YAAY,IAAK,EAQrC,OAPkB,YAAa3uB,EAAM,CACnC,MAAM+b,EAAM4S,EAAS,YAAY,IAAK,EAClC5S,EAAMgd,GAAQrC,IAChBvqC,EAAG,GAAG6T,CAAI,EACV+4B,EAAOhd,EAEV,CAEH,EA4BMid,GAAW,SAAUT,EAAM7B,EAAMuC,EAAWvG,EAAU/D,EAAU,CACpE,IAAIuK,EACJ,MAAMC,EAAS,IAAM,CACnBzG,EAAQ,aAAawG,CAAO,EAC5BA,EAAU,IACX,EAGKE,EAAY,UAAY,CAC5B,MAAM9+B,EAAO,KACP0F,EAAO,UACb,IAAIq5B,EAAQ,UAAY,CACtBH,EAAU,KACVG,EAAQ,KACHJ,GACHV,EAAK,MAAMj+B,EAAM0F,CAAI,CAExB,EACG,CAACk5B,GAAWD,GACdV,EAAK,MAAMj+B,EAAM0F,CAAI,EAEvB0yB,EAAQ,aAAawG,CAAO,EAC5BA,EAAUxG,EAAQ,WAAW2G,EAAO3C,CAAI,CACzC,EAGD,OAAA0C,EAAU,OAASD,EACZC,CACT,EAEA,IAAIE,GAAkB,OAAO,OAAO,CAClC,UAAW,KACX,wBAAyBZ,GACzB,MAAOC,GACP,SAAUG,GACV,SAAUE,EACZ,CAAC,EAKD,IAAIO,GAUJ,MAAMC,EAAc,CAWlB,GAAGtsC,EAAMf,EAAI,CAGX,MAAMstC,EAAM,KAAK,iBACjB,KAAK,iBAAmB,IAAM,CAAE,EAChC5B,GAAG,KAAM3qC,EAAMf,CAAE,EACjB,KAAK,iBAAmBstC,CAC5B,CAYE,IAAIvsC,EAAMf,EAAI,CACZ8rC,GAAI,KAAM/qC,EAAMf,CAAE,CACtB,CAYE,IAAIe,EAAMf,EAAI,CAGZ,MAAMstC,EAAM,KAAK,iBACjB,KAAK,iBAAmB,IAAM,CAAE,EAChCnB,GAAI,KAAMprC,EAAMf,CAAE,EAClB,KAAK,iBAAmBstC,CAC5B,CAaE,IAAIvsC,EAAMf,EAAI,CAGZ,MAAMstC,EAAM,KAAK,iBACjB,KAAK,iBAAmB,IAAM,CAAE,EAChCjB,GAAI,KAAMtrC,EAAMf,CAAE,EAClB,KAAK,iBAAmBstC,CAC5B,CAiBE,QAAQp4B,EAAO,CACb,MAAMnU,EAAOmU,EAAM,MAAQA,EAOvB,OAAOA,GAAU,WACnBA,EAAQ,CACN,KAAAnU,CACD,GAEHmU,EAAQi2B,GAASj2B,CAAK,EAClB,KAAK,eAAenU,CAAI,GAAK,KAAK,KAAOA,CAAI,GAC/C,KAAK,KAAOA,CAAI,EAAEmU,CAAK,EAEzB82B,GAAQ,KAAM92B,CAAK,CACvB,CACE,aAAaA,EAAO,CAEbk4B,KACHA,GAAY,IAAI,KAElB,MAAMrsC,EAAOmU,EAAM,MAAQA,EAC3B,IAAIe,EAAMm3B,GAAU,IAAI,IAAI,EACvBn3B,IACHA,EAAM,IAAI,IACVm3B,GAAU,IAAI,KAAMn3B,CAAG,GAEzB,MAAMs3B,EAAat3B,EAAI,IAAIlV,CAAI,EAC/BkV,EAAI,OAAOlV,CAAI,EACfyhC,EAAS,aAAa+K,CAAU,EAChC,MAAMR,EAAUvK,EAAS,WAAW,IAAM,CACxCvsB,EAAI,OAAOlV,CAAI,EAEXkV,EAAI,OAAS,IACfA,EAAM,KACNm3B,GAAU,OAAO,IAAI,GAEvB,KAAK,QAAQl4B,CAAK,CACnB,EAAE,CAAC,EACJe,EAAI,IAAIlV,EAAMgsC,CAAO,CACzB,CACA,CA+BAM,GAAc,UAAU,eAAiB,CAAE,EAS3CA,GAAc,UAAU,iBAAmBA,GAAc,UAAU,GASnEA,GAAc,UAAU,oBAAsBA,GAAc,UAAU,IAStEA,GAAc,UAAU,cAAgBA,GAAc,UAAU,QAMhE,MAAMG,GAAUnuC,GACV,OAAOA,EAAI,MAAS,WACfA,EAAI,KAAM,EAEf,OAAOA,EAAI,MAAS,SACfA,EAAI,KAETA,EAAI,MACCA,EAAI,MAETA,EAAI,aAAeA,EAAI,YAAY,KAC9BA,EAAI,YAAY,KAElB,OAAOA,EAYVouC,GAAYjvB,GAAUA,aAAkB6uB,IAAiB,CAAC,CAAC7uB,EAAO,aAAe,CAAC,KAAM,MAAO,MAAO,SAAS,EAAE,MAAM3X,GAAK,OAAO2X,EAAO3X,CAAC,GAAM,UAAU,EAU3J6mC,GAAqB,CAAC/uB,EAAQrc,IAAa,CAC3CmrC,GAAU9uB,CAAM,EAClBrc,EAAU,GAELqc,EAAO,mBACVA,EAAO,iBAAmB,CAAE,GAE9BA,EAAO,iBAAiB,KAAKrc,CAAQ,EAEzC,EAYMqrC,GAAmB5sC,GAGzB,OAAOA,GAAS,UAAY,KAAK,KAAKA,CAAI,GAAK,MAAM,QAAQA,CAAI,GAAK,CAAC,CAACA,EAAK,OAkBvE6sC,GAAiB,CAACjvB,EAAQtf,EAAKwuC,IAAW,CAC9C,GAAI,CAAClvB,GAAU,CAACA,EAAO,UAAY,CAAC8uB,GAAU9uB,CAAM,EAClD,MAAM,IAAI,MAAM,sBAAsB6uB,GAAQnuC,CAAG,CAAC,IAAIwuC,CAAM,yCAAyC,CAEzG,EAkBMC,GAAoB,CAAC/sC,EAAM1B,EAAKwuC,IAAW,CAC/C,GAAI,CAACF,GAAiB5sC,CAAI,EACxB,MAAM,IAAI,MAAM,0BAA0BysC,GAAQnuC,CAAG,CAAC,IAAIwuC,CAAM,wCAAwC,CAE5G,EAkBME,GAAmB,CAACr6B,EAAUrU,EAAKwuC,IAAW,CAClD,GAAI,OAAOn6B,GAAa,WACtB,MAAM,IAAI,MAAM,wBAAwB85B,GAAQnuC,CAAG,CAAC,IAAIwuC,CAAM,uBAAuB,CAEzF,EAoBMG,GAAsB,CAAC7/B,EAAM0F,EAAMg6B,IAAW,CAGlD,MAAMI,EAAkBp6B,EAAK,OAAS,GAAKA,EAAK,CAAC,IAAM1F,GAAQ0F,EAAK,CAAC,IAAM1F,EAAK,YAChF,IAAIwQ,EACA5d,EACA2S,EACJ,OAAIu6B,GACFtvB,EAASxQ,EAAK,YAIV0F,EAAK,QAAU,GACjBA,EAAK,MAAO,EAEd,CAAC9S,EAAM2S,CAAQ,EAAIG,GAEnB,CAAC8K,EAAQ5d,EAAM2S,CAAQ,EAAIG,EAE7B+5B,GAAejvB,EAAQxQ,EAAM0/B,CAAM,EACnCC,GAAkB/sC,EAAMoN,EAAM0/B,CAAM,EACpCE,GAAiBr6B,EAAUvF,EAAM0/B,CAAM,EACvCn6B,EAAW84B,GAAMr+B,EAAMuF,CAAQ,EACxB,CACL,gBAAAu6B,EACA,OAAAtvB,EACA,KAAA5d,EACA,SAAA2S,CACD,CACH,EAmBMw6B,GAAS,CAACvvB,EAAQ1a,EAAQlD,EAAM2S,IAAa,CACjDk6B,GAAejvB,EAAQA,EAAQ1a,CAAM,EACjC0a,EAAO,SACT2tB,GAAOroC,CAAM,EAAE0a,EAAQ5d,EAAM2S,CAAQ,EAErCiL,EAAO1a,CAAM,EAAElD,EAAM2S,CAAQ,CAEjC,EAQMy6B,GAAe,CAwBnB,MAAMt6B,EAAM,CACV,KAAM,CACJ,gBAAAo6B,EACA,OAAAtvB,EACA,KAAA5d,EACA,SAAA2S,CACD,EAAGs6B,GAAoB,KAAMn6B,EAAM,IAAI,EAIxC,GAHAq6B,GAAOvvB,EAAQ,KAAM5d,EAAM2S,CAAQ,EAG/B,CAACu6B,EAAiB,CAEpB,MAAMG,EAA0B,IAAM,KAAK,IAAIzvB,EAAQ5d,EAAM2S,CAAQ,EAIrE06B,EAAwB,KAAO16B,EAAS,KAKxC,MAAM26B,EAA+B,IAAM,KAAK,IAAI,UAAWD,CAAuB,EAItFC,EAA6B,KAAO36B,EAAS,KAC7Cw6B,GAAO,KAAM,KAAM,UAAWE,CAAuB,EACrDF,GAAOvvB,EAAQ,KAAM,UAAW0vB,CAA4B,CAClE,CACG,EAwBD,OAAOx6B,EAAM,CACX,KAAM,CACJ,gBAAAo6B,EACA,OAAAtvB,EACA,KAAA5d,EACA,SAAA2S,CACD,EAAGs6B,GAAoB,KAAMn6B,EAAM,KAAK,EAGzC,GAAIo6B,EACFC,GAAOvvB,EAAQ,MAAO5d,EAAM2S,CAAQ,MAG/B,CAKL,MAAMguB,EAAU,IAAI4M,IAAU,CAC5B,KAAK,IAAI3vB,EAAQ5d,EAAM2gC,CAAO,EAC9BhuB,EAAS,MAAM,KAAM46B,CAAK,CAC3B,EAID5M,EAAQ,KAAOhuB,EAAS,KACxBw6B,GAAOvvB,EAAQ,MAAO5d,EAAM2gC,CAAO,CACzC,CACG,EAyBD,OAAO7tB,EAAM,CACX,KAAM,CACJ,gBAAAo6B,EACA,OAAAtvB,EACA,KAAA5d,EACA,SAAA2S,CACD,EAAGs6B,GAAoB,KAAMn6B,EAAM,KAAK,EAGzC,GAAIo6B,EACFC,GAAOvvB,EAAQ,MAAO5d,EAAM2S,CAAQ,MAG/B,CACL,MAAMguB,EAAU,IAAI4M,IAAU,CAC5B,KAAK,IAAI3vB,EAAQ5d,EAAM2gC,CAAO,EAC9BhuB,EAAS,MAAM,KAAM46B,CAAK,CAC3B,EAID5M,EAAQ,KAAOhuB,EAAS,KACxBw6B,GAAOvvB,EAAQ,MAAO5d,EAAM2gC,CAAO,CACzC,CACG,EAoBD,IAAI6M,EAAcC,EAAgB96B,EAAU,CAE1C,GAAI,CAAC66B,GAAgBZ,GAAiBY,CAAY,EAChDzC,GAAI,KAAK,YAAayC,EAAcC,CAAc,MAG7C,CACL,MAAM7vB,EAAS4vB,EACTxtC,EAAOytC,EAGbZ,GAAejvB,EAAQ,KAAM,KAAK,EAClCmvB,GAAkB/sC,EAAM,KAAM,KAAK,EACnCgtC,GAAiBr6B,EAAU,KAAM,KAAK,EAGtCA,EAAW84B,GAAM,KAAM94B,CAAQ,EAI/B,KAAK,IAAI,UAAWA,CAAQ,EACxBiL,EAAO,UACTmtB,GAAIntB,EAAQ5d,EAAM2S,CAAQ,EAC1Bo4B,GAAIntB,EAAQ,UAAWjL,CAAQ,GACtB+5B,GAAU9uB,CAAM,IACzBA,EAAO,IAAI5d,EAAM2S,CAAQ,EACzBiL,EAAO,IAAI,UAAWjL,CAAQ,EAEtC,CACG,EAaD,QAAQwB,EAAOy2B,EAAM,CACnBiC,GAAe,KAAK,YAAa,KAAM,SAAS,EAChD,MAAM7sC,EAAOmU,GAAS,OAAOA,GAAU,SAAWA,EAAM,KAAOA,EAC/D,GAAI,CAACy4B,GAAiB5sC,CAAI,EACxB,MAAM,IAAI,MAAM,0BAA0BysC,GAAQ,IAAI,CAAC,4FAAiG,EAE1J,OAAOxB,GAAQ,KAAK,YAAa92B,EAAOy2B,CAAI,CAChD,CACA,EAmBA,SAAS8C,GAAQ9vB,EAAQ7c,EAAU,GAAI,CACrC,KAAM,CACJ,YAAA4sC,CACJ,EAAM5sC,EAGJ,GAAI4sC,EAAa,CACf,GAAI,CAAC/vB,EAAO+vB,CAAW,EAAE,SACvB,MAAM,IAAI,MAAM,oBAAoBA,CAAW,iCAAiC,EAElF/vB,EAAO,YAAcA,EAAO+vB,CAAW,CAC3C,MACI/vB,EAAO,YAAc8nB,EAAS,OAAQ,CACpC,UAAW,eACjB,CAAK,EAEH,cAAO,OAAO9nB,EAAQwvB,EAAY,EAC9BxvB,EAAO,kBACTA,EAAO,iBAAiB,QAAQrc,GAAY,CAC1CA,EAAU,CAChB,CAAK,EAIHqc,EAAO,GAAG,UAAW,IAAM,CACzBA,EAAO,IAAK,EACZ,CAACA,EAAQA,EAAO,IAAKA,EAAO,WAAW,EAAE,QAAQ,SAAU7T,EAAK,CAC1DA,GAAO8/B,GAAQ,IAAI9/B,CAAG,GACxB8/B,GAAQ,OAAO9/B,CAAG,CAE1B,CAAK,EACD03B,EAAS,WAAW,IAAM,CACxB7jB,EAAO,YAAc,IACtB,EAAE,CAAC,CACR,CAAG,EACMA,CACT,CAaA,MAAMgwB,GAAgB,CAOpB,MAAO,CAAE,EAcT,SAASC,EAAc,CAEjB,OAAOA,GAAiB,aAC1BA,EAAeA,EAAc,GAE/B,IAAIC,EACJ,OAAApL,GAAKmL,EAAc,CAAC5rC,EAAOa,IAAQ,CAG7B,KAAK,MAAMA,CAAG,IAAMb,IACtB6rC,EAAUA,GAAW,CAAE,EACvBA,EAAQhrC,CAAG,EAAI,CACb,KAAM,KAAK,MAAMA,CAAG,EACpB,GAAIb,CACL,GAEH,KAAK,MAAMa,CAAG,EAAIb,CACxB,CAAK,EAKG6rC,GAAWpB,GAAU,IAAI,GAY3B,KAAK,QAAQ,CACX,QAAAoB,EACA,KAAM,cACd,CAAO,EAEIA,CACX,CACA,EAoBA,SAASC,GAASnwB,EAAQowB,EAAc,CACtC,cAAO,OAAOpwB,EAAQgwB,EAAa,EAInChwB,EAAO,MAAQ,OAAO,OAAO,CAAA,EAAIA,EAAO,MAAOowB,CAAY,EAGvD,OAAOpwB,EAAO,oBAAuB,YAAc8uB,GAAU9uB,CAAM,GACrEA,EAAO,GAAG,eAAgBA,EAAO,kBAAkB,EAE9CA,CACT,CAgBA,MAAMqwB,GAAc,SAAU/uC,EAAQ,CACpC,OAAI,OAAOA,GAAW,SACbA,EAEFA,EAAO,QAAQ,IAAKgvC,GAAKA,EAAE,aAAa,CACjD,EAWMC,GAAgB,SAAUjvC,EAAQ,CACtC,OAAI,OAAOA,GAAW,SACbA,EAEFA,EAAO,QAAQ,IAAKgvC,GAAKA,EAAE,aAAa,CACjD,EAcME,GAAkB,SAAUC,EAAMC,EAAM,CAC5C,OAAOH,GAAcE,CAAI,IAAMF,GAAcG,CAAI,CACnD,EAEA,IAAIC,GAAmB,OAAO,OAAO,CACnC,UAAW,KACX,YAAaN,GACb,YAAaE,GACb,gBAAiBC,EACnB,CAAC,EA0BD,MAAMI,CAAY,CAqBhB,YAAYC,EAAQ1tC,EAAS2tC,EAAO,CAsBlC,GApBI,CAACD,GAAU,KAAK,KAClB,KAAK,QAAUA,EAAS,KAExB,KAAK,QAAUA,EAEjB,KAAK,YAAc,GAGnB,KAAK,iBAAmB,KAGxB,KAAK,SAAW1L,GAAQ,CAAA,EAAI,KAAK,QAAQ,EAGzChiC,EAAU,KAAK,SAAWgiC,GAAQ,KAAK,SAAUhiC,CAAO,EAGxD,KAAK,IAAMA,EAAQ,IAAMA,EAAQ,IAAMA,EAAQ,GAAG,GAG9C,CAAC,KAAK,IAAK,CAEb,MAAM6jB,EAAK6pB,GAAUA,EAAO,IAAMA,EAAO,GAAE,GAAM,YACjD,KAAK,IAAM,GAAG7pB,CAAE,cAAcolB,GAAO,CAAE,EAC7C,CACI,KAAK,MAAQjpC,EAAQ,MAAQ,KAGzBA,EAAQ,GACV,KAAK,IAAMA,EAAQ,GACVA,EAAQ,WAAa,KAC9B,KAAK,IAAM,KAAK,SAAU,GAExBA,EAAQ,WAAa,KAAK,KAC5BA,EAAQ,UAAU,MAAM,GAAG,EAAE,QAAQ4Y,GAAK,KAAK,SAASA,CAAC,CAAC,EAK5D,CAAC,KAAM,MAAO,MAAO,MAAO,SAAS,EAAE,QAAQ1a,GAAM,CACnD,KAAKA,CAAE,EAAI,MACjB,CAAK,EAGG8B,EAAQ,UAAY,KAEtB2sC,GAAQ,KAAM,CACZ,YAAa,KAAK,IAAM,MAAQ,IACxC,CAAO,EACD,KAAK,qBAAuB,KAAK,qBAAqB,KAAK,IAAI,EAC/D,KAAK,GAAG,KAAK,QAAS,iBAAkB,KAAK,oBAAoB,GAEnEK,GAAS,KAAM,KAAK,YAAY,YAAY,EAC5C,KAAK,UAAY,CAAE,EACnB,KAAK,YAAc,CAAE,EACrB,KAAK,gBAAkB,CAAE,EACzB,KAAK,eAAiB,IAAI,IAC1B,KAAK,gBAAkB,IAAI,IAC3B,KAAK,QAAU,IAAI,IACnB,KAAK,WAAa,IAAI,IACtB,KAAK,yBAA2B,GAG5BhtC,EAAQ,eAAiB,IAC3B,KAAK,aAAc,EAKrB,KAAK,MAAM2tC,CAAK,EACZ3tC,EAAQ,sBAAwB,IAClC,KAAK,oBAAqB,CAEhC,CAeE,GAAGf,EAAMf,EAAI,CAAA,CAab,IAAIe,EAAMf,EAAI,CAAA,CAad,IAAIe,EAAMf,EAAI,CAAA,CAcd,IAAIe,EAAMf,EAAI,CAAA,CAqBd,QAAQkV,EAAOy2B,EAAM,CAAA,CAUrB,QAAQ7pC,EAAU,GAAI,CAEpB,GAAI,MAAK,YAwBT,IArBI,KAAK,cACP,KAAK,YAAY,OAAS,GAa5B,KAAK,QAAQ,CACX,KAAM,UACN,QAAS,EACf,CAAK,EACD,KAAK,YAAc,GAGf,KAAK,UACP,QAASvB,EAAI,KAAK,UAAU,OAAS,EAAGA,GAAK,EAAGA,IAC1C,KAAK,UAAUA,CAAC,EAAE,SACpB,KAAK,UAAUA,CAAC,EAAE,QAAS,EAMjC,KAAK,UAAY,KACjB,KAAK,YAAc,KACnB,KAAK,gBAAkB,KACvB,KAAK,iBAAmB,KACpB,KAAK,MAEH,KAAK,IAAI,aACPuB,EAAQ,UACV,KAAK,IAAI,WAAW,aAAaA,EAAQ,UAAW,KAAK,GAAG,EAE5D,KAAK,IAAI,WAAW,YAAY,KAAK,GAAG,GAG5C,KAAK,IAAM,MAIb,KAAK,QAAU,KACnB,CAQE,YAAa,CACX,MAAO,EAAQ,KAAK,WACxB,CAQE,QAAS,CACP,OAAO,KAAK,OAChB,CAaE,QAAQzC,EAAK,CACX,OAAKA,GAGL,KAAK,SAAWykC,GAAQ,KAAK,SAAUzkC,CAAG,EACnC,KAAK,UAHH,KAAK,QAIlB,CAQE,IAAK,CACH,OAAO,KAAK,GAChB,CAiBE,SAAS2J,EAAS2oB,EAAY7c,EAAY,CACxC,OAAO2xB,EAASz9B,EAAS2oB,EAAY7c,CAAU,CACnD,CAwCE,SAAS7U,EAAQyvC,EAAQC,EAAe1vC,EAAQ,CAC9C,MAAM6gB,EAAO,KAAK,QAAQ,UAAY,KAAK,QAAQ,SAAU,EACvD8uB,EAAY,KAAK,QAAQ,WAAa,KAAK,QAAQ,UAAW,EAC9D3b,EAAW2b,GAAaA,EAAU9uB,CAAI,EACtC+uB,EAAc/uB,GAAQA,EAAK,MAAM,GAAG,EAAE,CAAC,EACvCgvB,EAAcF,GAAaA,EAAUC,CAAW,EACtD,IAAIE,EAAkBJ,EACtB,OAAI1b,GAAYA,EAASh0B,CAAM,EAC7B8vC,EAAkB9b,EAASh0B,CAAM,EACxB6vC,GAAeA,EAAY7vC,CAAM,IAC1C8vC,EAAkBD,EAAY7vC,CAAM,GAElCyvC,IACFK,EAAkBA,EAAgB,QAAQ,aAAc,SAAUr7B,EAAO9Q,EAAO,CAC9E,MAAMZ,EAAQ0sC,EAAO9rC,EAAQ,CAAC,EAC9B,IAAIuI,EAAMnJ,EACV,OAAI,OAAOA,EAAU,MACnBmJ,EAAMuI,GAEDvI,CACf,CAAO,GAEI4jC,CACX,CAOE,sBAAuB,CAAA,CASvB,WAAY,CACV,OAAO,KAAK,YAAc,KAAK,GACnC,CAQE,IAAK,CACH,OAAO,KAAK,GAChB,CASE,MAAO,CACL,OAAO,KAAK,KAChB,CAQE,UAAW,CACT,OAAO,KAAK,SAChB,CAWE,aAAapqB,EAAI,CACf,OAAO,KAAK,YAAYA,CAAE,CAC9B,CAWE,SAAS1c,EAAM,CACb,GAAKA,EAGL,OAAO,KAAK,gBAAgBA,CAAI,CACpC,CAgBE,iBAAiB+mC,EAAO,CAEtBA,EAAQA,EAAM,OAAO,CAAC76B,EAAKxV,IAAMwV,EAAI,OAAOxV,CAAC,EAAG,EAAE,EAClD,IAAIswC,EAAe,KACnB,QAAS1vC,EAAI,EAAGA,EAAIyvC,EAAM,OAAQzvC,IAEhC,GADA0vC,EAAeA,EAAa,SAASD,EAAMzvC,CAAC,CAAC,EACzC,CAAC0vC,GAAgB,CAACA,EAAa,SACjC,OAGJ,OAAOA,CACX,CAcE,QAAQC,EAAUtuB,EAAK,KAAK,GAAE,EAAI,CAMhC,GAAI,CAAC,KAAK,QAAQ,SAAS,qBACzB,OAEF,MAAMuuB,EAAW,6BAIXC,EAAgB3J,EAAS,OAAQ,CACrC,UAAW,mCACjB,EAAO,CACD,cAAe,MACrB,CAAK,EACK4J,EAAQtO,EAAW,gBAAgBoO,EAAU,KAAK,EACxDE,EAAM,eAAe,KAAM,UAAW,aAAa,EACnD,MAAMC,EAAQvO,EAAW,gBAAgBoO,EAAU,KAAK,EACxD,OAAAE,EAAM,YAAYC,CAAK,EACvBA,EAAM,eAAe,KAAM,OAAQ,aAAaJ,CAAQ,EAAE,EAC1DE,EAAc,YAAYC,CAAK,EAG3B,KAAK,WACPzuB,EAAG,aAAawuB,EAAexuB,EAAG,cAAc,uBAAuB,CAAC,EAExEA,EAAG,YAAYwuB,CAAa,EAE9B,KAAK,WAAa,GACXA,CACX,CAoBE,SAAS5sB,EAAO1hB,EAAU,CAAA,EAAI8B,EAAQ,KAAK,UAAU,OAAQ,CAC3D,IAAI2sC,EACAC,EAGJ,GAAI,OAAOhtB,GAAU,SAAU,CAC7BgtB,EAAgBtB,GAAc1rB,CAAK,EACnC,MAAMitB,EAAqB3uC,EAAQ,gBAAkB0uC,EAGrD1uC,EAAQ,KAAO0uC,EAIf,MAAME,EAAiBnB,EAAY,aAAakB,CAAkB,EAClE,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,aAAaD,CAAkB,iBAAiB,EAOlE,GAAI,OAAOC,GAAmB,WAC5B,OAAO,KAETH,EAAY,IAAIG,EAAe,KAAK,SAAW,KAAM5uC,CAAO,CAGlE,MACMyuC,EAAY/sB,EAqBd,GAnBI+sB,EAAU,kBACZA,EAAU,iBAAiB,YAAYA,CAAS,EAElD,KAAK,UAAU,OAAO3sC,EAAO,EAAG2sC,CAAS,EACzCA,EAAU,iBAAmB,KACzB,OAAOA,EAAU,IAAO,aAC1B,KAAK,YAAYA,EAAU,GAAE,CAAE,EAAIA,GAKrCC,EAAgBA,GAAiBD,EAAU,MAAQrB,GAAcqB,EAAU,MAAM,EAC7EC,IACF,KAAK,gBAAgBA,CAAa,EAAID,EACtC,KAAK,gBAAgBvB,GAAYwB,CAAa,CAAC,EAAID,GAKjD,OAAOA,EAAU,IAAO,YAAcA,EAAU,GAAE,EAAI,CAExD,IAAIhpB,EAAU,KACV,KAAK,UAAU3jB,EAAQ,CAAC,IAEtB,KAAK,UAAUA,EAAQ,CAAC,EAAE,IAC5B2jB,EAAU,KAAK,UAAU3jB,EAAQ,CAAC,EAAE,IAC3BuiC,GAAK,KAAK,UAAUviC,EAAQ,CAAC,CAAC,IACvC2jB,EAAU,KAAK,UAAU3jB,EAAQ,CAAC,IAGtC,KAAK,UAAS,EAAG,aAAa2sC,EAAU,GAAI,EAAEhpB,CAAO,CAC3D,CAGI,OAAOgpB,CACX,CASE,YAAYA,EAAW,CAIrB,GAHI,OAAOA,GAAc,WACvBA,EAAY,KAAK,SAASA,CAAS,GAEjC,CAACA,GAAa,CAAC,KAAK,UACtB,OAEF,IAAII,EAAa,GACjB,QAASpwC,EAAI,KAAK,UAAU,OAAS,EAAGA,GAAK,EAAGA,IAC9C,GAAI,KAAK,UAAUA,CAAC,IAAMgwC,EAAW,CACnCI,EAAa,GACb,KAAK,UAAU,OAAOpwC,EAAG,CAAC,EAC1B,KACR,CAEI,GAAI,CAACowC,EACH,OAEFJ,EAAU,iBAAmB,KAC7B,KAAK,YAAYA,EAAU,GAAE,CAAE,EAAI,KACnC,KAAK,gBAAgBrB,GAAcqB,EAAU,KAAI,CAAE,CAAC,EAAI,KACxD,KAAK,gBAAgBvB,GAAYuB,EAAU,KAAI,CAAE,CAAC,EAAI,KACtD,MAAMK,EAASL,EAAU,GAAI,EACzBK,GAAUA,EAAO,aAAe,KAAK,UAAS,GAChD,KAAK,UAAW,EAAC,YAAYL,EAAU,GAAE,CAAE,CAEjD,CAKE,cAAe,CACb,MAAMM,EAAW,KAAK,SAAS,SAC/B,GAAIA,EAAU,CAEZ,MAAMC,EAAgB,KAAK,SACrBC,EAAYvtB,GAAS,CACzB,MAAMva,EAAOua,EAAM,KACnB,IAAInR,EAAOmR,EAAM,KAWjB,GANIstB,EAAc7nC,CAAI,IAAM,SAC1BoJ,EAAOy+B,EAAc7nC,CAAI,GAKvBoJ,IAAS,GACX,OAKEA,IAAS,KACXA,EAAO,CAAE,GAMXA,EAAK,cAAgB,KAAK,SAAS,cAMnC,MAAM2Q,EAAW,KAAK,SAAS/Z,EAAMoJ,CAAI,EACrC2Q,IACF,KAAK/Z,CAAI,EAAI+Z,EAEhB,EAGD,IAAIguB,EACJ,MAAMC,EAAO1B,EAAY,aAAa,MAAM,EACxC,MAAM,QAAQsB,CAAQ,EACxBG,EAAkBH,EAElBG,EAAkB,OAAO,KAAKH,CAAQ,EAExCG,EAGC,OAAO,OAAO,KAAK,KAAK,QAAQ,EAAE,OAAO,SAAUxtB,EAAO,CACzD,MAAO,CAACwtB,EAAgB,KAAK,SAAUE,EAAQ,CAC7C,OAAI,OAAOA,GAAW,SACb1tB,IAAU0tB,EAEZ1tB,IAAU0tB,EAAO,IAClC,CAAS,CACT,CAAO,CAAC,EAAE,IAAI1tB,GAAS,CACf,IAAIva,EACAoJ,EACJ,OAAI,OAAOmR,GAAU,UACnBva,EAAOua,EACPnR,EAAOw+B,EAAS5nC,CAAI,GAAK,KAAK,SAASA,CAAI,GAAK,CAAE,IAElDA,EAAOua,EAAM,KACbnR,EAAOmR,GAEF,CACL,KAAAva,EACA,KAAAoJ,CACD,CACT,CAAO,EAAE,OAAOmR,GAAS,CAIjB,MAAM9I,EAAI60B,EAAY,aAAa/rB,EAAM,KAAK,gBAAkB0rB,GAAc1rB,EAAM,IAAI,CAAC,EACzF,OAAO9I,GAAK,CAACu2B,EAAK,OAAOv2B,CAAC,CAClC,CAAO,EAAE,QAAQq2B,CAAS,CAC1B,CACA,CAUE,eAAgB,CAGd,MAAO,EACX,CAUE,MAAM/wC,EAAI4F,EAAO,GAAO,CACtB,GAAK5F,EAGL,IAAI,CAAC,KAAK,SAAU,CAClB,KAAK,YAAc,KAAK,aAAe,CAAE,EACzC,KAAK,YAAY,KAAKA,CAAE,EACxB,MACN,CACQ4F,EACF5F,EAAG,KAAK,IAAI,EAGZ,KAAK,WAAWA,EAAI,CAAC,EAE3B,CAOE,cAAe,CACb,KAAK,SAAW,GAGhB,KAAK,WAAW,UAAY,CAC1B,MAAMmxC,EAAa,KAAK,YAGxB,KAAK,YAAc,CAAE,EACjBA,GAAcA,EAAW,OAAS,GACpCA,EAAW,QAAQ,SAAUnxC,EAAI,CAC/BA,EAAG,KAAK,IAAI,CACb,EAAE,IAAI,EAUT,KAAK,QAAQ,OAAO,CACrB,EAAE,CAAC,CACR,CAoBE,EAAEsmC,EAAUC,EAAS,CACnB,OAAO6C,GAAE9C,EAAUC,GAAW,KAAK,UAAS,CAAE,CAClD,CAoBE,GAAGD,EAAUC,EAAS,CACpB,OAAO8C,GAAG/C,EAAUC,GAAW,KAAK,UAAS,CAAE,CACnD,CAYE,SAASQ,EAAc,CACrB,OAAOD,GAAS,KAAK,IAAKC,CAAY,CAC1C,CAQE,YAAYE,EAAc,CACxBD,GAAS,KAAK,IAAK,GAAGC,CAAY,CACtC,CAQE,eAAeE,EAAiB,CAC9BD,GAAY,KAAK,IAAK,GAAGC,CAAe,CAC5C,CAaE,YAAYE,EAAejpB,EAAW,CACpCgpB,GAAY,KAAK,IAAKC,EAAejpB,CAAS,CAClD,CAME,MAAO,CACL,KAAK,YAAY,YAAY,CACjC,CAME,MAAO,CACL,KAAK,SAAS,YAAY,CAC9B,CAQE,aAAc,CACZ,KAAK,SAAS,kBAAkB,CACpC,CAQE,eAAgB,CACd,KAAK,YAAY,kBAAkB,CACvC,CAiBE,aAAavF,EAAW,CACtB,OAAO+uB,GAAa,KAAK,IAAK/uB,CAAS,CAC3C,CAaE,aAAaA,EAAW7V,EAAO,CAC7B6kC,GAAa,KAAK,IAAKhvB,EAAW7V,CAAK,CAC3C,CAUE,gBAAgB6V,EAAW,CACzBivB,GAAgB,KAAK,IAAKjvB,CAAS,CACvC,CAeE,MAAMu4B,EAAKC,EAAe,CACxB,OAAO,KAAK,UAAU,QAASD,EAAKC,CAAa,CACrD,CAeE,OAAOD,EAAKC,EAAe,CACzB,OAAO,KAAK,UAAU,SAAUD,EAAKC,CAAa,CACtD,CAWE,WAAW9lC,EAAOD,EAAQ,CAExB,KAAK,MAAMC,EAAO,EAAI,EACtB,KAAK,OAAOD,CAAM,CACtB,CA8BE,UAAUgmC,EAAeF,EAAKC,EAAe,CAC3C,GAAID,IAAQ,OAAW,EAEjBA,IAAQ,MAAQA,IAAQA,KAC1BA,EAAM,IAIH,GAAKA,GAAK,QAAQ,GAAG,IAAM,KAAO,GAAKA,GAAK,QAAQ,IAAI,IAAM,GACjE,KAAK,IAAI,MAAME,CAAa,EAAIF,EACvBA,IAAQ,OACjB,KAAK,IAAI,MAAME,CAAa,EAAI,GAEhC,KAAK,IAAI,MAAMA,CAAa,EAAIF,EAAM,KAInCC,GAOH,KAAK,QAAQ,iBAAiB,EAEhC,MACN,CAII,GAAI,CAAC,KAAK,IACR,MAAO,GAIT,MAAMvmC,EAAM,KAAK,IAAI,MAAMwmC,CAAa,EAClCC,EAAUzmC,EAAI,QAAQ,IAAI,EAChC,OAES,SAFLymC,IAAY,GAEEzmC,EAAI,MAAM,EAAGymC,CAAO,EAMtB,KAAK,IAAI,SAAWrC,GAAcoC,CAAa,CAAC,EANvB,EAAE,CAO/C,CAcE,iBAAiBA,EAAe,CAC9B,IAAIE,EAAwB,EAC5B,GAAIF,IAAkB,SAAWA,IAAkB,SACjD,MAAM,IAAI,MAAM,qDAAqD,EAUvE,GARAE,EAAwBrJ,GAAc,KAAK,IAAKmJ,CAAa,EAG7DE,EAAwB,WAAWA,CAAqB,EAKpDA,IAA0B,GAAK,MAAMA,CAAqB,EAAG,CAC/D,MAAM9H,EAAO,SAASwF,GAAcoC,CAAa,CAAC,GAClDE,EAAwB,KAAK,IAAI9H,CAAI,CAC3C,CACI,OAAO8H,CACX,CAwBE,mBAAoB,CAClB,MAAO,CACL,MAAO,KAAK,iBAAiB,OAAO,EACpC,OAAQ,KAAK,iBAAiB,QAAQ,CACvC,CACL,CAUE,cAAe,CACb,OAAO,KAAK,iBAAiB,OAAO,CACxC,CAUE,eAAgB,CACd,OAAO,KAAK,iBAAiB,QAAQ,CACzC,CAYE,cAAe,CACb,MAAMtJ,EAAO,KAAK,IAAI,sBAAuB,EAGvCuJ,EAAqB,CACzB,EAAGvJ,EAAK,EACR,EAAGA,EAAK,EACR,MAAOA,EAAK,MACZ,OAAQA,EAAK,OACb,IAAKA,EAAK,IACV,MAAOA,EAAK,MACZ,OAAQA,EAAK,OACb,KAAMA,EAAK,IACZ,EAGKwJ,EAAS,CACb,EAAGxJ,EAAK,KAAOA,EAAK,MAAQ,EAC5B,EAAGA,EAAK,IAAMA,EAAK,OAAS,EAC5B,MAAO,EACP,OAAQ,EACR,IAAKA,EAAK,IAAMA,EAAK,OAAS,EAC9B,MAAOA,EAAK,KAAOA,EAAK,MAAQ,EAChC,OAAQA,EAAK,IAAMA,EAAK,OAAS,EACjC,KAAMA,EAAK,KAAOA,EAAK,MAAQ,CAChC,EACD,MAAO,CACL,mBAAAuJ,EACA,OAAAC,CACD,CACL,CAKE,OAAQ,CACN,KAAK,IAAI,MAAO,CACpB,CAKE,MAAO,CACL,KAAK,IAAI,KAAM,CACnB,CASE,cAAcx8B,EAAO,CACf,KAAK,UAGHA,EAAM,MAAQ,OAAS,EAAE,KAAK,QAAQ,SAAS,cAAc,mBAAqB,KAAK,QAAQ,SAAS,cAAc,kBAAkB,UAC1IA,EAAM,gBAAiB,EAEzB,KAAK,QAAQ,cAAcA,CAAK,EAEtC,CAWE,eAAeA,EAAO,CACpB,KAAK,cAAcA,CAAK,CAC5B,CAeE,eAAgB,CAEd,IAAIy8B,EAAa,EACbC,EAAa,KAKjB,MAAMC,EAAuB,GAGvBC,EAAqB,IAC3B,IAAIC,EACJ,KAAK,GAAG,aAAc,SAAU78B,EAAO,CAEjCA,EAAM,QAAQ,SAAW,IAE3B08B,EAAa,CACX,MAAO18B,EAAM,QAAQ,CAAC,EAAE,MACxB,MAAOA,EAAM,QAAQ,CAAC,EAAE,KACzB,EAEDy8B,EAAanP,EAAS,YAAY,IAAK,EAEvCuP,EAAa,GAErB,CAAK,EACD,KAAK,GAAG,YAAa,SAAU78B,EAAO,CAEpC,GAAIA,EAAM,QAAQ,OAAS,EACzB68B,EAAa,WACJH,EAAY,CAGrB,MAAMI,EAAQ98B,EAAM,QAAQ,CAAC,EAAE,MAAQ08B,EAAW,MAC5CK,EAAQ/8B,EAAM,QAAQ,CAAC,EAAE,MAAQ08B,EAAW,MAC5B,KAAK,KAAKI,EAAQA,EAAQC,EAAQA,CAAK,EACzCJ,IAClBE,EAAa,GAEvB,CACA,CAAK,EACD,MAAMG,EAAQ,UAAY,CACxBH,EAAa,EACd,EAGD,KAAK,GAAG,aAAcG,CAAK,EAC3B,KAAK,GAAG,cAAeA,CAAK,EAI5B,KAAK,GAAG,WAAY,SAAUh9B,EAAO,CACnC08B,EAAa,KAETG,IAAe,IAECvP,EAAS,YAAY,IAAK,EAAGmP,EAG/BG,IAEd58B,EAAM,eAAgB,EAOtB,KAAK,QAAQ,KAAK,EAM5B,CAAK,CACL,CAyBE,qBAAsB,CAEpB,GAAI,CAAC,KAAK,OAAQ,GAAI,CAAC,KAAK,OAAQ,EAAC,mBACnC,OAIF,MAAMsD,EAASg0B,GAAM,KAAK,OAAQ,EAAE,KAAK,OAAQ,EAAC,kBAAkB,EACpE,IAAI2F,EACJ,KAAK,GAAG,aAAc,UAAY,CAChC35B,EAAQ,EAIR,KAAK,cAAc25B,CAAY,EAE/BA,EAAe,KAAK,YAAY35B,EAAQ,GAAG,CACjD,CAAK,EACD,MAAM45B,EAAW,SAAUl9B,EAAO,CAChCsD,EAAQ,EAER,KAAK,cAAc25B,CAAY,CAChC,EACD,KAAK,GAAG,YAAa35B,CAAM,EAC3B,KAAK,GAAG,WAAY45B,CAAQ,EAC5B,KAAK,GAAG,cAAeA,CAAQ,CACnC,CAmCE,WAAWpyC,EAAI+sC,EAAS,CAGtB,IAAIsF,EACJ,OAAAryC,EAAKwsC,GAAM,KAAMxsC,CAAE,EACnB,KAAK,sBAAuB,EAC5BqyC,EAAY7P,EAAS,WAAW,IAAM,CAChC,KAAK,eAAe,IAAI6P,CAAS,GACnC,KAAK,eAAe,OAAOA,CAAS,EAEtCryC,EAAI,CACL,EAAE+sC,CAAO,EACV,KAAK,eAAe,IAAIsF,CAAS,EAC1BA,CACX,CAiBE,aAAaA,EAAW,CACtB,OAAI,KAAK,eAAe,IAAIA,CAAS,IACnC,KAAK,eAAe,OAAOA,CAAS,EACpC7P,EAAS,aAAa6P,CAAS,GAE1BA,CACX,CAsBE,YAAYryC,EAAIsyC,EAAU,CACxBtyC,EAAKwsC,GAAM,KAAMxsC,CAAE,EACnB,KAAK,sBAAuB,EAC5B,MAAMuyC,EAAa/P,EAAS,YAAYxiC,EAAIsyC,CAAQ,EACpD,YAAK,gBAAgB,IAAIC,CAAU,EAC5BA,CACX,CAiBE,cAAcA,EAAY,CACxB,OAAI,KAAK,gBAAgB,IAAIA,CAAU,IACrC,KAAK,gBAAgB,OAAOA,CAAU,EACtC/P,EAAS,cAAc+P,CAAU,GAE5BA,CACX,CA2BE,sBAAsBvyC,EAAI,CACxB,KAAK,sBAAuB,EAI5B,IAAI2lB,EACJ,OAAA3lB,EAAKwsC,GAAM,KAAMxsC,CAAE,EACnB2lB,EAAK6c,EAAS,sBAAsB,IAAM,CACpC,KAAK,QAAQ,IAAI7c,CAAE,GACrB,KAAK,QAAQ,OAAOA,CAAE,EAExB3lB,EAAI,CACV,CAAK,EACD,KAAK,QAAQ,IAAI2lB,CAAE,EACZA,CACX,CAcE,2BAA2B1c,EAAMjJ,EAAI,CACnC,GAAI,KAAK,WAAW,IAAIiJ,CAAI,EAC1B,OAEF,KAAK,sBAAuB,EAC5BjJ,EAAKwsC,GAAM,KAAMxsC,CAAE,EACnB,MAAM2lB,EAAK,KAAK,sBAAsB,IAAM,CAC1C3lB,EAAI,EACA,KAAK,WAAW,IAAIiJ,CAAI,GAC1B,KAAK,WAAW,OAAOA,CAAI,CAEnC,CAAK,EACD,YAAK,WAAW,IAAIA,EAAM0c,CAAE,EACrB1c,CACX,CAQE,0BAA0BA,EAAM,CACzB,KAAK,WAAW,IAAIA,CAAI,IAG7B,KAAK,qBAAqB,KAAK,WAAW,IAAIA,CAAI,CAAC,EACnD,KAAK,WAAW,OAAOA,CAAI,EAC/B,CAkBE,qBAAqB0c,EAAI,CACvB,OAAI,KAAK,QAAQ,IAAIA,CAAE,IACrB,KAAK,QAAQ,OAAOA,CAAE,EACtB6c,EAAS,qBAAqB7c,CAAE,GAE3BA,CACX,CAYE,uBAAwB,CAClB,KAAK,2BAGT,KAAK,yBAA2B,GAChC,KAAK,IAAI,UAAW,IAAM,CACxB,CAAC,CAAC,aAAc,2BAA2B,EAAG,CAAC,UAAW,sBAAsB,EAAG,CAAC,iBAAkB,cAAc,EAAG,CAAC,kBAAmB,eAAe,CAAC,EAAE,QAAQ,CAAC,CAAC6sB,EAAQC,CAAU,IAAM,CAI7L,KAAKD,CAAM,EAAE,QAAQ,CAAC1nC,EAAKjH,IAAQ,KAAK4uC,CAAU,EAAE5uC,CAAG,CAAC,CAChE,CAAO,EACD,KAAK,yBAA2B,EACtC,CAAK,EACL,CAWE,eAAgB,CACd,MAAO,EAAQ,KAAK,IAAI,QAC5B,CAUE,qBAAsB,CACpB,OAAO,KAAK,IAAI,OAAS,CAAC,KAAK,IAAI,cAAc,gBAAgB,KACrE,CASE,eAAe+d,EAAI,CAEjB,OADgBA,GAAM,KAAK,KACZ,UAAY,GAAK,EAAE,KAAK,cAAe,GAAI,KAAK,sBACnE,CASE,0BAA0BA,EAAI,CAQ5B,SAAS8wB,EAAuB7pC,EAAS,CACvC,MAAM8pC,EAAenQ,EAAS,iBAAiB35B,EAAS,IAAI,EACtD+pC,EAAiBD,EAAa,iBAAiB,YAAY,EAGjE,OAFoBA,EAAa,iBAAiB,SAAS,IAEpC,QAAU,CADV,CAAC,SAAU,UAAU,EACK,SAASC,CAAc,CAC9E,CAeI,SAASC,EAAgBhqC,EAAS,CAIhC,MAHI,GAAC6pC,EAAuB7pC,EAAQ,aAAa,GAG7C,CAAC6pC,EAAuB7pC,CAAO,GAAKA,EAAQ,MAAM,UAAY,KAAO25B,EAAS,iBAAiB35B,CAAO,EAAE,SAAW,OAAS25B,EAAS,iBAAiB35B,CAAO,EAAE,QAAU,MAInL,CAcI,SAASiqC,EAAUjqC,EAAS,CAC1B,GAAIA,EAAQ,YAAcA,EAAQ,aAAeA,EAAQ,wBAAwB,OAASA,EAAQ,wBAAwB,QAAU,EAClI,MAAO,GAMT,MAAMkqC,EAAgB,CACpB,EAAGlqC,EAAQ,sBAAqB,EAAG,KAAOA,EAAQ,YAAc,EAChE,EAAGA,EAAQ,sBAAqB,EAAG,IAAMA,EAAQ,aAAe,CACjE,EAUD,GATIkqC,EAAc,EAAI,GAGlBA,EAAc,GAAKhR,EAAW,gBAAgB,aAAeS,EAAS,aAGtEuQ,EAAc,EAAI,GAGlBA,EAAc,GAAKhR,EAAW,gBAAgB,cAAgBS,EAAS,aACzE,MAAO,GAET,IAAIwQ,EAAiBjR,EAAW,iBAAiBgR,EAAc,EAAGA,EAAc,CAAC,EACjF,KAAOC,GAAgB,CACrB,GAAIA,IAAmBnqC,EACrB,MAAO,GAET,GAAImqC,EAAe,WACjBA,EAAiBA,EAAe,eAEhC,OAAO,EAEjB,CACA,CAQI,OALKpxB,IACHA,EAAK,KAAK,GAAI,GAIZ,GAAAkxB,EAAUlxB,CAAE,GAAKixB,EAAgBjxB,CAAE,IAAM,CAACA,EAAG,eAAiBA,EAAG,UAAY,GAIrF,CAqBE,OAAO,kBAAkB3Y,EAAMgqC,EAAqB,CAClD,GAAI,OAAOhqC,GAAS,UAAY,CAACA,EAC/B,MAAM,IAAI,MAAM,4BAA4BA,CAAI,gCAAgC,EAElF,MAAMgoC,EAAO1B,EAAY,aAAa,MAAM,EAGtC2D,EAASjC,GAAQA,EAAK,OAAOgC,CAAmB,EAChDE,EAAS5D,IAAgB0D,GAAuB1D,EAAY,UAAU,cAAc0D,EAAoB,SAAS,EACvH,GAAIC,GAAU,CAACC,EAAQ,CACrB,IAAIC,EACJ,MAAIF,EACFE,EAAS,qDAETA,EAAS,+BAEL,IAAI,MAAM,uBAAuBnqC,CAAI,MAAMmqC,CAAM,GAAG,CAChE,CACInqC,EAAOimC,GAAcjmC,CAAI,EACpBsmC,EAAY,cACfA,EAAY,YAAc,CAAE,GAE9B,MAAM8D,EAAS9D,EAAY,aAAa,QAAQ,EAChD,GAAItmC,IAAS,UAAYoqC,GAAUA,EAAO,QAAS,CACjD,MAAMC,EAAUD,EAAO,QACjBE,EAAc,OAAO,KAAKD,CAAO,EAMvC,GAAIA,GAAWC,EAAY,OAAS,GAAKA,EAAY,IAAIC,GAASF,EAAQE,CAAK,CAAC,EAAE,MAAM,OAAO,EAC7F,MAAM,IAAI,MAAM,kEAAkE,CAE1F,CACI,OAAAjE,EAAY,YAAYtmC,CAAI,EAAIgqC,EAChC1D,EAAY,YAAYP,GAAY/lC,CAAI,CAAC,EAAIgqC,EACtCA,CACX,CAWE,OAAO,aAAahqC,EAAM,CACxB,GAAI,GAACA,GAAQ,CAACsmC,EAAY,aAG1B,OAAOA,EAAY,YAAYtmC,CAAI,CACvC,CACA,CACAsmC,EAAY,kBAAkB,YAAaA,CAAW,EAuDtD,SAASkE,GAAW5F,EAAQjqC,EAAO8vC,EAAU,CAC3C,GAAI,OAAO9vC,GAAU,UAAYA,EAAQ,GAAKA,EAAQ8vC,EACpD,MAAM,IAAI,MAAM,sBAAsB7F,CAAM,0CAA0CjqC,CAAK,wCAAwC8vC,CAAQ,IAAI,CAEnJ,CA0BA,SAASC,GAAS9F,EAAQ+F,EAAYllB,EAAQmlB,EAAY,CACxD,OAAAJ,GAAW5F,EAAQgG,EAAYnlB,EAAO,OAAS,CAAC,EACzCA,EAAOmlB,CAAU,EAAED,CAAU,CACtC,CAWA,SAASE,GAAoBplB,EAAQ,CACnC,IAAIqlB,EACJ,OAAIrlB,IAAW,QAAaA,EAAO,SAAW,EAC5CqlB,EAAgB,CACd,OAAQ,EACR,OAAQ,CACN,MAAM,IAAI,MAAM,iCAAiC,CAClD,EACD,KAAM,CACJ,MAAM,IAAI,MAAM,iCAAiC,CACzD,CACK,EAEDA,EAAgB,CACd,OAAQrlB,EAAO,OACf,MAAOilB,GAAS,KAAK,KAAM,QAAS,EAAGjlB,CAAM,EAC7C,IAAKilB,GAAS,KAAK,KAAM,MAAO,EAAGjlB,CAAM,CAC1C,EAEC8T,EAAS,QAAUA,EAAS,OAAO,WACrCuR,EAAcvR,EAAS,OAAO,QAAQ,EAAI,KAAO9T,GAAU,CAAE,GAAE,OAAQ,GAElEqlB,CACT,CAgBA,SAASC,GAAmBltB,EAAOC,EAAK,CACtC,OAAI,MAAM,QAAQD,CAAK,EACdgtB,GAAoBhtB,CAAK,EACvBA,IAAU,QAAaC,IAAQ,OACjC+sB,GAAqB,EAEvBA,GAAoB,CAAC,CAAChtB,EAAOC,CAAG,CAAC,CAAC,CAC3C,CAiBA,MAAMktB,GAAwB,SAAUC,EAASC,EAAO,CACtDD,EAAUA,EAAU,EAAI,EAAIA,EAC5B,IAAIxtC,EAAI,KAAK,MAAMwtC,EAAU,EAAE,EAC3BztC,EAAI,KAAK,MAAMytC,EAAU,GAAK,EAAE,EAChC1tC,EAAI,KAAK,MAAM0tC,EAAU,IAAI,EACjC,MAAME,EAAK,KAAK,MAAMD,EAAQ,GAAK,EAAE,EAC/BE,EAAK,KAAK,MAAMF,EAAQ,IAAI,EAGlC,OAAI,MAAMD,CAAO,GAAKA,IAAY,OAGhC1tC,EAAIC,EAAIC,EAAI,KAIdF,EAAIA,EAAI,GAAK6tC,EAAK,EAAI7tC,EAAI,IAAM,GAIhCC,IAAMD,GAAK4tC,GAAM,KAAO3tC,EAAI,GAAK,IAAMA,EAAIA,GAAK,IAGhDC,EAAIA,EAAI,GAAK,IAAMA,EAAIA,EAChBF,EAAIC,EAAIC,CACjB,EAGA,IAAI4tC,GAAiBL,GAUrB,SAASM,GAAcC,EAAsB,CAC3CF,GAAiBE,CACnB,CAKA,SAASC,IAAkB,CACzBH,GAAiBL,EACnB,CAoBA,SAASS,GAAWR,EAASC,EAAQD,EAAS,CAC5C,OAAOI,GAAeJ,EAASC,CAAK,CACtC,CAEA,IAAIQ,GAAoB,OAAO,OAAO,CACpC,UAAW,KACX,iBAAkBX,GAClB,gBAAiBA,GACjB,cAAeO,GACf,gBAAiBE,GACjB,WAAYC,EACd,CAAC,EAqBD,SAASE,GAAgBC,EAAU5lB,EAAU,CAC3C,IAAI6lB,EAAmB,EACnBhuB,EACAC,EACJ,GAAI,CAACkI,EACH,MAAO,IAEL,CAAC4lB,GAAY,CAACA,EAAS,UACzBA,EAAWb,GAAmB,EAAG,CAAC,GAEpC,QAASzzC,EAAI,EAAGA,EAAIs0C,EAAS,OAAQt0C,IACnCumB,EAAQ+tB,EAAS,MAAMt0C,CAAC,EACxBwmB,EAAM8tB,EAAS,IAAIt0C,CAAC,EAGhBwmB,EAAMkI,IACRlI,EAAMkI,GAER6lB,GAAoB/tB,EAAMD,EAE5B,OAAOguB,EAAmB7lB,CAC5B,CAuBA,SAAS8lB,GAAW/xC,EAAO,CAGzB,GAAIA,aAAiB+xC,GACnB,OAAO/xC,EAEL,OAAOA,GAAU,SACnB,KAAK,KAAOA,EACH,OAAOA,GAAU,SAE1B,KAAK,QAAUA,EACN4qB,GAAS5qB,CAAK,IAGnB,OAAOA,EAAM,MAAS,WACxB,KAAK,KAAOA,EAAM,MAEpB,OAAO,OAAO,KAAMA,CAAK,GAEtB,KAAK,UACR,KAAK,QAAU+xC,GAAW,gBAAgB,KAAK,IAAI,GAAK,GAE5D,CAOAA,GAAW,UAAU,KAAO,EAQ5BA,GAAW,UAAU,QAAU,GAW/BA,GAAW,UAAU,OAAS,KAe9BA,GAAW,UAAU,SAAW,KAehCA,GAAW,WAAa,CAAC,mBAAoB,oBAAqB,oBAAqB,mBAAoB,8BAA+B,qBAAqB,EAQ/JA,GAAW,gBAAkB,CAC3B,EAAG,iCACH,EAAG,8DACH,EAAG,8HACH,EAAG,qHACH,EAAG,mEACL,EASAA,GAAW,iBAAmB,EAS9BA,GAAW,UAAU,iBAAmB,EASxCA,GAAW,kBAAoB,EAS/BA,GAAW,UAAU,kBAAoB,EASzCA,GAAW,kBAAoB,EAS/BA,GAAW,UAAU,kBAAoB,EASzCA,GAAW,iBAAmB,EAS9BA,GAAW,UAAU,iBAAmB,EASxCA,GAAW,4BAA8B,EASzCA,GAAW,UAAU,4BAA8B,EASnDA,GAAW,oBAAsB,EASjCA,GAAW,UAAU,oBAAsB,EAW3C,SAASC,GAAUhyC,EAAO,CACxB,OAA8BA,GAAU,MAAQ,OAAOA,EAAM,MAAS,UACxE,CAWA,SAASiyC,GAAejyC,EAAO,CACzBgyC,GAAUhyC,CAAK,GACjBA,EAAM,KAAK,KAAM,GAAK,CAAA,CAAE,CAE5B,CAsBA,MAAMkyC,GAAe,SAAU3qC,EAAO,CAgBpC,MAfY,CAAC,OAAQ,QAAS,WAAY,KAAM,kCAAmC,OAAQ,KAAK,EAAE,OAAO,CAAC4K,EAAKtK,EAAMtK,KAC/GgK,EAAMM,CAAI,IACZsK,EAAItK,CAAI,EAAIN,EAAMM,CAAI,GAEjBsK,GACN,CACD,KAAM5K,EAAM,MAAQ,MAAM,UAAU,IAAI,KAAKA,EAAM,KAAM,SAAU/C,EAAK,CACtE,MAAO,CACL,UAAWA,EAAI,UACf,QAASA,EAAI,QACb,KAAMA,EAAI,KACV,GAAIA,EAAI,EACT,CACF,CAAA,CACL,CAAG,CAEH,EAcM2tC,GAAmB,SAAUC,EAAM,CACvC,MAAMC,EAAWD,EAAK,GAAG,OAAO,EAC1BE,EAAY,MAAM,UAAU,IAAI,KAAKD,EAAUlsC,GAAKA,EAAE,KAAK,EAQjE,OAPe,MAAM,UAAU,IAAI,KAAKksC,EAAU,SAAUE,EAAS,CACnE,MAAMh2C,EAAO21C,GAAaK,EAAQ,KAAK,EACvC,OAAIA,EAAQ,MACVh2C,EAAK,IAAMg2C,EAAQ,KAEdh2C,CACX,CAAG,EACa,OAAO,MAAM,UAAU,OAAO,KAAK61C,EAAK,aAAc,SAAU7qC,EAAO,CACnF,OAAO+qC,EAAU,QAAQ/qC,CAAK,IAAM,EACxC,CAAG,EAAE,IAAI2qC,EAAY,CAAC,CACtB,EAaMM,GAAmB,SAAUj2C,EAAM61C,EAAM,CAC7C,OAAA71C,EAAK,QAAQ,SAAUgL,EAAO,CAC5B,MAAMkrC,EAAaL,EAAK,mBAAmB7qC,CAAK,EAAE,MAC9C,CAACA,EAAM,KAAOA,EAAM,MACtBA,EAAM,KAAK,QAAQ/C,GAAOiuC,EAAW,OAAOjuC,CAAG,CAAC,CAEtD,CAAG,EACM4tC,EAAK,WAAY,CAC1B,EACA,IAAIM,GAAqB,CACvB,iBAAAP,GACA,iBAAAK,GACA,aAAAN,EACF,EASA,MAAMS,GAAmB,mBAWzB,MAAMC,WAAoBrG,CAAY,CAqCpC,YAAYC,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,eAAiB+D,GAAK,KAAK,cAAcA,CAAC,EAC/C,KAAK,OAASA,GAAK,KAAK,MAAMA,CAAC,EAC/B,KAAK,QAAU,KAAK,eAAiB,KAAK,eAAiB,GAC3D,KAAK,UAAU,CAAC,KAAK,SAAS,WAAW,EACzC,KAAK,QAAQ,KAAK,SAAS,OAAO,EAKlC,KAAK,WAAa4gC,EAAS,MAAO,CAChC,UAAW,GAAGkP,EAAgB,UACpC,EAAO,CACD,KAAM,UACZ,CAAK,EACD,KAAK,QAAUlP,EAAS,IAAK,CAC3B,UAAW,GAAGkP,EAAgB,gCAC9B,GAAI,KAAK,GAAI,EAAC,aAAa,kBAAkB,CACnD,CAAK,EACDhP,GAAY,KAAK,QAAS,KAAK,YAAW,CAAE,EAC5C,KAAK,IAAI,YAAY,KAAK,OAAO,EACjC,KAAK,IAAI,YAAY,KAAK,UAAU,CACxC,CAQE,UAAW,CACT,OAAO,MAAM,SAAS,MAAO,CAC3B,UAAW,KAAK,cAAe,EAC/B,SAAU,EAChB,EAAO,CACD,mBAAoB,GAAG,KAAK,GAAE,CAAE,eAChC,cAAe,OACf,aAAc,KAAK,MAAO,EAC1B,KAAQ,SACR,YAAa,QACnB,CAAK,CACL,CACE,SAAU,CACR,KAAK,WAAa,KAClB,KAAK,QAAU,KACf,KAAK,oBAAsB,KAC3B,MAAM,QAAS,CACnB,CAQE,eAAgB,CACd,MAAO,GAAGgP,EAAgB,eAAe,MAAM,cAAe,CAAA,EAClE,CAQE,OAAQ,CACN,OAAO,KAAK,SAAS,KAAK,SAAS,OAAS,cAAc,CAC9D,CASE,aAAc,CACZ,IAAIE,EAAO,KAAK,SAAS,aAAe,KAAK,SAAS,yBAAyB,EAG/E,OAAI,KAAK,cACPA,GAAQ,IAAM,KAAK,SAAS,qFAAqF,GAE5GA,CACX,CAQE,MAAO,CACL,GAAI,KAAK,QAAS,CACZ,KAAK,SAAS,YAChB,KAAK,KAAM,EAEb,MACN,CACI,MAAMrG,EAAS,KAAK,OAAQ,EAQ5B,KAAK,QAAQ,iBAAiB,EAC9B,KAAK,QAAU,IAIX,KAAK,SAAS,YAAc,CAAC,KAAK,gBAAkB,CAAC,KAAK,iBAC5D,KAAK,KAAM,EAKb,KAAK,YAAc,CAACA,EAAO,OAAQ,EAC/B,KAAK,SAAS,aAAe,KAAK,aACpCA,EAAO,MAAO,EAEhB,KAAK,GAAG,UAAW,KAAK,cAAc,EAGtC,KAAK,aAAeA,EAAO,SAAU,EACrCA,EAAO,SAAS,EAAK,EACrB,KAAK,KAAM,EACX,KAAK,kBAAmB,EACxB,KAAK,GAAI,EAAC,aAAa,cAAe,OAAO,EAQ7C,KAAK,QAAQ,WAAW,EACxB,KAAK,eAAiB,EAC1B,CAWE,OAAOxsC,EAAO,CACZ,OAAI,OAAOA,GAAU,WACnB,KAAKA,EAAQ,OAAS,OAAO,EAAG,EAE3B,KAAK,OAChB,CASE,OAAQ,CACN,GAAI,CAAC,KAAK,QACR,OAEF,MAAMwsC,EAAS,KAAK,OAAQ,EAQ5B,KAAK,QAAQ,kBAAkB,EAC/B,KAAK,QAAU,GACX,KAAK,aAAe,KAAK,SAAS,aACpCA,EAAO,KAAM,EAEf,KAAK,IAAI,UAAW,KAAK,cAAc,EACnC,KAAK,cACPA,EAAO,SAAS,EAAI,EAEtB,KAAK,KAAM,EACX,KAAK,GAAI,EAAC,aAAa,cAAe,MAAM,EAU5C,KAAK,QAAQ,CACX,KAAM,aACN,QAAS,EACf,CAAK,EACD,KAAK,iBAAkB,EACnB,KAAK,SAAS,WAChB,KAAK,QAAS,CAEpB,CAWE,UAAUxsC,EAAO,CACf,GAAI,OAAOA,GAAU,UAAW,CAC9B,MAAM8yC,EAAY,KAAK,WAAa,CAAC,CAAC9yC,EACtC,IAAI+yC,EAAQ,KAAK,SAAS,aAAa,EAGvC,GAAID,GAAa,CAACC,EAAO,CAGvB,MAAMC,EAAO,KAAK,WAClB,KAAK,WAAa,KAAK,IACvBD,EAAQ,KAAK,SAAS,cAAe,CACnC,YAAa,oBACvB,CAAS,EACD,KAAK,WAAaC,EAClB,KAAK,GAAGD,EAAO,QAAS,KAAK,MAAM,CAC3C,CAGU,CAACD,GAAaC,IAChB,KAAK,IAAIA,EAAO,QAAS,KAAK,MAAM,EACpC,KAAK,YAAYA,CAAK,EACtBA,EAAM,QAAS,EAEvB,CACI,OAAO,KAAK,UAChB,CAME,MAAO,CACL,KAAK,SAAS,KAAK,SAAS,CAChC,CAYE,SAASrP,EAAS,CAChB,MAAMuP,EAAY,KAAK,UAAW,EAC5BC,EAAWD,EAAU,WACrBE,EAAgBF,EAAU,YAQhC,KAAK,QAAQ,iBAAiB,EAC9B,KAAK,eAAiB,GAItBC,EAAS,YAAYD,CAAS,EAC9B,KAAK,MAAO,EACZ/M,GAAc+M,EAAWvP,CAAO,EAOhC,KAAK,QAAQ,WAAW,EAGpByP,EACFD,EAAS,aAAaD,EAAWE,CAAa,EAE9CD,EAAS,YAAYD,CAAS,EAIhC,MAAMG,EAAc,KAAK,SAAS,aAAa,EAC3CA,GACFF,EAAS,YAAYE,EAAY,GAAG,CAE1C,CAQE,OAAQ,CAON,KAAK,QAAQ,kBAAkB,EAC/BpN,GAAQ,KAAK,WAAW,EAQxB,KAAK,QAAQ,YAAY,CAC7B,CAiBE,QAAQhmC,EAAO,CACb,OAAI,OAAOA,EAAU,MACnB,KAAK,SAAWA,GAEX,KAAK,QAChB,CAOE,mBAAoB,CAClB,MAAMqzC,EAAWtU,EAAW,cACtBuU,EAAW,KAAK,QAAQ,IAC9B,KAAK,oBAAsB,MACvBA,EAAS,SAASD,CAAQ,GAAKC,IAAaD,KAC9C,KAAK,oBAAsBA,EAC3B,KAAK,MAAO,EAElB,CAOE,kBAAmB,CACb,KAAK,sBACP,KAAK,oBAAoB,MAAO,EAChC,KAAK,oBAAsB,KAEjC,CAOE,cAAcnhC,EAAO,CAenB,GARA,KAAK,QAAQ,CACX,KAAM,eACN,cAAeA,EACf,OAAQ,KACR,QAAS,EACf,CAAK,EAEDA,EAAM,gBAAiB,EACnBA,EAAM,MAAQ,UAAY,KAAK,UAAS,EAAI,CAC9CA,EAAM,eAAgB,EACtB,KAAK,MAAO,EACZ,MACN,CAGI,GAAIA,EAAM,MAAQ,MAChB,OAEF,MAAMqhC,EAAe,KAAK,cAAe,EACnCF,EAAW,KAAK,IAAI,cAAc,QAAQ,EAChD,IAAIG,EACJ,QAASj2C,EAAI,EAAGA,EAAIg2C,EAAa,OAAQh2C,IACvC,GAAI81C,IAAaE,EAAah2C,CAAC,EAAG,CAChCi2C,EAAaj2C,EACb,KACR,CAEQwhC,EAAW,gBAAkB,KAAK,MACpCyU,EAAa,GAEXthC,EAAM,UAAYshC,IAAe,GACnCD,EAAaA,EAAa,OAAS,CAAC,EAAE,MAAO,EAC7CrhC,EAAM,eAAgB,GACb,CAACA,EAAM,UAAYshC,IAAeD,EAAa,OAAS,IACjEA,EAAa,CAAC,EAAE,MAAO,EACvBrhC,EAAM,eAAgB,EAE5B,CAOE,eAAgB,CACd,MAAMuhC,EAAc,KAAK,IAAI,iBAAiB,GAAG,EACjD,OAAO,MAAM,UAAU,OAAO,KAAKA,EAAajzB,IACtCA,aAAiBgf,EAAS,mBAAqBhf,aAAiBgf,EAAS,kBAAoBhf,EAAM,aAAa,MAAM,IAAMA,aAAiBgf,EAAS,kBAAoBhf,aAAiBgf,EAAS,mBAAqBhf,aAAiBgf,EAAS,qBAAuBhf,aAAiBgf,EAAS,oBAAsB,CAAChf,EAAM,aAAa,UAAU,GAAKA,aAAiBgf,EAAS,mBAAqBhf,aAAiBgf,EAAS,mBAAqBhf,aAAiBgf,EAAS,kBAAoBhf,EAAM,aAAa,UAAU,GAAKA,EAAM,aAAa,UAAU,IAAM,IAAMA,EAAM,aAAa,iBAAiB,CACjmB,CACL,CACA,CAQAoyB,GAAY,UAAU,SAAW,CAC/B,YAAa,GACb,UAAW,EACb,EACArG,EAAY,kBAAkB,cAAeqG,EAAW,EAcxD,MAAMc,WAAkBrJ,EAAc,CASpC,YAAYsJ,EAAS,GAAI,CACvB,MAAO,EACP,KAAK,QAAU,CAAE,EAQjB,OAAO,eAAe,KAAM,SAAU,CACpC,KAAM,CACJ,OAAO,KAAK,QAAQ,MAC5B,CACA,CAAK,EACD,QAASp2C,EAAI,EAAGA,EAAIo2C,EAAO,OAAQp2C,IACjC,KAAK,SAASo2C,EAAOp2C,CAAC,CAAC,CAE7B,CAUE,SAASgK,EAAO,CACd,MAAM3G,EAAQ,KAAK,QAAQ,OACrB,GAAKA,KAAS,MAClB,OAAO,eAAe,KAAMA,EAAO,CACjC,KAAM,CACJ,OAAO,KAAK,QAAQA,CAAK,CACnC,CACA,CAAO,EAIC,KAAK,QAAQ,QAAQ2G,CAAK,IAAM,KAClC,KAAK,QAAQ,KAAKA,CAAK,EASvB,KAAK,QAAQ,CACX,MAAAA,EACA,KAAM,WACN,OAAQ,IAChB,CAAO,GAWHA,EAAM,aAAe,IAAM,CACzB,KAAK,QAAQ,CACX,MAAAA,EACA,KAAM,cACN,OAAQ,IAChB,CAAO,CACF,EACGkjC,GAAUljC,CAAK,GACjBA,EAAM,iBAAiB,cAAeA,EAAM,YAAY,CAE9D,CAUE,YAAYqsC,EAAQ,CAClB,IAAIrsC,EACJ,QAAShK,EAAI,EAAGktB,EAAI,KAAK,OAAQltB,EAAIktB,EAAGltB,IACtC,GAAI,KAAKA,CAAC,IAAMq2C,EAAQ,CACtBrsC,EAAQ,KAAKhK,CAAC,EACVgK,EAAM,KACRA,EAAM,IAAK,EAEb,KAAK,QAAQ,OAAOhK,EAAG,CAAC,EACxB,KACR,CAESgK,GAYL,KAAK,QAAQ,CACX,MAAAA,EACA,KAAM,cACN,OAAQ,IACd,CAAK,CACL,CAUE,aAAaob,EAAI,CACf,IAAIjiB,EAAS,KACb,QAASnD,EAAI,EAAGktB,EAAI,KAAK,OAAQltB,EAAIktB,EAAGltB,IAAK,CAC3C,MAAMgK,EAAQ,KAAKhK,CAAC,EACpB,GAAIgK,EAAM,KAAOob,EAAI,CACnBjiB,EAAS6G,EACT,KACR,CACA,CACI,OAAO7G,CACX,CACA,CAeAgzC,GAAU,UAAU,eAAiB,CACnC,OAAQ,SACR,SAAU,WACV,YAAa,cACb,YAAa,aACf,EAGA,UAAWxhC,KAASwhC,GAAU,UAAU,eACtCA,GAAU,UAAU,KAAOxhC,CAAK,EAAI,KAqBtC,MAAM2hC,GAAkB,SAAU14B,EAAM5T,EAAO,CAC7C,QAAShK,EAAI,EAAGA,EAAI4d,EAAK,OAAQ5d,IAC3B,CAAC,OAAO,KAAK4d,EAAK5d,CAAC,CAAC,EAAE,QAAUgK,EAAM,KAAO4T,EAAK5d,CAAC,EAAE,KAIzD4d,EAAK5d,CAAC,EAAE,QAAU,GAEtB,EAQA,MAAMu2C,WAAuBJ,EAAU,CAOrC,YAAYC,EAAS,GAAI,CAGvB,QAASp2C,EAAIo2C,EAAO,OAAS,EAAGp2C,GAAK,EAAGA,IACtC,GAAIo2C,EAAOp2C,CAAC,EAAE,QAAS,CACrBs2C,GAAgBF,EAAQA,EAAOp2C,CAAC,CAAC,EACjC,KACR,CAEI,MAAMo2C,CAAM,EACZ,KAAK,UAAY,EACrB,CAUE,SAASpsC,EAAO,CACVA,EAAM,SACRssC,GAAgB,KAAMtsC,CAAK,EAE7B,MAAM,SAASA,CAAK,EAEfA,EAAM,mBAGXA,EAAM,eAAiB,IAAM,CAIvB,KAAK,YAGT,KAAK,UAAY,GACjBssC,GAAgB,KAAMtsC,CAAK,EAC3B,KAAK,UAAY,GACjB,KAAK,QAAQ,QAAQ,EACtB,EAMDA,EAAM,iBAAiB,gBAAiBA,EAAM,cAAc,EAChE,CACE,YAAYqsC,EAAQ,CAClB,MAAM,YAAYA,CAAM,EACpBA,EAAO,qBAAuBA,EAAO,iBACvCA,EAAO,oBAAoB,gBAAiBA,EAAO,cAAc,EACjEA,EAAO,eAAiB,KAE9B,CACA,CAmBA,MAAMG,GAAgB,SAAU54B,EAAM5T,EAAO,CAC3C,QAAShK,EAAI,EAAGA,EAAI4d,EAAK,OAAQ5d,IAC3B,CAAC,OAAO,KAAK4d,EAAK5d,CAAC,CAAC,EAAE,QAAUgK,EAAM,KAAO4T,EAAK5d,CAAC,EAAE,KAIzD4d,EAAK5d,CAAC,EAAE,SAAW,GAEvB,EAQA,MAAMy2C,WAAuBN,EAAU,CAOrC,YAAYC,EAAS,GAAI,CAGvB,QAASp2C,EAAIo2C,EAAO,OAAS,EAAGp2C,GAAK,EAAGA,IACtC,GAAIo2C,EAAOp2C,CAAC,EAAE,SAAU,CACtBw2C,GAAcJ,EAAQA,EAAOp2C,CAAC,CAAC,EAC/B,KACR,CAEI,MAAMo2C,CAAM,EACZ,KAAK,UAAY,GAMjB,OAAO,eAAe,KAAM,gBAAiB,CAC3C,KAAM,CACJ,QAASp2C,EAAI,EAAGA,EAAI,KAAK,OAAQA,IAC/B,GAAI,KAAKA,CAAC,EAAE,SACV,OAAOA,EAGX,MAAO,EACR,EACD,KAAM,CAAA,CACZ,CAAK,CACL,CAUE,SAASgK,EAAO,CACVA,EAAM,UACRwsC,GAAc,KAAMxsC,CAAK,EAE3B,MAAM,SAASA,CAAK,EAEfA,EAAM,mBAGXA,EAAM,gBAAkB,IAAM,CACxB,KAAK,YAGT,KAAK,UAAY,GACjBwsC,GAAc,KAAMxsC,CAAK,EACzB,KAAK,UAAY,GACjB,KAAK,QAAQ,QAAQ,EACtB,EAMDA,EAAM,iBAAiB,iBAAkBA,EAAM,eAAe,EAClE,CACE,YAAYqsC,EAAQ,CAClB,MAAM,YAAYA,CAAM,EACpBA,EAAO,qBAAuBA,EAAO,kBACvCA,EAAO,oBAAoB,iBAAkBA,EAAO,eAAe,EACnEA,EAAO,gBAAkB,KAE/B,CACA,CAcA,MAAMK,WAAsBP,EAAU,CASpC,SAASnsC,EAAO,CACd,MAAM,SAASA,CAAK,EACf,KAAK,eACR,KAAK,aAAe,IAAM,KAAK,aAAa,QAAQ,GAEjD,KAAK,gCACR,KAAK,+BAAiC,IAAM,KAAK,QAAQ,wBAAwB,GAOnFA,EAAM,iBAAiB,aAAc,KAAK,YAAY,EACrB,CAAC,WAAY,UAAU,EAC3B,QAAQA,EAAM,IAAI,IAAM,IACnDA,EAAM,iBAAiB,aAAc,KAAK,8BAA8B,CAE9E,CACE,YAAYqsC,EAAQ,CAClB,MAAM,YAAYA,CAAM,EAGpBA,EAAO,sBACL,KAAK,cACPA,EAAO,oBAAoB,aAAc,KAAK,YAAY,EAExD,KAAK,yBACPA,EAAO,oBAAoB,aAAc,KAAK,8BAA8B,EAGpF,CACA,CASA,MAAMM,EAAqB,CAOzB,YAAYC,EAAgB,GAAI,CAC9B,KAAK,eAAiB,CAAE,EAQxB,OAAO,eAAe,KAAM,SAAU,CACpC,KAAM,CACJ,OAAO,KAAK,eAAe,MACnC,CACA,CAAK,EACD,QAAS52C,EAAI,EAAGqT,EAASujC,EAAc,OAAQ52C,EAAIqT,EAAQrT,IACzD,KAAK,iBAAiB42C,EAAc52C,CAAC,CAAC,CAE5C,CAUE,iBAAiB62C,EAAc,CAC7B,MAAMxzC,EAAQ,KAAK,eAAe,OAC5B,GAAKA,KAAS,MAClB,OAAO,eAAe,KAAMA,EAAO,CACjC,KAAM,CACJ,OAAO,KAAK,eAAeA,CAAK,CAC1C,CACA,CAAO,EAIC,KAAK,eAAe,QAAQwzC,CAAY,IAAM,IAChD,KAAK,eAAe,KAAKA,CAAY,CAE3C,CAcE,wBAAwB7sC,EAAO,CAC7B,IAAI8sC,EACJ,QAAS92C,EAAI,EAAGqT,EAAS,KAAK,eAAe,OAAQrT,EAAIqT,EAAQrT,IAC/D,GAAIgK,IAAU,KAAK,eAAehK,CAAC,EAAE,MAAO,CAC1C82C,EAAgB,KAAK,eAAe92C,CAAC,EACrC,KACR,CAEI,OAAO82C,CACX,CAUE,oBAAoBD,EAAc,CAChC,QAAS72C,EAAI,EAAGqT,EAAS,KAAK,eAAe,OAAQrT,EAAIqT,EAAQrT,IAC/D,GAAI62C,IAAiB,KAAK,eAAe72C,CAAC,EAAG,CACvC,KAAK,eAAeA,CAAC,EAAE,OAAS,OAAO,KAAK,eAAeA,CAAC,EAAE,MAAM,KAAQ,YAC9E,KAAK,eAAeA,CAAC,EAAE,MAAM,IAAK,EAEhC,OAAO,KAAK,eAAeA,CAAC,EAAE,KAAQ,YACxC,KAAK,eAAeA,CAAC,EAAE,IAAK,EAE9B,KAAK,eAAe,OAAOA,EAAG,CAAC,EAC/B,KACR,CAEA,CACA,CA6BA,MAAM+2C,EAAiB,CAOrB,YAAY1pC,EAAM,CAChB0pC,GAAiB,UAAU,SAAS,KAAK,KAAM1pC,CAAI,EAQnD,OAAO,eAAe,KAAM,SAAU,CACpC,KAAM,CACJ,OAAO,KAAK,OACpB,CACA,CAAK,CACL,CAWE,SAASA,EAAM,CACb,MAAM2pC,EAAY,KAAK,QAAU,EACjC,IAAIh3C,EAAI,EACR,MAAMktB,EAAI7f,EAAK,OACf,KAAK,MAAQA,EACb,KAAK,QAAUA,EAAK,OACpB,MAAM4pC,EAAa,SAAU5zC,EAAO,CAC5B,GAAKA,KAAS,MAClB,OAAO,eAAe,KAAM,GAAKA,EAAO,CACtC,KAAM,CACJ,OAAO,KAAK,MAAMA,CAAK,CACnC,CACA,CAAS,CAEJ,EACD,GAAI2zC,EAAY9pB,EAEd,IADAltB,EAAIg3C,EACGh3C,EAAIktB,EAAGltB,IACZi3C,EAAW,KAAK,KAAMj3C,CAAC,CAG/B,CAWE,WAAWolB,EAAI,CACb,IAAIjiB,EAAS,KACb,QAASnD,EAAI,EAAGktB,EAAI,KAAK,OAAQltB,EAAIktB,EAAGltB,IAAK,CAC3C,MAAMiH,EAAM,KAAKjH,CAAC,EAClB,GAAIiH,EAAI,KAAOme,EAAI,CACjBjiB,EAAS8D,EACT,KACR,CACA,CACI,OAAO9D,CACX,CACA,CAaA,MAAM+zC,GAAiB,CACrB,YAAa,cACb,SAAU,WACV,KAAM,OACN,KAAM,OACN,UAAW,YACX,WAAY,YACd,EASMC,GAAiB,CACrB,YAAe,cACf,aAAgB,eAChB,KAAQ,OACR,YAAa,YACb,YAAe,cACf,WAAc,YAChB,EASMC,GAAgB,CACpB,UAAW,YACX,SAAU,WACV,aAAc,eACd,SAAU,WACV,SAAU,UACZ,EASMC,GAAgB,CACpB,SAAU,WACV,OAAQ,SACR,QAAS,SACX,EAgBA,MAAMC,WAAcxK,EAAc,CAqBhC,YAAYvrC,EAAU,GAAI,CACxB,MAAO,EACP,MAAMg2C,EAAa,CACjB,GAAIh2C,EAAQ,IAAM,aAAeipC,GAAS,EAC1C,KAAMjpC,EAAQ,MAAQ,GACtB,SAAUA,EAAQ,UAAY,EAC/B,EACD,IAAI+vB,EAAQ/vB,EAAQ,OAAS,GA8B7B,UAAW+B,KAAOi0C,EAChB,OAAO,eAAe,KAAMj0C,EAAK,CAC/B,KAAM,CACJ,OAAOi0C,EAAWj0C,CAAG,CACtB,EACD,KAAM,CAAA,CACd,CAAO,EAWH,OAAO,eAAe,KAAM,QAAS,CACnC,KAAM,CACJ,OAAOguB,CACR,EACD,IAAIkmB,EAAU,CACRA,IAAalmB,IACfA,EAAQkmB,EAUR,KAAK,QAAQ,aAAa,EAEpC,CACA,CAAK,CACL,CACA,CAiBA,MAAMC,GAAW,SAAUnlC,EAAK,CAC9B,OAAO,IAAI,IAAIA,EAAKkvB,EAAW,OAAO,CACxC,EAYMkW,GAAiB,SAAUplC,EAAK,CACpC,OAAO,IAAI,IAAIA,EAAKkvB,EAAW,OAAO,EAAE,IAC1C,EAcMmW,GAAmB,SAAUnlC,EAAM,CACvC,GAAI,OAAOA,GAAS,SAAU,CAE5B,MAAMN,EADc,yEACU,KAAKM,CAAI,EACvC,GAAIN,EACF,OAAOA,EAAU,IAAK,EAAC,YAAa,CAE1C,CACE,MAAO,EACT,EAeM0lC,GAAgB,SAAUtlC,EAAKulC,EAAS5V,EAAS,SAAU,CAC/D,OAAOwV,GAASnlC,CAAG,EAAE,SAAWulC,EAAO,MACzC,EAEA,IAAIC,GAAmB,OAAO,OAAO,CACnC,UAAW,KACX,SAAUL,GACV,eAAgBC,GAChB,iBAAkBC,GAClB,cAAeC,EACjB,CAAC,EAmBD,MAAMG,GAAY,SAAUC,EAAYhuC,EAAO,CAC7C,MAAM2yB,EAAS,IAAIsF,EAAS,OAAO,OAAOA,EAAUA,EAAS,MAAOA,EAAS,OAAO,cAAa,CAAE,EAC7FjU,EAAS,CAAE,EACjB2O,EAAO,MAAQ,SAAU11B,EAAK,CAC5B+C,EAAM,OAAO/C,CAAG,CACjB,EACD01B,EAAO,eAAiB,SAAU19B,EAAO,CACvC+uB,EAAO,KAAK/uB,CAAK,CAClB,EACD09B,EAAO,QAAU,UAAY,CAC3B3yB,EAAM,QAAQ,CACZ,KAAM,aACN,OAAQA,CACd,CAAK,CACF,EACD2yB,EAAO,MAAMqb,CAAU,EACnBhqB,EAAO,OAAS,IACdiU,EAAS,SAAWA,EAAS,QAAQ,gBACvCA,EAAS,QAAQ,eAAe,iCAAiCj4B,EAAM,GAAG,EAAE,EAE9EgkB,EAAO,QAAQ/uB,GAAS8jC,EAAM,MAAM9jC,CAAK,CAAC,EACtCgjC,EAAS,SAAWA,EAAS,QAAQ,UACvCA,EAAS,QAAQ,SAAU,GAG/BtF,EAAO,MAAO,CAChB,EAaMsb,GAAY,SAAUl5B,EAAK/U,EAAO,CACtC,MAAM8H,EAAO,CACX,IAAKiN,CACN,EACKm5B,EAAcN,GAAc74B,CAAG,EACjCm5B,IACFpmC,EAAK,KAAOomC,GAEd,MAAMC,EAAkBnuC,EAAM,MAAM,YAAa,IAAK,kBAClDmuC,IACFrmC,EAAK,gBAAkBqmC,GAEzBC,GAAItmC,EAAMm6B,GAAM,KAAM,SAAU/sC,EAAK+C,EAAUC,EAAc,CAC3D,GAAIhD,EACF,OAAO6jC,EAAM,MAAM7jC,EAAK+C,CAAQ,EAElC+H,EAAM,QAAU,GAIZ,OAAOi4B,EAAS,QAAW,WACzBj4B,EAAM,OAGRA,EAAM,MAAM,IAAI,CAAC,cAAe,YAAY,EAAG2K,GAAS,CACtD,GAAIA,EAAM,OAAS,aAAc,CAC/BouB,EAAM,MAAM,oDAAoD/4B,EAAM,GAAG,EAAE,EAC3E,MACZ,CACU,OAAO+tC,GAAU71C,EAAc8H,CAAK,CAC9C,CAAS,EAGH+tC,GAAU71C,EAAc8H,CAAK,CAEnC,CAAG,CAAC,CACJ,EAQA,MAAMquC,WAAkBf,EAAM,CAmC5B,YAAY/1C,EAAU,GAAI,CACxB,GAAI,CAACA,EAAQ,KACX,MAAM,IAAI,MAAM,0BAA0B,EAE5C,MAAMgG,EAAWg8B,GAAQhiC,EAAS,CAChC,KAAM61C,GAAc71C,EAAQ,IAAI,GAAK,YACrC,SAAUA,EAAQ,UAAYA,EAAQ,SAAW,EACvD,CAAK,EACD,IAAI+2C,EAAOjB,GAAc9vC,EAAS,IAAI,GAAK,WAC3C,MAAMgxC,EAAWhxC,EAAS,SACtBA,EAAS,OAAS,YAAcA,EAAS,OAAS,cACpD+wC,EAAO,UAET,MAAM/wC,CAAQ,EACd,KAAK,MAAQA,EAAS,KACtB,KAAK,MAAQ,CAAE,EACf,KAAK,YAAc,CAAE,EACrB,KAAK,SAAW,KAAK,MAAM,oBAAsB,GACjD,MAAM8F,EAAO,IAAI0pC,GAAiB,KAAK,KAAK,EACtCyB,EAAa,IAAIzB,GAAiB,KAAK,WAAW,EACxD,IAAI0B,EAAU,GACd,KAAK,kBAAoBxM,GAAM,KAAM,SAAUt3B,EAAQ,CAAA,EAAI,CACzD,GAAI,MAAK,MAAM,aAGf,IAAI,CAAC,KAAK,MAAM,SAAU,CACpBA,EAAM,OAAS,eACjB,KAAK,KAAO,KAAK,MAAM,0BAA0B,KAAK,iBAAiB,GAEzE,MACR,CAMM,KAAK,WAAa,KAAK,WACnB8jC,IACF,KAAK,QAAQ,WAAW,EACxBA,EAAU,IAER9jC,EAAM,OAAS,eACjB,KAAK,KAAO,KAAK,MAAM,0BAA0B,KAAK,iBAAiB,GAE/E,CAAK,EACD,MAAM+jC,EAAiB,IAAM,CAC3B,KAAK,aAAc,CACpB,EACD,KAAK,MAAM,IAAI,UAAWA,CAAc,EACpCJ,IAAS,YACX,KAAK,cAAe,EAEtB,OAAO,iBAAiB,KAAM,CAU5B,QAAS,CACP,KAAM,CACJ,OAAOC,CACR,EACD,KAAM,CAAA,CACP,EAUD,KAAM,CACJ,KAAM,CACJ,OAAOD,CACR,EACD,IAAIK,EAAS,CACNtB,GAAcsB,CAAO,GAGtBL,IAASK,IAGbL,EAAOK,EACH,CAAC,KAAK,UAAYL,IAAS,YAAc,KAAK,KAAK,SAAW,GAEhEL,GAAU,KAAK,IAAK,IAAI,EAE1B,KAAK,aAAc,EACfK,IAAS,YACX,KAAK,cAAe,EAWtB,KAAK,QAAQ,YAAY,EACnC,CACO,EAOD,KAAM,CACJ,KAAM,CACJ,OAAK,KAAK,QAGHjrC,EAFE,IAGV,EACD,KAAM,CAAA,CACP,EAOD,WAAY,CACV,KAAM,CACJ,GAAI,CAAC,KAAK,QACR,OAAO,KAIT,GAAI,KAAK,KAAK,SAAW,EACvB,OAAOmrC,EAET,MAAMI,EAAK,KAAK,MAAM,YAAa,EAC7BC,EAAS,CAAE,EACjB,QAAS74C,EAAI,EAAGktB,EAAI,KAAK,KAAK,OAAQltB,EAAIktB,EAAGltB,IAAK,CAChD,MAAMiH,EAAM,KAAK,KAAKjH,CAAC,EACnBiH,EAAI,WAAa2xC,GAAM3xC,EAAI,SAAW2xC,GACxCC,EAAO,KAAK5xC,CAAG,CAE7B,CAEU,GADAwxC,EAAU,GACNI,EAAO,SAAW,KAAK,YAAY,OACrCJ,EAAU,OAEV,SAASz4C,EAAI,EAAGA,EAAI64C,EAAO,OAAQ74C,IAC7B,KAAK,YAAY,QAAQ64C,EAAO74C,CAAC,CAAC,IAAM,KAC1Cy4C,EAAU,IAIhB,YAAK,YAAcI,EACnBL,EAAW,SAAS,KAAK,WAAW,EAC7BA,CACR,EAED,KAAM,CAAA,CACd,CACA,CAAK,EACGjxC,EAAS,KACX,KAAK,IAAMA,EAAS,IACf,KAAK,WAGR,KAAK,QAAU,KAEb,KAAK,UAAYA,EAAS,OAAS,aAAeA,EAAS,OAAS,aACtE0wC,GAAU,KAAK,IAAK,IAAI,GAG1B,KAAK,QAAU,EAErB,CACE,eAAgB,CAEd,KAAK,KAAO,KAAK,MAAM,0BAA0B,KAAK,iBAAiB,EAEvE,KAAK,MAAM,GAAG,aAAc,KAAK,iBAAiB,CACtD,CACE,cAAe,CACT,KAAK,OACP,KAAK,MAAM,yBAAyB,KAAK,IAAI,EAC7C,KAAK,KAAO,QAEd,KAAK,MAAM,IAAI,aAAc,KAAK,iBAAiB,CACvD,CAQE,OAAOa,EAAa,CAClB,IAAI7xC,EAAM6xC,EAGV,GAAI,EAAE,iBAAkB7xC,GAAM,CAC5BA,EAAM,IAAIg7B,EAAS,MAAM,OAAO6W,EAAY,UAAWA,EAAY,QAASA,EAAY,IAAI,EAC5F,UAAWxuC,KAAQwuC,EACXxuC,KAAQrD,IACZA,EAAIqD,CAAI,EAAIwuC,EAAYxuC,CAAI,GAKhCrD,EAAI,GAAK6xC,EAAY,GACrB7xC,EAAI,aAAe6xC,CACzB,CACI,MAAM1C,EAAS,KAAK,MAAM,WAAY,EACtC,QAASp2C,EAAI,EAAGA,EAAIo2C,EAAO,OAAQp2C,IAC7Bo2C,EAAOp2C,CAAC,IAAM,MAChBo2C,EAAOp2C,CAAC,EAAE,UAAUiH,CAAG,EAG3B,KAAK,MAAM,KAAKA,CAAG,EACnB,KAAK,KAAK,SAAS,KAAK,KAAK,CACjC,CAQE,UAAU8xC,EAAW,CACnB,IAAI/4C,EAAI,KAAK,MAAM,OACnB,KAAOA,KAAK,CACV,MAAMiH,EAAM,KAAK,MAAMjH,CAAC,EACxB,GAAIiH,IAAQ8xC,GAAa9xC,EAAI,cAAgBA,EAAI,eAAiB8xC,EAAW,CAC3E,KAAK,MAAM,OAAO/4C,EAAG,CAAC,EACtB,KAAK,KAAK,SAAS,KAAK,KAAK,EAC7B,KACR,CACA,CACA,CACA,CAOAq4C,GAAU,UAAU,eAAiB,CACnC,UAAW,WACb,EASA,MAAMW,WAAmB1B,EAAM,CAuB7B,YAAY/1C,EAAU,GAAI,CACxB,MAAMgG,EAAWg8B,GAAQhiC,EAAS,CAChC,KAAM41C,GAAe51C,EAAQ,IAAI,GAAK,EAC5C,CAAK,EACD,MAAMgG,CAAQ,EACd,IAAI0xC,EAAU,GAWd,OAAO,eAAe,KAAM,UAAW,CACrC,KAAM,CACJ,OAAOA,CACR,EACD,IAAIC,EAAY,CAEV,OAAOA,GAAe,WAAaA,IAAeD,IAGtDA,EAAUC,EAYV,KAAK,QAAQ,eAAe,EACpC,CACA,CAAK,EAKG3xC,EAAS,UACX,KAAK,QAAUA,EAAS,SAE1B,KAAK,QAAU,EACnB,CACA,CAQA,MAAM4xC,WAAmB7B,EAAM,CAsB7B,YAAY/1C,EAAU,GAAI,CACxB,MAAMgG,EAAWg8B,GAAQhiC,EAAS,CAChC,KAAM21C,GAAe31C,EAAQ,IAAI,GAAK,EAC5C,CAAK,EACD,MAAMgG,CAAQ,EACd,IAAI6xC,EAAW,GAWf,OAAO,eAAe,KAAM,WAAY,CACtC,KAAM,CACJ,OAAOA,CACR,EACD,IAAIC,EAAa,CAEX,OAAOA,GAAgB,WAAaA,IAAgBD,IAGxDA,EAAWC,EAYX,KAAK,QAAQ,gBAAgB,EACrC,CACA,CAAK,EAKG9xC,EAAS,WACX,KAAK,SAAWA,EAAS,SAE/B,CACA,CAcA,MAAM+xC,WAAyBxM,EAAc,CAmC3C,YAAYvrC,EAAU,GAAI,CACxB,MAAO,EACP,IAAIg4C,EACJ,MAAMvvC,EAAQ,IAAIquC,GAAU92C,CAAO,EACnC,KAAK,KAAOyI,EAAM,KAClB,KAAK,IAAMA,EAAM,IACjB,KAAK,QAAUA,EAAM,SACrB,KAAK,MAAQA,EAAM,MACnB,KAAK,QAAUA,EAAM,QACrB,OAAO,iBAAiB,KAAM,CAO5B,WAAY,CACV,KAAM,CACJ,OAAOuvC,CACjB,CACO,EAQD,MAAO,CACL,KAAM,CACJ,OAAOvvC,CACjB,CACA,CACA,CAAK,EACDuvC,EAAaD,GAAiB,KAM9BtvC,EAAM,iBAAiB,aAAc,IAAM,CACzCuvC,EAAaD,GAAiB,OAC9B,KAAK,QAAQ,CACX,KAAM,OACN,OAAQ,IAChB,CAAO,CACP,CAAK,CACL,CACA,CAKAA,GAAiB,UAAU,eAAiB,CAC1C,KAAM,MACR,EAQAA,GAAiB,KAAO,EAQxBA,GAAiB,QAAU,EAQ3BA,GAAiB,OAAS,EAQ1BA,GAAiB,MAAQ,EAOzB,MAAME,GAAS,CACb,MAAO,CACL,UAAWjD,GACX,WAAYyC,GACZ,YAAa,OACd,EACD,MAAO,CACL,UAAWvC,GACX,WAAY0C,GACZ,YAAa,OACd,EACD,KAAM,CACJ,UAAWzC,GACX,WAAY2B,GACZ,YAAa,MACjB,CACA,EACA,OAAO,KAAKmB,EAAM,EAAE,QAAQ,SAAUh5C,EAAM,CAC1Cg5C,GAAOh5C,CAAI,EAAE,WAAa,GAAGA,CAAI,SACjCg5C,GAAOh5C,CAAI,EAAE,YAAc,GAAGA,CAAI,SACpC,CAAC,EACD,MAAMi5C,GAAS,CACb,WAAY,CACV,UAAW/C,GACX,WAAY2B,GACZ,YAAa,aACb,WAAY,mBACZ,YAAa,mBACd,EACD,aAAc,CACZ,UAAW1B,GACX,WAAY2C,GACZ,YAAa,qBACb,WAAY,qBACZ,YAAa,qBACjB,CACA,EACMI,GAAM,OAAO,OAAO,CAAA,EAAIF,GAAQC,EAAM,EAC5CA,GAAO,MAAQ,OAAO,KAAKA,EAAM,EACjCD,GAAO,MAAQ,OAAO,KAAKA,EAAM,EACjCE,GAAI,MAAQ,CAAE,EAAC,OAAOD,GAAO,KAAK,EAAE,OAAOD,GAAO,KAAK,EA8CvD,SAASG,GAAkB/rC,EAAMgsC,EAAMtoB,EAAOoC,EAAUnyB,EAAU,GAAI,CACpE,MAAM60C,EAASxoC,EAAK,WAAY,EAChCrM,EAAQ,KAAOq4C,EACXtoB,IACF/vB,EAAQ,MAAQ+vB,GAEdoC,IACFnyB,EAAQ,SAAWmyB,GAErBnyB,EAAQ,KAAOqM,EACf,MAAM5D,EAAQ,IAAI0vC,GAAI,KAAK,WAAWn4C,CAAO,EAC7C,OAAA60C,EAAO,SAASpsC,CAAK,EACdA,CACT,CAQA,MAAM0mC,UAAa1B,CAAY,CAU7B,YAAYztC,EAAU,CAAA,EAAI2tC,EAAQ,UAAY,CAAA,EAAI,CAGhD3tC,EAAQ,oBAAsB,GAC9B,MAAM,KAAMA,EAAS2tC,CAAK,EAC1B,KAAK,kBAAoB5pC,GAAK,KAAK,iBAAiBA,CAAC,EACrD,KAAK,eAAiBA,GAAK,KAAK,cAAcA,CAAC,EAC/C,KAAK,kBAAoBA,GAAK,KAAK,iBAAiBA,CAAC,EACrD,KAAK,yBAA2BA,GAAK,KAAK,wBAAwBA,CAAC,EACnE,KAAK,sBAAwBA,GAAK,KAAK,qBAAqBA,CAAC,EAC7D,KAAK,eAAiB,IAAI,IAI1B,KAAK,YAAc,GACnB,KAAK,GAAG,UAAW,UAAY,CAC7B,KAAK,YAAc,EACzB,CAAK,EACD,KAAK,GAAG,YAAa,UAAY,CAC/B,KAAK,YAAc,EACzB,CAAK,EACDo0C,GAAI,MAAM,QAAQhxC,GAAQ,CACxB,MAAMmxC,EAAQH,GAAIhxC,CAAI,EAClBnH,GAAWA,EAAQs4C,EAAM,UAAU,IACrC,KAAKA,EAAM,WAAW,EAAIt4C,EAAQs4C,EAAM,UAAU,EAE1D,CAAK,EAGI,KAAK,wBACR,KAAK,iBAAkB,EAIpB,KAAK,0BACR,KAAK,oBAAqB,EAE5B,CAAC,OAAQ,QAAS,OAAO,EAAE,QAAQ7vC,GAAS,CACtCzI,EAAQ,SAASyI,CAAK,QAAQ,IAAM,KACtC,KAAK,iBAAiBA,CAAK,QAAQ,EAAI,GAE/C,CAAK,EACGzI,EAAQ,iBAAmB,IAASA,EAAQ,mBAAqB,GACnE,KAAK,yBAA2B,IACvBA,EAAQ,iBAAmB,IAAQA,EAAQ,mBAAqB,MACzE,KAAK,yBAA2B,IAE7B,KAAK,0BACR,KAAK,kBAAmB,EAE1B,KAAK,kBAAoBA,EAAQ,oBAAsB,GACvD,KAAK,sBAAwB,IAAIm4C,GAAI,KAAK,UAC1C,KAAK,mBAAoB,EAGpBn4C,EAAQ,wBACX,KAAK,cAAe,EAElB,KAAK,cACP,KAAK,MAAQ,KAAK,YAAY,MAAQ,eAE5C,CASE,iBAAiBwd,EAAK,CACf,KAAK,UAGR,KAAK,IAAI,QAAS,IAAM,KAAK,WAAW,IAAM,KAAK,iBAAiBA,CAAG,EAAG,CAAC,CAAC,EAW9E,KAAK,QAAQ,CACX,IAAAA,EACA,KAAM,WACZ,CAAK,CACL,CAUE,kBAAmB,CACjB,KAAK,GAAG,iBAAkB,KAAK,iBAAiB,EAChD,KAAK,eAAiB,GAGtB,KAAK,IAAI,QAAS,KAAK,cAAc,CACzC,CAME,mBAAoB,CAClB,KAAK,eAAiB,GACtB,KAAK,qBAAsB,EAC3B,KAAK,IAAI,iBAAkB,KAAK,iBAAiB,CACrD,CAeE,cAAcpK,EAAO,CACnB,KAAK,qBAAsB,EAC3B,KAAK,iBAAmB,KAAK,YAAYs3B,GAAM,KAAM,UAAY,CAG/D,MAAM6N,EAAqB,KAAK,gBAAiB,EAC7C,KAAK,mBAAqBA,GAO5B,KAAK,QAAQ,UAAU,EAEzB,KAAK,iBAAmBA,EACpBA,IAAuB,GACzB,KAAK,qBAAsB,CAE9B,CAAA,EAAG,GAAG,CACX,CAWE,iBAAiBnlC,EAAO,CACtB,KAAK,UAAY,KAAK,SAAU,CACpC,CAQE,UAAW,CACT,OAAO8+B,GAAmB,EAAG,CAAC,CAClC,CAUE,iBAAkB,CAChB,OAAOY,GAAgB,KAAK,SAAQ,EAAI,KAAK,SAAS,CAC1D,CAQE,sBAAuB,CACrB,KAAK,cAAc,KAAK,gBAAgB,CAC5C,CAOE,qBAAsB,CACpB,KAAK,kBAAoB,GACzB,KAAK,GAAG,OAAQ,KAAK,iBAAiB,EACtC,KAAK,GAAG,QAAS,KAAK,wBAAwB,CAClD,CAME,sBAAuB,CACrB,KAAK,kBAAoB,GACzB,KAAK,wBAAyB,EAC9B,KAAK,IAAI,OAAQ,KAAK,iBAAiB,EACvC,KAAK,IAAI,QAAS,KAAK,wBAAwB,CACnD,CASE,kBAAmB,CACb,KAAK,qBACP,KAAK,wBAAyB,EAEhC,KAAK,oBAAsB,KAAK,YAAY,UAAY,CAOtD,KAAK,QAAQ,CACX,KAAM,aACN,OAAQ,KACR,kBAAmB,EAC3B,CAAO,CAGF,EAAE,GAAG,CACV,CAQE,yBAA0B,CACxB,KAAK,cAAc,KAAK,mBAAmB,EAI3C,KAAK,QAAQ,CACX,KAAM,aACN,OAAQ,KACR,kBAAmB,EACzB,CAAK,CACL,CAQE,SAAU,CAER,KAAK,YAAYmF,GAAO,KAAK,EAGzB,KAAK,gBACP,KAAK,kBAAmB,EAEtB,KAAK,mBACP,KAAK,qBAAsB,EAE7B,MAAM,QAAS,CACnB,CAYE,YAAY7Z,EAAO,CACjBA,EAAQ,CAAA,EAAG,OAAOA,CAAK,EAEvBA,EAAM,QAAQn/B,GAAQ,CACpB,MAAMod,EAAO,KAAK,GAAGpd,CAAI,QAAQ,EAAC,GAAM,CAAE,EAC1C,IAAIR,EAAI4d,EAAK,OACb,KAAO5d,KAAK,CACV,MAAMgK,EAAQ4T,EAAK5d,CAAC,EAChBQ,IAAS,QACX,KAAK,sBAAsBwJ,CAAK,EAElC4T,EAAK,YAAY5T,CAAK,CAC9B,CACA,CAAK,CACL,CAME,uBAAwB,CACtB,MAAM4T,EAAO,KAAK,uBAAyB,CAAE,EAC7C,IAAI5d,EAAI4d,EAAK,OACb,KAAO5d,KAAK,CACV,MAAMgK,EAAQ4T,EAAK5d,CAAC,EACpB,KAAK,sBAAsBgK,CAAK,CACtC,CACA,CAOE,OAAQ,CAAA,CASR,aAAc,CAAA,CAUd,gBAAiB,CAAA,CAWjB,MAAM9K,EAAK,CACT,OAAIA,IAAQ,SACV,KAAK,OAAS,IAAIs1C,GAAWt1C,CAAG,EAChC,KAAK,QAAQ,OAAO,GAEf,KAAK,MAChB,CAYE,QAAS,CACP,OAAI,KAAK,YACAu0C,GAAmB,EAAG,CAAC,EAEzBA,GAAoB,CAC/B,CASE,MAAO,CAAA,CAYP,aAAasG,EAAc,CAAA,CAS3B,WAAY,CAAA,CAUZ,eAAeC,EAAU,CAEnB,KAAK,mBAOP,KAAK,QAAQ,CACX,KAAM,aACN,OAAQ,KACR,kBAAmB,EAC3B,CAAO,CAEP,CAYE,oBAAqB,CAqBnBR,GAAO,MAAM,QAAQ9wC,GAAQ,CAC3B,MAAMmxC,EAAQL,GAAO9wC,CAAI,EACnBuxC,EAAmB,IAAM,CAC7B,KAAK,QAAQ,GAAGvxC,CAAI,aAAa,CAClC,EACK0tC,EAAS,KAAKyD,EAAM,UAAU,EAAG,EACvCzD,EAAO,iBAAiB,cAAe6D,CAAgB,EACvD7D,EAAO,iBAAiB,WAAY6D,CAAgB,EACpD,KAAK,GAAG,UAAW,IAAM,CACvB7D,EAAO,oBAAoB,cAAe6D,CAAgB,EAC1D7D,EAAO,oBAAoB,WAAY6D,CAAgB,CAC/D,CAAO,CACP,CAAK,CACL,CAQE,kBAAmB,CACjB,GAAIhY,CAAAA,EAAS,OAOb,GAAIT,EAAW,KAAK,SAAS,KAAK,GAAI,CAAA,EAAG,CAIvC,GAAI,CAAC,KAAK,SAAS,QAAQ,GAAK8B,GAAQ70B,EAAG,GAAK,OAAO,KAAKA,EAAG,EAAE,OAAS,EAAG,CAC3E,KAAK,QAAQ,aAAa,EAC1B,MACR,CAIM,MAAMyrC,EAAS1Y,EAAW,cAAc,QAAQ,EAChD0Y,EAAO,IAAM,KAAK,SAAS,QAAQ,GAAK,iDACxCA,EAAO,OAAS,IAAM,CAOpB,KAAK,QAAQ,aAAa,CAC3B,EACDA,EAAO,QAAU,IAAM,CAOrB,KAAK,QAAQ,YAAY,CAC1B,EACD,KAAK,GAAG,UAAW,IAAM,CACvBA,EAAO,OAAS,KAChBA,EAAO,QAAU,IACzB,CAAO,EAGDjY,EAAS,OAAS,GAClB,KAAK,GAAI,EAAC,WAAW,YAAYiY,CAAM,CAC7C,MACM,KAAK,MAAM,KAAK,gBAAgB,CAEtC,CAME,mBAAoB,CAClB,MAAM9D,EAAS,KAAK,WAAY,EAC1B+D,EAAe,KAAK,iBAAkB,EACtCC,EAAiB90C,GAAK8wC,EAAO,SAAS9wC,EAAE,KAAK,EAC7C+0C,EAAoB/0C,GAAK8wC,EAAO,YAAY9wC,EAAE,KAAK,EACzD60C,EAAa,GAAG,WAAYC,CAAc,EAC1CD,EAAa,GAAG,cAAeE,CAAiB,EAChD,KAAK,iBAAkB,EACvB,MAAMC,EAAgB,IAAM,KAAK,QAAQ,iBAAiB,EACpDC,EAAoB,IAAM,CAC9BD,EAAe,EACf,QAASt6C,EAAI,EAAGA,EAAIo2C,EAAO,OAAQp2C,IAAK,CACtC,MAAMgK,EAAQosC,EAAOp2C,CAAC,EACtBgK,EAAM,oBAAoB,YAAaswC,CAAa,EAChDtwC,EAAM,OAAS,WACjBA,EAAM,iBAAiB,YAAaswC,CAAa,CAE3D,CACK,EACDC,EAAmB,EACnBnE,EAAO,iBAAiB,SAAUmE,CAAiB,EACnDnE,EAAO,iBAAiB,WAAYmE,CAAiB,EACrDnE,EAAO,iBAAiB,cAAemE,CAAiB,EACxD,KAAK,GAAG,UAAW,UAAY,CAC7BJ,EAAa,IAAI,WAAYC,CAAc,EAC3CD,EAAa,IAAI,cAAeE,CAAiB,EACjDjE,EAAO,oBAAoB,SAAUmE,CAAiB,EACtDnE,EAAO,oBAAoB,WAAYmE,CAAiB,EACxDnE,EAAO,oBAAoB,cAAemE,CAAiB,EAC3D,QAASv6C,EAAI,EAAGA,EAAIo2C,EAAO,OAAQp2C,IACnBo2C,EAAOp2C,CAAC,EAChB,oBAAoB,YAAas6C,CAAa,CAE5D,CAAK,CACL,CAiBE,aAAaV,EAAMtoB,EAAOoC,EAAU,CAClC,GAAI,CAACkmB,EACH,MAAM,IAAI,MAAM,iDAAiD,EAEnE,OAAOD,GAAkB,KAAMC,EAAMtoB,EAAOoC,CAAQ,CACxD,CAuBE,sBAAsBnyB,EAAS,CAC7B,MAAMyI,EAAQu5B,GAAQhiC,EAAS,CAC7B,KAAM,IACZ,CAAK,EACD,OAAO,IAAIk4C,GAAO,aAAa,WAAWzvC,CAAK,CACnD,CAmBE,mBAAmBzI,EAAU,CAAE,EAAEi5C,EAAe,CAC9C,MAAMC,EAAmB,KAAK,sBAAsBl5C,CAAO,EAC3D,OAAI,OAAOi5C,GAAkB,YAC3BA,EAAgB,IAIlB,KAAK,mBAAkB,EAAG,iBAAiBC,CAAgB,EAC3D,KAAK,iBAAkB,EAAC,SAASA,EAAiB,KAAK,EACnDD,IAAkB,IAEpB,KAAK,MAAM,IAAM,KAAK,sBAAsB,SAASC,EAAiB,KAAK,CAAC,EAEvEA,CACX,CAQE,sBAAsBzwC,EAAO,CAC3B,MAAM6sC,EAAe,KAAK,mBAAkB,EAAG,wBAAwB7sC,CAAK,EAG5E,KAAK,mBAAkB,EAAG,oBAAoB6sC,CAAY,EAC1D,KAAK,iBAAgB,EAAG,YAAY7sC,CAAK,EACzC,KAAK,sBAAsB,YAAYA,CAAK,CAChD,CAaE,yBAA0B,CACxB,MAAO,CAAE,CACb,CAgBE,yBAA0B,CACxB,OAAO,QAAQ,OAAQ,CAC3B,CAQE,yBAA0B,CACxB,MAAO,EACX,CAOE,4BAA6B,CAAA,CAQ7B,0BAA0B0wC,EAAI,CAC5B,MAAMt1B,EAAKolB,GAAS,EACpB,MAAI,CAAC,KAAK,UAAY,KAAK,OAAM,GAC/B,KAAK,eAAe,IAAIplB,CAAE,EAC1B,KAAK,IAAI,UAAW,IAAM,CACpB,KAAK,eAAe,IAAIA,CAAE,IAC5B,KAAK,eAAe,OAAOA,CAAE,EAC7Bs1B,EAAI,EAEd,CAAO,GAED,KAAK,2BAA2Bt1B,EAAIs1B,CAAE,EAEjCt1B,CACX,CAOE,yBAAyBA,EAAI,CACvB,KAAK,eAAe,IAAIA,CAAE,EAC5B,KAAK,eAAe,OAAOA,CAAE,EAE7B,KAAK,0BAA0BA,CAAE,CAEvC,CAOE,WAAY,CAAA,CAOZ,aAAc,CAAA,CAOd,gBAAiB,CAAA,CAUjB,0BAA0Bu1B,EAAU,CAAA,CAUpC,0BAA0BA,EAAU,CAAA,CAkBpC,YAAYC,EAAO,CACjB,MAAO,EACX,CAYE,OAAO,YAAYA,EAAO,CACxB,MAAO,EACX,CAWE,OAAO,cAAcC,EAAQt5C,EAAS,CACpC,OAAOmvC,EAAK,YAAYmK,EAAO,IAAI,CACvC,CAcE,OAAO,OAAO7K,EAAW,CACvB,OAAOA,EAAU,qBAAqBU,GAAQV,aAAqBU,GAAQV,IAAcU,CAC7F,CAWE,OAAO,aAAahoC,EAAMmsC,EAAM,CAI9B,GAHKnE,EAAK,SACRA,EAAK,OAAS,CAAE,GAEd,CAACA,EAAK,OAAOmE,CAAI,EACnB,MAAM,IAAI,MAAM,QAAQnsC,CAAI,iBAAiB,EAE/C,GAAI,CAACgoC,EAAK,YACR,MAAM,IAAI,MAAM,qDAAqD,EAEvE,GAAI,CAACA,EAAK,cACR,MAAM,IAAI,MAAM,uDAAuD,EAEzE,OAAAhoC,EAAOimC,GAAcjmC,CAAI,EACzBgoC,EAAK,OAAOhoC,CAAI,EAAImsC,EACpBnE,EAAK,OAAOjC,GAAY/lC,CAAI,CAAC,EAAImsC,EAC7BnsC,IAAS,QAEXgoC,EAAK,kBAAkB,KAAKhoC,CAAI,EAE3BmsC,CACX,CAWE,OAAO,QAAQnsC,EAAM,CACnB,GAAKA,EAGL,IAAIgoC,EAAK,QAAUA,EAAK,OAAOhoC,CAAI,EACjC,OAAOgoC,EAAK,OAAOhoC,CAAI,EAGzB,GADAA,EAAOimC,GAAcjmC,CAAI,EACrBu5B,GAAYA,EAAS,SAAWA,EAAS,QAAQv5B,CAAI,EACvD,OAAAq6B,EAAM,KAAK,OAAOr6B,CAAI,2GAA2G,EAC1Hu5B,EAAS,QAAQv5B,CAAI,EAElC,CACA,CAqCAgxC,GAAI,MAAM,QAAQ,SAAUhxC,EAAM,CAChC,MAAMmxC,EAAQH,GAAIhxC,CAAI,EACtBgoC,EAAK,UAAUmJ,EAAM,UAAU,EAAI,UAAY,CAC7C,YAAKA,EAAM,WAAW,EAAI,KAAKA,EAAM,WAAW,GAAK,IAAIA,EAAM,UACxD,KAAKA,EAAM,WAAW,CAC9B,CACH,CAAC,EAgCDnJ,EAAK,UAAU,sBAAwB,GAQvCA,EAAK,UAAU,oBAAsB,GASrCA,EAAK,UAAU,yBAA2B,GAW1CA,EAAK,UAAU,qBAAuB,GAStCA,EAAK,UAAU,uBAAyB,GAYxCA,EAAK,UAAU,kBAAoB,GASnCA,EAAK,UAAU,yBAA2B,GAS1CA,EAAK,UAAU,yBAA2B,GAQ1CA,EAAK,UAAU,2BAA6B,GAc5CA,EAAK,mBAAqB,SAAUoK,EAAO,CAUzCA,EAAM,sBAAwB,SAAUC,EAAS13C,EAAO,CACtD,IAAIgoC,EAAWyP,EAAM,eAChBzP,IACHA,EAAWyP,EAAM,eAAiB,CAAE,GAElCz3C,IAAU,SAEZA,EAAQgoC,EAAS,QAEnBA,EAAS,OAAOhoC,EAAO,EAAG03C,CAAO,CAClC,EAYDD,EAAM,YAAc,SAAUt6C,EAAM,CAClC,MAAM6qC,EAAWyP,EAAM,gBAAkB,CAAE,EAC3C,IAAIE,EACJ,QAASh7C,EAAI,EAAGA,EAAIqrC,EAAS,OAAQrrC,IAEnC,GADAg7C,EAAM3P,EAASrrC,CAAC,EAAE,YAAYQ,CAAI,EAC9Bw6C,EACF,OAAOA,EAGX,MAAO,EACR,EAiBDF,EAAM,oBAAsB,SAAUz8B,EAAQ9c,EAAS,CACrD,MAAM8pC,EAAWyP,EAAM,gBAAkB,CAAE,EAC3C,IAAIE,EACJ,QAASh7C,EAAI,EAAGA,EAAIqrC,EAAS,OAAQrrC,IAEnC,GADAg7C,EAAM3P,EAASrrC,CAAC,EAAE,gBAAgBqe,EAAQ9c,CAAO,EAC7Cy5C,EACF,OAAO3P,EAASrrC,CAAC,EAGrB,OAAO,IACR,EAcD86C,EAAM,cAAgB,SAAUD,EAAQt5C,EAAS,CAC/C,MAAM05C,EAAKH,EAAM,oBAAoBD,EAAQt5C,CAAO,EACpD,OAAI05C,EACKA,EAAG,gBAAgBJ,EAAQt5C,CAAO,EAEpC,EACR,EAMkB,CAAC,WAAY,UAAW,UAAU,EAgB1C,QAAQ,SAAU+rC,EAAQ,CACnC,MAAM4N,EAAa,KAAK5N,CAAM,EAC1B,OAAO4N,GAAe,aAG1B,KAAK5N,CAAM,EAAI,UAAY,CACzB,OAAI,KAAK,gBAAkB,KAAK,eAAeA,CAAM,EAC5C,KAAK,eAAeA,CAAM,EAAE,MAAM,KAAK,eAAgB,SAAS,EAElE4N,EAAW,MAAM,KAAM,SAAS,CACxC,EACL,EAAKJ,EAAM,SAAS,EAUlBA,EAAM,UAAU,UAAY,SAAUz8B,EAAQ,CAC5C,IAAI48B,EAAKH,EAAM,oBAAoBz8B,EAAQ,KAAK,QAAQ,EACnD48B,IAGCH,EAAM,oBACRG,EAAKH,EAAM,oBAEX/X,EAAM,MAAM,iDAAiD,GAKjE,KAAK,qBAAsB,EAC3B,KAAK,IAAI,UAAW,KAAK,qBAAqB,EAC1CkY,IAAOH,EAAM,sBACf,KAAK,eAAiBz8B,GAExB,KAAK,eAAiB48B,EAAG,aAAa58B,EAAQ,KAAM,KAAK,QAAQ,EACjE,KAAK,IAAI,UAAW,KAAK,qBAAqB,CAC/C,EAODy8B,EAAM,UAAU,qBAAuB,UAAY,CAI7C,KAAK,iBACP,KAAK,YAAY,CAAC,QAAS,OAAO,CAAC,EACnC,KAAK,eAAiB,MAIxB,KAAK,sBAAuB,EACxB,KAAK,iBACH,KAAK,eAAe,SACtB,KAAK,eAAe,QAAS,EAE/B,KAAK,eAAiB,KAEzB,CACH,EAIA9L,EAAY,kBAAkB,OAAQ0B,CAAI,EAC1CA,EAAK,aAAa,OAAQA,CAAI,EAO9BA,EAAK,kBAAoB,CAAE,EAU3B,MAAMyK,GAAc,CAAE,EAChBC,GAAsB,CAAE,EACxBC,GAAa,CAAE,EAmCrB,SAASC,GAAI96C,EAAM+6C,EAAY,CAC7BJ,GAAY36C,CAAI,EAAI26C,GAAY36C,CAAI,GAAK,CAAE,EAC3C26C,GAAY36C,CAAI,EAAE,KAAK+6C,CAAU,CACnC,CAgBA,SAASC,GAAUvM,EAAQlwB,EAAKmE,EAAM,CACpC+rB,EAAO,WAAW,IAAMwM,GAAgB18B,EAAKo8B,GAAYp8B,EAAI,IAAI,EAAGmE,EAAM+rB,CAAM,EAAG,CAAC,CACtF,CAWA,SAASyM,GAAQH,EAAY1G,EAAM,CACjC0G,EAAW,QAAQI,GAAMA,EAAG,SAAWA,EAAG,QAAQ9G,CAAI,CAAC,CACzD,CAkBA,SAAS+G,GAAIL,EAAY1G,EAAMnxC,EAAQ,CACrC,OAAO63C,EAAW,YAAYM,GAAmBn4C,CAAM,EAAGmxC,EAAKnxC,CAAM,GAAG,CAC1E,CAqBA,SAASkgC,GAAI2X,EAAY1G,EAAMnxC,EAAQo4C,EAAK,CAC1C,OAAOjH,EAAKnxC,CAAM,EAAE63C,EAAW,OAAOM,GAAmBn4C,CAAM,EAAGo4C,CAAG,CAAC,CACxE,CAyBA,SAASC,GAAQR,EAAY1G,EAAMnxC,EAAQo4C,EAAM,KAAM,CACrD,MAAME,EAAa,OAASrN,GAAcjrC,CAAM,EAC1Cu4C,EAAkBV,EAAW,OAAOM,GAAmBG,CAAU,EAAGF,CAAG,EACvEI,EAAaD,IAAoBZ,GAGjCc,EAAcD,EAAa,KAAOrH,EAAKnxC,CAAM,EAAEu4C,CAAe,EACpE,OAAAG,GAAab,EAAY73C,EAAQy4C,EAAaD,CAAU,EACjDC,CACT,CAOA,MAAME,GAAiB,CACrB,SAAU,EACV,YAAa,EACb,SAAU,EACV,MAAO,EACP,OAAQ,EACR,OAAQ,EACR,SAAU,EACV,OAAQ,EACR,MAAO,CACT,EAOMC,GAAiB,CACrB,eAAgB,EAChB,SAAU,EACV,UAAW,CACb,EAOMC,GAAmB,CACvB,KAAM,EACN,MAAO,CACT,EACA,SAASV,GAAmBn4C,EAAQ,CAClC,MAAO,CAACjB,EAAOk5C,IAETl5C,IAAU44C,GACLA,GAELM,EAAGj4C,CAAM,EACJi4C,EAAGj4C,CAAM,EAAEjB,CAAK,EAElBA,CAEX,CACA,SAAS25C,GAAaI,EAAK94C,EAAQjB,EAAOy5C,EAAY,CACpD,QAASl8C,EAAIw8C,EAAI,OAAS,EAAGx8C,GAAK,EAAGA,IAAK,CACxC,MAAM27C,EAAKa,EAAIx8C,CAAC,EACZ27C,EAAGj4C,CAAM,GACXi4C,EAAGj4C,CAAM,EAAEw4C,EAAYz5C,CAAK,CAElC,CACA,CAQA,SAASg6C,GAAoBxN,EAAQ,CAC/BmM,GAAoB,eAAenM,EAAO,GAAI,CAAA,GAChD,OAAOmM,GAAoBnM,EAAO,IAAI,CAE1C,CASA,SAASyN,GAAmBzN,EAAQ0N,EAAW,CAC7C,MAAMH,EAAMpB,GAAoBnM,EAAO,GAAE,CAAE,EAC3C,IAAI0M,EAAK,KACT,GAAyBa,GAAQ,KAC/B,OAAAb,EAAKgB,EAAU1N,CAAM,EACrBmM,GAAoBnM,EAAO,GAAI,CAAA,EAAI,CAAC,CAAC0N,EAAWhB,CAAE,CAAC,EAC5CA,EAET,QAAS37C,EAAI,EAAGA,EAAIw8C,EAAI,OAAQx8C,IAAK,CACnC,KAAM,CAAC48C,EAAKC,CAAG,EAAIL,EAAIx8C,CAAC,EACpB48C,IAAQD,IAGZhB,EAAKkB,EACT,CACE,OAAIlB,IAAO,OACTA,EAAKgB,EAAU1N,CAAM,EACrBuN,EAAI,KAAK,CAACG,EAAWhB,CAAE,CAAC,GAEnBA,CACT,CACA,SAASF,GAAgB18B,EAAM,GAAIw8B,EAAa,CAAE,EAAEr4B,EAAM+rB,EAAQr6B,EAAM,GAAIkoC,EAAU,GAAO,CAC3F,KAAM,CAACH,EAAW,GAAGI,CAAM,EAAIxB,EAG/B,GAAI,OAAOoB,GAAc,SACvBlB,GAAgB18B,EAAKo8B,GAAYwB,CAAS,EAAGz5B,EAAM+rB,EAAQr6B,EAAKkoC,CAAO,UAI9DH,EAAW,CACpB,MAAMhB,EAAKe,GAAmBzN,EAAQ0N,CAAS,EAG/C,GAAI,CAAChB,EAAG,UACN,OAAA/mC,EAAI,KAAK+mC,CAAE,EACJF,GAAgB18B,EAAKg+B,EAAQ75B,EAAM+rB,EAAQr6B,EAAKkoC,CAAO,EAEhEnB,EAAG,UAAU,OAAO,OAAO,CAAE,EAAE58B,CAAG,EAAG,SAAU7f,EAAK89C,EAAM,CAGxD,GAAI99C,EACF,OAAOu8C,GAAgB18B,EAAKg+B,EAAQ75B,EAAM+rB,EAAQr6B,EAAKkoC,CAAO,EAIhEloC,EAAI,KAAK+mC,CAAE,EAIXF,GAAgBuB,EAAMj+B,EAAI,OAASi+B,EAAK,KAAOD,EAAS5B,GAAY6B,EAAK,IAAI,EAAG95B,EAAM+rB,EAAQr6B,EAAKkoC,CAAO,CAChH,CAAK,CACL,MAAaC,EAAO,OAChBtB,GAAgB18B,EAAKg+B,EAAQ75B,EAAM+rB,EAAQr6B,EAAKkoC,CAAO,EAC9CA,EACT55B,EAAKnE,EAAKnK,CAAG,EAEb6mC,GAAgB18B,EAAKo8B,GAAY,GAAG,EAAGj4B,EAAM+rB,EAAQr6B,EAAK,EAAI,CAElE,CAWA,MAAMqoC,GAAgB,CACpB,KAAM,YACN,IAAK,YACL,IAAK,YACL,IAAK,YACL,IAAK,YACL,IAAK,mBACL,IAAK,YACL,IAAK,aACL,IAAK,YACL,IAAK,cACL,KAAM,aACN,IAAK,YACL,IAAK,YACL,KAAM,wBACN,IAAK,uBACL,IAAK,aACL,KAAM,aACN,IAAK,YACL,IAAK,YACL,IAAK,gBACL,KAAM,YACR,EAWMC,GAAc,SAAUn+B,EAAM,GAAI,CACtC,MAAMo+B,EAAMxF,GAAiB54B,CAAG,EAEhC,OADiBk+B,GAAcE,EAAI,YAAW,CAAE,GAC7B,EACrB,EAeMC,GAAe,CAACnO,EAAQlwB,IAAQ,CACpC,GAAI,CAACA,EACH,MAAO,GAIT,GAAIkwB,EAAO,OAAO,OAAO,MAAQlwB,GAAOkwB,EAAO,OAAO,OAAO,KAC3D,OAAOA,EAAO,OAAO,OAAO,KAI9B,MAAMoO,EAAkBpO,EAAO,OAAO,QAAQ,OAAO9oC,GAAKA,EAAE,MAAQ4Y,CAAG,EACvE,GAAIs+B,EAAgB,OAClB,OAAOA,EAAgB,CAAC,EAAE,KAI5B,MAAM7Z,EAAUyL,EAAO,GAAG,QAAQ,EAClC,QAASjvC,EAAI,EAAGA,EAAIwjC,EAAQ,OAAQxjC,IAAK,CACvC,MAAMmG,EAAIq9B,EAAQxjC,CAAC,EACnB,GAAImG,EAAE,MAAQA,EAAE,KAAOA,EAAE,MAAQ4Y,EAC/B,OAAO5Y,EAAE,IAEf,CAGE,OAAO+2C,GAAYn+B,CAAG,CACxB,EAmBMu+B,GAAe,SAAUv+B,EAAK,CAElC,GAAI,MAAM,QAAQA,CAAG,EAAG,CACtB,IAAIw+B,EAAS,CAAE,EACfx+B,EAAI,QAAQ,SAAUy+B,EAAQ,CAC5BA,EAASF,GAAaE,CAAM,EACxB,MAAM,QAAQA,CAAM,EACtBD,EAASA,EAAO,OAAOC,CAAM,EACpBnwB,GAASmwB,CAAM,GACxBD,EAAO,KAAKC,CAAM,CAE1B,CAAK,EACDz+B,EAAMw+B,CACP,MAAU,OAAOx+B,GAAQ,UAAYA,EAAI,KAAI,EAE5CA,EAAM,CAAC0+B,GAAU,CACf,IAAA1+B,CACN,CAAK,CAAC,EACOsO,GAAStO,CAAG,GAAK,OAAOA,EAAI,KAAQ,UAAYA,EAAI,KAAOA,EAAI,IAAI,KAAI,EAEhFA,EAAM,CAAC0+B,GAAU1+B,CAAG,CAAC,EAGrBA,EAAM,CAAE,EAEV,OAAOA,CACT,EAUA,SAAS0+B,GAAU1+B,EAAK,CACtB,GAAI,CAACA,EAAI,KAAM,CACb,MAAM2+B,EAAWR,GAAYn+B,EAAI,GAAG,EAChC2+B,IACF3+B,EAAI,KAAO2+B,EAEjB,CACE,OAAO3+B,CACT,CAEA,IAAI4+B,GAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAKZ,MAAMC,GAAc9Y,GAAW,MAAQC,GAAW,IAAM,EAClD8Y,GAAqB,CACzB,MAAO,CACL,KAAM,IACN,MAAO,GACP,GAAI,IACJ,GAAI,IACJ,KAAMD,EACP,EACD,MAAO,CACL,IAAK,OACL,GAAI,QACJ,IAAK,KACL,IAAK,KACL,CAACA,EAAW,EAAG,MAChB,EACD,WAAWjpC,EAAOmpC,EAAS,CAEzB,OADAA,EAAUA,EAAQ,YAAa,EAC3B,QAAK,MAAMnpC,EAAM,OAAO,GAAK,KAAK,MAAMA,EAAM,OAAO,IAAMmpC,EAIhE,EACD,aAAanpC,EAAO,CAClB,GAAI,KAAK,MAAMA,EAAM,OAAO,EAC1B,OAAO,KAAK,MAAMA,EAAM,OAAO,EAC1B,GAAI,KAAK,MAAMA,EAAM,IAAI,EAAG,CACjC,MAAM4L,EAAO,KAAK,MAAM5L,EAAM,IAAI,EAClC,OAAO,KAAK,MAAM4L,CAAI,CAC5B,CACI,OAAO,IACX,CACA,EAUMw9B,GAAiB,EASvB,MAAMC,WAA0BlR,EAAc,CAQ5C,YAAYmC,EAAQ,CAClB,MAAO,EACP,KAAK,QAAUA,EACf,KAAK,oBAAsB,CAAE,EAC7B,KAAK,aAAe,GACpB,KAAK,UAAY,GACjB,KAAK,WAAa,KAAK,WAAW,KAAK,IAAI,EAC3C,KAAK,sBAAwB,IACjC,CAME,OAAQ,CAEF,KAAK,eAKT,KAAK,QAAQ,GAAG,UAAW,KAAK,UAAU,EAC1C,KAAK,QAAQ,GAAG,eAAgB,KAAK,UAAU,EAE/C,KAAK,QAAQ,GAAG,iBAAkB,IAAM,CACtC,KAAK,MAAM,KAAK,0BAA2B,EAAC,CAAC,CAAC,CACpD,CAAK,EACD,KAAK,QAAQ,GAAG,aAAc,IAAM,CAClC,KAAK,iBAAkB,CAC7B,CAAK,EACD,KAAK,QAAQ,GAAG,UAAW,KAAK,mBAAmB,KAAK,IAAI,CAAC,EAC7D,KAAK,QAAQ,GAAG,WAAY,KAAK,kBAAkB,KAAK,IAAI,CAAC,EAC7D,KAAK,aAAe,GACxB,CAME,MAAO,CACL,KAAK,QAAQ,IAAI,UAAW,KAAK,UAAU,EAC3C,KAAK,aAAe,EACxB,CASE,WAAWt6B,EAAO,CAEhB,MAAMspC,EAActpC,EAAM,cAAgBA,EAAM,cAAgBA,EAChE,GAAI,CAAC,YAAa,aAAc,UAAW,WAAW,EAAE,SAASspC,EAAY,GAAG,EAAG,CAEjF,GAAI,KAAK,UACP,OAEFA,EAAY,eAAgB,EAG5B,MAAMC,EAAYD,EAAY,IAAI,UAAU,CAAC,EAAE,YAAa,EAC5D,KAAK,KAAKC,CAAS,CACzB,SAAeL,GAAmB,WAAWI,EAAa,MAAM,GAAKJ,GAAmB,WAAWI,EAAa,OAAO,GAAKJ,GAAmB,WAAWI,EAAa,IAAI,GAAKJ,GAAmB,WAAWI,EAAa,IAAI,EAAG,CAE5NA,EAAY,eAAgB,EAC5B,MAAME,EAASN,GAAmB,aAAaI,CAAW,EAC1D,KAAK,oBAAoBE,CAAM,CAChC,MAAUN,GAAmB,WAAWI,EAAa,MAAM,GAAKtpC,EAAM,QAAUA,EAAM,OAAO,UAAS,IACrGspC,EAAY,eAAgB,EAC5BtpC,EAAM,OAAO,MAAO,EAE1B,CAUE,oBAAoBrR,EAAK,CACvB,GAAI,KAAK,QACP,OAAQA,EAAG,CACT,IAAK,OACC,KAAK,QAAQ,UACf,KAAK,QAAQ,KAAM,EAErB,MACF,IAAK,QACE,KAAK,QAAQ,UAChB,KAAK,QAAQ,MAAO,EAEtB,MACF,IAAK,KACH,KAAK,UAAU,KAAK,QAAQ,YAAW,EAAKy6C,EAAc,EAC1D,MACF,IAAK,KACH,KAAK,UAAU,KAAK,QAAQ,YAAW,EAAKA,EAAc,EAC1D,KACV,CAEA,CASE,UAAUnF,EAAI,CACR,KAAK,QAAQ,aAAe,KAAK,QAAQ,YAAY,UACvD,KAAK,QAAQ,YAAY,mBAAoB,EAE/C,KAAK,QAAQ,YAAYA,CAAE,CAC/B,CAME,OAAQ,CACN,KAAK,UAAY,EACrB,CAME,QAAS,CACP,KAAK,UAAY,EACrB,CAcE,kBAAkBjkC,EAAO,CACvB,MAAMypC,EAAqBzpC,EAAM,cACjC,IAAI0pC,EAAqB,KACzB,MAAMC,EAAmB,KAAK,oBAAoB3pC,EAAM,MAAM,EAC1DypC,IACFC,EAAqB,EAAQD,EAAmB,QAAQ,WAAW,EAG/DA,EAAmB,UAAU,SAAS,yBAAyB,GAAK,CAAC,KAAK,WAC5E,KAAK,sBAAuB,IAG5B,CAACzpC,EAAM,cAAc,SAASA,EAAM,aAAa,GAAK,CAAC0pC,GAAsB,CAACD,KAC5EE,EAAiB,KAAM,IAAK,cAC9B,KAAK,iBAAkB,GAEvB,KAAK,MAAO,EACRA,GAAoBA,EAAiB,OAEvC,KAAK,sBAAwBA,IAIvC,CAOE,oBAAqB,CACf,KAAK,oBAAqB,GAAI,KAAK,oBAAmB,EAAG,kBAC3D,KAAK,OAAQ,CAEnB,CAQE,2BAA4B,CAC1B,MAAMrP,EAAS,KAAK,QACdsP,EAAsB,CAAE,EAU9B,SAASC,EAA4BC,EAAiB,CACpD,UAAWz+C,KAAKy+C,EACVz+C,EAAE,eAAe,KAAK,GAAKA,EAAE,kBAAoBA,EAAE,0BAA0BA,EAAE,GAAI,CAAA,GACrFu+C,EAAoB,KAAKv+C,CAAC,EAExBA,EAAE,eAAe,WAAW,GAAKA,EAAE,UAAU,OAAS,GACxDw+C,EAA4Bx+C,EAAE,SAAS,CAGjD,CAGI,OAAAivC,EAAO,UAAU,QAAQxsC,GAAS,CAChC,GAAIA,EAAM,eAAe,KAAK,EAE5B,GAAIA,EAAM,gBAAkBA,EAAM,2BAA6BA,EAAM,eAAgB,GAAIA,EAAM,0BAA0BA,EAAM,GAAI,CAAA,EAAG,CACpI87C,EAAoB,KAAK97C,CAAK,EAC9B,MAEV,MAAmBA,EAAM,eAAe,WAAW,GAAKA,EAAM,UAAU,OAAS,EACvE+7C,EAA4B/7C,EAAM,SAAS,EAElCA,EAAM,eAAe,OAAO,GAAKA,EAAM,MAAM,OAAS,EAC/D+7C,EAA4B/7C,EAAM,KAAK,EAE9B,KAAK,qBAAqBA,CAAK,GACxC87C,EAAoB,KAAK97C,CAAK,CAGxC,CAAK,EACD,KAAK,oBAAsB87C,EACpB,KAAK,mBAChB,CAQE,qBAAqBvO,EAAW,CAW9B,SAAS0O,EAAuB51C,EAAM,CACpC,GAAIknC,EAAU,eAAelnC,CAAI,GAAKknC,EAAU,0BAA0BlnC,CAAI,EAC5E,OAAOA,EAET,QAAS9I,EAAI,EAAGA,EAAI8I,EAAK,SAAS,OAAQ9I,IAAK,CAC7C,MAAMijB,EAAQna,EAAK,SAAS9I,CAAC,EACvB2+C,EAAgBD,EAAuBz7B,CAAK,EAClD,GAAI07B,EACF,OAAOA,CAEjB,CACM,OAAO,IACb,CACI,OAAOD,EAAuB1O,EAAU,IAAI,CAChD,CAaE,oBAAoB5xB,EAAQ,CAC1B,KAAK,0BAA2B,EAEhC,MAAMwgC,EAAUxgC,GAAU,SAAS,cACnC,GAAI,KAAK,oBAAoB,QAC3B,UAAWpe,KAAK,KAAK,oBAEnB,GAAIA,EAAE,GAAI,IAAK4+C,EACb,OAAO5+C,EAIjB,CAQE,IAAIgwC,EAAW,CACb,MAAMuO,EAAsB,CAAC,GAAG,KAAK,mBAAmB,EACpDvO,EAAU,eAAe,KAAK,GAAKA,EAAU,kBAAoBA,EAAU,0BAA0BA,EAAU,GAAI,CAAA,GACrHuO,EAAoB,KAAKvO,CAAS,EAEpC,KAAK,oBAAsBuO,EAE3B,KAAK,QAAQ,CACX,KAAM,6BACN,oBAAqB,KAAK,mBAChC,CAAK,CACL,CAOE,OAAOvO,EAAW,CAChB,QAAShwC,EAAI,EAAGA,EAAI,KAAK,oBAAoB,OAAQA,IACnD,GAAI,KAAK,oBAAoBA,CAAC,EAAE,SAAWgwC,EAAU,OAAQ,CAC3D,KAAK,oBAAoB,OAAOhwC,EAAG,CAAC,EAEpC,KAAK,QAAQ,CACX,KAAM,6BACN,oBAAqB,KAAK,mBACpC,CAAS,EACD,MACR,CAEA,CAKE,OAAQ,CAEF,KAAK,oBAAoB,OAAS,IAEpC,KAAK,oBAAsB,CAAE,EAG7B,KAAK,QAAQ,CACX,KAAM,6BACN,oBAAqB,KAAK,mBAClC,CAAO,EAEP,CAOE,KAAKk+C,EAAW,CACd,MAAMW,EAA0B,KAAK,oBAAqB,EAC1D,GAAI,CAACA,EACH,OAEF,MAAMC,EAAmBD,EAAwB,aAAc,EACzDE,EAAa,KAAK,oBAAoB,OAAO/O,GAAaA,IAAc6O,GAA2B,KAAK,eAAeC,EAAiB,mBAAoB9O,EAAU,aAAY,EAAG,mBAAoBkO,CAAS,CAAC,EACnNc,EAAgB,KAAK,mBAAmBF,EAAiB,OAAQC,EAAYb,CAAS,EACxFc,EACF,KAAK,MAAMA,CAAa,EAExB,KAAK,QAAQ,CACX,KAAM,2BACN,UAAAd,EACA,iBAAkBW,CAC1B,CAAO,CAEP,CAWE,mBAAmBI,EAAeF,EAAYb,EAAW,CACvD,IAAIgB,EAAc,IACdF,EAAgB,KACpB,UAAWG,KAAaJ,EAAY,CAClC,MAAMK,EAAkBD,EAAU,aAAY,EAAG,OAC3CE,EAAW,KAAK,mBAAmBJ,EAAeG,EAAiBlB,CAAS,EAC9EmB,EAAWH,IACbA,EAAcG,EACdL,EAAgBG,EAExB,CACI,OAAOH,CACX,CAWE,eAAeM,EAASC,EAAYrB,EAAW,CAC7C,OAAQA,EAAS,CACf,IAAK,QACH,OAAOqB,EAAW,MAAQD,EAAQ,MACpC,IAAK,OACH,OAAOC,EAAW,OAASD,EAAQ,KACrC,IAAK,OACH,OAAOC,EAAW,KAAOD,EAAQ,OACnC,IAAK,KACH,OAAOC,EAAW,QAAUD,EAAQ,IACtC,QACE,MAAO,EACf,CACA,CAKE,kBAAmB,CACjB,GAAI,KAAK,sBAAuB,CAEzB,KAAK,QAAQ,cAChB,KAAK,QAAQ,WAAW,EAAI,EAE9B,KAAK,0BAA2B,EAIhC,QAASt/C,EAAI,EAAGA,EAAI,KAAK,oBAAoB,OAAQA,IACnD,GAAI,KAAK,oBAAoBA,CAAC,EAAE,KAAI,IAAO,KAAK,sBAAsB,OAAQ,CAC5E,KAAK,MAAM,KAAK,oBAAoBA,CAAC,CAAC,EACtC,MACV,CAEA,MACM,KAAK,MAAM,KAAK,0BAA2B,EAAC,CAAC,CAAC,CAEpD,CASE,MAAMgwC,EAAW,CACXA,EAAU,0BAA0BA,EAAU,GAAI,CAAA,EACpDA,EAAU,MAAO,EACR,KAAK,qBAAqBA,CAAS,GAC5C,KAAK,qBAAqBA,CAAS,EAAE,MAAO,CAElD,CAWE,mBAAmBwP,EAASC,EAASvB,EAAW,CAC9C,MAAMwB,EAAK,KAAK,IAAIF,EAAQ,EAAIC,EAAQ,CAAC,EACnCE,EAAK,KAAK,IAAIH,EAAQ,EAAIC,EAAQ,CAAC,EACzC,IAAIJ,EACJ,OAAQnB,EAAS,CACf,IAAK,QACL,IAAK,OAEHmB,EAAWK,EAAKC,EAAK,IACrB,MACF,IAAK,KAGHN,EAAWM,EAAK,EAAID,EAAK,GACzB,MACF,IAAK,OAGHL,EAAWM,EAAK,EAAID,EACpB,MACF,QACEL,EAAWK,EAAKC,CACxB,CACI,OAAON,CACX,CAQE,uBAAwB,CACtB,MAAMO,EAAoB,KAC1B,UAAW5P,KAAa4P,EAAkB,4BACxC,GAAI5P,EAAU,YAAY,OAAS,kBAAmB,CACpD4P,EAAkB,MAAM5P,CAAS,EACjC,KACR,CAEA,CACA,CAcA,MAAM6P,WAAoB7Q,CAAY,CAapC,YAAYC,EAAQ1tC,EAAS2tC,EAAO,CAElC,MAAM4Q,EAAWvc,GAAQ,CACvB,SAAU,EACX,EAAEhiC,CAAO,EAMV,GALA,MAAM0tC,EAAQ6Q,EAAU5Q,CAAK,EAKzB,CAAC3tC,EAAQ,cAAc,SAAWA,EAAQ,cAAc,QAAQ,SAAW,EAC7E,QAASvB,EAAI,EAAG+/C,EAAIx+C,EAAQ,cAAc,UAAWvB,EAAI+/C,EAAE,OAAQ//C,IAAK,CACtE,MAAMggD,EAAWrR,GAAcoR,EAAE//C,CAAC,CAAC,EACnC,IAAI60C,EAAOnE,EAAK,QAAQsP,CAAQ,EAShC,GALKA,IACHnL,EAAO7F,EAAY,aAAagR,CAAQ,GAItCnL,GAAQA,EAAK,cAAe,CAC9B5F,EAAO,UAAU+Q,CAAQ,EACzB,KACV,CACA,MAMM/Q,EAAO,IAAI1tC,EAAQ,cAAc,OAAO,CAE9C,CACA,CACAytC,EAAY,kBAAkB,cAAe6Q,EAAW,EAcxD,MAAMI,WAA2BjR,CAAY,CAoB3C,YAAYC,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACjB,KAAK,SAAS,aAChB,KAAK,YAAY,KAAK,SAAS,WAAW,EAE5C,KAAK,iBAAmB+D,GAAK,KAAK,gBAAgBA,CAAC,EACnD,KAAK,gBAAkBA,GAAK,KAAK,eAAeA,CAAC,EACjD,KAAK,aAAeA,GAAK,KAAK,YAAYA,CAAC,EAC3C,KAAK,eAAiBA,GAAK,KAAK,cAAcA,CAAC,EAC/C,KAAK,cAAe,EACpB,KAAK,OAAQ,CACjB,CAiBE,SAAS8Q,EAAM,MAAOyjC,EAAQ,CAAE,EAAEtlC,EAAa,GAAI,CACjDslC,EAAQ,OAAO,OAAO,CACpB,UAAW,KAAK,cAAe,EAC/B,SAAU,CACX,EAAEA,CAAK,EACJzjC,IAAQ,UACV2sB,EAAM,MAAM,yDAAyD3sB,CAAG,0CAA0C,EAIpH7B,EAAa,OAAO,OAAO,CACzB,KAAM,QACP,EAAEA,CAAU,EACb,KAAK,UAAYslC,EAAM,SACvB,MAAMx4B,EAAK6kB,EAAS9vB,EAAKyjC,EAAOtlC,CAAU,EAC1C,OAAK,KAAK,QAAQ,SAAS,sBACzB8M,EAAG,YAAY6kB,EAAS,OAAQ,CAC9B,UAAW,sBACnB,EAAS,CACD,cAAe,EACvB,CAAO,CAAC,EAEJ,KAAK,oBAAoB7kB,CAAE,EACpBA,CACX,CACE,SAAU,CAER,KAAK,eAAiB,KACtB,MAAM,QAAS,CACnB,CAWE,oBAAoBA,EAAI,CACtB,YAAK,eAAiB6kB,EAAS,OAAQ,CACrC,UAAW,kBACjB,EAAO,CAED,YAAa,QACnB,CAAK,EACG7kB,GACFA,EAAG,YAAY,KAAK,cAAc,EAEpC,KAAK,YAAY,KAAK,aAAcA,CAAE,EAC/B,KAAK,cAChB,CAcE,YAAYzX,EAAMyX,EAAK,KAAK,GAAE,EAAI,CAChC,GAAIzX,IAAS,OACX,OAAO,KAAK,cAAgB,YAE9B,MAAMs2C,EAAgB,KAAK,SAASt2C,CAAI,EAGxC,KAAK,aAAeA,EACpBw8B,GAAY,KAAK,eAAgB8Z,CAAa,EAC1C,CAAC,KAAK,gBAAkB,CAAC,KAAK,QAAQ,SAAS,qBAEjD7+B,EAAG,aAAa,QAAS6+B,CAAa,CAE5C,CAQE,eAAgB,CACd,MAAO,0BAA0B,MAAM,cAAe,CAAA,EAC1D,CAKE,QAAS,CACF,KAAK,WACR,KAAK,SAAW,GAChB,KAAK,YAAY,cAAc,EAC/B,KAAK,IAAI,aAAa,gBAAiB,OAAO,EAC1C,OAAO,KAAK,UAAc,KAC5B,KAAK,IAAI,aAAa,WAAY,KAAK,SAAS,EAElD,KAAK,GAAG,CAAC,MAAO,OAAO,EAAG,KAAK,YAAY,EAC3C,KAAK,GAAG,UAAW,KAAK,cAAc,EAE5C,CAKE,SAAU,CACR,KAAK,SAAW,GAChB,KAAK,SAAS,cAAc,EAC5B,KAAK,IAAI,aAAa,gBAAiB,MAAM,EACzC,OAAO,KAAK,UAAc,KAC5B,KAAK,IAAI,gBAAgB,UAAU,EAErC,KAAK,IAAI,YAAa,KAAK,gBAAgB,EAC3C,KAAK,IAAI,WAAY,KAAK,eAAe,EACzC,KAAK,IAAI,CAAC,MAAO,OAAO,EAAG,KAAK,YAAY,EAC5C,KAAK,IAAI,UAAW,KAAK,cAAc,CAC3C,CAOE,sBAAuB,CACrB,KAAK,YAAY,KAAK,YAAY,CACtC,CAaE,YAAYvrC,EAAO,CACb,KAAK,SAAS,cAChB,KAAK,SAAS,aAAa,KAAK,KAAM,SAAS,CAErD,CAaE,cAAcA,EAAO,CAIfA,EAAM,MAAQ,KAAOA,EAAM,MAAQ,SACrCA,EAAM,eAAgB,EACtBA,EAAM,gBAAiB,EACvB,KAAK,QAAQ,OAAO,GAGpB,MAAM,cAAcA,CAAK,CAE/B,CACA,CACAq6B,EAAY,kBAAkB,qBAAsBiR,EAAkB,EAatE,MAAME,WAAoBF,EAAmB,CAU3C,YAAYhR,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,OAAQ,EACb,KAAK,QAAU+D,GAAK,KAAK,OAAOA,CAAC,EACjC2pC,EAAO,GAAG,eAAgB,KAAK,OAAO,CAC1C,CAKE,SAAU,CACR,KAAK,OAAM,EAAG,IAAI,eAAgB,KAAK,OAAO,EAC9C,MAAM,QAAS,CACnB,CAQE,UAAW,CAGT,OAAO/I,EAAS,MAAO,CACrB,UAAW,YACjB,CAAK,CACL,CAaE,YAAYzjC,EAAO,CAEjB,GAAI,OAAOA,EAAU,IACnB,OAAI,KAAK,EAAE,KAAK,EAEP,KAAK,EAAE,KAAK,EAAE,YACZ,KAAK,QAAQ,OAAS,KAAK,QAAQ,MAAM,SAE3C,KAAK,QAAQ,YAAa,EAI5B,KAAK,QAAQ,SAAS,aAAe,KAAK,QAAQ,SAAS,aAAe,KAEnF,GAAIA,IAAU,MAAQA,IAAU,aAAeA,IAAU,kBAAmB,CAC1E,KAAK,QAAQ,IAAI,KAAK,uEAAuEA,CAAK,GAAG,EACrG,MACN,CACQ,KAAK,EAAE,KAAK,IACd,KAAK,EAAE,KAAK,EAAE,YAAcA,EAGlC,CAUE,OAAOkS,EAAO,CACZ,MAAMrC,EAAM,KAAK,OAAM,EAAG,OAAQ,EAClC,KAAK,OAAOA,CAAG,EAIXA,EACF,KAAK,KAAM,EAEX,KAAK,KAAM,CAEjB,CAUE,OAAOA,EAAK,CACV,GAAI,CAACA,EAAK,CACR,KAAK,IAAI,YAAc,GACvB,MACN,CACS,KAAK,EAAE,KAAK,GACf,KAAK,IAAI,YAAY4zB,EAAS,UAAW,CACvC,UAAW,aAEX,SAAU,EAClB,EAAS,CAAE,EAAEA,EAAS,MAAO,CACrB,QAAS,OACT,YAAa,KAAK,YAAW,CACrC,EAAS,CACD,IAAK,EACN,CAAA,CAAC,CAAC,EAEL,KAAK,EAAE,KAAK,EAAE,IAAM5zB,CACxB,CAaE,YAAYqC,EAAO,CAEZ,KAAK,QAAQ,aAGd,KAAK,QAAQ,KAAK,EAAI,GACxB,KAAK,QAAQ,KAAK,EAAI,EAAE,MAAO,EAE7B,KAAK,QAAQ,SACf+/B,GAAe,KAAK,QAAQ,MAAM,EAElC,KAAK,QAAQ,MAAO,EAE1B,CACA,CAeAyL,GAAY,UAAU,YAAcA,GAAY,UAAU,YAC1DnR,EAAY,kBAAkB,cAAemR,EAAW,EAQxD,MAAMC,GAAW,OACXC,GAAY,OACZC,GAAU,CACd,UAAW,YACX,UAAW,aACX,MAAO,QACP,mBAAoB,6CACpB,eAAgB,2BAChB,sBAAuB,aACvB,kBAAmB,QACnB,OAAQ,mCACR,OAAQ,8BACR,UAAW,wDACb,EAcA,SAASC,GAAeC,EAAOC,EAAS,CACtC,IAAIC,EACJ,GAAIF,EAAM,SAAW,EAEnBE,EAAMF,EAAM,CAAC,EAAIA,EAAM,CAAC,EAAIA,EAAM,CAAC,EAAIA,EAAM,CAAC,EAAIA,EAAM,CAAC,EAAIA,EAAM,CAAC,UAC3DA,EAAM,SAAW,EAE1BE,EAAMF,EAAM,MAAM,CAAC,MAEnB,OAAM,IAAI,MAAM,gCAAkCA,EAAQ,8CAA8C,EAE1G,MAAO,QAAU,SAASE,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAAI,IAAM,SAASA,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAAI,IAAM,SAASA,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAAI,IAAMD,EAAU,GAC/I,CAiBA,SAASE,GAAet/B,EAAI+nB,EAAOD,EAAM,CACvC,GAAI,CACF9nB,EAAG,MAAM+nB,CAAK,EAAID,CACnB,MAAW,CAEV,MACJ,CACA,CAaA,SAASyX,GAAoBj0C,EAAU,CACrC,OAAOA,EAAW,GAAGA,CAAQ,KAAO,EACtC,CAOA,MAAMk0C,WAAyB7R,CAAY,CAazC,YAAYC,EAAQ1tC,EAAS2tC,EAAO,CAClC,MAAMD,EAAQ1tC,EAAS2tC,CAAK,EAC5B,MAAM4R,EAA2Bx7C,GAAK,KAAK,cAAcA,CAAC,EACpDy7C,EAAuBz7C,GAAK,CAChC,KAAK,qBAAsB,EAC3B,KAAK,cAAcA,CAAC,CACrB,EACD2pC,EAAO,GAAG,YAAa3pC,GAAK,KAAK,cAAcA,CAAC,CAAC,EACjD2pC,EAAO,GAAG,kBAAmB6R,CAAwB,EACrD7R,EAAO,GAAG,iBAAkB3pC,GAAK,CAC/B,KAAK,qBAAsB,EAC3B,KAAK,eAAeA,CAAC,CAC3B,CAAK,EAMD2pC,EAAO,MAAMhD,GAAM,KAAM,UAAY,CACnC,GAAIgD,EAAO,OAASA,EAAO,MAAM,yBAA0B,CACzD,KAAK,KAAM,EACX,MACR,CACMA,EAAO,GAAG,mBAAoB8R,CAAoB,EAClD9R,EAAO,GAAG,eAAgB8R,CAAoB,EAC9C,MAAMC,EAAoB/e,EAAS,OAAO,aAAeA,EACnDgf,EAAyBhf,EAAS,OAAO,YAAc,SAAW,oBACxE+e,EAAkB,iBAAiBC,EAAwBF,CAAoB,EAC/E9R,EAAO,GAAG,UAAW,IAAM+R,EAAkB,oBAAoBC,EAAwBF,CAAoB,CAAC,EAC9G,MAAM3K,EAAS,KAAK,SAAS,cAAc,QAAU,CAAE,EACvD,QAASp2C,EAAI,EAAGA,EAAIo2C,EAAO,OAAQp2C,IACjC,KAAK,QAAQ,mBAAmBo2C,EAAOp2C,CAAC,EAAG,EAAI,EAEjD,KAAK,eAAgB,CAC3B,CAAK,CAAC,CACN,CAWE,gBAAiB,CACf,MAAMkhD,EAAQ,CACZ,SAAU,EACV,UAAW,CACZ,EACKj3C,EAAY,KAAK,QAAQ,WAAY,EACrCk3C,EAAW,KAAK,QAAQ,OAAO,iBACrC,IAAIC,EACAC,EACAC,EACJ,QAASthD,EAAI,EAAGA,EAAIiK,EAAU,OAAQjK,IAAK,CACzC,MAAMgK,EAAQC,EAAUjK,CAAC,EACrBmhD,GAAYA,EAAS,SAAWA,EAAS,UAAYA,EAAS,WAAan3C,EAAM,UAAYA,EAAM,QAAQk3C,EAEzGl3C,EAAM,OAASm3C,EAAS,KAC1BG,EAAiBt3C,EAEPs3C,IACVA,EAAiBt3C,GAIVm3C,GAAY,CAACA,EAAS,SAC/BG,EAAiB,KACjBF,EAAY,KACZC,EAAgB,MACPr3C,EAAM,UACXA,EAAM,OAAS,gBAAkB,CAACo3C,EACpCA,EAAYp3C,EACHA,EAAM,QAAQk3C,GAAS,CAACG,IACjCA,EAAgBr3C,GAG1B,CAMQs3C,EACFA,EAAe,KAAO,UACbD,EACTA,EAAc,KAAO,UACZD,IACTA,EAAU,KAAO,UAEvB,CAUE,eAAgB,CACV,KAAK,QAAQ,OAAS,KAAK,QAAQ,MAAM,yBAC3C,KAAK,KAAM,EAEX,KAAK,KAAM,CAEjB,CAQE,UAAW,CACT,OAAO,MAAM,SAAS,MAAO,CAC3B,UAAW,wBACjB,EAAO,CACD,UAAa,MACb,YAAa,MACb,cAAe,MACrB,CAAK,CACL,CAKE,cAAe,CACT,OAAOnf,EAAS,QAAW,YAC7BA,EAAS,OAAO,YAAYA,EAAU,CAAE,EAAE,KAAK,GAAG,CAExD,CASE,eAAgB,CACd,MAAMmU,EAAS,KAAK,QAAQ,WAAY,EAClCmL,EAA6B,KAAK,SAAS,2BAEjD,GADA,KAAK,aAAc,EACfA,EAA4B,CAC9B,MAAMC,EAAgB,CAAE,EACxB,QAASxhD,EAAI,EAAGA,EAAIo2C,EAAO,OAAQ,EAAEp2C,EAAG,CACtC,MAAMgK,EAAQosC,EAAOp2C,CAAC,EAClBgK,EAAM,OAAS,WAGnBw3C,EAAc,KAAKx3C,CAAK,CAChC,CACM,KAAK,eAAew3C,CAAa,EACjC,MACN,CAMI,IAAIC,EAAoB,KACpBC,EAAyB,KACzB1hD,EAAIo2C,EAAO,OACf,KAAOp2C,KAAK,CACV,MAAMgK,EAAQosC,EAAOp2C,CAAC,EAClBgK,EAAM,OAAS,YACbA,EAAM,OAAS,eACjBy3C,EAAoBz3C,EAEpB03C,EAAyB13C,EAGnC,CACQ03C,GACE,KAAK,aAAa,WAAW,IAAM,OACrC,KAAK,aAAa,YAAa,KAAK,EAEtC,KAAK,eAAeA,CAAsB,GACjCD,IACL,KAAK,aAAa,WAAW,IAAM,aACrC,KAAK,aAAa,YAAa,WAAW,EAE5C,KAAK,eAAeA,CAAiB,EAE3C,CAME,sBAAuB,CAGrB,GAAI,CAAC,KAAK,QAAQ,YAAa,GAAI,CAACxf,EAAS,IAAI,SAAS,oBAAoB,EAC5E,OAEF,MAAM0f,EAAc,KAAK,QAAQ,aAAc,EACzCC,EAAe,KAAK,QAAQ,cAAe,EAC3CC,EAAoBF,EAAcC,EAClCE,EAAmB,KAAK,QAAQ,WAAU,EAAK,KAAK,QAAQ,YAAa,EAC/E,IAAIC,EAAmB,EACnBC,EAAkB,EAClB,KAAK,IAAIH,EAAoBC,CAAgB,EAAI,KAC/CD,EAAoBC,EACtBC,EAAmB,KAAK,OAAOJ,EAAcC,EAAeE,GAAoB,CAAC,EAEjFE,EAAkB,KAAK,OAAOJ,EAAeD,EAAcG,GAAoB,CAAC,GAGpFnB,GAAe,KAAK,IAAK,cAAeC,GAAoBmB,CAAgB,CAAC,EAC7EpB,GAAe,KAAK,IAAK,aAAcC,GAAoBoB,CAAe,CAAC,CAC/E,CAQE,mBAAmBh4C,EAAO,CACxB,MAAMi4C,EAAY,KAAK,QAAQ,kBAAkB,UAAW,EACtD50C,EAAOrD,EAAM,WACnB,IAAIhK,EAAIqN,EAAK,OACb,KAAOrN,KAAK,CACV,MAAMiH,EAAMoG,EAAKrN,CAAC,EAClB,GAAI,CAACiH,EACH,SAEF,MAAMyC,EAASzC,EAAI,aA+BnB,GA9BIg7C,EAAU,QACZv4C,EAAO,WAAW,MAAM,MAAQu4C,EAAU,OAExCA,EAAU,aACZtB,GAAej3C,EAAO,WAAY,QAAS62C,GAAe0B,EAAU,OAAS,OAAQA,EAAU,WAAW,CAAC,EAEzGA,EAAU,kBACZv4C,EAAO,WAAW,MAAM,gBAAkBu4C,EAAU,iBAElDA,EAAU,mBACZtB,GAAej3C,EAAO,WAAY,kBAAmB62C,GAAe0B,EAAU,iBAAmB,OAAQA,EAAU,iBAAiB,CAAC,EAEnIA,EAAU,cACRA,EAAU,cACZtB,GAAej3C,EAAQ,kBAAmB62C,GAAe0B,EAAU,YAAaA,EAAU,aAAa,CAAC,EAExGv4C,EAAO,MAAM,gBAAkBu4C,EAAU,aAGzCA,EAAU,YACRA,EAAU,YAAc,aAC1Bv4C,EAAO,WAAW,MAAM,WAAa,eAAe02C,EAAQ,iBAAiBA,EAAQ,iBAAiBA,EAAQ,GACrG6B,EAAU,YAAc,SACjCv4C,EAAO,WAAW,MAAM,WAAa,WAAW02C,EAAQ,aAAaA,EAAQ,aAAaA,EAAQ,GACzF6B,EAAU,YAAc,YACjCv4C,EAAO,WAAW,MAAM,WAAa,WAAW22C,EAAS,WAAWA,EAAS,eAAeD,EAAQ,YAAYA,EAAQ,GAC/G6B,EAAU,YAAc,YACjCv4C,EAAO,WAAW,MAAM,WAAa,WAAW02C,EAAQ,aAAaA,EAAQ,aAAaA,EAAQ,aAAaA,EAAQ,KAGvH6B,EAAU,aAAeA,EAAU,cAAgB,EAAG,CACxD,MAAMx0C,EAAWw0B,EAAS,WAAWv4B,EAAO,MAAM,QAAQ,EAC1DA,EAAO,MAAM,SAAW+D,EAAWw0C,EAAU,YAAc,KAC3Dv4C,EAAO,MAAM,OAAS,OACtBA,EAAO,MAAM,IAAM,MAC3B,CACUu4C,EAAU,YAAcA,EAAU,aAAe,YAC/CA,EAAU,aAAe,aAC3Bv4C,EAAO,WAAW,MAAM,YAAc,aAEtCA,EAAO,WAAW,MAAM,WAAa42C,GAAQ2B,EAAU,UAAU,EAG3E,CACA,CAQE,eAAe7L,EAAQ,CAIrB,GAHK,MAAM,QAAQA,CAAM,IACvBA,EAAS,CAACA,CAAM,GAEd,OAAOnU,EAAS,QAAW,YAAcmU,EAAO,MAAMpsC,GACjD,CAACA,EAAM,UACf,EACC,OAEF,MAAMqD,EAAO,CAAE,EAGf,QAASrN,EAAI,EAAGA,EAAIo2C,EAAO,OAAQ,EAAEp2C,EAAG,CACtC,MAAMgK,EAAQosC,EAAOp2C,CAAC,EACtB,QAAS+/C,EAAI,EAAGA,EAAI/1C,EAAM,WAAW,OAAQ,EAAE+1C,EAC7C1yC,EAAK,KAAKrD,EAAM,WAAW+1C,CAAC,CAAC,CAErC,CAGI9d,EAAS,OAAO,YAAYA,EAAU50B,EAAM,KAAK,GAAG,EAGpD,QAASrN,EAAI,EAAGA,EAAIo2C,EAAO,OAAQ,EAAEp2C,EAAG,CACtC,MAAMgK,EAAQosC,EAAOp2C,CAAC,EACtB,QAAS+/C,EAAI,EAAGA,EAAI/1C,EAAM,WAAW,OAAQ,EAAE+1C,EAAG,CAChD,MAAMmC,EAAQl4C,EAAM,WAAW+1C,CAAC,EAAE,aAClCtZ,GAASyb,EAAO,qBAAsB,uBAAyBl4C,EAAM,SAAWA,EAAM,SAAWhK,EAAE,EAC/FgK,EAAM,UACRs9B,GAAa4a,EAAO,OAAQl4C,EAAM,QAAQ,CAEpD,CACU,KAAK,QAAQ,mBACf,KAAK,mBAAmBA,CAAK,CAErC,CACA,CACA,CACAglC,EAAY,kBAAkB,mBAAoB6R,EAAgB,EAWlE,MAAMsB,WAAuBnT,CAAY,CAOvC,UAAW,CACT,MAAMoT,EAAU,KAAK,QAAQ,QAAS,EAChCC,EAAa,KAAK,SAASD,EAAU,eAAiB,cAAc,EACpEE,EAAcpc,EAAS,OAAQ,CACnC,UAAW,mBACX,YAAa,KAAK,SAAS,kBAAmB,CAACmc,CAAU,CAAC,CAChE,CAAK,EACKhhC,EAAK,MAAM,SAAS,MAAO,CAC/B,UAAW,sBACX,IAAK,KACX,CAAK,EACD,OAAAA,EAAG,YAAYihC,CAAW,EACnBjhC,CACX,CAKE,sBAAuB,CACrB,KAAK,EAAE,mBAAmB,EAAE,YAAc,KAAK,SAAS,kBAAmB,CAAC,KAAK,QAAQ,QAAS,EAAG,eAAiB,cAAc,CAAC,CACzI,CACA,CACA2tB,EAAY,kBAAkB,iBAAkBmT,EAAc,EAW9D,MAAMI,WAAetC,EAAmB,CAiBtC,SAAS7pC,EAAKyjC,EAAQ,CAAA,EAAItlC,EAAa,CAAA,EAAI,CACzC6B,EAAM,SACNyjC,EAAQ,OAAO,OAAO,CACpB,UAAW,KAAK,cAAa,CAC9B,EAAEA,CAAK,EAGRtlC,EAAa,OAAO,OAAO,CAEzB,KAAM,QACP,EAAEA,CAAU,EACb,MAAM8M,EAAK6kB,EAAS9vB,EAAKyjC,EAAOtlC,CAAU,EAC1C,OAAK,KAAK,QAAQ,SAAS,sBACzB8M,EAAG,YAAY6kB,EAAS,OAAQ,CAC9B,UAAW,sBACnB,EAAS,CACD,cAAe,EACvB,CAAO,CAAC,EAEJ,KAAK,oBAAoB7kB,CAAE,EACpBA,CACX,CAkBE,SAAS4B,EAAO1hB,EAAU,GAAI,CAC5B,MAAMwlC,EAAY,KAAK,YAAY,KACnC,OAAAhE,EAAM,KAAK,+DAA+DgE,CAAS,uDAAuD,EAGnIiI,EAAY,UAAU,SAAS,KAAK,KAAM/rB,EAAO1hB,CAAO,CACnE,CAME,QAAS,CACP,MAAM,OAAQ,EACd,KAAK,IAAI,gBAAgB,UAAU,CACvC,CAME,SAAU,CACR,MAAM,QAAS,EACf,KAAK,IAAI,aAAa,WAAY,UAAU,CAChD,CAWE,cAAcoT,EAAO,CAMnB,GAAIA,EAAM,MAAQ,KAAOA,EAAM,MAAQ,QAAS,CAC9CA,EAAM,gBAAiB,EACvB,MACN,CAGI,MAAM,cAAcA,CAAK,CAC7B,CACA,CACAq6B,EAAY,kBAAkB,SAAUuT,EAAM,EAY9C,MAAMC,WAAsBD,EAAO,CACjC,YAAYtT,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,WAAa,GAClB,KAAK,QAAQ,MAAM,EACnB,KAAK,GAAG,YAAa+D,GAAK,KAAK,gBAAgBA,CAAC,CAAC,CACrD,CAQE,eAAgB,CACd,MAAO,qBACX,CAaE,YAAYqP,EAAO,CACjB,MAAM8tC,EAAc,KAAK,QAAQ,KAAM,EAGvC,GAAI,KAAK,YAAc,YAAa9tC,GAAS,YAAaA,EAAO,CAC/D+/B,GAAe+N,CAAW,EACtB,KAAK,QAAQ,KAAK,EAAI,GACxB,KAAK,QAAQ,KAAK,EAAI,EAAE,MAAO,EAEjC,MACN,CACI,MAAM/H,EAAK,KAAK,QAAQ,SAAS,YAAY,EACvCgI,EAAahI,GAAMA,EAAG,SAAS,YAAY,EACjD,GAAI,CAACgI,EAAY,CACf,KAAK,QAAQ,KAAK,EAAI,EAAE,MAAO,EAC/B,MACN,CACI,MAAMC,EAAY,IAAMD,EAAW,MAAO,EACtCjO,GAAUgO,CAAW,EACvBA,EAAY,KAAKE,EAAW,IAAM,EAAE,EAEpC,KAAK,WAAWA,EAAW,CAAC,CAElC,CAWE,cAAchuC,EAAO,CACnB,KAAK,WAAa,GAClB,MAAM,cAAcA,CAAK,CAC7B,CAUE,gBAAgBA,EAAO,CACrB,KAAK,WAAa,EACtB,CACA,CAQA6tC,GAAc,UAAU,aAAe,aACvCxT,EAAY,kBAAkB,gBAAiBwT,EAAa,EAc5D,MAAMI,WAAoBL,EAAO,CAU/B,YAAYtT,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,QAAQ,QAAQ,EACrB,KAAK,YAAYA,GAAWA,EAAQ,aAAe,KAAK,SAAS,OAAO,CAAC,CAC7E,CAQE,eAAgB,CACd,MAAO,oBAAoB,MAAM,cAAe,CAAA,EACpD,CAeE,YAAYoT,EAAO,CAWjB,KAAK,QAAQ,CACX,KAAM,QACN,QAAS,EACf,CAAK,CACL,CAYE,cAAcA,EAAO,CAEfA,EAAM,MAAQ,UAChBA,EAAM,eAAgB,EACtBA,EAAM,gBAAiB,EACvB,KAAK,QAAQ,OAAO,GAGpB,MAAM,cAAcA,CAAK,CAE/B,CACA,CACAq6B,EAAY,kBAAkB,cAAe4T,EAAW,EAaxD,MAAMC,WAAmBN,EAAO,CAU9B,YAAYtT,EAAQ1tC,EAAU,GAAI,CAChC,MAAM0tC,EAAQ1tC,CAAO,EAGrBA,EAAQ,OAASA,EAAQ,SAAW,QAAaA,EAAQ,OACzD,KAAK,QAAQ,MAAM,EACnB,KAAK,GAAG0tC,EAAQ,OAAQ3pC,GAAK,KAAK,WAAWA,CAAC,CAAC,EAC/C,KAAK,GAAG2pC,EAAQ,QAAS3pC,GAAK,KAAK,YAAYA,CAAC,CAAC,EAC7C/D,EAAQ,QACV,KAAK,GAAG0tC,EAAQ,QAAS3pC,GAAK,KAAK,YAAYA,CAAC,CAAC,CAEvD,CAQE,eAAgB,CACd,MAAO,oBAAoB,MAAM,cAAe,CAAA,EACpD,CAaE,YAAYqP,EAAO,CACb,KAAK,QAAQ,SACf+/B,GAAe,KAAK,QAAQ,MAAM,EAElC,KAAK,QAAQ,MAAO,CAE1B,CAWE,aAAa//B,EAAO,CAClB,KAAK,YAAY,WAAW,EACxB,KAAK,QAAQ,SACf,KAAK,YAAYA,CAAK,EAEtB,KAAK,WAAWA,CAAK,CAE3B,CAUE,WAAWA,EAAO,CAChB,KAAK,YAAY,YAAa,YAAY,EAC1C,KAAK,SAAS,aAAa,EAE3B,KAAK,QAAQ,OAAO,EACpB,KAAK,YAAY,OAAO,CAC5B,CAUE,YAAYA,EAAO,CACjB,KAAK,YAAY,aAAa,EAC9B,KAAK,SAAS,YAAY,EAE1B,KAAK,QAAQ,MAAM,EACnB,KAAK,YAAY,MAAM,CAC3B,CAUE,YAAYA,EAAO,CACjB,KAAK,YAAY,aAAa,EAC9B,KAAK,SAAS,WAAW,EAEzB,KAAK,QAAQ,QAAQ,EACrB,KAAK,YAAY,QAAQ,EAGzB,KAAK,IAAI,KAAK,QAAS,SAAUrP,GAAK,KAAK,aAAaA,CAAC,CAAC,CAC9D,CACA,CAQAu9C,GAAW,UAAU,aAAe,OACpC7T,EAAY,kBAAkB,aAAc6T,EAAU,EAatD,MAAMC,WAAoB9T,CAAY,CAUpC,YAAYC,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,GAAG0tC,EAAQ,CAAC,aAAc,QAAS,SAAS,EAAG3pC,GAAK,KAAK,OAAOA,CAAC,CAAC,EACvE,KAAK,gBAAiB,CAC1B,CAQE,UAAW,CACT,MAAMyhC,EAAY,KAAK,cAAe,EAChC1lB,EAAK,MAAM,SAAS,MAAO,CAC/B,UAAW,GAAG0lB,CAAS,+BAC7B,CAAK,EACKgc,EAAO7c,EAAS,OAAQ,CAC5B,UAAW,mBACX,YAAa,GAAG,KAAK,SAAS,KAAK,UAAU,CAAC,GACpD,EAAO,CACD,KAAM,cACZ,CAAK,EACD,OAAA7kB,EAAG,YAAY0hC,CAAI,EACnB,KAAK,WAAa7c,EAAS,OAAQ,CACjC,UAAW,GAAGa,CAAS,UAC7B,EAAO,CAKD,KAAM,cACZ,CAAK,EACD1lB,EAAG,YAAY,KAAK,UAAU,EACvBA,CACX,CACE,SAAU,CACR,KAAK,WAAa,KAClB,KAAK,UAAY,KACjB,MAAM,QAAS,CACnB,CAQE,OAAO1M,EAAO,CACR,CAAC,KAAK,QAAQ,SAAS,qBAAuBA,EAAM,OAAS,WAGjE,KAAK,cAAcA,CAAK,CAC5B,CASE,gBAAgBihB,EAAO,EAAG,CACxBA,EAAOue,GAAWve,CAAI,EAClB,KAAK,iBAAmBA,IAG5B,KAAK,eAAiBA,EACtB,KAAK,2BAA2B,8BAA+B,IAAM,CACnE,GAAI,CAAC,KAAK,WACR,OAEF,IAAIotB,EAAU,KAAK,UACfA,GAAW,KAAK,WAAW,aAAeA,IAC5CA,EAAU,KACVjgB,EAAM,KAAK,oJAAoJ,GAEjK,KAAK,UAAYvB,EAAW,eAAe,KAAK,cAAc,EACzD,KAAK,YAGNwhB,EACF,KAAK,WAAW,aAAa,KAAK,UAAWA,CAAO,EAEpD,KAAK,WAAW,YAAY,KAAK,SAAS,EAElD,CAAK,EACL,CAWE,cAAcruC,EAAO,CAAA,CACvB,CAQAmuC,GAAY,UAAU,WAAa,OAUnCA,GAAY,UAAU,aAAe,OACrC9T,EAAY,kBAAkB,cAAe8T,EAAW,EAWxD,MAAMG,WAA2BH,EAAY,CAO3C,eAAgB,CACd,MAAO,kBACX,CAUE,cAAcnuC,EAAO,CAEnB,IAAIihB,EACA,KAAK,QAAQ,QACfA,EAAO,KAAK,QAAQ,SAAU,EAE9BA,EAAO,KAAK,QAAQ,UAAW,EAAG,KAAK,QAAQ,SAAU,EAAC,YAAc,KAAK,QAAQ,YAAa,EAEpG,KAAK,gBAAgBA,CAAI,CAC7B,CACA,CAQAqtB,GAAmB,UAAU,WAAa,eAU1CA,GAAmB,UAAU,aAAe,eAC5CjU,EAAY,kBAAkB,qBAAsBiU,EAAkB,EAatE,MAAMC,WAAwBJ,EAAY,CAUxC,YAAY7T,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,MAAM4hD,EAAgB79C,GAAK,KAAK,cAAcA,CAAC,EAK/C,KAAK,GAAG2pC,EAAQ,iBAAkBkU,CAAa,EAK/C,KAAK,GAAGlU,EAAQ,YAAakU,CAAa,EAK1C,KAAK,GAAGlU,EAAQ,iBAAkBkU,CAAa,CACnD,CAQE,eAAgB,CACd,MAAO,cACX,CAaE,cAAcxuC,EAAO,CACnB,MAAM+Z,EAAW,KAAK,QAAQ,SAAU,EACxC,KAAK,gBAAgBA,CAAQ,CACjC,CACA,CAQAw0B,GAAgB,UAAU,WAAa,WAUvCA,GAAgB,UAAU,aAAe,WACzClU,EAAY,kBAAkB,kBAAmBkU,EAAe,EAYhE,MAAME,WAAoBpU,CAAY,CAOpC,UAAW,CACT,MAAM3tB,EAAK,MAAM,SAAS,MAAO,CAC/B,UAAW,mCACjB,EAAO,CAID,cAAe,EACrB,CAAK,EACKhX,EAAM,MAAM,SAAS,KAAK,EAC1B04C,EAAO,MAAM,SAAS,OAAQ,CAClC,YAAa,GACnB,CAAK,EACD,OAAA14C,EAAI,YAAY04C,CAAI,EACpB1hC,EAAG,YAAYhX,CAAG,EACXgX,CACX,CACA,CACA2tB,EAAY,kBAAkB,cAAeoU,EAAW,EAaxD,MAAMC,WAA6BP,EAAY,CAU7C,YAAY7T,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,GAAG0tC,EAAQ,iBAAkB3pC,GAAK,KAAK,cAAcA,CAAC,CAAC,CAChE,CAQE,eAAgB,CACd,MAAO,oBACX,CAQE,UAAW,CACT,MAAM+b,EAAK,MAAM,SAAU,EAC3B,OAAI,KAAK,SAAS,kBAAoB,IACpCA,EAAG,aAAa6kB,EAAS,OAAQ,CAAA,EAAI,CACnC,cAAe,EACvB,EAAS,GAAG,EAAG,KAAK,UAAU,EAEnB7kB,CACX,CAWE,cAAc1M,EAAO,CACnB,GAAI,OAAO,KAAK,QAAQ,SAAQ,GAAO,SACrC,OAEF,IAAIihB,EAIA,KAAK,QAAQ,QACfA,EAAO,EACE,KAAK,QAAQ,qBACtBA,EAAO,KAAK,QAAQ,qBAAsB,EAE1CA,EAAO,KAAK,QAAQ,cAAe,EAErC,KAAK,gBAAgBA,CAAI,CAC7B,CACA,CAQAytB,GAAqB,UAAU,WAAa,iBAU5CA,GAAqB,UAAU,aAAe,iBAC9CrU,EAAY,kBAAkB,uBAAwBqU,EAAoB,EAe1E,MAAMC,WAAoBtU,CAAY,CAUpC,YAAYC,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,cAAe,EACpB,KAAK,GAAG,KAAK,OAAQ,EAAE,iBAAkB+D,GAAK,KAAK,cAAcA,CAAC,CAAC,CACvE,CAQE,UAAW,CACT,MAAM+b,EAAK,MAAM,SAAS,MAAO,CAC/B,UAAW,8BACjB,CAAK,EACD,YAAK,WAAa6kB,EAAS,MAAO,CAChC,UAAW,kBACjB,EAAO,CACD,YAAa,KACnB,CAAK,EACD,KAAK,WAAW,YAAYA,EAAS,OAAQ,CAC3C,UAAW,mBACX,YAAa,GAAG,KAAK,SAAS,aAAa,CAAC,GAClD,CAAK,CAAC,EACF,KAAK,WAAW,YAAY1E,EAAW,eAAe,KAAK,SAAS,MAAM,CAAC,CAAC,EAC5EngB,EAAG,YAAY,KAAK,UAAU,EACvBA,CACX,CACE,SAAU,CACR,KAAK,WAAa,KAClB,MAAM,QAAS,CACnB,CAWE,cAAc1M,EAAO,CACf,KAAK,OAAM,EAAG,SAAQ,IAAO,IAC/B,KAAK,KAAM,EAEX,KAAK,KAAM,CAEjB,CACA,CACAq6B,EAAY,kBAAkB,cAAesU,EAAW,EAaxD,MAAMC,WAAmBhB,EAAO,CAU9B,YAAYtT,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,qBAAsB,EACvB,KAAK,QAAQ,cACf,KAAK,6BAA+B+D,GAAK,KAAK,qBAAqBA,CAAC,EACpE,KAAK,GAAG,KAAK,QAAQ,YAAa,iBAAkB,KAAK,4BAA4B,EAE3F,CAQE,UAAW,CACT,MAAM+b,EAAK,MAAM,SAAS,SAAU,CAClC,UAAW,sCACjB,CAAK,EACD,YAAK,QAAQ,SAAUA,CAAE,EACzB,KAAK,QAAU6kB,EAAS,OAAQ,CAC9B,UAAW,wBACX,YAAa,KAAK,SAAS,MAAM,CACvC,EAAO,CACD,cAAe,MACrB,CAAK,EACD7kB,EAAG,YAAY,KAAK,OAAO,EACpBA,CACX,CAME,sBAAuB,CAEjB,CAAC,KAAK,QAAQ,aAAe,KAAK,QAAQ,YAAY,cACxD,KAAK,aAAa,gBAAiB,EAAI,EACvC,KAAK,SAAS,kBAAkB,EAChC,KAAK,YAAY,sCAAsC,IAEvD,KAAK,aAAa,gBAAiB,EAAK,EACxC,KAAK,YAAY,kBAAkB,EACnC,KAAK,YAAY,qCAAqC,EAE5D,CAOE,aAAc,CACZ,KAAK,QAAQ,YAAY,eAAgB,CAC7C,CAKE,SAAU,CACJ,KAAK,QAAQ,aACf,KAAK,IAAI,KAAK,QAAQ,YAAa,iBAAkB,KAAK,4BAA4B,EAExF,KAAK,QAAU,KACf,MAAM,QAAS,CACnB,CACA,CAOAkiC,GAAW,UAAU,aAAe,uCACpCvU,EAAY,kBAAkB,aAAcuU,EAAU,EAqBtD,SAASC,GAAMhoC,EAAQioC,EAAK7nC,EAAK,CAC/B,OAAAJ,EAAS,OAAOA,CAAM,EACf,KAAK,IAAII,EAAK,KAAK,IAAI6nC,EAAK,MAAMjoC,CAAM,EAAIioC,EAAMjoC,CAAM,CAAC,CAClE,CAEA,IAAIkoC,GAAmB,OAAO,OAAO,CACnC,UAAW,KACX,MAAOF,EACT,CAAC,EAcD,MAAMG,WAAe3U,CAAY,CAU/B,YAAYC,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,iBAAmB+D,GAAK,KAAK,gBAAgBA,CAAC,EACnD,KAAK,eAAiBA,GAAK,KAAK,cAAcA,CAAC,EAC/C,KAAK,eAAiBA,GAAK,KAAK,cAAcA,CAAC,EAC/C,KAAK,aAAeA,GAAK,KAAK,YAAYA,CAAC,EAC3C,KAAK,iBAAmBA,GAAK,KAAK,gBAAgBA,CAAC,EACnD,KAAK,QAAUA,GAAK,KAAK,OAAOA,CAAC,EAGjC,KAAK,IAAM,KAAK,SAAS,KAAK,SAAS,OAAO,EAG9C,KAAK,SAAS,CAAC,CAAC,KAAK,SAAS,QAAQ,EACtC,KAAK,OAAQ,CACjB,CAQE,SAAU,CACR,OAAO,KAAK,QAChB,CAKE,QAAS,CACH,KAAK,YAGT,KAAK,GAAG,YAAa,KAAK,gBAAgB,EAC1C,KAAK,GAAG,aAAc,KAAK,gBAAgB,EAC3C,KAAK,GAAG,UAAW,KAAK,cAAc,EACtC,KAAK,GAAG,QAAS,KAAK,YAAY,EAGlC,KAAK,GAAG,KAAK,QAAS,kBAAmB,KAAK,MAAM,EAChD,KAAK,aACP,KAAK,GAAG,KAAK,QAAS,KAAK,YAAa,KAAK,MAAM,EAErD,KAAK,YAAY,UAAU,EAC3B,KAAK,aAAa,WAAY,CAAC,EAC/B,KAAK,SAAW,GACpB,CAKE,SAAU,CACR,GAAI,CAAC,KAAK,UACR,OAEF,MAAMkc,EAAM,KAAK,IAAI,IAAI,cACzB,KAAK,IAAI,YAAa,KAAK,gBAAgB,EAC3C,KAAK,IAAI,aAAc,KAAK,gBAAgB,EAC5C,KAAK,IAAI,UAAW,KAAK,cAAc,EACvC,KAAK,IAAI,QAAS,KAAK,YAAY,EACnC,KAAK,IAAI,KAAK,QAAS,kBAAmB,KAAK,OAAO,EACtD,KAAK,IAAIA,EAAK,YAAa,KAAK,gBAAgB,EAChD,KAAK,IAAIA,EAAK,UAAW,KAAK,cAAc,EAC5C,KAAK,IAAIA,EAAK,YAAa,KAAK,gBAAgB,EAChD,KAAK,IAAIA,EAAK,WAAY,KAAK,cAAc,EAC7C,KAAK,gBAAgB,UAAU,EAC/B,KAAK,SAAS,UAAU,EACpB,KAAK,aACP,KAAK,IAAI,KAAK,QAAS,KAAK,YAAa,KAAK,MAAM,EAEtD,KAAK,SAAW,EACpB,CAiBE,SAAShhB,EAAMq5C,EAAQ,CAAA,EAAItlC,EAAa,CAAA,EAAI,CAE1C,OAAAslC,EAAM,UAAYA,EAAM,UAAY,cACpCA,EAAQ,OAAO,OAAO,CACpB,SAAU,CACX,EAAEA,CAAK,EACRtlC,EAAa,OAAO,OAAO,CACzB,KAAQ,SACR,gBAAiB,EACjB,gBAAiB,EACjB,gBAAiB,GAClB,EAAEA,CAAU,EACN,MAAM,SAAS/T,EAAMq5C,EAAOtlC,CAAU,CACjD,CAYE,gBAAgBI,EAAO,CACrB,MAAM6M,EAAM,KAAK,IAAI,IAAI,cACrB7M,EAAM,OAAS,aACjBA,EAAM,eAAgB,EAMpBA,EAAM,OAAS,cAAgB,CAAC0vB,IAClC1vB,EAAM,eAAgB,EAExB6yB,GAAoB,EACpB,KAAK,SAAS,aAAa,EAO3B,KAAK,QAAQ,cAAc,EAC3B,KAAK,GAAGhmB,EAAK,YAAa,KAAK,gBAAgB,EAC/C,KAAK,GAAGA,EAAK,UAAW,KAAK,cAAc,EAC3C,KAAK,GAAGA,EAAK,YAAa,KAAK,gBAAgB,EAC/C,KAAK,GAAGA,EAAK,WAAY,KAAK,cAAc,EAC5C,KAAK,gBAAgB7M,EAAO,EAAI,CACpC,CAgBE,gBAAgBA,EAAO,CAAA,CAYvB,cAAcA,EAAO,CACnB,MAAM6M,EAAM,KAAK,IAAI,IAAI,cACzBimB,GAAsB,EACtB,KAAK,YAAY,aAAa,EAO9B,KAAK,QAAQ,gBAAgB,EAC7B,KAAK,IAAIjmB,EAAK,YAAa,KAAK,gBAAgB,EAChD,KAAK,IAAIA,EAAK,UAAW,KAAK,cAAc,EAC5C,KAAK,IAAIA,EAAK,YAAa,KAAK,gBAAgB,EAChD,KAAK,IAAIA,EAAK,WAAY,KAAK,cAAc,EAC7C,KAAK,OAAQ,CACjB,CASE,QAAS,CAKP,GAAI,CAAC,KAAK,KAAO,CAAC,KAAK,IACrB,OAKF,MAAMoiC,EAAW,KAAK,YAAa,EACnC,OAAIA,IAAa,KAAK,YAGtB,KAAK,UAAYA,EACjB,KAAK,2BAA2B,gBAAiB,IAAM,CAErD,MAAMC,EAAU,KAAK,SAAU,EAAG,SAAW,QAG7C,KAAK,IAAI,GAAI,EAAC,MAAMA,CAAO,GAAKD,EAAW,KAAK,QAAQ,CAAC,EAAI,GACnE,CAAK,GACMA,CACX,CASE,aAAc,CACZ,OAAO,OAAOJ,GAAM,KAAK,WAAU,EAAI,EAAG,CAAC,EAAE,QAAQ,CAAC,CAAC,CAC3D,CAaE,kBAAkB7uC,EAAO,CACvB,MAAMhI,EAAWo7B,GAAmB,KAAK,IAAKpzB,CAAK,EACnD,OAAI,KAAK,WACAhI,EAAS,EAEXA,EAAS,CACpB,CAYE,cAAcgI,EAAO,CACnB,MAAMmvC,EAAoB,KAAK,SAAS,cAAc,kBAChDC,EAAoBD,GAAqBA,EAAkB,QAC3DE,EAAiBF,GAAqBA,EAAkB,eAC1DC,EACEC,GAAkBrvC,EAAM,MAAQ,aAAe,CAACqvC,GAAkBrvC,EAAM,MAAQ,aAClFA,EAAM,eAAgB,EACtBA,EAAM,gBAAiB,EACvB,KAAK,SAAU,GACNqvC,GAAkBrvC,EAAM,MAAQ,cAAgB,CAACqvC,GAAkBrvC,EAAM,MAAQ,WAC1FA,EAAM,eAAgB,EACtBA,EAAM,gBAAiB,EACvB,KAAK,YAAa,GAElB,MAAM,cAAcA,CAAK,EAIlBA,EAAM,MAAQ,aAAeA,EAAM,MAAQ,aACpDA,EAAM,eAAgB,EACtBA,EAAM,gBAAiB,EACvB,KAAK,SAAU,GAGNA,EAAM,MAAQ,WAAaA,EAAM,MAAQ,cAClDA,EAAM,eAAgB,EACtBA,EAAM,gBAAiB,EACvB,KAAK,YAAa,GAGlB,MAAM,cAAcA,CAAK,CAE/B,CASE,YAAYA,EAAO,CACjBA,EAAM,gBAAiB,EACvBA,EAAM,eAAgB,CAC1B,CAaE,SAASsvC,EAAM,CACb,GAAIA,IAAS,OACX,OAAO,KAAK,WAAa,GAE3B,KAAK,UAAY,CAAC,CAACA,EACf,KAAK,UACP,KAAK,SAAS,qBAAqB,EAEnC,KAAK,SAAS,uBAAuB,CAE3C,CACA,CACAjV,EAAY,kBAAkB,SAAU2U,EAAM,EAS9C,MAAMO,GAAa,CAACtuB,EAAMpP,IAAQg9B,GAAM5tB,EAAOpP,EAAM,IAAK,EAAG,GAAG,EAAE,QAAQ,CAAC,EAAI,IAO/E,MAAM29B,WAAwBnV,CAAY,CAUxC,YAAYC,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,SAAW,CAAE,EAClB,KAAK,GAAG0tC,EAAQ,WAAY3pC,GAAK,KAAK,OAAOA,CAAC,CAAC,CACnD,CAQE,UAAW,CACT,MAAM+b,EAAK,MAAM,SAAS,MAAO,CAC/B,UAAW,mBACjB,CAAK,EACK8f,EAAU+E,EAAS,OAAQ,CAC/B,UAAW,kBACjB,CAAK,EACKke,EAAale,EAAS,OAAQ,CAClC,YAAa,KAAK,SAAS,QAAQ,CACzC,CAAK,EACKme,EAAY7iB,EAAW,eAAe,IAAI,EAChD,YAAK,cAAgB0E,EAAS,OAAQ,CACpC,UAAW,qCACX,YAAa,IACnB,CAAK,EACD7kB,EAAG,YAAY8f,CAAO,EACtBA,EAAQ,YAAYijB,CAAU,EAC9BjjB,EAAQ,YAAYkjB,CAAS,EAC7BljB,EAAQ,YAAY,KAAK,aAAa,EAC/B9f,CACX,CACE,SAAU,CACR,KAAK,SAAW,KAChB,KAAK,cAAgB,KACrB,MAAM,QAAS,CACnB,CAUE,OAAO1M,EAAO,CACZ,KAAK,2BAA2B,yBAA0B,IAAM,CAC9D,MAAM2vC,EAAc,KAAK,QAAQ,YAC3BhQ,EAAW,KAAK,QAAQ,SAAU,EAClC5lB,EAAW41B,GAAeA,EAAY,OAAQ,EAAGA,EAAY,cAAgB,KAAK,QAAQ,SAAU,EACpGC,EAAc,KAAK,QAAQ,YAAa,EACxCjU,EAAW,KAAK,SAChBkU,EAAUN,GAAWK,EAAa71B,CAAQ,EAC5C,KAAK,WAAa81B,IAEpB,KAAK,IAAI,MAAM,MAAQA,EAEvBpe,GAAY,KAAK,cAAeoe,CAAO,EACvC,KAAK,SAAWA,GAIlB,QAASxkD,EAAI,EAAGA,EAAIs0C,EAAS,OAAQt0C,IAAK,CACxC,MAAMumB,EAAQ+tB,EAAS,MAAMt0C,CAAC,EACxBwmB,EAAM8tB,EAAS,IAAIt0C,CAAC,EAC1B,IAAI4X,EAAO04B,EAAStwC,CAAC,EAChB4X,IACHA,EAAO,KAAK,IAAI,YAAYsuB,EAAQ,CAAE,EACtCoK,EAAStwC,CAAC,EAAI4X,GAIZ,EAAAA,EAAK,QAAQ,QAAU2O,GAAS3O,EAAK,QAAQ,MAAQ4O,KAGzD5O,EAAK,QAAQ,MAAQ2O,EACrB3O,EAAK,QAAQ,IAAM4O,EAGnB5O,EAAK,MAAM,KAAOssC,GAAW39B,EAAOg+B,CAAW,EAC/C3sC,EAAK,MAAM,MAAQssC,GAAW19B,EAAMD,EAAOg+B,CAAW,EAC9D,CAGM,QAASvkD,EAAIswC,EAAS,OAAQtwC,EAAIs0C,EAAS,OAAQt0C,IACjD,KAAK,IAAI,YAAYswC,EAAStwC,EAAI,CAAC,CAAC,EAEtCswC,EAAS,OAASgE,EAAS,MACjC,CAAK,CACL,CACA,CACAtF,EAAY,kBAAkB,kBAAmBmV,EAAe,EAahE,MAAMM,WAAoBzV,CAAY,CAUpC,YAAYC,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,OAAS6qC,GAASH,GAAM,KAAM,KAAK,MAAM,EAAGD,EAAuB,CAC5E,CAQE,UAAW,CACT,OAAO,MAAM,SAAS,MAAO,CAC3B,UAAW,kBACjB,EAAO,CACD,cAAe,MACrB,CAAK,CACL,CAYE,OAAO0Y,EAAaC,EAAcxe,EAAS,CACzC,MAAMye,EAAc/c,GAAa,KAAK,GAAG,EACnCgd,EAAand,GAAsB,KAAK,QAAQ,GAAE,CAAE,EACpDod,EAAiBJ,EAAY,MAAQC,EAI3C,GAAI,CAACE,GAAc,CAACD,EAClB,OAOF,IAAIG,EAAmBL,EAAY,KAAOG,EAAW,KAAOC,EAMxDE,EAAoBN,EAAY,MAAQI,GAAkBD,EAAW,MAAQH,EAAY,OAOxFM,IACHA,EAAoBN,EAAY,MAAQI,EACxCC,EAAmBD,GAIrB,IAAIG,EAAgBL,EAAY,MAAQ,EAIpCG,EAAmBE,EACrBA,GAAiBA,EAAgBF,EACxBC,EAAoBC,IAC7BA,EAAgBD,GAMdC,EAAgB,EAClBA,EAAgB,EACPA,EAAgBL,EAAY,QACrCK,EAAgBL,EAAY,OAO9BK,EAAgB,KAAK,MAAMA,CAAa,EACxC,KAAK,IAAI,MAAM,MAAQ,IAAIA,CAAa,KACxC,KAAK,MAAM9e,CAAO,CACtB,CAQE,MAAMA,EAAS,CACbC,GAAY,KAAK,IAAKD,CAAO,CACjC,CAmBE,WAAWue,EAAaC,EAAc/uB,EAAM8kB,EAAI,CAC9C,KAAK,2BAA2B,yBAA0B,IAAM,CAC9D,IAAIvU,EACJ,MAAMzX,EAAW,KAAK,QAAQ,SAAU,EACxC,GAAI,KAAK,QAAQ,aAAe,KAAK,QAAQ,YAAY,SAAU,CACjE,MAAMw2B,EAAa,KAAK,QAAQ,YAAY,WAAY,EAClDC,EAAgBD,EAAaP,EAAeO,EAClD/e,GAAWgf,EAAgB,EAAI,GAAK,KAAOhR,GAAWgR,EAAeD,CAAU,CACvF,MACQ/e,EAAUgO,GAAWve,EAAMlH,CAAQ,EAErC,KAAK,OAAOg2B,EAAaC,EAAcxe,CAAO,EAC1CuU,GACFA,EAAI,CAEZ,CAAK,CACL,CACA,CACA1L,EAAY,kBAAkB,cAAeyV,EAAW,EAYxD,MAAMW,WAAwBpW,CAAY,CAUxC,YAAYC,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,QAAQ,QAAQ,EACrB,KAAK,OAAS6qC,GAASH,GAAM,KAAM,KAAK,MAAM,EAAGD,EAAuB,CAC5E,CAQE,UAAW,CACT,OAAO,MAAM,SAAS,MAAO,CAC3B,UAAW,kCACjB,EAAO,CACD,cAAe,MACrB,CAAK,CACL,CAaE,OAAO0Y,EAAaC,EAAc,CAChC,MAAMU,EAAc,KAAK,SAAS,aAAa,EAC/C,GAAI,CAACA,EACH,OAEF,MAAMzvB,EAAO,KAAK,QAAQ,UAAW,EAAG,KAAK,QAAQ,SAAU,EAAC,YAAc,KAAK,QAAQ,YAAa,EACxGyvB,EAAY,WAAWX,EAAaC,EAAc/uB,CAAI,CAC1D,CACA,CAQAwvB,GAAgB,UAAU,SAAW,CACnC,SAAU,CAAA,CACZ,EAGI,CAAC7f,IAAU,CAACvB,IACdohB,GAAgB,UAAU,SAAS,SAAS,KAAK,aAAa,EAEhEpW,EAAY,kBAAkB,kBAAmBoW,EAAe,EAchE,MAAME,WAAyBtW,CAAY,CAUzC,YAAYC,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,OAAS6qC,GAASH,GAAM,KAAM,KAAK,MAAM,EAAGD,EAAuB,CAC5E,CAQE,UAAW,CACT,OAAO,MAAM,SAAS,MAAO,CAC3B,UAAW,mBACjB,CAAK,CACL,CAaE,OAAO0Y,EAAaC,EAAc,CAChC,MAAM/uB,EAAO+uB,EAAe,KAAK,QAAQ,SAAU,EACnD,KAAK,SAAS,aAAa,EAAE,WAAWD,EAAaC,EAAc/uB,EAAM,IAAM,CAC7E,KAAK,IAAI,MAAM,KAAO,GAAG8uB,EAAY,MAAQC,CAAY,IAC/D,CAAK,CACL,CACA,CAQAW,GAAiB,UAAU,SAAW,CACpC,SAAU,CAAC,aAAa,CAC1B,EACAtW,EAAY,kBAAkB,mBAAoBsW,EAAgB,EAOlE,MAAMC,GAAe,EAGfC,GAAsB,GAQ5B,MAAMC,WAAgB9B,EAAO,CAU3B,YAAY1U,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,kBAAmB,CAC5B,CAOE,mBAAoB,CAClB,KAAK,QAAU0qC,GAAM,KAAM,KAAK,MAAM,EACtC,KAAK,OAASG,GAAS,KAAK,QAASJ,EAAuB,EAC5D,KAAK,GAAG,KAAK,QAAS,CAAC,iBAAkB,YAAY,EAAG,KAAK,MAAM,EACnE,KAAK,GAAG,KAAK,QAAS,CAAC,OAAO,EAAG,KAAK,OAAO,EACzC,KAAK,QAAQ,aACf,KAAK,GAAG,KAAK,QAAQ,YAAa,iBAAkB,KAAK,MAAM,EAKjE,KAAK,eAAiB,KACtB,KAAK,uBAAyB,GAAK,KAAK,gBAAgB,CAAC,EACzD,KAAK,wBAA0B,GAAK,KAAK,iBAAiB,CAAC,EAC3D,KAAK,GAAG,KAAK,QAAS,CAAC,SAAS,EAAG,KAAK,sBAAsB,EAC9D,KAAK,GAAG,KAAK,QAAS,CAAC,QAAS,QAAS,SAAS,EAAG,KAAK,uBAAuB,EAI7E,WAAYxK,GAAc,oBAAqBA,GACjD,KAAK,GAAGA,EAAY,mBAAoB,KAAK,iBAAiB,CAEpE,CACE,kBAAkB,EAAG,CACfA,EAAW,kBAAoB,UACjC,KAAK,0BAA0B,gBAAgB,EAC/C,KAAK,0BAA0B,eAAe,EAC9C,KAAK,iBAAiB,CAAC,IAEnB,CAAC,KAAK,QAAQ,MAAK,GAAM,CAAC,KAAK,QAAQ,UACzC,KAAK,gBAAiB,EAIxB,KAAK,OAAQ,EAEnB,CACE,iBAAkB,CACZ,KAAK,iBAGT,KAAK,eAAiB,KAAK,YAAY,KAAK,OAAQwK,EAAuB,EAC/E,CACE,iBAAiB,EAAG,CACd,KAAK,QAAQ,aAAe,KAAK,QAAQ,YAAY,OAAQ,GAAI,GAAK,EAAE,OAAS,SAGhF,KAAK,iBAGV,KAAK,cAAc,KAAK,cAAc,EACtC,KAAK,eAAiB,KAC1B,CAQE,UAAW,CACT,OAAO,MAAM,SAAS,MAAO,CAC3B,UAAW,qBACjB,EAAO,CACD,aAAc,KAAK,SAAS,cAAc,CAChD,CAAK,CACL,CAcE,OAAOr3B,EAAO,CAEZ,GAAI6sB,EAAW,kBAAoB,SACjC,OAEF,MAAMgjB,EAAU,MAAM,OAAQ,EAC9B,YAAK,2BAA2B,iBAAkB,IAAM,CACtD,MAAMkB,EAAc,KAAK,QAAQ,MAAO,EAAG,KAAK,QAAQ,SAAQ,EAAK,KAAK,gBAAiB,EACrFpB,EAAc,KAAK,QAAQ,YACjC,IAAI51B,EAAW,KAAK,QAAQ,SAAU,EAClC41B,GAAeA,EAAY,WAC7B51B,EAAW,KAAK,QAAQ,YAAY,gBAAiB,GAEnD,KAAK,WAAa81B,IAEpB,KAAK,IAAI,aAAa,iBAAkBA,EAAU,KAAK,QAAQ,CAAC,CAAC,EACjE,KAAK,SAAWA,IAEd,KAAK,eAAiBkB,GAAe,KAAK,YAAch3B,KAE1D,KAAK,IAAI,aAAa,iBAAkB,KAAK,SAAS,oDAAqD,CAACylB,GAAWuR,EAAah3B,CAAQ,EAAGylB,GAAWzlB,EAAUA,CAAQ,CAAC,EAAG,YAAY,CAAC,EAC7L,KAAK,aAAeg3B,EACpB,KAAK,UAAYh3B,GAIf,KAAK,KACP,KAAK,IAAI,OAAOgZ,GAAsB,KAAK,IAAI,EAAG,KAAK,aAAa,CAE5E,CAAK,EACM8c,CACX,CASE,UAAU5L,EAAI,CACR,KAAK,QAAQ,aAAe,KAAK,QAAQ,YAAY,UACvD,KAAK,QAAQ,YAAY,mBAAoB,EAE/C,KAAK,QAAQ,YAAYA,CAAE,CAC/B,CAWE,iBAAkB,CAChB,OAAO,KAAK,QAAQ,UAAS,EAAK,KAAK,QAAQ,SAAQ,EAAG,YAAc,KAAK,QAAQ,YAAa,CACtG,CAQE,YAAa,CACX,MAAM8M,EAAc,KAAK,gBAAiB,EAC1C,IAAIlB,EACJ,MAAMF,EAAc,KAAK,QAAQ,YACjC,OAAIA,GAAeA,EAAY,UAC7BE,GAAWkB,EAAcpB,EAAY,cAAe,GAAIA,EAAY,WAAY,EAG5EA,EAAY,eACdE,EAAU,IAGZA,EAAUkB,EAAc,KAAK,QAAQ,SAAU,EAE1ClB,CACX,CAUE,gBAAgB7vC,EAAO,CAChBi0B,GAAkBj0B,CAAK,IAK5BA,EAAM,gBAAiB,EACvB,KAAK,gBAAkB,CAAC,KAAK,QAAQ,OAAQ,EAC7C,KAAK,QAAQ,MAAO,EACpB,MAAM,gBAAgBA,CAAK,EAC/B,CAWE,gBAAgBA,EAAOgxC,EAAY,GAAO,CACxC,GAAI,CAAC/c,GAAkBj0B,CAAK,GAAK,MAAM,KAAK,QAAQ,SAAQ,CAAE,EAC5D,OAEE,CAACgxC,GAAa,CAAC,KAAK,QAAQ,UAAS,GACvC,KAAK,QAAQ,UAAU,EAAI,EAE7B,IAAIC,EACJ,MAAMvG,EAAW,KAAK,kBAAkB1qC,CAAK,EACvC2vC,EAAc,KAAK,QAAQ,YACjC,GAAI,CAACA,GAAe,CAACA,EAAY,OAAM,EACrCsB,EAAUvG,EAAW,KAAK,QAAQ,SAAU,EAGxCuG,IAAY,KAAK,QAAQ,SAAQ,IACnCA,EAAUA,EAAU,QAEjB,CACL,GAAIvG,GAAY,IAAM,CACpBiF,EAAY,eAAgB,EAC5B,MACR,CACM,MAAMuB,EAAgBvB,EAAY,cAAe,EAC3CwB,EAAcxB,EAAY,gBAAiB,EAiBjD,GAhBAsB,EAAUC,EAAgBxG,EAAWiF,EAAY,WAAY,EAGzDsB,GAAWE,IACbF,EAAUE,GAKRF,GAAWC,IACbD,EAAUC,EAAgB,IAMxBD,IAAY,IACd,MAER,CAGI,KAAK,UAAUA,CAAO,EAClB,KAAK,QAAQ,SAAS,qBACxB,KAAK,OAAQ,CAEnB,CACE,QAAS,CACP,MAAM,OAAQ,EACd,MAAMG,EAAmB,KAAK,SAAS,kBAAkB,EACpDA,GAGLA,EAAiB,KAAM,CAC3B,CACE,SAAU,CACR,MAAM,QAAS,EACf,MAAMA,EAAmB,KAAK,SAAS,kBAAkB,EACpDA,GAGLA,EAAiB,KAAM,CAC3B,CAUE,cAAcpxC,EAAO,CACnB,MAAM,cAAcA,CAAK,EAGrBA,GACFA,EAAM,gBAAiB,EAEzB,KAAK,QAAQ,UAAU,EAAK,EAS5B,KAAK,QAAQ,QAAQ,CACnB,KAAM,aACN,OAAQ,KACR,kBAAmB,EACzB,CAAK,EACG,KAAK,gBACP+/B,GAAe,KAAK,QAAQ,MAAM,EAIlC,KAAK,QAAS,CAEpB,CAKE,aAAc,CACZ,KAAK,UAAU,KAAK,QAAQ,YAAW,EAAK6Q,EAAY,CAC5D,CAKE,UAAW,CACT,KAAK,UAAU,KAAK,QAAQ,YAAW,EAAKA,EAAY,CAC5D,CAUE,aAAa5wC,EAAO,CACd,KAAK,QAAQ,SACf,KAAK,QAAQ,KAAM,EAEnB,KAAK,QAAQ,MAAO,CAE1B,CAkBE,cAAcA,EAAO,CACnB,MAAM2vC,EAAc,KAAK,QAAQ,YACjC,GAAI3vC,EAAM,MAAQ,KAAOA,EAAM,MAAQ,QACrCA,EAAM,eAAgB,EACtBA,EAAM,gBAAiB,EACvB,KAAK,aAAaA,CAAK,UACdA,EAAM,MAAQ,OACvBA,EAAM,eAAgB,EACtBA,EAAM,gBAAiB,EACvB,KAAK,UAAU,CAAC,UACPA,EAAM,MAAQ,MACvBA,EAAM,eAAgB,EACtBA,EAAM,gBAAiB,EACnB2vC,GAAeA,EAAY,SAC7B,KAAK,UAAUA,EAAY,iBAAiB,EAE5C,KAAK,UAAU,KAAK,QAAQ,SAAQ,CAAE,UAE/B,UAAU,KAAK3vC,EAAM,GAAG,EAAG,CACpCA,EAAM,eAAgB,EACtBA,EAAM,gBAAiB,EACvB,MAAMqxC,EAAe,SAASrxC,EAAM,IAAK,EAAE,EAAI,GAC3C2vC,GAAeA,EAAY,SAC7B,KAAK,UAAUA,EAAY,cAAe,EAAGA,EAAY,WAAY,EAAG0B,CAAY,EAEpF,KAAK,UAAU,KAAK,QAAQ,SAAQ,EAAKA,CAAY,CAE7D,MAAerxC,EAAM,MAAQ,YACvBA,EAAM,eAAgB,EACtBA,EAAM,gBAAiB,EACvB,KAAK,UAAU,KAAK,QAAQ,YAAa,EAAG4wC,GAAeC,EAAmB,GACrE7wC,EAAM,MAAQ,UACvBA,EAAM,eAAgB,EACtBA,EAAM,gBAAiB,EACvB,KAAK,UAAU,KAAK,QAAQ,YAAa,EAAG4wC,GAAeC,EAAmB,GAG9E,MAAM,cAAc7wC,CAAK,CAE/B,CACE,SAAU,CACR,KAAK,iBAAkB,EACvB,KAAK,IAAI,KAAK,QAAS,CAAC,iBAAkB,YAAY,EAAG,KAAK,MAAM,EACpE,KAAK,IAAI,KAAK,QAAS,CAAC,OAAO,EAAG,KAAK,OAAO,EAC1C,KAAK,QAAQ,aACf,KAAK,IAAI,KAAK,QAAQ,YAAa,iBAAkB,KAAK,MAAM,EAElE,KAAK,IAAI,KAAK,QAAS,CAAC,SAAS,EAAG,KAAK,sBAAsB,EAC/D,KAAK,IAAI,KAAK,QAAS,CAAC,QAAS,QAAS,SAAS,EAAG,KAAK,uBAAuB,EAI9E,WAAY6sB,GAAc,oBAAqBA,GACjD,KAAK,IAAIA,EAAY,mBAAoB,KAAK,iBAAiB,EAEjE,MAAM,QAAS,CACnB,CACA,CAQAikB,GAAQ,UAAU,SAAW,CAC3B,SAAU,CAAC,kBAAmB,iBAAiB,EAC/C,QAAS,iBACX,EAGI,CAAClgB,IAAU,CAACvB,IACdyhB,GAAQ,UAAU,SAAS,SAAS,OAAO,EAAG,EAAG,kBAAkB,EAErEzW,EAAY,kBAAkB,UAAWyW,EAAO,EAYhD,MAAMQ,WAAwBjX,CAAY,CAUxC,YAAYC,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,gBAAkB6qC,GAASH,GAAM,KAAM,KAAK,eAAe,EAAGD,EAAuB,EAC1F,KAAK,yBAA2BI,GAASH,GAAM,KAAM,KAAK,eAAe,EAAGD,EAAuB,EACnG,KAAK,sBAAwB1mC,GAAK,KAAK,cAAcA,CAAC,EACtD,KAAK,wBAA0BA,GAAK,KAAK,gBAAgBA,CAAC,EAC1D,KAAK,OAAQ,CACjB,CAQE,UAAW,CACT,OAAO,MAAM,SAAS,MAAO,CAC3B,UAAW,kCACjB,CAAK,CACL,CAWE,gBAAgBqP,EAAO,CACrB,MAAMuxC,EAAU,KAAK,SAAS,SAAS,EACvC,GAAI,CAACA,EACH,OAEF,MAAMC,EAAkBD,EAAQ,SAAS,iBAAiB,EACpDH,EAAmBG,EAAQ,SAAS,kBAAkB,EAC5D,GAAI,CAACC,GAAmB,CAACJ,EACvB,OAEF,MAAMK,EAAYF,EAAQ,GAAI,EACxBxB,EAAc7c,GAAaue,CAAS,EAC1C,IAAIzB,EAAe5c,GAAmBqe,EAAWzxC,CAAK,EAAE,EAKxDgwC,EAAenB,GAAMmB,EAAc,EAAG,CAAC,EACnCoB,GACFA,EAAiB,OAAOrB,EAAaC,CAAY,EAE/CwB,GACFA,EAAgB,OAAOzB,EAAawB,EAAQ,YAAW,CAAE,CAE/D,CAsBE,gBAAgBvxC,EAAO,CACrB,MAAMuxC,EAAU,KAAK,SAAS,SAAS,EACnCA,GACFA,EAAQ,gBAAgBvxC,CAAK,CAEnC,CAQE,SAAU,CACR,OAAO,KAAK,QAChB,CAKE,SAAU,CAER,GADA,KAAK,SAAU,EAAC,QAAQsO,GAASA,EAAM,SAAWA,EAAM,SAAS,EAC7D,EAAC,KAAK,YAGV,KAAK,IAAI,CAAC,YAAa,YAAY,EAAG,KAAK,uBAAuB,EAClE,KAAK,IAAI,KAAK,IAAK,YAAa,KAAK,eAAe,EACpD,KAAK,6CAA8C,EACnD,KAAK,SAAS,UAAU,EACxB,KAAK,SAAW,GAGZ,KAAK,QAAQ,aAAa,CAC5B,MAAMijC,EAAU,KAAK,SAAS,SAAS,EACvC,KAAK,QAAQ,UAAU,EAAK,EACxBA,EAAQ,iBACVxR,GAAe,KAAK,QAAQ,MAAM,CAE1C,CACA,CAKE,QAAS,CACP,KAAK,SAAU,EAAC,QAAQzxB,GAASA,EAAM,QAAUA,EAAM,QAAQ,EAC3D,MAAK,YAGT,KAAK,GAAG,CAAC,YAAa,YAAY,EAAG,KAAK,uBAAuB,EACjE,KAAK,GAAG,KAAK,IAAK,YAAa,KAAK,eAAe,EACnD,KAAK,YAAY,UAAU,EAC3B,KAAK,SAAW,GACpB,CAKE,8CAA+C,CAC7C,MAAMzB,EAAM,KAAK,IAAI,cACrB,KAAK,IAAIA,EAAK,YAAa,KAAK,wBAAwB,EACxD,KAAK,IAAIA,EAAK,YAAa,KAAK,wBAAwB,EACxD,KAAK,IAAIA,EAAK,UAAW,KAAK,qBAAqB,EACnD,KAAK,IAAIA,EAAK,WAAY,KAAK,qBAAqB,CACxD,CAWE,gBAAgB7M,EAAO,CACrB,MAAM6M,EAAM,KAAK,IAAI,cACf0kC,EAAU,KAAK,SAAS,SAAS,EACnCA,GACFA,EAAQ,gBAAgBvxC,CAAK,EAE/B,KAAK,GAAG6M,EAAK,YAAa,KAAK,wBAAwB,EACvD,KAAK,GAAGA,EAAK,YAAa,KAAK,wBAAwB,EACvD,KAAK,GAAGA,EAAK,UAAW,KAAK,qBAAqB,EAClD,KAAK,GAAGA,EAAK,WAAY,KAAK,qBAAqB,CACvD,CAWE,cAAc7M,EAAO,CACnB,MAAMuxC,EAAU,KAAK,SAAS,SAAS,EACnCA,GACFA,EAAQ,cAAcvxC,CAAK,EAE7B,KAAK,6CAA8C,CACvD,CACA,CAQAsxC,GAAgB,UAAU,SAAW,CACnC,SAAU,CAAC,SAAS,CACtB,EACAjX,EAAY,kBAAkB,kBAAmBiX,EAAe,EAahE,MAAMI,WAA+B9D,EAAO,CAa1C,YAAYtT,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,QAAQ,0BAA0B,EACvC,KAAK,GAAG0tC,EAAQ,CAAC,wBAAyB,uBAAuB,EAAG3pC,GAAK,KAAK,6BAA6BA,CAAC,CAAC,EAC7G,KAAK,GAAG2pC,EAAQ,CAAC,iCAAkC,gBAAgB,EAAG3pC,GAAK,KAAK,oCAAoCA,CAAC,CAAC,EACtH,KAAK,GAAG2pC,EAAQ,CAAC,iBAAkB,sBAAuB,uBAAuB,EAAG,IAAM,KAAK,uCAAuC,EAGtI,KAAK,QAAS,CAClB,CAQE,eAAgB,CACd,MAAO,6CAA6C,MAAM,cAAe,CAAA,EAC7E,CAME,uCAAwC,CAItC,GAAI,EAFkB,KAAK,QAAQ,YAAa,EAAC,UAAU,EAAG,CAAC,IAAM,SAChC,KAAK,QAAQ,mBAAqB,KAAK,QAAQ,cAAe,GACjF,CAChB,KAAK,KAAM,EACX,MACN,CACQ,KAAK,QAAQ,wBACf,KAAK,QAAQ,qBAAsB,EAErC,KAAK,KAAM,CACf,CAWE,qCAAsC,CAChCzN,EAAW,yBAA2B,KAAK,QAAQ,wBAAyB,IAAK,IAAS,KAAK,QAAQ,SAAS,gCAAkC,6BAA8BS,EAClL,KAAK,OAAQ,EAEb,KAAK,QAAS,CAEpB,CAYE,6BAA6BttB,EAAO,CAC9B,KAAK,QAAQ,wBACf,KAAK,QAAQ,yBAAyB,EACtC,KAAK,YAAY,yBAAyB,IAE1C,KAAK,QAAQ,0BAA0B,EACvC,KAAK,YAAY,oBAAoB,GAEvC,KAAK,oCAAqC,CAC9C,CAaE,YAAYA,EAAO,CACZ,KAAK,QAAQ,uBAGhB,KAAK,QAAQ,qBAAsB,EAFnC,KAAK,QAAQ,wBAAyB,CAI5C,CAME,MAAO,CAED,OAAO6sB,EAAW,sBAAyB,YAG/C,MAAM,KAAM,CAChB,CACA,CAQA6kB,GAAuB,UAAU,aAAe,qBAChDrX,EAAY,kBAAkB,yBAA0BqX,EAAsB,EAa9E,MAAMC,WAAyB/D,EAAO,CAUpC,YAAYtT,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,QAAQ,kBAAkB,EAC/B,KAAK,GAAG0tC,EAAQ,mBAAoB3pC,GAAK,KAAK,uBAAuBA,CAAC,CAAC,EACnEk8B,EAAWyN,EAAO,OAAO,iBAAiB,IAAM,IAClD,KAAK,QAAS,CAEpB,CAQE,eAAgB,CACd,MAAO,0BAA0B,MAAM,cAAe,CAAA,EAC1D,CAWE,uBAAuBt6B,EAAO,CACxB,KAAK,QAAQ,gBACf,KAAK,YAAY,iBAAiB,EAClC,KAAK,QAAQ,iBAAiB,IAE9B,KAAK,YAAY,YAAY,EAC7B,KAAK,QAAQ,kBAAkB,EAErC,CAaE,YAAYA,EAAO,CACZ,KAAK,QAAQ,eAGhB,KAAK,QAAQ,eAAgB,EAF7B,KAAK,QAAQ,kBAAmB,CAItC,CACA,CAQA2xC,GAAiB,UAAU,aAAe,aAC1CtX,EAAY,kBAAkB,mBAAoBsX,EAAgB,EAiBlE,MAAMC,GAAqB,SAAU34C,EAAMqhC,EAAQ,CAE7CA,EAAO,OAAS,CAACA,EAAO,MAAM,uBAChCrhC,EAAK,SAAS,YAAY,EAE5BA,EAAK,GAAGqhC,EAAQ,YAAa,UAAY,CAClCA,EAAO,MAAM,sBAGhBrhC,EAAK,YAAY,YAAY,EAF7BA,EAAK,SAAS,YAAY,CAIhC,CAAG,CACH,EAWA,MAAM44C,WAAoBxX,CAAY,CAOpC,UAAW,CACT,MAAM3tB,EAAK,MAAM,SAAS,MAAO,CAC/B,UAAW,kBACjB,CAAK,EACD,YAAK,QAAQ,SAAUA,CAAE,EACzBA,EAAG,YAAY,MAAM,SAAS,OAAQ,CACpC,UAAW,kBACjB,CAAK,CAAC,EACKA,CACX,CACA,CACA2tB,EAAY,kBAAkB,cAAewX,EAAW,EAaxD,MAAMC,WAA2BzX,CAAY,CAU3C,YAAYC,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,OAAS6qC,GAASH,GAAM,KAAM,KAAK,MAAM,EAAGD,EAAuB,CAC5E,CAQE,UAAW,CACT,OAAO,MAAM,SAAS,MAAO,CAC3B,UAAW,oBACjB,EAAO,CACD,cAAe,MACrB,CAAK,CACL,CAkBE,OAAO0a,EAAcC,EAAeC,EAAUzgB,EAAS,CACrD,GAAI,CAACygB,EAAU,CACb,MAAMhC,EAAcld,GAAsB,KAAK,GAAG,EAC5Cmd,EAAand,GAAsB,KAAK,QAAQ,GAAE,CAAE,EACpDmf,EAAmBH,EAAa,MAAQC,EAC9C,GAAI,CAAC9B,GAAc,CAACD,EAClB,OAEF,MAAMG,EAAmB2B,EAAa,KAAO7B,EAAW,KAAOgC,EACzD7B,EAAoB0B,EAAa,MAAQG,GAAoBhC,EAAW,MAAQ6B,EAAa,OACnG,IAAIzB,EAAgBL,EAAY,MAAQ,EACpCG,EAAmBE,EACrBA,GAAiBA,EAAgBF,EACxBC,EAAoBC,IAC7BA,EAAgBD,GAEdC,EAAgB,EAClBA,EAAgB,EACPA,EAAgBL,EAAY,QACrCK,EAAgBL,EAAY,OAE9B,KAAK,IAAI,MAAM,MAAQ,IAAIK,CAAa,IAC9C,CACI,KAAK,MAAM,GAAG9e,CAAO,GAAG,CAC5B,CAQE,MAAMA,EAAS,CACbC,GAAY,KAAK,IAAKD,CAAO,CACjC,CAuBE,aAAaugB,EAAcC,EAAeC,EAAUE,EAAQpM,EAAI,CAC9D,KAAK,2BAA2B,kCAAmC,IAAM,CACvE,KAAK,OAAOgM,EAAcC,EAAeC,EAAUE,EAAO,QAAQ,CAAC,CAAC,EAChEpM,GACFA,EAAI,CAEZ,CAAK,CACL,CACA,CACA1L,EAAY,kBAAkB,qBAAsByX,EAAkB,EActE,MAAMM,WAAgC/X,CAAY,CAUhD,YAAYC,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,OAAS6qC,GAASH,GAAM,KAAM,KAAK,MAAM,EAAGD,EAAuB,CAC5E,CAQE,UAAW,CACT,OAAO,MAAM,SAAS,MAAO,CAC3B,UAAW,mBACjB,CAAK,CACL,CAkBE,OAAO0a,EAAcC,EAAeC,EAAU,CAC5C,MAAME,EAAS,IAAMH,EACrB,KAAK,SAAS,oBAAoB,EAAE,aAAaD,EAAcC,EAAeC,EAAUE,EAAQ,IAAM,CAChGF,EACF,KAAK,IAAI,MAAM,OAAS,GAAGF,EAAa,OAASC,CAAa,KAE9D,KAAK,IAAI,MAAM,KAAO,GAAGD,EAAa,MAAQC,CAAa,IAEnE,CAAK,CACL,CACA,CAQAI,GAAwB,UAAU,SAAW,CAC3C,SAAU,CAAC,oBAAoB,CACjC,EACA/X,EAAY,kBAAkB,0BAA2B+X,EAAuB,EAWhF,MAAMC,WAAkBrD,EAAO,CAU7B,YAAY1U,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,GAAG,eAAgB+D,GAAK,KAAK,kBAAkBA,CAAC,CAAC,EACtD,KAAK,GAAG2pC,EAAQ,eAAgB3pC,GAAK,KAAK,qBAAqBA,CAAC,CAAC,EACjE2pC,EAAO,MAAM,IAAM,KAAK,qBAAoB,CAAE,CAClD,CAQE,UAAW,CACT,OAAO,MAAM,SAAS,MAAO,CAC3B,UAAW,+BACjB,EAAO,CACD,aAAc,KAAK,SAAS,cAAc,EAC1C,YAAa,QACnB,CAAK,CACL,CAUE,gBAAgBt6B,EAAO,CAChBi0B,GAAkBj0B,CAAK,GAG5B,MAAM,gBAAgBA,CAAK,CAC/B,CAUE,gBAAgBA,EAAO,CACrB,MAAMsyC,EAA0B,KAAK,SAAS,yBAAyB,EACvE,GAAIA,EAAyB,CAC3B,MAAMC,EAAc,KAAK,GAAI,EACvBC,EAAgBzf,GAAsBwf,CAAW,EACjDN,EAAW,KAAK,SAAU,EAChC,IAAIQ,EAAiBrf,GAAmBmf,EAAavyC,CAAK,EAC1DyyC,EAAiBR,EAAWQ,EAAe,EAAIA,EAAe,EAI9DA,EAAiB5D,GAAM4D,EAAgB,EAAG,CAAC,EAC3CH,EAAwB,OAAOE,EAAeC,EAAgBR,CAAQ,CAC5E,CACShe,GAAkBj0B,CAAK,IAG5B,KAAK,WAAY,EACjB,KAAK,QAAQ,OAAO,KAAK,kBAAkBA,CAAK,CAAC,EACrD,CAKE,YAAa,CACP,KAAK,QAAQ,SACf,KAAK,QAAQ,MAAM,EAAK,CAE9B,CAQE,YAAa,CACX,OAAI,KAAK,QAAQ,QACR,EAEF,KAAK,QAAQ,OAAQ,CAChC,CAKE,aAAc,CACZ,KAAK,WAAY,EACjB,KAAK,QAAQ,OAAO,KAAK,QAAQ,OAAQ,EAAG,EAAG,CACnD,CAKE,UAAW,CACT,KAAK,WAAY,EACjB,KAAK,QAAQ,OAAO,KAAK,QAAQ,OAAQ,EAAG,EAAG,CACnD,CAUE,qBAAqBA,EAAO,CAC1B,MAAM0yC,EAAY,KAAK,QAAQ,MAAK,EAAK,EAAI,KAAK,oBAAqB,EACvE,KAAK,IAAI,aAAa,gBAAiBA,CAAS,EAChD,KAAK,IAAI,aAAa,iBAAkBA,EAAY,GAAG,CAC3D,CAOE,qBAAsB,CACpB,OAAO,KAAK,MAAM,KAAK,QAAQ,OAAQ,EAAG,GAAG,CACjD,CAUE,mBAAoB,CAClB,MAAMC,EAAmB,KAAK,QAAQ,OAAQ,EAC9C,KAAK,IAAI,iBAAkB,IAAM,CAC3B,KAAK,QAAQ,OAAM,IAAO,GAC5B,KAAK,QAAQ,YAAYA,CAAgB,CAEjD,CAAK,CACL,CACA,CAQAN,GAAU,UAAU,SAAW,CAC7B,SAAU,CAAC,aAAa,EACxB,QAAS,aACX,EAGI,CAACzhB,IAAU,CAACvB,IACdgjB,GAAU,UAAU,SAAS,SAAS,OAAO,EAAG,EAAG,yBAAyB,EAQ9EA,GAAU,UAAU,YAAc,eAClChY,EAAY,kBAAkB,YAAagY,EAAS,EAWpD,MAAMO,WAAsBvY,CAAY,CAUtC,YAAYC,EAAQ1tC,EAAU,GAAI,CAChCA,EAAQ,SAAWA,EAAQ,UAAY,IAInC,OAAOA,EAAQ,UAAc,KAAe+hC,GAAQ/hC,EAAQ,SAAS,KACvEA,EAAQ,UAAYA,EAAQ,WAAa,CAAE,EAC3CA,EAAQ,UAAU,SAAWA,EAAQ,UAEvC,MAAM0tC,EAAQ1tC,CAAO,EAGrBglD,GAAmB,KAAMtX,CAAM,EAC/B,KAAK,yBAA2B7C,GAASH,GAAM,KAAM,KAAK,eAAe,EAAGD,EAAuB,EACnG,KAAK,sBAAwB1mC,GAAK,KAAK,cAAcA,CAAC,EACtD,KAAK,GAAG,YAAaA,GAAK,KAAK,gBAAgBA,CAAC,CAAC,EACjD,KAAK,GAAG,aAAcA,GAAK,KAAK,gBAAgBA,CAAC,CAAC,EAClD,KAAK,GAAG,YAAaA,GAAK,KAAK,gBAAgBA,CAAC,CAAC,EAIjD,KAAK,GAAG,KAAK,UAAW,CAAC,QAAS,cAAc,EAAG,IAAM,CACvD,KAAK,UAAU,SAAS,mBAAmB,EAC3C,KAAK,SAAS,mBAAmB,EACjC,KAAK,QAAQ,cAAc,CACjC,CAAK,EACD,KAAK,GAAG,KAAK,UAAW,CAAC,OAAQ,gBAAgB,EAAG,IAAM,CACxD,KAAK,UAAU,YAAY,mBAAmB,EAC9C,KAAK,YAAY,mBAAmB,EACpC,KAAK,QAAQ,gBAAgB,CACnC,CAAK,CACL,CAQE,UAAW,CACT,IAAIkiD,EAAmB,wBACvB,OAAI,KAAK,SAAS,WAChBA,EAAmB,uBAEd,MAAM,SAAS,MAAO,CAC3B,UAAW,kCAAkCA,CAAgB,EACnE,CAAK,CACL,CAWE,gBAAgB7yC,EAAO,CACrB,MAAM6M,EAAM,KAAK,IAAI,cACrB,KAAK,GAAGA,EAAK,YAAa,KAAK,wBAAwB,EACvD,KAAK,GAAGA,EAAK,YAAa,KAAK,wBAAwB,EACvD,KAAK,GAAGA,EAAK,UAAW,KAAK,qBAAqB,EAClD,KAAK,GAAGA,EAAK,WAAY,KAAK,qBAAqB,CACvD,CAWE,cAAc7M,EAAO,CACnB,MAAM6M,EAAM,KAAK,IAAI,cACrB,KAAK,IAAIA,EAAK,YAAa,KAAK,wBAAwB,EACxD,KAAK,IAAIA,EAAK,YAAa,KAAK,wBAAwB,EACxD,KAAK,IAAIA,EAAK,UAAW,KAAK,qBAAqB,EACnD,KAAK,IAAIA,EAAK,WAAY,KAAK,qBAAqB,CACxD,CAWE,gBAAgB7M,EAAO,CACrB,KAAK,UAAU,gBAAgBA,CAAK,CACxC,CACA,CAQA4yC,GAAc,UAAU,SAAW,CACjC,SAAU,CAAC,WAAW,CACxB,EACAvY,EAAY,kBAAkB,gBAAiBuY,EAAa,EAiB5D,MAAME,GAAmB,SAAU75C,EAAMqhC,EAAQ,CAE3CA,EAAO,OAAS,CAACA,EAAO,MAAM,qBAChCrhC,EAAK,SAAS,YAAY,EAE5BA,EAAK,GAAGqhC,EAAQ,YAAa,UAAY,CAClCA,EAAO,MAAM,oBAGhBrhC,EAAK,YAAY,YAAY,EAF7BA,EAAK,SAAS,YAAY,CAIhC,CAAG,CACH,EAaA,MAAM85C,WAAmBnF,EAAO,CAU9B,YAAYtT,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EAGrBkmD,GAAiB,KAAMxY,CAAM,EAC7B,KAAK,GAAGA,EAAQ,CAAC,YAAa,cAAc,EAAG3pC,GAAK,KAAK,OAAOA,CAAC,CAAC,CACtE,CAQE,eAAgB,CACd,MAAO,oBAAoB,MAAM,cAAe,CAAA,EACpD,CAaE,YAAYqP,EAAO,CACjB,MAAMgzC,EAAM,KAAK,QAAQ,OAAQ,EAC3BC,EAAa,KAAK,QAAQ,YAAa,EAC7C,GAAID,IAAQ,EAAG,CACb,MAAME,EAAcD,EAAa,GAAM,GAAMA,EAC7C,KAAK,QAAQ,OAAOC,CAAW,EAC/B,KAAK,QAAQ,MAAM,EAAK,CAC9B,MACM,KAAK,QAAQ,MAAM,MAAK,QAAQ,MAAO,CAAe,CAE5D,CAaE,OAAOlzC,EAAO,CACZ,KAAK,YAAa,EAClB,KAAK,mBAAoB,CAC7B,CAaE,aAAc,CACZ,MAAMgzC,EAAM,KAAK,QAAQ,OAAQ,EACjC,IAAI/lB,EAAQ,EACZ,KAAK,QAAQ,aAAa,EAKtB2D,IAAU,KAAK,QAAQ,OAAS,KAAK,QAAQ,MAAM,KACrD,KAAK,QAAQ,MAAM,KAAK,QAAQ,MAAM,IAAI,KAAK,EAE7CoiB,IAAQ,GAAK,KAAK,QAAQ,MAAK,GACjC,KAAK,QAAQ,aAAa,EAC1B/lB,EAAQ,GACC+lB,EAAM,KACf,KAAK,QAAQ,YAAY,EACzB/lB,EAAQ,GACC+lB,EAAM,MACf,KAAK,QAAQ,eAAe,EAC5B/lB,EAAQ,GAEV+E,GAAY,KAAK,IAAK,CAAC,EAAG,EAAG,EAAG,CAAC,EAAE,OAAO,CAAC9wB,EAAK7V,IAAM6V,EAAM,GAAG7V,EAAI,IAAM,EAAE,WAAWA,CAAC,GAAI,EAAE,CAAC,EAC9FymC,GAAS,KAAK,IAAK,WAAW7E,CAAK,EAAE,CACzC,CASE,oBAAqB,CAEnB,MAAMh4B,EADW,KAAK,QAAQ,MAAO,GAAI,KAAK,QAAQ,OAAM,IAAO,EAC3C,SAAW,OAC/B,KAAK,YAAa,IAAKA,GACzB,KAAK,YAAYA,CAAI,CAE3B,CACA,CAQA89C,GAAW,UAAU,aAAe,OACpC1Y,EAAY,kBAAkB,aAAc0Y,EAAU,EAYtD,MAAMI,WAAoB9Y,CAAY,CAUpC,YAAYC,EAAQ1tC,EAAU,GAAI,CAC5B,OAAOA,EAAQ,OAAW,IAC5BA,EAAQ,OAASA,EAAQ,OAEzBA,EAAQ,OAAS,IAKf,OAAOA,EAAQ,cAAkB,KAAe+hC,GAAQ/hC,EAAQ,aAAa,KAC/EA,EAAQ,cAAgBA,EAAQ,eAAiB,CAAE,EACnDA,EAAQ,cAAc,SAAW,CAACA,EAAQ,QAE5C,MAAM0tC,EAAQ1tC,CAAO,EAGrB,KAAK,uBAAyB+D,GAAK,KAAK,eAAeA,CAAC,EACxD,KAAK,GAAG2pC,EAAQ,CAAC,WAAW,EAAG3pC,GAAK,KAAK,kBAAkBA,CAAC,CAAC,EAC7D,KAAK,GAAG,KAAK,WAAY,QAASA,GAAK,KAAK,eAAeA,CAAC,CAAC,EAC7D,KAAK,GAAG,KAAK,cAAe,QAASA,GAAK,KAAK,yBAAyBA,CAAC,CAAC,EAC1E,KAAK,GAAG,UAAWA,GAAK,KAAK,eAAeA,CAAC,CAAC,EAC9C,KAAK,GAAG,YAAaA,GAAK,KAAK,gBAAgBA,CAAC,CAAC,EACjD,KAAK,GAAG,WAAYA,GAAK,KAAK,eAAeA,CAAC,CAAC,EAI/C,KAAK,GAAG,KAAK,cAAe,CAAC,cAAc,EAAG,KAAK,aAAa,EAChE,KAAK,GAAG,KAAK,cAAe,CAAC,gBAAgB,EAAG,KAAK,eAAe,CACxE,CAQE,eAAgB,CACd,KAAK,SAAS,mBAAmB,CACrC,CAQE,iBAAkB,CAChB,KAAK,YAAY,mBAAmB,CACxC,CASE,mBAAoB,CAGd,KAAK,cAAc,SAAS,YAAY,GAAK,KAAK,WAAW,SAAS,YAAY,GACpF,KAAK,SAAS,YAAY,EAKxB,KAAK,cAAc,SAAS,YAAY,GAAK,CAAC,KAAK,WAAW,SAAS,YAAY,GACrF,KAAK,SAAS,sBAAsB,CAE1C,CAQE,UAAW,CACT,IAAIkiD,EAAmB,8BACvB,OAAK,KAAK,SAAS,SACjBA,EAAmB,6BAEd,MAAM,SAAS,MAAO,CAC3B,UAAW,gCAAgCA,CAAgB,EACjE,CAAK,CACL,CAKE,SAAU,CACR,KAAK,eAAgB,EACrB,MAAM,QAAS,CACnB,CAWE,yBAAyB7yC,EAAO,CAC1BA,EAAM,MAAQ,UAChB,KAAK,WAAW,MAAO,CAE7B,CAYE,gBAAgBA,EAAO,CACrB,KAAK,SAAS,WAAW,EACzBw2B,GAAG3J,EAAY,QAAS,KAAK,sBAAsB,CACvD,CAYE,eAAe7sB,EAAO,CACpB,KAAK,YAAY,WAAW,EAC5B42B,GAAI/J,EAAY,QAAS,KAAK,sBAAsB,CACxD,CAWE,eAAe7sB,EAAO,CAChBA,EAAM,MAAQ,UAChB,KAAK,eAAgB,CAE3B,CACA,CAQAmzC,GAAY,UAAU,SAAW,CAC/B,SAAU,CAAC,aAAc,eAAe,CAC1C,EACA9Y,EAAY,kBAAkB,cAAe8Y,EAAW,EAUxD,MAAMC,WAAoBxF,EAAO,CAC/B,YAAYtT,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,aAAe,CAAC,EAAG,GAAI,EAAE,EAC9B,KAAK,SAAW,KAAK,mBAAoB,EACrC,KAAK,UAAY,KAAK,aAAa,SAAS,KAAK,QAAQ,GAC3D,KAAK,QAAQ,WAAW,KAAK,QAAQ,EAAE,EACvC,KAAK,YAAY,KAAK,SAAS,2BAA4B,CAAC,KAAK,SAAS,eAAe0tC,EAAO,SAAU,CAAA,CAAC,CAAC,CAAC,EAC7G,KAAK,KAAM,GAEX,KAAK,KAAM,CAEjB,CACE,oBAAqB,CACnB,MAAM+Y,EAAgB,KAAK,SAAS,cACpC,OAAOA,EAAc,YAAcA,EAAc,WAAW,aAAeA,EAAc,WAAW,YAAY,OACpH,CACE,eAAgB,CACd,MAAO,oBAAoB,KAAK,mBAAkB,CAAE,IAAI,MAAM,cAAa,CAAE,EACjF,CAaE,YAAYrzC,EAAO,CACjB,GAAI,MAAM,KAAK,QAAQ,SAAU,CAAA,EAC/B,OAEF,MAAMszC,EAAmB,KAAK,QAAQ,YAAa,EAC7C3D,EAAc,KAAK,QAAQ,YAC3B51B,EAAW41B,GAAeA,EAAY,OAAQ,EAAGA,EAAY,cAAgB,KAAK,QAAQ,SAAU,EAC1G,IAAIsB,EACAqC,EAAmB,KAAK,UAAYv5B,EACtCk3B,EAAUqC,EAAmB,KAAK,SAElCrC,EAAUl3B,EAEZ,KAAK,QAAQ,YAAYk3B,CAAO,CACpC,CAKE,sBAAuB,CACrB,KAAK,YAAY,KAAK,SAAS,2BAA4B,CAAC,KAAK,QAAQ,CAAC,CAAC,CAC/E,CACA,CACAmC,GAAY,UAAU,aAAe,eACrC/Y,EAAY,kBAAkB,cAAe+Y,EAAW,EAUxD,MAAMG,WAAqB3F,EAAO,CAChC,YAAYtT,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,aAAe,CAAC,EAAG,GAAI,EAAE,EAC9B,KAAK,SAAW,KAAK,oBAAqB,EACtC,KAAK,UAAY,KAAK,aAAa,SAAS,KAAK,QAAQ,GAC3D,KAAK,QAAQ,UAAU,KAAK,QAAQ,EAAE,EACtC,KAAK,YAAY,KAAK,SAAS,4BAA6B,CAAC,KAAK,SAAS,eAAe0tC,EAAO,SAAU,CAAA,CAAC,CAAC,CAAC,EAC9G,KAAK,KAAM,GAEX,KAAK,KAAM,CAEjB,CACE,qBAAsB,CACpB,MAAM+Y,EAAgB,KAAK,SAAS,cACpC,OAAOA,EAAc,YAAcA,EAAc,WAAW,aAAeA,EAAc,WAAW,YAAY,QACpH,CACE,eAAgB,CACd,MAAO,qBAAqB,KAAK,oBAAmB,CAAE,IAAI,MAAM,cAAa,CAAE,EACnF,CAaE,YAAYrzC,EAAO,CACjB,MAAMszC,EAAmB,KAAK,QAAQ,YAAa,EAC7C3D,EAAc,KAAK,QAAQ,YAC3BuB,EAAgBvB,GAAeA,EAAY,OAAQ,GAAIA,EAAY,cAAe,EACxF,IAAIsB,EACAC,GAAiBoC,EAAmB,KAAK,UAAYpC,EACvDD,EAAUC,EACDoC,GAAoB,KAAK,SAClCrC,EAAUqC,EAAmB,KAAK,SAElCrC,EAAU,EAEZ,KAAK,QAAQ,YAAYA,CAAO,CACpC,CAKE,sBAAuB,CACrB,KAAK,YAAY,KAAK,SAAS,4BAA6B,CAAC,KAAK,QAAQ,CAAC,CAAC,CAChF,CACA,CACAsC,GAAa,UAAU,aAAe,gBACtClZ,EAAY,kBAAkB,eAAgBkZ,EAAY,EAc1D,MAAMC,WAAanZ,CAAY,CAW7B,YAAYC,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACjBA,IACF,KAAK,YAAcA,EAAQ,YAE7B,KAAK,cAAgB,GACrB,KAAK,GAAG,UAAW+D,GAAK,KAAK,cAAcA,CAAC,CAAC,EAG7C,KAAK,iBAAmBA,GAAK,KAAK,WAAWA,CAAC,EAC9C,KAAK,qBAAuBA,GAAK,KAAK,eAAeA,CAAC,CAC1D,CASE,wBAAwB0qC,EAAW,CAC3BA,aAAqBhB,IAG3B,KAAK,GAAGgB,EAAW,OAAQ,KAAK,gBAAgB,EAChD,KAAK,GAAGA,EAAW,CAAC,MAAO,OAAO,EAAG,KAAK,oBAAoB,EAClE,CASE,2BAA2BA,EAAW,CAC9BA,aAAqBhB,IAG3B,KAAK,IAAIgB,EAAW,OAAQ,KAAK,gBAAgB,EACjD,KAAK,IAAIA,EAAW,CAAC,MAAO,OAAO,EAAG,KAAK,oBAAoB,EACnE,CAWE,YAAYA,EAAW,CACjB,OAAOA,GAAc,WACvBA,EAAY,KAAK,SAASA,CAAS,GAErC,KAAK,2BAA2BA,CAAS,EACzC,MAAM,YAAYA,CAAS,CAC/B,CASE,QAAQA,EAAW,CACjB,MAAMoY,EAAiB,KAAK,SAASpY,CAAS,EAC1CoY,GACF,KAAK,wBAAwBA,CAAc,CAEjD,CAQE,UAAW,CACT,MAAMC,EAAgB,KAAK,SAAS,eAAiB,KACrD,KAAK,WAAaniB,EAASmiB,EAAe,CACxC,UAAW,kBACjB,CAAK,EACD,KAAK,WAAW,aAAa,OAAQ,MAAM,EAC3C,MAAMhnC,EAAK,MAAM,SAAS,MAAO,CAC/B,OAAQ,KAAK,WACb,UAAW,UACjB,CAAK,EACD,OAAAA,EAAG,YAAY,KAAK,UAAU,EAI9B8pB,GAAG9pB,EAAI,QAAS,SAAU1M,EAAO,CAC/BA,EAAM,eAAgB,EACtBA,EAAM,yBAA0B,CACtC,CAAK,EACM0M,CACX,CACE,SAAU,CACR,KAAK,WAAa,KAClB,KAAK,iBAAmB,KACxB,KAAK,qBAAuB,KAC5B,MAAM,QAAS,CACnB,CAUE,WAAW1M,EAAO,CAChB,MAAM2zC,EAAgB3zC,EAAM,eAAiB6sB,EAAW,cAGxD,GAAI,CAAC,KAAK,WAAW,KAAKl5B,GACjBA,EAAQ,GAAE,IAAOggD,CACzB,EAAG,CACF,MAAMC,EAAM,KAAK,YACbA,GAAOA,EAAI,gBAAkBD,IAAkBC,EAAI,GAAI,EAAC,YAC1DA,EAAI,cAAe,CAE3B,CACA,CAUE,eAAe5zC,EAAO,CAEpB,GAAI,KAAK,YAAa,CACpB,KAAK,YAAY,cAAe,EAChC,MAAM6zC,EAAkB,KAAK,SAAU,EACvC,GAAI,CAAC,MAAM,QAAQA,CAAe,EAChC,OAEF,MAAMC,EAAiBD,EAAgB,OAAOxY,GAAaA,EAAU,GAAE,IAAOr7B,EAAM,MAAM,EAAE,CAAC,EAC7F,GAAI,CAAC8zC,EACH,OAKEA,EAAe,KAAM,IAAK,2BAC5B,KAAK,YAAY,MAAO,CAEhC,CACA,CAUE,cAAc9zC,EAAO,CAEfA,EAAM,MAAQ,aAAeA,EAAM,MAAQ,aAC7CA,EAAM,eAAgB,EACtBA,EAAM,gBAAiB,EACvB,KAAK,YAAa,IAGTA,EAAM,MAAQ,cAAgBA,EAAM,MAAQ,aACrDA,EAAM,eAAgB,EACtBA,EAAM,gBAAiB,EACvB,KAAK,SAAU,EAErB,CAKE,aAAc,CACZ,IAAI+zC,EAAY,EACZ,KAAK,gBAAkB,SACzBA,EAAY,KAAK,cAAgB,GAEnC,KAAK,MAAMA,CAAS,CACxB,CAKE,UAAW,CACT,IAAIA,EAAY,EACZ,KAAK,gBAAkB,SACzBA,EAAY,KAAK,cAAgB,GAEnC,KAAK,MAAMA,CAAS,CACxB,CAQE,MAAM3qC,EAAO,EAAG,CACd,MAAMuyB,EAAW,KAAK,SAAQ,EAAG,MAAO,EACtBA,EAAS,QAAUA,EAAS,CAAC,EAAE,SAAS,gBAAgB,GAExEA,EAAS,MAAO,EAEdA,EAAS,OAAS,IAChBvyB,EAAO,EACTA,EAAO,EACEA,GAAQuyB,EAAS,SAC1BvyB,EAAOuyB,EAAS,OAAS,GAE3B,KAAK,cAAgBvyB,EACrBuyB,EAASvyB,CAAI,EAAE,IAAI,MAAO,EAEhC,CACA,CACAixB,EAAY,kBAAkB,OAAQmZ,EAAI,EAa1C,MAAMQ,WAAmB3Z,CAAY,CAUnC,YAAYC,EAAQ1tC,EAAU,GAAI,CAChC,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,YAAc,IAAIghD,GAAOtT,EAAQ1tC,CAAO,EAC7C,KAAK,YAAY,YAAY,KAAK,YAAY,EAC9C,KAAK,YAAY,IAAI,aAAa,gBAAiB,MAAM,EAGzD,MAAMqnD,EAAcrG,GAAO,UAAU,cAAe,EACpD,KAAK,YAAY,IAAI,UAAY,KAAK,cAAa,EAAK,IAAMqG,EAC9D,KAAK,YAAY,YAAY,aAAa,EAC1C,KAAK,SAAS,KAAK,WAAW,EAC9B,KAAK,OAAQ,EACb,KAAK,SAAW,GAChB,MAAMC,EAAcvjD,GAAK,KAAK,YAAYA,CAAC,EAC3C,KAAK,iBAAmBA,GAAK,KAAK,gBAAgBA,CAAC,EACnD,KAAK,GAAG,KAAK,YAAa,MAAOujD,CAAW,EAC5C,KAAK,GAAG,KAAK,YAAa,QAASA,CAAW,EAC9C,KAAK,GAAG,KAAK,YAAa,UAAWvjD,GAAK,KAAK,cAAcA,CAAC,CAAC,EAC/D,KAAK,GAAG,KAAK,YAAa,aAAc,IAAM,CAC5C,KAAK,SAAS,WAAW,EACzB,KAAK,KAAK,KAAM,EAChB6lC,GAAG3J,EAAY,QAAS,KAAK,gBAAgB,CACnD,CAAK,EACD,KAAK,GAAG,aAAcl8B,GAAK,KAAK,iBAAiBA,CAAC,CAAC,EACnD,KAAK,GAAG,UAAWA,GAAK,KAAK,qBAAqBA,CAAC,CAAC,CACxD,CAKE,QAAS,CACP,MAAMwjD,EAAO,KAAK,WAAY,EAC1B,KAAK,OACP,KAAK,KAAK,QAAS,EACnB,KAAK,YAAY,KAAK,IAAI,GAE5B,KAAK,KAAOA,EACZ,KAAK,SAASA,CAAI,EAQlB,KAAK,eAAiB,GACtB,KAAK,YAAY,IAAI,aAAa,gBAAiB,OAAO,EACtD,KAAK,OAAS,KAAK,MAAM,QAAU,KAAK,gBAC1C,KAAK,KAAM,EACX,KAAK,KAAK,WAAW,gBAAgB,MAAM,IAE3C,KAAK,KAAM,EACX,KAAK,KAAK,WAAW,aAAa,OAAQ,MAAM,EAEtD,CAQE,YAAa,CACX,MAAMA,EAAO,IAAIX,GAAK,KAAK,QAAS,CAClC,WAAY,IAClB,CAAK,EAaD,GAHA,KAAK,eAAiB,EAGlB,KAAK,SAAS,MAAO,CACvB,MAAMY,EAAU7iB,EAAS,KAAM,CAC7B,UAAW,iBACX,YAAayI,GAAc,KAAK,SAAS,KAAK,EAC9C,SAAU,EAClB,CAAO,EACKqa,EAAiB,IAAIha,EAAY,KAAK,QAAS,CACnD,GAAI+Z,CACZ,CAAO,EACDD,EAAK,QAAQE,CAAc,CACjC,CAEI,GADA,KAAK,MAAQ,KAAK,YAAa,EAC3B,KAAK,MAEP,QAAShpD,EAAI,EAAGA,EAAI,KAAK,MAAM,OAAQA,IACrC8oD,EAAK,QAAQ,KAAK,MAAM9oD,CAAC,CAAC,EAG9B,OAAO8oD,CACX,CAOE,aAAc,CAAA,CAQd,UAAW,CACT,OAAO,MAAM,SAAS,MAAO,CAC3B,UAAW,KAAK,qBAAoB,CACrC,EAAE,EAAE,CACT,CASE,QAAQpgD,EAAM,CACZ,MAAM,QAAQA,EAAM,KAAK,YAAY,GAAG,CAC5C,CAQE,sBAAuB,CACrB,IAAIugD,EAAkB,kBAGlB,KAAK,SAAS,SAAW,GAC3BA,GAAmB,UAEnBA,GAAmB,SAIrB,MAAML,EAAcrG,GAAO,UAAU,cAAe,EACpD,MAAO,mBAAmB0G,CAAe,IAAIL,CAAW,IAAI,MAAM,cAAa,CAAE,EACrF,CAQE,eAAgB,CACd,IAAIK,EAAkB,kBAGtB,OAAI,KAAK,SAAS,SAAW,GAC3BA,GAAmB,UAEnBA,GAAmB,SAEd,mBAAmBA,CAAe,IAAI,MAAM,cAAa,CAAE,EACtE,CAgBE,YAAYr/C,EAAMyX,EAAK,KAAK,YAAY,GAAE,EAAI,CAC5C,OAAO,KAAK,YAAY,YAAYzX,EAAMyX,CAAE,CAChD,CAKE,SAAU,CACR,KAAK,iBAAkB,EACvB,MAAM,QAAS,CACnB,CAaE,YAAY1M,EAAO,CACb,KAAK,eACP,KAAK,cAAe,EAEpB,KAAK,YAAa,CAExB,CAUE,iBAAiBA,EAAO,CACtB,KAAK,YAAY,WAAW,EAC5B42B,GAAI/J,EAAY,QAAS,KAAK,gBAAgB,CAClD,CAKE,OAAQ,CACN,KAAK,YAAY,MAAO,CAC5B,CAKE,MAAO,CACL,KAAK,YAAY,KAAM,CAC3B,CAWE,cAAc7sB,EAAO,CAEfA,EAAM,MAAQ,OAASA,EAAM,MAAQ,OACnC,KAAK,gBACP,KAAK,cAAe,EAIlB,CAACA,EAAM,MAAQ,QACjBA,EAAM,eAAgB,EAEtB,KAAK,YAAY,MAAO,KAGjBA,EAAM,MAAQ,MAAQA,EAAM,MAAQ,QAAU,EAAE,KAAK,QAAQ,SAAS,cAAc,mBAAqB,KAAK,QAAQ,SAAS,cAAc,kBAAkB,YACnK,KAAK,iBACRA,EAAM,eAAgB,EACtB,KAAK,YAAa,GAG1B,CAWE,gBAAgBA,EAAO,EAEjBA,EAAM,MAAQ,OAASA,EAAM,MAAQ,QACvC,KAAK,YAAY,WAAW,CAElC,CAUE,sBAAsBA,EAAO,CAC3B,KAAK,qBAAqBA,CAAK,CACnC,CAWE,qBAAqBA,EAAO,EAEtBA,EAAM,MAAQ,OAASA,EAAM,MAAQ,SACnC,KAAK,gBACP,KAAK,cAAe,EAGlB,CAACA,EAAM,MAAQ,QACjBA,EAAM,eAAgB,EAEtB,KAAK,YAAY,MAAO,GAGhC,CAKE,aAAc,CACZ,GAAI,KAAK,SAAU,CAQjB,GAPA,KAAK,eAAiB,GACtB,KAAK,KAAK,KAAM,EAChB,KAAK,KAAK,YAAa,EACvB,KAAK,YAAY,IAAI,aAAa,gBAAiB,MAAM,EAIrD4wB,IAAUM,KAEZ,OAEF,KAAK,KAAK,MAAO,CACvB,CACA,CAKE,eAAgB,CACV,KAAK,WACP,KAAK,eAAiB,GACtB,KAAK,KAAK,cAAe,EACzB,KAAK,KAAK,KAAM,EAChB,KAAK,YAAY,IAAI,aAAa,gBAAiB,OAAO,EAEhE,CAKE,SAAU,CACR,KAAK,cAAe,EACpB,KAAK,SAAW,GAChB,KAAK,SAAS,cAAc,EAC5B,KAAK,YAAY,QAAS,CAC9B,CAKE,QAAS,CACP,KAAK,SAAW,GAChB,KAAK,YAAY,cAAc,EAC/B,KAAK,YAAY,OAAQ,CAC7B,CACA,CACAmJ,EAAY,kBAAkB,aAAc2Z,EAAU,EAatD,MAAMO,WAAoBP,EAAW,CAUnC,YAAY1Z,EAAQ1tC,EAAS,CAC3B,MAAM60C,EAAS70C,EAAQ,OAKvB,GAJA,MAAM0tC,EAAQ1tC,CAAO,EACjB,KAAK,MAAM,QAAU,GACvB,KAAK,KAAM,EAET,CAAC60C,EACH,OAEF,MAAM+S,EAAgBld,GAAM,KAAM,KAAK,MAAM,EAC7CmK,EAAO,iBAAiB,cAAe+S,CAAa,EACpD/S,EAAO,iBAAiB,WAAY+S,CAAa,EACjD/S,EAAO,iBAAiB,cAAe+S,CAAa,EACpD,KAAK,QAAQ,GAAG,QAASA,CAAa,EACtC,KAAK,QAAQ,GAAG,UAAW,UAAY,CACrC/S,EAAO,oBAAoB,cAAe+S,CAAa,EACvD/S,EAAO,oBAAoB,WAAY+S,CAAa,EACpD/S,EAAO,oBAAoB,cAAe+S,CAAa,CAC7D,CAAK,CACL,CACA,CACAna,EAAY,kBAAkB,cAAeka,EAAW,EAaxD,MAAME,WAAiBnJ,EAAmB,CAWxC,YAAYhR,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,WAAaA,EAAQ,WAC1B,KAAK,YAAcA,EAAQ,UAAY,GACvC,KAAK,gBAAkBA,EAAQ,gBAC/B,KAAK,SAAS,KAAK,WAAW,EAC1B,KAAK,WACH,KAAK,gBACP,KAAK,IAAI,aAAa,OAAQ,kBAAkB,EAEhD,KAAK,IAAI,aAAa,OAAQ,eAAe,EAG/C,KAAK,IAAI,aAAa,OAAQ,UAAU,CAE9C,CAiBE,SAASf,EAAMq5C,EAAOrlC,EAAO,CAE3B,KAAK,eAAiB,GACtB,MAAM6M,EAAK,MAAM,SAAS,KAAM,OAAO,OAAO,CAC5C,UAAW,gBACX,SAAU,EAChB,EAAOw4B,CAAK,EAAGrlC,CAAK,EAGV60C,EAAanjB,EAAS,OAAQ,CAClC,UAAW,qBACX,YAAa,KAAK,SAAS,KAAK,SAAS,KAAK,CACpD,CAAK,EAGD,OAAI,KAAK,QAAQ,SAAS,qBACxB7kB,EAAG,YAAYgoC,CAAU,EAEzBhoC,EAAG,aAAagoC,EAAYhoC,EAAG,cAAc,uBAAuB,CAAC,EAEhEA,CACX,CAWE,cAAc1M,EAAO,CACd,CAAC,MAAO,SAAU,UAAW,YAAa,aAAc,WAAW,EAAE,SAASA,EAAM,GAAG,GAE1F,MAAM,cAAcA,CAAK,CAE/B,CAaE,YAAYA,EAAO,CACjB,KAAK,SAAS,EAAI,CACtB,CAQE,SAASykC,EAAU,CACb,KAAK,aACHA,GACF,KAAK,SAAS,cAAc,EAC5B,KAAK,IAAI,aAAa,eAAgB,MAAM,EAG5C,KAAK,YAAY,YAAY,EAC7B,KAAK,YAAc,KAEnB,KAAK,YAAY,cAAc,EAC/B,KAAK,IAAI,aAAa,eAAgB,OAAO,EAE7C,KAAK,YAAY,EAAE,EACnB,KAAK,YAAc,IAG3B,CACA,CACApK,EAAY,kBAAkB,WAAYoa,EAAQ,EAalD,MAAME,WAA0BF,EAAS,CAUvC,YAAYna,EAAQ1tC,EAAS,CAC3B,MAAMyI,EAAQzI,EAAQ,MAChB60C,EAASnH,EAAO,WAAY,EAGlC1tC,EAAQ,MAAQyI,EAAM,OAASA,EAAM,UAAY,UACjDzI,EAAQ,SAAWyI,EAAM,OAAS,UAClC,MAAMilC,EAAQ1tC,CAAO,EACrB,KAAK,MAAQyI,EAGb,KAAK,OAASzI,EAAQ,OAAS,CAACA,EAAQ,MAAQ,KAAK,MAAM,IAAI,GAAG,OAAO,OAAO,EAChF,MAAMgoD,EAAgB,IAAIj2C,IAAS,CACjC,KAAK,mBAAmB,MAAM,KAAMA,CAAI,CACzC,EACKk2C,EAAgC,IAAIl2C,IAAS,CACjD,KAAK,6BAA6B,MAAM,KAAMA,CAAI,CACnD,EAgBD,GAfA27B,EAAO,GAAG,CAAC,YAAa,iBAAiB,EAAGsa,CAAa,EACzDnT,EAAO,iBAAiB,SAAUmT,CAAa,EAC/CnT,EAAO,iBAAiB,yBAA0BoT,CAA6B,EAC/E,KAAK,GAAG,UAAW,UAAY,CAC7Bva,EAAO,IAAI,CAAC,YAAa,iBAAiB,EAAGsa,CAAa,EAC1DnT,EAAO,oBAAoB,SAAUmT,CAAa,EAClDnT,EAAO,oBAAoB,yBAA0BoT,CAA6B,CACxF,CAAK,EAQGpT,EAAO,WAAa,OAAW,CACjC,IAAIzhC,EACJ,KAAK,GAAG,CAAC,MAAO,OAAO,EAAG,UAAY,CACpC,GAAI,OAAOstB,EAAS,OAAU,SAE5B,GAAI,CACFttB,EAAQ,IAAIstB,EAAS,MAAM,QAAQ,CACpC,MAAa,CAExB,CAEattB,IACHA,EAAQ6sB,EAAW,YAAY,OAAO,EACtC7sB,EAAM,UAAU,SAAU,GAAM,EAAI,GAEtCyhC,EAAO,cAAczhC,CAAK,CAClC,CAAO,CACP,CAGI,KAAK,mBAAoB,CAC7B,CAaE,YAAYA,EAAO,CACjB,MAAM80C,EAAiB,KAAK,MACtBrT,EAAS,KAAK,QAAQ,WAAY,EAExC,GADA,MAAM,YAAYzhC,CAAK,EACnB,EAACyhC,EAGL,QAASp2C,EAAI,EAAGA,EAAIo2C,EAAO,OAAQp2C,IAAK,CACtC,MAAMgK,EAAQosC,EAAOp2C,CAAC,EAIlB,KAAK,MAAM,QAAQgK,EAAM,IAAI,IAAM,KAMnCA,IAAUy/C,EACRz/C,EAAM,OAAS,YACjBA,EAAM,KAAO,WAKNA,EAAM,OAAS,aACxBA,EAAM,KAAO,YAErB,CACA,CAUE,mBAAmB2K,EAAO,CACxB,MAAM+0C,EAAmB,KAAK,MAAM,OAAS,UAIzCA,IAAqB,KAAK,aAC5B,KAAK,SAASA,CAAgB,CAEpC,CACE,6BAA6B/0C,EAAO,CAClC,GAAI,KAAK,MAAM,OAAS,UAAW,CACjC,MAAMg1C,EAAmB,KAAK,QAAQ,OAAO,iBAG7C,GAAIA,GAAoBA,EAAiB,SAAWA,EAAiB,WAAa,KAAK,MAAM,UAAYA,EAAiB,OAAS,KAAK,MAAM,KAC5I,OAEF,KAAK,QAAQ,OAAO,iBAAmB,CACrC,QAAS,GACT,SAAU,KAAK,MAAM,SACrB,KAAM,KAAK,MAAM,IAClB,CACP,CACA,CACE,SAAU,CAER,KAAK,MAAQ,KACb,MAAM,QAAS,CACnB,CACA,CACA3a,EAAY,kBAAkB,oBAAqBsa,EAAiB,EAapE,MAAMM,WAA6BN,EAAkB,CAUnD,YAAYra,EAAQ1tC,EAAS,CAG3BA,EAAQ,MAAQ,CACd,OAAA0tC,EAIA,KAAM1tC,EAAQ,KACd,MAAOA,EAAQ,MACf,QAAS,GACT,KAAM,UACP,EACIA,EAAQ,QACXA,EAAQ,MAAQ,CAACA,EAAQ,IAAI,GAE3BA,EAAQ,MACVA,EAAQ,MAAM,MAAQA,EAAQ,MAE9BA,EAAQ,MAAM,MAAQA,EAAQ,MAAM,KAAK,OAAO,EAAI,OAItDA,EAAQ,WAAa,GAErBA,EAAQ,gBAAkB,GAC1B,MAAM0tC,EAAQ1tC,CAAO,CACzB,CAQE,mBAAmBoT,EAAO,CACxB,MAAMyhC,EAAS,KAAK,OAAM,EAAG,WAAY,EACzC,IAAIsT,EAAmB,GACvB,QAAS1pD,EAAI,EAAGktB,EAAIkpB,EAAO,OAAQp2C,EAAIktB,EAAGltB,IAAK,CAC7C,MAAMgK,EAAQosC,EAAOp2C,CAAC,EACtB,GAAI,KAAK,SAAS,MAAM,QAAQgK,EAAM,IAAI,EAAI,IAAMA,EAAM,OAAS,UAAW,CAC5E0/C,EAAmB,GACnB,KACR,CACA,CAIQA,IAAqB,KAAK,aAC5B,KAAK,SAASA,CAAgB,CAEpC,CACE,6BAA6B/0C,EAAO,CAClC,MAAMyhC,EAAS,KAAK,OAAM,EAAG,WAAY,EACzC,IAAIyT,EAAY,GAChB,QAAS7pD,EAAI,EAAGktB,EAAIkpB,EAAO,OAAQp2C,EAAIktB,EAAGltB,IAAK,CAC7C,MAAMgK,EAAQosC,EAAOp2C,CAAC,EACtB,GAAI,CAAC,WAAY,eAAgB,WAAW,EAAE,QAAQgK,EAAM,IAAI,EAAI,IAAMA,EAAM,OAAS,UAAW,CAClG6/C,EAAY,GACZ,KACR,CACA,CACQA,IACF,KAAK,QAAQ,OAAO,iBAAmB,CACrC,QAAS,EACV,EAEP,CAKE,sBAAuB,CACrB,KAAK,EAAE,qBAAqB,EAAE,YAAc,KAAK,QAAQ,SAAS,KAAK,SAAS,KAAK,EACrF,MAAM,qBAAsB,CAChC,CACA,CACA7a,EAAY,kBAAkB,uBAAwB4a,EAAoB,EAa1E,MAAME,WAAwBZ,EAAY,CAUxC,YAAYja,EAAQ1tC,EAAU,GAAI,CAChCA,EAAQ,OAAS0tC,EAAO,WAAY,EACpC,MAAMA,EAAQ1tC,CAAO,CACzB,CAWE,YAAYwoD,EAAQ,GAAIC,EAAgBV,GAAmB,CAGzD,IAAIh4B,EACA,KAAK,SACPA,EAAQ,GAAG,KAAK,MAAM,QAGxBy4B,EAAM,KAAK,IAAIH,GAAqB,KAAK,QAAS,CAChD,MAAO,KAAK,OACZ,KAAM,KAAK,MACX,MAAAt4B,CACN,CAAK,CAAC,EACF,KAAK,gBAAkB,EACvB,MAAM8kB,EAAS,KAAK,QAAQ,WAAY,EACnC,MAAM,QAAQ,KAAK,MAAM,IAC5B,KAAK,OAAS,CAAC,KAAK,KAAK,GAE3B,QAASp2C,EAAI,EAAGA,EAAIo2C,EAAO,OAAQp2C,IAAK,CACtC,MAAMgK,EAAQosC,EAAOp2C,CAAC,EAGtB,GAAI,KAAK,OAAO,QAAQgK,EAAM,IAAI,EAAI,GAAI,CACxC,MAAM+T,EAAO,IAAIisC,EAAc,KAAK,QAAS,CAC3C,MAAAhgD,EACA,MAAO,KAAK,OACZ,KAAM,KAAK,MAEX,WAAY,GAEZ,gBAAiB,EAC3B,CAAS,EACD+T,EAAK,SAAS,OAAO/T,EAAM,IAAI,YAAY,EAC3C+/C,EAAM,KAAKhsC,CAAI,CACvB,CACA,CACI,OAAOgsC,CACX,CACA,CACA/a,EAAY,kBAAkB,kBAAmB8a,EAAe,EAahE,MAAMG,WAA8Bb,EAAS,CAU3C,YAAYna,EAAQ1tC,EAAS,CAC3B,MAAMyI,EAAQzI,EAAQ,MAChB0F,EAAM1F,EAAQ,IACdmkD,EAAczW,EAAO,YAAa,EAGxC1tC,EAAQ,WAAa,GACrBA,EAAQ,gBAAkB,GAC1BA,EAAQ,MAAQ0F,EAAI,KACpB1F,EAAQ,SAAW0F,EAAI,WAAay+C,GAAeA,EAAcz+C,EAAI,QACrE,MAAMgoC,EAAQ1tC,CAAO,EACrB,KAAK,MAAQyI,EACb,KAAK,IAAM/C,CACf,CAaE,YAAY0N,EAAO,CACjB,MAAM,YAAa,EACnB,KAAK,QAAQ,YAAY,KAAK,IAAI,SAAS,CAC/C,CACA,CACAq6B,EAAY,kBAAkB,wBAAyBib,EAAqB,EAkB5E,MAAMC,WAAuBJ,EAAgB,CAa3C,YAAY7a,EAAQ1tC,EAAS2tC,EAAO,CAClC,MAAMD,EAAQ1tC,EAAS2tC,CAAK,EAC5B,KAAK,QAAQ,UAAU,EACvB,KAAK,mBAAqB,IAAM,CAC9B,KAAK,MAAM,QAAQnxB,GAAQ,CACzBA,EAAK,SAAS,KAAK,OAAO,WAAW,CAAC,IAAMA,EAAK,GAAG,CAC5D,CAAO,CACF,CACL,CAQE,eAAgB,CACd,MAAO,uBAAuB,MAAM,cAAe,CAAA,EACvD,CACE,sBAAuB,CACrB,MAAO,uBAAuB,MAAM,qBAAsB,CAAA,EAC9D,CAYE,OAAOpJ,EAAO,CACZ,GAAIA,GAASA,EAAM,OAASA,EAAM,MAAM,OAAS,WAC/C,OAEF,MAAM3K,EAAQ,KAAK,kBAAmB,EAClCA,IAAU,KAAK,QACjB,KAAK,SAASA,CAAK,EACnB,MAAM,OAAQ,IACL,CAAC,KAAK,OAASA,GAASA,EAAM,MAAQA,EAAM,KAAK,SAAW,KAAK,MAAM,SAEhF,MAAM,OAAQ,CAEpB,CASE,SAASA,EAAO,CACd,GAAI,KAAK,SAAWA,EAQpB,IALK,KAAK,iBACR,KAAK,eAAiB,KAAK,OAAO,KAAK,IAAI,GAIzC,KAAK,OAAQ,CACf,MAAMmgD,EAAoB,KAAK,QAAQ,mBAAkB,EAAG,wBAAwB,KAAK,MAAM,EAC3FA,GACFA,EAAkB,oBAAoB,OAAQ,KAAK,cAAc,EAEnE,KAAK,OAAO,oBAAoB,YAAa,KAAK,kBAAkB,EACpE,KAAK,OAAS,IACpB,CAII,GAHA,KAAK,OAASngD,EAGV,KAAK,OAAQ,CACf,KAAK,OAAO,KAAO,SACnB,MAAMmgD,EAAoB,KAAK,QAAQ,mBAAkB,EAAG,wBAAwB,KAAK,MAAM,EAC3FA,GACFA,EAAkB,iBAAiB,OAAQ,KAAK,cAAc,EAEhE,KAAK,OAAO,iBAAiB,YAAa,KAAK,kBAAkB,CACvE,EACA,CAQE,mBAAoB,CAClB,MAAM/T,EAAS,KAAK,QAAQ,WAAY,GAAI,CAAE,EAC9C,QAASp2C,EAAIo2C,EAAO,OAAS,EAAGp2C,GAAK,EAAGA,IAAK,CAE3C,MAAMgK,EAAQosC,EAAOp2C,CAAC,EACtB,GAAIgK,EAAM,OAAS,KAAK,MACtB,OAAOA,CAEf,CACA,CASE,gBAAiB,CACf,OAAI,KAAK,QAAU,KAAK,OAAO,MACtB,KAAK,OAAO,MAEd,KAAK,SAAS2kC,GAAc,KAAK,KAAK,CAAC,CAClD,CAQE,YAAa,CACX,YAAK,SAAS,MAAQ,KAAK,eAAgB,EACpC,MAAM,WAAY,CAC7B,CAQE,aAAc,CACZ,MAAMob,EAAQ,CAAE,EAChB,GAAI,CAAC,KAAK,OACR,OAAOA,EAET,MAAM18C,EAAO,KAAK,OAAO,KACzB,GAAI,CAACA,EACH,OAAO08C,EAET,QAAS/pD,EAAI,EAAGktB,EAAI7f,EAAK,OAAQrN,EAAIktB,EAAGltB,IAAK,CAC3C,MAAMiH,EAAMoG,EAAKrN,CAAC,EACZoqD,EAAK,IAAIH,GAAsB,KAAK,QAAS,CACjD,MAAO,KAAK,OACZ,IAAAhjD,CACR,CAAO,EACD8iD,EAAM,KAAKK,CAAE,CACnB,CACI,OAAOL,CACX,CACA,CAQAG,GAAe,UAAU,MAAQ,WAQjCA,GAAe,UAAU,aAAe,WACxClb,EAAY,kBAAkB,iBAAkBkb,EAAc,EAa9D,MAAMG,WAA2BP,EAAgB,CAa/C,YAAY7a,EAAQ1tC,EAAS2tC,EAAO,CAClC,MAAMD,EAAQ1tC,EAAS2tC,CAAK,EAC5B,KAAK,QAAQ,mBAAmB,EAChC,MAAMkH,EAASnH,EAAO,WAAY,EAC5Bsa,EAAgBtd,GAAM,KAAM,KAAK,kBAAkB,EACzDmK,EAAO,iBAAiB,SAAUmT,CAAa,EAC/C,KAAK,GAAG,UAAW,UAAY,CAC7BnT,EAAO,oBAAoB,SAAUmT,CAAa,CACxD,CAAK,CACL,CAUE,mBAAmB50C,EAAO,CACxB,MAAMyhC,EAAS,KAAK,OAAM,EAAG,WAAY,EACzC,IAAIkU,EAAW,GAGf,QAAStqD,EAAI,EAAGktB,EAAIkpB,EAAO,OAAQp2C,EAAIktB,EAAGltB,IAAK,CAC7C,MAAMgK,EAAQosC,EAAOp2C,CAAC,EACtB,GAAIgK,EAAM,OAAS,KAAK,OAASA,EAAM,OAAS,UAAW,CACzDsgD,EAAW,GACX,KACR,CACA,CAGQA,EACF,KAAK,QAAS,EAEd,KAAK,OAAQ,CAEnB,CAQE,eAAgB,CACd,MAAO,2BAA2B,MAAM,cAAe,CAAA,EAC3D,CACE,sBAAuB,CACrB,MAAO,2BAA2B,MAAM,qBAAsB,CAAA,EAClE,CACA,CAQAD,GAAmB,UAAU,MAAQ,eAQrCA,GAAmB,UAAU,aAAe,eAC5Crb,EAAY,kBAAkB,qBAAsBqb,EAAkB,EAatE,MAAME,WAAwBT,EAAgB,CAa5C,YAAY7a,EAAQ1tC,EAAS2tC,EAAO,CAClC,MAAMD,EAAQ1tC,EAAS2tC,CAAK,EAC5B,KAAK,QAAQ,WAAW,CAC5B,CAQE,eAAgB,CACd,MAAO,wBAAwB,MAAM,cAAe,CAAA,EACxD,CACE,sBAAuB,CACrB,MAAO,wBAAwB,MAAM,qBAAsB,CAAA,EAC/D,CACA,CAQAqb,GAAgB,UAAU,MAAQ,YAQlCA,GAAgB,UAAU,aAAe,YACzCvb,EAAY,kBAAkB,kBAAmBub,EAAe,EAahE,MAAMC,WAAgClB,EAAkB,CAUtD,YAAYra,EAAQ1tC,EAAS,CAC3BA,EAAQ,MAAQ,CACd,OAAA0tC,EACA,KAAM1tC,EAAQ,KACd,MAAOA,EAAQ,KAAO,YACtB,WAAY,GACZ,QAAS,GACT,KAAM,UACP,EAGDA,EAAQ,WAAa,GACrBA,EAAQ,KAAO,0BACf,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,SAAS,wBAAwB,EACtC,KAAK,YAAY,WAAaA,EAAQ,KAAO,kBAAkB,CACnE,CAaE,YAAYoT,EAAO,CACjB,KAAK,OAAQ,EAAC,SAAS,mBAAmB,EAAE,KAAM,CACtD,CAKE,sBAAuB,CACrB,KAAK,EAAE,qBAAqB,EAAE,YAAc,KAAK,QAAQ,SAAS,KAAK,SAAS,KAAO,WAAW,EAClG,MAAM,qBAAsB,CAChC,CACA,CACAq6B,EAAY,kBAAkB,0BAA2Bwb,EAAuB,EAahF,MAAMC,WAAuBX,EAAgB,CAa3C,YAAY7a,EAAQ1tC,EAAS2tC,EAAO,CAClC,MAAMD,EAAQ1tC,EAAS2tC,CAAK,EAC5B,KAAK,QAAQ,UAAU,CAC3B,CAQE,eAAgB,CACd,MAAO,uBAAuB,MAAM,cAAe,CAAA,EACvD,CACE,sBAAuB,CACrB,MAAO,uBAAuB,MAAM,qBAAsB,CAAA,EAC9D,CAQE,aAAc,CACZ,MAAM6a,EAAQ,CAAE,EAChB,MAAI,EAAE,KAAK,OAAM,EAAG,OAAS,KAAK,OAAQ,EAAC,MAAM,2BAA6B,KAAK,OAAQ,EAAC,SAAS,mBAAmB,IACtHA,EAAM,KAAK,IAAIS,GAAwB,KAAK,QAAS,CACnD,KAAM,KAAK,KACnB,CAAO,CAAC,EACF,KAAK,gBAAkB,GAElB,MAAM,YAAYT,CAAK,CAClC,CACA,CAQAU,GAAe,UAAU,MAAQ,WAQjCA,GAAe,UAAU,aAAe,WACxCzb,EAAY,kBAAkB,iBAAkByb,EAAc,EAY9D,MAAMC,WAAyBpB,EAAkB,CAC/C,SAAS9oD,EAAMq5C,EAAOrlC,EAAO,CAC3B,MAAM6M,EAAK,MAAM,SAAS7gB,EAAMq5C,EAAOrlC,CAAK,EACtCm2C,EAAatpC,EAAG,cAAc,qBAAqB,EACzD,OAAI,KAAK,SAAS,MAAM,OAAS,aAC3B,KAAK,QAAQ,SAAS,qBACxB,KAAK,QAAQ,WAAYA,CAAE,EAE3BspC,EAAW,YAAYzkB,EAAS,OAAQ,CACtC,UAAW,sBACrB,EAAW,CACD,cAAe,EACzB,CAAS,CAAC,EAEJykB,EAAW,YAAYzkB,EAAS,OAAQ,CACtC,UAAW,mBAGX,YAAa,IAAI,KAAK,SAAS,UAAU,CAAC,EAClD,CAAO,CAAC,GAEG7kB,CACX,CACA,CACA2tB,EAAY,kBAAkB,mBAAoB0b,EAAgB,EAalE,MAAME,WAAuBd,EAAgB,CAa3C,YAAY7a,EAAQ1tC,EAAU,GAAI,CAChC,MAAM0tC,EAAQ1tC,CAAO,EAIrB,KAAK,OAAS,YACd,KAAK,QAAQ,WAAW,EACpB,CAAC,KAAM,QAAS,QAAS,OAAO,EAAE,QAAQ,KAAK,QAAQ,SAAS,EAAI,KACtE,KAAK,OAAS,WACd,KAAK,QAAQ,UAAU,GAEzB,KAAK,YAAY,YAAYotC,GAAc,KAAK,MAAM,CAAC,CAC3D,CAQE,eAAgB,CACd,MAAO,wBAAwB,MAAM,cAAe,CAAA,EACxD,CACE,sBAAuB,CACrB,MAAO,wBAAwB,MAAM,qBAAsB,CAAA,EAC/D,CAQE,aAAc,CACZ,IAAIob,EAAQ,CAAE,EACd,MAAI,EAAE,KAAK,OAAM,EAAG,OAAS,KAAK,OAAQ,EAAC,MAAM,2BAA6B,KAAK,OAAQ,EAAC,SAAS,mBAAmB,IACtHA,EAAM,KAAK,IAAIS,GAAwB,KAAK,QAAS,CACnD,KAAM,KAAK,MACnB,CAAO,CAAC,EACF,KAAK,gBAAkB,GAEzBT,EAAQ,MAAM,YAAYA,EAAOW,EAAgB,EAC1CX,CACX,CACA,CAQAa,GAAe,UAAU,OAAS,CAAC,WAAY,WAAW,EAS1DA,GAAe,UAAU,aAAe,YACxC5b,EAAY,kBAAkB,iBAAkB4b,EAAc,EAa9D,MAAMC,WAA2BzB,EAAS,CAUxC,YAAYna,EAAQ1tC,EAAS,CAC3B,MAAMyI,EAAQzI,EAAQ,MAChB60C,EAASnH,EAAO,YAAa,EAGnC1tC,EAAQ,MAAQyI,EAAM,OAASA,EAAM,UAAY,UACjDzI,EAAQ,SAAWyI,EAAM,QACzB,MAAMilC,EAAQ1tC,CAAO,EACrB,KAAK,MAAQyI,EACb,KAAK,SAAS,OAAOA,EAAM,IAAI,YAAY,EAC3C,MAAMu/C,EAAgB,IAAIj2C,IAAS,CACjC,KAAK,mBAAmB,MAAM,KAAMA,CAAI,CACzC,EACD8iC,EAAO,iBAAiB,SAAUmT,CAAa,EAC/C,KAAK,GAAG,UAAW,IAAM,CACvBnT,EAAO,oBAAoB,SAAUmT,CAAa,CACxD,CAAK,CACL,CACE,SAAS/oD,EAAMq5C,EAAOrlC,EAAO,CAC3B,MAAM6M,EAAK,MAAM,SAAS7gB,EAAMq5C,EAAOrlC,CAAK,EACtCm2C,EAAatpC,EAAG,cAAc,qBAAqB,EACzD,MAAI,CAAC,YAAa,cAAc,EAAE,QAAQ,KAAK,SAAS,MAAM,IAAI,GAAK,IACrEspC,EAAW,YAAYzkB,EAAS,OAAQ,CACtC,UAAW,sBACnB,EAAS,CACD,cAAe,EACvB,CAAO,CAAC,EACFykB,EAAW,YAAYzkB,EAAS,OAAQ,CACtC,UAAW,mBACX,YAAa,IAAM,KAAK,SAAS,cAAc,CACvD,CAAO,CAAC,GAEG7kB,CACX,CAaE,YAAY1M,EAAO,CAQjB,GAPA,MAAM,YAAYA,CAAK,EAIvB,KAAK,MAAM,QAAU,GAGjB,KAAK,QAAQ,MAAM,0BAA2B,CAChD,MAAMyhC,EAAS,KAAK,QAAQ,YAAa,EACzC,QAASp2C,EAAI,EAAGA,EAAIo2C,EAAO,OAAQp2C,IAAK,CACtC,MAAMgK,EAAQosC,EAAOp2C,CAAC,EAGlBgK,IAAU,KAAK,QAGnBA,EAAM,QAAUA,IAAU,KAAK,MACvC,CACA,CACA,CAUE,mBAAmB2K,EAAO,CACxB,KAAK,SAAS,KAAK,MAAM,OAAO,CACpC,CACA,CACAq6B,EAAY,kBAAkB,qBAAsB6b,EAAkB,EAWtE,MAAMC,WAAyB5B,EAAY,CAUzC,YAAYja,EAAQ1tC,EAAU,GAAI,CAChCA,EAAQ,OAAS0tC,EAAO,YAAa,EACrC,MAAMA,EAAQ1tC,CAAO,EACrB,KAAK,QAAQ,OAAO,CACxB,CAQE,eAAgB,CACd,MAAO,oBAAoB,MAAM,cAAe,CAAA,EACpD,CACE,sBAAuB,CACrB,MAAO,oBAAoB,MAAM,qBAAsB,CAAA,EAC3D,CAWE,YAAYwoD,EAAQ,GAAI,CAEtB,KAAK,eAAiB,EACtB,MAAM3T,EAAS,KAAK,QAAQ,YAAa,EACzC,QAASp2C,EAAI,EAAGA,EAAIo2C,EAAO,OAAQp2C,IAAK,CACtC,MAAMgK,EAAQosC,EAAOp2C,CAAC,EACtB+pD,EAAM,KAAK,IAAIc,GAAmB,KAAK,QAAS,CAC9C,MAAA7gD,EAEA,WAAY,GAEZ,gBAAiB,EACzB,CAAO,CAAC,CACR,CACI,OAAO+/C,CACX,CACA,CAQAe,GAAiB,UAAU,aAAe,cAC1C9b,EAAY,kBAAkB,mBAAoB8b,EAAgB,EAalE,MAAMC,WAA6B3B,EAAS,CAU1C,YAAYna,EAAQ1tC,EAAS,CAC3B,MAAM+vB,EAAQ/vB,EAAQ,KAChBypD,EAAO,WAAW15B,EAAO,EAAE,EAGjC/vB,EAAQ,MAAQ+vB,EAChB/vB,EAAQ,SAAWypD,IAAS/b,EAAO,aAAc,EACjD1tC,EAAQ,WAAa,GACrBA,EAAQ,gBAAkB,GAC1B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,MAAQ+vB,EACb,KAAK,KAAO05B,EACZ,KAAK,GAAG/b,EAAQ,aAAc3pC,GAAK,KAAK,OAAOA,CAAC,CAAC,CACrD,CAaE,YAAYqP,EAAO,CACjB,MAAM,YAAa,EACnB,KAAK,OAAQ,EAAC,aAAa,KAAK,IAAI,CACxC,CAUE,OAAOA,EAAO,CACZ,KAAK,SAAS,KAAK,OAAQ,EAAC,aAAc,IAAK,KAAK,IAAI,CAC5D,CACA,CAQAo2C,GAAqB,UAAU,cAAgB,SAC/C/b,EAAY,kBAAkB,uBAAwB+b,EAAoB,EAa1E,MAAME,WAA+BtC,EAAW,CAU9C,YAAY1Z,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,YAAY,IAAI,aAAa,mBAAoB,KAAK,UAAU,EACrE,KAAK,iBAAkB,EACvB,KAAK,YAAa,EAClB,KAAK,GAAG0tC,EAAQ,YAAa3pC,GAAK,KAAK,iBAAiBA,CAAC,CAAC,EAC1D,KAAK,GAAG2pC,EAAQ,aAAc3pC,GAAK,KAAK,YAAYA,CAAC,CAAC,EACtD,KAAK,GAAG2pC,EAAQ,sBAAuB3pC,GAAK,KAAK,0BAA0BA,CAAC,CAAC,CACjF,CAQE,UAAW,CACT,MAAM+b,EAAK,MAAM,SAAU,EAC3B,YAAK,WAAa,iCAAmC,KAAK,IAC1D,KAAK,SAAW6kB,EAAS,MAAO,CAC9B,UAAW,0BACX,GAAI,KAAK,WACT,YAAa,IACnB,CAAK,EACD7kB,EAAG,YAAY,KAAK,QAAQ,EACrBA,CACX,CACE,SAAU,CACR,KAAK,SAAW,KAChB,MAAM,QAAS,CACnB,CAQE,eAAgB,CACd,MAAO,qBAAqB,MAAM,cAAe,CAAA,EACrD,CACE,sBAAuB,CACrB,MAAO,qBAAqB,MAAM,qBAAsB,CAAA,EAC5D,CAME,aAAc,CACZ,MAAM6pC,EAAQ,KAAK,cAAe,EAC5BnB,EAAQ,CAAE,EAChB,QAAS/pD,EAAIkrD,EAAM,OAAS,EAAGlrD,GAAK,EAAGA,IACrC+pD,EAAM,KAAK,IAAIgB,GAAqB,KAAK,OAAM,EAAI,CACjD,KAAMG,EAAMlrD,CAAC,EAAI,GACzB,CAAO,CAAC,EAEJ,OAAO+pD,CACX,CAOE,0BAA0Bp1C,EAAO,CAC/B,KAAK,OAAQ,CACjB,CAQE,eAAgB,CACd,MAAMs6B,EAAS,KAAK,OAAQ,EAC5B,OAAOA,EAAO,eAAiBA,EAAO,cAAe,GAAI,CAAE,CAC/D,CASE,uBAAwB,CACtB,OAAO,KAAK,OAAQ,EAAC,OAAS,KAAK,OAAM,EAAG,MAAM,sBAAwB,KAAK,cAAe,GAAI,KAAK,cAAa,EAAG,OAAS,CACpI,CAUE,iBAAiBt6B,EAAO,CAClB,KAAK,wBACP,KAAK,YAAY,YAAY,EAE7B,KAAK,SAAS,YAAY,CAEhC,CAUE,YAAYA,EAAO,CACb,KAAK,0BACP,KAAK,SAAS,YAAc,KAAK,OAAQ,EAAC,aAAY,EAAK,IAEjE,CACA,CAUAs2C,GAAuB,UAAU,aAAe,gBAChDjc,EAAY,kBAAkB,yBAA0Bic,EAAsB,EAY9E,MAAME,WAAenc,CAAY,CAO/B,eAAgB,CACd,MAAO,cAAc,MAAM,cAAe,CAAA,EAC9C,CAQE,SAAS54B,EAAM,MAAOyjC,EAAQ,CAAE,EAAEtlC,EAAa,GAAI,CACjD,OAAKslC,EAAM,YACTA,EAAM,UAAY,KAAK,cAAe,GAEjC,MAAM,SAASzjC,EAAKyjC,EAAOtlC,CAAU,CAChD,CACA,CACAy6B,EAAY,kBAAkB,SAAUmc,EAAM,EAW9C,MAAMC,WAA4BD,EAAO,CAOvC,eAAgB,CACd,MAAO,6BAA6B,MAAM,cAAe,CAAA,EAC7D,CAQE,UAAW,CACT,OAAO,MAAM,SAAS,MAAO,CAC3B,UAAW,KAAK,cAAe,EAG/B,YAAa,GACnB,CAAK,CACL,CACA,CACAnc,EAAY,kBAAkB,sBAAuBoc,EAAmB,EAWxE,MAAMC,WAAmBrc,CAAY,CAOnC,UAAW,CACT,OAAO,MAAM,SAAS,MAAO,CAC3B,UAAW,kBACX,IAAK,KACX,CAAK,CACL,CACA,CAQAqc,GAAW,UAAU,SAAW,CAC9B,SAAU,CAAC,aAAc,eAAgB,cAAe,cAAe,qBAAsB,cAAe,kBAAmB,kBAAmB,cAAe,aAAc,uBAAwB,sBAAuB,yBAA0B,iBAAkB,qBAAsB,iBAAkB,mBAAoB,yBAA0B,kBAAkB,CACpX,EACArc,EAAY,kBAAkB,aAAcqc,EAAU,EActD,MAAMC,WAAqBjW,EAAY,CAUrC,YAAYpG,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,GAAG0tC,EAAQ,QAAS3pC,GAAK,CAC5B,KAAK,KAAKA,CAAC,CACjB,CAAK,CACL,CAUE,eAAgB,CACd,MAAO,qBAAqB,MAAM,cAAe,CAAA,EACrD,CAQE,SAAU,CACR,MAAMrG,EAAQ,KAAK,OAAM,EAAG,MAAO,EACnC,OAAOA,EAAQ,KAAK,SAASA,EAAM,OAAO,EAAI,EAClD,CACA,CAOAqsD,GAAa,UAAU,SAAW,OAAO,OAAO,CAAA,EAAIjW,GAAY,UAAU,SAAU,CAClF,YAAa,GACb,WAAY,GACZ,UAAW,GACX,YAAa,EACf,CAAC,EACDrG,EAAY,kBAAkB,eAAgBsc,EAAY,EAU1D,MAAMC,WAAwBvc,CAAY,CAuBxC,YAAYC,EAAQ1tC,EAAU,GAAI,CAChC,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,IAAI,aAAa,kBAAmB,KAAK,mBAAmB,CACrE,CAQE,UAAW,CACT,YAAK,oBAAsB,CAAC,KAAK,SAAS,SAAU,KAAK,SAAS,OAAO,EAAE,KAAK,GAAG,EAAE,KAAM,EAGrE2kC,EAAS,SAAU,CACvC,GAAI,KAAK,SAAS,EACxB,EAAO,CAAA,EAAI,KAAK,SAAS,cAAc,IAAIslB,GAAc,CAInD,MAAMC,GAAY,KAAK,SAAS,QAAU,KAAK,SAAS,QAAU,oBAAoBjhB,IAAS,IAAM,IAAMghB,EAAW,CAAC,EAAE,QAAQ,OAAQ,EAAE,EACrIE,EAASxlB,EAAS,SAAU,CAChC,GAAIulB,EACJ,MAAO,KAAK,SAASD,EAAW,CAAC,CAAC,EAClC,YAAaA,EAAW,CAAC,CACjC,CAAO,EACD,OAAAE,EAAO,aAAa,kBAAmB,GAAG,KAAK,mBAAmB,IAAID,CAAQ,EAAE,EACzEC,CACb,CAAK,CAAC,CAEN,CACA,CACA1c,EAAY,kBAAkB,kBAAmBuc,EAAe,EAahE,MAAMI,WAA0B3c,CAAY,CA0C1C,YAAYC,EAAQ1tC,EAAU,GAAI,CAChC,MAAM0tC,EAAQ1tC,CAAO,EAGrB,MAAMqqD,EAAgB1lB,EAAS,SAAU,CACvC,YAAa,KAAK,SAAS,KAAK,SAAS,UAAU,EACnD,GAAI,KAAK,SAAS,QACxB,CAAK,EACD,KAAK,GAAE,EAAG,YAAY0lB,CAAa,EACnC,MAAMC,EAAU,KAAK,SAAS,QAG9B,UAAW7rD,KAAK6rD,EAAS,CACvB,MAAMC,EAAe,KAAK,SAAS,cAAc9rD,CAAC,EAC5C+rD,EAAkBD,EAAa,UAC/B1mC,EAAK0mC,EAAa,GAAG,QAAQ,KAAM,KAAK,SAAS,GAAG,EAC1D,IAAI/I,EAAO,KACX,MAAMiJ,EAAO,cAAcxhB,GAAS,CAAA,GAGpC,GAAI,KAAK,SAAS,OAAS,SAAU,CACnCuY,EAAO7c,EAAS,OAAQ,CACtB,UAAW6lB,CACrB,CAAS,EACD,MAAMz6B,EAAQ4U,EAAS,QAAS,CAC9B,GAAA9gB,EACA,UAAW,YACX,YAAa0mC,EAAa,KACpC,CAAS,EACDx6B,EAAM,aAAa,MAAO06B,CAAI,EAC9BjJ,EAAK,YAAYzxB,CAAK,CAC9B,CACM,MAAM26B,EAAkB,IAAIV,GAAgBtc,EAAQ,CAClD,cAAe6c,EAAa,QAC5B,SAAU,KAAK,SAAS,SACxB,GAAIE,EACJ,QAAS5mC,CACjB,CAAO,EACD,KAAK,SAAS6mC,CAAe,EAGzB,KAAK,SAAS,OAAS,WACzBlJ,EAAK,YAAYkJ,EAAgB,IAAI,EACrC,KAAK,GAAE,EAAG,YAAYlJ,CAAI,EAElC,CACA,CAQE,UAAW,CAMT,OALW7c,EAAS,WAAY,CAG9B,UAAW,KAAK,SAAS,SAC/B,CAAK,CAEL,CACA,CACA8I,EAAY,kBAAkB,oBAAqB2c,EAAiB,EAWpE,MAAMO,WAAgCld,CAAY,CAsBhD,YAAYC,EAAQ1tC,EAAU,GAAI,CAChC,MAAM0tC,EAAQ1tC,CAAO,EACrB,MAAM4qD,EAAM,KAAK,SAAS,qBAGpBC,EAAoB,IAAIT,GAAkB1c,EAAQ,CACtD,IAAAkd,EACA,SAAU,wBAAwBA,CAAG,GACrC,WAAY,KAAK,SAAS,MAAM,EAChC,UAAW,2BACX,QAAS,KAAK,SAAS,UAAU,CAAC,EAClC,cAAe,KAAK,SAAS,cAC7B,KAAM,QACZ,CAAK,EACD,KAAK,SAASC,CAAiB,EAG/B,MAAMC,EAAoB,IAAIV,GAAkB1c,EAAQ,CACtD,IAAAkd,EACA,SAAU,uBAAuBA,CAAG,GACpC,WAAY,KAAK,SAAS,iBAAiB,EAC3C,UAAW,2BACX,QAAS,KAAK,SAAS,UAAU,CAAC,EAClC,cAAe,KAAK,SAAS,cAC7B,KAAM,QACZ,CAAK,EACD,KAAK,SAASE,CAAiB,EAG/B,MAAMC,EAAqB,IAAIX,GAAkB1c,EAAQ,CACvD,IAAAkd,EACA,SAAU,mBAAmBA,CAAG,GAChC,WAAY,KAAK,SAAS,yBAAyB,EACnD,UAAW,+BACX,QAAS,KAAK,SAAS,UAAU,CAAC,EAClC,cAAe,KAAK,SAAS,cAC7B,KAAM,QACZ,CAAK,EACD,KAAK,SAASG,CAAkB,CACpC,CAQE,UAAW,CAIT,OAHWpmB,EAAS,MAAO,CACzB,UAAW,2BACjB,CAAK,CAEL,CACA,CACA8I,EAAY,kBAAkB,0BAA2Bkd,EAAuB,EAWhF,MAAMK,WAA8Bvd,CAAY,CAsB9C,YAAYC,EAAQ1tC,EAAU,GAAI,CAChC,MAAM0tC,EAAQ1tC,CAAO,EACrB,MAAM4qD,EAAM,KAAK,SAAS,qBACpBC,EAAoB,IAAIT,GAAkB1c,EAAQ,CACtD,IAAAkd,EACA,SAAU,sBAAsBA,CAAG,GACnC,WAAY,YACZ,UAAW,qCACX,QAAS,KAAK,SAAS,UAAU,CAAC,EAClC,cAAe,KAAK,SAAS,cAC7B,KAAM,MACZ,CAAK,EACD,KAAK,SAASC,CAAiB,EAC/B,MAAMC,EAAoB,IAAIV,GAAkB1c,EAAQ,CACtD,IAAAkd,EACA,SAAU,uBAAuBA,CAAG,GACpC,WAAY,KAAK,SAAS,iBAAiB,EAC3C,UAAW,mCACX,QAAS,KAAK,SAAS,UAAU,CAAC,EAClC,cAAe,KAAK,SAAS,cAC7B,KAAM,MACZ,CAAK,EACD,KAAK,SAASE,CAAiB,EAC/B,MAAMC,EAAqB,IAAIX,GAAkB1c,EAAQ,CACvD,IAAAkd,EACA,SAAU,wBAAwBA,CAAG,GACrC,WAAY,KAAK,SAAS,aAAa,EACvC,UAAW,oCACX,QAAS,KAAK,SAAS,UAAU,CAAC,EAClC,cAAe,KAAK,SAAS,cAC7B,KAAM,MACZ,CAAK,EACD,KAAK,SAASG,CAAkB,CACpC,CAQE,UAAW,CAIT,OAHWpmB,EAAS,MAAO,CACzB,UAAW,yBACjB,CAAK,CAEL,CACA,CACA8I,EAAY,kBAAkB,wBAAyBud,EAAqB,EAW5E,MAAMC,WAA8Bxd,CAAY,CAC9C,YAAYC,EAAQ1tC,EAAU,GAAI,CAChC,MAAM0tC,EAAQ1tC,CAAO,EAGrB,MAAMkrD,EAAsB,KAAK,SAAS,4CAA4C,EAChFC,EAAc,IAAInK,GAAOtT,EAAQ,CACrC,YAAawd,EACb,UAAW,oBACjB,CAAK,EACDC,EAAY,GAAE,EAAG,UAAU,OAAO,cAAe,YAAY,EAC7DA,EAAY,GAAE,EAAG,YAAc,KAAK,SAAS,OAAO,EACpD,KAAK,SAASA,CAAW,EACzB,MAAMC,EAAa,IAAIpK,GAAOtT,EAAQ,CACpC,YAAawd,EACb,UAAW,iBACjB,CAAK,EAGDE,EAAW,GAAE,EAAG,UAAU,OAAO,cAAe,YAAY,EAC5DA,EAAW,GAAE,EAAG,YAAc,KAAK,SAAS,MAAM,EAClD,KAAK,SAASA,CAAU,CAC5B,CAQE,UAAW,CAIT,OAHWzmB,EAAS,MAAO,CACzB,UAAW,6BACjB,CAAK,CAEL,CACA,CACA8I,EAAY,kBAAkB,wBAAyBwd,EAAqB,EAQ5E,MAAMI,GAAsB,0BACtBC,GAAc,CAAC,OAAQ,OAAO,EAC9BC,GAAa,CAAC,OAAQ,MAAM,EAC5BC,GAAa,CAAC,OAAQ,MAAM,EAC5BC,GAAc,CAAC,OAAQ,OAAO,EAC9BC,GAAgB,CAAC,OAAQ,SAAS,EAClCC,GAAY,CAAC,OAAQ,KAAK,EAC1BC,GAAc,CAAC,OAAQ,OAAO,EAC9BC,GAAe,CAAC,OAAQ,QAAQ,EAChCC,GAAiB,CAAC,IAAK,QAAQ,EAC/BC,GAAe,CAAC,MAAO,kBAAkB,EACzCC,GAAgB,CAAC,IAAK,aAAa,EAanCC,GAAgB,CACpB,gBAAiB,CACf,SAAU,yBACV,GAAI,+BACJ,MAAO,QACP,QAAS,CAACX,GAAaM,GAAaD,GAAWF,GAAaF,GAAYM,GAAcH,GAAeF,EAAU,EAC/G,UAAW,cACZ,EACD,kBAAmB,CACjB,SAAU,2BACV,GAAI,iCACJ,MAAO,UACP,QAAS,CAACM,GAAgBC,GAAcC,EAAa,EACrD,UAAW,4BACZ,EACD,MAAO,CACL,SAAU,2BACV,GAAI,+BACJ,MAAO,QACP,QAAS,CAACJ,GAAaN,GAAaK,GAAWF,GAAaF,GAAYM,GAAcH,GAAeF,EAAU,EAC/G,UAAW,gBACZ,EACD,UAAW,CACT,SAAU,2BACV,GAAI,GACJ,MAAO,kBACP,QAAS,CAAC,CAAC,OAAQ,MAAM,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,YAAa,WAAW,EAAG,CAAC,UAAW,SAAS,EAAG,CAAC,aAAc,aAAa,CAAC,CACpI,EACD,WAAY,CACV,SAAU,4BACV,GAAI,GACJ,MAAO,cACP,QAAS,CAAC,CAAC,wBAAyB,yBAAyB,EAAG,CAAC,qBAAsB,sBAAsB,EAAG,CAAC,oBAAqB,oBAAoB,EAAG,CAAC,iBAAkB,iBAAiB,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,aAAc,YAAY,CAAC,CAC7Q,EACD,YAAa,CACX,SAAU,6BACV,GAAI,GACJ,MAAO,YACP,QAAS,CAAC,CAAC,OAAQ,KAAK,EAAG,CAAC,OAAQ,KAAK,EAAG,CAAC,OAAQ,MAAM,EAAG,CAAC,OAAQ,MAAM,EAAG,CAAC,OAAQ,MAAM,EAAG,CAAC,OAAQ,MAAM,EAAG,CAAC,OAAQ,MAAM,EAAG,CAAC,OAAQ,MAAM,EAAG,CAAC,OAAQ,MAAM,CAAC,EACxK,QAAS,EACT,OAAQxmD,GAAKA,IAAM,OAAS,KAAO,OAAOA,CAAC,CAC5C,EACD,YAAa,CACX,SAAU,6BACV,GAAI,iCACJ,MAAO,UACP,QAAS,CAAC8mD,GAAgBC,EAAY,EACtC,UAAW,8BACZ,EAED,YAAa,CACX,SAAU,6BACV,GAAI,2BACJ,MAAO,QACP,UAAW,kBACZ,EAED,cAAe,CACb,SAAU,+BACV,GAAI,6BACJ,MAAO,UACP,QAAS,CAACC,GAAeD,GAAcD,EAAc,EACrD,UAAW,gCACf,CACA,EACAG,GAAc,YAAY,QAAUA,GAAc,gBAAgB,QAkBlE,SAASC,GAAiBhrD,EAAOk6B,EAAQ,CAIvC,GAHIA,IACFl6B,EAAQk6B,EAAOl6B,CAAK,GAElBA,GAASA,IAAU,OACrB,OAAOA,CAEX,CAkBA,SAASirD,GAAuBrsC,EAAIsb,EAAQ,CAC1C,MAAMl6B,EAAQ4e,EAAG,QAAQA,EAAG,QAAQ,aAAa,EAAE,MACnD,OAAOosC,GAAiBhrD,EAAOk6B,CAAM,CACvC,CAiBA,SAASgxB,GAAkBtsC,EAAI5e,EAAOk6B,EAAQ,CAC5C,GAAKl6B,GAGL,QAASzC,EAAI,EAAGA,EAAIqhB,EAAG,QAAQ,OAAQrhB,IACrC,GAAIytD,GAAiBpsC,EAAG,QAAQrhB,CAAC,EAAE,MAAO28B,CAAM,IAAMl6B,EAAO,CAC3D4e,EAAG,cAAgBrhB,EACnB,KACN,EAEA,CAOA,MAAM4tD,WAA0BvY,EAAY,CAU1C,YAAYpG,EAAQ1tC,EAAS,CAC3BA,EAAQ,UAAY,GACpB,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,cAAgB,KAAK,cAAc,KAAK,IAAI,EAGjD,KAAK,KAAM,EACX,KAAK,eAAiB,KAAK,eAAiB,GAC5C,KAAK,sBAAsB0tC,CAAM,EACjC,KAAK,UAAY/I,EAAS,IAAK,CAC7B,UAAW,mBACX,YAAa,KAAK,SAAS,uBAAuB,CACxD,CAAK,EACD,KAAK,GAAI,EAAC,YAAY,KAAK,SAAS,EACpC,KAAK,YAAa,EAGd3kC,EAAQ,2BAA6B,SACvC,KAAK,SAAS,yBAA2B,KAAK,SAAS,cAAc,0BAEvE,KAAK,iCAAkC,EACnC,KAAK,SAAS,0BAChB,KAAK,gBAAiB,CAE5B,CACE,sBAAsB0tC,EAAQ,CAC5B,MAAM4e,EAA0B,IAAI3B,GAAwBjd,EAAQ,CAClE,qBAAsB,KAAK,IAC3B,cAAAue,GACA,UAAW,CAAC,CAAC,QAAS,aAAa,EAAG,CAAC,kBAAmB,mBAAmB,EAAG,CAAC,cAAe,eAAe,CAAC,CACtH,CAAK,EACD,KAAK,SAASK,CAAuB,EACrC,MAAMC,EAAwB,IAAIvB,GAAsBtd,EAAQ,CAC9D,qBAAsB,KAAK,IAC3B,cAAAue,GACA,UAAW,CAAC,CAAC,aAAa,EAAG,CAAC,WAAW,EAAG,CAAC,YAAY,CAAC,CAChE,CAAK,EACD,KAAK,SAASM,CAAqB,EACnC,MAAMC,EAAwB,IAAIvB,GAAsBvd,CAAM,EAC9D,KAAK,SAAS8e,CAAqB,CACvC,CACE,kCAAmC,CACjC,KAAK,GAAG,KAAK,EAAE,kBAAkB,EAAG,QAAS,IAAM,CACjD,KAAK,aAAc,EACnB,KAAK,MAAO,CAClB,CAAK,EACD,KAAK,GAAG,KAAK,EAAE,qBAAqB,EAAG,QAAS,IAAM,CACpD,KAAK,YAAa,EAClB,KAAK,cAAe,CAC1B,CAAK,EACD7qB,GAAKsqB,GAAerjC,GAAU,CAC5B,KAAK,GAAG,KAAK,EAAEA,EAAO,QAAQ,EAAG,SAAU,KAAK,aAAa,CACnE,CAAK,CACL,CACE,SAAU,CACR,KAAK,UAAY,KACjB,MAAM,QAAS,CACnB,CACE,OAAQ,CACN,OAAO,KAAK,SAAS,yBAAyB,CAClD,CACE,aAAc,CACZ,OAAO,KAAK,SAAS,sEAAsE,CAC/F,CACE,eAAgB,CACd,OAAO,MAAM,cAAa,EAAK,0BACnC,CAQE,WAAY,CACV,OAAOgZ,GAAOqqB,GAAe,CAACnqB,EAAOlZ,EAAQ7mB,IAAQ,CACnD,MAAMb,EAAQirD,GAAuB,KAAK,EAAEvjC,EAAO,QAAQ,EAAGA,EAAO,MAAM,EAC3E,OAAI1nB,IAAU,SACZ4gC,EAAM//B,CAAG,EAAIb,GAER4gC,CACR,EAAE,EAAE,CACT,CAQE,UAAU7V,EAAQ,CAChB0V,GAAKsqB,GAAe,CAACrjC,EAAQ7mB,IAAQ,CACnCqqD,GAAkB,KAAK,EAAExjC,EAAO,QAAQ,EAAGqD,EAAOlqB,CAAG,EAAG6mB,EAAO,MAAM,CAC3E,CAAK,CACL,CAKE,aAAc,CACZ+Y,GAAKsqB,GAAerjC,GAAU,CAC5B,MAAM9mB,EAAQ8mB,EAAO,eAAe,SAAS,EAAIA,EAAO,QAAU,EAClE,KAAK,EAAEA,EAAO,QAAQ,EAAE,cAAgB9mB,CAC9C,CAAK,CACL,CAKE,iBAAkB,CAChB,IAAImqB,EACJ,GAAI,CACFA,EAAS,KAAK,MAAMyU,EAAS,aAAa,QAAQ2qB,EAAmB,CAAC,CACvE,OAAQ1tD,EAAK,CACZ6jC,EAAM,KAAK7jC,CAAG,CACpB,CACQsuB,GACF,KAAK,UAAUA,CAAM,CAE3B,CAKE,cAAe,CACb,GAAI,CAAC,KAAK,SAAS,yBACjB,OAEF,MAAMA,EAAS,KAAK,UAAW,EAC/B,GAAI,CACE,OAAO,KAAKA,CAAM,EAAE,OACtByU,EAAS,aAAa,QAAQ2qB,GAAqB,KAAK,UAAUp/B,CAAM,CAAC,EAEzEyU,EAAS,aAAa,WAAW2qB,EAAmB,CAEvD,OAAQ1tD,EAAK,CACZ6jC,EAAM,KAAK7jC,CAAG,CACpB,CACA,CAKE,eAAgB,CACd,MAAM8uD,EAAY,KAAK,QAAQ,SAAS,kBAAkB,EACtDA,GACFA,EAAU,cAAe,CAE/B,CAKE,sBAAuB,CACrB,KAAK,KAAM,EACX,KAAK,sBAAsB,KAAK,OAAO,EACvC,KAAK,iCAAkC,CAC3C,CACA,CACAhf,EAAY,kBAAkB,oBAAqB4e,EAAiB,EAuBpE,MAAMK,WAAsBjf,CAAY,CActC,YAAYC,EAAQ1tC,EAAS,CAC3B,IAAI2sD,EAA4B3sD,EAAQ,gBAAkB0gC,EAAS,eAG/D1gC,EAAQ,iBAAmB,OAC7B2sD,EAA4B,IAI9B,MAAMpO,EAAWvc,GAAQ,CACvB,SAAU,CAAC2qB,EACX,oBAAqB,EACtB,EAAE3sD,CAAO,EACV,MAAM0tC,EAAQ6Q,CAAQ,EACtB,KAAK,eAAiBv+C,EAAQ,gBAAkB0gC,EAAS,eACzD,KAAK,cAAgB,KACrB,KAAK,gBAAkB,KACvB,KAAK,kBAAoBqK,GAAS,IAAM,CACtC,KAAK,cAAe,CAC1B,EAAO,IAAK,GAAO,IAAI,EACf4hB,GACF,KAAK,gBAAkB,IAAI,KAAK,eAAe,KAAK,iBAAiB,EACrE,KAAK,gBAAgB,QAAQjf,EAAO,GAAE,CAAE,IAExC,KAAK,cAAgB,IAAM,CACzB,GAAI,CAAC,KAAK,KAAO,CAAC,KAAK,IAAI,cACzB,OAEF,MAAMkf,EAAoB,KAAK,kBAC/B,IAAIC,EAAkB,KAAK,gBAAkB,UAAY,CACvD7iB,GAAI,KAAM,SAAU4iB,CAAiB,EACrC5iB,GAAI,KAAM,SAAU6iB,CAAe,EACnCA,EAAkB,IACnB,EAIDjjB,GAAG,KAAK,IAAI,cAAe,SAAUijB,CAAe,EACpDjjB,GAAG,KAAK,IAAI,cAAe,SAAUgjB,CAAiB,CACvD,EACD,KAAK,IAAI,OAAQ,KAAK,aAAa,EAEzC,CACE,UAAW,CACT,OAAO,MAAM,SAAS,SAAU,CAC9B,UAAW,qBACX,SAAU,GACV,MAAO,KAAK,SAAS,YAAY,CACvC,EAAO,CACD,cAAe,MACrB,CAAK,CACL,CAOE,eAAgB,CASV,CAAC,KAAK,SAAW,CAAC,KAAK,QAAQ,SAGnC,KAAK,QAAQ,QAAQ,cAAc,CACvC,CACE,SAAU,CACJ,KAAK,mBACP,KAAK,kBAAkB,OAAQ,EAE7B,KAAK,kBACH,KAAK,QAAQ,MACf,KAAK,gBAAgB,UAAU,KAAK,QAAQ,GAAE,CAAE,EAElD,KAAK,gBAAgB,WAAY,GAE/B,KAAK,eACP,KAAK,IAAI,OAAQ,KAAK,aAAa,EAEjC,KAAK,KAAO,KAAK,IAAI,eAAiB,KAAK,iBAC7C,KAAK,gBAAgB,KAAK,KAAK,IAAI,aAAa,EAElD,KAAK,eAAiB,KACtB,KAAK,eAAiB,KACtB,KAAK,kBAAoB,KACzB,KAAK,cAAgB,KACrB,MAAM,QAAS,CACnB,CACA,CACAnf,EAAY,kBAAkB,gBAAiBif,EAAa,EAI5D,MAAMI,GAAa,CACjB,kBAAmB,GACnB,cAAe,EACjB,EASA,MAAMC,WAAoBtf,CAAY,CAoBpC,YAAYC,EAAQ1tC,EAAS,CAE3B,MAAMu+C,EAAWvc,GAAQ8qB,GAAY9sD,EAAS,CAC5C,SAAU,EAChB,CAAK,EACD,MAAM0tC,EAAQ6Q,CAAQ,EACtB,KAAK,kBAAoB,IAAM,KAAK,WAAY,EAChD,KAAK,YAAcx6C,GAAK,KAAK,WAAWA,CAAC,EACzC,KAAK,uBAAyBA,GAAK,KAAK,sBAAsBA,CAAC,EAC/D,KAAK,cAAgBA,GAAK,KAAK,aAAaA,CAAC,EAC7C,KAAK,gBAAkBA,GAAK,KAAK,eAAeA,CAAC,EACjD,KAAK,OAAQ,EACb,KAAK,GAAG,KAAK,QAAS,iBAAkBA,GAAK,KAAK,qBAAqBA,CAAC,CAAC,EAGzE,KAAK,GAAG,KAAK,QAAS,UAAW,IAAM,KAAK,gBAAgB,CAChE,CAME,YAAa,CACX,MAAMipD,EAAW,KAAK,QAAQ,SAAU,EAGxC,GAAI,CAACA,GAAY,CAACA,EAAS,OACzB,OAEF,MAAM3I,EAAU,OAAO3jB,EAAS,YAAY,MAAM,QAAQ,CAAC,CAAC,EACtDusB,EAAY,KAAK,YAAc,GAAK,GAAK5I,EAAU,KAAK,WAAa,IAC3E,KAAK,UAAYA,EACjB,KAAK,aAAe,KAAK,YAAa,EAAG4I,EACzC,MAAMC,EAAkB,KAAK,gBAAiB,EACxC/I,EAAc,KAAK,QAAQ,YAAa,EAO9C,IAAIgJ,EAAW,KAAK,QAAQ,OAAM,GAAM,KAAK,mBAAqB,KAAK,IAAID,EAAkB/I,CAAW,EAAI,KAAK,SAAS,eAKtH,CAAC,KAAK,iBAAmB+I,IAAoB,OAC/CC,EAAW,IAETA,IAAa,KAAK,kBACpB,KAAK,gBAAkBA,EACvB,KAAK,QAAQ,gBAAgB,EAEnC,CAME,sBAAuB,CACrB,KAAK,eAAgB,CACzB,CAKE,gBAAiB,CACX,KAAK,QAAQ,SAAQ,IAAO,KAAY,KAAK,cAAgB,KAAK,SAAS,mBACzE,KAAK,QAAQ,SAAS,QACxB,KAAK,QAAQ,SAAS,YAAY,EAEpC,KAAK,cAAe,IAEpB,KAAK,QAAQ,YAAY,YAAY,EACrC,KAAK,aAAc,EAEzB,CAKE,eAAgB,CACV,KAAK,eAOJ,KAAK,kBACR,KAAK,gBAAkB,KAAK,QAAQ,WAAY,GAElD,KAAK,kBAAoB,KAAK,YAAY,KAAK,kBAAmB1iB,EAAuB,EACzF,KAAK,WAAY,EACjB,KAAK,GAAG,KAAK,QAAS,CAAC,OAAQ,OAAO,EAAG,KAAK,iBAAiB,EAC1D,KAAK,gBAIR,KAAK,GAAG,KAAK,QAAS,SAAU,KAAK,aAAa,GAHlD,KAAK,IAAI,KAAK,QAAS,OAAQ,KAAK,WAAW,EAC/C,KAAK,IAAI,KAAK,QAAS,aAAc,KAAK,sBAAsB,GAItE,CAME,uBAAwB,CACtB,KAAK,gBAAkB,GACvB,KAAK,GAAG,KAAK,QAAS,SAAU,KAAK,aAAa,CACtD,CAME,cAAe,CACb,MAAM2iB,EAAW,KAAK,IAAI,KAAK,gBAAe,EAAK,KAAK,QAAQ,aAAa,EAC7E,KAAK,kBAAoB,KAAK,qBAAuBA,EAAW,EAChE,KAAK,oBAAsB,GAC3B,KAAK,WAAY,CACrB,CAME,YAAa,CACX,KAAK,IAAI,KAAK,QAAS,aAAc,KAAK,eAAe,CAC7D,CAME,QAAS,CACP,KAAK,UAAY,GACjB,KAAK,aAAe,EACpB,KAAK,aAAe,GACpB,KAAK,gBAAkB,GACvB,KAAK,gBAAkB,GACvB,KAAK,kBAAoB,GACzB,KAAK,oBAAsB,GAC3B,KAAK,cAAc,KAAK,iBAAiB,EACzC,KAAK,kBAAoB,KACzB,KAAK,IAAI,KAAK,QAAS,CAAC,OAAQ,OAAO,EAAG,KAAK,iBAAiB,EAChE,KAAK,IAAI,KAAK,QAAS,SAAU,KAAK,aAAa,EACnD,KAAK,IAAI,KAAK,QAAS,OAAQ,KAAK,WAAW,EAC/C,KAAK,IAAI,KAAK,QAAS,aAAc,KAAK,sBAAsB,EAChE,KAAK,IAAI,KAAK,QAAS,aAAc,KAAK,eAAe,CAC7D,CAOE,oBAAqB,CACnB,KAAK,oBAAsB,EAC/B,CAKE,cAAe,CACR,KAAK,eAGV,KAAK,OAAQ,EACb,KAAK,QAAQ,gBAAgB,EACjC,CASE,aAAc,CACZ,MAAMJ,EAAW,KAAK,QAAQ,SAAU,EAClCK,EAAe,CAAE,EACvB,IAAI5uD,EAAIuuD,EAAWA,EAAS,OAAS,EACrC,KAAOvuD,KACL4uD,EAAa,KAAKL,EAAS,IAAIvuD,CAAC,CAAC,EAKnC,OAAO4uD,EAAa,OAASA,EAAa,KAAM,EAACA,EAAa,OAAS,CAAC,EAAI,GAChF,CASE,eAAgB,CACd,MAAML,EAAW,KAAK,QAAQ,SAAU,EAClCM,EAAiB,CAAE,EACzB,IAAI7uD,EAAIuuD,EAAWA,EAAS,OAAS,EACrC,KAAOvuD,KACL6uD,EAAe,KAAKN,EAAS,MAAMvuD,CAAC,CAAC,EAKvC,OAAO6uD,EAAe,OAASA,EAAe,KAAM,EAAC,CAAC,EAAI,CAC9D,CAWE,YAAa,CACX,MAAMJ,EAAkB,KAAK,gBAAiB,EAG9C,OAAIA,IAAoB,IACf,EAEFA,EAAkB,KAAK,cAAe,CACjD,CASE,QAAS,CACP,OAAO,KAAK,WAAY,CAC5B,CASE,YAAa,CACX,MAAO,CAAC,KAAK,eAAgB,CACjC,CAQE,iBAAkB,CAChB,OAAO,KAAK,cAAgB,KAAK,YAAa,CAClD,CASE,aAAc,CACZ,MAAM3I,EAAc,KAAK,YAAa,EACtC,OAAI,KAAK,eAAiB,IAAMA,IAAgB,KAAK,eACnD,KAAK,aAAe,GAEtB,KAAK,aAAeA,EACb,KAAK,YAChB,CASE,gBAAiB,CACf,OAAO,KAAK,eAChB,CAKE,YAAa,CACX,OAAO,OAAO,KAAK,mBAAsB,QAC7C,CAKE,gBAAiB,CACf,KAAK,kBAAoB,GACrB,MAAK,eAGT,KAAK,oBAAsB,GAC3B,KAAK,QAAQ,YAAY,KAAK,gBAAe,CAAE,EACnD,CAKE,SAAU,CACR,KAAK,aAAc,EACnB,MAAM,QAAS,CACnB,CACA,CACA9W,EAAY,kBAAkB,cAAesf,EAAW,EAWxD,MAAMQ,WAAiB9f,CAAY,CACjC,YAAYC,EAAQ1tC,EAAS,CAC3B,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,GAAG,eAAgB+D,GAAK,KAAK,WAAU,CAAE,EAC9C,KAAK,WAAY,CACrB,CAQE,UAAW,CACT,YAAK,IAAM,CACT,MAAO4gC,EAAS,MAAO,CACrB,UAAW,sBACX,GAAI,uBAAuBsE,IAAS,EAC5C,CAAO,EACD,YAAatE,EAAS,MAAO,CAC3B,UAAW,4BACX,GAAI,6BAA6BsE,IAAS,EAC3C,CAAA,CACF,EACMtE,EAAS,MAAO,CACrB,UAAW,eACZ,EAAE,GAAI1Y,GAAO,KAAK,GAAG,CAAC,CAC3B,CAKE,YAAa,CACX,MAAMqnB,EAAO,KAAK,QAAQ,MACpBka,EAASla,GAAQA,EAAK,IACtBma,EAAgB,CACpB,MAAO,kBACP,YAAa,kBACd,EACD,CAAC,QAAS,aAAa,EAAE,QAAQ1oD,GAAK,CACpC,MAAM7D,EAAQ,KAAK,MAAM6D,CAAC,EACpB+a,EAAK,KAAK,IAAI/a,CAAC,EACf2oD,EAAeD,EAAc1oD,CAAC,EACpCmiC,GAAQpnB,CAAE,EACN5e,GACF2jC,GAAY/kB,EAAI5e,CAAK,EAKnBssD,IACFA,EAAO,gBAAgBE,CAAY,EAC/BxsD,GACFssD,EAAO,aAAaE,EAAc5tC,EAAG,EAAE,EAGjD,CAAK,EACG,KAAK,MAAM,OAAS,KAAK,MAAM,YACjC,KAAK,KAAM,EAEX,KAAK,KAAM,CAEjB,CA+BE,OAAO9f,EAAS,CACd,KAAK,SAASA,CAAO,CACzB,CAKE,SAAU,CACR,MAAMszC,EAAO,KAAK,QAAQ,MACpBka,EAASla,GAAQA,EAAK,IACxBka,IACFA,EAAO,gBAAgB,iBAAiB,EACxCA,EAAO,gBAAgB,kBAAkB,GAE3C,MAAM,QAAS,EACf,KAAK,IAAM,IACf,CACA,CACA/f,EAAY,kBAAkB,WAAY8f,EAAQ,EAelD,MAAMI,GAAW,CACf,eAAgB,IAChB,SAAU,CAAE,EACZ,UAAW,EACb,EAkBA,MAAMC,WAAwB5M,EAAO,CAOnC,YAAYtT,EAAQ1tC,EAAS,CAC3BA,EAAUgiC,GAAQ2rB,GAAU3tD,CAAO,EACnC,MAAM0tC,EAAQ1tC,CAAO,EACrB,KAAK,YAAYA,EAAQ,WAAW,EACpC,KAAK,KAAM,EAIX,KAAK,GAAG,KAAK,QAAS,CAAC,aAAc,cAAc,EAAG+D,GAAK,CACzD,KAAK,YAAY,eAAe,CACtC,CAAK,CACL,CAOE,eAAgB,CACd,MAAO,sCAAsC,KAAK,SAAS,SAAS,IAAI6U,GAAK,OAAOA,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,EACtG,CAOE,UAAW,CAET,MAAMkH,EAAK6kB,EAAS,SAAU,GAAI,CAChC,KAAM,SACN,MAAO,KAAK,cAAa,CAC/B,EAAOA,EAAS,MAAM,CAAC,EACnB,YAAK,eAAiB7kB,EAAG,cAAc,MAAM,EACtCA,CACX,CAME,MAAO,CACL,MAAM,KAAM,EACZ,KAAK,SAAS,eAAe,EACzB,KAAK,SAAS,WAChB,KAAK,GAAI,EAAC,MAAM,CACd,cAAe,EACvB,CAAO,EAEH,KAAK,oBAAsB,KAAK,QAAQ,WAAW,IAAM,CACvD,KAAK,YAAY,eAAe,CACtC,EAAO,KAAK,SAAS,cAAc,CACnC,CAKE,MAAO,CACL,KAAK,YAAY,eAAe,EAChC,MAAM,KAAM,CAChB,CAKE,SAAU,CACR,KAAK,QAAQ,aAAa,KAAK,mBAAmB,EAClD,MAAM,QAAS,CACnB,CACA,CACA2tB,EAAY,kBAAkB,kBAAmBmgB,EAAe,EAiBhE,MAAMC,GAAgBva,GAAQ,CAC5B,MAAMxzB,EAAKwzB,EAAK,GAAI,EAGpB,GAAIxzB,EAAG,aAAa,KAAK,EACvB,OAAAwzB,EAAK,iBAAiBxzB,EAAG,GAAG,EACrB,GAeT,MAAMmiB,EAAUqR,EAAK,GAAG,QAAQ,EAC1Bwa,EAAU,CAAE,EAClB,IAAItwC,EAAM,GAGV,GAAI,CAACykB,EAAQ,OACX,MAAO,GAIT,QAASxjC,EAAI,EAAGA,EAAIwjC,EAAQ,OAAQxjC,IAAK,CACvC,MAAMsS,EAAMkxB,EAAQxjC,CAAC,EAAE,IACnBsS,GAAO+8C,EAAQ,QAAQ/8C,CAAG,IAAM,IAClC+8C,EAAQ,KAAK/8C,CAAG,CAEtB,CAGE,OAAK+8C,EAAQ,QAMTA,EAAQ,SAAW,IACrBtwC,EAAMswC,EAAQ,CAAC,GAEjBxa,EAAK,iBAAiB91B,CAAG,EAClB,IATE,EAUX,EAMMuwC,GAA8B,OAAO,eAAe,CAAA,EAAI,YAAa,CACzE,KAAM,CACJ,OAAO,KAAK,UAAU,EAAI,EAAE,SAC7B,EACD,IAAI/oD,EAAG,CAEL,MAAMgpD,EAAQ/tB,EAAW,cAAc,KAAK,SAAS,aAAa,EAGlE+tB,EAAM,UAAYhpD,EAGlB,MAAMipD,EAAUhuB,EAAW,uBAAwB,EAInD,KAAO+tB,EAAM,WAAW,QACtBC,EAAQ,YAAYD,EAAM,WAAW,CAAC,CAAC,EAIzC,YAAK,UAAY,GAIjBttB,EAAS,QAAQ,UAAU,YAAY,KAAK,KAAMutB,CAAO,EAGlD,KAAK,SAChB,CACA,CAAC,EAMKC,GAAgB,CAACC,EAAUplD,IAAS,CACxC,IAAIqlD,EAAa,CAAE,EACnB,QAAS3vD,EAAI,EAAGA,EAAI0vD,EAAS,SAC3BC,EAAa,OAAO,yBAAyBD,EAAS1vD,CAAC,EAAGsK,CAAI,EAC1D,EAAAqlD,GAAcA,EAAW,KAAOA,EAAW,MAFZ3vD,IAEnC,CAIF,OAAA2vD,EAAW,WAAa,GACxBA,EAAW,aAAe,GACnBA,CACT,EACMC,GAAyB/a,GAAQ4a,GAAc,CAAC5a,EAAK,GAAI,EAAE5S,EAAS,iBAAiB,UAAWA,EAAS,QAAQ,UAAWqtB,EAA2B,EAAG,WAAW,EAoBrKO,GAAmB,SAAUhb,EAAM,CACvC,MAAMxzB,EAAKwzB,EAAK,GAAI,EAGpB,GAAIxzB,EAAG,kBACL,OAEF,MAAMgF,EAAM,CAAE,EACRypC,EAAkBF,GAAuB/a,CAAI,EAC7Ckb,EAAgBC,GAAY,IAAI18C,IAAS,CAC7C,MAAM28C,EAASD,EAAS,MAAM3uC,EAAI/N,CAAI,EACtC,OAAA87C,GAAcva,CAAI,EACXob,CACR,EACD,CAAC,SAAU,cAAe,oBAAoB,EAAE,QAAQ3pD,GAAK,CACtD+a,EAAG/a,CAAC,IAKT+f,EAAI/f,CAAC,EAAI+a,EAAG/a,CAAC,EAIb+a,EAAG/a,CAAC,EAAIypD,EAAc1pC,EAAI/f,CAAC,CAAC,EAChC,CAAG,EACD,OAAO,eAAe+a,EAAI,YAAakiB,GAAQusB,EAAiB,CAC9D,IAAKC,EAAcD,EAAgB,GAAG,CAC1C,CAAG,CAAC,EACFzuC,EAAG,kBAAoB,IAAM,CAC3BA,EAAG,kBAAoB,KACvB,OAAO,KAAKgF,CAAG,EAAE,QAAQ/f,GAAK,CAC5B+a,EAAG/a,CAAC,EAAI+f,EAAI/f,CAAC,CACnB,CAAK,EACD,OAAO,eAAe+a,EAAI,YAAayuC,CAAe,CACvD,EAGDjb,EAAK,IAAI,YAAaxzB,EAAG,iBAAiB,CAC5C,EAMM6uC,GAAwB,OAAO,eAAe,CAAA,EAAI,MAAO,CAC7D,KAAM,CACJ,OAAI,KAAK,aAAa,KAAK,EAClBxY,GAAezV,EAAS,QAAQ,UAAU,aAAa,KAAK,KAAM,KAAK,CAAC,EAE1E,EACR,EACD,IAAI17B,EAAG,CACL07B,OAAAA,EAAS,QAAQ,UAAU,aAAa,KAAK,KAAM,MAAO17B,CAAC,EACpDA,CACX,CACA,CAAC,EACK4pD,GAAmBtb,GAAQ4a,GAAc,CAAC5a,EAAK,GAAE,EAAI5S,EAAS,iBAAiB,UAAWiuB,EAAqB,EAAG,KAAK,EAiBvHE,GAAiB,SAAUvb,EAAM,CACrC,GAAI,CAACA,EAAK,kBACR,OAEF,MAAMxzB,EAAKwzB,EAAK,GAAI,EAGpB,GAAIxzB,EAAG,gBACL,OAEF,MAAMgvC,EAAgBF,GAAiBtb,CAAI,EACrCyb,EAAkBjvC,EAAG,aACrBkvC,EAAUlvC,EAAG,KACnB,OAAO,eAAeA,EAAI,MAAOkiB,GAAQ8sB,EAAe,CACtD,IAAK9pD,GAAK,CACR,MAAM0pD,EAASI,EAAc,IAAI,KAAKhvC,EAAI9a,CAAC,EAG3C,OAAAsuC,EAAK,iBAAiBxzB,EAAG,GAAG,EACrB4uC,CACb,CACA,CAAG,CAAC,EACF5uC,EAAG,aAAe,CAAC,EAAG9a,IAAM,CAC1B,MAAM0pD,EAASK,EAAgB,KAAKjvC,EAAI,EAAG9a,CAAC,EAC5C,MAAI,OAAO,KAAK,CAAC,GACfsuC,EAAK,iBAAiBxzB,EAAG,GAAG,EAEvB4uC,CACR,EACD5uC,EAAG,KAAO,IAAM,CACd,MAAM4uC,EAASM,EAAQ,KAAKlvC,CAAE,EAM9B,OAAK+tC,GAAcva,CAAI,IACrBA,EAAK,iBAAiB,EAAE,EACxBgb,GAAiBhb,CAAI,GAEhBob,CACR,EACG5uC,EAAG,WACLwzB,EAAK,iBAAiBxzB,EAAG,UAAU,EACzB+tC,GAAcva,CAAI,GAC5Bgb,GAAiBhb,CAAI,EAEvBxzB,EAAG,gBAAkB,IAAM,CACzBA,EAAG,gBAAkB,KACrBA,EAAG,KAAOkvC,EACVlvC,EAAG,aAAeivC,EAClB,OAAO,eAAejvC,EAAI,MAAOgvC,CAAa,EAC1ChvC,EAAG,mBACLA,EAAG,kBAAmB,CAEzB,CACH,EAYA,MAAMmvC,UAAc9f,CAAK,CAUvB,YAAYnvC,EAAS2tC,EAAO,CAC1B,MAAM3tC,EAAS2tC,CAAK,EACpB,MAAM7wB,EAAS9c,EAAQ,OACvB,IAAIkvD,EAAoB,GAkBxB,GAjBA,KAAK,2BAA6B,KAAK,4BAA8B,KAAK,IAAI,UAAY,QAMtFpyC,IAAW,KAAK,IAAI,aAAeA,EAAO,KAAO9c,EAAQ,KAAOA,EAAQ,IAAI,oBAAsB,GACpG,KAAK,UAAU8c,CAAM,EAErB,KAAK,gBAAgB,KAAK,GAAG,EAI3B9c,EAAQ,iBACV,KAAK,wBAAyB,EAEhC,KAAK,aAAe,GAChB,KAAK,IAAI,gBAAiB,CAC5B,MAAMmvD,EAAQ,KAAK,IAAI,WACvB,IAAIC,EAAcD,EAAM,OACxB,MAAME,EAAc,CAAE,EACtB,KAAOD,KAAe,CACpB,MAAM7nD,EAAO4nD,EAAMC,CAAW,EACb7nD,EAAK,SAAS,YAAa,IAC3B,UACV,KAAK,0BAQR,KAAK,mBAAkB,EAAG,iBAAiBA,CAAI,EAC/C,KAAK,iBAAkB,EAAC,SAASA,EAAK,KAAK,EAC3C,KAAK,WAAY,EAAC,SAASA,EAAK,KAAK,EACjC,CAAC2nD,GAAqB,CAAC,KAAK,IAAI,aAAa,aAAa,GAAK7Y,GAAc9uC,EAAK,GAAG,IACvF2nD,EAAoB,KAPtBG,EAAY,KAAK9nD,CAAI,EAWjC,CACM,QAAS9I,EAAI,EAAGA,EAAI4wD,EAAY,OAAQ5wD,IACtC,KAAK,IAAI,YAAY4wD,EAAY5wD,CAAC,CAAC,CAE3C,CACI,KAAK,mBAAoB,EACrB,KAAK,0BAA4BywD,GACnC1tB,EAAM,KAAK;AAAA,2CAA8I,EAI3J,KAAK,wCAAyC,GAMzCkC,IAAiBJ,KAActjC,EAAQ,yBAA2B,IACrE,KAAK,YAAY,EAAI,EAKvB,KAAK,uBAAwB,EAC7B,KAAK,aAAc,CACvB,CAKE,SAAU,CACJ,KAAK,KAAO,KAAK,IAAI,iBACvB,KAAK,IAAI,gBAAiB,EAE5BivD,EAAM,oBAAoB,KAAK,GAAG,EAClC,KAAK,SAAW,KAGhB,MAAM,QAAS,CACnB,CAME,yBAA0B,CACxBJ,GAAe,IAAI,CACvB,CAUE,yCAA0C,CACxC,MAAMS,EAAa,KAAK,WAAY,EACpC,IAAIC,EAGJ,MAAMC,EAA4B,IAAM,CACtCD,EAAmC,CAAE,EACrC,QAAS9wD,EAAI,EAAGA,EAAI6wD,EAAW,OAAQ7wD,IAAK,CAC1C,MAAMgK,EAAQ6mD,EAAW7wD,CAAC,EACtBgK,EAAM,OAAS,YACjB8mD,EAAiC,KAAK,CACpC,MAAA9mD,EACA,WAAYA,EAAM,IAC9B,CAAW,CAEX,CACK,EAID+mD,EAA2B,EAC3BF,EAAW,iBAAiB,SAAUE,CAAyB,EAC/D,KAAK,GAAG,UAAW,IAAMF,EAAW,oBAAoB,SAAUE,CAAyB,CAAC,EAC5F,MAAMC,EAAmB,IAAM,CAC7B,QAAShxD,EAAI,EAAGA,EAAI8wD,EAAiC,OAAQ9wD,IAAK,CAChE,MAAMixD,EAAcH,EAAiC9wD,CAAC,EAClDixD,EAAY,MAAM,OAAS,YAAcA,EAAY,MAAM,OAASA,EAAY,aAClFA,EAAY,MAAM,KAAOA,EAAY,WAE/C,CAEMJ,EAAW,oBAAoB,SAAUG,CAAgB,CAC1D,EAID,KAAK,GAAG,wBAAyB,IAAM,CACrCH,EAAW,oBAAoB,SAAUE,CAAyB,EAGlEF,EAAW,oBAAoB,SAAUG,CAAgB,EACzDH,EAAW,iBAAiB,SAAUG,CAAgB,CAC5D,CAAK,EAGD,KAAK,GAAG,sBAAuB,IAAM,CAEnCH,EAAW,oBAAoB,SAAUE,CAAyB,EAClEF,EAAW,iBAAiB,SAAUE,CAAyB,EAG/DF,EAAW,oBAAoB,SAAUG,CAAgB,CAC/D,CAAK,CACL,CAWE,gBAAgBxwD,EAAMm6C,EAAU,CAE9B,GAAIA,IAAa,KAAK,iBAAiBn6C,CAAI,QAAQ,EACjD,OAEF,MAAM0wD,EAAgB1wD,EAAK,YAAa,EACpC,KAAK,GAAG0wD,CAAa,kBAAkB,GACzC,OAAO,KAAK,KAAK,GAAGA,CAAa,kBAAkB,CAAC,EAAE,QAAQC,GAAa,CACxD,KAAK,GAAE,EAAG,GAAGD,CAAa,QAAQ,EAC1C,oBAAoBC,EAAW,KAAK,GAAGD,CAAa,kBAAkB,EAAEC,CAAS,CAAC,CACnG,CAAO,EAEH,KAAK,iBAAiB3wD,CAAI,QAAQ,EAAI,CAACm6C,EACvC,KAAK,GAAGuW,CAAa,kBAAkB,EAAI,KAC3C,KAAK,0BAA0BA,CAAa,CAChD,CAQE,0BAA0BvW,EAAU,CAClC,KAAK,gBAAgB,QAASA,CAAQ,CAC1C,CAQE,0BAA0BA,EAAU,CAClC,KAAK,gBAAgB,QAASA,CAAQ,CAC1C,CASE,0BAA0BjyC,EAAM,CAC9B,MAAMmxC,EAAQL,GAAO9wC,CAAI,EACnB0oD,EAAW,KAAK,GAAE,EAAGvX,EAAM,UAAU,EACrCwX,EAAa,KAAKxX,EAAM,UAAU,EAAG,EAC3C,GAAI,CAAC,KAAK,iBAAiBA,EAAM,WAAW,QAAQ,GAAK,CAACuX,GAAY,CAACA,EAAS,iBAC9E,OAEF,MAAME,EAAY,CAChB,OAAQhsD,GAAK,CACX,MAAMqP,EAAQ,CACZ,KAAM,SACN,OAAQ08C,EACR,cAAeA,EACf,WAAYA,CACb,EACDA,EAAW,QAAQ18C,CAAK,EASpBjM,IAAS,QACX,KAAK+wC,GAAO,WAAW,UAAU,EAAG,EAAC,QAAQ9kC,CAAK,CAErD,EACD,SAASrP,EAAG,CACV+rD,EAAW,SAAS/rD,EAAE,KAAK,CAC5B,EACD,YAAYA,EAAG,CACb+rD,EAAW,YAAY/rD,EAAE,KAAK,CACtC,CACK,EACKisD,EAAkB,UAAY,CAClC,MAAMC,EAAe,CAAE,EACvB,QAASxxD,EAAI,EAAGA,EAAIqxD,EAAW,OAAQrxD,IAAK,CAC1C,IAAIyxD,EAAQ,GACZ,QAAS1R,EAAI,EAAGA,EAAIqR,EAAS,OAAQrR,IACnC,GAAIqR,EAASrR,CAAC,IAAMsR,EAAWrxD,CAAC,EAAG,CACjCyxD,EAAQ,GACR,KACZ,CAEaA,GACHD,EAAa,KAAKH,EAAWrxD,CAAC,CAAC,CAEzC,CACM,KAAOwxD,EAAa,QAClBH,EAAW,YAAYG,EAAa,OAAO,CAE9C,EACD,KAAK3X,EAAM,WAAa,YAAY,EAAIyX,EACxC,OAAO,KAAKA,CAAS,EAAE,QAAQH,GAAa,CAC1C,MAAMh+C,EAAWm+C,EAAUH,CAAS,EACpCC,EAAS,iBAAiBD,EAAWh+C,CAAQ,EAC7C,KAAK,GAAG,UAAW7N,GAAK8rD,EAAS,oBAAoBD,EAAWh+C,CAAQ,CAAC,CAC/E,CAAK,EAGD,KAAK,GAAG,YAAao+C,CAAe,EACpC,KAAK,GAAG,UAAWjsD,GAAK,KAAK,IAAI,YAAaisD,CAAe,CAAC,CAClE,CAQE,oBAAqB,CACnB/X,GAAO,MAAM,QAAQ9wC,GAAQ,CAC3B,KAAK,0BAA0BA,CAAI,CACzC,CAAK,CACL,CAQE,UAAW,CACT,IAAI2Y,EAAK,KAAK,SAAS,IAMvB,GAAI,CAACA,GAAM,EAAE,KAAK,SAAS,gBAAkB,KAAK,yBAA0B,CAE1E,GAAIA,EAAI,CACN,MAAMqwC,EAAQrwC,EAAG,UAAU,EAAI,EAC3BA,EAAG,YACLA,EAAG,WAAW,aAAaqwC,EAAOrwC,CAAE,EAEtCmvC,EAAM,oBAAoBnvC,CAAE,EAC5BA,EAAKqwC,CACb,KAAa,CACLrwC,EAAKmgB,EAAW,cAAc,OAAO,EAGrC,MAAMmwB,EAAgB,KAAK,SAAS,KAAOzqB,GAAc,KAAK,SAAS,GAAG,EACpE3yB,EAAagvB,GAAQ,CAAE,EAAEouB,CAAa,GACxC,CAAC1sB,IAAiB,KAAK,SAAS,yBAA2B,KAC7D,OAAO1wB,EAAW,SAEpByyB,GAAc3lB,EAAI,OAAO,OAAO9M,EAAY,CAC1C,GAAI,KAAK,SAAS,OAClB,MAAO,UACjB,CAAS,CAAC,CACV,CACM8M,EAAG,SAAW,KAAK,SAAS,QAClC,CACQ,OAAO,KAAK,SAAS,QAAY,KACnCimB,GAAajmB,EAAI,UAAW,KAAK,SAAS,OAAO,EAE/C,KAAK,SAAS,0BAA4B,SAC5CA,EAAG,wBAA0B,KAAK,SAAS,yBAM7C,MAAMuwC,EAAgB,CAAC,OAAQ,QAAS,cAAe,UAAU,EACjE,QAAS5xD,EAAI,EAAGA,EAAI4xD,EAAc,OAAQ5xD,IAAK,CAC7C,MAAMyU,EAAOm9C,EAAc5xD,CAAC,EACtByC,EAAQ,KAAK,SAASgS,CAAI,EAC5B,OAAOhS,EAAU,MACfA,EACF6kC,GAAajmB,EAAI5M,EAAMA,CAAI,EAE3B8yB,GAAgBlmB,EAAI5M,CAAI,EAE1B4M,EAAG5M,CAAI,EAAIhS,EAEnB,CACI,OAAO4e,CACX,CAeE,gBAAgBA,EAAI,CAClB,GAAIA,EAAG,eAAiB,GAAKA,EAAG,eAAiB,EAG/C,OAEF,GAAIA,EAAG,aAAe,EAAG,CAWvB,IAAIwwC,EAAiB,GACrB,MAAMC,EAAoB,UAAY,CACpCD,EAAiB,EAClB,EACD,KAAK,GAAG,YAAaC,CAAiB,EACtC,MAAMC,EAAmB,UAAY,CAG9BF,GACH,KAAK,QAAQ,WAAW,CAE3B,EACD,KAAK,GAAG,iBAAkBE,CAAgB,EAC1C,KAAK,MAAM,UAAY,CACrB,KAAK,IAAI,YAAaD,CAAiB,EACvC,KAAK,IAAI,iBAAkBC,CAAgB,EACtCF,GAEH,KAAK,QAAQ,WAAW,CAElC,CAAO,EACD,MACN,CAMI,MAAMG,EAAkB,CAAC,WAAW,EAGpCA,EAAgB,KAAK,gBAAgB,EAGjC3wC,EAAG,YAAc,GACnB2wC,EAAgB,KAAK,YAAY,EAI/B3wC,EAAG,YAAc,GACnB2wC,EAAgB,KAAK,SAAS,EAI5B3wC,EAAG,YAAc,GACnB2wC,EAAgB,KAAK,gBAAgB,EAIvC,KAAK,MAAM,UAAY,CACrBA,EAAgB,QAAQ,SAAUxxD,EAAM,CACtC,KAAK,QAAQA,CAAI,CAClB,EAAE,IAAI,CACb,CAAK,CACL,CAWE,aAAayxD,EAAa,CACxB,KAAK,aAAeA,CACxB,CASE,WAAY,CACV,OAAO,KAAK,YAChB,CAQE,eAAete,EAAS,CACtB,GAAI,CACE,KAAK,cAAgB,KAAK,IAAI,UAAYnO,GAC5C,KAAK,IAAI,SAASmO,CAAO,EAEzB,KAAK,IAAI,YAAcA,CAE1B,OAAQruC,EAAG,CACVy9B,EAAMz9B,EAAG,gCAAgC,CAE/C,CACA,CAQE,UAAW,CAKT,GAAI,KAAK,IAAI,WAAa,KAAY0+B,IAAcK,IAAa,KAAK,IAAI,cAAgB,EAAG,CAG3F,MAAM6tB,EAAgB,IAAM,CACtB,KAAK,IAAI,YAAc,IAErB,KAAK,IAAI,WAAa,KACxB,KAAK,QAAQ,gBAAgB,EAE/B,KAAK,IAAI,aAAcA,CAAa,EAEvC,EACD,YAAK,GAAG,aAAcA,CAAa,EAC5B,GACb,CACI,OAAO,KAAK,IAAI,UAAY,GAChC,CAQE,OAAQ,CACN,OAAO,KAAK,IAAI,WACpB,CAQE,QAAS,CACP,OAAO,KAAK,IAAI,YACpB,CAYE,wBAAyB,CACvB,GAAI,EAAE,+BAAgC,KAAK,KACzC,OAEF,MAAMC,EAAQ,UAAY,CACxB,KAAK,QAAQ,mBAAoB,CAC/B,aAAc,EACtB,CAAO,EAEG,KAAK,IAAI,UAAY,CAAC,KAAK,SAAS,wBAA0B,KAAK,aACrE,KAAK,IAAI,SAAW,GAEvB,EACKC,EAAU,UAAY,CACtB,2BAA4B,KAAK,KAAO,KAAK,IAAI,yBAA2B,uBAC9E,KAAK,IAAI,sBAAuBD,CAAK,EACrC,KAAK,QAAQ,mBAAoB,CAC/B,aAAc,GAEd,oBAAqB,EAC/B,CAAS,EAEJ,EACD,KAAK,GAAG,wBAAyBC,CAAO,EACxC,KAAK,GAAG,UAAW,IAAM,CACvB,KAAK,IAAI,wBAAyBA,CAAO,EACzC,KAAK,IAAI,sBAAuBD,CAAK,CAC3C,CAAK,CACL,CASE,oBAAqB,CACnB,OAAO,OAAO,KAAK,IAAI,uBAA0B,UACrD,CAKE,iBAAkB,CAChB,MAAME,EAAQ,KAAK,IACnB,GAAIA,EAAM,QAAUA,EAAM,cAAgBA,EAAM,cAG9C3d,GAAe,KAAK,IAAI,MAAM,EAI9B,KAAK,WAAW,UAAY,CAC1B2d,EAAM,MAAO,EACb,GAAI,CACFA,EAAM,sBAAuB,CAC9B,OAAQ/sD,EAAG,CACV,KAAK,QAAQ,kBAAmBA,CAAC,CAC3C,CACO,EAAE,CAAC,MAEJ,IAAI,CACF+sD,EAAM,sBAAuB,CAC9B,OAAQ/sD,EAAG,CACV,KAAK,QAAQ,kBAAmBA,CAAC,CACzC,CAEA,CAKE,gBAAiB,CACf,GAAI,CAAC,KAAK,IAAI,2BAA4B,CACxC,KAAK,QAAQ,kBAAmB,IAAI,MAAM,6BAA6B,CAAC,EACxE,MACN,CACI,KAAK,IAAI,qBAAsB,CACnC,CAYE,yBAA0B,CACxB,OAAO,KAAK,IAAI,wBAAyB,CAC7C,CAWE,0BAA0Bo1C,EAAI,CAC5B,OAAI,KAAK,4BAA8B,CAAC,KAAK,IAAI,WACxC,KAAK,IAAI,0BAA0BA,CAAE,EAEvC,MAAM,0BAA0BA,CAAE,CAC7C,CAOE,yBAAyBt1B,EAAI,CACvB,KAAK,4BAA8B,CAAC,KAAK,IAAI,WAC/C,KAAK,IAAI,yBAAyBA,CAAE,EAEpC,MAAM,yBAAyBA,CAAE,CAEvC,CAeE,IAAIrG,EAAK,CACP,GAAIA,IAAQ,OACV,OAAO,KAAK,IAAI,IAIlB,KAAK,OAAOA,CAAG,CACnB,CAME,OAAQ,CACNyxC,EAAM,kBAAkB,KAAK,GAAG,CACpC,CAUE,YAAa,CACX,OAAI,KAAK,eACA,KAAK,eAAe,IAEtB,KAAK,IAAI,UACpB,CAQE,YAAYjmD,EAAK,CACf,KAAK,IAAI,SAAW,CAAC,CAACA,CAC1B,CAiBE,aAAaqvC,EAAMtoB,EAAOoC,EAAU,CAClC,OAAK,KAAK,yBAGH,KAAK,IAAI,aAAakmB,EAAMtoB,EAAOoC,CAAQ,EAFzC,MAAM,aAAakmB,EAAMtoB,EAAOoC,CAAQ,CAGrD,CA8BE,sBAAsBnyB,EAAS,CAC7B,GAAI,CAAC,KAAK,yBACR,OAAO,MAAM,sBAAsBA,CAAO,EAE5C,MAAMk5C,EAAmBjZ,EAAW,cAAc,OAAO,EACzD,OAAIjgC,EAAQ,OACVk5C,EAAiB,KAAOl5C,EAAQ,MAE9BA,EAAQ,QACVk5C,EAAiB,MAAQl5C,EAAQ,QAE/BA,EAAQ,UAAYA,EAAQ,WAC9Bk5C,EAAiB,QAAUl5C,EAAQ,UAAYA,EAAQ,SAErDA,EAAQ,UACVk5C,EAAiB,QAAUl5C,EAAQ,SAEjCA,EAAQ,KACVk5C,EAAiB,GAAKl5C,EAAQ,IAE5BA,EAAQ,MACVk5C,EAAiB,IAAMl5C,EAAQ,KAE1Bk5C,CACX,CAcE,mBAAmBl5C,EAASi5C,EAAe,CACzC,MAAMC,EAAmB,MAAM,mBAAmBl5C,EAASi5C,CAAa,EACxE,OAAI,KAAK,0BACP,KAAK,GAAE,EAAG,YAAYC,CAAgB,EAEjCA,CACX,CAQE,sBAAsBzwC,EAAO,CAE3B,GADA,MAAM,sBAAsBA,CAAK,EAC7B,KAAK,yBAA0B,CACjC,MAAMosC,EAAS,KAAK,GAAG,OAAO,EAC9B,IAAIp2C,EAAIo2C,EAAO,OACf,KAAOp2C,MACDgK,IAAUosC,EAAOp2C,CAAC,GAAKgK,IAAUosC,EAAOp2C,CAAC,EAAE,QAC7C,KAAK,GAAI,EAAC,YAAYo2C,EAAOp2C,CAAC,CAAC,CAGzC,CACA,CAWE,yBAA0B,CACxB,GAAI,OAAO,KAAK,KAAK,yBAA4B,WAC/C,OAAO,KAAK,GAAI,EAAC,wBAAyB,EAE5C,MAAMsyD,EAAuB,CAAE,EAC/B,OAAI,OAAO,KAAK,GAAI,EAAC,wBAA4B,KAAe,OAAO,KAAK,GAAE,EAAG,wBAA4B,MAC3GA,EAAqB,mBAAqB,KAAK,GAAI,EAAC,wBACpDA,EAAqB,iBAAmB,KAAK,GAAI,EAAC,yBAEhDrwB,EAAS,cACXqwB,EAAqB,aAAerwB,EAAS,YAAY,IAAK,GAEzDqwB,CACX,CACA,CAWA7uB,GAAmB+sB,EAAO,WAAY,UAAY,CAChD,GAAI,CAACtrB,GAAM,EACT,OAEF,MAAMmtB,EAAQ7wB,EAAW,cAAc,OAAO,EACxCx3B,EAAQw3B,EAAW,cAAc,OAAO,EAC9C,OAAAx3B,EAAM,KAAO,WACbA,EAAM,QAAU,KAChBA,EAAM,MAAQ,UACdqoD,EAAM,YAAYroD,CAAK,EAChBqoD,CACT,CAAC,EASD7B,EAAM,YAAc,UAAY,CAE9B,GAAI,CACFA,EAAM,SAAS,OAAS,EACzB,MAAW,CACV,MAAO,EACX,CACE,MAAO,CAAC,EAAEA,EAAM,UAAYA,EAAM,SAAS,YAC7C,EASAA,EAAM,YAAc,SAAUhwD,EAAM,CAClC,OAAOgwD,EAAM,SAAS,YAAYhwD,CAAI,CACxC,EAWAgwD,EAAM,cAAgB,SAAU3V,EAAQt5C,EAAS,CAC/C,OAAOivD,EAAM,YAAY3V,EAAO,IAAI,CACtC,EAWA2V,EAAM,iBAAmB,UAAY,CAEnC,GAAI,CACF,MAAM1J,EAAS0J,EAAM,SAAS,OAC9BA,EAAM,SAAS,OAAS1J,EAAS,EAAI,GACrC,MAAMyL,EAAazL,IAAW0J,EAAM,SAAS,OAO7C,OAAI+B,GAAchtB,IAChBtD,EAAS,WAAW,IAAM,CACpBuuB,GAASA,EAAM,YACjBA,EAAM,UAAU,sBAAwB1J,IAAW0J,EAAM,SAAS,OAE5E,CAAO,EAGM,IAEF+B,CACR,MAAW,CACV,MAAO,EACX,CACA,EAWA/B,EAAM,cAAgB,UAAY,CAChC,GAAI,CACF,MAAMgC,EAAQhC,EAAM,SAAS,MAI7B,OAAAA,EAAM,SAAS,MAAQ,CAACgC,EACpBhC,EAAM,SAAS,MACjBlpB,GAAakpB,EAAM,SAAU,QAAS,OAAO,EAE7CjpB,GAAgBipB,EAAM,SAAU,QAAS,OAAO,EAE3CgC,IAAUhC,EAAM,SAAS,KACjC,MAAW,CACV,MAAO,EACX,CACA,EASAA,EAAM,uBAAyB,UAAY,CAGzC,GAAIxsB,IAAcK,IAAaE,GAAiB,GAC9C,MAAO,GAGT,GAAI,CACF,MAAMkuB,EAAejC,EAAM,SAAS,aACpC,OAAAA,EAAM,SAAS,aAAeiC,EAAe,EAAI,GAC1CA,IAAiBjC,EAAM,SAAS,YACxC,MAAW,CACV,MAAO,EACX,CACA,EAUAA,EAAM,sBAAwB,UAAY,CAGxC,GAAI,CACF,MAAMhtD,EAAO,IAAM,CAAE,EACrB,OAAO,eAAeg+B,EAAW,cAAc,OAAO,EAAG,MAAO,CAC9D,IAAKh+B,EACL,IAAKA,CACX,CAAK,EACD,OAAO,eAAeg+B,EAAW,cAAc,OAAO,EAAG,MAAO,CAC9D,IAAKh+B,EACL,IAAKA,CACX,CAAK,EACD,OAAO,eAAeg+B,EAAW,cAAc,OAAO,EAAG,YAAa,CACpE,IAAKh+B,EACL,IAAKA,CACX,CAAK,EACD,OAAO,eAAeg+B,EAAW,cAAc,OAAO,EAAG,YAAa,CACpE,IAAKh+B,EACL,IAAKA,CACX,CAAK,CACF,MAAW,CACV,MAAO,EACX,CACE,MAAO,EACT,EASAgtD,EAAM,yBAA2B,UAAY,CAC3C,OAAOhrB,IAAiBD,IAAUlB,EACpC,EASAmsB,EAAM,0BAA4B,UAAY,CAC5C,MAAO,CAAC,EAAEA,EAAM,UAAYA,EAAM,SAAS,YAC7C,EASAA,EAAM,0BAA4B,UAAY,CAC5C,MAAO,CAAC,EAAEA,EAAM,UAAYA,EAAM,SAAS,YAC7C,EAQAA,EAAM,OAAS,CAAC,YAAa,UAAW,QAAS,QAAS,UAAW,UAAW,iBAAkB,aAAc,UAAW,iBAAkB,UAAW,UAAW,UAAW,SAAU,QAAS,iBAAkB,aAAc,WAAY,OAAQ,QAAS,aAAc,SAAU,cAAc,EAiDpS,CAAC,CAAC,sBAAuB,eAAe,EAAG,CAAC,uBAAwB,wBAAwB,EAAG,CAAC,oBAAqB,uBAAuB,EAAG,CAAC,2BAA4B,0BAA0B,EAAG,CAAC,4BAA6B,2BAA2B,EAAG,CAAC,4BAA6B,2BAA2B,CAAC,EAAE,QAAQ,SAAU,CAACltD,EAAK7D,CAAE,EAAG,CAC5VgkC,GAAmB+sB,EAAM,UAAWltD,EAAK,IAAMktD,EAAM/wD,CAAE,EAAG,EAAE,EAAI,CAClE,CAAC,EACD+wD,EAAM,UAAU,sBAAwBA,EAAM,iBAAkB,EAUhEA,EAAM,UAAU,wBAA0B,CAACjrB,GAW3CirB,EAAM,UAAU,yBAA2B,GAS3CA,EAAM,UAAU,uBAAyB,GAQzCA,EAAM,UAAU,yBAA2B,GAO3CA,EAAM,UAAU,2BAA6B,CAAC,EAAEA,EAAM,UAAYA,EAAM,SAAS,2BACjFA,EAAM,oBAAsB,SAAUnvC,EAAI,CACxC,GAAKA,EAQL,KALIA,EAAG,YACLA,EAAG,WAAW,YAAYA,CAAE,EAIvBA,EAAG,iBACRA,EAAG,YAAYA,EAAG,UAAU,EAK9BA,EAAG,gBAAgB,KAAK,EAIpB,OAAOA,EAAG,MAAS,YAEpB,UAAY,CACX,GAAI,CACFA,EAAG,KAAM,CACV,MAAW,CAElB,CACA,EAAQ,EAER,EACAmvC,EAAM,kBAAoB,SAAUnvC,EAAI,CACtC,GAAI,CAACA,EACH,OAEF,MAAMmiB,EAAUniB,EAAG,iBAAiB,QAAQ,EAC5C,IAAIrhB,EAAIwjC,EAAQ,OAChB,KAAOxjC,KACLqhB,EAAG,YAAYmiB,EAAQxjC,CAAC,CAAC,EAK3BqhB,EAAG,gBAAgB,KAAK,EACpB,OAAOA,EAAG,MAAS,YAEpB,UAAY,CACX,GAAI,CACFA,EAAG,KAAM,CACV,MAAW,CAElB,CACA,EAAQ,CAER,EAMA,CAaA,QAeA,eAaA,WAaA,WAgBA,OAcA,aAAa,EAAE,QAAQ,SAAU/W,EAAM,CACrCkmD,EAAM,UAAUlmD,CAAI,EAAI,UAAY,CAClC,OAAO,KAAK,IAAIA,CAAI,GAAK,KAAK,IAAI,aAAaA,CAAI,CACpD,CACH,CAAC,EAMD,CAYA,QAYA,eAYA,WAeA,OAaA,aAAa,EAAE,QAAQ,SAAUA,EAAM,CACrCkmD,EAAM,UAAU,MAAQ7hB,GAAcrkC,CAAI,CAAC,EAAI,SAAU/D,EAAG,CAC1D,KAAK,IAAI+D,CAAI,EAAI/D,EACbA,EACF,KAAK,IAAI,aAAa+D,EAAMA,CAAI,EAEhC,KAAK,IAAI,gBAAgBA,CAAI,CAEhC,CACH,CAAC,EAOD,CAWA,SAWA,cAYA,WAYA,SAYA,SAkBA,UAaA,QAaA,UAYA,WAaA,QAcA,eAiBA,sBAYA,0BAYA,SAgBA,eAkBA,aAYA,aAYA,cAaA,aAAa,EAAE,QAAQ,SAAUA,EAAM,CACrCkmD,EAAM,UAAUlmD,CAAI,EAAI,UAAY,CAClC,OAAO,KAAK,IAAIA,CAAI,CACrB,CACH,CAAC,EAOD,CAYA,SAWA,MAYA,SAkBA,UAcA,eAiBA,sBAWA,0BAaA,aAAa,EAAE,QAAQ,SAAUA,EAAM,CACrCkmD,EAAM,UAAU,MAAQ7hB,GAAcrkC,CAAI,CAAC,EAAI,SAAU/D,EAAG,CAC1D,KAAK,IAAI+D,CAAI,EAAI/D,CAClB,CACH,CAAC,EAKD,CAQA,QAQA,OAQA,MAAM,EAAE,QAAQ,SAAU+D,EAAM,CAC9BkmD,EAAM,UAAUlmD,CAAI,EAAI,UAAY,CAClC,OAAO,KAAK,IAAIA,CAAI,EAAG,CACxB,CACH,CAAC,EACDomC,EAAK,mBAAmB8f,CAAK,EAW7BA,EAAM,oBAAsB,CAAE,EAW9BA,EAAM,oBAAoB,YAAc,SAAUhwD,EAAM,CAEtD,GAAI,CACF,OAAOgwD,EAAM,SAAS,YAAYhwD,CAAI,CACvC,MAAW,CACV,MAAO,EACX,CACA,EAcAgwD,EAAM,oBAAoB,gBAAkB,SAAUnyC,EAAQ9c,EAAS,CAErE,GAAI8c,EAAO,KACT,OAAOmyC,EAAM,oBAAoB,YAAYnyC,EAAO,IAAI,EAGnD,GAAIA,EAAO,IAAK,CACrB,MAAM8+B,EAAMxF,GAAiBt5B,EAAO,GAAG,EACvC,OAAOmyC,EAAM,oBAAoB,YAAY,SAASrT,CAAG,EAAE,CAC/D,CACE,MAAO,EACT,EAcAqT,EAAM,oBAAoB,aAAe,SAAUnyC,EAAQw2B,EAAMtzC,EAAS,CACxEszC,EAAK,OAAOx2B,EAAO,GAAG,CACxB,EAKAmyC,EAAM,oBAAoB,QAAU,UAAY,CAAE,EAGlDA,EAAM,sBAAsBA,EAAM,mBAAmB,EACrD9f,EAAK,aAAa,QAAS8f,CAAK,EAiBhC,MAAMkC,GAAwB,CAe9B,WAeA,QAeA,UAeA,UAeA,UAeA,iBAeA,aAeA,aAeA,SAeA,eAeA,iBAAiB,EAKXC,GAAoB,CACxB,QAAS,UACT,eAAgB,iBAChB,QAAS,UACT,OAAQ,QACV,EACMC,GAAmB,CAAC,OAAQ,SAAU,QAAS,SAAU,QAAS,SAAU,MAAM,EAClFC,GAAqB,CAAE,EAS7BD,GAAiB,QAAQtsD,GAAK,CAC5B,MAAMC,EAAID,EAAE,OAAO,CAAC,IAAM,IAAM,KAAKA,EAAE,UAAU,CAAC,CAAC,GAAKA,EACxDusD,GAAmBvsD,CAAC,EAAI,cAAcC,CAAC,EACzC,CAAC,EACD,MAAMusD,GAAsB,CAC1B,KAAM,IACN,OAAQ,IACR,MAAO,IACP,OAAQ,IACR,MAAO,KACP,OAAQ,KACR,KAAM,GACR,EAcA,MAAMhgB,WAAe9D,CAAY,CAa/B,YAAY54B,EAAK7U,EAAS2tC,EAAO,CA2B/B,GAxBA94B,EAAI,GAAKA,EAAI,IAAM7U,EAAQ,IAAM,aAAaipC,GAAO,CAAE,GAOvDjpC,EAAU,OAAO,OAAOuxC,GAAO,eAAe18B,CAAG,EAAG7U,CAAO,EAI3DA,EAAQ,aAAe,GAGvBA,EAAQ,SAAW,GAGnBA,EAAQ,QAAU,GAIlBA,EAAQ,oBAAsB,GAG1B,CAACA,EAAQ,SAAU,CACrB,MAAMwxD,EAAU38C,EAAI,QAAQ,QAAQ,EAChC28C,IACFxxD,EAAQ,SAAWwxD,EAAQ,aAAa,MAAM,EAEtD,CA8DI,GA3DA,MAAM,KAAMxxD,EAAS2tC,CAAK,EAG1B,KAAK,+BAAiC5pC,GAAK,KAAK,0BAA0BA,CAAC,EAC3E,KAAK,yBAA2BA,GAAK,KAAK,mBAAmBA,CAAC,EAC9D,KAAK,oBAAsBA,GAAK,KAAK,eAAeA,CAAC,EACrD,KAAK,oBAAsBA,GAAK,KAAK,eAAeA,CAAC,EACrD,KAAK,8BAAgCA,GAAK,KAAK,yBAAyBA,CAAC,EACzE,KAAK,sBAAwBA,GAAK,KAAK,iBAAiBA,CAAC,EACzD,KAAK,4BAA8BA,GAAK,KAAK,uBAAuBA,CAAC,EACrE,KAAK,2BAA6BA,GAAK,KAAK,sBAAsBA,CAAC,EACnE,KAAK,0BAA4BA,GAAK,KAAK,qBAAqBA,CAAC,EACjE,KAAK,yBAA2BA,GAAK,KAAK,oBAAoBA,CAAC,EAC/D,KAAK,oBAAsBA,GAAK,KAAK,eAAeA,CAAC,EACrD,KAAK,wCAA0CA,GAAK,KAAK,mCAAmCA,CAAC,EAG7F,KAAK,cAAgB,GAGrB,KAAK,IAAM09B,GAAa,KAAK,GAAG,EAGhC,KAAK,OAAS5B,GAGd,KAAK,kBAAoB,GAIzB,KAAK,iBAAmB,CAAE,EAG1B,KAAK,SAAW,GAGhB,KAAK,YAAc,GAGnB,KAAK,YAAc,GAGnB,KAAK,cAAgB,GAGrB,KAAK,eAAiB,GAGtB,KAAK,iBAAmB,GAGxB,KAAK,gBAAkB,CACrB,iBAAkB,KAClB,aAAc,KACd,eAAgB,CAAA,CACjB,EAIG,CAAC,KAAK,UAAY,CAAC,KAAK,SAAS,WAAa,CAAC,KAAK,SAAS,UAAU,OACzE,MAAM,IAAI,MAAM,yHAAmI,EAarJ,GATA,KAAK,IAAMhrB,EAGX,KAAK,cAAgBA,GAAO8wB,GAAc9wB,CAAG,EAG7C,KAAK,SAAS,KAAK,SAAS,QAAQ,EAGhC7U,EAAQ,UAAW,CAErB,MAAMyxD,EAAmB,CAAE,EAC3B,OAAO,oBAAoBzxD,EAAQ,SAAS,EAAE,QAAQ,SAAUmH,EAAM,CACpEsqD,EAAiBtqD,EAAK,YAAW,CAAE,EAAInH,EAAQ,UAAUmH,CAAI,CACrE,CAAO,EACD,KAAK,WAAasqD,CACxB,MACM,KAAK,WAAalgB,GAAO,UAAU,SAAS,UAE9C,KAAK,YAAa,EAIlB,KAAK,QAAUvxC,EAAQ,QAAU,GAIjC,KAAK,UAAY,CAAC,CAACA,EAAQ,SAK3B6U,EAAI,SAAW,GACfA,EAAI,gBAAgB,UAAU,EAC9B,KAAK,aAAe,GACpB,KAAK,eAAiB,CAAE,EACxB,KAAK,qBAAuB,CAAE,EAG1BA,EAAI,aAAa,UAAU,EAC7B,KAAK,SAAS,EAAI,EAIlB,KAAK,SAAS,KAAK,SAAS,QAAQ,EAIlC7U,EAAQ,SACV,OAAO,KAAKA,EAAQ,OAAO,EAAE,QAAQmH,GAAQ,CAC3C,GAAI,OAAO,KAAKA,CAAI,GAAM,WACxB,MAAM,IAAI,MAAM,WAAWA,CAAI,kBAAkB,CAE3D,CAAO,EASH,KAAK,WAAa,GAClB,KAAK,IAAM,KAAK,SAAU,EAG1BwlC,GAAQ,KAAM,CACZ,YAAa,KACnB,CAAK,EAMG,KAAK,OAAO,oBACd/C,GAAG3J,EAAY,KAAK,OAAO,iBAAkB,KAAK,8BAA8B,EAChF,KAAK,GAAG,KAAK,OAAO,iBAAkB,KAAK,8BAA8B,GAEvE,KAAK,QACP,KAAK,GAAG,CAAC,cAAe,QAAQ,EAAG,KAAK,mBAAmB,EAM7D,MAAMyxB,EAAoB1vB,GAAQ,KAAK,QAAQ,EAgB/C,GAbIhiC,EAAQ,SACV,OAAO,KAAKA,EAAQ,OAAO,EAAE,QAAQmH,GAAQ,CAC3C,KAAKA,CAAI,EAAEnH,EAAQ,QAAQmH,CAAI,CAAC,CACxC,CAAO,EAICnH,EAAQ,OACV,KAAK,MAAM,EAAI,EAEjB,KAAK,SAAS,cAAgB0xD,EAC9B,KAAK,YAAc,CAAE,EACrB,KAAK,cAAc1xD,EAAQ,aAAa,EACpCA,EAAQ,qBAAsB,CAGhC,MAAM2xD,EADS,IAAIjxB,EAAS,UAAW,EACd,gBAAgB0b,GAAO,eAAe,EAE/D,GADkBuV,EAAU,cAAc,aAAa,EAErDnwB,EAAM,KAAK,uDAAuD,EAClE,KAAK,SAAS,qBAAuB,SAChC,CACL,MAAMowB,EAASD,EAAU,gBACzBC,EAAO,MAAM,QAAU,OACvB,KAAK,IAAI,YAAYA,CAAM,EAC3B,KAAK,SAAS,uBAAuB,CAC7C,CACA,CACI,KAAK,aAAc,EAGnB,KAAK,QAAQ/8C,EAAI,SAAS,YAAW,IAAO,OAAO,EAI/C,KAAK,WACP,KAAK,SAAS,sBAAsB,EAEpC,KAAK,SAAS,uBAAuB,EAIvC,KAAK,IAAI,aAAa,OAAQ,QAAQ,EAClC,KAAK,UACP,KAAK,IAAI,aAAa,aAAc,KAAK,SAAS,cAAc,CAAC,EAEjE,KAAK,IAAI,aAAa,aAAc,KAAK,SAAS,cAAc,CAAC,EAE/D,KAAK,WACP,KAAK,SAAS,WAAW,EAKvB7U,EAAQ,mBAAqBA,EAAQ,kBAAkB,UACzD,KAAK,kBAAoB,IAAIy8C,GAAkB,IAAI,EACnD,KAAK,SAAS,gCAAgC,GAO5C/Y,IACF,KAAK,SAAS,mBAAmB,EAI9BM,IACH,KAAK,SAAS,kBAAkB,EAIlCuN,GAAO,QAAQ,KAAK,GAAG,EAAI,KAG3B,MAAMsgB,EAAexyB,GAAU,MAAM,GAAG,EAAE,CAAC,EAC3C,KAAK,SAAS,QAAQwyB,CAAY,EAAE,EAIpC,KAAK,WAAW,EAAI,EACpB,KAAK,mBAAoB,EACzB,KAAK,IAAI,OAAQ9tD,GAAK,KAAK,uBAAuBA,CAAC,CAAC,EACpD,KAAK,GAAG,UAAWA,GAAK,KAAK,cAAcA,CAAC,CAAC,EAC7C,KAAK,GAAG,iBAAkBA,GAAK,KAAK,qBAAqBA,CAAC,CAAC,EAC3D,KAAK,YAAY,KAAK,SAAS,WAAW,EAC1C,KAAK,WAAW,KAAK,SAAS,UAAU,EAIxC,KAAK,GAAG,QAAS,IAAM,CAGrB,KAAK,gBAAgB,KAAK,SAAS,eAAe,EAClD,KAAK,cAAc,KAAK,SAAS,aAAa,CACpD,CAAK,CACL,CAUE,SAAU,CAOR,KAAK,QAAQ,SAAS,EAEtB,KAAK,IAAI,SAAS,EAGlBimC,GAAI/J,EAAY,KAAK,OAAO,iBAAkB,KAAK,8BAA8B,EACjF+J,GAAI/J,EAAY,UAAW,KAAK,wBAAwB,EACpD,KAAK,UAAY,KAAK,SAAS,aACjC,KAAK,SAAS,WAAW,YAAY,KAAK,QAAQ,EAClD,KAAK,SAAW,MAIlBsR,GAAO,QAAQ,KAAK,GAAG,EAAI,KACvB,KAAK,KAAO,KAAK,IAAI,SACvB,KAAK,IAAI,OAAS,MAEhB,KAAK,KAAO,KAAK,IAAI,SACvB,KAAK,IAAI,OAAS,MAEhB,KAAK,QACP,KAAK,MAAM,QAAS,EACpB,KAAK,kBAAoB,GACzB,KAAK,QAAU,IAEb,KAAK,kBACP,KAAK,gBAAkB,MAErB,KAAK,MACP,KAAK,IAAM,MAEb2J,GAAoB,IAAI,EAKxB/C,GAAI,MAAM,QAAQhxC,GAAQ,CACxB,MAAMmxC,EAAQH,GAAIhxC,CAAI,EAChBkV,EAAO,KAAKi8B,EAAM,UAAU,EAAG,EAIjCj8B,GAAQA,EAAK,KACfA,EAAK,IAAK,CAElB,CAAK,EAGD,MAAM,QAAQ,CACZ,UAAW,KAAK,SAAS,SAC/B,CAAK,CACL,CAQE,UAAW,CACT,IAAIxH,EAAM,KAAK,IACXiL,EACAgyC,EAAiB,KAAK,gBAAkBj9C,EAAI,YAAcA,EAAI,WAAW,cAAgBA,EAAI,WAAW,aAAa,iBAAiB,EAC1I,MAAMk9C,EAAW,KAAK,IAAI,QAAQ,YAAa,IAAK,WAChDD,EACFhyC,EAAK,KAAK,IAAMjL,EAAI,WACVk9C,IACVjyC,EAAK,KAAK,IAAM,MAAM,SAAS,KAAK,GAKtC,MAAM7M,EAAQ0yB,GAAc9wB,CAAG,EAC/B,GAAIk9C,EAAU,CAGZ,IAFAjyC,EAAK,KAAK,IAAMjL,EAChBA,EAAM,KAAK,IAAMorB,EAAW,cAAc,OAAO,EAC1CngB,EAAG,SAAS,QACjBjL,EAAI,YAAYiL,EAAG,UAAU,EAE1BklB,GAASllB,EAAI,UAAU,GAC1BolB,GAASplB,EAAI,UAAU,EAEzBA,EAAG,YAAYjL,CAAG,EAClBi9C,EAAiB,KAAK,gBAAkBhyC,EAKxC,OAAO,KAAKA,CAAE,EAAE,QAAQ/a,GAAK,CAC3B,GAAI,CACF8P,EAAI9P,CAAC,EAAI+a,EAAG/a,CAAC,CACd,MAAW,CAEpB,CACA,CAAO,CACP,CAGI8P,EAAI,aAAa,WAAY,IAAI,EACjC5B,EAAM,SAAW,KAMb6vB,IAAaM,KACfvuB,EAAI,aAAa,OAAQ,aAAa,EACtC5B,EAAM,KAAO,eAIf4B,EAAI,gBAAgB,OAAO,EAC3BA,EAAI,gBAAgB,QAAQ,EACxB,UAAW5B,GACb,OAAOA,EAAM,MAEX,WAAYA,GACd,OAAOA,EAAM,OAEf,OAAO,oBAAoBA,CAAK,EAAE,QAAQ,SAAUC,EAAM,CAIlD6+C,GAAY7+C,IAAS,SACzB4M,EAAG,aAAa5M,EAAMD,EAAMC,CAAI,CAAC,EAE/B6+C,GACFl9C,EAAI,aAAa3B,EAAMD,EAAMC,CAAI,CAAC,CAE1C,CAAK,EAKD2B,EAAI,SAAWA,EAAI,GACnBA,EAAI,IAAM,aACVA,EAAI,UAAY,WAGhBA,EAAI,OAASiL,EAAG,OAAS,KAEzB,KAAK,SAAS,YAAY,EAC1B,MAAMkyC,EAAmB,CAAC,cAAe,WAAY,WAAY,aAAc,UAAW,YAAa,wBAAwB,EAAE,OAAOjwD,GAAOmiC,GAAQniC,CAAG,CAAC,EAAE,IAAIA,GACxJ,cAAgBA,EAAI,UAAU,CAAC,EAAE,cAAc,QAAQ,MAAO,GAAG,CACzE,EAMD,GALA,KAAK,SAAS,GAAGiwD,CAAgB,EAK7BtxB,EAAS,2BAA6B,GAAM,CAC9C,KAAK,SAAWkI,GAAmB,uBAAuB,EAC1D,MAAMqpB,EAAkB3qB,GAAE,sBAAsB,EAC1C4qB,EAAO5qB,GAAE,MAAM,EACrB4qB,EAAK,aAAa,KAAK,SAAUD,EAAkBA,EAAgB,YAAcC,EAAK,UAAU,CACtG,CACI,KAAK,MAAQ,GACb,KAAK,OAAS,GAGd,KAAK,MAAM,KAAK,SAAS,KAAK,EAC9B,KAAK,OAAO,KAAK,SAAS,MAAM,EAChC,KAAK,KAAK,KAAK,SAAS,IAAI,EAC5B,KAAK,MAAM,KAAK,SAAS,KAAK,EAC9B,KAAK,YAAY,KAAK,SAAS,WAAW,EAE1C,KAAK,YAAY,KAAK,SAAS,aAAe,KAAK,SAAS,WAAW,EAIvE,MAAMC,EAAQt9C,EAAI,qBAAqB,GAAG,EAC1C,QAASpW,EAAI,EAAGA,EAAI0zD,EAAM,OAAQ1zD,IAAK,CACrC,MAAM2zD,EAASD,EAAM,KAAK1zD,CAAC,EAC3BymC,GAASktB,EAAQ,YAAY,EAC7BA,EAAO,aAAa,SAAU,QAAQ,CAC5C,CAII,OAAAv9C,EAAI,kBAAoBA,EAAI,aAGxBA,EAAI,YAAc,CAACi9C,GACrBj9C,EAAI,WAAW,aAAaiL,EAAIjL,CAAG,EAQrCkwB,GAAUlwB,EAAKiL,CAAE,EACjB,KAAK,UAAU,QAAQjL,CAAG,EAI1B,KAAK,IAAI,aAAa,OAAQ,KAAK,SAAS,EAC5C,KAAK,IAAI,aAAa,YAAa,IAAI,EACvC,KAAK,IAAMiL,EACJA,CACX,CAiBE,YAAY5e,EAAO,CAEjB,GAAI,OAAOA,EAAU,IACnB,OAAO,KAAK,SAAS,aAAa,EAEpC,GAAIA,IAAU,MAAQA,IAAU,aAAeA,IAAU,kBAAmB,CAC1EsgC,EAAM,KAAK,uEAAuEtgC,CAAK,GAAG,EAC1F,MACN,CACI,KAAK,UAAU,iBAAkBA,CAAK,EAClC,KAAK,aACP,KAAK,YAAY,YAAYA,CAAK,CAGxC,CAaE,MAAMA,EAAO,CACX,OAAO,KAAK,UAAU,QAASA,CAAK,CACxC,CAaE,OAAOA,EAAO,CACZ,OAAO,KAAK,UAAU,SAAUA,CAAK,CACzC,CAgBE,UAAUmxD,EAAWnxD,EAAO,CAC1B,MAAMoxD,EAAgBD,EAAY,IAClC,GAAInxD,IAAU,OACZ,OAAO,KAAKoxD,CAAa,GAAK,EAEhC,GAAIpxD,IAAU,IAAMA,IAAU,OAAQ,CAEpC,KAAKoxD,CAAa,EAAI,OACtB,KAAK,eAAgB,EACrB,MACN,CACI,MAAMC,EAAY,WAAWrxD,CAAK,EAClC,GAAI,MAAMqxD,CAAS,EAAG,CACpB/wB,EAAM,MAAM,mBAAmBtgC,CAAK,sBAAsBmxD,CAAS,EAAE,EACrE,MACN,CACI,KAAKC,CAAa,EAAIC,EACtB,KAAK,eAAgB,CACzB,CAgBE,MAAM7P,EAAM,CACV,GAAIA,IAAS,OACX,MAAO,CAAC,CAAC,KAAK,OAEhB,KAAK,OAAS,CAAC,CAACA,EACZ/W,GAAU,IAAI,GAChB,KAAK,IAAI,CAAC,cAAe,QAAQ,EAAG,KAAK,mBAAmB,EAE1D+W,GACF,KAAK,SAAS,WAAW,EACzB,KAAK,KAAK,EAAK,EACf9W,GAAmB,KAAM,IAAM,CAC7B,KAAK,GAAG,CAAC,cAAe,QAAQ,EAAG,KAAK,mBAAmB,CACnE,CAAO,GAED,KAAK,YAAY,WAAW,EAE9B,KAAK,eAAgB,CACzB,CAgBE,KAAK8W,EAAM,CACT,GAAIA,IAAS,OACX,MAAO,CAAC,CAAC,KAAK,MAEhB,KAAK,MAAQ,CAAC,CAACA,EACXA,GACF,KAAK,SAAS,UAAU,EACxB,KAAK,MAAM,EAAK,GAEhB,KAAK,YAAY,UAAU,CAEjC,CAsBE,YAAY8P,EAAO,CACjB,GAAIA,IAAU,OACZ,OAAO,KAAK,aAId,GAAI,CAAC,aAAa,KAAKA,CAAK,EAC1B,MAAM,IAAI,MAAM,gGAAgG,EAElH,KAAK,aAAeA,EAIpB,KAAK,MAAM,EAAI,EACf,KAAK,eAAgB,CACzB,CAQE,gBAAiB,CACf,GAAI9xB,EAAS,2BAA6B,GAAM,CAC9C,MAAMj3B,EAAQ,OAAO,KAAK,QAAW,SAAW,KAAK,OAAS,KAAK,SAAS,MACtED,EAAS,OAAO,KAAK,SAAY,SAAW,KAAK,QAAU,KAAK,SAAS,OACzEgkD,EAAS,KAAK,OAAS,KAAK,MAAM,GAAI,EACxCA,IACE/jD,GAAS,IACX+jD,EAAO,MAAQ/jD,GAEbD,GAAU,IACZgkD,EAAO,OAAShkD,IAGpB,MACN,CACI,IAAIC,EACAD,EACAipD,EACAC,EAGA,KAAK,eAAiB,QAAa,KAAK,eAAiB,OAE3DD,EAAc,KAAK,aACV,KAAK,WAAY,EAAG,EAE7BA,EAAc,KAAK,WAAU,EAAK,IAAM,KAAK,YAAa,EAG1DA,EAAc,OAIhB,MAAME,EAAaF,EAAY,MAAM,GAAG,EAClCG,EAAkBD,EAAW,CAAC,EAAIA,EAAW,CAAC,EAChD,KAAK,SAAW,OAElBlpD,EAAQ,KAAK,OACJ,KAAK,UAAY,OAE1BA,EAAQ,KAAK,QAAUmpD,EAGvBnpD,EAAQ,KAAK,WAAU,GAAM,IAE3B,KAAK,UAAY,OAEnBD,EAAS,KAAK,QAGdA,EAASC,EAAQmpD,EAIf,aAAa,KAAK,KAAK,GAAI,CAAA,EAC7BF,EAAU,cAAgB,KAAK,GAAI,EAEnCA,EAAU,KAAK,GAAE,EAAK,cAIxB,KAAK,SAASA,CAAO,EACrB7pB,GAAe,KAAK,SAAU;AAAA,SACzB6pB,CAAO;AAAA,iBACCjpD,CAAK;AAAA,kBACJD,CAAM;AAAA;AAAA;AAAA,SAGfkpD,CAAO;AAAA,uBACOE,EAAkB,GAAG;AAAA;AAAA,KAEvC,CACL,CAcE,UAAUnU,EAAU3hC,EAAQ,CAEtB,KAAK,OACP,KAAK,YAAa,EAEpB,MAAM+1C,EAAgBzlB,GAAcqR,CAAQ,EACtCqU,EAAgBrU,EAAS,OAAO,CAAC,EAAE,cAAgBA,EAAS,MAAM,CAAC,EAGrEoU,IAAkB,SAAW,KAAK,MACpC1jB,EAAK,QAAQ,OAAO,EAAE,oBAAoB,KAAK,GAAG,EAClD,KAAK,IAAI,OAAS,KAClB,KAAK,IAAM,MAEb,KAAK,UAAY0jB,EAGjB,KAAK,SAAW,GAChB,IAAIE,EAAW,KAAK,SAAU,GAI1B,OAAO,KAAK,SAAU,GAAK,UAAY,KAAK,SAAQ,IAAO,IAAQ,KAAK,SAAS,qBACnFA,EAAW,IAIb,MAAMC,EAAc,CAClB,OAAAl2C,EACA,SAAAi2C,EACA,uBAA0B,KAAK,SAAS,uBACxC,SAAY,KAAK,GAAI,EACrB,OAAU,GAAG,KAAK,GAAI,CAAA,IAAID,CAAa,OACvC,YAAe,KAAK,SAAS,YAC7B,QAAW,KAAK,SAAS,QACzB,KAAQ,KAAK,SAAS,KACtB,wBAA2B,KAAK,SAAS,wBACzC,MAAS,KAAK,SAAS,MACvB,OAAU,KAAK,OAAQ,EACvB,SAAY,KAAK,SAAU,EAC3B,eAAkB,KAAK,iBAAmB,GAC1C,SAAU,KAAK,SAAS,QAAQ,EAChC,kBAAqB,CAAC,CAAC,KAAK,SAAS,sBACrC,gBAAmB,KAAK,SAAS,eAClC,EACD3a,GAAI,MAAM,QAAQhxC,GAAQ,CACxB,MAAMmxC,EAAQH,GAAIhxC,CAAI,EACtB6rD,EAAY1a,EAAM,UAAU,EAAI,KAAKA,EAAM,WAAW,CAC5D,CAAK,EACD,OAAO,OAAO0a,EAAa,KAAK,SAASH,CAAa,CAAC,EACvD,OAAO,OAAOG,EAAa,KAAK,SAASF,CAAa,CAAC,EACvD,OAAO,OAAOE,EAAa,KAAK,SAASvU,EAAS,YAAW,CAAE,CAAC,EAC5D,KAAK,MACPuU,EAAY,IAAM,KAAK,KAErBl2C,GAAUA,EAAO,MAAQ,KAAK,OAAO,KAAO,KAAK,OAAO,YAAc,IACxEk2C,EAAY,UAAY,KAAK,OAAO,aAItC,MAAMC,EAAY9jB,EAAK,QAAQsP,CAAQ,EACvC,GAAI,CAACwU,EACH,MAAM,IAAI,MAAM,kBAAkBJ,CAAa,cAAcA,CAAa,sDAAsD,EAElI,KAAK,MAAQ,IAAII,EAAUD,CAAW,EAGtC,KAAK,MAAM,MAAMtoB,GAAM,KAAM,KAAK,gBAAgB,EAAG,EAAI,EACzDkJ,GAAmB,iBAAiB,KAAK,iBAAmB,CAAE,EAAE,KAAK,KAAK,EAG1Eud,GAAsB,QAAQ/9C,GAAS,CACrC,KAAK,GAAG,KAAK,MAAOA,EAAOrP,GAAK,KAAK,aAAaqpC,GAAch6B,CAAK,CAAC,GAAG,EAAErP,CAAC,CAAC,CACnF,CAAK,EACD,OAAO,KAAKqtD,EAAiB,EAAE,QAAQh+C,GAAS,CAC9C,KAAK,GAAG,KAAK,MAAOA,EAAO8/C,GAAY,CACrC,GAAI,KAAK,MAAM,aAAc,IAAK,GAAK,KAAK,MAAM,UAAW,CAC3D,KAAK,iBAAiB,KAAK,CACzB,SAAU,KAAK,aAAa9B,GAAkBh+C,CAAK,CAAC,GAAG,EAAE,KAAK,IAAI,EAClE,MAAO8/C,CACnB,CAAW,EACD,MACV,CACQ,KAAK,aAAa9B,GAAkBh+C,CAAK,CAAC,GAAG,EAAE8/C,CAAQ,CAC/D,CAAO,CACP,CAAK,EACD,KAAK,GAAG,KAAK,MAAO,YAAanvD,GAAK,KAAK,qBAAqBA,CAAC,CAAC,EAClE,KAAK,GAAG,KAAK,MAAO,YAAaA,GAAK,KAAK,qBAAqBA,CAAC,CAAC,EAClE,KAAK,GAAG,KAAK,MAAO,UAAWA,GAAK,KAAK,mBAAmBA,CAAC,CAAC,EAC9D,KAAK,GAAG,KAAK,MAAO,QAASA,GAAK,KAAK,iBAAiBA,CAAC,CAAC,EAC1D,KAAK,GAAG,KAAK,MAAO,UAAWA,GAAK,KAAK,mBAAmBA,CAAC,CAAC,EAC9D,KAAK,GAAG,KAAK,MAAO,OAAQA,GAAK,KAAK,gBAAgBA,CAAC,CAAC,EACxD,KAAK,GAAG,KAAK,MAAO,QAASA,GAAK,KAAK,iBAAiBA,CAAC,CAAC,EAC1D,KAAK,GAAG,KAAK,MAAO,iBAAkBA,GAAK,KAAK,0BAA0BA,CAAC,CAAC,EAC5E,KAAK,GAAG,KAAK,MAAO,mBAAoB,CAACA,EAAG0H,IAAS,KAAK,4BAA4B1H,EAAG0H,CAAI,CAAC,EAC9F,KAAK,GAAG,KAAK,MAAO,kBAAmB,CAAC1H,EAAGpG,IAAQ,KAAK,2BAA2BoG,EAAGpG,CAAG,CAAC,EAC1F,KAAK,GAAG,KAAK,MAAO,wBAAyBoG,GAAK,KAAK,iCAAiCA,CAAC,CAAC,EAC1F,KAAK,GAAG,KAAK,MAAO,wBAAyBA,GAAK,KAAK,iCAAiCA,CAAC,CAAC,EAC1F,KAAK,GAAG,KAAK,MAAO,QAASA,GAAK,KAAK,iBAAiBA,CAAC,CAAC,EAC1D,KAAK,GAAG,KAAK,MAAO,eAAgBA,GAAK,KAAK,wBAAwBA,CAAC,CAAC,EACxE,KAAK,GAAG,KAAK,MAAO,WAAYA,GAAK,KAAK,oBAAoBA,CAAC,CAAC,EAChE,KAAK,GAAG,KAAK,MAAO,aAAcA,GAAK,KAAK,sBAAsBA,CAAC,CAAC,EACpE,KAAK,GAAG,KAAK,MAAO,iBAAkB,KAAK,mBAAmB,EAC9D,KAAK,oBAAoB,KAAK,SAAS,UAAU,CAAC,EAC9C,KAAK,SAAQ,GAAM,CAAC,KAAK,oBAAmB,GAC9C,KAAK,0BAA2B,EAK9B,KAAK,MAAM,GAAI,EAAC,aAAe,KAAK,GAAI,IAAK8uD,IAAkB,SAAW,CAAC,KAAK,MAClF9tB,GAAU,KAAK,MAAM,GAAE,EAAI,KAAK,IAAI,EAIlC,KAAK,MACP,KAAK,IAAI,OAAS,KAClB,KAAK,IAAM,KAEjB,CAOE,aAAc,CAEZoT,GAAI,MAAM,QAAQhxC,GAAQ,CACxB,MAAMmxC,EAAQH,GAAIhxC,CAAI,EACtB,KAAKmxC,EAAM,WAAW,EAAI,KAAKA,EAAM,UAAU,EAAG,CACxD,CAAK,EACD,KAAK,gBAAkB1E,GAAmB,iBAAiB,KAAK,KAAK,EACrE,KAAK,SAAW,GAChB,KAAK,MAAM,QAAS,EACpB,KAAK,MAAQ,GACT,KAAK,oBACP,KAAK,QAAU,GACf,KAAK,QAAQ,cAAc,GAE7B,KAAK,kBAAoB,EAC7B,CAaE,KAAKuf,EAAQ,CACX,OAAIA,IAAW,QACb3xB,EAAM,KAAK;AAAA;AAAA,CAA0J,EAEhK,KAAK,KAChB,CAgBE,SAAU,CACR,MAAO,CACL,WAAYnC,EACb,CACL,CAuBE,2BAA4B,CAE1B,KAAK,6BAA8B,EACnC,KAAK,GAAG,KAAK,MAAO,QAAS,KAAK,qBAAqB,EACvD,KAAK,GAAG,KAAK,MAAO,WAAY,KAAK,2BAA2B,EAKhE,KAAK,GAAG,KAAK,MAAO,aAAc,KAAK,0BAA0B,EACjE,KAAK,GAAG,KAAK,MAAO,YAAa,KAAK,yBAAyB,EAC/D,KAAK,GAAG,KAAK,MAAO,WAAY,KAAK,wBAAwB,EAI7D,KAAK,GAAG,KAAK,MAAO,MAAO,KAAK,mBAAmB,CACvD,CAQE,8BAA+B,CAG7B,KAAK,IAAI,KAAK,MAAO,MAAO,KAAK,mBAAmB,EACpD,KAAK,IAAI,KAAK,MAAO,aAAc,KAAK,0BAA0B,EAClE,KAAK,IAAI,KAAK,MAAO,YAAa,KAAK,yBAAyB,EAChE,KAAK,IAAI,KAAK,MAAO,WAAY,KAAK,wBAAwB,EAC9D,KAAK,IAAI,KAAK,MAAO,QAAS,KAAK,qBAAqB,EACxD,KAAK,IAAI,KAAK,MAAO,WAAY,KAAK,2BAA2B,CACrE,CAOE,kBAAmB,CACjB,KAAK,aAAc,EAGf,KAAK,OAAO,QACd,KAAK,UAAU,YAAa,KAAK,OAAO,MAAM,EAIhD,KAAK,wBAAyB,EAG9B,KAAK,0BAA2B,CACpC,CASE,sBAAuB,CAGrB,KAAK,YAAY,YAAa,aAAa,EAG3C,KAAK,MAAM,IAAI,EAGf,KAAK,0BAA2B,EAC3B,KAAK,UAUR,KAAK,WAAW,EAAK,EACrB,KAAK,QAAQ,WAAW,GAJxB,KAAK,QAAQ,WAAW,EAS1B,KAAK,gBAAgB,KAAK,SAAU,IAAK,IAAQ,KAAK,SAAS,kBAAoB,OAAS,KAAK,SAAQ,CAAE,CAC/G,CAQE,gBAAgBpgC,EAAM,CACpB,GAAI,CAAC,KAAK,OAAS,OAAOA,GAAS,SACjC,OAKF,MAAMm0D,EAAe,IAAM,CACzB,MAAMC,EAAkB,KAAK,MAAO,EACpC,KAAK,MAAM,EAAI,EACf,MAAMC,EAAe,IAAM,CACzB,KAAK,MAAMD,CAAe,CAC3B,EAGD,KAAK,qBAAqB,KAAKC,CAAY,EAC3C,MAAMC,EAAe,KAAK,KAAM,EAChC,GAAKrgB,GAAUqgB,CAAY,EAG3B,OAAOA,EAAa,MAAM51D,GAAO,CAC/B,MAAA21D,EAAc,EACR,IAAI,MAAM,uDAAuD31D,GAAY,EAAE,EAAE,CAC/F,CAAO,CACF,EACD,IAAI61D,EAcJ,GAVIv0D,IAAS,OAAS,CAAC,KAAK,MAAK,GAC/Bu0D,EAAU,KAAK,KAAM,EACjBtgB,GAAUsgB,CAAO,IACnBA,EAAUA,EAAQ,MAAMJ,CAAY,IAE7Bn0D,IAAS,SAAW,CAAC,KAAK,MAAK,EACxCu0D,EAAUJ,EAAc,EAExBI,EAAU,KAAK,KAAM,EAEnB,EAACtgB,GAAUsgB,CAAO,EAGtB,OAAOA,EAAQ,KAAK,IAAM,CACxB,KAAK,QAAQ,CACX,KAAM,mBACN,SAAUv0D,CAClB,CAAO,CACP,CAAK,EAAE,MAAM,IAAM,CACb,KAAK,QAAQ,CACX,KAAM,mBACN,SAAUA,CAClB,CAAO,CACP,CAAK,CACL,CAaE,oBAAoBq6C,EAAS,GAAI,CAC/B,IAAI97B,EAAM87B,EACNr6C,EAAO,GACP,OAAOue,GAAQ,WACjBA,EAAM87B,EAAO,IACbr6C,EAAOq6C,EAAO,MAKhB,KAAK,OAAO,OAAS,KAAK,OAAO,QAAU,CAAE,EAC7C,KAAK,OAAO,QAAU,KAAK,OAAO,SAAW,CAAE,EAG3C97B,GAAO,CAACve,IACVA,EAAO48C,GAAa,KAAMr+B,CAAG,GAI/B,KAAK,OAAO,OAASwkB,GAAQ,CAAA,EAAIsX,EAAQ,CACvC,IAAA97B,EACA,KAAAve,CACN,CAAK,EACD,MAAM68C,EAAkB,KAAK,OAAO,QAAQ,OAAOl3C,GAAKA,EAAE,KAAOA,EAAE,MAAQ4Y,CAAG,EACxEi2C,EAAkB,CAAE,EACpBC,EAAY,KAAK,GAAG,QAAQ,EAC5BC,EAAoB,CAAE,EAC5B,QAASl1D,EAAI,EAAGA,EAAIi1D,EAAU,OAAQj1D,IAAK,CACzC,MAAMm1D,EAAYjuB,GAAc+tB,EAAUj1D,CAAC,CAAC,EAC5Cg1D,EAAgB,KAAKG,CAAS,EAC1BA,EAAU,KAAOA,EAAU,MAAQp2C,GACrCm2C,EAAkB,KAAKC,EAAU,GAAG,CAE5C,CAIQD,EAAkB,QAAU,CAAC7X,EAAgB,OAC/C,KAAK,OAAO,QAAU2X,EAGZ3X,EAAgB,SAC1B,KAAK,OAAO,QAAU,CAAC,KAAK,OAAO,MAAM,GAI3C,KAAK,OAAO,IAAMt+B,CACtB,CAqCE,qBAAqBpK,EAAO,CAG1B,GAAI,CAAC,KAAK,aAAc,CACtB,IAAIygD,EAAqBr2C,GAAO,KAAK,oBAAoBA,CAAG,EAC5D,MAAMs2C,EAAY,KAAK,cAAa,EAAG,IACjCC,EAAW3gD,EAAM,IAGnB0gD,GAAa,CAAC,SAAS,KAAKA,CAAS,GAAK,SAAS,KAAKC,CAAQ,IAG9D,CAAC,KAAK,aAAe,KAAK,YAAY,OAASA,GAAY,KAAK,YAAY,SAAWD,KACzFD,EAAqB,IAAM,CAAE,GAMjCA,EAAmBE,CAAQ,EAKtB3gD,EAAM,KACT,KAAK,MAAM,IAAI,CAAC,YAAa,WAAW,EAAGrP,GAAK,CAI9C,GAAIA,EAAE,OAAS,YACb,OAEF,MAAMiwD,EAAU,KAAK,SAAS,YAAY,EAC1C,KAAK,YAAY,KAAOA,EACxB,KAAK,oBAAoBA,CAAO,CAC1C,CAAS,CAET,CACI,KAAK,YAAc,CACjB,OAAQ,KAAK,cAAa,EAAG,IAC7B,KAAM5gD,EAAM,GACb,EACD,KAAK,QAAQ,CACX,IAAKA,EAAM,IACX,KAAM,WACZ,CAAK,CACL,CAaE,WAAW6gD,EAAS,CAClB,GAAIA,IAAY,OAEd,OAAO,KAAK,YAEVA,IAAY,KAAK,cAGrB,KAAK,YAAcA,EACf,KAAK,YACP,KAAK,SAAS,iBAAiB,EAE/B,KAAK,YAAY,iBAAiB,EAExC,CAUE,iBAAkB,CAChB,KAAK,YAAY,YAAa,YAAY,EAC1C,KAAK,SAAS,aAAa,EAG3B,KAAK,WAAW,EAAI,EAQpB,KAAK,QAAQ,MAAM,CACvB,CAaE,uBAAwB,CAClB,KAAK,MAAM,aAAc,EAAG,GAAK,KAAK,OAAO,mBAAqB,IACpE,KAAK,iBAAiB,QAAQC,GAAUA,EAAO,SAASA,EAAO,KAAK,CAAC,EACrE,KAAK,iBAAmB,CAAE,GAE5B,KAAK,OAAO,iBAAmB,KAAK,MAAM,aAAc,EAOxD,KAAK,QAAQ,YAAY,CAC7B,CASE,oBAAqB,CACnB,KAAK,SAAS,aAAa,EAO3B,KAAK,QAAQ,SAAS,EAItB,MAAMC,EAAkB,KAAK,YAAa,EACpCC,EAAqB,IAAM,CAC3BD,IAAoB,KAAK,gBAC3B,KAAK,YAAY,aAAa,EAC9B,KAAK,IAAI,aAAcC,CAAkB,EAE5C,EACD,KAAK,GAAG,aAAcA,CAAkB,CAC5C,CAUE,oBAAqB,CACnB,KAAK,YAAY,aAAa,EAO9B,KAAK,QAAQ,SAAS,CAC1B,CASE,2BAA4B,CAC1B,KAAK,YAAY,aAAa,EAQ9B,KAAK,QAAQ,gBAAgB,CACjC,CASE,oBAAqB,CACnB,KAAK,YAAY,aAAa,EAO9B,KAAK,QAAQ,SAAS,CAC1B,CASE,oBAAqB,CACnB,KAAK,SAAS,aAAa,EAO3B,KAAK,QAAQ,SAAS,CAC1B,CASE,mBAAoB,CAClB,KAAK,YAAY,cAAe,WAAW,EAO3C,KAAK,QAAQ,QAAQ,CACzB,CASE,kBAAmB,CACjB,KAAK,YAAY,aAAa,EAC9B,KAAK,SAAS,YAAY,EAO1B,KAAK,QAAQ,OAAO,CACxB,CASE,kBAAmB,CACjB,KAAK,SAAS,WAAW,EACzB,KAAK,YAAY,aAAa,EAC1B,KAAK,SAAS,MAChB,KAAK,YAAY,CAAC,EAClB,KAAK,KAAM,GACD,KAAK,UACf,KAAK,MAAO,EASd,KAAK,QAAQ,OAAO,CACxB,CAQE,2BAA4B,CAC1B,KAAK,SAAS,KAAK,SAAS,UAAU,CAAC,CAC3C,CAWE,iBAAiBhhD,EAAO,CAGjB,KAAK,YAGN,KAAK,WAAa,QAAa,KAAK,SAAS,cAAgB,QAAa,KAAK,SAAS,YAAY,QAAU,QAAa,KAAK,SAAS,YAAY,QAAU,MAC7J,KAAK,WAAa,QAAa,KAAK,SAAS,cAAgB,QAAa,OAAO,KAAK,SAAS,YAAY,OAAU,WACvH,KAAK,SAAS,YAAY,MAAM,KAAK,KAAMA,CAAK,EACvC,KAAK,SACd+/B,GAAe,KAAK,MAAM,EAE1B,KAAK,MAAO,EAGpB,CAWE,uBAAuB//B,EAAO,CAC5B,GAAI,CAAC,KAAK,UACR,OAKmB,MAAM,UAAU,KAAK,KAAK,KAAK,GAAG,qCAAqC,EAAG0M,GAAMA,EAAG,SAAS1M,EAAM,MAAM,CAAC,IASxH,KAAK,WAAa,QAAa,KAAK,SAAS,cAAgB,QAAa,KAAK,SAAS,YAAY,cAAgB,QAAa,KAAK,SAAS,YAAY,cAAgB,MACzK,KAAK,WAAa,QAAa,KAAK,SAAS,cAAgB,QAAa,OAAO,KAAK,SAAS,YAAY,aAAgB,WAC7H,KAAK,SAAS,YAAY,YAAY,KAAK,KAAMA,CAAK,EAC7C,KAAK,eACd,KAAK,eAAgB,EAErB,KAAK,kBAAmB,EAIlC,CASE,gBAAiB,CACf,KAAK,WAAW,CAAC,KAAK,WAAU,CAAE,CACtC,CAQE,uBAAwB,CACtB,KAAK,cAAgB,KAAK,WAAY,CAC1C,CAQE,sBAAuB,CACjB,KAAK,eACP,KAAK,mBAAoB,CAE/B,CAYE,oBAAoBA,EAAO,CAErBA,EAAM,YACRA,EAAM,eAAgB,CAE5B,CAKE,wBAAyB,CACnB,KAAK,eACP,KAAK,SAAS,gBAAgB,EAE9B,KAAK,YAAY,gBAAgB,CAEvC,CAKE,0BAA0B,EAAG,CAC3B,MAAMihD,EAAe,EAAE,OAAO,OAI9B,GAAIA,GAAgBA,IAAiB,KACnC,OAEF,MAAMv0C,EAAK,KAAK,GAAI,EACpB,IAAIw0C,EAAOr0B,EAAW,KAAK,OAAO,iBAAiB,IAAMngB,EACrD,CAACw0C,GAAQx0C,EAAG,UACdw0C,EAAOx0C,EAAG,QAAQ,IAAM,KAAK,OAAO,UAAU,GAEhD,KAAK,aAAaw0C,CAAI,CAC1B,CAeE,4BAA4BlhD,EAAO3H,EAAM,CACnCA,IACEA,EAAK,sBACP,KAAK,SAAS,mBAAmB,EACjC,KAAK,MAAM,IAAI,sBAAuB,IAAM,CAC1C,KAAK,YAAY,mBAAmB,CAC9C,CAAS,GAEH,KAAK,aAAaA,EAAK,YAAY,EAEzC,CACE,2BAA2B2H,EAAOzV,EAAK,CACrC,KAAK,QAAQ,kBAAmBA,CAAG,CACvC,CAKE,8BAA+B,CACzB,KAAK,uBACP,KAAK,SAAS,wBAAwB,EAEtC,KAAK,YAAY,wBAAwB,CAE/C,CAWE,iCAAiCyV,EAAO,CACtC,KAAK,qBAAqB,EAAI,CAClC,CAWE,iCAAiCA,EAAO,CACtC,KAAK,qBAAqB,EAAK,CACnC,CAQE,kBAAmB,CACjB,MAAM1V,EAAQ,KAAK,MAAM,MAAO,EAC5BA,GACF,KAAK,MAAMA,CAAK,CAEtB,CASE,qBAAsB,CACpB,IAAI+N,EAAO,KACP,UAAU,OAAS,IACrBA,EAAO,UAAU,CAAC,GASpB,KAAK,QAAQ,WAAYA,CAAI,CACjC,CAQE,UAAW,CACT,OAAO,KAAK,MAChB,CAUE,aAAc,CACZ,KAAK,OAAS,CAKZ,YAAa,EACb,SAAU,EACV,kBAAmB,KAAK,SAAS,kBACjC,SAAU,IACV,WAAY,EACZ,iBAAkB,KAAK,oBAAqB,EAC5C,MAAO,KACP,IAAK,GACL,OAAQ,CAAE,EACV,QAAS,CAAE,EACX,cAAe,CAAE,EACjB,OAAQ,CACT,CACL,CAaE,UAAUtJ,EAAQo4C,EAAK,CAGrB,KAAK,MAAM,UAAY,CACrB,GAAIp4C,KAAU44C,GACZ,OAAO1Y,GAAI,KAAK,YAAa,KAAK,MAAOlgC,EAAQo4C,CAAG,EAC/C,GAAIp4C,KAAU64C,GACnB,OAAOR,GAAQ,KAAK,YAAa,KAAK,MAAOr4C,EAAQo4C,CAAG,EAE1D,GAAI,CACE,KAAK,OACP,KAAK,MAAMp4C,CAAM,EAAEo4C,CAAG,CAEzB,OAAQx2C,EAAG,CACV,MAAAy9B,EAAMz9B,CAAC,EACDA,CACd,CACK,EAAE,EAAI,CACX,CAeE,SAAS5B,EAAQ,CACf,GAAI,GAAC,KAAK,OAAS,CAAC,KAAK,MAAM,UAG/B,IAAIA,KAAU24C,GACZ,OAAOT,GAAI,KAAK,YAAa,KAAK,MAAOl4C,CAAM,EAC1C,GAAIA,KAAU64C,GACnB,OAAOR,GAAQ,KAAK,YAAa,KAAK,MAAOr4C,CAAM,EAKrD,GAAI,CACF,OAAO,KAAK,MAAMA,CAAM,EAAG,CAC5B,OAAQ4B,EAAG,CAEV,MAAI,KAAK,MAAM5B,CAAM,IAAM,QACzBq/B,EAAM,aAAar/B,CAAM,2BAA2B,KAAK,SAAS,wBAAyB4B,CAAC,EACtFA,GAIJA,EAAE,OAAS,aACby9B,EAAM,aAAar/B,CAAM,mBAAmB,KAAK,SAAS,gCAAiC4B,CAAC,EAC5F,KAAK,MAAM,SAAW,GAChBA,IAIRy9B,EAAMz9B,CAAC,EACDA,EACZ,EACA,CAYE,MAAO,CACL,OAAO,IAAI,QAAQwwD,GAAW,CAC5B,KAAK,MAAMA,CAAO,CACxB,CAAK,CACL,CAWE,MAAM/zD,EAAW2yC,GAAgB,CAC/B,KAAK,eAAe,KAAK3yC,CAAQ,EACjC,MAAMg0D,EAAa,GAAQ,CAAC,KAAK,eAAiB,KAAK,OAAS,KAAK,WAAU,IACzEC,EAAgB,GAAQxwB,IAAiBD,IAU/C,GAPI,KAAK,cACP,KAAK,IAAI,CAAC,QAAS,WAAW,EAAG,KAAK,WAAW,EACjD,KAAK,YAAc,MAKjB,CAAC,KAAK,UAAY,CAACwwB,EAAY,CACjC,KAAK,YAAczwD,GAAK,CACtB,KAAK,MAAO,CACb,EACD,KAAK,IAAI,CAAC,QAAS,WAAW,EAAG,KAAK,WAAW,EAI7C,CAACywD,GAAcC,GACjB,KAAK,KAAM,EAEb,MACN,CAGI,MAAMzrD,EAAM,KAAK,SAAS,MAAM,EAGTyrD,GAAiB,KAAK,SAAS,WAAW,GAE/D,KAAK,kBAAmB,EAGtBzrD,IAAQ,KACV,KAAK,wBAAyB,EAE9B,KAAK,kBAAkBA,CAAG,CAEhC,CAOE,yBAA0B,CACxB,MAAM0rD,EAAQ,KAAK,qBAAqB,MAAM,CAAC,EAC/C,KAAK,qBAAuB,CAAE,EAC9BA,EAAM,QAAQ,SAAUC,EAAG,CACzBA,EAAG,CACT,CAAK,CACL,CAWE,kBAAkB3rD,EAAK,CACrB,MAAM6I,EAAY,KAAK,eAAe,MAAM,CAAC,EAC7C,KAAK,eAAiB,CAAE,EAExB,KAAK,qBAAuB,CAAE,EAC9BA,EAAU,QAAQ,SAAUsnC,EAAI,CAC9BA,EAAGnwC,CAAG,CACZ,CAAK,CACL,CAKE,OAAQ,CACN,KAAK,UAAU,OAAO,CAC1B,CASE,QAAS,CAEP,OAAO,KAAK,SAAS,QAAQ,IAAM,EACvC,CAUE,QAAS,CACP,OAAO,KAAK,SAAS,QAAQ,GAAKkpC,GAAmB,EAAG,CAAC,CAC7D,CAcE,UAAUwe,EAAa,CACrB,GAAI,OAAOA,EAAgB,IACzB,OAAO,KAAK,WAEd,KAAK,WAAa,CAAC,CAACA,EACpB,KAAK,UAAU,eAAgB,KAAK,UAAU,EAC1CA,EACF,KAAK,SAAS,eAAe,EAE7B,KAAK,YAAY,eAAe,CAEtC,CAYE,YAAYte,EAAS,CACnB,GAAIA,IAAY,OAOd,YAAK,OAAO,YAAc,KAAK,SAAS,aAAa,GAAK,EACnD,KAAK,OAAO,YAKrB,GAHIA,EAAU,IACZA,EAAU,GAER,CAAC,KAAK,UAAY,KAAK,cAAgB,CAAC,KAAK,OAAS,CAAC,KAAK,MAAM,SAAU,CAC9E,KAAK,OAAO,SAAWA,EACvB,KAAK,IAAI,UAAW,KAAK,mBAAmB,EAC5C,KAAK,IAAI,UAAW,KAAK,mBAAmB,EAC5C,MACN,CACI,KAAK,UAAU,iBAAkBA,CAAO,EACxC,KAAK,OAAO,SAAW,EACnB,SAASA,CAAO,IAClB,KAAK,OAAO,YAAc,OAAOA,CAAO,EAE9C,CAOE,gBAAiB,CACf,KAAK,YAAY,KAAK,OAAO,QAAQ,CACzC,CAmBE,SAASA,EAAS,CAChB,GAAIA,IAAY,OAEd,OAAO,KAAK,OAAO,WAAa,OAAY,KAAK,OAAO,SAAW,IAErEA,EAAU,WAAWA,CAAO,EAGxBA,EAAU,IACZA,EAAU,KAERA,IAAY,KAAK,OAAO,WAE1B,KAAK,OAAO,SAAWA,EACnBA,IAAY,IACd,KAAK,SAAS,UAAU,EAExB,KAAK,YAAY,UAAU,EAExB,MAAMA,CAAO,GAQhB,KAAK,QAAQ,gBAAgB,EAGrC,CASE,eAAgB,CACd,OAAO,KAAK,WAAa,KAAK,YAAa,CAC/C,CASE,sBAAuB,CACrB,OAAO,KAAK,MAAM,KAAK,SAAQ,CAAE,EAAI,KAAK,MAAM,KAAK,aAAa,CACtE,CAeE,UAAW,CACT,IAAIW,EAAW,KAAK,SAAS,UAAU,EACvC,OAAI,CAACA,GAAY,CAACA,EAAS,UACzBA,EAAWb,GAAmB,EAAG,CAAC,GAE7Ba,CACX,CAWE,UAAW,CACT,IAAIia,EAAW,KAAK,SAAS,UAAU,EACvC,OAAI,CAACA,GAAY,CAACA,EAAS,UACzBA,EAAW9a,GAAmB,EAAG,CAAC,GAE7B8a,CACX,CAOE,SAAU,CACR,OAAO,KAAK,SAAS,SAAS,CAClC,CAOE,OAAQ,CACN,OAAO,KAAK,SAAS,OAAO,CAChC,CAqBE,cAAe,CACb,OAAO,KAAK,SAAS,cAAc,CACvC,CAwBE,YAAa,CACX,OAAO,KAAK,SAAS,YAAY,CACrC,CAUE,iBAAkB,CAChB,OAAOla,GAAgB,KAAK,SAAU,EAAE,KAAK,SAAQ,CAAE,CAC3D,CASE,aAAc,CACZ,MAAMC,EAAW,KAAK,SAAU,EAC1B5lB,EAAW,KAAK,SAAU,EAChC,IAAIlI,EAAM8tB,EAAS,IAAIA,EAAS,OAAS,CAAC,EAC1C,OAAI9tB,EAAMkI,IACRlI,EAAMkI,GAEDlI,CACX,CAcE,OAAO2vC,EAAkB,CACvB,IAAIxO,EACJ,GAAIwO,IAAqB,OAAW,CAElCxO,EAAM,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGwO,CAAgB,CAAC,EAC/C,KAAK,OAAO,OAASxO,EACrB,KAAK,UAAU,YAAaA,CAAG,EAC3BA,EAAM,GACR,KAAK,YAAYA,CAAG,EAEtB,MACN,CAGI,OAAAA,EAAM,WAAW,KAAK,SAAS,QAAQ,CAAC,EACjC,MAAMA,CAAG,EAAI,EAAIA,CAC5B,CAcE,MAAM6K,EAAO,CACX,GAAIA,IAAU,OAAW,CACvB,KAAK,UAAU,WAAYA,CAAK,EAChC,MACN,CACI,OAAO,KAAK,SAAS,OAAO,GAAK,EACrC,CA4BE,aAAa4D,EAAc,CACzB,OAAIA,IAAiB,QACnB,KAAK,UAAU,kBAAmBA,CAAY,EAEzC,KAAK,SAAS,cAAc,GAAK,EAC5C,CAiBE,YAAYD,EAAkB,CAC5B,GAAIA,IAAqB,QAAaA,IAAqB,EAAG,CAC5D,KAAK,OAAO,WAAaA,EACzB,MACN,CACI,OAAO,KAAK,OAAO,UACvB,CASE,oBAAqB,CACnB,OAAO,KAAK,SAAS,oBAAoB,GAAK,EAClD,CAkBE,aAAaE,EAAM,CACjB,GAAIA,IAAS,OAAW,CACtB,MAAMC,EAAW,KAAK,cACtB,KAAK,cAAgB,EAAQD,EAKzB,KAAK,gBAAkBC,GAAY,KAAK,OAAO,UAKjD,KAAK,QAAQ,kBAAkB,EAEjC,KAAK,uBAAwB,EAC7B,MACN,CACI,OAAO,KAAK,aAChB,CAgBE,kBAAkBC,EAAmB,CAC/B,KAAK,wBACP,KAAK,qBAAsB,EAE7B,MAAM3oD,EAAO,KACb,OAAO,IAAI,QAAQ,CAACkoD,EAASU,IAAW,CACtC,SAASC,GAAa,CACpB7oD,EAAK,IAAI,kBAAmB0b,CAAY,EACxC1b,EAAK,IAAI,mBAAoB27C,CAAa,CAClD,CACM,SAASA,GAAgB,CACvBkN,EAAY,EACZX,EAAS,CACjB,CACM,SAASxsC,EAAahkB,EAAGpG,EAAK,CAC5Bu3D,EAAY,EACZD,EAAOt3D,CAAG,CAClB,CACM0O,EAAK,IAAI,mBAAoB27C,CAAa,EAC1C37C,EAAK,IAAI,kBAAmB0b,CAAY,EACxC,MAAMyrC,EAAUnnD,EAAK,yBAAyB2oD,CAAiB,EAC3DxB,IACFA,EAAQ,KAAK0B,EAAYA,CAAU,EACnC1B,EAAQ,KAAKe,EAASU,CAAM,EAEpC,CAAK,CACL,CACE,yBAAyBD,EAAmB,CAC1C,IAAIG,EAkBJ,GAdK,KAAK,OAAO,WACfA,EAAY,KAAK,SAAS,YAAc,KAAK,SAAS,WAAW,SAAW,CAAE,EAC1EH,IAAsB,SACxBG,EAAYH,IAWZ,KAAK,OAAO,kBAAmB,CACjC,MAAMxB,EAAU,KAAK,IAAI,KAAK,OAAO,iBAAiB,EAAE2B,CAAS,EAGjE,OAAI3B,GACFA,EAAQ,KAAK,IAAM,KAAK,aAAa,EAAI,EAAG,IAAM,KAAK,aAAa,EAAK,CAAC,EAErEA,CACb,MAAe,KAAK,MAAM,mBAAkB,GAAM,CAAC,KAAK,SAAS,iBAG3D,KAAK,UAAU,iBAAiB,EAIhC,KAAK,gBAAiB,CAE5B,CAOE,gBAAiB,CACf,MAAMnnD,EAAO,KACb,OAAO,IAAI,QAAQ,CAACkoD,EAASU,IAAW,CACtC,SAASC,GAAa,CACpB7oD,EAAK,IAAI,kBAAmB0b,CAAY,EACxC1b,EAAK,IAAI,mBAAoB27C,CAAa,CAClD,CACM,SAASA,GAAgB,CACvBkN,EAAY,EACZX,EAAS,CACjB,CACM,SAASxsC,EAAahkB,EAAGpG,EAAK,CAC5Bu3D,EAAY,EACZD,EAAOt3D,CAAG,CAClB,CACM0O,EAAK,IAAI,mBAAoB27C,CAAa,EAC1C37C,EAAK,IAAI,kBAAmB0b,CAAY,EACxC,MAAMyrC,EAAUnnD,EAAK,sBAAuB,EACxCmnD,IACFA,EAAQ,KAAK0B,EAAYA,CAAU,EAEnC1B,EAAQ,KAAKe,EAASU,CAAM,EAEpC,CAAK,CACL,CACE,uBAAwB,CACtB,GAAI,KAAK,OAAO,kBAAmB,CACjC,MAAMzB,EAAUvzB,EAAW,KAAK,OAAO,cAAc,EAAG,EAGxD,OAAIuzB,GAGFrgB,GAAeqgB,EAAQ,KAAK,IAAM,KAAK,aAAa,EAAK,CAAC,CAAC,EAEtDA,CACb,MAAe,KAAK,MAAM,mBAAkB,GAAM,CAAC,KAAK,SAAS,iBAC3D,KAAK,UAAU,gBAAgB,EAE/B,KAAK,eAAgB,CAE3B,CAQE,iBAAkB,CAChB,KAAK,aAAa,EAAI,EACtB,KAAK,aAAe,GAGpB,KAAK,gBAAkBvzB,EAAW,gBAAgB,MAAM,SAGxD2J,GAAG3J,EAAY,UAAW,KAAK,wBAAwB,EAGvDA,EAAW,gBAAgB,MAAM,SAAW,SAG5CiF,GAASjF,EAAW,KAAM,iBAAiB,EAM3C,KAAK,QAAQ,iBAAiB,CAClC,CASE,mBAAmB7sB,EAAO,CACpBA,EAAM,MAAQ,UACZ,KAAK,aAAc,IAAK,KACrB,KAAK,aAGR,KAAK,eAAgB,EAFrB,KAAK,eAAgB,EAM/B,CAOE,gBAAiB,CACf,KAAK,aAAa,EAAK,EACvB,KAAK,aAAe,GACpB42B,GAAI/J,EAAY,UAAW,KAAK,wBAAwB,EAGxDA,EAAW,gBAAgB,MAAM,SAAW,KAAK,gBAGjDmF,GAAYnF,EAAW,KAAM,iBAAiB,EAQ9C,KAAK,QAAQ,gBAAgB,CACjC,CASE,wBAAwB/+B,EAAO,CAC7B,GAAIA,IAAU,OACZ,OAAO,KAAK,SAAS,yBAAyB,EAEhD,KAAK,UAAU,6BAA8BA,CAAK,EAClD,KAAK,SAAS,wBAA0BA,EACxC,KAAK,QAAQ,gCAAgC,CACjD,CAcE,qBAAqBk0D,EAAO,CAC1B,GAAIA,IAAU,OAAW,CACvB,KAAK,sBAAwB,CAAC,CAACA,EAC/B,KAAK,6BAA8B,EACnC,MACN,CACI,MAAO,CAAC,CAAC,KAAK,qBAClB,CAqBE,yBAA0B,CACxB,GAAI,KAAK,SAAS,gCAAkC10B,EAAS,yBAA0B,CACrF,MAAM20B,EAAep1B,EAAW,cAAc,KAAK,GAAI,EAAC,OAAO,EAC/D,OAAAo1B,EAAa,UAAY,KAAK,GAAI,EAAC,UACnCA,EAAa,UAAU,IAAI,mBAAmB,EAC1C,KAAK,aACPA,EAAa,YAAY,KAAK,YAAY,KAAK,UAAU,EAAI,CAAC,EAE5D,KAAK,UACPA,EAAa,YAAY,KAAK,SAAS,KAAK,UAAU,EAAI,CAAC,EAE7DA,EAAa,YAAY1wB,EAAS,IAAK,CACrC,UAAW,cACZ,EAAE,CAAE,EAAE,KAAK,SAAS,+BAA+B,CAAC,CAAC,EAC/CjE,EAAS,yBAAyB,cAAc,CAErD,MAAO,KAAK,WAAY,EACxB,OAAQ,KAAK,YAAW,CAChC,CAAO,EAAE,KAAK40B,IACN7tB,GAAwB6tB,CAAS,EACjC,KAAK,IAAI,WAAW,aAAaD,EAAc,KAAK,GAAG,EACvDC,EAAU,SAAS,KAAK,YAAY,KAAK,GAAG,EAC5CA,EAAU,SAAS,KAAK,UAAU,IAAI,gBAAgB,EACtD,KAAK,QAAQ,qBAAqB,EAAI,EACtC,KAAK,QAAQ,QAAQ,CACnB,KAAM,wBACN,UAAAA,CACV,CAAS,EAGDA,EAAU,iBAAiB,WAAYliD,GAAS,CAC9C,MAAMmiD,EAAWniD,EAAM,OAAO,cAAc,WAAW,EACvDiiD,EAAa,WAAW,aAAaE,EAAUF,CAAY,EAC3D,KAAK,QAAQ,qBAAqB,EAAK,EACvC,KAAK,QAAQ,QAAQ,uBAAuB,CACtD,CAAS,EACMC,EACR,CACP,CACI,MAAI,4BAA6Br1B,GAAc,KAAK,wBAAuB,IAAO,GAOzE,KAAK,SAAS,yBAAyB,EAEzC,QAAQ,OAAO,0BAA0B,CACpD,CAYE,sBAAuB,CACrB,GAAIS,EAAS,0BAA4BA,EAAS,yBAAyB,OAEzEA,OAAAA,EAAS,yBAAyB,OAAO,MAAO,EACzC,QAAQ,QAAS,EAE1B,GAAI,4BAA6BT,EAO/B,OAAOA,EAAW,qBAAsB,CAE9C,CAaE,cAAc7sB,EAAO,CACnB,KAAM,CACJ,YAAAoiD,CACD,EAAG,KAAK,SAGL,CAACA,GAAe,CAACA,EAAY,UAMV11C,GAAM,CAC3B,MAAM5Y,EAAU4Y,EAAG,QAAQ,YAAa,EAGxC,GAAIA,EAAG,kBACL,MAAO,GAKT,MAAM21C,EAAoB,CAAC,SAAU,WAAY,SAAU,QAAS,QAAS,QAAQ,EACrF,OAAIvuD,IAAY,QACPuuD,EAAkB,QAAQ31C,EAAG,IAAI,IAAM,GAI3B,CAAC,UAAU,EACZ,QAAQ5Y,CAAO,IAAM,EAC1C,GAGkB,KAAK,IAAI,cAAc,aAAa,IAGnD,OAAOsuD,EAAY,SAAY,WACjCA,EAAY,QAAQ,KAAK,KAAMpiD,CAAK,EAEpC,KAAK,cAAcA,CAAK,EAE9B,CAaE,cAAcA,EAAO,CACnB,MAAMsiD,EAAU,KAAK,SAAS,YAAc,KAAK,SAAS,YAAY,QAAU,CAAE,EAG5E,CACJ,cAAAC,EAAgBC,GAAgBxiD,EAAM,IAAI,YAAa,IAAK,IAC5D,QAAAyiD,EAAUD,GAAgBxiD,EAAM,IAAI,YAAa,IAAK,IACtD,aAAA0iD,EAAeF,GAAgBxiD,EAAM,IAAI,gBAAkB,KAAOA,EAAM,IAAI,gBAAkB,GACpG,EAAQsiD,EACJ,GAAIC,EAAc,KAAK,KAAMviD,CAAK,EAAG,CACnCA,EAAM,eAAgB,EACtBA,EAAM,gBAAiB,EACvB,MAAM2iD,EAAWtoB,EAAY,aAAa,kBAAkB,EACxDxN,EAAW,KAAK,OAAO,iBAAiB,IAAM,IAChD81B,EAAS,UAAU,YAAY,KAAK,KAAM3iD,CAAK,CAElD,MAAUyiD,EAAQ,KAAK,KAAMziD,CAAK,GACjCA,EAAM,eAAgB,EACtBA,EAAM,gBAAiB,EACJq6B,EAAY,aAAa,YAAY,EAC7C,UAAU,YAAY,KAAK,KAAMr6B,CAAK,GACxC0iD,EAAa,KAAK,KAAM1iD,CAAK,IACtCA,EAAM,eAAgB,EACtBA,EAAM,gBAAiB,EACJq6B,EAAY,aAAa,YAAY,EAC7C,UAAU,YAAY,KAAK,KAAMr6B,CAAK,EAEvD,CAaE,YAAYnU,EAAM,CAChB,IAAIw6C,EAGJ,QAASh7C,EAAI,EAAG+/C,EAAI,KAAK,SAAS,UAAW//C,EAAI+/C,EAAE,OAAQ//C,IAAK,CAC9D,MAAMggD,EAAWD,EAAE//C,CAAC,EACpB,IAAI60C,EAAOnE,EAAK,QAAQsP,CAAQ,EAShC,GALKnL,IACHA,EAAO7F,EAAY,aAAagR,CAAQ,GAItC,CAACnL,EAAM,CACT9R,EAAM,MAAM,QAAQid,CAAQ,mEAAmE,EAC/F,QACR,CAGM,GAAInL,EAAK,gBACPmG,EAAMnG,EAAK,YAAYr0C,CAAI,EACvBw6C,GACF,OAAOA,CAGjB,CACI,MAAO,EACX,CAaE,aAAaxX,EAAS,CAGpB,MAAM+zB,EAAQ,KAAK,SAAS,UAAU,IAAIvX,GACjC,CAACA,EAAUtP,EAAK,QAAQsP,CAAQ,CAAC,CACzC,EAAE,OAAO,CAAC,CAACA,EAAUnL,CAAI,IAEpBA,EAEKA,EAAK,YAAa,GAE3B9R,EAAM,MAAM,QAAQid,CAAQ,mEAAmE,EACxF,GACR,EAKKwX,EAAiC,SAAUC,EAAYC,EAAYC,EAAQ,CAC/E,IAAIlG,EACJ,OAAAgG,EAAW,KAAKG,GACPF,EAAW,KAAKG,GAAe,CAEpC,GADApG,EAAQkG,EAAOC,EAAaC,CAAW,EACnCpG,EACF,MAAO,EAEnB,CAAS,CACF,EACMA,CACR,EACD,IAAIqG,EACJ,MAAMC,EAAOt4D,GAAM,CAACiH,EAAGwF,IAAMzM,EAAGyM,EAAGxF,CAAC,EAC9BsxD,EAAS,CAAC,CAAChY,EAAUnL,CAAI,EAAGx2B,IAAW,CAC3C,GAAIw2B,EAAK,cAAcx2B,EAAQ,KAAK,SAAS2hC,EAAS,YAAa,CAAA,CAAC,EAClE,MAAO,CACL,OAAA3hC,EACA,KAAM2hC,CACP,CAEJ,EAID,OAAI,KAAK,SAAS,YAEhB8X,EAAqBN,EAA+Bh0B,EAAS+zB,EAAOQ,EAAKC,CAAM,CAAC,EAGhFF,EAAqBN,EAA+BD,EAAO/zB,EAASw0B,CAAM,EAErEF,GAAsB,EACjC,CAmBE,WAAWz5C,EAAQ45C,EAAS,CAE1B,GAAI,OAAO55C,EAAW,IACpB,OAAO,KAAK,OAAO,KAAO,GAIxB,KAAK,oBACP,KAAK,mBAAoB,EAK3B,MAAMmlB,EAAU8Z,GAAaj/B,CAAM,EAKnC,GAAI,CAACmlB,EAAQ,OAAQ,CACnB,KAAK,WAAW,UAAY,CAC1B,KAAK,MAAM,CACT,KAAM,EACN,QAAS,KAAK,SAAS,mBACjC,CAAS,CACF,EAAE,CAAC,EACJ,MACN,CA8CI,GA3CA,KAAK,aAAe,GAIfy0B,IACH,KAAK,OAAO,QAAUz0B,GAExB,KAAK,oBAAoBA,EAAQ,CAAC,CAAC,EAGnCgY,GAAU,KAAMhY,EAAQ,CAAC,EAAG,CAAC00B,EAAkB1b,IAAQ,CAUrD,GATA,KAAK,YAAcA,EAIdyb,IACH,KAAK,OAAO,QAAUz0B,GAExB,KAAK,oBAAoB00B,CAAgB,EAC7B,KAAK,KAAKA,CAAgB,EAC7B,CACP,GAAI10B,EAAQ,OAAS,EACnB,OAAO,KAAK,WAAWA,EAAQ,MAAM,CAAC,CAAC,EAEzC,KAAK,aAAe,GAGpB,KAAK,WAAW,UAAY,CAC1B,KAAK,MAAM,CACT,KAAM,EACN,QAAS,KAAK,SAAS,mBACnC,CAAW,CACF,EAAE,CAAC,EAIJ,KAAK,aAAc,EACnB,MACR,CACMkY,GAAQc,EAAK,KAAK,KAAK,CAC7B,CAAK,EAGGhZ,EAAQ,OAAS,EAAG,CACtB,MAAM5hC,EAAQ,IAAM,CAElB,KAAK,MAAM,IAAI,EACf,KAAK,WAAW4hC,EAAQ,MAAM,CAAC,EAAG,EAAI,CACvC,EACK20B,EAAyB,IAAM,CACnC,KAAK,IAAI,QAASv2D,CAAK,CACxB,EACD,KAAK,IAAI,QAASA,CAAK,EACvB,KAAK,IAAI,UAAWu2D,CAAsB,EAC1C,KAAK,mBAAqB,IAAM,CAC9B,KAAK,IAAI,QAASv2D,CAAK,EACvB,KAAK,IAAI,UAAWu2D,CAAsB,CAC3C,CACP,CACA,CAiBE,IAAI95C,EAAQ,CACV,OAAO,KAAK,WAAWA,EAAQ,EAAK,CACxC,CAeE,KAAKA,EAAQ,CACX,MAAM+5C,EAAa,KAAK,aAAa,CAAC/5C,CAAM,CAAC,EAC7C,OAAK+5C,EAGAxpB,GAAgBwpB,EAAW,KAAM,KAAK,SAAS,GAYpD,KAAK,MAAM,UAAY,CAKjB,KAAK,MAAM,YAAY,UAAU,eAAe,WAAW,EAC7D,KAAK,UAAU,YAAa/5C,CAAM,EAElC,KAAK,UAAU,MAAOA,EAAO,GAAG,EAElC,KAAK,aAAe,EACrB,EAAE,EAAI,EACA,KAvBL,KAAK,aAAe,GAEpB,KAAK,UAAU+5C,EAAW,KAAMA,EAAW,MAAM,EACjD,KAAK,MAAM,MAAM,IAAM,CACrB,KAAK,aAAe,EAC5B,CAAO,EACM,IATA,EA2Bb,CAKE,MAAO,CAGL,GAAI,KAAK,OAAS,KAAK,MAAM,IAAK,CAChC,KAAK,IAAI,KAAK,eAAe,EAC7B,MACN,CACI,KAAK,UAAU,MAAM,CACzB,CAOE,OAAQ,CACN,GAAI,KAAK,SACP,KAAK,SAAU,MACV,CACL,MAAM3V,EAAc,KAAK,KAAM,EAC/B/N,GAAe+N,EAAY,KAAK,IAAM,KAAK,SAAU,CAAA,CAAC,CAC5D,CACA,CACE,UAAW,CACL,KAAK,OACP,KAAK,MAAM,YAAY,MAAM,EAE/B,KAAK,YAAY,aAAa,EAC9B,KAAK,SAAS,YAAY,EAC1B,KAAK,YAAa,EAClB,KAAK,OAAO,EAAE,EACd,KAAK,UAAU,KAAK,SAAS,UAAU,CAAC,EAAG,IAAI,EAC/C,KAAK,UAAU,OAAO,EACtB,KAAK,mBAAoB,EACzB,KAAK,MAAM,IAAI,EACX,KAAK,UACP,KAAK,SAAS,OAAO,CACnB,MAAO,OACP,YAAa,MACrB,CAAO,EAECvV,GAAU,IAAI,GAChB,KAAK,QAAQ,aAAa,CAEhC,CAME,oBAAqB,CACnB,KAAK,kBAAmB,EACxB,KAAK,mBAAoB,EACzB,KAAK,gBAAiB,CAC1B,CAKE,mBAAoB,CAClB,KAAK,YAAY,CAAC,EAClB,KAAM,CACJ,mBAAAmrB,EACA,gBAAAC,EACA,gBAAAC,EACA,qBAAAC,CACN,EAAQ,KAAK,YAAc,CAAE,EACnB,CACJ,QAAAtS,CACD,EAAGqS,GAAmB,CAAE,EACrBF,GACFA,EAAmB,cAAe,EAEhCC,GACFA,EAAgB,cAAe,EAE7BE,GACFA,EAAqB,cAAe,EAElCtS,IACFA,EAAQ,OAAQ,EACZA,EAAQ,iBACVA,EAAQ,gBAAgB,OAAQ,EAGxC,CAKE,oBAAqB,CACnB,KAAK,aAAa,KAAK,qBAAqB,EAC5C,KAAK,sBAAuB,CAChC,CAKE,iBAAkB,CAChB,KAAK,OAAO,CAAG,EACf,KAAK,QAAQ,cAAc,CAC/B,CAQE,gBAAiB,CACf,MAAM7nC,EAAS,KAAK,cAAe,EAC7BmlB,EAAU,CAAE,EAGlB,OAAI,OAAO,KAAKnlB,CAAM,EAAE,SAAW,GACjCmlB,EAAQ,KAAKnlB,CAAM,EAEd,KAAK,OAAO,SAAWmlB,CAClC,CAQE,eAAgB,CACd,OAAO,KAAK,OAAO,QAAU,CAAE,CACnC,CASE,YAAa,CACX,OAAO,KAAK,cAAe,GAAI,KAAK,cAAa,EAAG,KAAO,EAC/D,CAUE,aAAc,CACZ,OAAO,KAAK,cAAe,GAAI,KAAK,cAAa,EAAG,MAAQ,EAChE,CAYE,QAAQ/gC,EAAO,CACb,GAAIA,IAAU,OAAW,CACvB,KAAK,UAAU,aAAcA,CAAK,EAClC,KAAK,SAAS,QAAUA,EACxB,MACN,CACI,OAAO,KAAK,SAAS,SAAS,CAClC,CAmBE,SAASA,EAAO,CAEd,GAAIA,IAAU,OACZ,OAAO,KAAK,SAAS,UAAY,GAEnC,IAAIg2D,EAGA,OAAOh2D,GAAU,UAAY,mBAAmB,KAAKA,CAAK,GAAKA,IAAU,IAAQ,KAAK,SAAS,mBACjG,KAAK,SAAS,SAAWA,EACzB,KAAK,gBAAgB,OAAOA,GAAU,SAAWA,EAAQ,MAAM,EAC/Dg2D,EAAe,IAILh2D,EAKV,KAAK,SAAS,SAAW,GAJzB,KAAK,SAAS,SAAW,GAM3Bg2D,EAAe,OAAOA,EAAiB,IAAc,KAAK,SAAS,SAAWA,EAM1E,KAAK,OACP,KAAK,UAAU,cAAeA,CAAY,CAEhD,CAkBE,YAAYh2D,EAAO,CACjB,OAAIA,IAAU,SACZ,KAAK,UAAU,iBAAkBA,CAAK,EACtC,KAAK,SAAS,YAAcA,GAEvB,KAAK,SAAS,aAAa,CACtC,CAaE,KAAKA,EAAO,CACV,GAAIA,IAAU,OAAW,CACvB,KAAK,UAAU,UAAWA,CAAK,EAC/B,KAAK,SAAS,KAAOA,EACrB,MACN,CACI,OAAO,KAAK,SAAS,MAAM,CAC/B,CAcE,OAAOsc,EAAK,CACV,GAAIA,IAAQ,OACV,OAAO,KAAK,QAKTA,IACHA,EAAM,IAEJA,IAAQ,KAAK,UAKjB,KAAK,QAAUA,EAGf,KAAK,UAAU,YAAaA,CAAG,EAC/B,KAAK,kBAAoB,GASzB,KAAK,QAAQ,cAAc,EAC/B,CAcE,yBAA0B,CACxB,IAAK,CAAC,KAAK,SAAW,KAAK,SAAS,wBAA0B,KAAK,OAAS,KAAK,MAAM,OAAQ,CAC7F,MAAM25C,EAAY,KAAK,MAAM,OAAQ,GAAI,GACrCA,IAAc,KAAK,UACrB,KAAK,QAAUA,EACf,KAAK,kBAAoB,GAGzB,KAAK,QAAQ,cAAc,EAEnC,CACA,CAeE,SAASzU,EAAM,CACb,GAAIA,IAAS,OACX,MAAO,CAAC,CAAC,KAAK,UAEhBA,EAAO,CAAC,CAACA,EAGL,KAAK,YAAcA,IAGvB,KAAK,UAAYA,EACb,KAAK,uBACP,KAAK,UAAU,cAAeA,CAAI,EAEhC,KAAK,WACP,KAAK,YAAY,uBAAuB,EACxC,KAAK,SAAS,sBAAsB,EAKpC,KAAK,QAAQ,iBAAiB,EACzB,KAAK,uBACR,KAAK,0BAA2B,IAGlC,KAAK,YAAY,sBAAsB,EACvC,KAAK,SAAS,uBAAuB,EAKrC,KAAK,QAAQ,kBAAkB,EAC1B,KAAK,uBACR,KAAK,6BAA8B,GAG3C,CAoBE,oBAAoBA,EAAM,CACxB,GAAIA,IAAS,OACX,MAAO,CAAC,CAAC,KAAK,qBAEhBA,EAAO,CAAC,CAACA,EAGL,KAAK,uBAAyBA,IAGlC,KAAK,qBAAuBA,EACxB,KAAK,sBACP,KAAK,SAAS,2BAA2B,EAQzC,KAAK,QAAQ,qBAAqB,IAElC,KAAK,YAAY,2BAA2B,EAQ5C,KAAK,QAAQ,qBAAqB,GAExC,CAeE,MAAM/kD,EAAK,CACT,GAAIA,IAAQ,OACV,OAAO,KAAK,QAAU,KAexB,GAXA4hC,GAAM,aAAa,EAAE,QAAQ63B,GAAgB,CAC3C,MAAMC,EAASD,EAAa,KAAMz5D,CAAG,EACrC,GAAI,EAAEmuB,GAASurC,CAAM,GAAK,CAAC,MAAM,QAAQA,CAAM,GAAK,OAAOA,GAAW,UAAY,OAAOA,GAAW,UAAYA,IAAW,MAAO,CAChI,KAAK,IAAI,MAAM,oEAAoE,EACnF,MACR,CACM15D,EAAM05D,CACZ,CAAK,EAIG,KAAK,SAAS,2BAA6B15D,GAAOA,EAAI,OAAS,EAAG,CACpE,MAAM25D,EAAyB,UAAY,CACzC,KAAK,MAAM35D,CAAG,CACf,EACD,KAAK,SAAS,0BAA4B,GAC1C,KAAK,IAAI,CAAC,QAAS,YAAY,EAAG25D,CAAsB,EACxD,KAAK,IAAI,YAAa,UAAY,CAChC,KAAK,IAAI,CAAC,QAAS,YAAY,EAAGA,CAAsB,CAChE,CAAO,EACD,MACN,CAGI,GAAI35D,IAAQ,KAAM,CAChB,KAAK,OAAS,KACd,KAAK,YAAY,WAAW,EACxB,KAAK,cACP,KAAK,aAAa,MAAO,EAE3B,MACN,CACI,KAAK,OAAS,IAAIs1C,GAAWt1C,CAAG,EAGhC,KAAK,SAAS,WAAW,EAIzB6jC,EAAM,MAAM,SAAS,KAAK,OAAO,IAAI,IAAIyR,GAAW,WAAW,KAAK,OAAO,IAAI,CAAC,IAAK,KAAK,OAAO,QAAS,KAAK,MAAM,EAMrH,KAAK,QAAQ,OAAO,EAGpB1T,GAAM,OAAO,EAAE,QAAQ63B,GAAgBA,EAAa,KAAM,KAAK,MAAM,CAAC,CAE1E,CAQE,mBAAmBhkD,EAAO,CACxB,KAAK,cAAgB,EACzB,CAgBE,WAAWsvC,EAAM,CACf,GAAIA,IAAS,OACX,OAAO,KAAK,YAGd,GADAA,EAAO,CAAC,CAACA,EACLA,IAAS,KAAK,YAIlB,IADA,KAAK,YAAcA,EACf,KAAK,YAAa,CACpB,KAAK,cAAgB,GACrB,KAAK,YAAY,mBAAmB,EACpC,KAAK,SAAS,iBAAiB,EAK/B,KAAK,QAAQ,YAAY,EACzB,MACN,CAUQ,KAAK,OACP,KAAK,MAAM,IAAI,YAAa,SAAU3+C,EAAG,CACvCA,EAAE,gBAAiB,EACnBA,EAAE,eAAgB,CAC1B,CAAO,EAEH,KAAK,cAAgB,GACrB,KAAK,YAAY,iBAAiB,EAClC,KAAK,SAAS,mBAAmB,EAKjC,KAAK,QAAQ,cAAc,EAC/B,CAOE,wBAAyB,CACvB,IAAIwzD,EACAC,EACAC,EACJ,MAAMC,EAAiBhtB,GAAM,KAAM,KAAK,kBAAkB,EACpDitB,EAAkB,SAAU5zD,EAAG,EAG/BA,EAAE,UAAYyzD,GAAazzD,EAAE,UAAY0zD,KAC3CD,EAAYzzD,EAAE,QACd0zD,EAAY1zD,EAAE,QACd2zD,EAAgB,EAEnB,EACKE,EAAkB,UAAY,CAClCF,EAAgB,EAIhB,KAAK,cAAcH,CAAe,EAIlCA,EAAkB,KAAK,YAAYG,EAAgB,GAAG,CACvD,EACKG,EAA6B,SAAUzkD,EAAO,CAClDskD,EAAgB,EAEhB,KAAK,cAAcH,CAAe,CACnC,EAGD,KAAK,GAAG,YAAaK,CAAe,EACpC,KAAK,GAAG,YAAaD,CAAe,EACpC,KAAK,GAAG,UAAWE,CAA0B,EAC7C,KAAK,GAAG,aAAcA,CAA0B,EAChD,MAAMC,EAAa,KAAK,SAAS,YAAY,EAIzCA,GAAc,CAAC9zB,IAAU,CAACvB,KAC5Bq1B,EAAW,GAAG,aAAc,SAAU1kD,EAAO,CACvC,KAAK,OAAM,EAAG,SAAS,oBAAsB,IAC/C,KAAK,OAAQ,EAAC,OAAO,kBAAoB,KAAK,OAAM,EAAG,SAAS,mBAElE,KAAK,OAAM,EAAG,SAAS,kBAAoB,CACnD,CAAO,EACD0kD,EAAW,GAAG,aAAc,SAAU1kD,EAAO,CAC3C,KAAK,OAAQ,EAAC,SAAS,kBAAoB,KAAK,OAAM,EAAG,OAAO,iBACxE,CAAO,GAKH,KAAK,GAAG,UAAWskD,CAAc,EACjC,KAAK,GAAG,QAASA,CAAc,EAO/B,IAAIK,EAGJ,MAAMC,EAAgB,UAAY,CAEhC,GAAI,CAAC,KAAK,cACR,OAIF,KAAK,cAAgB,GAGrB,KAAK,WAAW,EAAI,EAGpB,KAAK,aAAaD,CAAiB,EACnC,MAAM9sB,EAAU,KAAK,SAAS,kBAC1BA,GAAW,IAMf8sB,EAAoB,KAAK,WAAW,UAAY,CAIzC,KAAK,eACR,KAAK,WAAW,EAAK,CAExB,EAAE9sB,CAAO,EACX,EACD,KAAK,YAAY+sB,EAAe,GAAG,CACvC,CAgBE,aAAavO,EAAM,CACjB,GAAIA,IAAS,OAAW,CAGtB,KAAK,UAAU,kBAAmBA,CAAI,EACtC,MACN,CACI,OAAI,KAAK,OAAS,KAAK,MAAM,qBACpB,KAAK,OAAO,kBAAoB,KAAK,SAAS,cAAc,EAE9D,CACX,CAiBE,oBAAoBA,EAAM,CACxB,OAAIA,IAAS,OACJ,KAAK,UAAU,yBAA0BA,CAAI,EAElD,KAAK,OAAS,KAAK,MAAM,qBACpB,KAAK,SAAS,qBAAqB,EAErC,CACX,CAaE,QAAQ/G,EAAM,CACZ,GAAIA,IAAS,OAAW,CACtB,KAAK,SAAW,CAAC,CAACA,EAClB,MACN,CACI,MAAO,CAAC,CAAC,KAAK,QAClB,CACE,oCAAqC,CACnC,MAAMoV,EAAa,KAAK,SAAS,YAAY,EACzC,CAACA,GAAc,KAAK,gBAAgB,mBAAqBA,EAAW,kBAGxE,KAAK,gBAAgB,iBAAmBA,EAAW,cAAe,EAClE,KAAK,OAAO,KAAK,gBAAgB,gBAAgB,EACrD,CACE,oBAAqB,CAEnB,KAAK,SAAS,qBAAqB,EACnC,MAAMG,EAAiB,KAAK,SAAU,EAChCH,EAAa,KAAK,SAAS,YAAY,EACvCI,EAAmBJ,GAAcA,EAAW,cAAe,EAIjEG,EAAe,QAAQv2C,GAAS,CAC1BA,IAAUo2C,GAGVp2C,EAAM,KAAO,CAACA,EAAM,SAAS,YAAY,IAC3CA,EAAM,KAAM,EACZ,KAAK,gBAAgB,eAAe,KAAKA,CAAK,EAEtD,CAAK,EACD,KAAK,gBAAgB,aAAe,KAAK,cAAe,EACxD,KAAK,gBAAgB,iBAAmBw2C,EACxC,KAAK,GAAG,eAAgB,KAAK,uCAAuC,EAGpE,KAAK,OAAOA,CAAgB,EAC5B,KAAK,QAAQ,qBAAqB,CACtC,CACE,qBAAsB,CACpB,KAAK,YAAY,qBAAqB,EACtC,KAAK,IAAI,eAAgB,KAAK,uCAAuC,EAGrE,KAAK,gBAAgB,eAAe,QAAQx2C,GAASA,EAAM,MAAM,EAGjE,KAAK,OAAO,KAAK,gBAAgB,YAAY,EAC7C,KAAK,QAAQ,qBAAqB,CACtC,CAeE,cAAcxgB,EAAO,CACnB,GAAI,OAAOA,GAAU,WAAaA,IAAU,KAAK,eAC/C,OAAO,KAAK,eAKd,GAHA,KAAK,eAAiBA,EAGlBA,EAAO,CACT,MAAMi3D,EAAe,CAAE,EAGvB,OAAI,KAAK,wBACPA,EAAa,KAAK,KAAK,sBAAsB,EAE3C,KAAK,gBACPA,EAAa,KAAK,KAAK,gBAAgB,EAErC,KAAK,mBACPA,EAAa,KAAK,KAAK,gBAAgB,EAAK,CAAC,EAExC,QAAQ,IAAIA,CAAY,EAAE,KAAK,IAAM,KAAK,oBAAoB,CAC3E,CAGI,OAAO,QAAQ,QAAS,EAAC,KAAK,IAAM,KAAK,qBAAqB,CAClE,CACE,qBAAsB,EAEP,KAAK,OAAS,KAAK,OAC3B,KAAM,EACX,KAAK,SAAS,uBAAuB,EACrC,KAAK,QAAQ,uBAAuB,CACxC,CACE,sBAAuB,EAER,KAAK,OAAS,KAAK,OAC3B,KAAM,EACX,KAAK,YAAY,uBAAuB,EACxC,KAAK,QAAQ,uBAAuB,CACxC,CAYE,gBAAgBj3D,EAAO,CACrB,OAAI,OAAOA,GAAU,WAAaA,IAAU,KAAK,iBACxC,KAAK,kBAEd,KAAK,iBAAmBA,EACpBA,EACE,KAAK,gBACsB,KAAK,cAAc,EAAK,EACzB,KAAK,IAAM,CAErC,KAAK,oBAAqB,CACpC,CAAS,EAEI,QAAQ,UAAU,KAAK,IAAM,CAElC,KAAK,oBAAqB,CAClC,CAAO,EAEI,QAAQ,UAAU,KAAK,IAAM,CAElC,KAAK,qBAAsB,CACjC,CAAK,EACL,CAuBE,aAAam3C,EAAMtoB,EAAOoC,EAAU,CAClC,GAAI,KAAK,MACP,OAAO,KAAK,MAAM,aAAakmB,EAAMtoB,EAAOoC,CAAQ,CAE1D,CAmBE,mBAAmBnyB,EAASi5C,EAAe,CACzC,GAAI,KAAK,MACP,OAAO,KAAK,MAAM,mBAAmBj5C,EAASi5C,CAAa,CAEjE,CAYE,sBAAsB17C,EAAM,GAAI,CAC9B,GAAI,CACF,MAAAkL,CACN,EAAQlL,EAQJ,GAPKkL,IACHA,EAAQlL,GAMN,KAAK,MACP,OAAO,KAAK,MAAM,sBAAsBkL,CAAK,CAEnD,CAYE,yBAA0B,CACxB,OAAO,KAAK,SAAS,yBAAyB,CAClD,CAQE,YAAa,CACX,OAAO,KAAK,OAAS,KAAK,MAAM,YAAc,KAAK,MAAM,WAAU,GAAM,CAC7E,CAQE,aAAc,CACZ,OAAO,KAAK,OAAS,KAAK,MAAM,aAAe,KAAK,MAAM,YAAW,GAAM,CAC/E,CAoBE,SAASuW,EAAM,CACb,GAAIA,IAAS,OACX,OAAO,KAAK,UAEV,KAAK,YAAc,OAAOA,CAAI,EAAE,YAAW,IAC7C,KAAK,UAAY,OAAOA,CAAI,EAAE,YAAa,EAGvC2sB,GAAU,IAAI,GAOhB,KAAK,QAAQ,gBAAgB,EAGrC,CAUE,WAAY,CACV,OAAO3J,GAAQuP,GAAO,UAAU,SAAS,UAAW,KAAK,UAAU,CACvE,CASE,QAAS,CACP,MAAMvxC,EAAUgiC,GAAQ,KAAK,QAAQ,EAC/B6S,EAAS70C,EAAQ,OACvBA,EAAQ,OAAS,CAAE,EACnB,QAASvB,EAAI,EAAGA,EAAIo2C,EAAO,OAAQp2C,IAAK,CACtC,IAAIgK,EAAQosC,EAAOp2C,CAAC,EAGpBgK,EAAQu5B,GAAQv5B,CAAK,EACrBA,EAAM,OAAS,OACfzI,EAAQ,OAAOvB,CAAC,EAAIgK,CAC1B,CACI,OAAOzI,CACX,CAkBE,YAAY4kC,EAAS5kC,EAAS,CAC5BA,EAAUA,GAAW,CAAE,EACvBA,EAAQ,QAAU4kC,GAAW,GAC7B,MAAMwzB,EAAQ,IAAItkB,GAAY,KAAM9zC,CAAO,EAC3C,YAAK,SAASo4D,CAAK,EACnBA,EAAM,GAAG,UAAW,IAAM,CACxB,KAAK,YAAYA,CAAK,CAC5B,CAAK,EACDA,EAAM,KAAM,EACLA,CACX,CAOE,0BAA2B,CACzB,GAAI,CAAC,KAAK,aACR,OAEF,MAAMC,EAAoB,KAAK,kBAAmB,EAC5CC,EAAe,KAAK,aAAc,EACxC,QAAS75D,EAAI,EAAGA,EAAI4yD,GAAiB,OAAQ5yD,IAAK,CAChD,MAAM85D,EAAsBlH,GAAiB5yD,CAAC,EACxC+5D,EAAW,KAAK,aAAaD,CAAmB,EACtD,GAAID,GAAgBE,EAAU,CAE5B,GAAIH,IAAsBE,EACxB,OAIEF,GACF,KAAK,YAAY/G,GAAmB+G,CAAiB,CAAC,EAExD,KAAK,SAAS/G,GAAmBiH,CAAmB,CAAC,EACrD,KAAK,YAAcA,EACnB,KACR,CACA,CACA,CAOE,0BAA2B,CACzB,MAAM/yB,EAAY,KAAK,uBAAwB,EAC/C,KAAK,YAAc,GACfA,GACF,KAAK,YAAYA,CAAS,CAEhC,CAsCE,YAAYizB,EAAa,CAEvB,OAAIA,IAAgB,OACX,OAAO,OAAO,KAAK,YAAY,GAExC,KAAK,YAAc,GACnB,KAAK,aAAe,OAAO,OAAO,CAAE,EAAElH,GAAqBkH,CAAW,EAItE,KAAK,yBAA0B,EAGxB,OAAO,OAAO,KAAK,YAAY,EAC1C,CAeE,WAAWv3D,EAAO,CAEhB,GAAIA,IAAU,OACZ,OAAO,KAAK,YAEdA,EAAQ,EAAQA,EAChB,MAAM4F,EAAU,KAAK,YAGrB,GAAI5F,IAAU4F,EAKd,YAAK,YAAc5F,EAIfA,GACF,KAAK,GAAG,eAAgB,KAAK,6BAA6B,EAC1D,KAAK,yBAA0B,IAI/B,KAAK,IAAI,eAAgB,KAAK,6BAA6B,EAC3D,KAAK,yBAA0B,GAE1BA,CACX,CASE,mBAAoB,CAClB,OAAO,KAAK,WAChB,CAUE,wBAAyB,CACvB,OAAOowD,GAAmB,KAAK,WAAW,GAAK,EACnD,CAwDE,UAAU98B,EAAOmZ,EAAO,CACtB,GAAI,CAACnZ,GAAS,OAAOA,GAAU,SAC7B,OAEF,MAAMmiB,EAAc,KAAK,YAAa,EACtC,KAAK,MAAO,EAGZ,KAAK,OAAO,MAAQ3U,GAAQxN,CAAK,EACjC,KAAM,CACJ,OAAAkkC,EACA,QAAAC,EACA,YAAAC,EACA,OAAAC,EACA,IAAAr7C,EACA,WAAA8xC,EACA,MAAAwJ,CACN,EAAQ,KAAK,OAAO,MAGZ,CAACH,GAAWE,IACd,KAAK,OAAO,MAAM,QAAU,CAAC,CAC3B,IAAKA,EACL,KAAMld,GAAYkd,CAAM,CAChC,CAAO,GAECliB,GACF,KAAK,YAAYA,CAAW,EAE1Bn5B,GACF,KAAK,IAAIA,CAAG,EAEVq7C,GACF,KAAK,OAAOA,CAAM,EAEhB,MAAM,QAAQvJ,CAAU,GAC1BA,EAAW,QAAQyJ,GAAM,KAAK,mBAAmBA,EAAI,EAAK,CAAC,EAEzD,KAAK,UACP,KAAK,SAAS,OAAO,CACnB,MAAAD,EACA,YAAaF,GAAeF,GAAU,EAC9C,CAAO,EAEH,KAAK,MAAM/qB,CAAK,CACpB,CAUE,UAAW,CACT,GAAI,CAAC,KAAK,OAAO,MAAO,CACtB,MAAMkrB,EAAS,KAAK,OAAQ,EACtBr7C,EAAM,KAAK,eAAgB,EAC3B8xC,EAAa,MAAM,UAAU,IAAI,KAAK,KAAK,iBAAkB,EAAEyJ,IAAO,CAC1E,KAAMA,EAAG,KACT,MAAOA,EAAG,MACV,SAAUA,EAAG,SACb,IAAKA,EAAG,GAChB,EAAQ,EACIvkC,EAAQ,CACZ,IAAAhX,EACA,WAAA8xC,CACD,EACD,OAAIuJ,IACFrkC,EAAM,OAASqkC,EACfrkC,EAAM,QAAU,CAAC,CACf,IAAKA,EAAM,OACX,KAAMmnB,GAAYnnB,EAAM,MAAM,CACxC,CAAS,GAEIA,CACb,CACI,OAAOwN,GAAQ,KAAK,OAAO,KAAK,CACpC,CAYE,OAAO,eAAentB,EAAK,CACzB,MAAMmkD,EAAc,CAClB,QAAS,CAAE,EACX,OAAQ,CAAA,CACT,EACKC,EAAatzB,GAAc9wB,CAAG,EAC9BqkD,EAAYD,EAAW,YAAY,EASzC,GARIj0B,GAASnwB,EAAK,UAAU,IAC1BokD,EAAW,KAAO,IAEhBj0B,GAASnwB,EAAK,WAAW,IAC3BokD,EAAW,MAAQ,IAIjBC,IAAc,KAAM,CAGtB,KAAM,CAACv7D,EAAK8N,CAAI,EAAI0tD,GAAeD,GAAa,IAAI,EAChDv7D,GACF6jC,EAAM,MAAM7jC,CAAG,EAEjB,OAAO,OAAOs7D,EAAYxtD,CAAI,CACpC,CAII,GAHA,OAAO,OAAOutD,EAAaC,CAAU,EAGjCpkD,EAAI,gBAAiB,CACvB,MAAMk6B,EAAWl6B,EAAI,WACrB,QAASpW,EAAI,EAAG+/C,EAAIzP,EAAS,OAAQtwC,EAAI+/C,EAAG//C,IAAK,CAC/C,MAAMijB,EAAQqtB,EAAStwC,CAAC,EAElB26D,EAAY13C,EAAM,SAAS,YAAa,EAC1C03C,IAAc,SAChBJ,EAAY,QAAQ,KAAKrzB,GAAcjkB,CAAK,CAAC,EACpC03C,IAAc,SACvBJ,EAAY,OAAO,KAAKrzB,GAAcjkB,CAAK,CAAC,CAEtD,CACA,CACI,OAAOs3C,CACX,CAUE,MAAMthB,EAAS,CACb,GAAIA,IAAY,OACd,OAAO,KAAK,cAEVA,GACF,KAAK,QAAQ,SAAS,EACtB,KAAK,kBAAoB,KAAK,IAAI,MAClC,KAAK,IAAI,MAAM,OAAO,EACtB,KAAK,cAAgB,KAErB,KAAK,QAAQ,UAAU,EACvB,KAAK,IAAI,MAAM,KAAK,iBAAiB,EACrC,KAAK,kBAAoB,OACzB,KAAK,cAAgB,GAE3B,CAcE,cAAc2hB,EAAU,CACtB,GAAIA,IAAa,OACf,OAAO,KAAK,OAAO,cAIhB,MAAM,QAAQA,CAAQ,GAKtBA,EAAS,MAAM5P,GAAQ,OAAOA,GAAS,QAAQ,IAGpD,KAAK,OAAO,cAAgB4P,EAQ5B,KAAK,QAAQ,qBAAqB,EACtC,CACA,CAqDAlhB,GAAI,MAAM,QAAQ,SAAUhxC,EAAM,CAChC,MAAMmxC,EAAQH,GAAIhxC,CAAI,EACtBoqC,GAAO,UAAU+G,EAAM,UAAU,EAAI,UAAY,CAC/C,OAAI,KAAK,MACA,KAAK,MAAMA,EAAM,UAAU,EAAG,GAKvC,KAAKA,EAAM,WAAW,EAAI,KAAKA,EAAM,WAAW,GAAK,IAAIA,EAAM,UACxD,KAAKA,EAAM,WAAW,EAC9B,CACH,CAAC,EAiBD/G,GAAO,UAAU,YAAcA,GAAO,UAAU,YAUhDA,GAAO,QAAU,CAAE,EACnB,MAAM+nB,GAAY54B,EAAS,UAU3B6Q,GAAO,UAAU,SAAW,CAE1B,UAAWpC,EAAK,kBAChB,MAAO,CAAE,EAET,gBAAiB,GAEjB,kBAAmB,IAEnB,cAAe,CAAE,EAGjB,OAAQ,GAER,SAAU,CAAC,cAAe,cAAe,WAAY,mBAAoB,iBAAkB,gBAAiB,cAAe,aAAc,eAAgB,oBAAqB,eAAe,EAC7L,SAAUmqB,KAAcA,GAAU,WAAaA,GAAU,UAAU,CAAC,GAAKA,GAAU,cAAgBA,GAAU,WAAa,KAE1H,UAAW,CAAE,EAEb,oBAAqB,iDACrB,kBAAmB,GACnB,WAAY,CACV,QAAS,CACP,aAAc,MACpB,CACG,EACD,YAAa,CAAE,EACf,WAAY,GACZ,cAAe,GACf,gBAAiB,GACjB,kBAAmB,CACjB,QAAS,GACT,eAAgB,EACjB,EAED,oBAAqB,EACvB,EACAnI,GAAsB,QAAQ,SAAU/9C,EAAO,CAC7Cm+B,GAAO,UAAU,aAAanE,GAAch6B,CAAK,CAAC,GAAG,EAAI,UAAY,CACnE,OAAO,KAAK,QAAQA,CAAK,CAC1B,CACH,CAAC,EA4DDq6B,EAAY,kBAAkB,SAAU8D,EAAM,EAa9C,MAAMgoB,GAAmB,SASnBC,GAAmB,iBAQnBC,GAAgB,CAAE,EAYlBC,GAAevyD,GAAQsyD,GAAc,eAAetyD,CAAI,EAYxDwyD,GAAYxyD,GAAQuyD,GAAavyD,CAAI,EAAIsyD,GAActyD,CAAI,EAAI,OAc/DyyD,GAAqB,CAAClsB,EAAQvmC,IAAS,CAC3CumC,EAAO8rB,EAAgB,EAAI9rB,EAAO8rB,EAAgB,GAAK,CAAE,EACzD9rB,EAAO8rB,EAAgB,EAAEryD,CAAI,EAAI,EACnC,EAgBM0yD,GAAoB,CAACnsB,EAAQ7D,EAAMiwB,IAAW,CAClD,MAAMlK,GAAakK,EAAS,SAAW,IAAM,cAC7CpsB,EAAO,QAAQkiB,EAAW/lB,CAAI,EAC9B6D,EAAO,QAAQkiB,EAAY,IAAM/lB,EAAK,KAAMA,CAAI,CAClD,EAgBMkwB,GAAoB,SAAU5yD,EAAM6yD,EAAQ,CAChD,MAAMC,EAAqB,UAAY,CAOrCJ,GAAkB,KAAM,CACtB,KAAA1yD,EACA,OAAA6yD,EACA,SAAU,IACX,EAAE,EAAI,EACP,MAAME,EAAWF,EAAO,MAAM,KAAM,SAAS,EAC7C,OAAAJ,GAAmB,KAAMzyD,CAAI,EAC7B0yD,GAAkB,KAAM,CACtB,KAAA1yD,EACA,OAAA6yD,EACA,SAAAE,CACN,CAAK,EACMA,CACR,EACD,cAAO,KAAKF,CAAM,EAAE,QAAQ,SAAUjxD,EAAM,CAC1CkxD,EAAmBlxD,CAAI,EAAIixD,EAAOjxD,CAAI,CAC1C,CAAG,EACMkxD,CACT,EAkBME,GAAsB,CAAChzD,EAAMizD,KAGjCA,EAAe,UAAU,KAAOjzD,EACzB,YAAa4K,EAAM,CACxB8nD,GAAkB,KAAM,CACtB,KAAA1yD,EACA,OAAQizD,EACR,SAAU,IACX,EAAE,EAAI,EACP,MAAMF,EAAW,IAAIE,EAAmB,KAAM,GAAGroD,CAAK,EAGtD,YAAK5K,CAAI,EAAI,IAAM+yD,EACnBL,GAAkB,KAAMK,EAAS,cAAc,EACxCA,CACR,GAiBH,MAAMG,EAAO,CASX,YAAY3sB,EAAQ,CAClB,GAAI,KAAK,cAAgB2sB,GACvB,MAAM,IAAI,MAAM,wDAAwD,EAE1E,KAAK,OAAS3sB,EACT,KAAK,MACR,KAAK,IAAM,KAAK,OAAO,IAAI,aAAa,KAAK,IAAI,GAKnDf,GAAQ,IAAI,EACZ,OAAO,KAAK,QACZK,GAAS,KAAM,KAAK,YAAY,YAAY,EAC5C4sB,GAAmBlsB,EAAQ,KAAK,IAAI,EAIpC,KAAK,QAAU,KAAK,QAAQ,KAAK,IAAI,EAGrCA,EAAO,GAAG,UAAW,KAAK,OAAO,CACrC,CAKE,SAAU,CACR,OAAO,KAAK,YAAY,OAC5B,CAcE,aAAa7D,EAAO,GAAI,CACtB,OAAAA,EAAK,KAAO,KAAK,KACjBA,EAAK,OAAS,KAAK,YACnBA,EAAK,SAAW,KACTA,CACX,CAgBE,QAAQz2B,EAAOy2B,EAAO,GAAI,CACxB,OAAOK,GAAQ,KAAK,YAAa92B,EAAO,KAAK,aAAay2B,CAAI,CAAC,CACnE,CAcE,mBAAmB,EAAG,CAAA,CAUtB,SAAU,CACR,KAAM,CACJ,KAAA1iC,EACA,OAAAumC,CACN,EAAQ,KAQJ,KAAK,QAAQ,SAAS,EACtB,KAAK,IAAK,EACVA,EAAO,IAAI,UAAW,KAAK,OAAO,EAKlCA,EAAO8rB,EAAgB,EAAEryD,CAAI,EAAI,GACjC,KAAK,OAAS,KAAK,MAAQ,KAI3BumC,EAAOvmC,CAAI,EAAIgzD,GAAoBhzD,EAAMsyD,GAActyD,CAAI,CAAC,CAChE,CAYE,OAAO,QAAQ6yD,EAAQ,CACrB,MAAMjvD,EAAI,OAAOivD,GAAW,SAAWL,GAAUK,CAAM,EAAIA,EAC3D,OAAO,OAAOjvD,GAAM,YAAc,CAACsvD,GAAO,UAAU,cAActvD,EAAE,SAAS,CACjF,CAiBE,OAAO,eAAe5D,EAAM6yD,EAAQ,CAClC,GAAI,OAAO7yD,GAAS,SAClB,MAAM,IAAI,MAAM,yBAAyBA,CAAI,4BAA4B,OAAOA,CAAI,GAAG,EAEzF,GAAIuyD,GAAavyD,CAAI,EACnBq6B,EAAM,KAAK,mBAAmBr6B,CAAI,iEAAiE,UAC1FoqC,GAAO,UAAU,eAAepqC,CAAI,EAC7C,MAAM,IAAI,MAAM,yBAAyBA,CAAI,wDAAwD,EAEvG,GAAI,OAAO6yD,GAAW,WACpB,MAAM,IAAI,MAAM,uBAAuB7yD,CAAI,8BAA8B,OAAO6yD,CAAM,GAAG,EAE3F,OAAAP,GAActyD,CAAI,EAAI6yD,EAIlB7yD,IAASoyD,KACPc,GAAO,QAAQL,CAAM,EACvBzoB,GAAO,UAAUpqC,CAAI,EAAI4yD,GAAkB5yD,EAAM6yD,CAAM,EAEvDzoB,GAAO,UAAUpqC,CAAI,EAAIgzD,GAAoBhzD,EAAM6yD,CAAM,GAGtDA,CACX,CAYE,OAAO,iBAAiB7yD,EAAM,CAC5B,GAAIA,IAASoyD,GACX,MAAM,IAAI,MAAM,iCAAiC,EAE/CG,GAAavyD,CAAI,IACnB,OAAOsyD,GAActyD,CAAI,EACzB,OAAOoqC,GAAO,UAAUpqC,CAAI,EAElC,CAaE,OAAO,WAAW+mC,EAAQ,OAAO,KAAKurB,EAAa,EAAG,CACpD,IAAI73D,EACJ,OAAAssC,EAAM,QAAQ/mC,GAAQ,CACpB,MAAM6yD,EAASL,GAAUxyD,CAAI,EACzB6yD,IACFp4D,EAASA,GAAU,CAAE,EACrBA,EAAOuF,CAAI,EAAI6yD,EAEvB,CAAK,EACMp4D,CACX,CAWE,OAAO,iBAAiBuF,EAAM,CAC5B,MAAM6yD,EAASL,GAAUxyD,CAAI,EAC7B,OAAO6yD,GAAUA,EAAO,SAAW,EACvC,CACA,CAcAK,GAAO,UAAYV,GAOnBU,GAAO,iBAAmBd,GAC1Bc,GAAO,eAAed,GAAkBc,EAAM,EAO9C9oB,GAAO,UAAU,YAAc,SAAUpqC,EAAM,CAC7C,MAAO,CAAC,CAAC,KAAKqyD,EAAgB,GAAK,KAAKA,EAAgB,EAAEryD,CAAI,IAAM,EACtE,EAOAoqC,GAAO,UAAU,UAAY,SAAUpqC,EAAM,CAC3C,MAAO,CAAC,CAACuyD,GAAavyD,CAAI,CAC5B,EAmEA,SAASmzD,GAAUh2D,EAASpG,EAAI,CAC9B,IAAIq8D,EAAS,GACb,OAAO,YAAaxoD,EAAM,CACxB,OAAKwoD,GACH/4B,EAAM,KAAKl9B,CAAO,EAEpBi2D,EAAS,GACFr8D,EAAG,MAAM,KAAM6T,CAAI,CAC3B,CACH,CAYA,SAASyoD,GAAkB12B,EAAO22B,EAASt5B,EAASjjC,EAAI,CACtD,OAAOo8D,GAAU,GAAGG,CAAO,yCAAyC32B,CAAK,kBAAkB3C,CAAO,YAAajjC,CAAE,CACnH,CAEA,IAAIw8D,GAAY,CACd,iBAAkB,mBAClB,qBAAsB,uBACtB,sBAAuB,wBACvB,sBAAuB,wBACvB,wBAAyB,0BACzB,gCAAiC,kCACjC,iCAAkC,mCAClC,oCAAqC,sCACrC,wBAAyB,0BACzB,mCAAoC,qCACpC,gCAAiC,kCACjC,iCAAkC,mCAClC,+BAAgC,iCAChC,2BAA4B,4BAC9B,EAmBA,MAAMC,GAAc92C,GAAMA,EAAG,QAAQ,GAAG,IAAM,EAAIA,EAAG,MAAM,CAAC,EAAIA,EAsEhE,SAAS+2C,EAAQ/2C,EAAI7jB,EAAS2tC,EAAO,CACnC,IAAID,EAASktB,EAAQ,UAAU/2C,CAAE,EACjC,GAAI6pB,EACF,OAAI1tC,GACFwhC,EAAM,KAAK,WAAW3d,CAAE,wDAAwD,EAE9E8pB,GACFD,EAAO,MAAMC,CAAK,EAEbD,EAET,MAAM5tB,EAAK,OAAO+D,GAAO,SAAWyjB,GAAE,IAAMqzB,GAAY92C,CAAE,CAAC,EAAIA,EAC/D,GAAI,CAACwgB,GAAKvkB,CAAE,EACV,MAAM,IAAI,UAAU,oDAAoD,EAY1E,MAAM+6C,GADc,gBAAiB/6C,EAAKA,EAAG,wBAAyB4gB,EAAS,WAAa,IAC7D5gB,EAAG,YAAW,EAAKA,EAAG,cAAc,MAC/D,CAACA,EAAG,cAAc,aAAe,CAAC+6C,EAAS,SAAS/6C,CAAE,IACxD0hB,EAAM,KAAK,iDAAiD,EAE9DxhC,EAAUA,GAAW,CAAE,EAInBA,EAAQ,YAAc,KACxBA,EAAQ,WAAa8f,EAAG,YAAcA,EAAG,WAAW,cAAgBA,EAAG,WAAW,aAAa,iBAAiB,EAAIA,EAAG,WAAaA,GAAI,UAAU,EAAI,GAExJyf,GAAM,aAAa,EAAE,QAAQ63B,GAAgB,CAC3C,MAAM7mD,EAAO6mD,EAAat3C,EAAIkiB,GAAQhiC,CAAO,CAAC,EAC9C,GAAI,CAAC8rB,GAASvb,CAAI,GAAK,MAAM,QAAQA,CAAI,EAAG,CAC1CixB,EAAM,MAAM,8CAA8C,EAC1D,MACN,CACIxhC,EAAUgiC,GAAQhiC,EAASuQ,CAAI,CACnC,CAAG,EAID,MAAMuqD,EAAkBrtB,EAAY,aAAa,QAAQ,EACzD,OAAAC,EAAS,IAAIotB,EAAgBh7C,EAAI9f,EAAS2tC,CAAK,EAC/CpO,GAAM,OAAO,EAAE,QAAQ63B,GAAgBA,EAAa1pB,CAAM,CAAC,EACpDA,CACT,CACAktB,EAAQ,OAASt7B,GACjBs7B,EAAQ,MAAQr7B,GAChBq7B,EAAQ,KAAOp7B,GACfo7B,EAAQ,SAAWl7B,GACnBk7B,EAAQ,WAAan7B,GAGrB,GAAIiB,EAAS,2BAA6B,IAAQiD,KAAU,CAC1D,IAAIkE,EAAQP,GAAE,sBAAsB,EACpC,GAAI,CAACO,EAAO,CACVA,EAAQe,GAAmB,qBAAqB,EAChD,MAAMspB,EAAO5qB,GAAE,MAAM,EACjB4qB,GACFA,EAAK,aAAarqB,EAAOqqB,EAAK,UAAU,EAE1CrpB,GAAehB,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KASrB,CACL,CACA,CAKAW,GAAiB,EAAGoyB,CAAO,EAO3BA,EAAQ,QAAUv7B,GAQlBu7B,EAAQ,QAAUrpB,GAAO,UAAU,SAQnCqpB,EAAQ,WAAa,IAAMrpB,GAAO,QAgBlCqpB,EAAQ,UAAY/2C,GAAM,CACxB,MAAM2tB,EAAUD,GAAO,QACvB,IAAI18B,EACJ,GAAI,OAAOgP,GAAO,SAAU,CAC1B,MAAMk3C,EAAMJ,GAAY92C,CAAE,EACpB6pB,EAAS8D,EAAQupB,CAAG,EAC1B,GAAIrtB,EACF,OAAOA,EAET74B,EAAMyyB,GAAE,IAAMyzB,CAAG,CACrB,MACIlmD,EAAMgP,EAER,GAAIwgB,GAAKxvB,CAAG,EAAG,CACb,KAAM,CACJ,OAAA64B,EACA,SAAAstB,CACN,EAAQnmD,EAIJ,GAAI64B,GAAU8D,EAAQwpB,CAAQ,EAC5B,OAAOttB,GAAU8D,EAAQwpB,CAAQ,CAEvC,CACA,EAWAJ,EAAQ,cAAgB,IAGxB,OAAO,KAAKrpB,GAAO,OAAO,EAAE,IAAIxsC,GAAKwsC,GAAO,QAAQxsC,CAAC,CAAC,EAAE,OAAO,OAAO,EACtE61D,EAAQ,QAAUrpB,GAAO,QACzBqpB,EAAQ,aAAentB,EAAY,aAmBnCmtB,EAAQ,kBAAoB,CAACzzD,EAAM8zD,KAC7B9rB,EAAK,OAAO8rB,CAAI,GAClBz5B,EAAM,KAAK,OAAOr6B,CAAI,6GAA6G,EAE9HsmC,EAAY,kBAAkB,KAAKA,EAAatmC,EAAM8zD,CAAI,GAEnEL,EAAQ,QAAUzrB,EAAK,QACvByrB,EAAQ,aAAezrB,EAAK,aAC5ByrB,EAAQ,IAAM7gB,GASd,OAAO,eAAe6gB,EAAS,aAAc,CAC3C,MAAO,CAAE,EACT,UAAW,GACX,WAAY,EACd,CAAC,EACD,OAAO,eAAeA,EAAQ,WAAY,aAAc,CACtD,MAAO9gB,GACP,UAAW,GACX,WAAY,EACd,CAAC,EAQD8gB,EAAQ,QAAU12B,GAQlB02B,EAAQ,IAAMt4B,GASds4B,EAAQ,aAAeJ,GAAkB,EAAG,uBAAwB,oBAAqBx4B,EAAO,EAShG44B,EAAQ,mBAAqBJ,GAAkB,EAAG,6BAA8B,iCAAkCt4B,EAAkB,EASpI04B,EAAQ,KAAOJ,GAAkB,EAAG,eAAgB,iCAAkC9vB,EAAK,EAC3FkwB,EAAQ,eAAiBP,GAAO,eAChCO,EAAQ,iBAAmBP,GAAO,iBAelCO,EAAQ,OAAS,CAACzzD,EAAM6yD,KACtBx4B,EAAM,KAAK,sEAAsE,EAC1E64B,GAAO,eAAelzD,EAAM6yD,CAAM,GAE3CY,EAAQ,WAAaP,GAAO,WAC5BO,EAAQ,UAAYP,GAAO,UAC3BO,EAAQ,iBAAmBP,GAAO,iBAelCO,EAAQ,YAAc,SAAU57C,EAAMvT,EAAM,CAC1C,OAAAuT,GAAQ,GAAKA,GAAM,YAAa,EAChC47C,EAAQ,QAAQ,UAAY54B,GAAQ44B,EAAQ,QAAQ,UAAW,CAC7D,CAAC57C,CAAI,EAAGvT,CACZ,CAAG,EACMmvD,EAAQ,QAAQ,UAAU57C,CAAI,CACvC,EAQA47C,EAAQ,IAAMp5B,EACdo5B,EAAQ,aAAen5B,GAQvBm5B,EAAQ,KAAO/nB,GASf+nB,EAAQ,gBAAkBJ,GAAkB,EAAG,0BAA2B,gCAAiCtoB,EAAkB,EAS7H0oB,EAAQ,iBAAmBJ,GAAkB,EAAG,2BAA4B,gCAAiCtoB,EAAkB,EAS/H0oB,EAAQ,WAAaJ,GAAkB,EAAG,qBAAsB,0BAA2B5nB,EAAU,EASrGgoB,EAAQ,cAAgBJ,GAAkB,EAAG,wBAAyB,6BAA8B/nB,EAAa,EASjHmoB,EAAQ,gBAAkBJ,GAAkB,EAAG,0BAA2B,+BAAgC7nB,EAAe,EASzHioB,EAAQ,SAAWJ,GAAkB,EAAG,mBAAoB,uBAAwBtkB,EAAQ,EAS5F0kB,EAAQ,cAAgBJ,GAAkB,EAAG,wBAAyB,4BAA6BnkB,EAAa,EAChHukB,EAAQ,YAAcrvB,GACtBqvB,EAAQ,IAAMrwB,GACdqwB,EAAQ,GAAKhxB,GACbgxB,EAAQ,IAAMvwB,GACduwB,EAAQ,IAAM5wB,GACd4wB,EAAQ,QAAU1wB,GAclB0wB,EAAQ,IAAM/jB,GACd+jB,EAAQ,UAAY9jB,GACpB8jB,EAAQ,WAAanjB,GACrBmjB,EAAQ,WAAahjB,GACrB,CAAC,OAAQ,aAAc,WAAY,WAAY,WAAY,cAAe,cAAe,gBAAiB,gBAAiB,UAAW,gBAAiB,eAAe,EAAE,QAAQ7yC,GAAK,CACnL61D,EAAQ71D,CAAC,EAAI,UAAY,CACvB,OAAAy8B,EAAM,KAAK,WAAWz8B,CAAC,qCAAqCA,CAAC,YAAY,EAClEgjC,GAAIhjC,CAAC,EAAE,MAAM,KAAM,SAAS,CACpC,CACH,CAAC,EACD61D,EAAQ,cAAgBJ,GAAkB,EAAG,wBAAyB,4BAA6Bn0B,EAAa,EAQhHu0B,EAAQ,IAAM7yB,GAQd6yB,EAAQ,GAAKvvB,GAQbuvB,EAAQ,IAAMzY,GAQdyY,EAAQ,IAAMptB,GAQdotB,EAAQ,IAAMrkB,GAGdqkB,EAAQ,MAAQF,GAEhB,8EAgBA,MAAMQ,EAAa,CAYjB,YAAY1iC,EAAgB,CAC1B,IAAI6H,EAAQ,KAEZ,OAAAA,EAAM,GAAK7H,EAAe,GAC1B6H,EAAM,MAAQA,EAAM,GACpBA,EAAM,MAAQ7H,EAAe,MAC7B6H,EAAM,OAAS7H,EAAe,OAC9B6H,EAAM,QAAU7H,EAAe,UAC/B6H,EAAM,UAAY7H,EAAe,UACjC6H,EAAM,SAAW7H,EAAe,QAChC,OAAO,eAAe6H,EAAO,UAAW,CAMtC,KAAM,CACJ,OAAOA,EAAM,SAAU,CACxB,EAMD,IAAI86B,EAAQ,CACV96B,EAAM,SAAS86B,CAAM,CAC7B,CACA,CAAK,EACM96B,CACX,CACA,CAsBA,MAAM+6B,WAAyBR,EAAQ,WAAY,CAIjD,aAAc,CACZ,MAAO,EACP,IAAIv+C,EAAO,KAEX,OAAAA,EAAK,QAAU,CAAE,EACjBA,EAAK,eAAiB,GAQtB,OAAO,eAAeA,EAAM,gBAAiB,CAC3C,KAAM,CACJ,OAAOA,EAAK,cACpB,CACA,CAAK,EAQD,OAAO,eAAeA,EAAM,SAAU,CACpC,KAAM,CACJ,OAAOA,EAAK,QAAQ,MAC5B,CACA,CAAK,EACDA,EAAK,OAAO,QAAQ,EAAI,IAAMA,EAAK,QAAQ,OAAQ,EAC5CA,CACX,CAeE,gBAAgBmc,EAAgB,CAC9B,IAAI6iC,EAAe,KAAK,oBAAoB7iC,EAAe,EAAE,EAG7D,GAAI6iC,EACF,OAAOA,EAET,MAAMv5D,EAAQ,KAAK,QAAQ,OAC3B,OAAAu5D,EAAe,IAAIH,GAAa1iC,CAAc,EACxC,GAAK12B,KAAS,MAClB,OAAO,eAAe,KAAMA,EAAO,CACjC,KAAM,CACJ,OAAO,KAAK,QAAQA,CAAK,CACnC,CACA,CAAO,EAEH,KAAK,QAAQ,KAAKu5D,CAAY,EAC9B,KAAK,QAAQ,CACX,aAAAA,EACA,KAAM,iBACZ,CAAK,EACMA,CACX,CASE,mBAAmBA,EAAc,CAC/B,IAAIC,EAAU,KACd,QAAS78D,EAAI,EAAGktB,EAAI,KAAK,OAAQltB,EAAIktB,EAAGltB,IACtC,GAAI,KAAKA,CAAC,IAAM48D,EAAc,CAC5BC,EAAU,KAAK,QAAQ,OAAO78D,EAAG,CAAC,EAAE,CAAC,EACjC,KAAK,iBAAmBA,EAC1B,KAAK,eAAiB,GACb,KAAK,eAAiBA,GAC/B,KAAK,iBAEP,KACR,CAEI,OAAI68D,GACF,KAAK,QAAQ,CACX,aAAAD,EACA,KAAM,oBACd,CAAO,EAEIC,CACX,CASE,oBAAoBz3C,EAAI,CACtB,QAASplB,EAAI,EAAGktB,EAAI,KAAK,OAAQltB,EAAIktB,EAAGltB,IAAK,CAC3C,MAAM4hC,EAAQ,KAAK5hC,CAAC,EACpB,GAAI4hC,EAAM,KAAOxc,EACf,OAAOwc,CAEf,CACI,OAAO,IACX,CAOE,SAAU,CACR,KAAK,eAAiB,GACtB,KAAK,QAAQ,OAAS,CAC1B,CACA,CAOA+6B,GAAiB,UAAU,eAAiB,CAC1C,OAAQ,SACR,gBAAiB,kBACjB,mBAAoB,oBACtB,EAGA,UAAWhoD,KAASgoD,GAAiB,UAAU,eAC7CA,GAAiB,UAAU,KAAOhoD,CAAK,EAAI,KAE7C,IAAImoD,GAAY,QAUhB,MAAMC,GAAe,SAAU9tB,EAAQ1tC,EAAS,CAC9C,MAAMy7D,EAAmB/tB,EAAO,cAC1BguB,EAAmB,IAAIN,GACvBjkB,EAAiB,UAAY,CACjCukB,EAAiB,QAAS,EAC1BhuB,EAAO,cAAgB+tB,EACvB/tB,EAAO,IAAI,UAAWyJ,CAAc,CACrC,EACD,OAAAzJ,EAAO,GAAG,UAAWyJ,CAAc,EACnCzJ,EAAO,cAAgB,IAAMguB,EAC7BhuB,EAAO,cAAc,QAAU6tB,GACxBG,CACT,EAaMC,GAAgB,SAAU37D,EAAS,CACvC,OAAOw7D,GAAa,KAAMZ,EAAQ,IAAI,MAAM,CAAA,EAAI56D,CAAO,CAAC,CAC1D,EAGA46D,EAAQ,eAAe,gBAAiBe,EAAa,EAGrDA,GAAc,QAAUJ,GAExB,wEAKA,MAAMnqD,GAAawqD,GAabC,GAA0B,CAAC9qD,EAAK+qD,IAIhCA,GAAOA,EAAI,aAAe/qD,IAAQ+qD,EAAI,YACjCA,EAAI,YAEN/qD,EAEHgrD,GAASj/C,GACT89C,EAAQ,IAAI,MACPA,EAAQ,IAAI,MAAM,KAAKA,EAAS,OAAQ,GAAG99C,CAAM,IAAI,EAEvD,UAAY,CAAE,EAWvB,SAASiP,MAASha,EAAM,CACtB,MAAM0yB,EAAUm2B,EAAQ,KAAOA,EAE/B,OADWn2B,EAAQ,OAASA,EAAQ,cAC1B,MAAMA,EAAS1yB,CAAI,CAC/B,CAMA,SAASiqD,MAAoBjqD,EAAM,CACjC,MAAM0yB,EAAUm2B,EAAQ,MAAQA,EAEhC,OADWn2B,EAAQ,kBAAoBA,EAAQ,kBACrC,MAAMA,EAAS1yB,CAAI,CAC/B,CASA,SAASkqD,GAAuBlpB,EAAU,CACxC,GAAIA,EAAS,SAAW,EACtB,MAAO,4BAET,IAAImpB,EAAoB;AAAA,EACxB,QAASz9D,EAAI,EAAGA,EAAIs0C,EAAS,OAAQt0C,IAAK,CACxC,MAAMumB,EAAQ+tB,EAAS,MAAMt0C,CAAC,EACxBwmB,EAAM8tB,EAAS,IAAIt0C,CAAC,EAC1By9D,GAAqB,GAAGl3C,CAAK,QAAQC,CAAG,eAAeA,EAAMD,CAAK;AAAA,CACtE,CACE,OAAOk3C,CACT,CASA,MAAMC,GAAoB,EAAI,GAMxBC,GAAkBD,GAAoB,EACtCE,GAAe,SAAUC,EAAYhgD,EAAW,CACpD,MAAMsgB,EAAU,CAAE,EAClB,IAAIn+B,EACJ,GAAI69D,GAAcA,EAAW,OAE3B,IAAK79D,EAAI,EAAGA,EAAI69D,EAAW,OAAQ79D,IAC7B6d,EAAUggD,EAAW,MAAM79D,CAAC,EAAG69D,EAAW,IAAI79D,CAAC,CAAC,GAClDm+B,EAAQ,KAAK,CAAC0/B,EAAW,MAAM79D,CAAC,EAAG69D,EAAW,IAAI79D,CAAC,CAAC,CAAC,EAI3D,OAAOu9D,GAAiBp/B,CAAO,CACjC,EAUM2/B,GAAY,SAAUxpB,EAAU1e,EAAM,CAC1C,OAAOgoC,GAAatpB,EAAU,SAAU/tB,EAAOC,EAAK,CAClD,OAAOD,EAAQo3C,IAAmB/nC,GAAQpP,EAAMm3C,IAAmB/nC,CACvE,CAAG,CACH,EASMmoC,GAAgB,SAAUF,EAAYjoC,EAAM,CAChD,OAAOgoC,GAAaC,EAAY,SAAUt3C,EAAO,CAC/C,OAAOA,EAAQm3C,IAAqB9nC,CACxC,CAAG,CACH,EAQMooC,GAAW,SAAU1pB,EAAU,CACnC,GAAIA,EAAS,OAAS,EACpB,OAAOipB,GAAkB,EAE3B,MAAMpvC,EAAS,CAAE,EACjB,QAASnuB,EAAI,EAAGA,EAAIs0C,EAAS,OAAQt0C,IAAK,CACxC,MAAMumB,EAAQ+tB,EAAS,IAAIt0C,EAAI,CAAC,EAC1BwmB,EAAM8tB,EAAS,MAAMt0C,CAAC,EAC5BmuB,EAAO,KAAK,CAAC5H,EAAOC,CAAG,CAAC,CAC5B,CACE,OAAO+2C,GAAiBpvC,CAAM,CAChC,EASM8vC,GAAqB,SAAUC,EAASC,EAAS,CACrD,IAAI53C,EAAQ,KACRC,EAAM,KACN43C,EAAQ,EACZ,MAAMC,EAAU,CAAE,EACZlwC,EAAS,CAAE,EACjB,GAAI,CAAC+vC,GAAW,CAACA,EAAQ,QAAU,CAACC,GAAW,CAACA,EAAQ,OACtD,OAAOZ,GAAkB,EAI3B,IAAIrzD,EAAQg0D,EAAQ,OAEpB,KAAOh0D,KACLm0D,EAAQ,KAAK,CACX,KAAMH,EAAQ,MAAMh0D,CAAK,EACzB,KAAM,OACZ,CAAK,EACDm0D,EAAQ,KAAK,CACX,KAAMH,EAAQ,IAAIh0D,CAAK,EACvB,KAAM,KACZ,CAAK,EAGH,IADAA,EAAQi0D,EAAQ,OACTj0D,KACLm0D,EAAQ,KAAK,CACX,KAAMF,EAAQ,MAAMj0D,CAAK,EACzB,KAAM,OACZ,CAAK,EACDm0D,EAAQ,KAAK,CACX,KAAMF,EAAQ,IAAIj0D,CAAK,EACvB,KAAM,KACZ,CAAK,EAQH,IALAm0D,EAAQ,KAAK,SAAU33D,EAAGwF,EAAG,CAC3B,OAAOxF,EAAE,KAAOwF,EAAE,IACtB,CAAG,EAGIhC,EAAQ,EAAGA,EAAQm0D,EAAQ,OAAQn0D,IAClCm0D,EAAQn0D,CAAK,EAAE,OAAS,SAC1Bk0D,IAGIA,IAAU,IACZ73C,EAAQ83C,EAAQn0D,CAAK,EAAE,OAEhBm0D,EAAQn0D,CAAK,EAAE,OAAS,QACjCk0D,IAGIA,IAAU,IACZ53C,EAAM63C,EAAQn0D,CAAK,EAAE,OAIrBqc,IAAU,MAAQC,IAAQ,OAC5B2H,EAAO,KAAK,CAAC5H,EAAOC,CAAG,CAAC,EACxBD,EAAQ,KACRC,EAAM,MAGV,OAAO+2C,GAAiBpvC,CAAM,CAChC,EAQMmwC,GAAiB7wC,GAAS,CAC9B,MAAM8wC,EAAS,CAAE,EACjB,GAAI,CAAC9wC,GAAS,CAACA,EAAM,OACnB,MAAO,GAET,QAASztB,EAAI,EAAGA,EAAIytB,EAAM,OAAQztB,IAChCu+D,EAAO,KAAK9wC,EAAM,MAAMztB,CAAC,EAAI,OAASytB,EAAM,IAAIztB,CAAC,CAAC,EAEpD,OAAOu+D,EAAO,KAAK,IAAI,CACzB,EAgBMC,GAAoB,SAAUlqB,EAAUoR,EAAa+M,EAAe,EAAG,CAE3E,QADoBne,EAAS,OAASA,EAAS,IAAIA,EAAS,OAAS,CAAC,EAAI,GACpDoR,GAAe+M,CACvC,EAQMgM,GAAoBZ,GAAc,CACtC,MAAMa,EAAiB,CAAE,EACzB,QAAS1+D,EAAI,EAAGA,EAAI69D,EAAW,OAAQ79D,IACrC0+D,EAAe,KAAK,CAClB,MAAOb,EAAW,MAAM79D,CAAC,EACzB,IAAK69D,EAAW,IAAI79D,CAAC,CAC3B,CAAK,EAEH,OAAO0+D,CACT,EAcMC,GAAmB,SAAUj4D,EAAGwF,EAAG,CAEvC,GAAIxF,IAAMwF,EACR,MAAO,GAOT,GAJI,CAACxF,GAAKwF,GAAK,CAACA,GAAKxF,GAIjBA,EAAE,SAAWwF,EAAE,OACjB,MAAO,GAGT,QAASlM,EAAI,EAAGA,EAAI0G,EAAE,OAAQ1G,IAC5B,GAAI0G,EAAE,MAAM1G,CAAC,IAAMkM,EAAE,MAAMlM,CAAC,GAAK0G,EAAE,IAAI1G,CAAC,IAAMkM,EAAE,IAAIlM,CAAC,EACnD,MAAO,GAKX,MAAO,EACT,EACM4+D,GAAkB,SAAUl4D,EAAG,CACnC,GAAI,GAACA,GAAK,CAACA,EAAE,QAAU,CAACA,EAAE,KAG1B,OAAOA,EAAE,IAAIA,EAAE,OAAS,CAAC,CAC3B,EAgBMm4D,GAAc,SAAUpxC,EAAOve,EAAW,CAC9C,IAAI0mB,EAAO,EACX,GAAI,CAACnI,GAAS,CAACA,EAAM,OACnB,OAAOmI,EAET,QAAS51B,EAAI,EAAGA,EAAIytB,EAAM,OAAQztB,IAAK,CACrC,MAAMumB,EAAQkH,EAAM,MAAMztB,CAAC,EACrBwmB,EAAMiH,EAAM,IAAIztB,CAAC,EAEvB,GAAI,EAAAkP,EAAYsX,GAIhB,IAAItX,EAAYqX,GAASrX,GAAasX,EAAK,CACzCoP,GAAQpP,EAAMtX,EACd,QACD,CAED0mB,GAAQpP,EAAMD,EAClB,CACE,OAAOqP,CACT,EAoBMkpC,GAA2B,CAACzuC,EAAU5a,IAAY,CAGtD,GAAI,CAACA,EAAQ,QACX,OAAOA,EAAQ,SAIjB,IAAItS,EAAS,EACb,OAACsS,EAAQ,OAAS,CAAE,GAAE,QAAQ,SAAUnJ,EAAG,CACzCnJ,GAAUmJ,EAAE,QAChB,CAAG,GAGAmJ,EAAQ,cAAgB,CAAE,GAAE,QAAQ,SAAUnJ,EAAG,CAC5CA,EAAE,OAAS,SACbnJ,GAAUktB,EAAS,mBAEzB,CAAG,EACMltB,CACT,EAUM47D,GAAsB1uC,IAAaA,EAAS,UAAY,IAAI,OAAO,CAACzb,EAAKa,EAASupD,KAClFvpD,EAAQ,MACVA,EAAQ,MAAM,QAAQ,SAAUmC,EAAMqnD,EAAI,CACxCrqD,EAAI,KAAK,CACP,SAAUgD,EAAK,SACf,aAAconD,EACd,UAAWC,EACX,KAAArnD,EACA,QAAAnC,CACR,CAAO,CACP,CAAK,EAEDb,EAAI,KAAK,CACP,SAAUa,EAAQ,SAClB,aAAcupD,EACd,UAAW,KACX,QAAAvpD,EACA,KAAM,IACZ,CAAK,EAEIb,GACN,EAAE,EACCsqD,GAAenpC,GAAS,CAC5B,MAAMopC,EAAcppC,EAAM,UAAYA,EAAM,SAAS,QAAUA,EAAM,SAASA,EAAM,SAAS,OAAS,CAAC,EACvG,OAAOopC,GAAeA,EAAY,OAAS,CAAE,CAC/C,EACMC,GAAoB,CAAC,CACzB,eAAAC,CACF,IAAM,CACJ,GAAI,CAACA,EACH,OAEF,KAAM,CACJ,MAAA9sD,EACA,aAAA+sD,CACJ,EAAMD,EACJ,IAAIE,GAAaD,GAAgB,CAAE,GAAE,OAAO,CAACp1D,EAAO4N,IAAS5N,GAAS4N,EAAK,OAAS,OAAS,EAAI,GAAI,CAAC,EACtG,OAAAynD,GAAahtD,GAASA,EAAM,OAASA,EAAM,OAAS,EAC7CgtD,CACT,EAUMC,GAAgB,CAACC,EAAM1pC,IAAU,CACrC,GAAIA,EAAM,QACR,MAAO,GAGT,GAAI0pC,GAAQA,EAAK,2BACf,OAAOA,EAAK,2BAEd,MAAM5oD,EAAWqoD,GAAanpC,CAAK,EAAE,OAAS,EAE9C,OAAIlf,GAAYkf,EAAM,eAAiBA,EAAM,cAAc,aAClDA,EAAM,cAAc,aAClBlf,GAAYkf,EAAM,mBACpBA,EAAM,mBAAqB,EACzBA,EAAM,eAAiBA,EAAM,cAAc,SAC7CA,EAAM,cAAc,SAClBA,EAAM,eACRA,EAAM,eAAiB,EAEzB,CACT,EASM2pC,GAAmB,SAAUrvC,EAAUsvC,EAAa,CACxD,IAAIx8D,EAAS,EACTnD,EAAI2/D,EAActvC,EAAS,cAG3B5a,EAAU4a,EAAS,SAASrwB,CAAC,EAGjC,GAAIyV,EAAS,CACX,GAAI,OAAOA,EAAQ,MAAU,IAC3B,MAAO,CACL,OAAQA,EAAQ,MAChB,QAAS,EACV,EAEH,GAAI,OAAOA,EAAQ,IAAQ,IACzB,MAAO,CACL,OAAQA,EAAQ,IAAMA,EAAQ,SAC9B,QAAS,EACV,CAEP,CACE,KAAOzV,KAAK,CAEV,GADAyV,EAAU4a,EAAS,SAASrwB,CAAC,EACzB,OAAOyV,EAAQ,IAAQ,IACzB,MAAO,CACL,OAAQtS,EAASsS,EAAQ,IACzB,QAAS,EACV,EAGH,GADAtS,GAAU27D,GAAyBzuC,EAAU5a,CAAO,EAChD,OAAOA,EAAQ,MAAU,IAC3B,MAAO,CACL,OAAQtS,EAASsS,EAAQ,MACzB,QAAS,EACV,CAEP,CACE,MAAO,CACL,OAAAtS,EACA,QAAS,EACV,CACH,EASMy8D,GAAkB,SAAUvvC,EAAUsvC,EAAa,CACvD,IAAIx8D,EAAS,EACTsS,EACAzV,EAAI2/D,EAActvC,EAAS,cAG/B,KAAOrwB,EAAIqwB,EAAS,SAAS,OAAQrwB,IAAK,CAExC,GADAyV,EAAU4a,EAAS,SAASrwB,CAAC,EACzB,OAAOyV,EAAQ,MAAU,IAC3B,MAAO,CACL,OAAQA,EAAQ,MAAQtS,EACxB,QAAS,EACV,EAGH,GADAA,GAAU27D,GAAyBzuC,EAAU5a,CAAO,EAChD,OAAOA,EAAQ,IAAQ,IACzB,MAAO,CACL,OAAQA,EAAQ,IAAMtS,EACtB,QAAS,EACV,CAEJ,CAED,MAAO,CACL,OAAQ,GACR,QAAS,EACV,CACH,EAeM08D,GAAmB,SAAUxvC,EAAUsvC,EAAaG,EAAS,CAIjE,GAHI,OAAOH,EAAgB,MACzBA,EAActvC,EAAS,cAAgBA,EAAS,SAAS,QAEvDsvC,EAActvC,EAAS,cACzB,MAAO,GAGT,MAAM0vC,EAAWL,GAAiBrvC,EAAUsvC,CAAW,EACvD,GAAII,EAAS,QAIX,OAAOA,EAAS,OAIlB,MAAMC,EAAUJ,GAAgBvvC,EAAUsvC,CAAW,EACrD,OAAIK,EAAQ,QAGHA,EAAQ,OAGVD,EAAS,OAASD,CAC3B,EAiBMpxC,GAAW,SAAU2B,EAAUsvC,EAAaG,EAAS,CACzD,GAAI,CAACzvC,EACH,MAAO,GAOT,GALI,OAAOyvC,GAAY,WACrBA,EAAU,GAIR,OAAOH,EAAgB,IAAa,CAEtC,GAAItvC,EAAS,cACX,OAAOA,EAAS,cAGlB,GAAI,CAACA,EAAS,QACZ,OAAO4R,EAAS,QAEnB,CAED,OAAO49B,GAAiBxvC,EAAUsvC,EAAaG,CAAO,CACxD,EAcMG,GAAe,SAAU,CAC7B,gBAAAC,EACA,aAAAC,EACA,WAAAh1C,EACA,SAAAwF,CACF,EAAG,CACD,IAAIyvC,EAAY,EAIhB,GAHIj1C,EAAawF,IACf,CAACxF,EAAYwF,CAAQ,EAAI,CAACA,EAAUxF,CAAU,GAE5CA,EAAa,EAAG,CAClB,QAASnrB,EAAImrB,EAAYnrB,EAAI,KAAK,IAAI,EAAG2wB,CAAQ,EAAG3wB,IAClDogE,GAAaF,EAEf/0C,EAAa,CACjB,CACE,QAASnrB,EAAImrB,EAAYnrB,EAAI2wB,EAAU3wB,IACrCogE,GAAaD,EAAangE,CAAC,EAAE,SAE/B,OAAOogE,CACT,EAqBMC,GAAc,SAAUhwC,EAAUyvC,EAASQ,EAAgBC,EAAiB,CAChF,GAAI,CAAClwC,GAAY,CAACA,EAAS,SACzB,OAAO,KAET,GAAIA,EAAS,QACX,OAAO3B,GAAS2B,CAAQ,EAE1B,GAAIyvC,IAAY,KACd,OAAO,KAETA,EAAUA,GAAW,EACrB,IAAIU,EAAqBX,GAAiBxvC,EAAUA,EAAS,cAAgBA,EAAS,SAAS,OAAQyvC,CAAO,EAC9G,OAAIQ,IACFC,EAAkB,OAAOA,GAAoB,SAAWA,EAAkBf,GAAc,KAAMnvC,CAAQ,EACtGmwC,GAAsBD,GAGjB,KAAK,IAAI,EAAGC,CAAkB,CACvC,EAmBMjS,GAAW,SAAUl+B,EAAUyvC,EAASS,EAAiB,CAE7D,MAAM1a,EAAgBia,GAAW,EACjC,IAAIha,EAAcua,GAAYhwC,EAAUyvC,EAAS,GAAgBS,CAAe,EAChF,OAAIza,IAAgB,KACXyX,GAAkB,GAGvBzX,EAAcD,IAChBC,EAAcD,GAET0X,GAAiB1X,EAAeC,CAAW,EACpD,EAeM2a,GAAsB,SAAU,CACpC,SAAApwC,EACA,YAAAq1B,EACA,qBAAAgb,EACA,kBAAAC,EACA,UAAAzxD,EACA,qBAAA0xD,CACF,EAAG,CACD,IAAIhrC,EAAO8vB,EAAcx2C,EACzB,MAAM2xD,EAAmB9B,GAAoB1uC,CAAQ,EACrD,IAAIlF,EAAa,EACjB,QAASnrB,EAAI,EAAGA,EAAI6gE,EAAiB,OAAQ7gE,IAAK,CAChD,MAAM8gE,EAAiBD,EAAiB7gE,CAAC,EACzC,GAAI0gE,IAAyBI,EAAe,cAIxC,SAAOH,GAAsB,UAAY,OAAOG,EAAe,WAAc,UAAYH,IAAsBG,EAAe,WAGlI,CAAA31C,EAAanrB,EACb,MACJ,CACE,GAAI41B,EAAO,EAAG,CAGZ,GAAIzK,EAAa,EACf,QAASnrB,EAAImrB,EAAa,EAAGnrB,GAAK,EAAGA,IAAK,CACxC,MAAM8gE,EAAiBD,EAAiB7gE,CAAC,EAEzC,GADA41B,GAAQkrC,EAAe,SACnBF,GACF,GAAIhrC,EAAO,EACT,iBAEOA,EAAO8nC,IAAqB,EACrC,SAEF,MAAO,CACL,UAAWoD,EAAe,UAC1B,aAAcA,EAAe,aAC7B,UAAW5xD,EAAY+wD,GAAa,CAClC,gBAAiB5vC,EAAS,eAC1B,aAAcwwC,EACd,WAAA11C,EACA,SAAUnrB,CACX,CAAA,CACF,CACT,CAII,MAAO,CACL,UAAW6gE,EAAiB,CAAC,GAAKA,EAAiB,CAAC,EAAE,WAAa,KACnE,aAAcA,EAAiB,CAAC,GAAKA,EAAiB,CAAC,EAAE,cAAgB,EACzE,UAAWnb,CACZ,CACF,CAID,GAAIv6B,EAAa,EAAG,CAClB,QAASnrB,EAAImrB,EAAYnrB,EAAI,EAAGA,IAE9B,GADA41B,GAAQvF,EAAS,eACbuF,EAAO,EACT,MAAO,CACL,UAAWirC,EAAiB,CAAC,GAAKA,EAAiB,CAAC,EAAE,WAAa,KACnE,aAAcA,EAAiB,CAAC,GAAKA,EAAiB,CAAC,EAAE,cAAgB,EACzE,UAAWnb,CACZ,EAGLv6B,EAAa,CACd,CAGD,QAASnrB,EAAImrB,EAAYnrB,EAAI6gE,EAAiB,OAAQ7gE,IAAK,CACzD,MAAM8gE,EAAiBD,EAAiB7gE,CAAC,EACzC41B,GAAQkrC,EAAe,SACvB,MAAMC,EAAoBD,EAAe,SAAWpD,GAC9CsD,EAAoBprC,IAAS,EAC7BqrC,EAA2BF,GAAqBnrC,EAAO8nC,IAAqB,EAClF,GAAI,GAAAsD,GAAqBC,IAanBjhE,IAAM6gE,EAAiB,OAAS,GAItC,IAAID,GACF,GAAIhrC,EAAO,EACT,iBAEOA,EAAO8nC,IAAqB,EACrC,SAEF,MAAO,CACL,UAAWoD,EAAe,UAC1B,aAAcA,EAAe,aAC7B,UAAW5xD,EAAY+wD,GAAa,CAClC,gBAAiB5vC,EAAS,eAC1B,aAAcwwC,EACd,WAAA11C,EACA,SAAUnrB,CACX,CAAA,CACF,EACF,CAED,MAAO,CACL,aAAc6gE,EAAiBA,EAAiB,OAAS,CAAC,EAAE,aAC5D,UAAWA,EAAiBA,EAAiB,OAAS,CAAC,EAAE,UACzD,UAAWnb,CACZ,CACH,EASMwb,GAAa,SAAU7wC,EAAU,CACrC,OAAOA,EAAS,cAAgBA,EAAS,aAAe,KAAK,IAAK,CACpE,EAUM8wC,GAAiB,SAAU9wC,EAAU,CACzC,OAAOA,EAAS,cAAgBA,EAAS,eAAiB,GAC5D,EASM+wC,GAAY,SAAU/wC,EAAU,CACpC,MAAMgxC,EAAWH,GAAW7wC,CAAQ,EACpC,MAAO,CAACA,EAAS,UAAY,CAACgxC,CAChC,EASMC,GAAa,SAAUjxC,EAAU,CACrC,OAAOA,EAAS,QAClB,EAOMkxC,GAAQ,SAAUxrC,EAAO,CAC7B,QAAS/1B,EAAI,EAAGA,EAAI+1B,EAAM,SAAS,OAAQ/1B,IACzC,GAAI+1B,EAAM,SAAS/1B,CAAC,EAAE,IACpB,MAAO,GAGX,MAAO,EACT,EAaMwhE,GAAe,SAAU/sD,EAAM4b,EAAU,CAC7C,OAAOA,EAAS,YAAcA,EAAS,WAAW5b,CAAI,CACxD,EAkBMgtD,GAA6B,SAAU3yC,EAAiB4yC,EAAWrxC,EAAUsxC,EAAgB,EAAG,CACpG,OAAKH,GAAa,YAAanxC,CAAQ,GAG1BvB,EAAkBuB,EAAS,WAAW,UACpCsxC,EAAgB,GAAKD,EAH3B,GAIX,EAOME,GAA2B,CAACnC,EAAM1pC,IAAU,CAChD,GAAI0pC,EAAK,UAAU,SAAW,EAC5B,MAAO,GAET,MAAMoC,EAAmB9rC,EAAM,WAAW,WAAa,OAAO,UAC9D,OAAO0pC,EAAK,UAAU,OAAOpvC,GACtB+wC,GAAU/wC,CAAQ,GAGfA,EAAS,WAAW,WAAa,GAAKwxC,EAFrC,EAGV,EAAE,SAAW,CAChB,EACMC,GAAgB,CAACp7D,EAAGwF,IAIpB,CAACxF,GAAK,CAACwF,GAAK,CAACxF,GAAKwF,GAAKxF,GAAK,CAACwF,EACxB,GAGL,GAAAxF,IAAMwF,GAKNxF,EAAE,IAAMwF,EAAE,IAAMxF,EAAE,KAAOwF,EAAE,IAK3BxF,EAAE,aAAewF,EAAE,aAAexF,EAAE,cAAgBwF,EAAE,aAKtDxF,EAAE,KAAOwF,EAAE,KAAOxF,EAAE,MAAQwF,EAAE,KAK9B61D,GAAmB,SAAUtC,EAAM19D,EAAU,CACjD,MAAMigE,EAAQvC,GAAQA,EAAK,aAAeA,EAAK,YAAY,OAAS,CAAE,EACtE,IAAIhO,EAAQ,GACZ,UAAWwQ,KAAaD,EAAO,CAC7B,UAAW1wC,KAAS0wC,EAAMC,CAAS,EAEjC,GADAxQ,EAAQ1vD,EAASigE,EAAMC,CAAS,EAAE3wC,CAAK,CAAC,EACpCmgC,EACF,MAGJ,GAAIA,EACF,KAEN,CACE,MAAO,CAAC,CAACA,CACX,EACMv+B,GAAcusC,GAAQ,CAG1B,GAAI,CAACA,GAAQ,CAACA,EAAK,WAAa,CAACA,EAAK,UAAU,OAI9C,OADcsC,GAAiBtC,EAAMyC,GAAWA,EAAQ,WAAaA,EAAQ,UAAU,QAAUA,EAAQ,GAAG,EAI9G,QAASliE,EAAI,EAAGA,EAAIy/D,EAAK,UAAU,OAAQz/D,IAAK,CAC9C,MAAMqwB,EAAWovC,EAAK,UAAUz/D,CAAC,EAC3BmiE,EAAS9xC,EAAS,YAAcA,EAAS,WAAW,OAO1D,GALI,EAAA8xC,GAAUA,EAAO,MAAM,GAAG,EAAE,MAAMhoD,GAAKH,GAAaG,CAAC,CAAC,GAI5C4nD,GAAiBtC,EAAMyC,GAAWJ,GAAczxC,EAAU6xC,CAAO,CAAC,GAMhF,MAAO,EACR,CAGD,MAAO,EACT,EAEA,IAAIE,GAAW,CACb,cAAA5C,GACA,SAAA9wC,GACA,SAAA6/B,GACA,oBAAAkS,GACA,UAAAW,GACA,WAAAE,GACA,WAAAJ,GACA,eAAAC,GACA,YAAAd,GACA,MAAAkB,GACA,aAAAC,GACA,2BAAAC,GACA,yBAAAG,GACA,YAAA1uC,GACA,cAAA4uC,GACA,yBAAAhD,EACF,EACA,KAAM,CACJ,IAAAn9B,EACF,EAAIw6B,EACEkG,GAAmB,CAACh/D,EAAOM,IACxB,GAAGN,CAAK,IAAIM,CAAG,GAGlB2+D,GAAU,CAAC9hE,EAAM6wB,EAAOC,IACrB,mBAAmB9wB,CAAI,IAAI6wB,CAAK,IAAIC,CAAK,GAqB5CixC,GAAgB,CAAC,CACrB,OAAAC,EACA,OAAAC,EACA,eAAA/lC,EACA,iBAAAgmC,EAAmB,CAAE,EACrB,iBAAAC,EAAmB,CAAE,EACrB,MAAAC,CACF,IAAM,CACJ,MAAMjmC,EAAS,IAAIlmB,GACf+rD,GACF7lC,EAAO,GAAG,OAAQ6lC,CAAM,EAEtBC,GACF9lC,EAAO,GAAG,OAAQ8lC,CAAM,EAE1BC,EAAiB,QAAQG,GAAgBlmC,EAAO,UAAUkmC,CAAY,CAAC,EACvEF,EAAiB,QAAQ9tD,GAAU8nB,EAAO,aAAa9nB,CAAM,CAAC,EAC9D8nB,EAAO,KAAKD,CAAc,EAC1BC,EAAO,IAAK,EACZ,MAAM3mB,EAAW2mB,EAAO,SAmBxB,GAhBKimC,IACH,CAAC,iBAAkB,OAAQ,gBAAiB,mBAAoB,UAAW,oBAAoB,EAAE,QAAQ,SAAUt8D,EAAG,CAChH0P,EAAS,eAAe1P,CAAC,GAC3B,OAAO0P,EAAS1P,CAAC,CAEzB,CAAK,EACG0P,EAAS,UACXA,EAAS,SAAS,QAAQ,SAAUP,EAAS,CAC3C,CAAC,QAAS,cAAc,EAAE,QAAQ,SAAUnP,EAAG,CACzCmP,EAAQ,eAAenP,CAAC,GAC1B,OAAOmP,EAAQnP,CAAC,CAE5B,CAAS,CACT,CAAO,GAGD,CAAC0P,EAAS,eAAgB,CAC5B,IAAIE,EAAiB,GACjBF,EAAS,UAAYA,EAAS,SAAS,SACzCE,EAAiBF,EAAS,SAAS,OAAO,CAACpB,EAAKzO,IAAM,KAAK,IAAIyO,EAAKzO,EAAE,QAAQ,EAAG,CAAC,GAEhFq8D,GACFA,EAAO,CACL,QAAS,gDAAgDtsD,CAAc,EAC/E,CAAO,EAEHF,EAAS,eAAiBE,CAC9B,CACE,MAAM3D,EAAQ2sD,GAAalpD,CAAQ,EACnC,GAAIzD,EAAM,QAAU,CAACyD,EAAS,mBAAoB,CAChD,MAAMG,EAAqB5D,EAAM,OAAO,CAACqC,EAAKtI,IAAM,KAAK,IAAIsI,EAAKtI,EAAE,QAAQ,EAAG,CAAC,EAC5Ek2D,IACFA,EAAO,CACL,QAAS,oDAAoDrsD,CAAkB,EACvF,CAAO,EACDwrB,GAAI,MAAM,uMAAuM,GAEnN3rB,EAAS,mBAAqBG,CAClC,CACE,OAAOH,CACT,EAWMsH,GAAoB,CAACmiD,EAAM19D,IAAa,CACvC09D,EAAK,aAGV,CAAC,QAAS,WAAW,EAAE,QAAQliD,GAAa,CAC1C,GAAKkiD,EAAK,YAAYliD,CAAS,EAG/B,UAAWC,KAAYiiD,EAAK,YAAYliD,CAAS,EAC/C,UAAWE,KAAYgiD,EAAK,YAAYliD,CAAS,EAAEC,CAAQ,EAAG,CAC5D,MAAME,EAAkB+hD,EAAK,YAAYliD,CAAS,EAAEC,CAAQ,EAAEC,CAAQ,EACtE1b,EAAS2b,EAAiBH,EAAWC,EAAUC,CAAQ,CAC/D,CAEA,CAAG,CACH,EAgBMqlD,GAAqB,CAAC,CAC1B,SAAAzyC,EACA,IAAA1sB,EACA,GAAAyhB,CACF,IAAM,CACJiL,EAAS,GAAKjL,EACdiL,EAAS,gBAAkB,EACvB1sB,IAIF0sB,EAAS,IAAM1sB,GASjB0sB,EAAS,WAAaA,EAAS,YAAc,CAAE,CACjD,EAUM0yC,GAAsBtD,GAAQ,CAClC,IAAIz/D,EAAIy/D,EAAK,UAAU,OACvB,KAAOz/D,KAAK,CACV,MAAMqwB,EAAWovC,EAAK,UAAUz/D,CAAC,EACjC8iE,GAAmB,CACjB,SAAAzyC,EACA,GAAIgyC,GAAiBriE,EAAGqwB,EAAS,GAAG,CAC1C,CAAK,EACDA,EAAS,YAAc1d,GAAW8sD,EAAK,IAAKpvC,EAAS,GAAG,EACxDovC,EAAK,UAAUpvC,EAAS,EAAE,EAAIA,EAE9BovC,EAAK,UAAUpvC,EAAS,GAAG,EAAIA,EAK1BA,EAAS,WAAW,WACvBsR,GAAI,KAAK,oEAAoE,CAEnF,CACA,EAQMqhC,GAAwBvD,GAAQ,CACpCniD,GAAkBmiD,EAAMruC,GAAc,CAChCA,EAAW,MACbA,EAAW,YAAcze,GAAW8sD,EAAK,IAAKruC,EAAW,GAAG,EAElE,CAAG,CACH,EAaM6xC,GAAe,CAACltC,EAAOpyB,IAAQ,CACnC,MAAMyhB,EAAKi9C,GAAiB,EAAG1+D,CAAG,EAC5B87D,EAAO,CACX,YAAa,CACX,MAAS,CAAE,EACX,MAAS,CAAE,EACX,kBAAmB,CAAE,EACrB,UAAa,CAAA,CACd,EACD,IAAKx9B,EAAS,SAAS,KACvB,YAAaA,EAAS,SAAS,KAC/B,UAAW,CAAC,CACV,IAAAt+B,EACA,GAAAyhB,EACA,YAAazhB,EAGb,WAAY,CAAA,CACb,CAAA,CACL,EAEE,OAAA87D,EAAK,UAAUr6C,CAAE,EAAIq6C,EAAK,UAAU,CAAC,EAErCA,EAAK,UAAU97D,CAAG,EAAI87D,EAAK,UAAU,CAAC,EAC/BA,CACT,EAaMyD,GAAsB,CAACzD,EAAM97D,EAAKw/D,EAAgBb,KAAY,CAClE7C,EAAK,IAAM97D,EACX,QAAS3D,EAAI,EAAGA,EAAIy/D,EAAK,UAAU,OAAQz/D,IACzC,GAAI,CAACy/D,EAAK,UAAUz/D,CAAC,EAAE,IAAK,CAI1B,MAAMojE,EAAW,mBAAmBpjE,CAAC,GACrCy/D,EAAK,UAAUz/D,CAAC,EAAE,IAAMojE,CAC9B,CAEE,MAAMC,EAAgBnwC,GAAYusC,CAAI,EACtCniD,GAAkBmiD,EAAM,CAACruC,EAAY7T,EAAWC,EAAUC,IAAa,CAErE,GAAI,CAAC2T,EAAW,WAAa,CAACA,EAAW,UAAU,OAAQ,CAIzD,GAAIiyC,GAAiB9lD,IAAc,SAAW,CAAC6T,EAAW,IACxD,QAASpxB,EAAI,EAAGA,EAAIy/D,EAAK,UAAU,OAAQz/D,IAAK,CAC9C,MAAMsM,EAAImzD,EAAK,UAAUz/D,CAAC,EAC1B,GAAIsM,EAAE,YAAcA,EAAE,WAAW,OAASA,EAAE,WAAW,QAAUkR,EAC/D,MAEZ,CAEM4T,EAAW,UAAY,CAACjyB,GAAS,CAAE,EAAEiyB,CAAU,CAAC,CACtD,CACIA,EAAW,UAAU,QAAQ,SAAU9kB,EAAGtM,EAAG,CAC3C,MAAMsjE,EAAUH,EAAc5lD,EAAWC,EAAUC,EAAUnR,CAAC,EACxD8Y,EAAKi9C,GAAiBriE,EAAGsjE,CAAO,EAClCh3D,EAAE,IACJA,EAAE,YAAcA,EAAE,aAAeqG,GAAW8sD,EAAK,IAAKnzD,EAAE,GAAG,GAM3DA,EAAE,IAAMtM,IAAM,EAAIsjE,EAAUl+C,EAG5B9Y,EAAE,YAAcA,EAAE,KAEpBA,EAAE,GAAKA,EAAE,IAAM8Y,EAGf9Y,EAAE,WAAaA,EAAE,YAAc,CAAA,EAE/BmzD,EAAK,UAAUnzD,EAAE,EAAE,EAAIA,EACvBmzD,EAAK,UAAUnzD,EAAE,GAAG,EAAIA,CAC9B,CAAK,CACL,CAAG,EACDy2D,GAAoBtD,CAAI,EACxBuD,GAAsBvD,CAAI,CAC5B,EACA,MAAM8D,EAAkB,CACtB,aAAc,CACZ,KAAK,QAAU,KACf,KAAK,mBAAqB,IAAI,IAC9B,KAAK,qBAAuB,IAAI,GACpC,CACE,UAAU1zC,EAAW,GAAI,CAMvB,GAJI,KAAK,UAAY,MAIjB,CAACA,EAAS,OACZ,OAEF,KAAM,CAAC2zC,CAAY,EAAI3zC,EAEnB2zC,EAAa,kBAAoB,SAIrC,KAAK,QAAUA,EAAa,gBAAkB,IAClD,CACE,qBAAqBC,EAAa,GAAI,CACpC,GAAI,CAACA,EAAW,OACd,OAEF,KAAM,CAACtrD,CAAS,EAAIsrD,EACdv0D,EAAYiJ,EAAU,UAAU,QAAS,EAC/C,KAAK,yBAAyBjJ,CAAS,EACvC,KAAK,mBAAqBu0D,EAAW,OAAO,CAAC/tD,EAAKguD,KAChDhuD,EAAI,IAAIguD,EAAiB,GAAIA,CAAgB,EACtChuD,GACN,IAAI,GAAK,CAChB,CACE,iBAAiByC,EAAW,CAC1B,KAAK,mBAAmB,OAAOA,EAAU,EAAE,EAC3C,KAAK,qBAAqB,IAAIA,EAAU,GAAIA,CAAS,CACzD,CACE,wBAAyB,CACvB,GAAI,KAAK,UAAY,KACnB,MAAO,CAAE,EAEX,MAAMwrD,EAAmB,CAAE,EACrBC,EAAsB,CAAE,EAC9B,KAAK,mBAAmB,QAAQ,CAACzrD,EAAWiN,IAAO,CACjD,GAAI,MAAK,qBAAqB,IAAIA,CAAE,IAGpCjN,EAAU,UAAYA,EAAU,UAAU,UAAY,IAAO,KAAK,QAClEA,EAAU,iBAAmB,IAAM,KAAK,iBAAiBA,CAAS,EAClEyrD,EAAoB,KAAKzrD,CAAS,EAC9B,EAACA,EAAU,OAGf,GAAIwrD,EAAiBxrD,EAAU,KAAK,EAAG,CACrC,MAAM9E,EAASswD,EAAiBxrD,EAAU,KAAK,EAAE,KAAKA,CAAS,EAC/DA,EAAU,eAAiB9E,EAAS,CAC5C,MACQswD,EAAiBxrD,EAAU,KAAK,EAAI,CAACA,CAAS,EAC9CA,EAAU,eAAiB,CAEnC,CAAK,EACD,UAAWA,KAAayrD,EAAqB,CAC3C,MAAMC,EAAYF,EAAiBxrD,EAAU,KAAK,GAAK,CAAE,EACrDA,EAAU,QACZA,EAAU,QAAUA,EAAU,QAAQ,UAAY,IAAO,KAAK,QACrDA,EAAU,WAAa0rD,EAAU1rD,EAAU,eAAiB,CAAC,EACtEA,EAAU,QAAU0rD,EAAU1rD,EAAU,eAAiB,CAAC,EAAE,UACnDA,EAAU,SACnBA,EAAU,QAAUA,EAAU,UAAYA,EAAU,SAC3CA,EAAU,gBACnBA,EAAU,QAAUA,EAAU,UAAYA,EAAU,gBAEpDA,EAAU,QAAUA,EAAU,SAEtC,CACI,OAAOyrD,CACX,CACE,yBAAyB10D,EAAW,CACrB,IAAI,IAAI,KAAK,oBAAoB,EACzC,QAAQ,CAACiJ,EAAWiN,IAAO,CAC1BjN,EAAU,UAAU,QAAO,EAAKjJ,GAClC,KAAK,qBAAqB,OAAOkW,CAAE,CAE3C,CAAK,CACL,CACA,CACA,MAAM0+C,GAAqB,GACrBC,GAAmC,CAAC,CACxC,YAAAC,EACA,QAAAxO,EACA,MAAAv2D,EACA,aAAAglE,CACF,IAAM,CACJ,MAAMC,EAAc1O,EAAQ,OAAS,KAAOA,EAAQ,OAAS,IACvD2O,EAAY3O,EAAQ,QAAU,KAAOA,EAAQ,QAAU,IACvD4O,EAAgB,CACpB,IAAK5O,EAAQ,IACb,YAAAwO,CACD,EACKK,EAA4BH,GAAe,CAACC,GAAaF,EAC/D,GAAIhlE,GAASklE,EAEXC,EAAc,MAAQjlE,GAAS,CAAA,EAAIF,CAAK,EACxCmlE,EAAc,UAAYjI,EAAQ,MAAM,6BAC/B3G,EAAQ,QACjB4O,EAAc,UAAYjI,EAAQ,MAAM,8BAC/B3G,EAAQ,SACjB4O,EAAc,SAAWjI,EAAQ,MAAM,8BAC9BkI,EAA2B,CACpC,MAAMC,EAAYL,EAAe9H,EAAQ,MAAM,wBAA0BA,EAAQ,MAAM,iBACvFiI,EAAc,UAAYE,EAC1BF,EAAc,OAAS5O,EAAQ,OAC/B4O,EAAc,QAAU5O,EAAQ,OACpC,CACE,OAAO4O,CACT,EACM,CACJ,YAAaG,EACf,EAAIpI,EACEqI,GAA0B,CAAC7gE,EAAKoyB,IAAU,CAC9C,GAAIA,EAAM,SAAW,CAACA,EAAM,cAC1B,OAAOpyB,EAET,MAAM8gE,EAAa,CAAE,EACrB,GAAI1uC,EAAM,cAAc,eAAgB,CACtC,KAAM,CACJ,eAAAspC,CACD,EAAGtpC,EAEJ,IAAI2uC,EAAU3uC,EAAM,cAAgBA,EAAM,SAAS,OAInD,GAAIspC,EAAgB,CAClB,MAAM9sD,EAAQ8sD,EAAe,OAAS,GAEhCsF,EAAWvF,GAAkBrpC,CAAK,EAAI,EAIxC4uC,EAAW,IAAMA,IAAapyD,EAAM,OAAS,IAG/CkyD,EAAW,UAAYE,IAWrBA,EAAW,IAAMpyD,EAAM,SACzBmyD,GAEH,CAGDD,EAAW,SAAWC,CAC1B,CAME,GALI3uC,EAAM,eAAiBA,EAAM,cAAc,eAG7C0uC,EAAW,UAAY1uC,EAAM,cAAc,kBAAoB,KAAO,OAEpE,OAAO,KAAK0uC,CAAU,EAAE,OAAQ,CAClC,MAAMG,EAAY,IAAI3iC,EAAS,IAAIt+B,CAAG,EACtC,CAAC,YAAa,WAAY,WAAW,EAAE,QAAQ,SAAU+E,EAAM,CACxD+7D,EAAW,eAAe/7D,CAAI,GAGnCk8D,EAAU,aAAa,IAAIl8D,EAAM+7D,EAAW/7D,CAAI,CAAC,CACvD,CAAK,EACD/E,EAAMihE,EAAU,SAAU,CAC9B,CACE,OAAOjhE,CACT,EAWMkhE,GAAgB,CAACn+D,EAAGwF,IAAM,CAC9B,GAAI,CAACxF,EACH,OAAOwF,EAET,MAAM/I,EAASmqB,GAAM5mB,EAAGwF,CAAC,EAQzB,GALIxF,EAAE,cAAgB,CAACwF,EAAE,cACvB,OAAO/I,EAAO,aAIZuD,EAAE,OAAS,CAACwF,EAAE,MAChB,OAAO/I,EAAO,cAGLuD,EAAE,OAASwF,EAAE,MACtB,QAASlM,EAAI,EAAGA,EAAIkM,EAAE,MAAM,OAAQlM,IAC9B0G,EAAE,OAASA,EAAE,MAAM1G,CAAC,IACtBmD,EAAO,MAAMnD,CAAC,EAAIstB,GAAM5mB,EAAE,MAAM1G,CAAC,EAAGkM,EAAE,MAAMlM,CAAC,CAAC,GAMpD,MAAI,CAAC0G,EAAE,SAAWwF,EAAE,UAClB/I,EAAO,QAAU,IAIfuD,EAAE,SAAW,CAACwF,EAAE,UAClB/I,EAAO,QAAU,IAEZA,CACT,EAiBM2hE,GAAiB,CAAC5jC,EAAU6jC,EAAQloD,IAAW,CACnD,MAAMmoD,EAAc9jC,EAAS,MAAO,EAC9B+jC,EAAcF,EAAO,MAAO,EAClCloD,EAASA,GAAU,EACnB,MAAM1Z,EAAS,CAAE,EACjB,IAAIyT,EACJ,QAASsuD,EAAW,EAAGA,EAAWD,EAAY,OAAQC,IAAY,CAChE,MAAMnzC,EAAaizC,EAAYE,EAAWroD,CAAM,EAC1CsoD,EAAaF,EAAYC,CAAQ,EACnCnzC,GACFnb,EAAamb,EAAW,KAAOnb,EAC/BzT,EAAO,KAAK0hE,GAAc9yC,EAAYozC,CAAU,CAAC,IAG7CvuD,GAAc,CAACuuD,EAAW,MAC5BA,EAAW,IAAMvuD,GAEnBzT,EAAO,KAAKgiE,CAAU,EAE5B,CACE,OAAOhiE,CACT,EACMiiE,GAAqB,CAAC3vD,EAAS4vD,IAAY,CAG3C,CAAC5vD,EAAQ,aAAeA,EAAQ,MAClCA,EAAQ,YAAc9C,GAAW0yD,EAAS5vD,EAAQ,GAAG,GAEnDA,EAAQ,KAAO,CAACA,EAAQ,IAAI,cAC9BA,EAAQ,IAAI,YAAc9C,GAAW0yD,EAAS5vD,EAAQ,IAAI,GAAG,GAE3DA,EAAQ,KAAO,CAACA,EAAQ,IAAI,cAC9BA,EAAQ,IAAI,YAAc9C,GAAW0yD,EAAS5vD,EAAQ,IAAI,GAAG,GAE3DA,EAAQ,KAAOA,EAAQ,IAAI,KAAO,CAACA,EAAQ,IAAI,IAAI,cACrDA,EAAQ,IAAI,IAAI,YAAc9C,GAAW0yD,EAAS5vD,EAAQ,IAAI,IAAI,GAAG,GAEnEA,EAAQ,OAASA,EAAQ,MAAM,QACjCA,EAAQ,MAAM,QAAQnJ,GAAK,CACrBA,EAAE,cAGNA,EAAE,YAAcqG,GAAW0yD,EAAS/4D,EAAE,GAAG,EAC/C,CAAK,EAECmJ,EAAQ,cAAgBA,EAAQ,aAAa,QAC/CA,EAAQ,aAAa,QAAQnJ,GAAK,CAC5BA,EAAE,cAGNA,EAAE,YAAcqG,GAAW0yD,EAAS/4D,EAAE,GAAG,EAC/C,CAAK,CAEL,EACMg5D,GAAiB,SAAUvvC,EAAO,CACtC,MAAMlG,EAAWkG,EAAM,UAAY,CAAE,EAC/BspC,EAAiBtpC,EAAM,eAI7B,GAAIspC,GAAkBA,EAAe,OAASA,EAAe,MAAM,OAAQ,CAIzE,GAAIA,EAAe,cACjB,QAASr/D,EAAI,EAAGA,EAAIq/D,EAAe,aAAa,OAAQr/D,IACtD,GAAIq/D,EAAe,aAAar/D,CAAC,EAAE,OAAS,MAC1C,OAAO6vB,EAKbwvC,EAAe,SAAWtpC,EAAM,eAChCspC,EAAe,QAAU,GACzBxvC,EAAS,KAAKwvC,CAAc,CAChC,CACE,OAAOxvC,CACT,EAIM01C,GAAsB,CAAC7+D,EAAGwF,IAAMxF,IAAMwF,GAAKxF,EAAE,UAAYwF,EAAE,UAAYxF,EAAE,SAAS,SAAWwF,EAAE,SAAS,QAAUxF,EAAE,UAAYwF,EAAE,SAAWxF,EAAE,gBAAkBwF,EAAE,eAAiBxF,EAAE,iBAAmBwF,EAAE,eAc3Ms5D,GAAe,CAAC/F,EAAMgG,EAAUC,EAAiBH,KAAwB,CAC7E,MAAMpiE,EAASmqB,GAAMmyC,EAAM,EAAE,EACvBkG,EAAWxiE,EAAO,UAAUsiE,EAAS,EAAE,EAI7C,GAHI,CAACE,GAGDD,EAAeC,EAAUF,CAAQ,EACnC,OAAO,KAETA,EAAS,SAAWH,GAAeG,CAAQ,EAC3C,MAAMG,EAAiBt4C,GAAMq4C,EAAUF,CAAQ,EAM/C,GAJIG,EAAe,gBAAkB,CAACH,EAAS,gBAC7C,OAAOG,EAAe,eAGpBD,EAAS,SAAU,CACrB,GAAIF,EAAS,KAAM,CACjBA,EAAS,SAAWA,EAAS,UAAY,CAAA,EAGzC,QAASzlE,EAAI,EAAGA,EAAIylE,EAAS,KAAK,gBAAiBzlE,IACjDylE,EAAS,SAAS,QAAQ,CACxB,QAAS,EACnB,CAAS,CAET,CACIG,EAAe,SAAWd,GAAea,EAAS,SAAUF,EAAS,SAAUA,EAAS,cAAgBE,EAAS,aAAa,CAC/H,CAEDC,EAAe,SAAS,QAAQnwD,GAAW,CACzC2vD,GAAmB3vD,EAASmwD,EAAe,WAAW,CAC1D,CAAG,EAID,QAAS5lE,EAAI,EAAGA,EAAImD,EAAO,UAAU,OAAQnD,IACvCmD,EAAO,UAAUnD,CAAC,EAAE,KAAOylE,EAAS,KACtCtiE,EAAO,UAAUnD,CAAC,EAAI4lE,GAG1B,OAAAziE,EAAO,UAAUsiE,EAAS,EAAE,EAAIG,EAEhCziE,EAAO,UAAUsiE,EAAS,GAAG,EAAIG,EAEjCtoD,GAAkBmiD,EAAM,CAACruC,EAAY7T,EAAWC,EAAUC,IAAa,CACrE,GAAK2T,EAAW,UAGhB,QAASpxB,EAAI,EAAGA,EAAIoxB,EAAW,UAAU,OAAQpxB,IAC3CylE,EAAS,KAAOr0C,EAAW,UAAUpxB,CAAC,EAAE,KAC1CoxB,EAAW,UAAUpxB,CAAC,EAAI4lE,EAGlC,CAAG,EACMziE,CACT,EAYM0iE,GAAe,CAAC9vC,EAAOgvC,IAAW,CACtC,MAAMl1C,EAAWkG,EAAM,UAAY,CAAE,EAC/BopC,EAActvC,EAASA,EAAS,OAAS,CAAC,EAC1Ci2C,EAAW3G,GAAeA,EAAY,OAASA,EAAY,MAAMA,EAAY,MAAM,OAAS,CAAC,EAC7F4G,EAAeD,GAAYA,EAAS,UAAY3G,GAAeA,EAAY,SACjF,OAAI4F,GAAUgB,EACLA,EAAe,KAIhBhwC,EAAM,oBAAsBA,EAAM,gBAAkB,IAAM,GACpE,EACMiwC,GAA0B,CAAC/0C,EAAWzwB,EAAMylE,IAAW,CAC3D,GAAI,CAACh1C,EACH,OAEF,MAAMi1C,EAAa,CAAE,EACrB,OAAAj1C,EAAU,QAAQZ,GAAY,CAE5B,GAAI,CAACA,EAAS,WACZ,OAEF,KAAM,CACJ,UAAA81C,EACA,WAAAC,EACA,OAAAjE,CACD,EAAG9xC,EAAS,WACb61C,EAAW,KAAK,CACd,GAAI71C,EAAS,GACb,UAAW81C,EACX,WAAYC,EACZ,OAAQjE,CACd,CAAK,CACL,CAAG,EACM,CACL,KAAA3hE,EACA,OAAAylE,EACA,WAAAC,CACD,CACH,EAWA,MAAMG,WAAuB9B,EAAc,CACzC,YAAYxlD,EAAKunD,EAAK/kE,EAAU,CAAA,EAAI,CAElC,GADA,MAAO,EACH,CAACwd,EACH,MAAM,IAAI,MAAM,gDAAgD,EAElE,KAAK,QAAUu+C,GAAO,gBAAgB,EACtC,KAAM,CACJ,gBAAAnlB,EAAkB,EACxB,EAAQ52C,EACJ,KAAK,IAAMwd,EACX,KAAK,KAAOunD,EACZ,KAAK,gBAAkBnuB,EACvB,KAAK,0BAA4B52C,EAAQ,yBACzC,MAAMglE,EAAaD,EAAI,SACvB,KAAK,iBAAmBC,GAAcA,EAAW,kBAAoB,CAAE,EACvE,KAAK,iBAAmBA,GAAcA,EAAW,kBAAoB,CAAE,EACvE,KAAK,MAAQA,GAAcA,EAAW,MACtC,KAAK,mBAAqB,IAAIhD,GAE9B,KAAK,MAAQ,eAEb,KAAK,0BAA4B,KAAK,0BAA0B,KAAK,IAAI,EACzE,KAAK,GAAG,qBAAsB,KAAK,yBAAyB,EAC5D,KAAK,GAAG,iBAAkB,KAAK,sBAAsB,KAAK,IAAI,CAAC,CACnE,CACE,uBAAwB,CACtB,MAAMiD,EAAgB,KAAK,MAAO,EAClC,GAAI,CAACA,EACH,OAEF,KAAK,mBAAmB,UAAUA,EAAc,QAAQ,EACxD,KAAK,mBAAmB,qBAAqBA,EAAc,UAAU,EACrE,MAAMC,EAAsB,KAAK,mBAAmB,uBAAwB,EACxE,CAACA,EAAoB,QAAU,CAAC,KAAK,2BAGzC,KAAK,0BAA0BA,CAAmB,CACtD,CACE,2BAA4B,CAC1B,GAAI,KAAK,QAAU,gBAEjB,OAEF,MAAM1wC,EAAQ,KAAK,MAAO,EAC1B,IAAIpyB,EAAMgP,GAAW,KAAK,KAAK,IAAKojB,EAAM,GAAG,EACzC,KAAK,QACPpyB,EAAM6gE,GAAwB7gE,EAAKoyB,CAAK,GAE1C,KAAK,MAAQ,wBACb,KAAK,QAAU,KAAK,KAAK,IAAI,CAC3B,IAAApyB,EACA,gBAAiB,KAAK,gBACtB,YAAa,cACnB,EAAO,CAAC1E,EAAOo+D,IAAQ,CAEjB,GAAK,KAAK,QAGV,IAAIp+D,EACF,OAAO,KAAK,qBAAqB,KAAK,QAAS,KAAK,MAAO,EAAE,eAAe,EAE9E,KAAK,aAAa,CAChB,eAAgB,KAAK,QAAQ,aAC7B,IAAK,KAAK,MAAK,EAAG,IAClB,GAAI,KAAK,QAAQ,EACzB,CAAO,EACP,CAAK,CACL,CACE,qBAAqBsF,EAAK8rB,EAAUq2C,EAAe,CACjD,KAAM,CACJ,IAAA/iE,EACA,GAAAyhB,CACD,EAAGiL,EAEJ,KAAK,QAAU,KACXq2C,IACF,KAAK,MAAQA,GAEf,KAAK,MAAQ,CACX,SAAU,KAAK,KAAK,UAAUthD,CAAE,EAChC,OAAQ7gB,EAAI,OACZ,QAAS,sCAAsCZ,CAAG,IAClD,aAAcY,EAAI,aAClB,KAAMA,EAAI,QAAU,IAAM,EAAI,EAC9B,SAAUw/D,GAAiC,CACzC,YAAax/D,EAAI,YACjB,QAASA,EACT,MAAOA,EAAI,KACZ,CAAA,CACF,EACD,KAAK,QAAQ,OAAO,CACxB,CACE,eAAe,CACb,IAAA+N,EACA,eAAAoqB,CACJ,EAAK,CACD,GAAI,CACF,OAAO6lC,GAAc,CACnB,OAAQ,CAAC,CACP,QAAA18D,CACV,IAAc,KAAK,QAAQ,wBAAwByM,CAAG,KAAKzM,CAAO,EAAE,EAC5D,OAAQ,CAAC,CACP,QAAAA,CACV,IAAc,KAAK,QAAQ,wBAAwByM,CAAG,KAAKzM,CAAO,EAAE,EAC5D,eAAA62B,EACA,iBAAkB,KAAK,iBACvB,iBAAkB,KAAK,iBACvB,MAAO,KAAK,KACpB,CAAO,CACF,OAAQz9B,EAAO,CACd,KAAK,MAAQA,EACb,KAAK,MAAM,SAAW,CACpB,UAAWk9D,EAAQ,MAAM,gCACzB,MAAAl9D,CACD,CACP,CACA,CAcE,aAAa,CACX,eAAA0nE,EACA,eAAAC,EACA,IAAAt0D,EACA,GAAA8S,CACJ,EAAK,CAED,KAAK,QAAU,KACf,KAAK,MAAQ,gBACb,MAAMyhD,EAAW,CACf,aAAc,CACZ,KAAM,QACN,IAAKv0D,CACb,CACK,EACD,KAAK,QAAQ,CACX,KAAM,qBACN,SAAAu0D,CACN,CAAK,EACD,MAAMx2C,EAAWu2C,GAAkB,KAAK,eAAe,CACrD,IAAAt0D,EACA,eAAgBq0D,CACtB,CAAK,EACDt2C,EAAS,YAAc,KAAK,IAAK,EACjCyyC,GAAmB,CACjB,SAAAzyC,EACA,IAAK/d,EACL,GAAA8S,CACN,CAAK,EAED,MAAM2/C,EAASS,GAAa,KAAK,KAAMn1C,CAAQ,EAC/C,KAAK,eAAiBA,EAAS,oBAAsBA,EAAS,eAC9D,KAAK,cAAgB,KACjB00C,GACF,KAAK,KAAOA,EACZ,KAAK,OAAS,KAAK,KAAK,UAAU3/C,CAAE,GAEpC,KAAK,QAAQ,mBAAmB,EAElC,KAAK,0BAA0BygD,GAAa,KAAK,QAAS,CAAC,CAACd,CAAM,CAAC,EACnE8B,EAAS,eAAiBb,GAAwB,KAAK,KAAK,UAAWa,EAAS,aAAa,KAAM,CAAC,KAAK,OAAO,OAAO,EACvH,KAAK,QAAQ,CACX,KAAM,wBACN,SAAAA,CACN,CAAK,EACD,KAAK,QAAQ,gBAAgB,CACjC,CAKE,SAAU,CACR,KAAK,QAAQ,SAAS,EACtB,KAAK,YAAa,EAClB5kC,EAAS,aAAa,KAAK,kBAAkB,EAC7CA,EAAS,aAAa,KAAK,qBAAqB,EAChD,KAAK,mBAAqB,IAAIshC,GAC9B,KAAK,IAAK,CACd,CACE,aAAc,CACZ,GAAI,KAAK,QAAS,CAChB,MAAMuD,EAAa,KAAK,QACxB,KAAK,QAAU,KACfA,EAAW,mBAAqB,KAChCA,EAAW,MAAO,CACxB,CACA,CAgBE,MAAMz2C,EAAU02C,EAAa,CAE3B,GAAI,CAAC12C,EACH,OAAO,KAAK,OAGd,GAAI,KAAK,QAAU,eACjB,MAAM,IAAI,MAAM,qCAAuC,KAAK,KAAK,EAInE,GAAI,OAAOA,GAAa,SAAU,CAChC,GAAI,CAAC,KAAK,KAAK,UAAUA,CAAQ,EAC/B,MAAM,IAAI,MAAM,yBAA2BA,CAAQ,EAErDA,EAAW,KAAK,KAAK,UAAUA,CAAQ,CAC7C,CAEI,GADA4R,EAAS,aAAa,KAAK,qBAAqB,EAC5C8kC,EAAa,CACf,MAAMC,GAAS32C,EAAS,oBAAsBA,EAAS,gBAAkB,EAAI,KAAQ,IACrF,KAAK,sBAAwB4R,EAAS,WAAW,KAAK,MAAM,KAAK,KAAM5R,EAAU,EAAK,EAAG22C,CAAK,EAC9F,MACN,CACI,MAAMN,EAAgB,KAAK,MACrBO,EAAc,CAAC,KAAK,QAAU52C,EAAS,KAAO,KAAK,OAAO,GAC1D62C,EAAkB,KAAK,KAAK,UAAU72C,EAAS,EAAE,EAEvD,GAAI62C,GAAmBA,EAAgB,SAGvC72C,EAAS,SAAWA,EAAS,SAAS,OAAQ,CAExC,KAAK,UACP,KAAK,QAAQ,mBAAqB,KAClC,KAAK,QAAQ,MAAO,EACpB,KAAK,QAAU,MAEjB,KAAK,MAAQ,gBACb,KAAK,OAASA,EAEV42C,IACF,KAAK,QAAQ,eAAe,EACxBP,IAAkB,qBAMpB,KAAK,QAAQ,gBAAgB,EAE7B,KAAK,QAAQ,aAAa,GAG9B,MACD,CAQD,GAFA,KAAK,0BAA0Bb,GAAax1C,EAAU,EAAI,CAAC,EAEvD,CAAC42C,EACH,OAIF,GAFA,KAAK,MAAQ,kBAET,KAAK,QAAS,CAChB,GAAI52C,EAAS,cAAgB,KAAK,QAAQ,IAGxC,OAEF,KAAK,QAAQ,mBAAqB,KAClC,KAAK,QAAQ,MAAO,EACpB,KAAK,QAAU,IAChB,CAEG,KAAK,QACP,KAAK,QAAQ,eAAe,EAE9B,KAAK,cAAgBA,EACrB,MAAMw2C,EAAW,CACf,aAAc,CACZ,KAAM,QACN,IAAKx2C,EAAS,GACtB,CACK,EACD,KAAK,QAAQ,CACX,KAAM,uBACN,SAAAw2C,CACN,CAAK,EACD,KAAK,QAAU,KAAK,KAAK,IAAI,CAC3B,IAAKx2C,EAAS,YACd,gBAAiB,KAAK,gBACtB,YAAa,cACnB,EAAO,CAACpxB,EAAOo+D,IAAQ,CAEjB,GAAK,KAAK,QAKV,IAFAhtC,EAAS,YAAc,KAAK,IAAK,EACjCA,EAAS,YAAc+sC,GAAwB/sC,EAAS,YAAagtC,CAAG,EACpEp+D,EACF,OAAO,KAAK,qBAAqB,KAAK,QAASoxB,EAAUq2C,CAAa,EAExE,KAAK,QAAQ,CACX,KAAM,0BACN,SAAAG,CACR,CAAO,EACD,KAAK,aAAa,CAChB,eAAgBxJ,EAAI,aACpB,IAAKhtC,EAAS,IACd,GAAIA,EAAS,EACrB,CAAO,EAEGq2C,IAAkB,qBACpB,KAAK,QAAQ,gBAAgB,EAE7B,KAAK,QAAQ,aAAa,EAElC,CAAK,CACL,CAKE,OAAQ,CACF,KAAK,qBACPzkC,EAAS,aAAa,KAAK,kBAAkB,EAC7C,KAAK,mBAAqB,MAE5B,KAAK,YAAa,EACd,KAAK,QAAU,iBAGjB,KAAK,QAAU,IAGb,KAAK,QAAU,kBAIb,KAAK,OACP,KAAK,MAAQ,gBAEb,KAAK,MAAQ,qBAEN,KAAK,QAAU,0BACxB,KAAK,MAAQ,gBAEnB,CAKE,KAAK8kC,EAAa,CACZ,KAAK,qBACP9kC,EAAS,aAAa,KAAK,kBAAkB,EAC7C,KAAK,mBAAqB,MAE5B,MAAMlM,EAAQ,KAAK,MAAO,EAC1B,GAAIgxC,EAAa,CACf,MAAMC,EAAQjxC,GAASA,EAAM,oBAAsBA,EAAM,gBAAkB,EAAI,IAAO,IACtF,KAAK,mBAAqBkM,EAAS,WAAW,IAAM,CAClD,KAAK,mBAAqB,KAC1B,KAAK,KAAM,CACZ,EAAE+kC,CAAK,EACR,MACN,CACI,GAAI,CAAC,KAAK,QAAS,CACjB,KAAK,MAAO,EACZ,MACN,CACQjxC,GAAS,CAACA,EAAM,QAClB,KAAK,QAAQ,oBAAoB,EAEjC,KAAK,QAAQ,gBAAgB,CAEnC,CACE,0BAA0BixC,EAAO,CAC3B,KAAK,qBACP/kC,EAAS,aAAa,KAAK,kBAAkB,EAC7C,KAAK,mBAAqB,MAGxB,GAAC,KAAK,MAAK,GAAM,KAAK,MAAO,EAAC,WAGlC,KAAK,mBAAqBA,EAAS,WAAW,IAAM,CAClD,KAAK,mBAAqB,KAC1B,KAAK,QAAQ,oBAAoB,EACjC,KAAK,0BAA0B+kC,CAAK,CACrC,EAAEA,CAAK,EACZ,CAKE,OAAQ,CAEN,GADA,KAAK,QAAU,GACX,OAAO,KAAK,KAAQ,SAAU,CAG3B,KAAK,IAAI,MACZ,KAAK,IAAI,IAAM/kC,EAAS,SAAS,MAInC,KAAK,IAAI,YAAc,KAAK,IAAI,IAUhC,WAAW,IAAM,CACf,KAAK,qBAAqB,KAAK,GAAG,CACnC,EAAE,CAAC,EACJ,MACN,CACI,MAAM4kC,EAAW,CACf,aAAc,CACZ,KAAM,eACN,IAAK,KAAK,GAClB,CACK,EACD,KAAK,QAAQ,CACX,KAAM,uBACN,SAAAA,CACN,CAAK,EAED,KAAK,QAAU,KAAK,KAAK,IAAI,CAC3B,IAAK,KAAK,IACV,gBAAiB,KAAK,gBACtB,YAAa,cACnB,EAAO,CAAC5nE,EAAOo+D,IAAQ,CAEjB,GAAI,CAAC,KAAK,QACR,OAIF,GADA,KAAK,QAAU,KACXp+D,EACF,YAAK,MAAQ,CACX,OAAQo+D,EAAI,OACZ,QAAS,sCAAsC,KAAK,GAAG,IACvD,aAAcA,EAAI,aAElB,KAAM,EACN,SAAU0G,GAAiC,CACzC,YAAa1G,EAAI,YACjB,QAASA,EACT,MAAAp+D,CACD,CAAA,CACF,EACG,KAAK,QAAU,iBACjB,KAAK,QAAU,IAEV,KAAK,QAAQ,OAAO,EAE7B,KAAK,QAAQ,CACX,KAAM,0BACN,SAAA4nE,CACR,CAAO,EACD,KAAK,IAAMzJ,GAAwB,KAAK,IAAKC,CAAG,EAChD,KAAK,QAAQ,CACX,KAAM,qBACN,SAAAwJ,CACR,CAAO,EACD,MAAM7wD,EAAW,KAAK,eAAe,CACnC,eAAgBqnD,EAAI,aACpB,IAAK,KAAK,GAClB,CAAO,EAEDwJ,EAAS,eAAiBb,GAAwBhwD,EAAS,UAAW6wD,EAAS,aAAa,KAAM,EAAK,EACvG,KAAK,QAAQ,CACX,KAAM,wBACN,SAAAA,CACR,CAAO,EACD,KAAK,qBAAqB7wD,CAAQ,CACxC,CAAK,CACL,CACE,QAAS,CACP,OAAO,OAAO,KAAK,KAAQ,SAAW,KAAK,IAAM,KAAK,IAAI,GAC9D,CAoBE,qBAAqBA,EAAU,CAE7B,GADA,KAAK,MAAQ,qBACTA,EAAS,UAAW,CACtB,KAAK,KAAOA,EACZktD,GAAoB,KAAK,KAAM,KAAK,OAAQ,CAAA,EAI5CltD,EAAS,UAAU,QAAQqa,GAAY,CACrCA,EAAS,SAAWi1C,GAAej1C,CAAQ,EAC3CA,EAAS,SAAS,QAAQ5a,GAAW,CACnC2vD,GAAmB3vD,EAAS4a,EAAS,WAAW,CAC1D,CAAS,CACT,CAAO,EACD,KAAK,QAAQ,gBAAgB,EACxB,KAAK,SAGR,KAAK,MAAM,KAAK,KAAK,UAAU,CAAC,CAAC,EAEnC,MACD,CAID,MAAM1sB,EAAM,KAAK,OAAQ,GAAIs+B,EAAS,SAAS,KAC/C,KAAK,KAAOghC,GAAajtD,EAAUrS,CAAG,EACtC,KAAK,aAAa,CAChB,eAAgBqS,EAChB,IAAKrS,EACL,GAAI,KAAK,KAAK,UAAU,CAAC,EAAE,EACjC,CAAK,EACD,KAAK,QAAQ,gBAAgB,CACjC,CAYE,oBAAoB+tD,EAAOyV,EAAU,CACnC,MAAM1H,EAAO,KAAK,KACZ2H,EAAU1V,EAAM,GACtB,IAAI1xD,EAAIy/D,EAAK,UAAU,OAEvB,KAAOz/D,KAAK,CACV,MAAMsM,EAAImzD,EAAK,UAAUz/D,CAAC,EAC1B,GAAIsM,EAAE,WAAW,YAAY,IAAM86D,EAAS,CAC1C,MAAMC,EAAiB/6D,EAAE,YACnBg7D,EAAgBh7D,EAAE,GAExB,GAAI66D,EAAU,CACZ,MAAMI,EAAiB,KAAK,gBAAgBj7D,EAAE,YAAaolD,CAAK,EAC1D8V,EAAgBnF,GAAiB+E,EAASG,CAAc,EACxDhzD,EAAa,KAAK,uBAAuB6yD,EAAS96D,EAAE,UAAU,EAC9Dm7D,EAAkB,KAAK,qBAAqBn7D,EAAGk7D,EAAe9V,EAAOn9C,CAAU,EACrFkrD,EAAK,UAAUz/D,CAAC,EAAIynE,EACpBhI,EAAK,UAAU+H,CAAa,EAAIC,EAChChI,EAAK,UAAU8H,CAAc,EAAIE,CAC3C,MAEUhI,EAAK,UAAU,OAAOz/D,EAAG,CAAC,EAG5B,OAAOy/D,EAAK,UAAU6H,CAAa,EACnC,OAAO7H,EAAK,UAAU4H,CAAc,CAC5C,CACA,CACI,KAAK,yBAAyB3V,EAAOyV,CAAQ,CACjD,CAaE,yBAAyBzV,EAAOyV,EAAU,CACxC,MAAM1H,EAAO,KAAK,KACZr6C,EAAKssC,EAAM,GACjB,CAAC,QAAS,YAAa,iBAAiB,EAAE,QAAQn0C,GAAa,CAC7D,GAAI,GAACkiD,EAAK,YAAYliD,CAAS,GAAK,CAACkiD,EAAK,YAAYliD,CAAS,EAAE6H,CAAE,IAGnE,UAAW5H,KAAYiiD,EAAK,YAAYliD,CAAS,EAE/C,GAAIC,IAAa4H,EAAI,CACnB,UAAW3H,KAAYgiD,EAAK,YAAYliD,CAAS,EAAEC,CAAQ,EACxCiiD,EAAK,YAAYliD,CAAS,EAAEC,CAAQ,EAAEC,CAAQ,EACtD,UAAU,QAAQ,CAACnR,EAAGtM,IAAM,CACnC,MAAM0nE,EAAmBjI,EAAK,UAAUnzD,EAAE,EAAE,EACtCg7D,EAAgBI,EAAiB,GACjCL,EAAiBK,EAAiB,YACxC,OAAOjI,EAAK,UAAU6H,CAAa,EACnC,OAAO7H,EAAK,UAAU4H,CAAc,CAClD,CAAa,EAGH,OAAO5H,EAAK,YAAYliD,CAAS,EAAEC,CAAQ,CACrD,EAEA,CAAK,EAEG2pD,GACF,KAAK,yBAAyBzV,CAAK,CAEzC,CAQE,gBAAgBA,EAAOiW,EAAe,GAAI,CACxC,MAAMlI,EAAO,KAAK,KACZp8D,EAAQo8D,EAAK,UAAU,OACvB97D,EAAM,KAAK,gBAAgBgkE,EAAa,YAAajW,CAAK,EAC1DkW,EAAavF,GAAiB3Q,EAAM,GAAI/tD,CAAG,EAC3C4Q,EAAa,KAAK,uBAAuBm9C,EAAM,GAAIiW,EAAa,UAAU,EAC1Et3C,EAAW,KAAK,qBAAqBs3C,EAAcC,EAAYlW,EAAOn9C,CAAU,EACtFkrD,EAAK,UAAUp8D,CAAK,EAAIgtB,EAExBovC,EAAK,UAAUmI,CAAU,EAAIv3C,EAC7BovC,EAAK,UAAU97D,CAAG,EAAI0sB,EACtB,KAAK,yBAAyBqhC,CAAK,CACvC,CAWE,yBAAyBA,EAAO,CAC9B,MAAMtsC,EAAKssC,EAAM,GACXmW,EAASnW,EAAM,SAAS,EACxB+N,EAAO,KAAK,KAClB,CAAC,QAAS,YAAa,iBAAiB,EAAE,QAAQliD,GAAa,CAG7D,GAAI,GAACkiD,EAAK,YAAYliD,CAAS,GAAKkiD,EAAK,YAAYliD,CAAS,EAAE6H,CAAE,GAGlE,UAAW5H,KAAYiiD,EAAK,YAAYliD,CAAS,EAAG,CAClD,GAAIC,IAAaqqD,EAEfpI,EAAK,YAAYliD,CAAS,EAAE6H,CAAE,EAAI,CAAE,MAGpC,UAEF,UAAW3H,KAAYgiD,EAAK,YAAYliD,CAAS,EAAEC,CAAQ,EAAG,CAC5D,MAAMmoD,EAAWlG,EAAK,YAAYliD,CAAS,EAAEC,CAAQ,EAAEC,CAAQ,EAC/DgiD,EAAK,YAAYliD,CAAS,EAAE6H,CAAE,EAAE3H,CAAQ,EAAIte,GAAS,CAAE,EAAEwmE,CAAQ,EACjE,MAAMF,EAAWhG,EAAK,YAAYliD,CAAS,EAAE6H,CAAE,EAAE3H,CAAQ,EAEnDqqD,EAAS,KAAK,gBAAgBnC,EAAS,YAAajU,CAAK,EAC/D+T,EAAS,YAAcqC,EACvBrC,EAAS,IAAMqC,EAEfrC,EAAS,UAAY,GAErBE,EAAS,UAAU,QAAQ,CAACr5D,EAAGtM,IAAM,CACnC,MAAM0nE,EAAmBjI,EAAK,UAAUnzD,EAAE,EAAE,EACtC+kB,EAAQixC,GAAQ/kD,EAAW6H,EAAI3H,CAAQ,EACvCsqD,EAAgB1F,GAAiBj9C,EAAIiM,CAAK,EAEhD,GAAIq2C,GAAoB,CAACjI,EAAK,UAAUsI,CAAa,EAAG,CACtD,MAAMC,EAAmB,KAAK,qBAAqBN,EAAkBK,EAAerW,CAAK,EACnF6V,EAAiBS,EAAiB,YACxCvI,EAAK,UAAUsI,CAAa,EAAIC,EAChCvI,EAAK,UAAU8H,CAAc,EAAIS,CAC/C,CACYvC,EAAS,UAAUzlE,CAAC,EAAI,KAAK,qBAAqBsM,EAAGy7D,EAAerW,CAAK,CACrF,CAAW,CACX,CACA,CACA,CAAK,CACL,CAaE,qBAAqBiW,EAAcviD,EAAIssC,EAAOn9C,EAAY,CACxD,MAAM5Q,EAAM,KAAK,gBAAgBgkE,EAAa,YAAajW,CAAK,EAC1DuW,EAAW,CACf,YAAatkE,EACb,IAAAA,EACA,GAAAyhB,CACN,EAEI,OAAIuiD,EAAa,WACfM,EAAS,SAAW,CAAE,GAEpB1zD,IACF0zD,EAAS,WAAa1zD,GAEjB+Y,GAAMq6C,EAAcM,CAAQ,CACvC,CAYE,gBAAgBC,EAASxW,EAAO,CAC9B,MAAM/tD,EAAM,IAAI,IAAIukE,CAAO,EAC3BvkE,EAAI,SAAW+tD,EAAM,iBAAiB,EAAE,KACxC,MAAMztD,EAASytD,EAAM,iBAAiB,EAAE,OAExC,UAAWpuD,KAAO,OAAO,KAAKW,CAAM,EAClCN,EAAI,aAAa,IAAIL,EAAKW,EAAOX,CAAG,CAAC,EAEvC,OAAOK,EAAI,IACf,CAUE,uBAAuByhB,EAAI+iD,EAAe,CACxC,MAAM5zD,EAAa,CAChB,aAAe6Q,CACjB,EACD,OAAC,QAAS,YAAa,iBAAiB,EAAE,QAAQ7H,GAAa,CACzD4qD,EAAc5qD,CAAS,IACzBhJ,EAAWgJ,CAAS,EAAI6H,EAEhC,CAAK,EACM7Q,CACX,CAQE,YAAY8b,EAAU,CACpB,GAAIA,EAAS,kBAAmB,CAC9B,MAAM+3C,EAAS,IAAI,IACnB,UAAWC,KAAah4C,EAAS,kBAAmB,CAClD,MAAMi4C,EAAQj4C,EAAS,kBAAkBg4C,CAAS,EAAE,WAAW,MAC3DC,GACFF,EAAO,IAAIE,EAAM,aAAa,CAExC,CACM,OAAOF,CACb,CACA,CACA,CAMA,MAAMG,GAAkB,SAAU/S,EAASv2D,EAAOgD,EAAUF,EAAU,CACpE,MAAMymE,EAAchT,EAAQ,eAAiB,cAAgBA,EAAQ,SAAWA,EAAQ,aACpF,CAACv2D,GAASupE,IACZhT,EAAQ,aAAe,KAAK,IAAK,EACjCA,EAAQ,cAAgBA,EAAQ,aAAeA,EAAQ,YACvDA,EAAQ,cAAgBgT,EAAY,YAAcA,EAAY,OACzDhT,EAAQ,YACXA,EAAQ,UAAY,KAAK,MAAMA,EAAQ,cAAgBA,EAAQ,cAAgB,EAAI,GAAI,IAGvFvzD,EAAS,UACXuzD,EAAQ,gBAAkBvzD,EAAS,SAKjChD,GAASA,EAAM,OAAS,cAC1Bu2D,EAAQ,SAAW,IAKjB,CAACv2D,GAAS,CAACu2D,EAAQ,SAAWvzD,EAAS,aAAe,KAAOA,EAAS,aAAe,KAAOA,EAAS,aAAe,IACtHhD,EAAQ,IAAI,MAAM,mCAAqCu2D,IAAYgT,GAAehT,EAAQ,cAAc,GAE1GzzD,EAAS9C,EAAOu2D,CAAO,CACzB,EASMiT,GAAsB,CAACC,EAAYnnE,IAAY,CACnD,GAAI,CAACmnE,GAAc,CAACA,EAAW,KAC7B,OAEF,IAAIC,EAAapnE,EACjB,OAAAmnE,EAAW,QAAQE,GAAmB,CACpCD,EAAaC,EAAgBD,CAAU,CAC3C,CAAG,EACMA,CACT,EAUME,GAAuB,CAACC,EAAatT,EAASv2D,EAAOgD,IAAa,CAClE,CAAC6mE,GAAe,CAACA,EAAY,MAGjCA,EAAY,QAAQC,GAAoB,CACtCA,EAAiBvT,EAASv2D,EAAOgD,CAAQ,CAC7C,CAAG,CACH,EACM+mE,GAAa,UAAY,CAC7B,MAAMzkE,EAAM,SAAS0kE,EAAY1nE,EAASQ,EAAU,CAElDR,EAAU+rB,GAAM,CACd,QAAS,IACV,EAAE/rB,CAAO,EAIV,MAAM2nE,EAAgBD,EAAY,eAAiB9M,EAAQ,IAAI,IAAI,cAG7DgN,EAAsBF,EAAY,qBAAuB9M,EAAQ,IAAI,IAAI,qBAAuB,IAAI,IACpGiN,EAAuBH,EAAY,sBAAwB9M,EAAQ,IAAI,IAAI,qBAC7E+M,GAAiB,OAAOA,GAAkB,aAC5C/M,EAAQ,IAAI,KAAK,qDAAqD,EACtEgN,EAAoB,IAAID,CAAa,GAIvC,MAAMG,EAAYlN,EAAQ,IAAI,IAAI,WAAa,GAAOA,EAAQ,IAAMA,EAAQ,IAAI,IAE1EmN,EAAuBb,GAAoBU,EAAqB5nE,CAAO,EAE7E4nE,EAAoB,OAAOD,CAAa,EAExC,MAAM1T,EAAU6T,EAAUC,GAAwB/nE,EAAS,SAAUtC,EAAOgD,EAAU,CAEpF,OAAA4mE,GAAqBO,EAAsB5T,EAASv2D,EAAOgD,CAAQ,EAC5DsmE,GAAgB/S,EAASv2D,EAAOgD,EAAUF,CAAQ,CAC/D,CAAK,EACKwnE,EAAgB/T,EAAQ,MAC9B,OAAAA,EAAQ,MAAQ,UAAY,CAC1B,OAAAA,EAAQ,QAAU,GACX+T,EAAc,MAAM/T,EAAS,SAAS,CAC9C,EACDA,EAAQ,IAAMj0D,EAAQ,IACtBi0D,EAAQ,YAAcj0D,EAAQ,YAC9Bi0D,EAAQ,YAAc,KAAK,IAAK,EACzBA,CACR,EACD,OAAAjxD,EAAI,SAAW,GACRA,CACT,EASMilE,GAAe,SAAUjyD,EAAW,CAGxC,IAAIkyD,EACJ,MAAMC,EAAiBnyD,EAAU,OACjC,OAAI,OAAOA,EAAU,QAAW,UAAY,OAAOA,EAAU,QAAW,SACtEkyD,EAAexnC,EAAS,OAAO1qB,EAAU,MAAM,EAAI0qB,EAAS,OAAO1qB,EAAU,MAAM,EAAI0qB,EAAS,OAAO,CAAC,EAExGwnC,EAAelyD,EAAU,OAASA,EAAU,OAAS,EAEhD,SAAWmyD,EAAiB,IAAMD,CAC3C,EAQME,GAAoB,SAAUl0D,EAAS,CAC3C,MAAMvS,EAAU,CAAE,EAClB,OAAIuS,EAAQ,YACVvS,EAAQ,MAAQsmE,GAAa/zD,EAAQ,SAAS,GAEzCvS,CACT,EAcM0mE,GAAY,SAAUn8C,EAAOztB,EAAG,CACpC,OAAOytB,EAAM,MAAMztB,CAAC,EAAI,IAAMytB,EAAM,IAAIztB,CAAC,CAC3C,EASM6pE,GAAkB,SAAUvkE,EAAGtF,EAAG,CACtC,MAAMyC,EAAQ6C,EAAE,SAAS,EAAE,EAC3B,MAAO,KAAK,UAAU,EAAG,EAAI7C,EAAM,MAAM,EAAIA,GAASzC,EAAI,EAAI,IAAM,GACtE,EACM8pE,GAAoB,SAAUxkE,EAAG,CACrC,OAAIA,GAAK,IAAQA,EAAI,IACZ,OAAO,aAAaA,CAAC,EAEvB,GACT,EAYMykE,GAA4B,SAAUlkE,EAAS,CACnD,MAAMmkE,EAAe,CAAE,EACvB,cAAO,KAAKnkE,CAAO,EAAE,QAAQvC,GAAO,CAClC,MAAMb,EAAQoD,EAAQvC,CAAG,EACrBuX,GAAkBpY,CAAK,EACzBunE,EAAa1mE,CAAG,EAAI,CAClB,MAAOb,EAAM,OACb,WAAYA,EAAM,WAClB,WAAYA,EAAM,UACnB,EAEDunE,EAAa1mE,CAAG,EAAIb,CAE1B,CAAG,EACMunE,CACT,EAWMC,GAAgB,SAAU/5C,EAAa,CAC3C,MAAM3Y,EAAY2Y,EAAY,WAAa,CACzC,OAAQ,IACR,OAAQ,CACT,EACD,MAAO,CAAC3Y,EAAU,OAAQA,EAAU,OAAQ2Y,EAAY,WAAW,EAAE,KAAK,GAAG,CAC/E,EAQMg6C,GAAe,SAAU5mE,EAAK,CAClC,OAAOA,EAAI,WACb,EAUM6mE,GAAUn9D,GAAQ,CACtB,MAAMgO,EAAQ,MAAM,UAAU,MAAM,KAAKhO,CAAI,EACvCN,EAAO,GACb,IAAIvJ,EAAS,GACTu9C,EACA0pB,EACJ,QAASrqB,EAAI,EAAGA,EAAI/kC,EAAM,OAAStO,EAAMqzC,IACvCW,EAAM1lC,EAAM,MAAM+kC,EAAIrzC,EAAMqzC,EAAIrzC,EAAOA,CAAI,EAAE,IAAIm9D,EAAe,EAAE,KAAK,EAAE,EACzEO,EAAQpvD,EAAM,MAAM+kC,EAAIrzC,EAAMqzC,EAAIrzC,EAAOA,CAAI,EAAE,IAAIo9D,EAAiB,EAAE,KAAK,EAAE,EAC7E3mE,GAAUu9C,EAAM,IAAM0pB,EAAQ;AAAA,EAEhC,OAAOjnE,CACT,EACMknE,GAAU,CAAC,CACf,MAAArvD,CACF,IAAMmvD,GAAQnvD,CAAK,EACbsvD,GAAan8C,GAAU,CAC3B,IAAIhrB,EAAS,GACTnD,EACJ,IAAKA,EAAI,EAAGA,EAAImuB,EAAO,OAAQnuB,IAC7BmD,GAAUymE,GAAUz7C,EAAQnuB,CAAC,EAAI,IAEnC,OAAOmD,CACT,EACA,IAAIonE,GAAqB,OAAO,OAAO,CACrC,UAAW,KACX,0BAA2BR,GAC3B,cAAeE,GACf,aAAcC,GACd,QAASC,GACT,QAASE,GACT,WAAYC,EACd,CAAC,EAKD,MAAME,GAA4B,IAiB5BC,GAA0B,CAACC,EAAYj1D,IAAY,CACvD,GAAI,CAACA,EAAQ,eAGX,OAAO,KAET,MAAMk1D,EAA6Bl1D,EAAQ,gBAAgB,2BAGrDm1D,EAFkBn1D,EAAQ,gBAAgB,4BAEPk1D,EACnCE,EAAyBH,EAAaE,EAC5C,OAAO,IAAI,KAAKn1D,EAAQ,eAAe,QAAS,EAAGo1D,EAAyB,GAAI,CAClF,EACMC,GAA+BC,GAC5BA,EAAgB,0BAA4BA,EAAgB,4BAA8BA,EAAgB,2BAU7GC,GAA4B,CAACC,EAAa56C,IAAa,CAI3D,IAAI66C,EACJ,GAAI,CACFA,EAAiB,IAAI,KAAKD,CAAW,CACtC,MAAW,CACV,OAAO,IACX,CACE,GAAI,CAAC56C,GAAY,CAACA,EAAS,UAAYA,EAAS,SAAS,SAAW,EAClE,OAAO,KAET,IAAI5a,EAAU4a,EAAS,SAAS,CAAC,EACjC,GAAI66C,EAAiB,IAAI,KAAKz1D,EAAQ,cAAc,EAElD,OAAO,KAET,QAASzV,EAAI,EAAGA,EAAIqwB,EAAS,SAAS,OAAS,EAAGrwB,IAAK,CACrDyV,EAAU4a,EAAS,SAASrwB,CAAC,EAC7B,MAAMmrE,EAAmB,IAAI,KAAK96C,EAAS,SAASrwB,EAAI,CAAC,EAAE,cAAc,EACzE,GAAIkrE,EAAiBC,EACnB,KAEN,CACE,MAAMhM,EAAc9uC,EAAS,SAASA,EAAS,SAAS,OAAS,CAAC,EAC5D+6C,EAAmBjM,EAAY,eAC/BkM,EAAsBlM,EAAY,gBAAkB2L,GAA6B3L,EAAY,eAAe,EAAIA,EAAY,SAAWA,EAAY,SAAWqL,GAC9Jc,EAAiB,IAAI,KAAKF,EAAiB,QAAS,EAAGC,EAAsB,GAAI,EACvF,OAAIH,EAAiBI,EAEZ,MAELJ,EAAiB,IAAI,KAAKE,CAAgB,IAC5C31D,EAAU0pD,GAEL,CACL,QAAA1pD,EACA,eAAgBA,EAAQ,gBAAkBA,EAAQ,gBAAgB,4BAA8B2sD,GAAS,SAAS/xC,EAAUA,EAAS,cAAgBA,EAAS,SAAS,QAAQ5a,CAAO,CAAC,EAKvL,KAAMA,EAAQ,gBAAkB,WAAa,UAC9C,EACH,EAQM81D,GAA2B,CAAC31C,EAAMvF,IAAa,CAKnD,GAAI,CAACA,GAAY,CAACA,EAAS,UAAYA,EAAS,SAAS,SAAW,EAClE,OAAO,KAET,IAAIm7C,EAAa,EACb/1D,EACJ,QAASzV,EAAI,EAAGA,EAAIqwB,EAAS,SAAS,SACpC5a,EAAU4a,EAAS,SAASrwB,CAAC,EAO7BwrE,EAAa/1D,EAAQ,gBAAkBA,EAAQ,gBAAgB,0BAA4B+1D,EAAa/1D,EAAQ,SAC5G,EAAAmgB,GAAQ41C,IATgCxrE,IAS5C,CAIF,MAAMm/D,EAAc9uC,EAAS,SAASA,EAAS,SAAS,OAAS,CAAC,EAClE,GAAI8uC,EAAY,iBAAmBA,EAAY,gBAAgB,0BAA4BvpC,EAEzF,OAAO,KAET,GAAIA,EAAO41C,EAAY,CAIrB,GAAI51C,EAAO41C,EAAarM,EAAY,SAAWqL,GAI7C,OAAO,KAET/0D,EAAU0pD,CACd,CACE,MAAO,CACL,QAAA1pD,EACA,eAAgBA,EAAQ,gBAAkBA,EAAQ,gBAAgB,4BAA8B+1D,EAAa/1D,EAAQ,SAGrH,KAAMA,EAAQ,gBAAkB,WAAa,UAC9C,CACH,EAYMg2D,GAAyB,CAACC,EAAqBT,IAAgB,CACnE,IAAIU,EACAj0D,EACJ,GAAI,CACFi0D,EAAkB,IAAI,KAAKD,CAAmB,EAC9Ch0D,EAAkB,IAAI,KAAKuzD,CAAW,CACvC,MAAW,CACd,CACE,MAAMW,EAAmBD,EAAgB,QAAS,EAElD,OADyBj0D,EAAgB,QAAS,EACvBk0D,GAAoB,GACjD,EAOMC,GAA4Bx7C,GAAY,CAC5C,GAAI,CAACA,EAAS,UAAYA,EAAS,SAAS,SAAW,EACrD,MAAO,GAET,QAASrwB,EAAI,EAAGA,EAAIqwB,EAAS,SAAS,OAAQrwB,IAE5C,GAAI,CADYqwB,EAAS,SAASrwB,CAAC,EACtB,eACX,MAAO,GAGX,MAAO,EACT,EAiBM8rE,GAAiB,CAAC,CACtB,SAAAz7C,EACA,KAAAuF,EAAO,OACP,SAAA7zB,CACF,IAAM,CACJ,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,2CAA2C,EAE7D,GAAI,CAACsuB,GAAYuF,IAAS,OACxB,OAAO7zB,EAAS,CACd,QAAS,oDACf,CAAK,EAEH,MAAMgqE,EAAiBR,GAAyB31C,EAAMvF,CAAQ,EAC9D,GAAI,CAAC07C,EACH,OAAOhqE,EAAS,CACd,QAAS,iCACf,CAAK,EAEH,GAAIgqE,EAAe,OAAS,WAC1B,OAAOhqE,EAAS,CACd,QAAS,wFACT,SAAUgqE,EAAe,cAC/B,CAAK,EAEH,MAAMC,EAAoB,CACxB,aAAcp2C,CACf,EACKq1C,EAAcR,GAAwB70C,EAAMm2C,EAAe,OAAO,EACxE,OAAId,IACFe,EAAkB,gBAAkBf,EAAY,YAAa,GAExDlpE,EAAS,KAAMiqE,CAAiB,CACzC,EAgBMC,GAAoB,CAAC,CACzB,YAAAhB,EACA,SAAA56C,EACA,WAAA67C,EAAa,EACb,OAAAC,EACA,eAAAC,EAAiB,GACjB,KAAAv3B,EACA,SAAA9yC,CACF,IAAM,CACJ,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,8CAA8C,EAEhE,GAAI,OAAOkpE,EAAgB,KAAe,CAAC56C,GAAY,CAAC87C,EACtD,OAAOpqE,EAAS,CACd,QAAS,sEACf,CAAK,EAEH,GAAI,CAACsuB,EAAS,SAAW,CAACwkB,EAAK,YAC7B,OAAO9yC,EAAS,CACd,QAAS,yDACf,CAAK,EAEH,GAAI,CAAC8pE,GAA0Bx7C,CAAQ,EACrC,OAAOtuB,EAAS,CACd,QAAS,yDAA2DsuB,EAAS,WACnF,CAAK,EAEH,MAAM07C,EAAiBf,GAA0BC,EAAa56C,CAAQ,EAEtE,GAAI,CAAC07C,EACH,OAAOhqE,EAAS,CACd,QAAS,GAAGkpE,CAAW,8BAC7B,CAAK,EAEH,MAAMx1D,EAAUs2D,EAAe,QACzBM,EAAcZ,GAAuBh2D,EAAQ,eAAgBw1D,CAAW,EAC9E,GAAIc,EAAe,OAAS,WAAY,CAEtC,GAAIG,IAAe,EACjB,OAAOnqE,EAAS,CACd,QAAS,GAAGkpE,CAAW,iCAC/B,CAAO,EAEHkB,EAAOJ,EAAe,eAAiBM,CAAW,EAClDx3B,EAAK,IAAI,SAAU,IAAM,CACvBo3B,GAAkB,CAChB,YAAAhB,EACA,SAAA56C,EACA,WAAY67C,EAAa,EACzB,OAAAC,EACA,eAAAC,EACA,KAAAv3B,EACA,SAAA9yC,CACR,CAAO,CACP,CAAK,EACD,MACD,CAID,MAAMuqE,EAAa72D,EAAQ,MAAQ42D,EAC7BE,EAAiB,IACdxqE,EAAS,KAAM8yC,EAAK,YAAW,CAAE,EAG1CA,EAAK,IAAI,SAAU03B,CAAc,EAE7BH,GACFv3B,EAAK,MAAO,EAEds3B,EAAOG,CAAU,CACnB,EAIME,GAAsB,CAAChX,EAAS9a,IAAO,CAC3C,GAAI8a,EAAQ,aAAe,EACzB,OAAO9a,EAAI,CAGf,EACM+xB,GAAmB,CAAC9oE,EAAKY,EAAKm2C,EAAIspB,IAAgB,CACtD,IAAIhpD,EAAQ,CAAE,EACV0xD,EACAC,EAAW,GACf,MAAMC,EAAwB,SAAU1tE,EAAKm+D,EAAK78D,EAAMqsE,EAAQ,CAC9D,OAAAxP,EAAI,MAAO,EACXsP,EAAW,GACJjyB,EAAGx7C,EAAKm+D,EAAK78D,EAAMqsE,CAAM,CACjC,EACKC,EAAmB,SAAU7tE,EAAOu2D,EAAS,CACjD,GAAImX,EACF,OAEF,GAAI1tE,EACF,OAAAA,EAAM,SAAW8kE,GAAiC,CAChD,YAAAC,EACA,QAAAxO,EACA,MAAAv2D,CACR,CAAO,EACM2tE,EAAsB3tE,EAAOu2D,EAAS,GAAIx6C,CAAK,EAGxD,MAAM+xD,EAAUvX,EAAQ,aAAa,UAAUx6C,GAASA,EAAM,YAAc,EAAGw6C,EAAQ,aAAa,MAAM,EAM1G,GAJAx6C,EAAQsB,GAAkBtB,EAAOmB,GAAc4wD,EAAS,EAAI,CAAC,EAC7DL,EAAYA,GAAa7uC,GAAa7iB,CAAK,EAGvCA,EAAM,OAAS,IAAM0xD,GAAa1xD,EAAM,OAAS0xD,EAAY,EAC/D,OAAOF,GAAoBhX,EAAS,IAAMoX,EAAsB3tE,EAAOu2D,EAAS,GAAIx6C,CAAK,CAAC,EAE5F,MAAMxa,EAAOigC,GAAwBzlB,CAAK,EAI1C,OAAIxa,IAAS,MAAQwa,EAAM,OAAS,IAC3BwxD,GAAoBhX,EAAS,IAAMoX,EAAsB3tE,EAAOu2D,EAAS,GAAIx6C,CAAK,CAAC,EAIxF,CAACxa,GAAQwa,EAAM,OAAS,IACnBwxD,GAAoBhX,EAAS,IAAMoX,EAAsB3tE,EAAOu2D,EAAS,GAAIx6C,CAAK,CAAC,EAErF4xD,EAAsB,KAAMpX,EAASh1D,EAAMwa,CAAK,CACxD,EAgBKw6C,EAAUjxD,EAfA,CACd,IAAAZ,EACA,WAAW6xD,EAAS,CAElBA,EAAQ,iBAAiB,oCAAoC,EAC7DA,EAAQ,iBAAiB,WAAY,SAAU,CAC7C,MAAA/5C,EACA,OAAAuxD,CACR,EAAS,CACD,OAAOzE,GAAgB/S,EAAS,KAAM,CACpC,WAAYA,EAAQ,MACrB,EAAEsX,CAAgB,CAC3B,CAAO,CACP,CACG,EAC4B,SAAU7tE,EAAOgD,EAAU,CACtD,OAAOsmE,GAAgB/S,EAASv2D,EAAOgD,EAAU6qE,CAAgB,CACrE,CAAG,EACD,OAAOtX,CACT,EACM,CACJ,YAAAyX,EACF,EAAI9Q,EACE+Q,GAAwB,SAAUxmE,EAAGwF,EAAG,CAU5C,GATI,CAACq5D,GAAoB7+D,EAAGwF,CAAC,GASzBxF,EAAE,MAAQwF,EAAE,OAASxF,EAAE,KAAK,SAAWwF,EAAE,KAAK,QAAUxF,EAAE,KAAK,SAAWwF,EAAE,KAAK,QACnF,MAAO,GAMT,GALW,CAACxF,EAAE,MAAQwF,EAAE,MAAQxF,EAAE,MAAQ,CAACwF,EAAE,MAKzCxF,EAAE,UAAY,CAACwF,EAAE,UAAY,CAACxF,EAAE,UAAYwF,EAAE,SAChD,MAAO,GAGT,GAAI,CAACxF,EAAE,UAAY,CAACwF,EAAE,SACpB,MAAO,GAGT,QAASlM,EAAI,EAAGA,EAAI0G,EAAE,SAAS,OAAQ1G,IAAK,CAC1C,MAAMmtE,EAAWzmE,EAAE,SAAS1G,CAAC,EACvBotE,EAAWlhE,EAAE,SAASlM,CAAC,EAE7B,GAAImtE,EAAS,MAAQC,EAAS,IAC5B,MAAO,GAGT,GAAI,CAACD,EAAS,WAAa,CAACC,EAAS,UACnC,SAEF,MAAMC,EAAaF,EAAS,UACtBG,EAAaF,EAAS,UAM5B,GAJIC,GAAc,CAACC,GAAc,CAACD,GAAcC,GAI5CD,EAAW,SAAWC,EAAW,QAAUD,EAAW,SAAWC,EAAW,OAC9E,MAAO,EAEV,CAED,MAAO,EACT,EAQMC,GAAc,CAAC/sE,EAAM6wB,EAAOC,EAAOjB,IAAa,CAEpD,MAAMu3C,EAAav3C,EAAS,WAAW,MAAQiB,EAC/C,MAAO,mBAAmB9wB,CAAI,IAAI6wB,CAAK,IAAIu2C,CAAU,EACvD,EAkBM4F,GAAe,CAAC,CACpB,QAAAC,EACA,OAAAC,EACA,aAAA1+C,EACA,YAAA2D,EACA,iBAAAsC,CACF,IAAM,CACJ,MAAMjf,EAAWoT,GAAMqkD,EAAS,CAC9B,YAAaC,EACb,aAAA1+C,EACA,YAAA2D,EACA,iBAAAsC,CACJ,CAAG,EACD,OAAAiuC,GAAoBltD,EAAU03D,EAAQH,EAAW,EAC1Cv3D,CACT,EAUM23D,GAA4B,CAAC5I,EAAQ6I,IAAY,CACrDtwD,GAAkBynD,EAAQ,CAAC3zC,EAAY5wB,EAAM6wB,EAAOC,IAAU,CACtDA,KAASs8C,EAAQ,YAAYptE,CAAI,EAAE6wB,CAAK,GAC5C,OAAO0zC,EAAO,YAAYvkE,CAAI,EAAE6wB,CAAK,EAAEC,CAAK,CAElD,CAAG,CACH,EAcMu8C,GAAa,CAACC,EAASF,EAASj7C,IAAgB,CACpD,IAAIo7C,EAAY,GACZhJ,EAASz3C,GAAMwgD,EAAS,CAE1B,SAAUF,EAAQ,SAClB,oBAAqBA,EAAQ,oBAC7B,eAAgBA,EAAQ,cAC5B,CAAG,EAED,QAAS5tE,EAAI,EAAGA,EAAI4tE,EAAQ,UAAU,OAAQ5tE,IAAK,CACjD,MAAMqwB,EAAWu9C,EAAQ,UAAU5tE,CAAC,EACpC,GAAIqwB,EAAS,KAAM,CACjB,MAAMuC,EAAUT,GAAgB9B,EAAS,IAAI,EAEzCsC,GAAeA,EAAYC,CAAO,GAAKD,EAAYC,CAAO,EAAE,MAC9DF,GAA0BrC,EAAUsC,EAAYC,CAAO,EAAE,KAAMvC,EAAS,KAAK,WAAW,CAEhG,CACI,MAAM29C,EAAiBxI,GAAaT,EAAQ10C,EAAU68C,EAAqB,EACvEc,IACFjJ,EAASiJ,EACTD,EAAY,GAEf,CAuBD,OArBAzwD,GAAkBswD,EAAS,CAACx8C,EAAY5wB,EAAM6wB,EAAOC,IAAU,CAC7D,GAAIF,EAAW,WAAaA,EAAW,UAAU,OAAQ,CACvD,MAAMhM,EAAKgM,EAAW,UAAU,CAAC,EAAE,GAC7B48C,EAAiBxI,GAAaT,EAAQ3zC,EAAW,UAAU,CAAC,EAAG87C,EAAqB,EACtFc,IACFjJ,EAASiJ,EAEH18C,KAASyzC,EAAO,YAAYvkE,CAAI,EAAE6wB,CAAK,IAC3C0zC,EAAO,YAAYvkE,CAAI,EAAE6wB,CAAK,EAAEC,CAAK,EAAIF,GAG3C2zC,EAAO,YAAYvkE,CAAI,EAAE6wB,CAAK,EAAEC,CAAK,EAAE,UAAU,CAAC,EAAIyzC,EAAO,UAAU3/C,CAAE,EACzE2oD,EAAY,GAEpB,CACA,CAAG,EAEDJ,GAA0B5I,EAAQ6I,CAAO,EACrCA,EAAQ,sBAAwBE,EAAQ,sBAC1CC,EAAY,IAEVA,EACK,KAEFhJ,CACT,EAKMkJ,GAAiB,CAACvnE,EAAGwF,KACE,CAACxF,EAAE,KAAO,CAACwF,EAAE,KACJ,GAAQxF,EAAE,KAAOwF,EAAE,KAAOxF,EAAE,IAAI,UAAU,SAAWwF,EAAE,IAAI,UAAU,QAAUxF,EAAE,IAAI,UAAU,SAAWwF,EAAE,IAAI,UAAU,UACtIxF,EAAE,MAAQwF,EAAE,KAAOxF,EAAE,UAAU,SAAWwF,EAAE,UAAU,QAAUxF,EAAE,UAAU,SAAWwF,EAAE,UAAU,OAGvHgiE,GAAmB,CAACj9C,EAAWk9C,IAAmB,CACtD,MAAMC,EAAiB,CAAE,EACzB,UAAWhpD,KAAM6L,EAAW,CAE1B,MAAMo9C,EADWp9C,EAAU7L,CAAE,EACI,KACjC,GAAIipD,EAAiB,CACnB,MAAM/qE,EAAM6uB,GAAgBk8C,CAAe,EAC3C,GAAI,CAACF,EAAe7qE,CAAG,EACrB,MAEF,MAAMgrE,EAAgBH,EAAe7qE,CAAG,EAAE,SACtC2qE,GAAeK,EAAeD,CAAe,IAC/CD,EAAe9qE,CAAG,EAAI6qE,EAAe7qE,CAAG,EAEhD,CACA,CACE,OAAO8qE,CACT,EAUMG,GAA4B,CAAC9O,EAAM0O,IAAmB,CAE1D,IAAIK,EADcN,GAAiBzO,EAAK,UAAW0O,CAAc,EAEjE,OAAA7wD,GAAkBmiD,EAAM,CAACruC,EAAY7T,EAAWC,EAAUC,IAAa,CACrE,GAAI2T,EAAW,WAAaA,EAAW,UAAU,OAAQ,CACvD,MAAMH,EAAYG,EAAW,UAC7Bo9C,EAAiBlhD,GAAMkhD,EAAgBN,GAAiBj9C,EAAWk9C,CAAc,CAAC,CACxF,CACA,CAAG,EACMK,CACT,EACA,MAAMC,WAA2BxB,EAAY,CAI3C,YAAYyB,EAAkBpI,EAAK/kE,EAAU,CAAA,EAAIotE,EAAoB,CACnE,MAAO,EACP,KAAK,oBAAsBA,GAAsB,KAC5CA,IACH,KAAK,QAAU,IAEjB,KAAM,CACJ,gBAAAx2B,EAAkB,EACxB,EAAQ52C,EAIJ,GAHA,KAAK,KAAO+kE,EACZ,KAAK,gBAAkBnuB,EACvB,KAAK,uBAAyB52C,EAAQ,uBAClC,CAACmtE,EACH,MAAM,IAAI,MAAM,gDAAgD,EAGlE,KAAK,GAAG,sBAAuB,IAAM,CACnC,KAAK,YAAa,CACxB,CAAK,EAED,KAAK,GAAG,qBAAsB,IAAM,CAClC,KAAK,cAAc,KAAK,MAAK,EAAG,EAAE,CACxC,CAAK,EACD,KAAK,MAAQ,eACb,KAAK,iBAAmB,CAAE,EAC1B,KAAK,QAAUpR,GAAO,oBAAoB,EAGtC,KAAK,SACP,KAAK,oBAAoB,OAASoR,EAGlC,KAAK,oBAAoB,aAAe,CAAE,GAE1C,KAAK,eAAiBA,CAE5B,CACE,gBAAgBxvE,EAAKs2D,EAASkR,EAAe,CAE3C,GAAI,CAAC,KAAK,QACR,MAAO,GAIT,GADA,KAAK,QAAU,KACXxnE,EAGF,YAAK,MAAQ,OAAOA,GAAQ,UAAY,EAAEA,aAAe,OAASA,EAAM,CACtE,OAAQs2D,EAAQ,OAChB,QAAS,8BAAgCA,EAAQ,IACjD,SAAUA,EAAQ,SAElB,KAAM,EACN,SAAUt2D,EAAI,QACf,EACGwnE,IACF,KAAK,MAAQA,GAEf,KAAK,QAAQ,OAAO,EACb,EAEb,CAME,iBAAiBr2C,EAAUq2C,EAAehsB,EAAI,CAC5C,MAAM9nB,EAAUvC,EAAS,MAAQ8B,GAAgB9B,EAAS,IAAI,EAE9D,GAAI,CAACA,EAAS,MAAQ,CAACuC,GAAW,KAAK,oBAAoB,aAAaA,CAAO,EAAG,CAEhF,KAAK,cAAgBqP,EAAS,WAAW,IAAMyY,EAAG,EAAK,EAAG,CAAC,EAC3D,MACD,CAED,MAAM/2C,EAAMy5D,GAAwB/sC,EAAS,KAAK,WAAW,EACvDu+C,EAAM,CAAC1vE,EAAKs2D,IAAY,CAC5B,GAAI,KAAK,gBAAgBt2D,EAAKs2D,EAASkR,CAAa,EAClD,OAEF,MAAM/zC,EAAc,KAAK,oBAAoB,aACvC,CACJ,YAAAqxC,CACR,EAAUxO,EACJ,IAAIllC,EACJ,GAAI,CACFA,EAAOgN,GAAUviB,EAAQy6C,EAAQ,QAAQ,EAAE,SAAS,CAAC,CAAC,CACvD,OAAQlwD,EAAG,CACVA,EAAE,SAAWy+D,GAAiC,CAC5C,YAAAC,EACA,QAAAxO,EACA,aAAc,EACxB,CAAS,EAED,KAAK,gBAAgBlwD,EAAGkwD,EAASkR,CAAa,EAC9C,MACR,CACM,OAAA/zC,EAAYC,CAAO,EAAI,CACrB,SAAUvC,EAAS,KACnB,KAAAC,CACD,EACDoC,GAA0BrC,EAAUC,EAAMD,EAAS,KAAK,WAAW,EAC5DqqB,EAAG,EAAI,CACf,EACKm0B,EAAe,YACrB,KAAK,QAAUpC,GAAiB9oE,EAAK,KAAK,KAAK,IAAK,CAACzE,EAAKs2D,EAASjqD,EAAWyP,IAAU,CACtF,GAAI9b,EACF,OAAO0vE,EAAI1vE,EAAKs2D,CAAO,EAEzB,GAAI,CAACjqD,GAAaA,IAAc,MAAO,CACrC,MAAMujE,EAAgBvjE,GAAa,UACnC,OAAOqjE,EAAI,CACT,OAAQpZ,EAAQ,OAChB,QAAS,eAAesZ,CAAa,4CAA4CnrE,CAAG,GAGpF,SAAU,GACV,SAAA0sB,EACA,SAAU,GACV,0BAA2B,IAE3B,KAAM,CACP,EAAEmlC,CAAO,CACX,CAED,KAAM,CACJ,OAAA34C,EACA,OAAAxJ,CACR,EAAUgd,EAAS,KAAK,UAClB,GAAIrV,EAAM,QAAU3H,EAASwJ,EAC3B,OAAO+xD,EAAI1vE,EAAK,CACd,SAAU8b,EAAM,SAAS6B,EAAQA,EAASxJ,CAAM,EAChD,OAAQmiD,EAAQ,OAChB,IAAKA,EAAQ,GACvB,CAAS,EAGH,KAAK,QAAU,KAAK,KAAK,IAAI,CAC3B,IAAA7xD,EACA,aAAc,cACd,YAAa,YACb,QAASgmE,GAAkB,CACzB,UAAWt5C,EAAS,KAAK,SAC1B,CAAA,CACF,EAAEu+C,CAAG,CACP,EAAEC,CAAY,CACnB,CACE,SAAU,CACR,KAAK,QAAQ,SAAS,EACtB,KAAK,YAAa,EAClB,KAAK,iBAAmB,CAAE,EAC1B5sC,EAAS,aAAa,KAAK,2BAA2B,EACtDA,EAAS,aAAa,KAAK,aAAa,EACxCA,EAAS,aAAa,KAAK,kBAAkB,EAC7C,KAAK,mBAAqB,KAC1B,KAAK,cAAgB,KACrB,KAAK,4BAA8B,KAC/B,KAAK,oBAAoB,oBAC3B,KAAK,IAAI,iBAAkB,KAAK,oBAAoB,iBAAiB,EACrE,KAAK,oBAAoB,kBAAoB,MAE/C,KAAK,IAAK,CACd,CACE,mBAAoB,CAClB,OAAO,KAAK,SAAW,KAAK,aAChC,CACE,aAAc,CACZ,GAAI,KAAK,QAAS,CAChB,MAAM6kC,EAAa,KAAK,QACxB,KAAK,QAAU,KACfA,EAAW,mBAAqB,KAChCA,EAAW,MAAO,CACxB,CACA,CACE,MAAMz2C,EAAU,CAEd,GAAI,CAACA,EACH,OAAO,KAAK,OAGd,GAAI,KAAK,QAAU,eACjB,MAAM,IAAI,MAAM,qCAAuC,KAAK,KAAK,EAEnE,MAAMq2C,EAAgB,KAAK,MAE3B,GAAI,OAAOr2C,GAAa,SAAU,CAChC,GAAI,CAAC,KAAK,oBAAoB,KAAK,UAAUA,CAAQ,EACnD,MAAM,IAAI,MAAM,yBAA2BA,CAAQ,EAErDA,EAAW,KAAK,oBAAoB,KAAK,UAAUA,CAAQ,CACjE,CACI,MAAM42C,EAAc,CAAC,KAAK,QAAU52C,EAAS,KAAO,KAAK,OAAO,GAEhE,GAAI42C,GAAe,KAAK,iBAAiB52C,EAAS,EAAE,GAAK,KAAK,iBAAiBA,EAAS,EAAE,EAAE,QAAS,CACnG,KAAK,MAAQ,gBACb,KAAK,OAASA,EAEV42C,IACF,KAAK,QAAQ,eAAe,EAC5B,KAAK,QAAQ,aAAa,GAE5B,MACD,CAEIA,IAID,KAAK,QACP,KAAK,QAAQ,eAAe,EAE9B,KAAK,iBAAiB52C,EAAUq2C,EAAeqI,GAAe,CAE5D,KAAK,aAAa,CAChB,cAAArI,EACA,SAAAr2C,CACR,CAAO,CACP,CAAK,EACL,CACE,aAAa,CACX,cAAAq2C,EACA,SAAAr2C,CACJ,EAAK,CACD,KAAK,MAAQ,gBACb,KAAK,iBAAiBA,EAAS,EAAE,EAAIA,EACrC,KAAK,cAAgB,KAErB,KAAK,cAAcA,EAAS,EAAE,EAG1Bq2C,IAAkB,qBACpB,KAAK,QAAQ,gBAAgB,EAG7B,KAAK,QAAQ,aAAa,CAEhC,CACE,OAAQ,CACF,KAAK,oBAAoB,oBAC3B,KAAK,IAAI,iBAAkB,KAAK,oBAAoB,iBAAiB,EACrE,KAAK,oBAAoB,kBAAoB,MAE/C,KAAK,YAAa,EAClBzkC,EAAS,aAAa,KAAK,kBAAkB,EAC7C,KAAK,mBAAqB,KACtB,KAAK,UACPA,EAAS,aAAa,KAAK,oBAAoB,2BAA2B,EAC1E,KAAK,oBAAoB,4BAA8B,MAErD,KAAK,QAAU,iBAGjB,KAAK,QAAU,GAErB,CACE,KAAK+sC,EAAkB,CACrB/sC,EAAS,aAAa,KAAK,kBAAkB,EAC7C,KAAK,mBAAqB,KAC1B,MAAMlM,EAAQ,KAAK,MAAO,EAC1B,GAAIi5C,EAAkB,CACpB,MAAMhI,EAAQjxC,EAAQA,EAAM,eAAiB,EAAI,IAAO,IACxD,KAAK,mBAAqBkM,EAAS,WAAW,IAAM,KAAK,KAAM,EAAE+kC,CAAK,EACtE,MACD,CAGD,GAAI,CAAC,KAAK,QAAS,CACjB,KAAK,MAAO,EACZ,MACN,CACQjxC,GAAS,CAACA,EAAM,SAId,KAAK,SAAW,CAAC,KAAK,8BAExB,KAAK,QAAQ,qBAAqB,EAElC,KAAK,kCAAmC,GAE1C,KAAK,QAAQ,oBAAoB,GAEjC,KAAK,QAAQ,gBAAgB,CAEnC,CACE,OAAQ,CAIN,GAHA,KAAK,QAAU,GAGX,CAAC,KAAK,QAAS,CACjB,KAAK,cAAgBkM,EAAS,WAAW,IAAM,KAAK,UAAW,EAAE,CAAC,EAClE,MACN,CACI,KAAK,aAAa,CAACo7B,EAAK4R,IAAgB,CACtC,KAAK,UAAW,EACZ,CAAC,KAAK,kBAAmB,GAAI,CAAC,KAAK,QACrC,KAAK,MAAM,KAAK,oBAAoB,KAAK,UAAU,CAAC,CAAC,CAE7D,CAAK,CACL,CACE,aAAav0B,EAAI,CACf,MAAMmsB,EAAW,CACf,aAAc,CACZ,IAAK,KAAK,oBAAoB,MACtC,CACK,EACD,KAAK,QAAQ,CACX,KAAM,uBACN,SAAAA,CACN,CAAK,EACD,KAAK,QAAU,KAAK,KAAK,IAAI,CAC3B,IAAK,KAAK,oBAAoB,OAC9B,gBAAiB,KAAK,gBACtB,YAAa,eACnB,EAAO,CAAC5nE,EAAOo+D,IAAQ,CACjB,GAAIp+D,EAAO,CACT,KAAM,CACJ,YAAA+kE,CACV,EAAY3G,EACJp+D,EAAM,SAAW8kE,GAAiC,CAChD,YAAAC,EACA,QAAS3G,EACT,MAAAp+D,CACV,CAAS,CACT,CACM,GAAI,KAAK,gBAAgBA,EAAOo+D,CAAG,EAAG,CAChC,KAAK,QAAU,iBACjB,KAAK,QAAU,IAEjB,MACR,CACM,KAAK,QAAQ,CACX,KAAM,0BACN,SAAAwJ,CACR,CAAO,EACD,MAAMoI,EAAc5R,EAAI,eAAiB,KAAK,oBAAoB,SAQlE,GAPA,KAAK,oBAAoB,SAAWA,EAAI,aACpCA,EAAI,iBAAmBA,EAAI,gBAAgB,KAC7C,KAAK,YAAc,KAAK,MAAMA,EAAI,gBAAgB,IAAI,EAEtD,KAAK,YAAc,KAAK,IAAK,EAE/B,KAAK,oBAAoB,OAASD,GAAwB,KAAK,oBAAoB,OAAQC,CAAG,EAC1F4R,EAAa,CACf,KAAK,YAAa,EAClB,KAAK,uBAAuB,IACnBv0B,EAAG2iB,EAAK4R,CAAW,CAC3B,EACD,MACR,CACM,OAAOv0B,EAAG2iB,EAAK4R,CAAW,CAChC,CAAK,CACL,CASE,uBAAuBC,EAAM,CAC3B,MAAMC,EAAYnyC,GAAe,KAAK,oBAAoB,QAAQ,EAGlE,GAAImyC,IAAc,KAChB,YAAK,oBAAoB,cAAgB,KAAK,YAAc,KAAK,IAAK,EAC/DD,EAAM,EAEf,GAAIC,EAAU,SAAW,SACvB,YAAK,oBAAoB,cAAgBA,EAAU,MAAQ,KAAK,IAAK,EAC9DD,EAAM,EAEf,KAAK,QAAU,KAAK,KAAK,IAAI,CAC3B,IAAKv8D,GAAW,KAAK,oBAAoB,OAAQw8D,EAAU,KAAK,EAChE,OAAQA,EAAU,OAClB,gBAAiB,KAAK,gBACtB,YAAa,iBACnB,EAAO,CAAClwE,EAAOo+D,IAAQ,CAEjB,GAAI,CAAC,KAAK,QACR,OAEF,GAAIp+D,EAAO,CACT,KAAM,CACJ,YAAA+kE,CACV,EAAY3G,EACJ,YAAK,MAAM,SAAW0G,GAAiC,CACrD,YAAAC,EACA,QAAS3G,EACT,MAAAp+D,CACV,CAAS,EAGD,KAAK,oBAAoB,cAAgB,KAAK,YAAc,KAAK,IAAK,EAC/DiwE,EAAM,CACrB,CACM,IAAIE,EACAD,EAAU,SAAW,OACnB,CAAC9R,EAAI,iBAAmB,CAACA,EAAI,gBAAgB,KAG/C+R,EAAa,KAAK,YAElBA,EAAa,KAAK,MAAM/R,EAAI,gBAAgB,IAAI,EAGlD+R,EAAa,KAAK,MAAM/R,EAAI,YAAY,EAE1C,KAAK,oBAAoB,cAAgB+R,EAAa,KAAK,IAAK,EAChEF,EAAM,CACZ,CAAK,CACL,CACE,WAAY,CACV,KAAK,MAAQ,qBACT,KAAK,QAIP,KAAK,QAAQ,gBAAgB,EACnB,KAAK,QAGf,KAAK,MAAM,KAAK,cAAc,CAEpC,CACE,aAAc,CAEZ,KAAK,cAAgB,KACrB,MAAMpB,EAAU,KAAK,oBAAoB,KACnCjH,EAAW,CACf,aAAc,CACZ,IAAK,KAAK,oBAAoB,MACtC,CACK,EACD,KAAK,QAAQ,CACX,KAAM,qBACN,SAAAA,CACN,CAAK,EACD,IAAI+G,EACJ,GAAI,CACFA,EAAUJ,GAAa,CACrB,QAAS,KAAK,oBAAoB,SAClC,OAAQ,KAAK,oBAAoB,OACjC,aAAc,KAAK,oBAAoB,cACvC,YAAa,KAAK,oBAAoB,aACtC,iBAAkBM,CAC1B,CAAO,CACF,OAAQ7uE,EAAO,CACd,KAAK,MAAQA,EACb,KAAK,MAAM,SAAW,CACpB,UAAWk9D,EAAQ,MAAM,iCACzB,MAAAl9D,CACD,EACD,KAAK,QAAQ,OAAO,CACrB,CAEG6uE,IACFF,EAAUC,GAAWC,EAASF,EAAS,KAAK,oBAAoB,YAAY,GAG9E,KAAK,oBAAoB,KAAOA,GAAoBE,EACpD,MAAMuB,EAAW,KAAK,oBAAoB,KAAK,WAAa,KAAK,oBAAoB,KAAK,UAAU,CAAC,EAQrG,GAPIA,GAAYA,IAAa,KAAK,oBAAoB,SACpD,KAAK,oBAAoB,OAASA,IAEhC,CAACvB,GAAWF,GAAWA,EAAQ,sBAAwBE,EAAQ,sBACjE,KAAK,kCAAmC,EAE1C,KAAK,+BAA+BF,CAAO,EACvCA,EAAS,CACX,KAAM,CACJ,SAAAl/C,EACA,QAAA4gD,CACR,EAAU1B,EACE1H,EAAa,CAAE,EACrB0H,EAAQ,UAAU,QAAQv9C,GAAY,CACpC61C,EAAW,KAAK,CACd,GAAI71C,EAAS,GACb,UAAWA,EAAS,WAAW,UAC/B,WAAYA,EAAS,WAAW,WAChC,OAAQA,EAAS,WAAW,MACtC,CAAS,CACT,CAAO,EACD,MAAMk/C,EAAiB,CACrB,SAAA7gD,EACA,OAAQ,CAAC4gD,EACT,WAAApJ,CACD,EACDW,EAAS,eAAiB0I,EAC1B,KAAK,QAAQ,CACX,KAAM,wBACN,SAAA1I,CACR,CAAO,CACP,CACI,MAAO,EAAQ+G,CACnB,CACE,mCAAoC,CAClC,MAAM4B,EAAM,KAAK,oBAGbA,EAAI,oBACNA,EAAI,IAAI,iBAAkBA,EAAI,iBAAiB,EAC/CA,EAAI,kBAAoB,MAGtBA,EAAI,8BACNvtC,EAAS,aAAautC,EAAI,2BAA2B,EACrDA,EAAI,4BAA8B,MAEpC,IAAIC,EAAMD,EAAI,MAAQA,EAAI,KAAK,oBAgB/B,GAXIC,IAAQ,IACND,EAAI,QACNC,EAAMD,EAAI,MAAO,EAAC,eAAiB,KAEnCA,EAAI,kBAAoBA,EAAI,kCAC5BA,EAAI,IAAI,iBAAkBA,EAAI,iBAAiB,IAM/C,OAAOC,GAAQ,UAAYA,GAAO,EAAG,CACnCA,EAAM,GACR,KAAK,QAAQ,wCAAwCA,CAAG,yBAAyB,EAEnF,MACN,CACI,KAAK,kBAAkBA,CAAG,CAC9B,CACE,kBAAkBA,EAAK,CACrB,MAAMD,EAAM,KAAK,oBACjBA,EAAI,4BAA8BvtC,EAAS,WAAW,IAAM,CAC1DutC,EAAI,4BAA8B,KAClCA,EAAI,QAAQ,qBAAqB,EACjCA,EAAI,kBAAkBC,CAAG,CAC1B,EAAEA,CAAG,CACV,CAKE,aAAc,CACZ,KAAK,aAAa,CAACpS,EAAK4R,IAAgB,CACjCA,IAGD,KAAK,SACP,KAAK,OAAS,KAAK,oBAAoB,KAAK,UAAU,KAAK,OAAO,EAAE,GAGtE,KAAK,oBAAoB,aAAeV,GAA0B,KAAK,oBAAoB,KAAM,KAAK,oBAAoB,YAAY,EACtI,KAAK,iBAAiB,KAAK,MAAO,EAAE,KAAK,MAAOQ,GAAe,CAE7D,KAAK,cAAc,KAAK,MAAK,EAAG,EAAE,CAC1C,CAAO,EACP,CAAK,CACL,CAOE,cAAcW,EAAS,CACrB,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,oCAAoC,EAOlD,KAAK,QAAU,KAAK,SACtB,KAAK,YAAa,EAEpB,MAAMz+C,EAAY,KAAK,oBAAoB,KAAK,UAC1C0+C,EAAe,CAAC,KAAK,QAAU,KAAK,SAAW1+C,EAAUy+C,CAAO,EAMtE,GALIC,EACF,KAAK,OAAS1+C,EAAUy+C,CAAO,EAE/B,KAAK,QAAQ,mBAAmB,EAE9B,CAAC,KAAK,mBAAoB,CAC5B,MAAME,EAA2B,IAAM,CACjC,KAAK,MAAO,EAAC,UAGjB,KAAK,mBAAqB3tC,EAAS,WAAW,IAAM,CAClD,KAAK,QAAQ,oBAAoB,EACjC2tC,EAA0B,CACpC,EAAW/J,GAAa,KAAK,MAAO,EAAE,EAAQ8J,CAAa,CAAC,EACrD,EACDC,EAA0B,CAChC,CACI,KAAK,QAAQ,gBAAgB,CACjC,CAOE,+BAA+BhC,EAAS,CAEtC,GAAIA,GAAW,KAAK,oBAAoB,KAAK,YAAa,CAExD,MAAMiC,EAAgB,KAAK,oBAAoB,KAAK,YAAY,IAAIC,IAC3D,CACL,QAASA,EAAgB,MACzB,OAAQ,CAAC,CACP,KAAMA,EAAgB,WACvB,CAAA,CACF,EACF,EACD,KAAK,uBAAuB,cAAeD,EAAe,KAAK,oBAAoB,KAAK,QAAQ,CACtG,CACA,CAQE,YAAYx/C,EAAU,CACpB,GAAIA,EAAS,kBAAmB,CAC9B,MAAM+3C,EAAS,IAAI,IACnB,UAAWC,KAAah4C,EAAS,kBAAmB,CAClD,MAAM0/C,EAAa1/C,EAAS,kBAAkBg4C,CAAS,EAAE,WAAW,kBAAkB,EAClF0H,GAEF3H,EAAO,IAAI2H,EAAW,QAAQ,KAAM,EAAE,EAAE,aAAa,CAE/D,CACM,OAAO3H,CACb,CACA,CACA,CACA,IAAI4H,GAAS,CACX,mBAAoB,GACpB,uBAAwB,GACxB,mBAAoB,GACpB,wBAAyB,EAEzB,kBAAmB,QAGnB,mBAAoB,IAEpB,sBAAuB,EACvB,0BAA2B,GAE3B,uCAAwC,GACxC,2BAA4B,EAE5B,uBAAwB,EAC1B,EACA,MAAMC,GAAsBvwE,GAAU,CACpC,MAAM2c,EAAO,IAAI,WAAW,IAAI,YAAY3c,EAAO,MAAM,CAAC,EAC1D,QAASM,EAAI,EAAGA,EAAIN,EAAO,OAAQM,IACjCqc,EAAKrc,CAAC,EAAIN,EAAO,WAAWM,CAAC,EAE/B,OAAOqc,EAAK,MACd,EAIM6zD,GAAwB,SAAUC,EAAW,CAEjD,OAAAA,EAAU,GAAKA,EAAU,iBACzBA,EAAU,IAAMA,EAAU,oBACnBA,CACT,EACMC,GAAkB,SAAUv6D,EAAK,CACrC,GAAI,CACF,OAAO,IAAI,gBAAgB,IAAI,KAAK,CAACA,CAAG,EAAG,CACzC,KAAM,wBACZ,CAAK,CAAC,CACH,MAAW,CACV,MAAMw6D,EAAO,IAAI,YACjB,OAAAA,EAAK,OAAOx6D,CAAG,EACR,IAAI,gBAAgBw6D,EAAK,QAAO,CAAE,CAC7C,CACA,EACMC,GAAU,SAAU/vD,EAAM,CAC9B,OAAO,UAAY,CACjB,MAAMgwD,EAAYH,GAAgB7vD,CAAI,EAChCiwD,EAASN,GAAsB,IAAI,OAAOK,CAAS,CAAC,EAC1DC,EAAO,OAASD,EAChB,MAAME,EAAYD,EAAO,UACzB,OAAAA,EAAO,GAAKA,EAAO,iBACnBA,EAAO,IAAMA,EAAO,oBACpBA,EAAO,UAAY,UAAY,CAC7B,WAAI,gBAAgBD,CAAS,EACtBE,EAAU,KAAK,IAAI,CAC3B,EACMD,CACR,CACH,EACMvoC,GAAY,SAAU1nB,EAAM,CAChC,MAAO,+BAA+B2vD,GAAsB,SAAU,CAAA;AAAA;AAAA,EAA2C3vD,CACnH,EACMmwD,GAAkB,SAAUjxE,EAAI,CACpC,OAAOA,EAAG,SAAU,EAAC,QAAQ,gBAAiB,EAAE,EAAE,MAAM,EAAG,EAAE,CAC/D,EAGMkxE,GAAe1oC,GAAUyoC,GAAgB,UAAY,CACzD,IAAIE,EAAiB,OAAO,WAAe,IAAc,WAAa,OAAO,OAAW,IAAc,OAAS,OAAO,OAAW,IAAc,OAAS,OAAO,KAAS,IAAc,KAAO,CAAE,EAW3LC,EAAW,UAAY,CACzB,KAAK,KAAO,UAAY,CACtB,IAAIvf,EAAY,CAAE,EAQlB,KAAK,GAAK,SAAU9wD,EAAM2S,EAAU,CAC7Bm+C,EAAU9wD,CAAI,IACjB8wD,EAAU9wD,CAAI,EAAI,CAAE,GAEtB8wD,EAAU9wD,CAAI,EAAI8wD,EAAU9wD,CAAI,EAAE,OAAO2S,CAAQ,CAClD,EAQD,KAAK,IAAM,SAAU3S,EAAM2S,EAAU,CACnC,IAAI9P,EACJ,OAAKiuD,EAAU9wD,CAAI,GAGnB6C,EAAQiuD,EAAU9wD,CAAI,EAAE,QAAQ2S,CAAQ,EACxCm+C,EAAU9wD,CAAI,EAAI8wD,EAAU9wD,CAAI,EAAE,MAAO,EACzC8wD,EAAU9wD,CAAI,EAAE,OAAO6C,EAAO,CAAC,EACxBA,EAAQ,IALN,EAMV,EAOD,KAAK,QAAU,SAAU7C,EAAM,CAC7B,IAAI4S,EAAWpT,EAAGqT,EAAQC,EAE1B,GADAF,EAAYk+C,EAAU9wD,CAAI,EACtB,EAAC4S,EAOL,GAAI,UAAU,SAAW,EAEvB,IADAC,EAASD,EAAU,OACdpT,EAAI,EAAGA,EAAIqT,EAAQ,EAAErT,EACxBoT,EAAUpT,CAAC,EAAE,KAAK,KAAM,UAAU,CAAC,CAAC,MAEjC,CAGL,IAFAsT,EAAO,CAAE,EACTtT,EAAI,UAAU,OACTA,EAAI,EAAGA,EAAI,UAAU,OAAQ,EAAEA,EAClCsT,EAAK,KAAK,UAAUtT,CAAC,CAAC,EAGxB,IADAqT,EAASD,EAAU,OACdpT,EAAI,EAAGA,EAAIqT,EAAQ,EAAErT,EACxBoT,EAAUpT,CAAC,EAAE,MAAM,KAAMsT,CAAI,CAEzC,CACO,EAKD,KAAK,QAAU,UAAY,CACzBg+C,EAAY,CAAE,CACf,CACF,CACF,EAWDuf,EAAS,UAAU,KAAO,SAAUp9D,EAAa,CAC/C,YAAK,GAAG,OAAQ,SAAUzG,EAAM,CAC9ByG,EAAY,KAAKzG,CAAI,CAC3B,CAAK,EACD,KAAK,GAAG,OAAQ,SAAU8jE,EAAa,CACrCr9D,EAAY,MAAMq9D,CAAW,CACnC,CAAK,EACD,KAAK,GAAG,cAAe,SAAUA,EAAa,CAC5Cr9D,EAAY,aAAaq9D,CAAW,CAC1C,CAAK,EACD,KAAK,GAAG,gBAAiB,SAAUA,EAAa,CAC9Cr9D,EAAY,YAAYq9D,CAAW,CACzC,CAAK,EACD,KAAK,GAAG,QAAS,SAAUA,EAAa,CACtCr9D,EAAY,MAAMq9D,CAAW,CACnC,CAAK,EACMr9D,CACX,EAKEo9D,EAAS,UAAU,KAAO,SAAU7jE,EAAM,CACxC,KAAK,QAAQ,OAAQA,CAAI,CAC1B,EACD6jE,EAAS,UAAU,MAAQ,SAAUC,EAAa,CAChD,KAAK,QAAQ,OAAQA,CAAW,CACjC,EACDD,EAAS,UAAU,aAAe,SAAUC,EAAa,CACvD,KAAK,QAAQ,cAAeA,CAAW,CACxC,EACDD,EAAS,UAAU,YAAc,SAAUC,EAAa,CACtD,KAAK,QAAQ,gBAAiBA,CAAW,CAC1C,EACDD,EAAS,UAAU,MAAQ,SAAUC,EAAa,CAChD,KAAK,QAAQ,QAASA,CAAW,CAClC,EACD,IAAIC,EAASF,EACTG,EAAe,KAAK,IAAI,EAAG,EAAE,EAC7BC,EAAc,SAAU9zC,EAAO,CACjC,IAAIC,EAAK,IAAI,SAASD,EAAM,OAAQA,EAAM,WAAYA,EAAM,UAAU,EAClE16B,EACJ,OAAI26B,EAAG,cACL36B,EAAQ26B,EAAG,aAAa,CAAC,EACrB36B,EAAQ,OAAO,iBACV,OAAOA,CAAK,EAEdA,GAEF26B,EAAG,UAAU,CAAC,EAAI4zC,EAAe5zC,EAAG,UAAU,CAAC,CACvD,EACGC,EAAU,CACZ,UAAW4zC,EACX,WAAYD,CACb,EAWG/zC,EAAaI,EAAQ,WACrBzyB,EAAKsmE,EAAMC,EAAMC,EAAMC,EAAMC,EAAMC,EAAMC,EAAMC,EAAMC,EAAMC,EAAMC,EAAMC,EAAMC,EAAMC,EAAMC,EAAMC,EAAMC,EAAMC,EAAMC,GAAMC,EAAMC,GAAQ3yC,EAAO4yC,EAAaC,GAAeC,GAAYC,GAAYC,GAAYC,GAAYC,GAAMC,GAAMC,GAAMC,GAAMC,GAAMC,GAAMC,IAE/P,UAAY,CACX,IAAInzE,EA2CJ,GA1CA2/B,EAAQ,CACN,KAAM,CAAE,EAER,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EAER,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAE,EACR,KAAM,CAAA,CACZ,EAGQ,SAAO,WAAe,KAG1B,KAAK3/B,KAAK2/B,EACJA,EAAM,eAAe3/B,CAAC,IACxB2/B,EAAM3/B,CAAC,EAAI,CAACA,EAAE,WAAW,CAAC,EAAGA,EAAE,WAAW,CAAC,EAAGA,EAAE,WAAW,CAAC,EAAGA,EAAE,WAAW,CAAC,CAAC,GAGlFuyE,EAAc,IAAI,WAAW,CAAC,IAAmB,IAAmB,IAAmB,GAAiB,CAAC,EACzGE,GAAa,IAAI,WAAW,CAAC,GAAmB,IAAmB,GAAmB,EAAiB,CAAC,EACxGD,GAAgB,IAAI,WAAW,CAAC,EAAG,EAAG,EAAG,CAAC,CAAC,EAC3CE,GAAa,IAAI,WAAW,CAAC,EAE7B,EAAM,EAAM,EAEZ,EAAM,EAAM,EAAM,EAElB,IAAM,IAAM,IAAM,IAElB,EAAM,EAAM,EAAM,EAElB,EAAM,EAAM,EAAM,EAElB,EAAM,EAAM,EAAM,EAElB,GAAM,IAAM,IAAM,IAAM,IAAM,GAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,CAC5E,CAAK,EAEDC,GAAa,IAAI,WAAW,CAAC,EAE7B,EAAM,EAAM,EAEZ,EAAM,EAAM,EAAM,EAElB,IAAM,IAAM,IAAM,IAElB,EAAM,EAAM,EAAM,EAElB,EAAM,EAAM,EAAM,EAElB,EAAM,EAAM,EAAM,EAElB,GAAM,IAAM,IAAM,IAAM,IAAM,GAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,CAC5E,CAAK,EAEDC,GAAa,CACX,MAAOF,GACP,MAAOC,EACR,EACDI,GAAO,IAAI,WAAW,CAAC,EAEvB,EAAM,EAAM,EAEZ,EAAM,EAAM,EAAM,EAElB,EAAM,EAAM,EAAM,GAElB,IAAM,IAAM,IAAM,GAElB,EAEA,EAAM,EAAM,CAChB,CAAK,EAEDD,GAAO,IAAI,WAAW,CAAC,EAEvB,EAAM,EAAM,EAEZ,EAAM,EAEN,EAAM,CACV,CAAK,EAEDE,GAAO,IAAI,WAAW,CAAC,EAEvB,EAAM,EAAM,EAEZ,EAAM,EAAM,EAAM,CACtB,CAAK,EAEDC,GAAOD,GACPE,GAAO,IAAI,WAAW,CAAC,EAEvB,EAAM,EAAM,EAEZ,EAAM,EAAM,EAAM,EAElB,EAAM,EAAM,EAAM,CACtB,CAAK,EAEDC,GAAOH,GACPH,GAAO,IAAI,WAAW,CAAC,EAEvB,EAAM,EAAM,EAEZ,EAAM,EAEN,EAAM,EAAM,EAAM,EAAM,EAAM,CAClC,CAAK,EACL,GAAM,EAEJjoE,EAAM,SAAUpK,EAAM,CACpB,IAAIG,EAAU,CAAE,EACd8L,EAAO,EACPzM,EACAmD,EACAkZ,EACF,IAAKrc,EAAI,EAAGA,EAAI,UAAU,OAAQA,IAChCW,EAAQ,KAAK,UAAUX,CAAC,CAAC,EAI3B,IAFAA,EAAIW,EAAQ,OAELX,KACLyM,GAAQ9L,EAAQX,CAAC,EAAE,WAOrB,IALAmD,EAAS,IAAI,WAAWsJ,EAAO,CAAC,EAChC4P,EAAO,IAAI,SAASlZ,EAAO,OAAQA,EAAO,WAAYA,EAAO,UAAU,EACvEkZ,EAAK,UAAU,EAAGlZ,EAAO,UAAU,EACnCA,EAAO,IAAI3C,EAAM,CAAC,EAEbR,EAAI,EAAGyM,EAAO,EAAGzM,EAAIW,EAAQ,OAAQX,IACxCmD,EAAO,IAAIxC,EAAQX,CAAC,EAAGyM,CAAI,EAC3BA,GAAQ9L,EAAQX,CAAC,EAAE,WAErB,OAAOmD,CACR,EACD+tE,EAAO,UAAY,CACjB,OAAOtmE,EAAI+0B,EAAM,KAAM/0B,EAAI+0B,EAAM,KAAMozC,EAAI,CAAC,CAC7C,EACD5B,EAAO,SAAUnnE,EAAO,CACtB,OAAOY,EAAI+0B,EAAM,KAAM,IAAI,WAAW,CAAC,EAEvC,EAAM,EAAM,EAGZ,EAEA,GAEA,EAAM,EAEN,EAGA,EAEA,GAEA,GAEA,GAEA,EAAM,EAAM,EAEZ,EAAM,EAAM,IAAM,IAElB,EAAM,EAAM,IAAM,IAGlB,EAEA,EAIA31B,EAAM,iBAAmB,EAAIA,EAAM,yBAA2B,EAAGA,EAAM,wBAA0B,EAAIA,EAAM,cAAgB,EAAG,EAAM,EAAM,CAC9I,CAAK,CAAC,CACH,EAEDonE,EAAO,UAAY,CACjB,OAAOxmE,EAAI+0B,EAAM,KAAM4yC,EAAaC,GAAeD,EAAaE,EAAU,CAC3E,EACDT,EAAO,SAAUxxE,EAAM,CACrB,OAAOoK,EAAI+0B,EAAM,KAAMizC,GAAWpyE,CAAI,CAAC,CACxC,EACD6wE,EAAO,SAAUrkE,EAAM,CACrB,OAAOpC,EAAI+0B,EAAM,KAAM3yB,CAAI,CAC5B,EACD+kE,EAAO,SAAU/nE,EAAO,CACtB,IAAI7G,EAAS,IAAI,WAAW,CAAC,EAE7B,EAAM,EAAM,EAEZ,EAAM,EAAM,EAAM,EAElB,EAAM,EAAM,EAAM,EAElB,EAAM,EAAM,GAAM,IAElB6G,EAAM,WAAa,GAAK,IAAMA,EAAM,WAAa,GAAK,IAAMA,EAAM,WAAa,EAAI,IAAMA,EAAM,SAAW,IAE1G,GAAM,IAEN,EAAM,CAAI,CAAC,EAIX,OAAIA,EAAM,aACR7G,EAAO,EAAE,EAAI6G,EAAM,aAAe,GAAK,IACvC7G,EAAO,EAAE,EAAI6G,EAAM,aAAe,GAAK,IACvC7G,EAAO,EAAE,EAAI6G,EAAM,aAAe,EAAI,IACtC7G,EAAO,EAAE,EAAI6G,EAAM,WAAa,KAE3BY,EAAI+0B,EAAM,KAAMx8B,CAAM,CAC9B,EACD2uE,EAAO,SAAU9nE,EAAO,CACtB,OAAOY,EAAI+0B,EAAM,KAAMoyC,EAAK/nE,CAAK,EAAGgoE,EAAKhoE,EAAM,IAAI,EAAGunE,EAAKvnE,CAAK,CAAC,CAClE,EACDsnE,EAAO,SAAU8B,EAAgB,CAC/B,OAAOxoE,EAAI+0B,EAAM,KAAM,IAAI,WAAW,CAAC,EAAM,EAAM,EAAM,GAExDyzC,EAAiB,aAAe,IAAKA,EAAiB,WAAa,IAAKA,EAAiB,QAAW,EAAGA,EAAiB,GAC7H,CAAK,CAAC,CACH,EAED7B,EAAO,SAAUvnE,EAAO,CACtB,OAAOY,EAAI+0B,EAAM,KAAM31B,EAAM,OAAS,QAAUY,EAAI+0B,EAAM,KAAMkzC,EAAI,EAAIjoE,EAAI+0B,EAAM,KAAMmzC,EAAI,EAAG5B,EAAM,EAAEgB,EAAKloE,CAAK,CAAC,CACnH,EACDwnE,EAAO,SAAU4B,EAAgBh9B,EAAQ,CAIvC,QAHIi9B,EAAiB,CAAE,EACrBrzE,EAAIo2C,EAAO,OAENp2C,KACLqzE,EAAerzE,CAAC,EAAIoyE,GAAKh8B,EAAOp2C,CAAC,CAAC,EAEpC,OAAO4K,EAAI,MAAM,KAAM,CAAC+0B,EAAM,KAAM2xC,EAAK8B,CAAc,CAAC,EAAE,OAAOC,CAAc,CAAC,CACjF,EAOD5B,EAAO,SAAUr7B,EAAQ,CAGvB,QAFIp2C,EAAIo2C,EAAO,OACb9qC,EAAQ,CAAE,EACLtL,KACLsL,EAAMtL,CAAC,EAAI4xE,EAAKx7B,EAAOp2C,CAAC,CAAC,EAE3B,OAAO4K,EAAI,MAAM,KAAM,CAAC+0B,EAAM,KAAMgyC,EAAK,UAAU,CAAC,EAAE,OAAOrmE,CAAK,EAAE,OAAOomE,EAAKt7B,CAAM,CAAC,CAAC,CACzF,EACDs7B,EAAO,SAAUt7B,EAAQ,CAGvB,QAFIp2C,EAAIo2C,EAAO,OACb9qC,EAAQ,CAAE,EACLtL,KACLsL,EAAMtL,CAAC,EAAIqyE,EAAKj8B,EAAOp2C,CAAC,CAAC,EAE3B,OAAO4K,EAAI,MAAM,KAAM,CAAC+0B,EAAM,IAAI,EAAE,OAAOr0B,CAAK,CAAC,CAClD,EACDqmE,EAAO,SAAUjjD,EAAU,CACzB,IAAI1T,EAAQ,IAAI,WAAW,CAAC,EAE5B,EAAM,EAAM,EAEZ,EAAM,EAAM,EAAM,EAElB,EAAM,EAAM,EAAM,EAElB,EAAM,EAAM,GAAM,KAEjB0T,EAAW,aAAe,IAAKA,EAAW,WAAa,IAAKA,EAAW,QAAW,EAAGA,EAAW,IAEjG,EAAM,EAAM,EAAM,EAElB,EAAM,EAEN,EAAM,EAEN,EAAM,EAAM,EAAM,EAElB,EAAM,EAAM,EAAM,EAElB,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,GAAM,EAAM,EAAM,EAElN,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAE1I,IAAM,IAAM,IAAM,GACtB,CAAK,EAED,OAAO9jB,EAAI+0B,EAAM,KAAM3kB,CAAK,CAC7B,EACDi3D,EAAO,SAAUjoE,EAAO,CACtB,IAAIspE,EAAUtpE,EAAM,SAAW,CAAE,EAC/BgR,EAAQ,IAAI,WAAW,EAAIs4D,EAAQ,MAAM,EACzC74C,EACAz6B,EAGF,IAAKA,EAAI,EAAGA,EAAIszE,EAAQ,OAAQtzE,IAC9By6B,EAAQ64C,EAAQtzE,CAAC,EAAE,MACnBgb,EAAMhb,EAAI,CAAC,EAAIy6B,EAAM,WAAa,EAAIA,EAAM,cAAgB,EAAIA,EAAM,cAExE,OAAO7vB,EAAI+0B,EAAM,KAAM3kB,CAAK,CAC7B,EACDk3D,EAAO,SAAUloE,EAAO,CACtB,OAAOY,EAAI+0B,EAAM,KAAMwyC,EAAKnoE,CAAK,EAAGY,EAAI+0B,EAAM,KAAMwzC,EAAI,EAAGvoE,EAAI+0B,EAAM,KAAMszC,EAAI,EAAGroE,EAAI+0B,EAAM,KAAMuzC,EAAI,EAAGtoE,EAAI+0B,EAAM,KAAMqzC,EAAI,CAAC,CAC/H,EACA,UAAY,CACX,IAAIO,EAAaC,EACjBrB,EAAO,SAAUnoE,EAAO,CACtB,OAAOY,EAAI+0B,EAAM,KAAM,IAAI,WAAW,CAAC,EAEvC,EAAM,EAAM,EAEZ,EAAM,EAAM,EAAM,CAAI,CAAC,EAAG31B,EAAM,OAAS,QAAUupE,EAAYvpE,CAAK,EAAIwpE,EAAYxpE,CAAK,CAAC,CAC3F,EACDupE,EAAc,SAAUvpE,EAAO,CAC7B,IAAIypE,EAAMzpE,EAAM,KAAO,CAAE,EACvB0pE,EAAM1pE,EAAM,KAAO,CAAE,EACrB2pE,EAAwB,CAAE,EAC1BC,EAAuB,CAAE,EACzB5zE,EACA6zE,EAEF,IAAK7zE,EAAI,EAAGA,EAAIyzE,EAAI,OAAQzzE,IAC1B2zE,EAAsB,MAAMF,EAAIzzE,CAAC,EAAE,WAAa,SAAY,CAAC,EAC7D2zE,EAAsB,KAAKF,EAAIzzE,CAAC,EAAE,WAAa,GAAI,EAEnD2zE,EAAwBA,EAAsB,OAAO,MAAM,UAAU,MAAM,KAAKF,EAAIzzE,CAAC,CAAC,CAAC,EAGzF,IAAKA,EAAI,EAAGA,EAAI0zE,EAAI,OAAQ1zE,IAC1B4zE,EAAqB,MAAMF,EAAI1zE,CAAC,EAAE,WAAa,SAAY,CAAC,EAC5D4zE,EAAqB,KAAKF,EAAI1zE,CAAC,EAAE,WAAa,GAAI,EAClD4zE,EAAuBA,EAAqB,OAAO,MAAM,UAAU,MAAM,KAAKF,EAAI1zE,CAAC,CAAC,CAAC,EAoDvF,GAlDA6zE,EAAU,CAACl0C,EAAM,KAAM,IAAI,WAAW,CAAC,EAAM,EAAM,EAAM,EAAM,EAAM,EAErE,EAAM,EAEN,EAAM,EAEN,EAAM,EAEN,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,GAEjE31B,EAAM,MAAQ,QAAW,EAAGA,EAAM,MAAQ,KAE1CA,EAAM,OAAS,QAAW,EAAGA,EAAM,OAAS,IAE7C,EAAM,GAAM,EAAM,EAElB,EAAM,GAAM,EAAM,EAElB,EAAM,EAAM,EAAM,EAElB,EAAM,EAEN,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAAM,GAAM,IAAM,IAAM,IAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAE1L,EAAM,GAEN,GAAM,EACZ,CAAO,EAAGY,EAAI+0B,EAAM,KAAM,IAAI,WAAW,CAAC,EAEpC31B,EAAM,WAENA,EAAM,qBAENA,EAAM,SAEN,GACN,EAAQ,OAAO,CAACypE,EAAI,MAAM,EAEpBE,EAEA,CAACD,EAAI,MAAM,EAEXE,CACN,CAAO,CAAC,EAAGhpE,EAAI+0B,EAAM,KAAM,IAAI,WAAW,CAAC,EAAM,GAAM,IAAM,IAEvD,EAAM,GAAM,IAAM,IAElB,EAAM,GAAM,IAAM,GACjB,CAAA,CAAC,CAAC,EAEC31B,EAAM,SAAU,CAClB,IAAI8pE,EAAW9pE,EAAM,SAAS,CAAC,EAC7B+pE,EAAW/pE,EAAM,SAAS,CAAC,EAC7B6pE,EAAQ,KAAKjpE,EAAI+0B,EAAM,KAAM,IAAI,WAAW,EAAEm0C,EAAW,aAAe,IAAKA,EAAW,WAAa,IAAKA,EAAW,QAAW,EAAGA,EAAW,KAAOC,EAAW,aAAe,IAAKA,EAAW,WAAa,IAAKA,EAAW,QAAW,EAAGA,EAAW,GAAI,CAAC,CAAC,CAAC,CACpQ,CACM,OAAOnpE,EAAI,MAAM,KAAMipE,CAAO,CAC/B,EACDL,EAAc,SAAUxpE,EAAO,CAC7B,OAAOY,EAAI+0B,EAAM,KAAM,IAAI,WAAW,CAEtC,EAAM,EAAM,EAAM,EAAM,EAAM,EAE9B,EAAM,EAGN,EAAM,EAAM,EAAM,EAElB,EAAM,EAAM,EAAM,GAEjB31B,EAAM,aAAe,QAAW,EAAGA,EAAM,aAAe,KAExDA,EAAM,WAAa,QAAW,EAAGA,EAAM,WAAa,IAErD,EAAM,EAEN,EAAM,GAELA,EAAM,WAAa,QAAW,EAAGA,EAAM,WAAa,IAAM,EAAM,CAEvE,CAAO,EAAGmnE,EAAKnnE,CAAK,CAAC,CAChB,CACL,EAAM,EACJ6nE,EAAO,SAAU7nE,EAAO,CACtB,IAAI7G,EAAS,IAAI,WAAW,CAAC,EAE7B,EAAM,EAAM,EAEZ,EAAM,EAAM,EAAM,EAElB,EAAM,EAAM,EAAM,GAEjB6G,EAAM,GAAK,aAAe,IAAKA,EAAM,GAAK,WAAa,IAAKA,EAAM,GAAK,QAAW,EAAGA,EAAM,GAAK,IAEjG,EAAM,EAAM,EAAM,GAEjBA,EAAM,SAAW,aAAe,IAAKA,EAAM,SAAW,WAAa,IAAKA,EAAM,SAAW,QAAW,EAAGA,EAAM,SAAW,IAEzH,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAE1C,EAAM,EAEN,EAAM,EAEN,EAAM,EAEN,EAAM,EAEN,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,GAAM,EAAM,EAAM,GAEjNA,EAAM,MAAQ,QAAW,EAAGA,EAAM,MAAQ,IAAM,EAAM,GAEtDA,EAAM,OAAS,QAAW,EAAGA,EAAM,OAAS,IAAM,EAAM,CAC7D,CAAK,EAED,OAAOY,EAAI+0B,EAAM,KAAMx8B,CAAM,CAC9B,EAMDivE,GAAO,SAAUpoE,EAAO,CACtB,IAAIgqE,EAAqBC,EAAyBC,EAAkBC,EAAuBC,EAAYC,EAA8BC,EAwCrI,OAvCAN,EAAsBppE,EAAI+0B,EAAM,KAAM,IAAI,WAAW,CAAC,EAEtD,EAAM,EAAM,IAEX31B,EAAM,GAAK,aAAe,IAAKA,EAAM,GAAK,WAAa,IAAKA,EAAM,GAAK,QAAW,EAAGA,EAAM,GAAK,IAEjG,EAAM,EAAM,EAAM,EAElB,EAAM,EAAM,EAAM,EAElB,EAAM,EAAM,EAAM,EAElB,EAAM,EAAM,EAAM,CACtB,CAAK,CAAC,EAEFqqE,EAA+B,KAAK,MAAMrqE,EAAM,oBAAsBizB,CAAU,EAChFq3C,EAA+B,KAAK,MAAMtqE,EAAM,oBAAsBizB,CAAU,EAChFg3C,EAA0BrpE,EAAI+0B,EAAM,KAAM,IAAI,WAAW,CAAC,EAE1D,EAAM,EAAM,EAGZ00C,IAAiC,GAAK,IAAMA,IAAiC,GAAK,IAAMA,IAAiC,EAAI,IAAMA,EAA+B,IAAMC,IAAiC,GAAK,IAAMA,IAAiC,GAAK,IAAMA,IAAiC,EAAI,IAAMA,EAA+B,GAAI,CAAC,CAAC,EAIhVF,EAAa,GAaTpqE,EAAM,OAAS,SACjBkqE,EAAmB5B,GAAOtoE,EAAOoqE,CAAU,EACpCxpE,EAAI+0B,EAAM,KAAMq0C,EAAqBC,EAAyBC,CAAgB,IAKvFC,EAAwBlC,EAAKjoE,CAAK,EAClCkqE,EAAmB5B,GAAOtoE,EAAOmqE,EAAsB,OAASC,CAAU,EACnExpE,EAAI+0B,EAAM,KAAMq0C,EAAqBC,EAAyBC,EAAkBC,CAAqB,EAC7G,EAODvC,EAAO,SAAU5nE,EAAO,CACtB,OAAAA,EAAM,SAAWA,EAAM,UAAY,WAC5BY,EAAI+0B,EAAM,KAAMkyC,EAAK7nE,CAAK,EAAG8nE,EAAK9nE,CAAK,CAAC,CAChD,EACDqoE,EAAO,SAAUroE,EAAO,CACtB,IAAI7G,EAAS,IAAI,WAAW,CAAC,EAE7B,EAAM,EAAM,GAEX6G,EAAM,GAAK,aAAe,IAAKA,EAAM,GAAK,WAAa,IAAKA,EAAM,GAAK,QAAW,EAAGA,EAAM,GAAK,IAEjG,EAAM,EAAM,EAAM,EAElB,EAAM,EAAM,EAAM,EAElB,EAAM,EAAM,EAAM,EAElB,EAAM,EAAM,EAAM,CACtB,CAAK,EAKD,OAAIA,EAAM,OAAS,UACjB7G,EAAOA,EAAO,OAAS,CAAC,EAAI,GAEvByH,EAAI+0B,EAAM,KAAMx8B,CAAM,CAC9B,EACA,UAAY,CACX,IAAIoxE,EAAWC,EAAWC,EAK1BA,EAAa,SAAUnB,EAASz2D,EAAQ,CACtC,IAAI63D,EAAkB,EACpBC,EAAc,EACdC,EAAe,EACfC,EAAwB,EAE1B,OAAIvB,EAAQ,SACNA,EAAQ,CAAC,EAAE,WAAa,SAC1BoB,EAAkB,GAEhBpB,EAAQ,CAAC,EAAE,OAAS,SACtBqB,EAAc,GAEZrB,EAAQ,CAAC,EAAE,QAAU,SACvBsB,EAAe,GAEbtB,EAAQ,CAAC,EAAE,wBAA0B,SACvCuB,EAAwB,IAGrB,CAAC,EAER,EAAMH,EAAkBC,EAAcC,EAAeC,EAAuB,GAE3EvB,EAAQ,OAAS,cAAgB,IAAKA,EAAQ,OAAS,YAAc,IAAKA,EAAQ,OAAS,SAAY,EAAGA,EAAQ,OAAS,KAE3Hz2D,EAAS,cAAgB,IAAKA,EAAS,YAAc,IAAKA,EAAS,SAAY,EAAGA,EAAS,GAC3F,CACF,EAED23D,EAAY,SAAUxqE,EAAO6S,EAAQ,CACnC,IAAIi4D,EAAa95D,EAAO+5D,EAAQzB,EAAS0B,EAAQh1E,EAOjD,IANAszE,EAAUtpE,EAAM,SAAW,CAAE,EAC7B6S,GAAU,GAAS,GAAKy2D,EAAQ,OAChCyB,EAASN,EAAWnB,EAASz2D,CAAM,EACnC7B,EAAQ,IAAI,WAAW+5D,EAAO,OAASzB,EAAQ,OAAS,EAAE,EAC1Dt4D,EAAM,IAAI+5D,CAAM,EAChBD,EAAcC,EAAO,OAChB/0E,EAAI,EAAGA,EAAIszE,EAAQ,OAAQtzE,IAC9Bg1E,EAAS1B,EAAQtzE,CAAC,EAClBgb,EAAM85D,GAAa,GAAKE,EAAO,SAAW,cAAgB,GAC1Dh6D,EAAM85D,GAAa,GAAKE,EAAO,SAAW,YAAc,GACxDh6D,EAAM85D,GAAa,GAAKE,EAAO,SAAW,SAAY,EACtDh6D,EAAM85D,GAAa,EAAIE,EAAO,SAAW,IAEzCh6D,EAAM85D,GAAa,GAAKE,EAAO,KAAO,cAAgB,GACtDh6D,EAAM85D,GAAa,GAAKE,EAAO,KAAO,YAAc,GACpDh6D,EAAM85D,GAAa,GAAKE,EAAO,KAAO,SAAY,EAClDh6D,EAAM85D,GAAa,EAAIE,EAAO,KAAO,IAErCh6D,EAAM85D,GAAa,EAAIE,EAAO,MAAM,WAAa,EAAIA,EAAO,MAAM,UAClEh6D,EAAM85D,GAAa,EAAIE,EAAO,MAAM,cAAgB,EAAIA,EAAO,MAAM,eAAiB,EAAIA,EAAO,MAAM,cAAgB,EAAIA,EAAO,MAAM,gBACxIh6D,EAAM85D,GAAa,EAAIE,EAAO,MAAM,oBAAsB,MAC1Dh6D,EAAM85D,GAAa,EAAIE,EAAO,MAAM,oBAAsB,GAE1Dh6D,EAAM85D,GAAa,GAAKE,EAAO,sBAAwB,cAAgB,GACvEh6D,EAAM85D,GAAa,GAAKE,EAAO,sBAAwB,YAAc,GACrEh6D,EAAM85D,GAAa,GAAKE,EAAO,sBAAwB,SAAY,EACnEh6D,EAAM85D,GAAa,EAAIE,EAAO,sBAAwB,IAGxD,OAAOpqE,EAAI+0B,EAAM,KAAM3kB,CAAK,CAC7B,EACDu5D,EAAY,SAAUvqE,EAAO6S,EAAQ,CACnC,IAAI7B,EAAO85D,EAAaC,EAAQzB,EAAS0B,EAAQh1E,EAOjD,IANAszE,EAAUtpE,EAAM,SAAW,CAAE,EAC7B6S,GAAU,GAAS,EAAIy2D,EAAQ,OAC/ByB,EAASN,EAAWnB,EAASz2D,CAAM,EACnC7B,EAAQ,IAAI,WAAW+5D,EAAO,OAASzB,EAAQ,OAAS,CAAC,EACzDt4D,EAAM,IAAI+5D,CAAM,EAChBD,EAAcC,EAAO,OAChB/0E,EAAI,EAAGA,EAAIszE,EAAQ,OAAQtzE,IAC9Bg1E,EAAS1B,EAAQtzE,CAAC,EAClBgb,EAAM85D,GAAa,GAAKE,EAAO,SAAW,cAAgB,GAC1Dh6D,EAAM85D,GAAa,GAAKE,EAAO,SAAW,YAAc,GACxDh6D,EAAM85D,GAAa,GAAKE,EAAO,SAAW,SAAY,EACtDh6D,EAAM85D,GAAa,EAAIE,EAAO,SAAW,IAEzCh6D,EAAM85D,GAAa,GAAKE,EAAO,KAAO,cAAgB,GACtDh6D,EAAM85D,GAAa,GAAKE,EAAO,KAAO,YAAc,GACpDh6D,EAAM85D,GAAa,GAAKE,EAAO,KAAO,SAAY,EAClDh6D,EAAM85D,GAAa,EAAIE,EAAO,KAAO,IAGvC,OAAOpqE,EAAI+0B,EAAM,KAAM3kB,CAAK,CAC7B,EACDs3D,GAAS,SAAUtoE,EAAO6S,EAAQ,CAChC,OAAI7S,EAAM,OAAS,QACVuqE,EAAUvqE,EAAO6S,CAAM,EAEzB23D,EAAUxqE,EAAO6S,CAAM,CAC/B,CACL,EAAM,EACJ,IAAIo4D,GAAe,CACjB,KAAM7D,EACN,KAAMC,EACN,KAAMG,EACN,KAAMC,EACN,YAAa,SAAUr7B,EAAQ,CAC7B,IAAI8+B,EAAW9D,EAAM,EACnB+D,EAAQ1D,EAAKr7B,CAAM,EACnBjzC,EACF,OAAAA,EAAS,IAAI,WAAW+xE,EAAS,WAAaC,EAAM,UAAU,EAC9DhyE,EAAO,IAAI+xE,CAAQ,EACnB/xE,EAAO,IAAIgyE,EAAOD,EAAS,UAAU,EAC9B/xE,CACb,CACG,EAWGiyE,GAAsB,SAAUC,EAAU,CAC5C,IAAIr1E,EACFs1E,EACAC,EAAe,CAAE,EACjBC,EAAS,CAAA,EAMX,IAJAA,EAAO,WAAa,EACpBA,EAAO,SAAW,EAClBA,EAAO,SAAW,EAClBD,EAAa,WAAa,EACrBv1E,EAAI,EAAGA,EAAIq1E,EAAS,OAAQr1E,IAC/Bs1E,EAAaD,EAASr1E,CAAC,EAEnBs1E,EAAW,cAAgB,8BAGzBC,EAAa,SACfA,EAAa,SAAWD,EAAW,IAAMC,EAAa,IAEtDC,EAAO,YAAcD,EAAa,WAClCC,EAAO,UAAYD,EAAa,OAChCC,EAAO,UAAYD,EAAa,SAChCC,EAAO,KAAKD,CAAY,GAE1BA,EAAe,CAACD,CAAU,EAC1BC,EAAa,WAAaD,EAAW,KAAK,WAC1CC,EAAa,IAAMD,EAAW,IAC9BC,EAAa,IAAMD,EAAW,MAG1BA,EAAW,cAAgB,8CAC7BC,EAAa,SAAW,IAE1BA,EAAa,SAAWD,EAAW,IAAMC,EAAa,IACtDA,EAAa,YAAcD,EAAW,KAAK,WAC3CC,EAAa,KAAKD,CAAU,GAKhC,OAAIE,EAAO,SAAW,CAACD,EAAa,UAAYA,EAAa,UAAY,KACvEA,EAAa,SAAWC,EAAOA,EAAO,OAAS,CAAC,EAAE,UAIpDA,EAAO,YAAcD,EAAa,WAClCC,EAAO,UAAYD,EAAa,OAChCC,EAAO,UAAYD,EAAa,SAChCC,EAAO,KAAKD,CAAY,EACjBC,CACX,EAKMC,GAAsB,SAAUD,EAAQ,CAC1C,IAAIx1E,EACFu1E,EACAG,EAAa,CAAE,EACfC,EAAO,CAAA,EAcT,IAXAD,EAAW,WAAa,EACxBA,EAAW,SAAW,EACtBA,EAAW,SAAW,EACtBA,EAAW,IAAMF,EAAO,CAAC,EAAE,IAC3BE,EAAW,IAAMF,EAAO,CAAC,EAAE,IAE3BG,EAAK,WAAa,EAClBA,EAAK,SAAW,EAChBA,EAAK,SAAW,EAChBA,EAAK,IAAMH,EAAO,CAAC,EAAE,IACrBG,EAAK,IAAMH,EAAO,CAAC,EAAE,IAChBx1E,EAAI,EAAGA,EAAIw1E,EAAO,OAAQx1E,IAC7Bu1E,EAAeC,EAAOx1E,CAAC,EACnBu1E,EAAa,UAGXG,EAAW,SACbC,EAAK,KAAKD,CAAU,EACpBC,EAAK,YAAcD,EAAW,WAC9BC,EAAK,UAAYD,EAAW,SAC5BC,EAAK,UAAYD,EAAW,UAE9BA,EAAa,CAACH,CAAY,EAC1BG,EAAW,SAAWH,EAAa,OACnCG,EAAW,WAAaH,EAAa,WACrCG,EAAW,IAAMH,EAAa,IAC9BG,EAAW,IAAMH,EAAa,IAC9BG,EAAW,SAAWH,EAAa,WAEnCG,EAAW,UAAYH,EAAa,SACpCG,EAAW,UAAYH,EAAa,OACpCG,EAAW,YAAcH,EAAa,WACtCG,EAAW,KAAKH,CAAY,GAGhC,OAAII,EAAK,QAAUD,EAAW,UAAY,IACxCA,EAAW,SAAWC,EAAKA,EAAK,OAAS,CAAC,EAAE,UAE9CA,EAAK,YAAcD,EAAW,WAC9BC,EAAK,UAAYD,EAAW,SAC5BC,EAAK,UAAYD,EAAW,SAE5BC,EAAK,KAAKD,CAAU,EACbC,CACR,EAWGC,GAAsB,SAAUD,EAAM,CACxC,IAAID,EACJ,MAAI,CAACC,EAAK,CAAC,EAAE,CAAC,EAAE,UAAYA,EAAK,OAAS,IAExCD,EAAaC,EAAK,MAAO,EACzBA,EAAK,YAAcD,EAAW,WAC9BC,EAAK,UAAYD,EAAW,SAI5BC,EAAK,CAAC,EAAE,CAAC,EAAE,IAAMD,EAAW,IAC5BC,EAAK,CAAC,EAAE,CAAC,EAAE,IAAMD,EAAW,IAC5BC,EAAK,CAAC,EAAE,CAAC,EAAE,UAAYD,EAAW,UAE7BC,CACR,EAMGE,GAAsB,UAAY,CACpC,MAAO,CACL,KAAM,EACN,MAAO,CACL,UAAW,EACX,UAAW,EACX,aAAc,EACd,cAAe,EACf,oBAAqB,EACrB,gBAAiB,CACzB,CACK,CACF,EAUGC,GAAiB,SAAUC,EAAO3B,EAAY,CAChD,IAAIY,EAASa,GAAqB,EAClC,OAAAb,EAAO,WAAaZ,EACpBY,EAAO,sBAAwBe,EAAM,IAAMA,EAAM,IACjDf,EAAO,SAAWe,EAAM,SACxBf,EAAO,KAAO,EAAIe,EAAM,OAExBf,EAAO,MAAQe,EAAM,WACjBA,EAAM,WACRf,EAAO,MAAM,UAAY,EACzBA,EAAO,MAAM,gBAAkB,GAE1BA,CACX,EAEMgB,GAAwB,SAAUL,EAAMM,EAAgB,CAC1D,IAAI,EACFj2E,EACAg1E,EACAU,EACAH,EACAnB,EAAa6B,GAAkB,EAC/B3C,EAAU,CAAE,EACd,IAAK,EAAI,EAAG,EAAIqC,EAAK,OAAQ,IAE3B,IADAD,EAAaC,EAAK,CAAC,EACd31E,EAAI,EAAGA,EAAI01E,EAAW,OAAQ11E,IACjCu1E,EAAeG,EAAW11E,CAAC,EAC3Bg1E,EAASc,GAAeP,EAAcnB,CAAU,EAChDA,GAAcY,EAAO,KACrB1B,EAAQ,KAAK0B,CAAM,EAGvB,OAAO1B,CACX,EAEM4C,GAAqB,SAAUP,EAAM,CACvC,IAAI1vE,EACFjG,EACA+/C,EACA21B,EACAH,EACAD,EACAlB,EAAa,EACb+B,EAAiBR,EAAK,WACtBS,EAAeT,EAAK,SACpBU,EAAkBF,EAAiB,EAAIC,EACvCppE,EAAO,IAAI,WAAWqpE,CAAe,EACrCh6D,EAAO,IAAI,SAASrP,EAAK,MAAM,EAEjC,IAAK/G,EAAI,EAAGA,EAAI0vE,EAAK,OAAQ1vE,IAG3B,IAFAyvE,EAAaC,EAAK1vE,CAAC,EAEdjG,EAAI,EAAGA,EAAI01E,EAAW,OAAQ11E,IAGjC,IAFAu1E,EAAeG,EAAW11E,CAAC,EAEtB+/C,EAAI,EAAGA,EAAIw1B,EAAa,OAAQx1B,IACnCu1B,EAAaC,EAAax1B,CAAC,EAC3B1jC,EAAK,UAAU+3D,EAAYkB,EAAW,KAAK,UAAU,EACrDlB,GAAc,EACdpnE,EAAK,IAAIsoE,EAAW,KAAMlB,CAAU,EACpCA,GAAckB,EAAW,KAAK,WAIpC,OAAOtoE,CACX,EAEMspE,GAA8B,SAAUP,EAAOE,EAAgB,CACjE,IAAIjB,EACFZ,EAAa6B,GAAkB,EAC/B3C,EAAU,CAAE,EACd,OAAA0B,EAASc,GAAeC,EAAO3B,CAAU,EACzCd,EAAQ,KAAK0B,CAAM,EACZ1B,CACX,EAEMiD,GAA6B,SAAUR,EAAO,CAChD,IAAI/1E,EACFs1E,EACAlB,EAAa,EACb+B,EAAiBJ,EAAM,WACvBK,EAAeL,EAAM,OACrBM,EAAkBF,EAAiB,EAAIC,EACvCppE,EAAO,IAAI,WAAWqpE,CAAe,EACrCh6D,EAAO,IAAI,SAASrP,EAAK,MAAM,EAEjC,IAAKhN,EAAI,EAAGA,EAAI+1E,EAAM,OAAQ/1E,IAC5Bs1E,EAAaS,EAAM/1E,CAAC,EACpBqc,EAAK,UAAU+3D,EAAYkB,EAAW,KAAK,UAAU,EACrDlB,GAAc,EACdpnE,EAAK,IAAIsoE,EAAW,KAAMlB,CAAU,EACpCA,GAAckB,EAAW,KAAK,WAEhC,OAAOtoE,CACR,EACGwpE,GAAe,CACjB,oBAAqBpB,GACrB,oBAAqBK,GACrB,oBAAqBG,GACrB,oBAAqBI,GACrB,mBAAoBE,GACpB,4BAA6BI,GAC7B,2BAA4BC,EAC7B,EAQGE,GAAa,CAAC,GAAI,GAAI,EAAG,GAAI,IAAK,EAAE,EACpCC,GAAY,CAAC,GAAI,GAAI,IAAK,GAAI,EAAG,EAAG,EAAG,EAAG,IAAK,EAAG,EAAG,EAAG,GAAI,IAAK,GAAG,EACpEC,GAAW,SAAUzsE,EAAO,CAE9B,QADIxD,EAAI,CAAE,EACHwD,KACLxD,EAAE,KAAK,CAAC,EAEV,OAAOA,CACR,EACGkwE,GAAY,SAAUC,EAAW,CACnC,OAAO,OAAO,KAAKA,CAAS,EAAE,OAAO,SAAU/3E,EAAKwE,EAAK,CACvD,OAAAxE,EAAIwE,CAAG,EAAI,IAAI,WAAWuzE,EAAUvzE,CAAG,EAAE,OAAO,SAAUnD,EAAKyX,EAAM,CACnE,OAAOzX,EAAI,OAAOyX,CAAI,CACvB,EAAE,CAAE,CAAA,CAAC,EACC9Y,CACR,EAAE,EAAE,CACN,EACGg4E,GACAC,GAAY,UAAY,CAC1B,GAAI,CAACD,GAAS,CAEZ,IAAIE,EAAgB,CAClB,KAAO,CAACP,GAAY,CAAC,IAAK,EAAE,EAAGE,GAAS,GAAG,EAAG,CAAC,EAAE,CAAC,EAClD,MAAO,CAACF,GAAY,CAAC,GAAG,EAAGE,GAAS,GAAG,EAAG,CAAC,EAAE,CAAC,EAC9C,KAAO,CAACF,GAAY,CAAC,IAAK,GAAG,EAAGE,GAAS,GAAG,EAAG,CAAC,EAAE,CAAC,EACnD,KAAO,CAACF,GAAY,CAAC,IAAK,GAAG,EAAGE,GAAS,GAAG,EAAG,CAAC,GAAI,IAAK,GAAG,EAAGA,GAAS,EAAE,EAAG,CAAC,GAAG,CAAC,EAClF,MAAO,CAACF,GAAY,CAAC,IAAK,GAAG,EAAGE,GAAS,GAAG,EAAG,CAAC,GAAI,IAAK,GAAG,EAAGA,GAAS,EAAE,EAAG,CAAC,GAAG,CAAC,EAClF,KAAO,CAACF,GAAY,CAAC,IAAK,GAAG,EAAGE,GAAS,GAAG,EAAG,CAAC,GAAI,GAAG,EAAGA,GAAS,GAAG,EAAG,CAAC,GAAG,CAAC,EAC9E,KAAO,CAACF,GAAY,CAAC,IAAK,GAAG,EAAGE,GAAS,GAAG,EAAG,CAAC,GAAI,IAAK,GAAG,EAAGA,GAAS,GAAG,EAAG,CAAC,IAAK,GAAG,EAAGA,GAAS,GAAG,EAAG,CAAC,GAAG,CAAC,EAC9G,KAAO,CAACF,GAAY,CAAC,IAAK,GAAG,EAAGE,GAAS,GAAG,EAAG,CAAC,GAAI,IAAK,GAAG,EAAGA,GAAS,GAAG,EAAG,CAAC,IAAK,GAAG,EAAGA,GAAS,GAAG,EAAG,CAAC,IAAK,GAAG,EAAGA,GAAS,GAAG,EAAG,CAAC,EAAG,GAAG,CAAC,EAC5I,KAAO,CAACD,GAAWC,GAAS,GAAG,EAAG,CAAC,EAAG,IAAK,GAAG,EAAGA,GAAS,GAAG,EAAG,CAAC,EAAG,IAAK,GAAG,EAAGA,GAAS,GAAG,EAAG,CAAC,GAAI,IAAK,GAAG,EAAGA,GAAS,GAAG,EAAG,CAAC,GAAI,IAAK,GAAG,EAAGA,GAAS,GAAG,EAAG,CAAC,EAAE,CAAC,EAChK,MAAO,CAACD,GAAWC,GAAS,GAAG,EAAG,CAAC,EAAG,IAAK,GAAG,EAAGA,GAAS,GAAG,EAAG,CAAC,EAAG,IAAK,GAAG,EAAGA,GAAS,GAAG,EAAG,CAAC,GAAI,IAAK,GAAG,EAAGA,GAAS,GAAG,EAAG,CAAC,GAAI,IAAK,GAAG,EAAGA,GAAS,GAAG,EAAG,CAAC,GAAI,IAAK,GAAG,EAAGA,GAAS,GAAG,EAAG,CAAC,GAAG,CAAC,EAChM,IAAM,CAACD,GAAWC,GAAS,GAAG,EAAG,CAAC,EAAG,IAAK,EAAE,EAAGA,GAAS,EAAE,EAAG,CAAC,CAAC,CAAC,CACjE,EACDG,GAAUF,GAAUI,CAAa,CACvC,CACI,OAAOF,EACR,EAQGG,GAAqB,IAEvBC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACFN,GAAmB,SAAUvjC,EAAS,CACpC,OAAOA,EAAUsjC,EAClB,EACDE,GAAmB,SAAUxjC,EAAS8jC,EAAY,CAChD,OAAO9jC,EAAU8jC,CAClB,EACDL,GAAmB,SAAUM,EAAW,CACtC,OAAOA,EAAYT,EACpB,EACDI,GAAmB,SAAUK,EAAWD,EAAY,CAClD,OAAOC,EAAYD,CACpB,EACDH,GAAmB,SAAUI,EAAWD,EAAY,CAClD,OAAOP,GAAiBG,GAAiBK,EAAWD,CAAU,CAAC,CAChE,EACDF,GAAmB,SAAUG,EAAWD,EAAY,CAClD,OAAON,GAAiBC,GAAiBM,CAAS,EAAGD,CAAU,CAChE,EAMDD,GAAsB,SAAUE,EAAWC,EAAkBC,EAAwB,CACnF,OAAOR,GAAiBQ,EAAyBF,EAAYA,EAAYC,CAAgB,CAC1F,EACD,IAAIE,GAAU,CACZ,iBAAkBZ,GAClB,iBAAkBC,GAClB,iBAAkBC,GAClB,iBAAkBC,GAClB,iBAAkBC,GAClB,iBAAkBC,GAClB,iBAAkBC,GAClB,oBAAqBC,EACtB,EAQGR,GAAgBD,GAChBe,GAAUD,GAKVE,GAAsB,SAAUj0E,EAAO,CACzC,IAAI9D,EACFg4E,EACAC,EAAM,EAER,IAAKj4E,EAAI,EAAGA,EAAI8D,EAAM,OAAQ9D,IAC5Bg4E,EAAal0E,EAAM9D,CAAC,EACpBi4E,GAAOD,EAAW,KAAK,WAEzB,OAAOC,CACX,EAGMC,GAAoB,SAAUluE,EAAOwrE,EAAQ2C,EAAoBC,EAA0B,CAC7F,IAAIC,EACFC,EAAgB,EAChBC,EAAmB,EACnBC,EAAsB,EACtBC,EAAoB,EACpBC,EACA14E,EACA24E,EACF,GAAKnD,EAAO,SAGZ6C,EAAwBP,GAAQ,iBAAiB9tE,EAAM,oBAAqBA,EAAM,UAAU,EAE5FsuE,EAAgB,KAAK,KAAKR,GAAQ,kBAAoB9tE,EAAM,WAAa,KAAK,EAC1EmuE,GAAsBC,IAExBG,EAAmBF,EAAwB,KAAK,IAAIF,EAAoBC,CAAwB,EAEhGI,EAAsB,KAAK,MAAMD,EAAmBD,CAAa,EACjEG,EAAoBD,EAAsBF,GAIxC,EAAAE,EAAsB,GAAKC,EAAoBX,GAAQ,iBAAmB,IAS9E,KANAY,EAAc1B,GAAa,EAAGhtE,EAAM,UAAU,EACzC0uE,IAGHA,EAAclD,EAAO,CAAC,EAAE,MAErBx1E,EAAI,EAAGA,EAAIw4E,EAAqBx4E,IACnC24E,EAAanD,EAAO,CAAC,EACrBA,EAAO,OAAO,EAAG,EAAG,CAClB,KAAMkD,EACN,IAAKC,EAAW,IAAML,EACtB,IAAKK,EAAW,IAAML,CAC9B,CAAO,EAEH,OAAAtuE,EAAM,qBAAuB,KAAK,MAAM8tE,GAAQ,iBAAiBW,EAAmBzuE,EAAM,UAAU,CAAC,EAC9FyuE,EACX,EAKMG,GAA8B,SAAUC,EAAY7uE,EAAO8uE,EAAoB,CACjF,OAAI9uE,EAAM,eAAiB8uE,EAClBD,GAGT7uE,EAAM,cAAgB,IACf6uE,EAAW,OAAO,SAAUtD,EAAc,CAE/C,OAAIA,EAAa,KAAOuD,GACtB9uE,EAAM,cAAgB,KAAK,IAAIA,EAAM,cAAeurE,EAAa,GAAG,EACpEvrE,EAAM,cAAgBA,EAAM,cACrB,IAGF,EACb,CAAK,EACL,EAEM+uE,GAAsB,SAAUvD,EAAQ,CAC1C,IAAIx1E,EACFu1E,EACAjC,EAAU,CAAE,EACd,IAAKtzE,EAAI,EAAGA,EAAIw1E,EAAO,OAAQx1E,IAC7Bu1E,EAAeC,EAAOx1E,CAAC,EACvBszE,EAAQ,KAAK,CACX,KAAMiC,EAAa,KAAK,WACxB,SAAU,IAClB,CAAO,EAGH,OAAOjC,CACX,EAEM0F,GAAuB,SAAUxD,EAAQ,CAC3C,IAAIx1E,EACFu1E,EACAnB,EAAa,EACbpnE,EAAO,IAAI,WAAW+qE,GAAoBvC,CAAM,CAAC,EACnD,IAAKx1E,EAAI,EAAGA,EAAIw1E,EAAO,OAAQx1E,IAC7Bu1E,EAAeC,EAAOx1E,CAAC,EACvBgN,EAAK,IAAIuoE,EAAa,KAAMnB,CAAU,EACtCA,GAAcmB,EAAa,KAAK,WAElC,OAAOvoE,CACR,EACGisE,GAAoB,CACtB,kBAAmBf,GACnB,4BAA6BU,GAC7B,oBAAqBG,GACrB,qBAAsBC,EACvB,EAQGE,GAAqBrB,GAAQ,iBAO7BsB,GAAiB,SAAUnvE,EAAOgD,EAAM,CACtC,OAAOA,EAAK,KAAQ,WAClBhD,EAAM,kBAAkB,MAAQ,SAClCA,EAAM,kBAAkB,IAAMgD,EAAK,KAEjChD,EAAM,gBAAkB,OAC1BA,EAAM,cAAgBgD,EAAK,IAE3BhD,EAAM,cAAgB,KAAK,IAAIA,EAAM,cAAegD,EAAK,GAAG,EAE1DhD,EAAM,gBAAkB,OAC1BA,EAAM,cAAgBgD,EAAK,IAE3BhD,EAAM,cAAgB,KAAK,IAAIA,EAAM,cAAegD,EAAK,GAAG,GAG5D,OAAOA,EAAK,KAAQ,WAClBhD,EAAM,kBAAkB,MAAQ,SAClCA,EAAM,kBAAkB,IAAMgD,EAAK,KAEjChD,EAAM,gBAAkB,OAC1BA,EAAM,cAAgBgD,EAAK,IAE3BhD,EAAM,cAAgB,KAAK,IAAIA,EAAM,cAAegD,EAAK,GAAG,EAE1DhD,EAAM,gBAAkB,OAC1BA,EAAM,cAAgBgD,EAAK,IAE3BhD,EAAM,cAAgB,KAAK,IAAIA,EAAM,cAAegD,EAAK,GAAG,EAGjE,EAMGosE,GAAe,SAAUpvE,EAAO,CAClC,OAAOA,EAAM,cACb,OAAOA,EAAM,cACb,OAAOA,EAAM,cACb,OAAOA,EAAM,aACd,EAUGqvE,GAAoC,SAAUrvE,EAAO4tE,EAAwB,CAC/E,IAAI0B,EACFC,EACAC,EAAgBxvE,EAAM,cAExB,OAAK4tE,IACH4B,GAAiBxvE,EAAM,kBAAkB,KAI3CsvE,EAAsBtvE,EAAM,kBAAkB,oBAE9CsvE,GAAuBE,EAEvBF,EAAsB,KAAK,IAAI,EAAGA,CAAmB,EACjDtvE,EAAM,OAAS,UAGjBuvE,EAAQvvE,EAAM,WAAakvE,GAC3BI,GAAuBC,EACvBD,EAAsB,KAAK,MAAMA,CAAmB,GAE/CA,CACR,EACGG,GAAoB,CACtB,aAAcL,GACd,kCAAmCC,GACnC,eAAgBF,EACjB,EAiBGO,GAAiC,EACnCC,GAAqB,IAUnBC,GAAW,SAAU5+D,EAAO,CAS9B,QARIhb,EAAI,EACNmD,EAAS,CACP,YAAa,GACb,YAAa,CACd,EACD02E,EAAc,EACdC,EAAc,EAET95E,EAAIgb,EAAM,YAEXA,EAAMhb,CAAC,IAAM25E,IAFU,CAM3B,KAAO3+D,EAAMhb,CAAC,IAAM,KAClB65E,GAAe,IACf75E,IAIF,IAFA65E,GAAe7+D,EAAMhb,GAAG,EAEjBgb,EAAMhb,CAAC,IAAM,KAClB85E,GAAe,IACf95E,IAKF,GAHA85E,GAAe9+D,EAAMhb,GAAG,EAGpB,CAACmD,EAAO,SAAW02E,IAAgBH,GAAgC,CACrE,IAAIK,EAAiB,OAAO,aAAa/+D,EAAMhb,EAAI,CAAC,EAAGgb,EAAMhb,EAAI,CAAC,EAAGgb,EAAMhb,EAAI,CAAC,EAAGgb,EAAMhb,EAAI,CAAC,CAAC,EAC/F,GAAI+5E,IAAmB,OAAQ,CAC7B52E,EAAO,YAAc02E,EACrB12E,EAAO,YAAc22E,EACrB32E,EAAO,QAAU6X,EAAM,SAAShb,EAAGA,EAAI85E,CAAW,EAClD,KACV,MACU32E,EAAO,QAAU,MAEpB,CAEDnD,GAAK85E,EACLD,EAAc,EACdC,EAAc,CACpB,CACI,OAAO32E,CACX,EAEM62E,GAAgB,SAAUC,EAAK,CAejC,OAZIA,EAAI,QAAQ,CAAC,IAAM,MAIlBA,EAAI,QAAQ,CAAC,GAAK,EAAIA,EAAI,QAAQ,CAAC,KAAO,IAI3C,OAAO,aAAaA,EAAI,QAAQ,CAAC,EAAGA,EAAI,QAAQ,CAAC,EAAGA,EAAI,QAAQ,CAAC,EAAGA,EAAI,QAAQ,CAAC,CAAC,IAAM,QAIxFA,EAAI,QAAQ,CAAC,IAAM,EACd,KAIFA,EAAI,QAAQ,SAAS,EAAGA,EAAI,QAAQ,OAAS,CAAC,CACzD,EAEMC,GAAsB,SAAUC,EAAKC,EAAU,CACjD,IAAIj8C,EAAU,CAAE,EACdn+B,EACAkK,EACA2S,EACA7P,EAEF,GAAI,EAAEotE,EAAS,CAAC,EAAI,IAClB,OAAOj8C,EAIT,IADAj0B,EAAQkwE,EAAS,CAAC,EAAI,GACjBp6E,EAAI,EAAGA,EAAIkK,EAAOlK,IACrB6c,EAAS7c,EAAI,EACbgN,EAAO,CACL,KAAMotE,EAASv9D,EAAS,CAAC,EAAI,EAC7B,IAAKs9D,CACb,EAEUC,EAASv9D,EAAS,CAAC,EAAI,IACzB7P,EAAK,OAASotE,EAASv9D,EAAS,CAAC,GAAK,EAAIu9D,EAASv9D,EAAS,CAAC,EAC7DshB,EAAQ,KAAKnxB,CAAI,GAGrB,OAAOmxB,CACR,EACGk8C,GAAoC,SAAUrtE,EAAM,CAOtD,QANIqG,EAASrG,EAAK,WAChBstE,EAAoC,CAAE,EACtCt6E,EAAI,EACJs/B,EACAC,EAEKv/B,EAAIqT,EAAS,GACdrG,EAAKhN,CAAC,IAAM,GAAKgN,EAAKhN,EAAI,CAAC,IAAM,GAAKgN,EAAKhN,EAAI,CAAC,IAAM,GACxDs6E,EAAkC,KAAKt6E,EAAI,CAAC,EAC5CA,GAAK,GAELA,IAKJ,GAAIs6E,EAAkC,SAAW,EAC/C,OAAOttE,EAGTsyB,EAAYjsB,EAASinE,EAAkC,OACvD/6C,EAAU,IAAI,WAAWD,CAAS,EAClC,IAAIE,EAAc,EAClB,IAAKx/B,EAAI,EAAGA,EAAIs/B,EAAWE,IAAex/B,IACpCw/B,IAAgB86C,EAAkC,CAAC,IAErD96C,IAEA86C,EAAkC,MAAO,GAE3C/6C,EAAQv/B,CAAC,EAAIgN,EAAKwyB,CAAW,EAE/B,OAAOD,CACX,EAEMg7C,GAAsB,CACxB,SAAUX,GACV,cAAeI,GACf,oBAAqBE,GACrB,gCAAiCG,GACjC,+BAAgCX,EACjC,EAgBGc,GAAWzJ,EACX0J,GAAeF,GACfG,GAAkB,SAAUn5E,EAAS,CACvCA,EAAUA,GAAW,CAAE,EACvBm5E,GAAgB,UAAU,KAAK,KAAK,IAAI,EAExC,KAAK,kBAAoB,OAAOn5E,EAAQ,kBAAqB,UAAYA,EAAQ,iBAAmB,GACpG,KAAK,gBAAkB,CAAE,EACzB,KAAK,WAAa,CAAC,IAAIo5E,GAAa,EAAG,CAAC,EAExC,IAAIA,GAAa,EAAG,CAAC,EAErB,IAAIA,GAAa,EAAG,CAAC,EAErB,IAAIA,GAAa,EAAG,CAAC,CACpB,EAEG,KAAK,oBACP,KAAK,aAAe,IAAIC,GAAa,CACnC,gBAAiBr5E,EAAQ,eACjC,CAAO,GAGH,KAAK,MAAK,EAEV,KAAK,WAAW,QAAQ,SAAUs5E,EAAI,CACpCA,EAAG,GAAG,OAAQ,KAAK,QAAQ,KAAK,KAAM,MAAM,CAAC,EAC7CA,EAAG,GAAG,cAAe,KAAK,QAAQ,KAAK,KAAM,aAAa,CAAC,EAC3DA,EAAG,GAAG,OAAQ,KAAK,QAAQ,KAAK,KAAM,MAAM,CAAC,CAC9C,EAAE,IAAI,EACH,KAAK,oBACP,KAAK,aAAa,GAAG,OAAQ,KAAK,QAAQ,KAAK,KAAM,MAAM,CAAC,EAC5D,KAAK,aAAa,GAAG,cAAe,KAAK,QAAQ,KAAK,KAAM,aAAa,CAAC,EAC1E,KAAK,aAAa,GAAG,OAAQ,KAAK,QAAQ,KAAK,KAAM,MAAM,CAAC,EAE/D,EACDH,GAAgB,UAAY,IAAIF,GAChCE,GAAgB,UAAU,KAAO,SAAU/lE,EAAO,CAChD,IAAIslE,EAAKG,EAAUU,EAEnB,GAAInmE,EAAM,cAAgB,aAI1BslE,EAAMQ,GAAa,SAAS9lE,EAAM,WAAW,EAEzC,EAACslE,EAAI,SAILA,EAAI,cAAgBQ,GAAa,iCAIrCL,EAAWK,GAAa,cAAcR,CAAG,EAErC,EAACG,IAWL,IAAIzlE,EAAM,IAAM,KAAK,WAAY,CAE/B,KAAK,oBAAsB,GAC3B,MACN,SAAeA,EAAM,MAAQ,KAAK,YAAc,KAAK,oBAAqB,CACpE,KAAK,cACA,KAAK,cAER,KAAK,oBAAsB,IAE7B,MACD,CAEDmmE,EAAoBL,GAAa,oBAAoB9lE,EAAM,IAAKylE,CAAQ,EACxE,KAAK,gBAAkB,KAAK,gBAAgB,OAAOU,CAAiB,EAChE,KAAK,aAAenmE,EAAM,MAC5B,KAAK,YAAc,GAErB,KAAK,cACL,KAAK,WAAaA,EAAM,IACzB,EACD+lE,GAAgB,UAAU,eAAiB,SAAUK,EAAW,CAC9D,KAAK,WAAW,QAAQ,SAAUF,EAAI,CACpC,OAAOE,IAAc,QAAUF,EAAG,MAAO,EAAGA,EAAG,aAAc,CAC9D,EAAE,IAAI,CACR,EACDH,GAAgB,UAAU,YAAc,SAAUK,EAAW,CAE3D,GAAI,CAAC,KAAK,gBAAgB,OAAQ,CAChC,KAAK,eAAeA,CAAS,EAC7B,MACD,CAGD,KAAK,gBAAgB,QAAQ,SAAUrwC,EAAMswC,EAAK,CAChDtwC,EAAK,aAAeswC,CAC1B,CAAK,EAED,KAAK,gBAAgB,KAAK,SAAUt0E,EAAGwF,EAAG,CACxC,OAAIxF,EAAE,MAAQwF,EAAE,IACPxF,EAAE,aAAewF,EAAE,aAErBxF,EAAE,IAAMwF,EAAE,GACvB,CAAK,EACD,KAAK,gBAAgB,QAAQ,SAAU+uE,EAAQ,CACzCA,EAAO,KAAO,EAEhB,KAAK,qBAAqBA,CAAM,EAGhC,KAAK,qBAAqBA,CAAM,CAEnC,EAAE,IAAI,EACP,KAAK,gBAAgB,OAAS,EAC9B,KAAK,eAAeF,CAAS,CAC9B,EACDL,GAAgB,UAAU,MAAQ,UAAY,CAC5C,OAAO,KAAK,YAAY,OAAO,CACnC,EAEEA,GAAgB,UAAU,aAAe,UAAY,CACnD,OAAO,KAAK,YAAY,cAAc,CACvC,EACDA,GAAgB,UAAU,MAAQ,UAAY,CAC5C,KAAK,WAAa,KAClB,KAAK,oBAAsB,GAC3B,KAAK,YAAc,EACnB,KAAK,qBAAuB,CAAC,KAAM,IAAI,EACvC,KAAK,WAAW,QAAQ,SAAUQ,EAAU,CAC1CA,EAAS,MAAO,CACtB,CAAK,CACL,EAaER,GAAgB,UAAU,qBAAuB,SAAUO,EAAQ,CAE7D,KAAK,oBAAoBA,CAAM,EACjC,KAAK,qBAAqBA,EAAO,IAAI,EAAI,KAChC,KAAK,mBAAmBA,CAAM,EACvC,KAAK,qBAAqBA,EAAO,IAAI,EAAI,EAChC,KAAK,mBAAmBA,CAAM,IACvC,KAAK,qBAAqBA,EAAO,IAAI,EAAI,GAEvC,KAAK,qBAAqBA,EAAO,IAAI,IAAM,MAM/C,KAAK,YAAYA,EAAO,MAAQ,GAAK,KAAK,qBAAqBA,EAAO,IAAI,CAAC,EAAE,KAAKA,CAAM,CACzF,EACDP,GAAgB,UAAU,mBAAqB,SAAUO,EAAQ,CAC/D,OAAQA,EAAO,OAAS,SAAY,IACrC,EACDP,GAAgB,UAAU,mBAAqB,SAAUO,EAAQ,CAC/D,OAAQA,EAAO,OAAS,SAAY,IACrC,EACDP,GAAgB,UAAU,oBAAsB,SAAUO,EAAQ,CAChE,OAAQA,EAAO,OAAS,SAAY,MAAWA,EAAO,OAAS,SAAY,OAAWA,EAAO,OAAS,SAAY,IACnH,EACDP,GAAgB,UAAU,qBAAuB,SAAUO,EAAQ,CAC7D,KAAK,mBACP,KAAK,aAAa,KAAKA,CAAM,CAEnC,EAmBE,IAAIE,GAA4B,CAC9B,IAAM,KAEN,KAAQ,GAER,KAAQ,IAER,KAAQ,KAER,KAAQ,IAER,KAAQ,IAER,KAAQ,KAER,KAAQ,KAER,KAAQ,KAER,KAAQ,KAER,KAAQ,KAER,KAAQ,KAER,KAAQ,KAER,KAAQ,IAER,KAAQ,IAER,KAAQ,KAER,KAAQ,IAER,KAAQ,KAER,KAAQ,KAER,KAAQ,KAER,KAAQ,KAER,KAAQ,KAER,KAAQ,KAER,KAAQ,KAER,KAAQ,KAER,KAAQ,KAER,KAAQ,KAER,KAAQ,KACT,EAEGC,GAAqB,SAAU76D,EAAM,CACvC,IAAI86D,EAAUF,GAA0B56D,CAAI,GAAKA,EACjD,OAAIA,EAAO,MAAUA,IAAS86D,EAErB,GAEF,OAAO,aAAaA,CAAO,CACnC,EACGC,GAAqB,SAAUpvE,EAAG,CACpC,MAAO,KAAQA,GAAKA,GAAK,KAAQ,KAAQA,GAAKA,GAAK,GACpD,EACGqvE,GAAe,SAAUC,EAAW,CACtC,KAAK,UAAYA,EACjB,KAAK,MAAO,CACb,EACDD,GAAa,UAAU,MAAQ,UAAY,CACzC,KAAK,UAAW,EAChB,KAAK,eAAiB,GACtB,KAAK,QAAU,CAAE,EACjB,KAAK,QAAU,CAAE,EACjB,KAAK,OAAS,CAAE,EAChB,KAAK,SAAW,GAGhB,KAAK,QAAU,EACf,KAAK,QAAU,EACf,KAAK,WAAa,EAClB,KAAK,SAAW,EAChB,KAAK,oBAAsB,EAC3B,KAAK,eAAiB,EACtB,KAAK,iBAAmB,EACxB,KAAK,YAAc,EACnB,KAAK,SAAW,EAChB,KAAK,gBAAkB,KAAK,SAAW,EACvC,KAAK,YAAc,GACnB,KAAK,YAAc,EACnB,KAAK,SAAW,CACjB,EACDA,GAAa,UAAU,QAAU,UAAY,CAC3C,OAAO,KAAK,KAAK,KAAK;AAAA,CAAI,CAC3B,EACDA,GAAa,UAAU,UAAY,UAAY,CAC7C,KAAK,KAAO,CAAC,EAAE,EACf,KAAK,OAAS,CACf,EACDA,GAAa,UAAU,QAAU,SAAUpB,EAAK,CAS9C,IARI,KAAK,KAAK,QAAU,KAAK,iBAAmB,OAAO,KAAK,mBAAsB,YAChF,KAAK,kBAAkBA,CAAG,EAExB,KAAK,KAAK,OAAS,IACrB,KAAK,KAAK,KAAK,EAAE,EACjB,KAAK,UAGA,KAAK,KAAK,OAAS,KAAK,iBAC7B,KAAK,KAAK,MAAO,EACjB,KAAK,QAER,EACDoB,GAAa,UAAU,QAAU,UAAY,CAC3C,OAAI,KAAK,KAAK,SAAW,EAChB,GACE,KAAK,KAAK,SAAW,EACvB,KAAK,KAAK,CAAC,IAAM,GAEnB,EACR,EACDA,GAAa,UAAU,QAAU,SAAU3xE,EAAM,CAC/C,KAAK,KAAK,KAAK,MAAM,GAAKA,CAC3B,EACD2xE,GAAa,UAAU,UAAY,UAAY,CAC7C,GAAI,CAAC,KAAK,UAAW,CACnB,IAAIn4E,EAAM,KAAK,KAAK,KAAK,MAAM,EAC/B,KAAK,KAAK,KAAK,MAAM,EAAIA,EAAI,OAAO,EAAGA,EAAI,OAAS,CAAC,CAC3D,CACG,EACD,IAAIq4E,GAAgB,SAAUC,EAAYC,EAAU5K,EAAQ,CAC1D,KAAK,WAAa2K,EAClB,KAAK,KAAO,GACZ,KAAK,cAAgB,IAAIH,GAAa,EAAE,EACxC,KAAK,QAAU,CAAE,EACjB,KAAK,OAASxK,EAEV,OAAO4K,GAAa,UACtB,KAAK,kBAAkBA,CAAQ,CAElC,EASDF,GAAc,UAAU,KAAO,SAAUtB,EAAKyB,EAAmB,CAC/D,KAAK,SAAWzB,EAChB,QAASh8E,EAAM,EAAGA,EAAM,EAAGA,IACzB,KAAK,QAAQA,CAAG,EAAI,IAAIo9E,GAAap9E,CAAG,EACpC,OAAOy9E,GAAsB,aAC/B,KAAK,QAAQz9E,CAAG,EAAE,kBAAoBy9E,EAG3C,EAODH,GAAc,UAAU,iBAAmB,SAAUD,EAAW,CAC9D,KAAK,cAAgB,KAAK,QAAQA,CAAS,CAC5C,EAKDC,GAAc,UAAU,kBAAoB,SAAUE,EAAU,CAC9D,GAAI,OAAO,YAAgB,IACzB,KAAK,OAAO,QAAQ,MAAO,CACzB,MAAO,OACP,QAAS,kEACjB,CAAO,MAED,IAAI,CACF,KAAK,aAAe,IAAI,YAAYA,CAAQ,CAC7C,OAAQ18E,EAAO,CACd,KAAK,OAAO,QAAQ,MAAO,CACzB,MAAO,OACP,QAAS,yCAA2C08E,EAAW,cAAgB18E,CACzF,CAAS,CACT,CAEG,EACD,IAAI27E,GAAe,SAAUr5E,EAAS,CACpCA,EAAUA,GAAW,CAAE,EACvBq5E,GAAa,UAAU,KAAK,KAAK,IAAI,EACrC,IAAIhtE,EAAO,KACPomB,EAAkBzyB,EAAQ,iBAAmB,CAAE,EAC/Cs6E,EAA0B,CAAE,EAC5BC,EAEJ,OAAO,KAAK9nD,CAAe,EAAE,QAAQ+nD,GAAe,CAClDD,EAAe9nD,EAAgB+nD,CAAW,EACtC,WAAW,KAAKA,CAAW,IAC7BF,EAAwBE,CAAW,EAAID,EAAa,SAE5D,CAAK,EACD,KAAK,iBAAmBD,EACxB,KAAK,iBAAmB,KACxB,KAAK,SAAW,CAAE,EAClB,KAAK,KAAO,SAAUZ,EAAQ,CACxBA,EAAO,OAAS,GAElBrtE,EAAK,aAAc,EACnBA,EAAK,YAAYqtE,CAAM,IAEnBrtE,EAAK,mBAAqB,MAE5BA,EAAK,aAAc,EAErBA,EAAK,YAAYqtE,CAAM,EAE1B,CACF,EACDL,GAAa,UAAY,IAAIJ,GAK7BI,GAAa,UAAU,aAAe,UAAY,CAC5C,KAAK,mBAAqB,MAC5B,KAAK,cAAe,EAEtB,KAAK,iBAAmB,CACtB,KAAM,CAAE,EACR,QAAS,CAAA,CACV,CACF,EAKDA,GAAa,UAAU,YAAc,SAAUK,EAAQ,CACrD,IAAIjuE,EAAOiuE,EAAO,OACde,EAAQhvE,IAAS,EACjBivE,EAAQjvE,EAAO,IAGnB,KAAK,iBAAiB,QAAQ,KAAKiuE,EAAO,GAAG,EAC7C,KAAK,iBAAiB,KAAK,KAAKe,CAAK,EACrC,KAAK,iBAAiB,KAAK,KAAKC,CAAK,CACtC,EAKDrB,GAAa,UAAU,cAAgB,UAAY,CACjD,IAAIsB,EAAY,KAAK,iBACjBC,EAAaD,EAAU,KACvBR,EAAa,KACbU,EAAY,KACZp8E,EAAI,EACJkM,EAAIiwE,EAAWn8E,GAAG,EAItB,IAHAk8E,EAAU,IAAMhwE,GAAK,EACrBgwE,EAAU,SAAWhwE,EAAI,GAElBlM,EAAIm8E,EAAW,OAAQn8E,IAC5BkM,EAAIiwE,EAAWn8E,GAAG,EAClB07E,EAAaxvE,GAAK,EAClBkwE,EAAYlwE,EAAI,GAEZwvE,IAAe,GAAKU,EAAY,IAElClwE,EAAIiwE,EAAWn8E,GAAG,EAClB07E,EAAaxvE,GAEf,KAAK,iBAAiBwvE,EAAY17E,EAAGo8E,CAAS,EAC1CA,EAAY,IACdp8E,GAAKo8E,EAAY,EAGtB,EAcDxB,GAAa,UAAU,iBAAmB,SAAUc,EAAYn1D,EAAO9Z,EAAM,CAC3E,IAAIP,EACAlM,EAAIumB,EACJ41D,EAAa,KAAK,iBAAiB,KACnChoD,EAAU,KAAK,SAASunD,CAAU,EAItC,IAHKvnD,IACHA,EAAU,KAAK,YAAYunD,EAAY17E,CAAC,GAEnCA,EAAIumB,EAAQ9Z,GAAQzM,EAAIm8E,EAAW,OAAQn8E,IAChDkM,EAAIiwE,EAAWn8E,CAAC,EACZs7E,GAAmBpvE,CAAC,EACtBlM,EAAI,KAAK,WAAWA,EAAGm0B,CAAO,EACrBjoB,IAAM,GACflM,EAAI,KAAK,mBAAmBA,EAAGm0B,CAAO,EAC7BjoB,IAAM,GACflM,EAAI,KAAK,iBAAiBA,EAAGm0B,CAAO,EAC3B,KAAQjoB,GAAKA,GAAK,IAC3BlM,EAAI,KAAK,iBAAiBA,EAAGm0B,CAAO,EAC3B,KAAQjoB,GAAKA,GAAK,IAC3BlM,EAAI,KAAK,aAAaA,EAAGm0B,CAAO,EACvBjoB,IAAM,IACflM,EAAI,KAAK,aAAaA,EAAGm0B,CAAO,EACvBjoB,IAAM,IACflM,EAAI,KAAK,cAAcA,EAAGm0B,CAAO,EACxBjoB,IAAM,IACflM,EAAI,KAAK,eAAeA,EAAGm0B,CAAO,EACzBjoB,IAAM,IACflM,EAAI,KAAK,YAAYA,EAAGm0B,CAAO,EACtBjoB,IAAM,IACflM,EAAI,KAAK,cAAcA,EAAGm0B,CAAO,EACxBjoB,IAAM,IACflM,EAAI,KAAK,oBAAoBA,EAAGm0B,CAAO,EAC9BjoB,IAAM,IACflM,EAAI,KAAK,iBAAiBA,EAAGm0B,CAAO,EAC3BjoB,IAAM,IACflM,EAAI,KAAK,YAAYA,EAAGm0B,CAAO,EACtBjoB,IAAM,IACflM,EAAI,KAAK,eAAeA,EAAGm0B,CAAO,EACzBjoB,IAAM,IACfioB,EAAU,KAAK,MAAMn0B,EAAGm0B,CAAO,EACtBjoB,IAAM,EAEfioB,EAAQ,cAAc,UAAW,EACxBjoB,IAAM,GAEfioB,EAAQ,cAAc,UAAW,EACxBjoB,IAAM,GAEfioB,EAAQ,cAAc,eAAiB,GAC9BjoB,IAAM,GAEfioB,EAAQ,cAAc,UAAW,EACxBjoB,IAAM,KAEflM,GAGL,EASD46E,GAAa,UAAU,iBAAmB,SAAU56E,EAAGm0B,EAAS,CAC9D,IAAIgoD,EAAa,KAAK,iBAAiB,KACnCjwE,EAAIiwE,EAAW,EAAEn8E,CAAC,EACtB,OAAIs7E,GAAmBpvE,CAAC,IACtBlM,EAAI,KAAK,WAAWA,EAAGm0B,EAAS,CAC9B,WAAY,EACpB,CAAO,GAEIn0B,CACR,EAQD46E,GAAa,UAAU,OAAS,SAAU1+D,EAAW,CAEnD,OAAO,KAAK,iBAAiB,QAAQ,KAAK,MAAMA,EAAY,CAAC,CAAC,CAC/D,EAQD0+D,GAAa,UAAU,YAAc,SAAUc,EAAY17E,EAAG,CAC5D,IAAI+7E,EAAc,UAAYL,EAC1B9tE,EAAO,KACPmuE,EACAJ,EACJ,OAAII,KAAe,KAAK,mBACtBJ,EAAW,KAAK,iBAAiBI,CAAW,GAE9C,KAAK,SAASL,CAAU,EAAI,IAAID,GAAcC,EAAYC,EAAU/tE,CAAI,EACxE,KAAK,SAAS8tE,CAAU,EAAE,KAAK,KAAK,OAAO17E,CAAC,EAAG,SAAUm6E,EAAK,CAC5DvsE,EAAK,eAAeusE,EAAKvsE,EAAK,SAAS8tE,CAAU,CAAC,CACxD,CAAK,EACM,KAAK,SAASA,CAAU,CAChC,EASDd,GAAa,UAAU,WAAa,SAAU56E,EAAGm0B,EAAS5yB,EAAS,CACjE,IAAI86E,EAAa96E,GAAWA,EAAQ,WAChC+6E,EAAc/6E,GAAWA,EAAQ,YACjC46E,EAAa,KAAK,iBAAiB,KACnCI,EAAWF,EAAa,KAAS,EACjCG,EAAcL,EAAWn8E,CAAC,EAC1By8E,EAAWN,EAAWn8E,EAAI,CAAC,EAC3B7B,EAAMg2B,EAAQ,cACduoD,EACAC,EAEJ,SAASC,EAAYC,EAAW,CAC9B,OAAOA,EAAU,IAAInhE,IACX,KAAOA,EAAO,KAAM,SAAS,EAAE,GAAG,MAAM,EAAE,CACnD,EAAE,KAAK,EAAE,CAChB,CAQI,GAPI4gE,GACFK,EAAgB,CAACH,EAAaC,CAAQ,EACtCz8E,KAEA28E,EAAgB,CAACH,CAAW,EAG1BroD,EAAQ,cAAgB,CAACkoD,EAC3BK,EAAOvoD,EAAQ,aAAa,OAAO,IAAI,WAAWwoD,CAAa,CAAC,UAG5DL,EAAa,CACf,MAAMQ,EAAUF,EAAYD,CAAa,EAEzCD,EAAO,OAAO,aAAa,SAASI,EAAS,EAAE,CAAC,CACxD,MACQJ,EAAOtB,GAAmBmB,EAAWC,CAAW,EAGpD,OAAIr+E,EAAI,gBAAkB,CAACA,EAAI,QAAO,GACpCA,EAAI,QAAQ,KAAK,OAAO6B,CAAC,CAAC,EAE5B7B,EAAI,eAAiB,GACrBA,EAAI,QAAQu+E,CAAI,EACT18E,CACR,EASD46E,GAAa,UAAU,mBAAqB,SAAU56E,EAAGm0B,EAAS,CAChE,IAAIgoD,EAAa,KAAK,iBAAiB,KACnCY,EAAYZ,EAAWn8E,EAAI,CAAC,EAC5Bg9E,EAAab,EAAWn8E,EAAI,CAAC,EACjC,OAAIs7E,GAAmByB,CAAS,GAAKzB,GAAmB0B,CAAU,IAChEh9E,EAAI,KAAK,WAAW,EAAEA,EAAGm0B,EAAS,CAChC,YAAa,EACrB,CAAO,GAEIn0B,CACR,EAWD46E,GAAa,UAAU,iBAAmB,SAAU56E,EAAGm0B,EAAS,CAC9D,IAAIgoD,EAAa,KAAK,iBAAiB,KACnCjwE,EAAIiwE,EAAWn8E,CAAC,EAChBw7E,EAAYtvE,EAAI,EACpB,OAAAioB,EAAQ,iBAAiBqnD,CAAS,EAC3Bx7E,CACR,EAWD46E,GAAa,UAAU,aAAe,SAAU56E,EAAGm0B,EAAS,CAC1D,IAAIgoD,EAAa,KAAK,iBAAiB,KACnCjwE,EAAIiwE,EAAWn8E,CAAC,EAChBw7E,EAAYtvE,EAAI,EACpBioB,EAAQ,iBAAiBqnD,CAAS,EAClC,IAAIr9E,EAAMg2B,EAAQ,cAClB,OAAAjoB,EAAIiwE,EAAW,EAAEn8E,CAAC,EAClB7B,EAAI,SAAW+N,EAAI,KAAS,EAE5B/N,EAAI,SAAW+N,EAAI,KAAS,EAE5B/N,EAAI,YAAc+N,EAAI,IAAS,EAE/B/N,EAAI,SAAW+N,EAAI,EAEnBA,EAAIiwE,EAAW,EAAEn8E,CAAC,EAClB7B,EAAI,qBAAuB+N,EAAI,MAAS,EAExC/N,EAAI,eAAiB+N,EAAI,IAEzBA,EAAIiwE,EAAW,EAAEn8E,CAAC,EAClB7B,EAAI,iBAAmB+N,EAEvBA,EAAIiwE,EAAW,EAAEn8E,CAAC,EAClB7B,EAAI,aAAe+N,EAAI,MAAS,EAEhC/N,EAAI,SAAW+N,EAAI,GAEnBA,EAAIiwE,EAAW,EAAEn8E,CAAC,EAClB7B,EAAI,YAAc+N,EAAI,GAEtBA,EAAIiwE,EAAW,EAAEn8E,CAAC,EAClB7B,EAAI,aAAe+N,EAAI,KAAS,EAEhC/N,EAAI,SAAW+N,EAAI,EAGnB/N,EAAI,gBAAkBA,EAAI,SAAW,EAC9B6B,CACR,EAWD46E,GAAa,UAAU,oBAAsB,SAAU56E,EAAGm0B,EAAS,CACjE,IAAIgoD,EAAa,KAAK,iBAAiB,KACnCjwE,EAAIiwE,EAAWn8E,CAAC,EAChBi9E,EAAU9oD,EAAQ,cAAc,QACpC,OAAAjoB,EAAIiwE,EAAW,EAAEn8E,CAAC,EAClBi9E,EAAQ,aAAe/wE,EAAI,MAAS,EAEpC+wE,EAAQ,SAAW/wE,EAAI,KAAS,EAEhC+wE,EAAQ,WAAa/wE,EAAI,KAAS,EAElC+wE,EAAQ,SAAW/wE,EAAI,EAEvBA,EAAIiwE,EAAW,EAAEn8E,CAAC,EAClBi9E,EAAQ,YAAc/wE,EAAI,MAAS,EAEnC+wE,EAAQ,WAAa/wE,EAAI,KAAS,EAElC+wE,EAAQ,aAAe/wE,EAAI,KAAS,EAEpC+wE,EAAQ,WAAa/wE,EAAI,EAEzBA,EAAIiwE,EAAW,EAAEn8E,CAAC,EAClBi9E,EAAQ,aAAe/wE,EAAI,MAAS,EAEpC+wE,EAAQ,UAAY/wE,EAAI,KAAS,EAEjC+wE,EAAQ,gBAAkB/wE,EAAI,KAAS,EAEvC+wE,EAAQ,iBAAmB/wE,EAAI,KAAS,EAExC+wE,EAAQ,QAAU/wE,EAAI,EAEtBA,EAAIiwE,EAAW,EAAEn8E,CAAC,EAClBi9E,EAAQ,aAAe/wE,EAAI,MAAS,EAEpC+wE,EAAQ,iBAAmB/wE,EAAI,KAAS,EAExC+wE,EAAQ,cAAgB/wE,EAAI,EAErBlM,CACR,EAQD46E,GAAa,UAAU,eAAiB,SAAUT,EAAKhmD,EAAS,CAI9D,QAHI+oD,EAAgB,CAAA,EAGXC,EAAQ,EAAGA,EAAQ,EAAGA,IACzBhpD,EAAQ,QAAQgpD,CAAK,EAAE,SAAW,CAAChpD,EAAQ,QAAQgpD,CAAK,EAAE,WAC5DD,EAAc,KAAK/oD,EAAQ,QAAQgpD,CAAK,EAAE,SAAS,EAGvDhpD,EAAQ,OAASgmD,EACjBhmD,EAAQ,KAAO+oD,EAAc,KAAK;AAAA;AAAA,CAAM,EACxC,KAAK,YAAY/oD,CAAO,EACxBA,EAAQ,SAAWgmD,CACpB,EAODS,GAAa,UAAU,YAAc,SAAUzmD,EAAS,CAClDA,EAAQ,OAAS,KACnB,KAAK,QAAQ,OAAQ,CACnB,SAAUA,EAAQ,SAClB,OAAQA,EAAQ,OAChB,KAAMA,EAAQ,KACd,OAAQ,SAAWA,EAAQ,UACnC,CAAO,EACDA,EAAQ,KAAO,GACfA,EAAQ,SAAWA,EAAQ,OAE9B,EAWDymD,GAAa,UAAU,eAAiB,SAAU56E,EAAGm0B,EAAS,CAC5D,IAAIgoD,EAAa,KAAK,iBAAiB,KACnCjwE,EAAIiwE,EAAW,EAAEn8E,CAAC,EAClBm6E,EAAM,KAAK,OAAOn6E,CAAC,EACvB,KAAK,eAAem6E,EAAKhmD,CAAO,EAChC,QAASgpD,EAAQ,EAAGA,EAAQ,EAAGA,IACzBjxE,EAAI,GAAQixE,IACdhpD,EAAQ,QAAQgpD,CAAK,EAAE,QAAU,GAGrC,OAAOn9E,CACR,EAWD46E,GAAa,UAAU,YAAc,SAAU56E,EAAGm0B,EAAS,CACzD,IAAIgoD,EAAa,KAAK,iBAAiB,KACnCjwE,EAAIiwE,EAAW,EAAEn8E,CAAC,EAClBm6E,EAAM,KAAK,OAAOn6E,CAAC,EACvB,KAAK,eAAem6E,EAAKhmD,CAAO,EAChC,QAASgpD,EAAQ,EAAGA,EAAQ,EAAGA,IACzBjxE,EAAI,GAAQixE,IACdhpD,EAAQ,QAAQgpD,CAAK,EAAE,QAAU,GAGrC,OAAOn9E,CACR,EAWD46E,GAAa,UAAU,cAAgB,SAAU56E,EAAGm0B,EAAS,CAC3D,IAAIgoD,EAAa,KAAK,iBAAiB,KACnCjwE,EAAIiwE,EAAW,EAAEn8E,CAAC,EAClBm6E,EAAM,KAAK,OAAOn6E,CAAC,EACvB,KAAK,eAAem6E,EAAKhmD,CAAO,EAChC,QAASgpD,EAAQ,EAAGA,EAAQ,EAAGA,IACzBjxE,EAAI,GAAQixE,IACdhpD,EAAQ,QAAQgpD,CAAK,EAAE,SAAW,GAGtC,OAAOn9E,CACR,EAWD46E,GAAa,UAAU,aAAe,SAAU56E,EAAGm0B,EAAS,CAC1D,IAAIgoD,EAAa,KAAK,iBAAiB,KACnCjwE,EAAIiwE,EAAW,EAAEn8E,CAAC,EAClBm6E,EAAM,KAAK,OAAOn6E,CAAC,EACvB,KAAK,eAAem6E,EAAKhmD,CAAO,EAChC,QAASgpD,EAAQ,EAAGA,EAAQ,EAAGA,IACzBjxE,EAAI,GAAQixE,GACdhpD,EAAQ,QAAQgpD,CAAK,EAAE,UAAW,EAGtC,OAAOn9E,CACR,EAWD46E,GAAa,UAAU,cAAgB,SAAU56E,EAAGm0B,EAAS,CAC3D,IAAIgoD,EAAa,KAAK,iBAAiB,KACnCjwE,EAAIiwE,EAAW,EAAEn8E,CAAC,EAClBm6E,EAAM,KAAK,OAAOn6E,CAAC,EACvB,KAAK,eAAem6E,EAAKhmD,CAAO,EAChC,QAASgpD,EAAQ,EAAGA,EAAQ,EAAGA,IACzBjxE,EAAI,GAAQixE,GACdhpD,EAAQ,QAAQgpD,CAAK,EAAE,MAAO,EAGlC,OAAOn9E,CACR,EAWD46E,GAAa,UAAU,iBAAmB,SAAU56E,EAAGm0B,EAAS,CAC9D,IAAIgoD,EAAa,KAAK,iBAAiB,KACnCjwE,EAAIiwE,EAAWn8E,CAAC,EAChBo9E,EAAUjpD,EAAQ,cAAc,QACpC,OAAAjoB,EAAIiwE,EAAW,EAAEn8E,CAAC,EAClBo9E,EAAQ,SAAWlxE,EAAI,MAAS,EAEhCkxE,EAAQ,QAAUlxE,EAAI,KAAS,EAE/BkxE,EAAQ,QAAUlxE,EAAI,EAEtBA,EAAIiwE,EAAW,EAAEn8E,CAAC,EAClBo9E,EAAQ,SAAWlxE,EAAI,MAAS,EAEhCkxE,EAAQ,WAAalxE,EAAI,KAAS,EAElCkxE,EAAQ,UAAYlxE,EAAI,KAAS,EAEjCkxE,EAAQ,UAAYlxE,EAAI,EAEjBlM,CACR,EAWD46E,GAAa,UAAU,YAAc,SAAU56E,EAAGm0B,EAAS,CACzD,IAAIgoD,EAAa,KAAK,iBAAiB,KACnCjwE,EAAIiwE,EAAWn8E,CAAC,EAChBq9E,EAAWlpD,EAAQ,cAAc,SACrC,OAAAjoB,EAAIiwE,EAAW,EAAEn8E,CAAC,EAClBq9E,EAAS,WAAanxE,EAAI,MAAS,EAEnCmxE,EAAS,OAASnxE,EAAI,KAAS,EAE/BmxE,EAAS,SAAWnxE,EAAI,KAAS,EAEjCmxE,EAAS,OAASnxE,EAAI,EAEtBA,EAAIiwE,EAAW,EAAEn8E,CAAC,EAClBq9E,EAAS,WAAanxE,EAAI,MAAS,EAEnCmxE,EAAS,OAASnxE,EAAI,KAAS,EAE/BmxE,EAAS,SAAWnxE,EAAI,KAAS,EAEjCmxE,EAAS,OAASnxE,EAAI,EAEtBA,EAAIiwE,EAAW,EAAEn8E,CAAC,EAClBq9E,EAAS,SAAWnxE,EAAI,KAAS,EAEjCmxE,EAAS,WAAanxE,EAAI,KAAS,EAEnCmxE,EAAS,SAAWnxE,EAAI,EAEjBlM,CACR,EAWD46E,GAAa,UAAU,eAAiB,SAAU56E,EAAGm0B,EAAS,CAC5D,IAAIgoD,EAAa,KAAK,iBAAiB,KACnCjwE,EAAIiwE,EAAWn8E,CAAC,EAChBs9E,EAASnpD,EAAQ,cAAc,OAEnC,OAAAA,EAAQ,cAAc,eAAiB,GACvCjoB,EAAIiwE,EAAW,EAAEn8E,CAAC,EAClBs9E,EAAO,IAAMpxE,EAAI,GAEjBA,EAAIiwE,EAAW,EAAEn8E,CAAC,EAClBs9E,EAAO,OAASpxE,EAAI,GAEblM,CACR,EAWD46E,GAAa,UAAU,MAAQ,SAAU56E,EAAGm0B,EAAS,CACnD,IAAIgmD,EAAM,KAAK,OAAOn6E,CAAC,EACvB,YAAK,eAAem6E,EAAKhmD,CAAO,EACzB,KAAK,YAAYA,EAAQ,WAAYn0B,CAAC,CACjD,EAQE,IAAIu9E,GAAwB,CAC1B,GAAM,IAEN,GAAM,IAEN,GAAM,IAEN,GAAM,IAEN,GAAM,IAEN,IAAM,IAEN,IAAM,IAEN,IAAM,IAEN,IAAM,IAEN,IAAM,KAEN,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,KAER,IAAQ,IAER,IAAQ,IAER,IAAQ,KAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,KAER,IAAQ,IAER,IAAQ,GAER,IAAQ,GAER,IAAQ,KAER,IAAQ,IAER,IAAQ,KAER,IAAQ,KAER,IAAQ,KAER,IAAQ,KAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,GAER,IAAQ,GAER,IAAQ,GAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,KAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,IAER,IAAQ,KAER,IAAQ,KAER,IAAQ,KAER,IAAQ,IACT,EAEGC,GAAkB,SAAUj9D,EAAM,CACpC,OAAIA,IAAS,KACJ,IAETA,EAAOg9D,GAAsBh9D,CAAI,GAAKA,EAC/B,OAAO,aAAaA,CAAI,EACnC,EAEMk9D,GAAa,GAGbC,GAAO,CAAC,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,IAAM,EAK9HC,GAAsB,UAAY,CAGpC,QAFIx6E,EAAS,CAAE,EACbnD,EAAIy9E,GAAa,EACZz9E,KACLmD,EAAO,KAAK,CACV,KAAM,GACN,OAAQ,EACR,OAAQ,CAChB,CAAO,EAEH,OAAOA,CACR,EACGw3E,GAAe,SAAUiD,EAAOC,EAAa,CAC/ClD,GAAa,UAAU,KAAK,KAAK,IAAI,EACrC,KAAK,OAASiD,GAAS,EACvB,KAAK,aAAeC,GAAe,EACnC,KAAK,MAAQ,OAAS,KAAK,QAAU,EAAI,KAAK,cAAgB,GAC9D,KAAK,aAAc,EACnB,KAAK,MAAO,EACZ,KAAK,KAAO,SAAU5C,EAAQ,CAC5B,IAAIjuE,EAAM8wE,EAAMC,EAAOC,EAAOp0E,EAI9B,GAFAoD,EAAOiuE,EAAO,OAAS,MAEnBjuE,IAAS,KAAK,iBAAkB,CAClC,KAAK,iBAAmB,KACxB,MACD,CASD,IAPKA,EAAO,SAAY,KACtB,KAAK,iBAAmBA,EACfA,IAAS,KAAK,WACvB,KAAK,iBAAmB,MAE1B+wE,EAAQ/wE,IAAS,EACjBgxE,EAAQhxE,EAAO,IACXA,IAAS,KAAK,SAEX,GAAIA,IAAS,KAAK,wBACvB,KAAK,MAAQ,gBACJA,IAAS,KAAK,gBAKvB,KAAK,MAAQ,QACb,KAAK,gBAAgBiuE,EAAO,GAAG,EAE/B,KAAK,eAAeA,EAAO,GAAG,EAE9B6C,EAAO,KAAK,WACZ,KAAK,WAAa,KAAK,cACvB,KAAK,cAAgBA,EAErB,KAAK,UAAY7C,EAAO,YACfjuE,IAAS,KAAK,gBACvB,KAAK,YAAc,EACnB,KAAK,UAAUiuE,EAAO,GAAG,UAChBjuE,IAAS,KAAK,gBACvB,KAAK,YAAc,EACnB,KAAK,UAAUiuE,EAAO,GAAG,UAChBjuE,IAAS,KAAK,gBACvB,KAAK,YAAc,EACnB,KAAK,UAAUiuE,EAAO,GAAG,UAChBjuE,IAAS,KAAK,iBACvB,KAAK,gBAAgBiuE,EAAO,GAAG,EAC/B,KAAK,eAAeA,EAAO,GAAG,EAC9B,KAAK,aAAc,EACnB,KAAK,UAAYA,EAAO,YACfjuE,IAAS,KAAK,WACnB,KAAK,QAAU,QACjB,KAAK,cAAc,KAAK,IAAI,EAAE,KAAO,KAAK,cAAc,KAAK,IAAI,EAAE,KAAK,MAAM,EAAG,EAAE,EAEnF,KAAK,WAAW,KAAK,IAAI,EAAE,KAAO,KAAK,WAAW,KAAK,IAAI,EAAE,KAAK,MAAM,EAAG,EAAE,UAEtEA,IAAS,KAAK,wBACvB,KAAK,eAAeiuE,EAAO,GAAG,EAC9B,KAAK,WAAa0C,GAAqB,UAC9B3wE,IAAS,KAAK,4BACvB,KAAK,cAAgB2wE,GAAqB,UACjC3wE,IAAS,KAAK,0BACnB,KAAK,QAAU,YAGjB,KAAK,eAAeiuE,EAAO,GAAG,EAC9B,KAAK,WAAa0C,GAAqB,GAEzC,KAAK,MAAQ,UACb,KAAK,UAAY1C,EAAO,YACf,KAAK,mBAAmB8C,EAAOC,CAAK,EAK7CD,GAASA,EAAQ,IAAS,EAC1Bn0E,EAAO4zE,GAAgBO,EAAQC,CAAK,EACpC,KAAK,KAAK,KAAK,EAAE/C,EAAO,IAAKrxE,CAAI,EACjC,KAAK,kBACI,KAAK,eAAem0E,EAAOC,CAAK,EAMrC,KAAK,QAAU,QACjB,KAAK,cAAc,KAAK,IAAI,EAAE,KAAO,KAAK,cAAc,KAAK,IAAI,EAAE,KAAK,MAAM,EAAG,EAAE,EAEnF,KAAK,WAAW,KAAK,IAAI,EAAE,KAAO,KAAK,WAAW,KAAK,IAAI,EAAE,KAAK,MAAM,EAAG,EAAE,EAM/ED,GAASA,EAAQ,IAAS,EAC1Bn0E,EAAO4zE,GAAgBO,EAAQC,CAAK,EACpC,KAAK,KAAK,KAAK,EAAE/C,EAAO,IAAKrxE,CAAI,EACjC,KAAK,kBACI,KAAK,aAAam0E,EAAOC,CAAK,EAEvC,KAAK,gBAAgB/C,EAAO,GAAG,EAG/B,KAAK,KAAK,KAAK,EAAEA,EAAO,IAAK,GAAG,EAChC,KAAK,WACA+C,EAAQ,MAAS,IACpB,KAAK,cAAc/C,EAAO,IAAK,CAAC,GAAG,CAAC,GAEjC+C,EAAQ,KAAS,GACpB,KAAK,cAAc/C,EAAO,IAAK,CAAC,GAAG,CAAC,UAE7B,KAAK,oBAAoB8C,EAAOC,CAAK,EAAG,CAKjD,MAAMnhE,EAASmhE,EAAQ,EAGvB,KAAK,cAAc,KAAK,IAAI,EAAE,OAASnhE,EACvC,KAAK,SAAWA,CACjB,SAAU,KAAK,MAAMkhE,EAAOC,CAAK,EAAG,CAGnC,IAAI56E,EAAMs6E,GAAK,QAAQ1wE,EAAO,IAAM,EAuBpC,GArBI,KAAK,QAAU,WAIb5J,EAAM,KAAK,YAAc,EAAI,IAC/BA,EAAM,KAAK,YAAc,GAE3B,KAAK,UAAU63E,EAAO,IAAK73E,CAAG,GAI5BA,IAAQ,KAAK,MAAQA,GAAO,GAAKA,GAAO,KAE1C,KAAK,gBAAgB63E,EAAO,GAAG,EAC/B,KAAK,KAAO73E,GAIV46E,EAAQ,GAAO,KAAK,YAAY,QAAQ,GAAG,IAAM,IACnD,KAAK,cAAc/C,EAAO,IAAK,CAAC,GAAG,CAAC,GAEjCjuE,EAAO,MAAU,GAAM,CAK1B,MAAMixE,GAAgBjxE,EAAO,KAAQ,EACrC,KAAK,QAAUixE,EAAe,EAE9B,KAAK,cAAc,KAAK,IAAI,EAAE,QAAUA,CAClD,CACY,KAAK,WAAWD,CAAK,IAKlBA,EAAQ,MAAS,IACpB,KAAK,cAAc/C,EAAO,IAAK,CAAC,GAAG,CAAC,CAGzC,MAAU,KAAK,aAAa8C,CAAK,IAC5BC,IAAU,IACZA,EAAQ,MAEVp0E,EAAO4zE,GAAgBO,CAAK,EAC5Bn0E,GAAQ4zE,GAAgBQ,CAAK,EAC7B,KAAK,KAAK,KAAK,EAAE/C,EAAO,IAAKrxE,CAAI,EACjC,KAAK,SAAWA,EAAK,OAExB,CACF,EAED+wE,GAAa,UAAY,IAAIH,GAG7BG,GAAa,UAAU,eAAiB,SAAUR,EAAK,CACrD,MAAM+D,EAAa76E,GAAS,CAC1B,KAAK,QAAQ,MAAO,CAClB,MAAO,OACP,QAAS,6CAA+CA,EAAQ,GACxE,CAAO,CACF,EACK8iC,EAAU,CAAE,EAClB,KAAK,WAAW,QAAQ,CAAC/iC,EAAKpD,IAAM,CAClC,GAAIoD,GAAOA,EAAI,MAAQA,EAAI,KAAK,OAAQ,CACtC,GAAI,CAEFA,EAAI,KAAOA,EAAI,KAAK,KAAM,CAC3B,MAAW,CAIV86E,EAAWl+E,CAAC,CACb,CAGGoD,EAAI,KAAK,QACX+iC,EAAQ,KAAK,CAEX,KAAM/iC,EAAI,KAEV,KAAMpD,EAAI,EAIV,SAAU,GAAK,KAAK,IAAI,GAAIoD,EAAI,OAAS,EAAE,EAAIA,EAAI,OAAS,GACxE,CAAW,CAEJ,MAA+BA,GAAQ,MACtC86E,EAAWl+E,CAAC,CAEpB,CAAK,EACGmmC,EAAQ,QACV,KAAK,QAAQ,OAAQ,CACnB,SAAU,KAAK,UACf,OAAQg0C,EACR,QAAAh0C,EACA,OAAQ,KAAK,KACrB,CAAO,CAEJ,EAKDw0C,GAAa,UAAU,MAAQ,UAAY,CACzC,KAAK,MAAQ,QAKb,KAAK,QAAU,EACf,KAAK,UAAY,EACjB,KAAK,WAAagD,GAAqB,EACvC,KAAK,cAAgBA,GAAqB,EAC1C,KAAK,iBAAmB,KAExB,KAAK,QAAU,EACf,KAAK,KAAOF,GACZ,KAAK,YAAc,EAEnB,KAAK,YAAc,CAAE,CACtB,EAKD9C,GAAa,UAAU,aAAe,UAAY,CAa5C,KAAK,eAAiB,GACxB,KAAK,MAAQ,GACb,KAAK,KAAO,GACZ,KAAK,UAAY,GAAO,KAAK,SAAW,EACxC,KAAK,QAAU,IACN,KAAK,eAAiB,IAC/B,KAAK,MAAQ,GACb,KAAK,KAAO,GACZ,KAAK,UAAY,GAAO,KAAK,SAAW,EACxC,KAAK,QAAU,IAMjB,KAAK,SAAW,EAEhB,KAAK,wBAA0B,KAAK,SAAW,GAC/C,KAAK,gBAAkB,KAAK,SAAW,GAEvC,KAAK,gBAAkB,KAAK,SAAW,GACvC,KAAK,gBAAkB,KAAK,SAAW,GACvC,KAAK,gBAAkB,KAAK,SAAW,GACvC,KAAK,iBAAmB,KAAK,SAAW,GAExC,KAAK,0BAA4B,KAAK,SAAW,GAEjD,KAAK,WAAa,KAAK,SAAW,GAClC,KAAK,wBAA0B,KAAK,SAAW,GAC/C,KAAK,4BAA8B,KAAK,SAAW,EACpD,EAaDA,GAAa,UAAU,mBAAqB,SAAUoD,EAAOC,EAAO,CAClE,OAAOD,IAAU,KAAK,MAAQC,GAAS,IAAQA,GAAS,EACzD,EAaDrD,GAAa,UAAU,eAAiB,SAAUoD,EAAOC,EAAO,CAC9D,OAAQD,IAAU,KAAK,KAAO,GAAKA,IAAU,KAAK,KAAO,IAAMC,GAAS,IAAQA,GAAS,EAC1F,EAaDrD,GAAa,UAAU,aAAe,SAAUoD,EAAOC,EAAO,CAC5D,OAAOD,IAAU,KAAK,MAAQC,GAAS,IAAQA,GAAS,EACzD,EAaDrD,GAAa,UAAU,oBAAsB,SAAUoD,EAAOC,EAAO,CACnE,OAAOD,IAAU,KAAK,SAAWC,GAAS,IAAQA,GAAS,EAC5D,EAaDrD,GAAa,UAAU,MAAQ,SAAUoD,EAAOC,EAAO,CACrD,OAAOD,GAAS,KAAK,OAASA,EAAQ,KAAK,MAAQ,GAAKC,GAAS,IAAQA,GAAS,GACnF,EAWDrD,GAAa,UAAU,WAAa,SAAUqD,EAAO,CACnD,OAAOA,GAAS,IAAQA,GAAS,IAAQA,GAAS,IAAQA,GAAS,GACpE,EAUDrD,GAAa,UAAU,aAAe,SAAU+B,EAAM,CACpD,OAAOA,GAAQ,IAAQA,GAAQ,GAChC,EASD/B,GAAa,UAAU,UAAY,SAAUR,EAAKgE,EAAY,CAU5D,GARI,KAAK,QAAU,WACjB,KAAK,KAAOV,GACZ,KAAK,MAAQ,SAEb,KAAK,eAAetD,CAAG,EACvB,KAAK,cAAgBwD,GAAqB,EAC1C,KAAK,WAAaA,GAAqB,GAErCQ,IAAe,QAAaA,IAAe,KAAK,KAElD,QAASn+E,EAAI,EAAGA,EAAI,KAAK,YAAaA,IACpC,KAAK,WAAWm+E,EAAan+E,CAAC,EAAI,KAAK,WAAW,KAAK,KAAOA,CAAC,EAC/D,KAAK,WAAW,KAAK,KAAOA,CAAC,EAAI,CAC/B,KAAM,GACN,OAAQ,EACR,OAAQ,CACT,EAGDm+E,IAAe,SACjBA,EAAa,KAAK,MAEpB,KAAK,QAAUA,EAAa,KAAK,YAAc,CACnD,EAGExD,GAAa,UAAU,cAAgB,SAAUR,EAAK5jD,EAAQ,CAC5D,KAAK,YAAc,KAAK,YAAY,OAAOA,CAAM,EACjD,IAAI3sB,EAAO2sB,EAAO,OAAO,SAAU3sB,EAAM2sB,EAAQ,CAC/C,OAAO3sB,EAAO,IAAM2sB,EAAS,GAC9B,EAAE,EAAE,EACL,KAAK,KAAK,KAAK,EAAE4jD,EAAKvwE,CAAI,CAC9B,EAGE+wE,GAAa,UAAU,gBAAkB,SAAUR,EAAK,CACtD,GAAK,KAAK,YAAY,OAGtB,KAAIvwE,EAAO,KAAK,YAAY,QAAS,EAAC,OAAO,SAAUA,EAAM2sB,EAAQ,CACnE,OAAO3sB,EAAO,KAAO2sB,EAAS,GAC/B,EAAE,EAAE,EACL,KAAK,YAAc,CAAE,EACrB,KAAK,KAAK,KAAK,EAAE4jD,EAAKvwE,CAAI,EAC9B,EAEE+wE,GAAa,UAAU,MAAQ,SAAUR,EAAKvwE,EAAM,CAClD,IAAIw0E,EAAU,KAAK,cAAc,KAAK,IAAI,EAAE,KAE5CA,GAAWx0E,EACX,KAAK,cAAc,KAAK,IAAI,EAAE,KAAOw0E,CACtC,EACDzD,GAAa,UAAU,OAAS,SAAUR,EAAKvwE,EAAM,CACnD,IAAIw0E,EAAU,KAAK,WAAW,KAAK,IAAI,EAAE,KACzCA,GAAWx0E,EACX,KAAK,WAAW,KAAK,IAAI,EAAE,KAAOw0E,CACnC,EACDzD,GAAa,UAAU,aAAe,UAAY,CAChD,IAAI36E,EAEJ,IAAKA,EAAI,EAAGA,EAAI,KAAK,QAASA,IAC5B,KAAK,WAAWA,CAAC,EAAI,CACnB,KAAM,GACN,OAAQ,EACR,OAAQ,CACT,EAEH,IAAKA,EAAI,KAAK,KAAO,EAAGA,EAAIy9E,GAAa,EAAGz9E,IAC1C,KAAK,WAAWA,CAAC,EAAI,CACnB,KAAM,GACN,OAAQ,EACR,OAAQ,CACT,EAGH,IAAKA,EAAI,KAAK,QAASA,EAAI,KAAK,KAAMA,IACpC,KAAK,WAAWA,CAAC,EAAI,KAAK,WAAWA,EAAI,CAAC,EAG5C,KAAK,WAAW,KAAK,IAAI,EAAI,CAC3B,KAAM,GACN,OAAQ,EACR,OAAQ,CACT,CACF,EACD26E,GAAa,UAAU,QAAU,SAAUR,EAAKvwE,EAAM,CACpD,IAAIw0E,EAAU,KAAK,WAAW,KAAK,IAAI,EAAE,KACzCA,GAAWx0E,EACX,KAAK,WAAW,KAAK,IAAI,EAAE,KAAOw0E,CACtC,EAEE,IAAIC,GAAgB,CAClB,cAAe3D,GACf,aAAcC,GACd,aAAcC,EACf,EAQG0D,GAAc,CAChB,iBAAkB,GAClB,iBAAkB,GAClB,qBAAsB,EACvB,EAYGC,GAAWxN,EACXyN,GAAS,WACTC,GAAY,WACZC,GAAc,SACdC,GAAmB,SAAUl8E,EAAOkJ,EAAW,CACjD,IAAIuyC,EAAY,EAahB,IAZIz7C,EAAQkJ,IAQVuyC,EAAY,IAIP,KAAK,IAAIvyC,EAAYlJ,CAAK,EAAIg8E,IACnCh8E,GAASy7C,EAAYsgC,GAEvB,OAAO/7E,CACR,EACGm8E,GAA4B,SAAUp+E,EAAM,CAC9C,IAAIq+E,EAASC,EACbF,GAA0B,UAAU,KAAK,KAAK,IAAI,EAIlD,KAAK,MAAQp+E,GAAQk+E,GACrB,KAAK,KAAO,SAAU1xE,EAAM,CAW1B,GAAIA,EAAK,OAAS,WAAY,CAC5B,KAAK,QAAQ,OAAQA,CAAI,EACzB,MACD,CAGG,KAAK,QAAU0xE,IAAe1xE,EAAK,OAAS,KAAK,QAGjD8xE,IAAiB,SACnBA,EAAe9xE,EAAK,KAEtBA,EAAK,IAAM2xE,GAAiB3xE,EAAK,IAAK8xE,CAAY,EAClD9xE,EAAK,IAAM2xE,GAAiB3xE,EAAK,IAAK8xE,CAAY,EAClDD,EAAU7xE,EAAK,IACf,KAAK,QAAQ,OAAQA,CAAI,EAC1B,EACD,KAAK,MAAQ,UAAY,CACvB8xE,EAAeD,EACf,KAAK,QAAQ,MAAM,CACpB,EACD,KAAK,YAAc,UAAY,CAC7B,KAAK,MAAO,EACZ,KAAK,QAAQ,eAAe,CAC7B,EACD,KAAK,cAAgB,UAAY,CAC/BC,EAAe,OACfD,EAAU,MACX,EACD,KAAK,MAAQ,UAAY,CACvB,KAAK,cAAe,EACpB,KAAK,QAAQ,OAAO,CACrB,CACF,EACDD,GAA0B,UAAY,IAAIL,GAC1C,IAAIQ,GAA0B,CAC5B,wBAAyBH,GACzB,eAAgBD,EACpB,EAEMK,GAAsB,CAACC,EAAY32E,EAAS42E,IAAc,CAC5D,GAAI,CAACD,EACH,MAAO,GAGT,QADIE,EAAeD,EACZC,EAAeF,EAAW,OAAQE,IACvC,GAAIF,EAAWE,CAAY,IAAM72E,EAC/B,OAAO62E,EAGX,MAAO,EACR,EACGF,GAAa,CACf,kBAAmBD,EACpB,EAWGI,GAAoBH,GAAW,kBAGjCI,GAA8B,CAO5B,KAAM,CACP,EAGDC,GAAkB,SAAUtkE,EAAOuL,EAAOC,EAAK,CAC7C,IAAIxmB,EACFmD,EAAS,GACX,IAAKnD,EAAIumB,EAAOvmB,EAAIwmB,EAAKxmB,IACvBmD,GAAU,KAAO,KAAO6X,EAAMhb,CAAC,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,EAEzD,OAAOmD,CACR,EAGDo8E,GAAY,SAAUvkE,EAAOuL,EAAOC,EAAK,CACvC,OAAO,mBAAmB84D,GAAgBtkE,EAAOuL,EAAOC,CAAG,CAAC,CAC7D,EAGDg5D,GAAkB,SAAUxkE,EAAOuL,EAAOC,EAAK,CAC7C,OAAO,SAAS84D,GAAgBtkE,EAAOuL,EAAOC,CAAG,CAAC,CACnD,EACDi5D,GAAyB,SAAUzyE,EAAM,CACvC,OAAOA,EAAK,CAAC,GAAK,GAAKA,EAAK,CAAC,GAAK,GAAKA,EAAK,CAAC,GAAK,EAAIA,EAAK,CAAC,CAC7D,EACD0yE,GAAe,CACb,KAAQ,SAAU3J,EAAO,CACvB,IAAI/1E,EAAI,EACN2/E,EACAC,EACAC,EAAiB,MACf9J,EAAM,KAAK,CAAC,IAAMsJ,GAA4B,OAKlDM,EAAmBP,GAAkBrJ,EAAM,KAAM,EAAG/1E,CAAC,EACjD,EAAA2/E,EAAmB,KAKvB5J,EAAM,SAAWyJ,GAAgBzJ,EAAM,KAAM/1E,EAAG2/E,CAAgB,EAChE3/E,EAAI2/E,EAAmB,EAEvB5J,EAAM,YAAcA,EAAM,KAAK/1E,CAAC,EAChCA,IACA4/E,EAAsBR,GAAkBrJ,EAAM,KAAM,EAAG/1E,CAAC,EACpD,EAAA4/E,EAAsB,KAK1B7J,EAAM,YAAcwJ,GAAUxJ,EAAM,KAAM/1E,EAAG4/E,CAAmB,EAChE5/E,EAAI4/E,EAAsB,EACtB7J,EAAM,WAAa8J,EAErB9J,EAAM,IAAMyJ,GAAgBzJ,EAAM,KAAM/1E,EAAG+1E,EAAM,KAAK,MAAM,EAG5DA,EAAM,YAAcA,EAAM,KAAK,SAAS/1E,EAAG+1E,EAAM,KAAK,MAAM,IAE/D,EACD,KAAM,SAAUA,EAAO,CACjBA,EAAM,KAAK,CAAC,IAAMsJ,GAA4B,OAMlDtJ,EAAM,MAAQwJ,GAAUxJ,EAAM,KAAM,EAAGA,EAAM,KAAK,MAAM,EAAE,QAAQ,OAAQ,EAAE,EAE5EA,EAAM,OAASA,EAAM,MAAM,MAAM,IAAI,EACtC,EACD,KAAQ,SAAUA,EAAO,CACvB,IAAI6J,EACA7J,EAAM,KAAK,CAAC,IAAMsJ,GAA4B,OAIlDO,EAAsBR,GAAkBrJ,EAAM,KAAM,EAAG,CAAC,EACpD6J,IAAwB,KAI5B7J,EAAM,YAAcwJ,GAAUxJ,EAAM,KAAM,EAAG6J,CAAmB,EAIhE7J,EAAM,MAAQwJ,GAAUxJ,EAAM,KAAM6J,EAAsB,EAAG7J,EAAM,KAAK,MAAM,EAAE,QAAQ,OAAQ,EAAE,EAClGA,EAAM,KAAOA,EAAM,OACpB,EACD,KAAM,SAAUA,EAAO,CAGrBA,EAAM,IAAMyJ,GAAgBzJ,EAAM,KAAM,EAAGA,EAAM,KAAK,MAAM,EAAE,QAAQ,QAAS,EAAE,CAClF,EACD,KAAQ,SAAUA,EAAO,CACvB,IAAI6J,EACA7J,EAAM,KAAK,CAAC,IAAMsJ,GAA4B,OAIlDO,EAAsBR,GAAkBrJ,EAAM,KAAM,EAAG,CAAC,EACpD6J,IAAwB,KAI5B7J,EAAM,YAAcwJ,GAAUxJ,EAAM,KAAM,EAAG6J,CAAmB,EAIhE7J,EAAM,IAAMyJ,GAAgBzJ,EAAM,KAAM6J,EAAsB,EAAG7J,EAAM,KAAK,MAAM,EAAE,QAAQ,QAAS,EAAE,GACxG,EACD,KAAQ,SAAUA,EAAO,CACvB,IAAI/1E,EACJ,IAAKA,EAAI,EAAGA,EAAI+1E,EAAM,KAAK,OAAQ/1E,IACjC,GAAI+1E,EAAM,KAAK/1E,CAAC,IAAM,EAAG,CAEvB+1E,EAAM,MAAQyJ,GAAgBzJ,EAAM,KAAM,EAAG/1E,CAAC,EAC9C,KACZ,CAEQ+1E,EAAM,YAAcA,EAAM,KAAK,SAAS/1E,EAAI,CAAC,EAC7C+1E,EAAM,KAAOA,EAAM,WAC3B,CACK,EACC+J,GAAmB,SAAU9yE,EAAM,CACrC,IAAI+yE,EACFC,EACAC,EAAa,GACbC,EAAU,EACV1K,EAAS,CAAA,EAGX,GAAI,EAAAxoE,EAAK,OAAS,IAAMA,EAAK,CAAC,IAAM,IAAqBA,EAAK,CAAC,IAAM,IAAqBA,EAAK,CAAC,IAAM,IAOtG,CAAAkzE,EAAUT,GAAuBzyE,EAAK,SAAS,EAAG,EAAE,CAAC,EAGrDkzE,GAAW,GAEX,IAAIC,EAAoBnzE,EAAK,CAAC,EAAI,GAC9BmzE,IAEFF,GAAc,EAEdA,GAAcR,GAAuBzyE,EAAK,SAAS,GAAI,EAAE,CAAC,EAC1DkzE,GAAWT,GAAuBzyE,EAAK,SAAS,GAAI,EAAE,CAAC,GAIzD,EAAG,CAGD,GADA+yE,EAAYN,GAAuBzyE,EAAK,SAASizE,EAAa,EAAGA,EAAa,CAAC,CAAC,EAC5EF,EAAY,EACd,MAEFC,EAAc,OAAO,aAAahzE,EAAKizE,CAAU,EAAGjzE,EAAKizE,EAAa,CAAC,EAAGjzE,EAAKizE,EAAa,CAAC,EAAGjzE,EAAKizE,EAAa,CAAC,CAAC,EACpH,IAAIlK,EAAQ,CACV,GAAIiK,EACJ,KAAMhzE,EAAK,SAASizE,EAAa,GAAIA,EAAaF,EAAY,EAAE,CACjE,EACDhK,EAAM,IAAMA,EAAM,GAEd2J,GAAa3J,EAAM,EAAE,EAEvB2J,GAAa3J,EAAM,EAAE,EAAEA,CAAK,EACnBA,EAAM,GAAG,CAAC,IAAM,IAEzB2J,GAAa,IAAI,EAAE3J,CAAK,EACfA,EAAM,GAAG,CAAC,IAAM,KAEzB2J,GAAa,IAAI,EAAE3J,CAAK,EAE1BP,EAAO,KAAKO,CAAK,EACjBkK,GAAc,GAEdA,GAAcF,CACf,OAAQE,EAAaC,GACtB,OAAO1K,EACR,EACG4K,GAAW,CACb,eAAgBN,GAChB,qBAAsBL,GACtB,aAAcC,EACf,EAYGW,GAAWtP,EACbuP,GAAgBhC,GAChBiC,GAAMH,GACNI,GACFA,GAAiB,SAAUj/E,EAAS,CAClC,IAAIgG,EAAW,CAIX,WAAYhG,GAAWA,EAAQ,UAChC,EAED2+E,EAAU,EAEVpyE,EAAS,CAAE,EAEX2yE,EAAa,EACbzgF,EAKF,GAJAwgF,GAAe,UAAU,KAAK,KAAK,IAAI,EAGvC,KAAK,aAAeF,GAAc,qBAAqB,SAAS,EAAE,EAC9D/4E,EAAS,WACX,IAAKvH,EAAI,EAAGA,EAAIuH,EAAS,WAAW,OAAQvH,IAC1C,KAAK,eAAiB,KAAOuH,EAAS,WAAWvH,CAAC,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,EAG9E,KAAK,KAAO,SAAU2Y,EAAO,CAC3B,IAAIvC,EAAK6pE,EAAYF,EAAWhK,EAAO/1E,EAAGggF,EAC1C,GAAIrnE,EAAM,OAAS,iBAWnB,IALIA,EAAM,yBACR8nE,EAAa,EACb3yE,EAAO,OAAS,GAGdA,EAAO,SAAW,IAAM6K,EAAM,KAAK,OAAS,IAAMA,EAAM,KAAK,CAAC,IAAM,IAAqBA,EAAM,KAAK,CAAC,IAAM,IAAqBA,EAAM,KAAK,CAAC,IAAM,IAAoB,CACxK,KAAK,QAAQ,MAAO,CAClB,MAAO,OACP,QAAS,uCACnB,CAAS,EACD,MACD,CAgBD,GAdA7K,EAAO,KAAK6K,CAAK,EACjB8nE,GAAc9nE,EAAM,KAAK,WAErB7K,EAAO,SAAW,IAKpBoyE,EAAUK,GAAI,qBAAqB5nE,EAAM,KAAK,SAAS,EAAG,EAAE,CAAC,EAG7DunE,GAAW,IAGT,EAAAO,EAAaP,GAUjB,KANA9pE,EAAM,CACJ,KAAM,IAAI,WAAW8pE,CAAO,EAC5B,OAAQ,CAAE,EACV,IAAKpyE,EAAO,CAAC,EAAE,IACf,IAAKA,EAAO,CAAC,EAAE,GAChB,EACI9N,EAAI,EAAGA,EAAIkgF,GACd9pE,EAAI,KAAK,IAAItI,EAAO,CAAC,EAAE,KAAK,SAAS,EAAGoyE,EAAUlgF,CAAC,EAAGA,CAAC,EACvDA,GAAK8N,EAAO,CAAC,EAAE,KAAK,WACpB2yE,GAAc3yE,EAAO,CAAC,EAAE,KAAK,WAC7BA,EAAO,MAAO,EAGhBmyE,EAAa,GACT7pE,EAAI,KAAK,CAAC,EAAI,KAEhB6pE,GAAc,EAEdA,GAAcM,GAAI,qBAAqBnqE,EAAI,KAAK,SAAS,GAAI,EAAE,CAAC,EAEhE8pE,GAAWK,GAAI,qBAAqBnqE,EAAI,KAAK,SAAS,GAAI,EAAE,CAAC,GAI/D,EAAG,CAGD,GADA2pE,EAAYQ,GAAI,qBAAqBnqE,EAAI,KAAK,SAAS6pE,EAAa,EAAGA,EAAa,CAAC,CAAC,EAClFF,EAAY,EAAG,CACjB,KAAK,QAAQ,MAAO,CAClB,MAAO,OACP,QAAS,uEACrB,CAAW,EAGD,KACV,CAoBQ,GAnBAC,EAAc,OAAO,aAAa5pE,EAAI,KAAK6pE,CAAU,EAAG7pE,EAAI,KAAK6pE,EAAa,CAAC,EAAG7pE,EAAI,KAAK6pE,EAAa,CAAC,EAAG7pE,EAAI,KAAK6pE,EAAa,CAAC,CAAC,EACpIlK,EAAQ,CACN,GAAIiK,EACJ,KAAM5pE,EAAI,KAAK,SAAS6pE,EAAa,GAAIA,EAAaF,EAAY,EAAE,CACrE,EACDhK,EAAM,IAAMA,EAAM,GAEdwK,GAAI,aAAaxK,EAAM,EAAE,EAE3BwK,GAAI,aAAaxK,EAAM,EAAE,EAAEA,CAAK,EACvBA,EAAM,GAAG,CAAC,IAAM,IAEzBwK,GAAI,aAAa,IAAI,EAAExK,CAAK,EACnBA,EAAM,GAAG,CAAC,IAAM,KAEzBwK,GAAI,aAAa,IAAI,EAAExK,CAAK,EAI1BA,EAAM,QAAU,+CAAgD,CAClE,IAAI2K,EAAI3K,EAAM,KACZtpE,GAAQi0E,EAAE,CAAC,EAAI,IAAS,GAAKA,EAAE,CAAC,GAAK,GAAKA,EAAE,CAAC,GAAK,GAAKA,EAAE,CAAC,GAAK,EAAIA,EAAE,CAAC,IAAM,EAC9Ej0E,GAAQ,EACRA,GAAQi0E,EAAE,CAAC,EAAI,EACf3K,EAAM,UAAYtpE,EAKd2J,EAAI,MAAQ,QAAaA,EAAI,MAAQ,SACvCA,EAAI,IAAM2/D,EAAM,UAChB3/D,EAAI,IAAM2/D,EAAM,WAElB,KAAK,QAAQ,YAAaA,CAAK,CACzC,CACQ3/D,EAAI,OAAO,KAAK2/D,CAAK,EACrBkK,GAAc,GAEdA,GAAcF,CACf,OAAQE,EAAaC,GACtB,KAAK,QAAQ,OAAQ9pE,CAAG,GACzB,CACF,EACDoqE,GAAe,UAAY,IAAIH,GAC/B,IAAIM,GAAiBH,GAYjBI,GAAW7P,EACb8P,GAAkBxC,GAClByC,GAAgBxC,GAChByC,GAA0BhC,GAAwB,wBAEhDiC,GAAuBC,GAAsBC,GAE7CC,GAAuB,IAEzBC,GAAc,GAMhBJ,GAAwB,UAAY,CAClC,IAAIlzE,EAAS,IAAI,WAAWqzE,EAAoB,EAC9CE,EAAgB,EAClBL,GAAsB,UAAU,KAAK,KAAK,IAAI,EAM9C,KAAK,KAAO,SAAUhmE,EAAO,CAC3B,IAAImQ,EAAa,EACfwF,EAAWwwD,GACXG,EAYF,IATID,GACFC,EAAa,IAAI,WAAWtmE,EAAM,WAAaqmE,CAAa,EAC5DC,EAAW,IAAIxzE,EAAO,SAAS,EAAGuzE,CAAa,CAAC,EAChDC,EAAW,IAAItmE,EAAOqmE,CAAa,EACnCA,EAAgB,GAEhBC,EAAatmE,EAGR2V,EAAW2wD,EAAW,YAAY,CAEvC,GAAIA,EAAWn2D,CAAU,IAAMi2D,IAAeE,EAAW3wD,CAAQ,IAAMywD,GAAa,CAGlF,KAAK,QAAQ,OAAQE,EAAW,SAASn2D,EAAYwF,CAAQ,CAAC,EAC9DxF,GAAcg2D,GACdxwD,GAAYwwD,GACZ,QACD,CAIDh2D,IACAwF,GACD,CAIGxF,EAAam2D,EAAW,aAC1BxzE,EAAO,IAAIwzE,EAAW,SAASn2D,CAAU,EAAG,CAAC,EAC7Ck2D,EAAgBC,EAAW,WAAan2D,EAE3C,EAKD,KAAK,MAAQ,UAAY,CAInBk2D,IAAkBF,IAAwBrzE,EAAO,CAAC,IAAMszE,KAC1D,KAAK,QAAQ,OAAQtzE,CAAM,EAC3BuzE,EAAgB,GAElB,KAAK,QAAQ,MAAM,CACpB,EACD,KAAK,YAAc,UAAY,CAC7B,KAAK,MAAO,EACZ,KAAK,QAAQ,eAAe,CAC7B,EACD,KAAK,MAAQ,UAAY,CACvBA,EAAgB,EAChB,KAAK,QAAQ,OAAO,CACrB,CACF,EACDL,GAAsB,UAAY,IAAIJ,GAMtCK,GAAuB,UAAY,CACjC,IAAIM,EAAUC,EAAUC,EAAU7zE,EAClCqzE,GAAqB,UAAU,KAAK,KAAK,IAAI,EAC7CrzE,EAAO,KACP,KAAK,qBAAuB,CAAE,EAC9B,KAAK,gBAAkB,OACvB2zE,EAAW,SAAU5gF,EAAS+gF,EAAK,CACjC,IAAI7kE,EAAS,EAOT6kE,EAAI,4BACN7kE,GAAUlc,EAAQkc,CAAM,EAAI,GAE1B6kE,EAAI,OAAS,MACfF,EAAS7gF,EAAQ,SAASkc,CAAM,EAAG6kE,CAAG,EAEtCD,EAAS9gF,EAAQ,SAASkc,CAAM,EAAG6kE,CAAG,CAEzC,EACDF,EAAW,SAAU7gF,EAASghF,EAAK,CACjCA,EAAI,eAAiBhhF,EAAQ,CAAC,EAE9BghF,EAAI,oBAAsBhhF,EAAQ,CAAC,EAGnCiN,EAAK,QAAUjN,EAAQ,EAAE,EAAI,KAAS,EAAIA,EAAQ,EAAE,EACpDghF,EAAI,OAAS/zE,EAAK,MACnB,EAUD6zE,EAAW,SAAU9gF,EAASihF,EAAK,CACjC,IAAIC,EAAeC,EAAUC,EAAmBllE,EAMhD,GAAMlc,EAAQ,CAAC,EAAI,EAiBnB,KAbAiN,EAAK,gBAAkB,CACrB,MAAO,KACP,MAAO,KACP,iBAAkB,CAAA,CAC1B,EAEMi0E,GAAiBlhF,EAAQ,CAAC,EAAI,KAAS,EAAIA,EAAQ,CAAC,EACpDmhF,EAAW,EAAID,EAAgB,EAG/BE,GAAqBphF,EAAQ,EAAE,EAAI,KAAS,EAAIA,EAAQ,EAAE,EAE1Dkc,EAAS,GAAKklE,EACPllE,EAASilE,GAAU,CACxB,IAAIE,EAAarhF,EAAQkc,CAAM,EAC3BolE,GAAOthF,EAAQkc,EAAS,CAAC,EAAI,KAAS,EAAIlc,EAAQkc,EAAS,CAAC,EAI5DmlE,IAAelB,GAAc,kBAAoBlzE,EAAK,gBAAgB,QAAU,KAClFA,EAAK,gBAAgB,MAAQq0E,EACpBD,IAAelB,GAAc,kBAAoBlzE,EAAK,gBAAgB,QAAU,KACzFA,EAAK,gBAAgB,MAAQq0E,EACpBD,IAAelB,GAAc,uBAEtClzE,EAAK,gBAAgB,gBAAgB,EAAEq0E,CAAG,EAAID,GAIhDnlE,KAAYlc,EAAQkc,EAAS,CAAC,EAAI,KAAS,EAAIlc,EAAQkc,EAAS,CAAC,GAAK,CACvE,CAED+kE,EAAI,gBAAkBh0E,EAAK,gBAC5B,EAKD,KAAK,KAAO,SAAUqtE,EAAQ,CAC5B,IAAI93E,EAAS,CAAE,EACb0Z,EAAS,EAeX,GAdA1Z,EAAO,0BAA4B,CAAC,EAAE83E,EAAO,CAAC,EAAI,IAElD93E,EAAO,IAAM83E,EAAO,CAAC,EAAI,GACzB93E,EAAO,MAAQ,EACfA,EAAO,KAAO83E,EAAO,CAAC,GAMjBA,EAAO,CAAC,EAAI,MAAU,EAAI,IAC7Bp+D,GAAUo+D,EAAOp+D,CAAM,EAAI,GAGzB1Z,EAAO,MAAQ,EACjBA,EAAO,KAAO,MACdo+E,EAAStG,EAAO,SAASp+D,CAAM,EAAG1Z,CAAM,EACxC,KAAK,QAAQ,OAAQA,CAAM,UAClBA,EAAO,MAAQ,KAAK,OAK7B,IAJAA,EAAO,KAAO,MACdo+E,EAAStG,EAAO,SAASp+D,CAAM,EAAG1Z,CAAM,EACxC,KAAK,QAAQ,OAAQA,CAAM,EAEpB,KAAK,qBAAqB,QAC/B,KAAK,YAAY,MAAM,KAAM,KAAK,qBAAqB,OAAO,OAEvD,KAAK,kBAAoB,OAGlC,KAAK,qBAAqB,KAAK,CAAC83E,EAAQp+D,EAAQ1Z,CAAM,CAAC,EAEvD,KAAK,YAAY83E,EAAQp+D,EAAQ1Z,CAAM,CAE1C,EACD,KAAK,YAAc,SAAU83E,EAAQp+D,EAAQ1Z,EAAQ,CAE/CA,EAAO,MAAQ,KAAK,gBAAgB,MACtCA,EAAO,WAAa29E,GAAc,iBACzB39E,EAAO,MAAQ,KAAK,gBAAgB,MAC7CA,EAAO,WAAa29E,GAAc,iBAIlC39E,EAAO,WAAa,KAAK,gBAAgB,gBAAgB,EAAEA,EAAO,GAAG,EAEvEA,EAAO,KAAO,MACdA,EAAO,KAAO83E,EAAO,SAASp+D,CAAM,EACpC,KAAK,QAAQ,OAAQ1Z,CAAM,CAC5B,CACF,EACD89E,GAAqB,UAAY,IAAIL,GACrCK,GAAqB,aAAe,CAClC,KAAM,GACN,KAAM,EACP,EAUDC,GAAmB,UAAY,CAC7B,IAAItzE,EAAO,KACTs0E,EAAgB,GAEhB7vB,EAAQ,CACN,KAAM,CAAE,EACR,KAAM,CACP,EACD8vB,EAAQ,CACN,KAAM,CAAE,EACR,KAAM,CACP,EACDC,EAAgB,CACd,KAAM,CAAE,EACR,KAAM,CACP,EACDC,EACAC,EAAW,SAAU3hF,EAAS4hF,EAAK,CACjC,IAAIC,EACJ,MAAMC,EAAc9hF,EAAQ,CAAC,GAAK,GAAKA,EAAQ,CAAC,GAAK,EAAIA,EAAQ,CAAC,EAElE4hF,EAAI,KAAO,IAAI,WAIXE,IAAgB,IAIpBF,EAAI,aAAe,GAAK5hF,EAAQ,CAAC,GAAK,EAAIA,EAAQ,CAAC,GAEnD4hF,EAAI,wBAA0B5hF,EAAQ,CAAC,EAAI,KAAU,EAIrD6hF,EAAc7hF,EAAQ,CAAC,EASnB6hF,EAAc,MAIhBD,EAAI,KAAO5hF,EAAQ,CAAC,EAAI,KAAS,IAAMA,EAAQ,EAAE,EAAI,MAAS,IAAMA,EAAQ,EAAE,EAAI,MAAS,IAAMA,EAAQ,EAAE,EAAI,MAAS,GAAKA,EAAQ,EAAE,EAAI,OAAU,EACrJ4hF,EAAI,KAAO,EAEXA,EAAI,MAAQ5hF,EAAQ,EAAE,EAAI,KAAU,EAEpC4hF,EAAI,IAAMA,EAAI,IACVC,EAAc,KAChBD,EAAI,KAAO5hF,EAAQ,EAAE,EAAI,KAAS,IAAMA,EAAQ,EAAE,EAAI,MAAS,IAAMA,EAAQ,EAAE,EAAI,MAAS,IAAMA,EAAQ,EAAE,EAAI,MAAS,GAAKA,EAAQ,EAAE,EAAI,OAAU,EACtJ4hF,EAAI,KAAO,EAEXA,EAAI,MAAQ5hF,EAAQ,EAAE,EAAI,KAAU,IAMxC4hF,EAAI,KAAO5hF,EAAQ,SAAS,EAAIA,EAAQ,CAAC,CAAC,EAC3C,EAID+hF,EAAc,SAAU3R,EAAQvwE,EAAMmiF,EAAY,CAChD,IAAIxG,EAAa,IAAI,WAAWpL,EAAO,IAAI,EACzCp8D,EAAQ,CACN,KAAMnU,CACP,EACDR,EAAI,EACJ6c,EAAS,EACT+lE,EAAkB,GAClBC,GAGF,GAAI,GAAC9R,EAAO,KAAK,QAAUA,EAAO,KAAO,GAKzC,KAFAp8D,EAAM,QAAUo8D,EAAO,KAAK,CAAC,EAAE,IAE1B/wE,EAAI,EAAGA,EAAI+wE,EAAO,KAAK,OAAQ/wE,IAClC6iF,GAAW9R,EAAO,KAAK/wE,CAAC,EACxBm8E,EAAW,IAAI0G,GAAS,KAAMhmE,CAAM,EACpCA,GAAUgmE,GAAS,KAAK,WAG1BP,EAASnG,EAAYxnE,CAAK,EAG1BiuE,EAAkBpiF,IAAS,SAAWmU,EAAM,cAAgBo8D,EAAO,MAE/D4R,GAAcC,KAChB7R,EAAO,KAAO,EACdA,EAAO,KAAK,OAAS,GAInB6R,GACFh1E,EAAK,QAAQ,OAAQ+G,CAAK,EAE7B,EACHusE,GAAiB,UAAU,KAAK,KAAK,IAAI,EAMzC,KAAK,KAAO,SAAUl0E,EAAM,EACzB,CACC,IAAK,UAAY,CAEhB,EACD,IAAK,UAAY,CACf,IAAI+jE,EAAQiR,EACZ,OAAQh1E,EAAK,WAAU,CACrB,KAAK8zE,GAAc,iBACjB/P,EAAS1e,EACT2vB,EAAa,QACb,MACF,KAAKlB,GAAc,iBACjB/P,EAASoR,EACTH,EAAa,QACb,MACF,KAAKlB,GAAc,qBACjB/P,EAASqR,EACTJ,EAAa,iBACb,MACF,QAEE,MACH,CAGGh1E,EAAK,2BACP01E,EAAY3R,EAAQiR,EAAY,EAAI,EAItCjR,EAAO,KAAK,KAAK/jE,CAAI,EACrB+jE,EAAO,MAAQ/jE,EAAK,KAAK,UAC1B,EACD,IAAK,UAAY,CACf,IAAI2H,EAAQ,CACV,KAAM,WACN,OAAQ,CAAA,CACT,EACD0tE,EAAkBr1E,EAAK,gBAEnBq1E,EAAgB,QAAU,MAC5B1tE,EAAM,OAAO,KAAK,CAChB,kBAAmB,CACjB,oBAAqB,CACtB,EACD,GAAI,CAAC0tE,EAAgB,MACrB,MAAO,MACP,KAAM,OACpB,CAAa,EAECA,EAAgB,QAAU,MAC5B1tE,EAAM,OAAO,KAAK,CAChB,kBAAmB,CACjB,oBAAqB,CACtB,EACD,GAAI,CAAC0tE,EAAgB,MACrB,MAAO,OACP,KAAM,OACpB,CAAa,EAEHH,EAAgB,GAChBt0E,EAAK,QAAQ,OAAQ+G,CAAK,CACpC,CACA,GAAS3H,EAAK,IAAI,EAAG,CAChB,EACD,KAAK,MAAQ,UAAY,CACvBqlD,EAAM,KAAO,EACbA,EAAM,KAAK,OAAS,EACpB8vB,EAAM,KAAO,EACbA,EAAM,KAAK,OAAS,EACpB,KAAK,QAAQ,OAAO,CACrB,EAWD,KAAK,cAAgB,UAAY,CAG/BO,EAAYrwB,EAAO,OAAO,EAC1BqwB,EAAYP,EAAO,OAAO,EAC1BO,EAAYN,EAAe,gBAAgB,CAC5C,EACD,KAAK,MAAQ,UAAY,CAIvB,GAAI,CAACF,GAAiBG,EAAiB,CACrC,IAAIT,EAAM,CACR,KAAM,WACN,OAAQ,CAAA,CAClB,EAEYS,EAAgB,QAAU,MAC5BT,EAAI,OAAO,KAAK,CACd,kBAAmB,CACjB,oBAAqB,CACtB,EACD,GAAI,CAACS,EAAgB,MACrB,MAAO,MACP,KAAM,OAClB,CAAW,EAECA,EAAgB,QAAU,MAC5BT,EAAI,OAAO,KAAK,CACd,kBAAmB,CACjB,oBAAqB,CACtB,EACD,GAAI,CAACS,EAAgB,MACrB,MAAO,OACP,KAAM,OAClB,CAAW,EAEHz0E,EAAK,QAAQ,OAAQg0E,CAAG,CAChC,CACMM,EAAgB,GAChB,KAAK,cAAe,EACpB,KAAK,QAAQ,MAAM,CACpB,CACF,EACDhB,GAAiB,UAAY,IAAIN,GACjC,IAAIkC,GAAS,CACX,QAAS,EACT,mBAAoB3B,GACpB,sBAAuBH,GACvB,qBAAsBC,GACtB,iBAAkBC,GAClB,wBAAyBH,GACzB,cAAeF,GAAgB,cAC/B,aAAcA,GAAgB,aAC9B,aAAcA,GAAgB,aAC9B,eAAgBF,EACjB,EACD,QAASngF,MAAQsgF,GACXA,GAAc,eAAetgF,EAAI,IACnCsiF,GAAOtiF,EAAI,EAAIsgF,GAActgF,EAAI,GAGrC,IAAIuiF,GAASD,GAQTE,GAAWjS,EACXkS,GAAqBpL,GAAQ,iBAC7BqL,GACAC,GAA8B,CAAC,KAAO,MAAO,KAAO,KAAO,MAAO,KAAO,KAAO,MAAO,KAAO,KAAO,MAAO,IAAM,IAAI,EAU1HD,GAAe,SAAUE,EAAuB,CAC9C,IAAIt1E,EACFu1E,EAAW,EACbH,GAAa,UAAU,KAAK,KAAK,IAAI,EACrC,KAAK,UAAY,SAAU38D,EAAOC,EAAK,CACrC,KAAK,QAAQ,MAAO,CAClB,MAAO,OACP,QAAS,sBAAsBD,CAAK,OAAOC,CAAG,aAAa68D,CAAQ,mBAC3E,CAAO,CACF,EACD,KAAK,KAAO,SAAUpI,EAAQ,CAC5B,IAAIj7E,EAAI,EACNsjF,EACAC,EACAC,EACAC,EACAC,EAIF,GAHKN,IACHC,EAAW,GAETpI,EAAO,OAAS,QAMpB,CAAIntE,GAAUA,EAAO,QACnB01E,EAAY11E,EACZA,EAAS,IAAI,WAAW01E,EAAU,WAAavI,EAAO,KAAK,UAAU,EACrEntE,EAAO,IAAI01E,CAAS,EACpB11E,EAAO,IAAImtE,EAAO,KAAMuI,EAAU,UAAU,GAE5C11E,EAASmtE,EAAO,KAOlB,QAHI0I,EAGG3jF,EAAI,EAAI8N,EAAO,QAAQ,CAE5B,GAAIA,EAAO9N,CAAC,IAAM,MAAS8N,EAAO9N,EAAI,CAAC,EAAI,OAAU,IAAM,CACrD,OAAO2jF,GAAS,WAClBA,EAAO3jF,GAITA,IACA,QACV,CAgBQ,GAfI,OAAO2jF,GAAS,WAClB,KAAK,UAAUA,EAAM3jF,CAAC,EACtB2jF,EAAO,MAITJ,GAAuB,CAACz1E,EAAO9N,EAAI,CAAC,EAAI,GAAQ,EAIhDsjF,GAAex1E,EAAO9N,EAAI,CAAC,EAAI,IAAS,GAAK8N,EAAO9N,EAAI,CAAC,GAAK,GAAK8N,EAAO9N,EAAI,CAAC,EAAI,MAAS,EAC5FyjF,IAAgB31E,EAAO9N,EAAI,CAAC,EAAI,GAAQ,GAAK,KAC7C0jF,EAAoBD,EAAcR,GAAqBE,IAA6Br1E,EAAO9N,EAAI,CAAC,EAAI,MAAU,CAAC,EAG3G8N,EAAO,WAAa9N,EAAIsjF,EAC1B,MAGF,KAAK,QAAQ,OAAQ,CACnB,IAAKrI,EAAO,IAAMoI,EAAWK,EAC7B,IAAKzI,EAAO,IAAMoI,EAAWK,EAC7B,YAAaD,EACb,iBAAkB31E,EAAO9N,EAAI,CAAC,IAAM,EAAI,GAAQ,EAChD,cAAe8N,EAAO9N,EAAI,CAAC,EAAI,IAAM,GAAK8N,EAAO9N,EAAI,CAAC,EAAI,OAAU,EACpE,WAAYmjF,IAA6Br1E,EAAO9N,EAAI,CAAC,EAAI,MAAU,CAAC,EACpE,wBAAyB8N,EAAO9N,EAAI,CAAC,EAAI,MAAU,EAEnD,WAAY,GAEZ,KAAM8N,EAAO,SAAS9N,EAAI,EAAIujF,EAAqBvjF,EAAIsjF,CAAW,CAC5E,CAAS,EACDD,IACArjF,GAAKsjF,CACb,CACU,OAAOK,GAAS,WAClB,KAAK,UAAUA,EAAM3jF,CAAC,EACtB2jF,EAAO,MAGT71E,EAASA,EAAO,SAAS9N,CAAC,EAC3B,EACD,KAAK,MAAQ,UAAY,CACvBqjF,EAAW,EACX,KAAK,QAAQ,MAAM,CACpB,EACD,KAAK,MAAQ,UAAY,CACvBv1E,EAAS,OACT,KAAK,QAAQ,OAAO,CACrB,EACD,KAAK,YAAc,UAAY,CAC7BA,EAAS,OACT,KAAK,QAAQ,eAAe,CAC7B,CACF,EACDo1E,GAAa,UAAY,IAAIF,GAC7B,IAAIY,GAAOV,GAQPW,GAMJA,GAAc,SAAUC,EAAa,CACnC,IAEEC,EAAwBD,EAAY,WAEpCE,EAAc,EAGdC,EAAuB,EAGzB,KAAK,OAAS,UAAY,CACxB,MAAO,GAAIF,CACjB,EAEI,KAAK,cAAgB,UAAY,CAC/B,MAAO,GAAIA,EAAwBE,CACzC,EAEI,KAAK,SAAW,UAAY,CAC1B,IAAIt3E,EAAWm3E,EAAY,WAAaC,EACtCG,EAAe,IAAI,WAAW,CAAC,EAC/BC,EAAiB,KAAK,IAAI,EAAGJ,CAAqB,EACpD,GAAII,IAAmB,EACrB,MAAM,IAAI,MAAM,oBAAoB,EAEtCD,EAAa,IAAIJ,EAAY,SAASn3E,EAAUA,EAAWw3E,CAAc,CAAC,EAC1EH,EAAc,IAAI,SAASE,EAAa,MAAM,EAAE,UAAU,CAAC,EAE3DD,EAAuBE,EAAiB,EACxCJ,GAAyBI,CAC/B,EAEI,KAAK,SAAW,SAAUj6E,EAAO,CAC/B,IAAIk6E,EAEAH,EAAuB/5E,GACzB85E,IAAgB95E,EAChB+5E,GAAwB/5E,IAExBA,GAAS+5E,EACTG,EAAY,KAAK,MAAMl6E,EAAQ,CAAC,EAChCA,GAASk6E,EAAY,EACrBL,GAAyBK,EACzB,KAAK,SAAU,EACfJ,IAAgB95E,EAChB+5E,GAAwB/5E,EAEhC,EAEI,KAAK,SAAW,SAAUuC,EAAM,CAC9B,IAAI43E,EAAO,KAAK,IAAIJ,EAAsBx3E,CAAI,EAE5C63E,EAAON,IAAgB,GAAKK,EAU9B,OAPAJ,GAAwBI,EACpBJ,EAAuB,EACzBD,IAAgBK,EACPN,EAAwB,GACjC,KAAK,SAAU,EAEjBM,EAAO53E,EAAO43E,EACVA,EAAO,EACFC,GAAQD,EAAO,KAAK,SAASA,CAAI,EAEnCC,CACb,EAEI,KAAK,iBAAmB,UAAY,CAClC,IAAIC,EAEJ,IAAKA,EAAmB,EAAGA,EAAmBN,EAAsB,EAAEM,EACpE,GAAKP,EAAc,aAAeO,EAEhC,OAAAP,IAAgBO,EAChBN,GAAwBM,EACjBA,EAIX,YAAK,SAAU,EACRA,EAAmB,KAAK,iBAAkB,CACvD,EAEI,KAAK,sBAAwB,UAAY,CACvC,KAAK,SAAS,EAAI,KAAK,iBAAgB,CAAE,CAC/C,EAEI,KAAK,cAAgB,UAAY,CAC/B,KAAK,SAAS,EAAI,KAAK,iBAAgB,CAAE,CAC/C,EAEI,KAAK,sBAAwB,UAAY,CACvC,IAAIC,EAAM,KAAK,mBAEf,OAAO,KAAK,SAASA,EAAM,CAAC,EAAI,CACtC,EAEI,KAAK,cAAgB,UAAY,CAC/B,IAAIF,EAAO,KAAK,wBAEhB,MAAI,GAAOA,EAEF,EAAIA,IAAS,EAGf,IAAMA,IAAS,EAC5B,EAGI,KAAK,YAAc,UAAY,CAC7B,OAAO,KAAK,SAAS,CAAC,IAAM,CAClC,EAEI,KAAK,iBAAmB,UAAY,CAClC,OAAO,KAAK,SAAS,CAAC,CACvB,EACD,KAAK,SAAU,CAChB,EACD,IAAIG,GAAYZ,GAQZa,GAAW3T,EACX4T,GAAYF,GACZG,GAAcC,GACdC,GAKJD,GAAgB,UAAY,CAC1B,IAAIE,EAAY,EACd/kF,EACA8N,EACF+2E,GAAc,UAAU,KAAK,KAAK,IAAI,EAStC,KAAK,KAAO,SAAU73E,EAAM,CAC1B,IAAIg4E,EACCl3E,GAGHk3E,EAAa,IAAI,WAAWl3E,EAAO,WAAad,EAAK,KAAK,UAAU,EACpEg4E,EAAW,IAAIl3E,CAAM,EACrBk3E,EAAW,IAAIh4E,EAAK,KAAMc,EAAO,UAAU,EAC3CA,EAASk3E,GALTl3E,EAASd,EAAK,KAiBhB,QAVI5M,EAAM0N,EAAO,WAUVi3E,EAAY3kF,EAAM,EAAG2kF,IAC1B,GAAIj3E,EAAOi3E,EAAY,CAAC,IAAM,EAAG,CAE/B/kF,EAAI+kF,EAAY,EAChB,KACV,CAEM,KAAO/kF,EAAII,GAGT,OAAQ0N,EAAO9N,CAAC,EAAC,CACf,IAAK,GAEH,GAAI8N,EAAO9N,EAAI,CAAC,IAAM,EAAG,CACvBA,GAAK,EACL,KACD,SAAU8N,EAAO9N,EAAI,CAAC,IAAM,EAAG,CAC9BA,IACA,KACD,CAEG+kF,EAAY,IAAM/kF,EAAI,GACxB,KAAK,QAAQ,OAAQ8N,EAAO,SAASi3E,EAAY,EAAG/kF,EAAI,CAAC,CAAC,EAG5D,GACEA,UACO8N,EAAO9N,CAAC,IAAM,GAAKA,EAAII,GAChC2kF,EAAY/kF,EAAI,EAChBA,GAAK,EACL,MACF,IAAK,GAEH,GAAI8N,EAAO9N,EAAI,CAAC,IAAM,GAAK8N,EAAO9N,EAAI,CAAC,IAAM,EAAG,CAC9CA,GAAK,EACL,KACD,CAED,KAAK,QAAQ,OAAQ8N,EAAO,SAASi3E,EAAY,EAAG/kF,EAAI,CAAC,CAAC,EAC1D+kF,EAAY/kF,EAAI,EAChBA,GAAK,EACL,MACF,QAGEA,GAAK,EACL,KACZ,CAGM8N,EAASA,EAAO,SAASi3E,CAAS,EAClC/kF,GAAK+kF,EACLA,EAAY,CACb,EACD,KAAK,MAAQ,UAAY,CACvBj3E,EAAS,KACTi3E,EAAY,EACZ,KAAK,QAAQ,OAAO,CACrB,EACD,KAAK,MAAQ,UAAY,CAEnBj3E,GAAUA,EAAO,WAAa,GAChC,KAAK,QAAQ,OAAQA,EAAO,SAASi3E,EAAY,CAAC,CAAC,EAGrDj3E,EAAS,KACTi3E,EAAY,EACZ,KAAK,QAAQ,MAAM,CACpB,EACD,KAAK,YAAc,UAAY,CAC7B,KAAK,MAAO,EACZ,KAAK,QAAQ,eAAe,CAC7B,CACF,EACDF,GAAc,UAAY,IAAIH,GAI9BI,GAAkC,CAChC,IAAK,GACL,IAAK,GACL,IAAK,GACL,IAAK,GACL,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,IAAK,GACL,IAAK,GAGL,IAAK,GACL,IAAK,GACL,IAAK,EACN,EAMDF,GAAe,UAAY,CACzB,IAAIK,EAAgB,IAAIJ,GACtBj3E,EACAs3E,EACAC,EACAC,EACAhmD,EACAimD,EACAC,EACFV,GAAa,UAAU,KAAK,KAAK,IAAI,EACrCh3E,EAAO,KAaP,KAAK,KAAO,SAAUqtE,EAAQ,CACxBA,EAAO,OAAS,UAGpBiK,EAAUjK,EAAO,QACjBkK,EAAalK,EAAO,IACpBmK,EAAanK,EAAO,IACpBgK,EAAc,KAAKhK,CAAM,EAC1B,EAUDgK,EAAc,GAAG,OAAQ,SAAUj4E,EAAM,CACvC,IAAI2H,EAAQ,CACV,QAASuwE,EACT,IAAKC,EACL,IAAKC,EACL,KAAMp4E,EACN,gBAAiBA,EAAK,CAAC,EAAI,EAC5B,EACD,OAAQ2H,EAAM,gBAAe,CAC3B,IAAK,GACHA,EAAM,YAAc,4CACpB,MACF,IAAK,GACHA,EAAM,YAAc,WACpBA,EAAM,YAAcyqB,EAAgCpyB,EAAK,SAAS,CAAC,CAAC,EACpE,MACF,IAAK,GACH2H,EAAM,YAAc,yBACpBA,EAAM,YAAcyqB,EAAgCpyB,EAAK,SAAS,CAAC,CAAC,EACpE2H,EAAM,OAAS0wE,EAAyB1wE,EAAM,WAAW,EACzD,MACF,IAAK,GACHA,EAAM,YAAc,yBACpB,MACF,IAAK,GACHA,EAAM,YAAc,6BACpB,KACH,CAED/G,EAAK,QAAQ,OAAQ+G,CAAK,CAChC,CAAK,EACDswE,EAAc,GAAG,OAAQ,UAAY,CACnCr3E,EAAK,QAAQ,MAAM,CACzB,CAAK,EACDq3E,EAAc,GAAG,cAAe,UAAY,CAC1Cr3E,EAAK,QAAQ,aAAa,CAChC,CAAK,EACDq3E,EAAc,GAAG,QAAS,UAAY,CACpCr3E,EAAK,QAAQ,OAAO,CAC1B,CAAK,EACDq3E,EAAc,GAAG,gBAAiB,UAAY,CAC5Cr3E,EAAK,QAAQ,eAAe,CAClC,CAAK,EACD,KAAK,MAAQ,UAAY,CACvBq3E,EAAc,MAAO,CACtB,EACD,KAAK,aAAe,UAAY,CAC9BA,EAAc,aAAc,CAC7B,EACD,KAAK,MAAQ,UAAY,CACvBA,EAAc,MAAO,CACtB,EACD,KAAK,YAAc,UAAY,CAC7BA,EAAc,YAAa,CAC5B,EAWDK,EAAkB,SAAUp7E,EAAOq7E,EAAkB,CACnD,IAAIC,EAAY,EACdC,EAAY,EACZ1lC,EACA2lC,EACF,IAAK3lC,EAAI,EAAGA,EAAI71C,EAAO61C,IACjB0lC,IAAc,IAChBC,EAAaH,EAAiB,cAAe,EAC7CE,GAAaD,EAAYE,EAAa,KAAO,KAE/CF,EAAYC,IAAc,EAAID,EAAYC,CAE7C,EAUDrmD,EAAkC,SAAUpyB,EAAM,CAOhD,QANIqG,EAASrG,EAAK,WAChBstE,EAAoC,CAAE,EACtCt6E,EAAI,EACJs/B,EACAC,EAEKv/B,EAAIqT,EAAS,GACdrG,EAAKhN,CAAC,IAAM,GAAKgN,EAAKhN,EAAI,CAAC,IAAM,GAAKgN,EAAKhN,EAAI,CAAC,IAAM,GACxDs6E,EAAkC,KAAKt6E,EAAI,CAAC,EAC5CA,GAAK,GAELA,IAKJ,GAAIs6E,EAAkC,SAAW,EAC/C,OAAOttE,EAGTsyB,EAAYjsB,EAASinE,EAAkC,OACvD/6C,EAAU,IAAI,WAAWD,CAAS,EAClC,IAAIE,EAAc,EAClB,IAAKx/B,EAAI,EAAGA,EAAIs/B,EAAWE,IAAex/B,IACpCw/B,IAAgB86C,EAAkC,CAAC,IAErD96C,IAEA86C,EAAkC,MAAO,GAE3C/6C,EAAQv/B,CAAC,EAAIgN,EAAKwyB,CAAW,EAE/B,OAAOD,CACR,EAWD8lD,EAA2B,SAAUr4E,EAAM,CACzC,IAAI24E,EAAsB,EACxBC,EAAuB,EACvBC,EAAqB,EACrBC,EAAwB,EACxBP,EACAQ,EACAC,EACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GAAW,CAAC,EAAG,CAAC,EAChBC,GACA1mF,GAWF,GAVAulF,EAAmB,IAAIZ,GAAU33E,CAAI,EACrC+4E,EAAaR,EAAiB,mBAE9BU,GAAuBV,EAAiB,mBAExCS,EAAWT,EAAiB,mBAE5BA,EAAiB,sBAAqB,EAGlCT,GAAgCiB,CAAU,IAC5CG,GAAkBX,EAAiB,sBAAuB,EACtDW,KAAoB,GACtBX,EAAiB,SAAS,CAAC,EAG7BA,EAAiB,sBAAqB,EAEtCA,EAAiB,sBAAqB,EAEtCA,EAAiB,SAAS,CAAC,EAEvBA,EAAiB,eAGnB,IADAiB,GAAmBN,KAAoB,EAAI,EAAI,GAC1ClmF,GAAI,EAAGA,GAAIwmF,GAAkBxmF,KAC5BulF,EAAiB,gBAEfvlF,GAAI,EACNslF,EAAgB,GAAIC,CAAgB,EAEpCD,EAAgB,GAAIC,CAAgB,GAS9C,GAHAA,EAAiB,sBAAqB,EAEtCY,GAAkBZ,EAAiB,sBAAuB,EACtDY,KAAoB,EACtBZ,EAAiB,sBAAqB,UAC7BY,KAAoB,EAQ7B,IAPAZ,EAAiB,SAAS,CAAC,EAE3BA,EAAiB,cAAa,EAE9BA,EAAiB,cAAa,EAE9Ba,GAAiCb,EAAiB,sBAAuB,EACpEvlF,GAAI,EAAGA,GAAIomF,GAAgCpmF,KAC9CulF,EAAiB,cAAa,EAwBlC,GApBAA,EAAiB,sBAAqB,EAEtCA,EAAiB,SAAS,CAAC,EAE3Bc,GAAsBd,EAAiB,sBAAuB,EAC9De,GAA4Bf,EAAiB,sBAAuB,EACpEgB,GAAmBhB,EAAiB,SAAS,CAAC,EAC1CgB,KAAqB,GACvBhB,EAAiB,SAAS,CAAC,EAG7BA,EAAiB,SAAS,CAAC,EAEvBA,EAAiB,gBAEnBI,EAAsBJ,EAAiB,sBAAuB,EAC9DK,EAAuBL,EAAiB,sBAAuB,EAC/DM,EAAqBN,EAAiB,sBAAuB,EAC7DO,EAAwBP,EAAiB,sBAAuB,GAE9DA,EAAiB,eAEfA,EAAiB,cAAe,CAGlC,OADAmB,GAAiBnB,EAAiB,iBAAkB,EAC5CmB,GAAc,CACpB,IAAK,GACHD,GAAW,CAAC,EAAG,CAAC,EAChB,MACF,IAAK,GACHA,GAAW,CAAC,GAAI,EAAE,EAClB,MACF,IAAK,GACHA,GAAW,CAAC,GAAI,EAAE,EAClB,MACF,IAAK,GACHA,GAAW,CAAC,GAAI,EAAE,EAClB,MACF,IAAK,GACHA,GAAW,CAAC,GAAI,EAAE,EAClB,MACF,IAAK,GACHA,GAAW,CAAC,GAAI,EAAE,EAClB,MACF,IAAK,GACHA,GAAW,CAAC,GAAI,EAAE,EAClB,MACF,IAAK,GACHA,GAAW,CAAC,GAAI,EAAE,EAClB,MACF,IAAK,GACHA,GAAW,CAAC,GAAI,EAAE,EAClB,MACF,IAAK,IACHA,GAAW,CAAC,GAAI,EAAE,EAClB,MACF,IAAK,IACHA,GAAW,CAAC,GAAI,EAAE,EAClB,MACF,IAAK,IACHA,GAAW,CAAC,GAAI,EAAE,EAClB,MACF,IAAK,IACHA,GAAW,CAAC,IAAK,EAAE,EACnB,MACF,IAAK,IACHA,GAAW,CAAC,EAAG,CAAC,EAChB,MACF,IAAK,IACHA,GAAW,CAAC,EAAG,CAAC,EAChB,MACF,IAAK,IACHA,GAAW,CAAC,EAAG,CAAC,EAChB,MACF,IAAK,KACH,CACEA,GAAW,CAAClB,EAAiB,iBAAgB,GAAM,EAAIA,EAAiB,mBAAoBA,EAAiB,iBAAkB,GAAI,EAAIA,EAAiB,iBAAgB,CAAE,EAC1K,KAChB,CACA,CACckB,IACFA,GAAS,CAAC,EAAIA,GAAS,CAAC,CAEpC,CAEM,MAAO,CACL,WAAYV,EACZ,SAAUC,EACV,qBAAsBC,GACtB,OAAQI,GAAsB,GAAK,GAAKV,EAAsB,EAAIC,EAAuB,EACzF,QAAS,EAAIW,KAAqBD,GAA4B,GAAK,GAAKT,EAAqB,EAAIC,EAAwB,EAEzH,SAAUW,EACX,CACF,CACF,EACD7B,GAAa,UAAY,IAAIF,GAC7B,IAAIiC,GAAO,CACT,WAAY/B,EAEd,EAUIgC,GAA4B,CAAC,KAAO,MAAO,KAAO,KAAO,MAAO,KAAO,KAAO,MAAO,KAAO,KAAO,MAAO,IAAM,IAAI,EACpHC,GAAkB,SAAU9R,EAAQ74D,EAAW,CACjD,IAAIyhB,EAAao3C,EAAO74D,EAAY,CAAC,GAAK,GAAK64D,EAAO74D,EAAY,CAAC,GAAK,GAAK64D,EAAO74D,EAAY,CAAC,GAAK,EAAI64D,EAAO74D,EAAY,CAAC,EAC5Hue,EAAQs6C,EAAO74D,EAAY,CAAC,EAC5B0hB,GAAiBnD,EAAQ,KAAO,EAGlC,OADAkD,EAAaA,GAAc,EAAIA,EAAa,EACxCC,EACKD,EAAa,GAEfA,EAAa,EACrB,EACGE,GAAe,SAAU7wB,EAAM6P,EAAQ,CACzC,OAAI7P,EAAK,OAAS6P,EAAS,IAAM7P,EAAK6P,CAAM,IAAM,IAAqB7P,EAAK6P,EAAS,CAAC,IAAM,IAAqB7P,EAAK6P,EAAS,CAAC,IAAM,GAC7HA,GAETA,GAAUgqE,GAAgB75E,EAAM6P,CAAM,EAC/BghB,GAAa7wB,EAAM6P,CAAM,EACpC,EAEMiqE,GAAoB,SAAU95E,EAAM,CACtC,IAAI6P,EAASghB,GAAa7wB,EAAM,CAAC,EACjC,OAAOA,EAAK,QAAU6P,EAAS,IAAM7P,EAAK6P,CAAM,EAAI,OAAU,MAAS7P,EAAK6P,EAAS,CAAC,EAAI,OAAU,MAGnG7P,EAAK6P,EAAS,CAAC,EAAI,MAAU,EAC/B,EACGkqE,GAAuB,SAAU/5E,EAAM,CACzC,OAAOA,EAAK,CAAC,GAAK,GAAKA,EAAK,CAAC,GAAK,GAAKA,EAAK,CAAC,GAAK,EAAIA,EAAK,CAAC,CAChE,EAGMg6E,GAAgB,SAAUhsE,EAAOuL,EAAOC,EAAK,CAC/C,IAAIxmB,EACFmD,EAAS,GACX,IAAKnD,EAAIumB,EAAOvmB,EAAIwmB,EAAKxmB,IACvBmD,GAAU,KAAO,KAAO6X,EAAMhb,CAAC,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,EAEzD,OAAOmD,CACX,EAGM8jF,GAAgB,SAAUjsE,EAAOuL,EAAOC,EAAK,CAC/C,OAAO,SAASwgE,GAAchsE,EAAOuL,EAAOC,CAAG,CAAC,CACjD,EAEG0gE,GAAgB,SAAUnS,EAAQ74D,EAAW,CAC/C,IAAIirE,GAAYpS,EAAO74D,EAAY,CAAC,EAAI,MAAS,EAC/CkrE,EAASrS,EAAO74D,EAAY,CAAC,GAAK,EAClCmrE,EAAUtS,EAAO74D,EAAY,CAAC,EAAI,KACpC,OAAOmrE,EAAUD,EAASD,CAC3B,EACGG,GAAc,SAAUvS,EAAQ74D,EAAW,CAC7C,OAAI64D,EAAO74D,CAAS,IAAM,IAAqB64D,EAAO74D,EAAY,CAAC,IAAM,IAAqB64D,EAAO74D,EAAY,CAAC,IAAM,GAC/G,iBACE64D,EAAO74D,CAAS,EAAI,KAAkB64D,EAAO74D,EAAY,CAAC,EAAI,OAAU,IAC1E,QAEF,IACR,EACGqrE,GAAkB,SAAUtM,EAAQ,CAEtC,QADIj7E,EAAI,EACDA,EAAI,EAAIi7E,EAAO,QAAQ,CAC5B,GAAIA,EAAOj7E,CAAC,IAAM,MAASi7E,EAAOj7E,EAAI,CAAC,EAAI,OAAU,IAAM,CAGzDA,IACA,QACR,CACM,OAAO4mF,IAA2B3L,EAAOj7E,EAAI,CAAC,EAAI,MAAU,CAAC,CACnE,CACI,OAAO,IACR,EACGwnF,GAAoB,SAAUvM,EAAQ,CACxC,IAAIgF,EAAYF,EAAWhK,EAAOiK,EAElCC,EAAa,GACThF,EAAO,CAAC,EAAI,KAEdgF,GAAc,EAEdA,GAAc8G,GAAqB9L,EAAO,SAAS,GAAI,EAAE,CAAC,GAI5D,EAAG,CAGD,GADA8E,EAAYgH,GAAqB9L,EAAO,SAASgF,EAAa,EAAGA,EAAa,CAAC,CAAC,EAC5EF,EAAY,EACd,OAAO,KAGT,GADAC,EAAc,OAAO,aAAa/E,EAAOgF,CAAU,EAAGhF,EAAOgF,EAAa,CAAC,EAAGhF,EAAOgF,EAAa,CAAC,EAAGhF,EAAOgF,EAAa,CAAC,CAAC,EACxHD,IAAgB,OAAQ,CAC1BjK,EAAQkF,EAAO,SAASgF,EAAa,GAAIA,EAAaF,EAAY,EAAE,EACpE,QAAS//E,EAAI,EAAGA,EAAI+1E,EAAM,WAAY/1E,IACpC,GAAI+1E,EAAM/1E,CAAC,IAAM,EAAG,CAClB,IAAIynF,EAAQR,GAAclR,EAAO,EAAG/1E,CAAC,EACrC,GAAIynF,IAAU,+CAAgD,CAC5D,IAAI/G,EAAI3K,EAAM,SAAS/1E,EAAI,CAAC,EACxByM,GAAQi0E,EAAE,CAAC,EAAI,IAAS,GAAKA,EAAE,CAAC,GAAK,GAAKA,EAAE,CAAC,GAAK,GAAKA,EAAE,CAAC,GAAK,EAAIA,EAAE,CAAC,IAAM,EAChF,OAAAj0E,GAAQ,EACRA,GAAQi0E,EAAE,CAAC,EAAI,EACRj0E,CACrB,CACY,KACZ,CAEA,CACMwzE,GAAc,GAEdA,GAAcF,CACpB,OAAaE,EAAahF,EAAO,YAC7B,OAAO,IACR,EACG1Q,GAAQ,CACV,gBAAiBuc,GACjB,gBAAiBD,GACjB,cAAeK,GACf,UAAWI,GACX,gBAAiBC,GACjB,kBAAmBC,EACpB,EAYGE,GAAW3W,EACX4W,GAAWpd,GAEXqd,GAKJA,GAAc,UAAY,CACxB,IAAItG,EAAa,IAAI,WACnBuG,EAAY,EACdD,GAAY,UAAU,KAAK,KAAK,IAAI,EACpC,KAAK,aAAe,SAAUlQ,EAAW,CACvCmQ,EAAYnQ,CACb,EACD,KAAK,KAAO,SAAU18D,EAAO,CAC3B,IAAI+kE,EAAY,EACd7jE,EAAY,EACZ4rE,EACAnvE,EACAsiE,EACA8M,EAWF,IARIzG,EAAW,QACbyG,EAAazG,EAAW,OACxBA,EAAa,IAAI,WAAWtmE,EAAM,WAAa+sE,CAAU,EACzDzG,EAAW,IAAIA,EAAW,SAAS,EAAGyG,CAAU,CAAC,EACjDzG,EAAW,IAAItmE,EAAO+sE,CAAU,GAEhCzG,EAAatmE,EAERsmE,EAAW,OAASplE,GAAa,GAAG,CACzC,GAAIolE,EAAWplE,CAAS,IAAM,IAAqBolE,EAAWplE,EAAY,CAAC,IAAM,IAAqBolE,EAAWplE,EAAY,CAAC,IAAM,GAAmB,CAWrJ,GARIolE,EAAW,OAASplE,EAAY,KAIpC6jE,EAAY4H,GAAS,gBAAgBrG,EAAYplE,CAAS,EAItDA,EAAY6jE,EAAYuB,EAAW,QACrC,MAEF3oE,EAAQ,CACN,KAAM,iBACN,KAAM2oE,EAAW,SAASplE,EAAWA,EAAY6jE,CAAS,CAC3D,EACD,KAAK,QAAQ,OAAQpnE,CAAK,EAC1BuD,GAAa6jE,EACb,QACD,UAAWuB,EAAWplE,CAAS,EAAI,OAAU,MAASolE,EAAWplE,EAAY,CAAC,EAAI,OAAU,IAAM,CASjG,GANIolE,EAAW,OAASplE,EAAY,IAGpC6jE,EAAY4H,GAAS,cAAcrG,EAAYplE,CAAS,EAGpDA,EAAY6jE,EAAYuB,EAAW,QACrC,MAEFrG,EAAS,CACP,KAAM,QACN,KAAMqG,EAAW,SAASplE,EAAWA,EAAY6jE,CAAS,EAC1D,IAAK8H,EACL,IAAKA,CACN,EACD,KAAK,QAAQ,OAAQ5M,CAAM,EAC3B/+D,GAAa6jE,EACb,QACV,CACQ7jE,GACR,CACM4rE,EAAYxG,EAAW,OAASplE,EAC5B4rE,EAAY,EACdxG,EAAaA,EAAW,SAASplE,CAAS,EAE1ColE,EAAa,IAAI,UAEpB,EACD,KAAK,MAAQ,UAAY,CACvBA,EAAa,IAAI,WACjB,KAAK,QAAQ,OAAO,CACrB,EACD,KAAK,YAAc,UAAY,CAC7BA,EAAa,IAAI,WACjB,KAAK,QAAQ,eAAe,CAC7B,CACF,EACDsG,GAAY,UAAY,IAAIF,GAC5B,IAAIM,GAAMJ,GACNK,GAAqB,CAAC,kBAAmB,eAAgB,aAAc,yBAA0B,YAAY,EAC7GC,GAAkBD,GAClBE,GAAqB,CAAC,QAAS,SAAU,aAAc,WAAY,uBAAwB,UAAU,EACrGC,GAAkBD,GAYlBj1E,GAAS69D,EACTsX,GAAMpT,GACNqT,GAAa9R,GACb+R,GAAkBtP,GAClBuP,GAAkB/O,GAClBgP,GAAO1F,GACPpiD,GAAQk3C,GACR6Q,GAAa9E,GACb+E,GAAahC,GAAK,WAClBiC,GAAYZ,GACZa,GAAkBte,GAAM,gBACxBue,GAAqBjR,GAAQ,iBAC7BkR,GAAmBb,GACnBc,GAAmBZ,GAEnBa,GAAoBC,GAAoBC,GAAYC,GACpDC,GAAqB,SAAU/lF,EAAKqR,EAAO,CAC7CA,EAAM,OAASrR,EACf,KAAK,QAAQ,MAAOqR,CAAK,CAC1B,EACG20E,GAA2B,SAAUC,EAAYC,EAAU,CAE7D,QADIvmD,EAAO,OAAO,KAAKumD,CAAQ,EACtBxpF,EAAI,EAAGA,EAAIijC,EAAK,OAAQjjC,IAAK,CACpC,IAAIsD,EAAM2/B,EAAKjjC,CAAC,EAGZsD,IAAQ,kBAAoB,CAACkmF,EAASlmF,CAAG,EAAE,IAG/CkmF,EAASlmF,CAAG,EAAE,GAAG,MAAO+lF,GAAmB,KAAKE,EAAYjmF,CAAG,CAAC,CACtE,CACG,EAKGmmF,GAAc,SAAU/iF,EAAGwF,EAAG,CAChC,IAAIlM,EACJ,GAAI0G,EAAE,SAAWwF,EAAE,OACjB,MAAO,GAGT,IAAKlM,EAAI,EAAGA,EAAI0G,EAAE,OAAQ1G,IACxB,GAAI0G,EAAE1G,CAAC,IAAMkM,EAAElM,CAAC,EACd,MAAO,GAGX,MAAO,EACR,EACG0pF,GAA4B,SAAUpQ,EAAqBqQ,EAAUC,EAAUC,EAAQC,EAAQC,EAA0B,CAC3H,IAAIC,EAAmBJ,EAAWD,EAChCM,EAAiBJ,EAASF,EAC1BO,EAAuBJ,EAASF,EAKlC,MAAO,CACL,MAAO,CACL,IAAKtQ,EACL,IAAKA,EAAsB0Q,CAC5B,EACD,IAAK,CACH,IAAK1Q,EAAsB2Q,EAC3B,IAAK3Q,EAAsB4Q,CAC5B,EACD,yBAA0BH,EAC1B,oBAAqBzQ,CACtB,CACF,EAWD4P,GAAqB,SAAUl/E,EAAOzI,EAAS,CAC7C,IAAIs3E,EAAa,CAAE,EACjBzF,EACA0F,EAAqB,EACrBX,EAAqB,EACrBC,EAA2B,IAC7B72E,EAAUA,GAAW,CAAE,EACvB6xE,EAAiB7xE,EAAQ,qBAAuB,EAChD2nF,GAAmB,UAAU,KAAK,KAAK,IAAI,EAC3C,KAAK,KAAO,SAAUl8E,EAAM,CAC1Bw7E,GAAgB,eAAex+E,EAAOgD,CAAI,EACtChD,GACF++E,GAAiB,QAAQ,SAAUz+E,EAAM,CACvCN,EAAMM,CAAI,EAAI0C,EAAK1C,CAAI,CACjC,CAAS,EAGHuuE,EAAW,KAAK7rE,CAAI,CACrB,EACD,KAAK,eAAiB,SAAUm9E,EAAa,CAC3CrR,EAAqBqR,CACtB,EACD,KAAK,4BAA8B,SAAU7Q,EAAqB,CAChElB,EAA2BkB,CAC5B,EACD,KAAK,oBAAsB,SAAU5B,EAAW,CAC9CS,EAAqBT,CACtB,EACD,KAAK,MAAQ,UAAY,CACvB,IAAIlC,EAAQhE,EAAMH,EAAM/lE,EAAOgtE,EAAexpD,EAAiBs7D,EAE/D,GAAIvR,EAAW,SAAW,EAAG,CAC3B,KAAK,QAAQ,OAAQ,oBAAoB,EACzC,MACR,CACMrD,EAAS+S,GAAgB,4BAA4B1P,EAAY7uE,EAAO8uE,CAAkB,EAC1F9uE,EAAM,oBAAsBw+E,GAAgB,kCAAkCx+E,EAAOzI,EAAQ,sBAAsB,EAEnH6oF,EAAoC7B,GAAgB,kBAAkBv+E,EAAOwrE,EAAQ2C,EAAoBC,CAAwB,EAGjIpuE,EAAM,QAAUu+E,GAAgB,oBAAoB/S,CAAM,EAE1DnE,EAAOgX,GAAI,KAAKE,GAAgB,qBAAqB/S,CAAM,CAAC,EAC5DqD,EAAa,CAAE,EACfrH,EAAO6W,GAAI,KAAKjV,EAAgB,CAACppE,CAAK,CAAC,EACvCsB,EAAQ,IAAI,WAAWkmE,EAAK,WAAaH,EAAK,UAAU,EAExD+B,IACA9nE,EAAM,IAAIkmE,CAAI,EACdlmE,EAAM,IAAI+lE,EAAMG,EAAK,UAAU,EAC/BgX,GAAgB,aAAax+E,CAAK,EAClCsuE,EAAgB,KAAK,KAAKwQ,GAAqB,KAAO9+E,EAAM,UAAU,EAKlEwrE,EAAO,SACT1mD,EAAkB0mD,EAAO,OAAS8C,EAClC,KAAK,QAAQ,oBAAqBoR,GAIlC/oD,GAAM,iBAAiB32B,EAAM,oBAAqBA,EAAM,UAAU,EAElEwrE,EAAO,CAAC,EAAE,IAAKA,EAAO,CAAC,EAAE,IAAKA,EAAO,CAAC,EAAE,IAAM1mD,EAAiB0mD,EAAO,CAAC,EAAE,IAAM1mD,EAAiBs7D,GAAqC,CAAC,CAAC,EACvI,KAAK,QAAQ,aAAc,CACzB,MAAO5U,EAAO,CAAC,EAAE,IACjB,IAAKA,EAAO,CAAC,EAAE,IAAM1mD,CAC/B,CAAS,GAEH,KAAK,QAAQ,OAAQ,CACnB,MAAO9kB,EACP,MAAOsB,CACf,CAAO,EACD,KAAK,QAAQ,OAAQ,oBAAoB,CAC1C,EACD,KAAK,MAAQ,UAAY,CACvBk9E,GAAgB,aAAax+E,CAAK,EAClC6uE,EAAa,CAAE,EACf,KAAK,QAAQ,OAAO,CACrB,CACF,EACDqQ,GAAmB,UAAY,IAAIh2E,GAanC+1E,GAAqB,SAAUj/E,EAAOzI,EAAS,CAC7C,IAAI6xE,EACFiC,EAAW,CAAE,EACbgV,EAAkB,CAAE,EACpBlgE,EACAupD,EACFnyE,EAAUA,GAAW,CAAE,EACvB6xE,EAAiB7xE,EAAQ,qBAAuB,EAChD0nF,GAAmB,UAAU,KAAK,KAAK,IAAI,EAC3C,OAAOj/E,EAAM,OACb,KAAK,UAAY,CAAE,EAUnB,KAAK,KAAO,SAAUsgF,EAAS,CAC7B9B,GAAgB,eAAex+E,EAAOsgF,CAAO,EAEzCA,EAAQ,cAAgB,0BAA4B,CAACngE,IACvDA,EAASmgE,EAAQ,OACjBtgF,EAAM,IAAM,CAACsgF,EAAQ,IAAI,EACzBtB,GAAiB,QAAQ,SAAU1+E,EAAM,CACvCN,EAAMM,CAAI,EAAI6f,EAAO7f,CAAI,CAC1B,EAAE,IAAI,GAELggF,EAAQ,cAAgB,0BAA4B,CAAC5W,IACvDA,EAAM4W,EAAQ,KACdtgF,EAAM,IAAM,CAACsgF,EAAQ,IAAI,GAG3BjV,EAAS,KAAKiV,CAAO,CACtB,EAMD,KAAK,MAAQ,UAAY,CAYvB,QAXI9U,EACF+U,EACA5U,EACAnE,EACAH,EACA/lE,EACAy+E,EAA2B,EAC3BS,EACAC,EAGKpV,EAAS,QACVA,EAAS,CAAC,EAAE,cAAgB,8BAGhCA,EAAS,MAAO,EAGlB,GAAIA,EAAS,SAAW,EAAG,CACzB,KAAK,aAAc,EACnB,KAAK,QAAQ,OAAQ,oBAAoB,EACzC,MACD,CA6CD,GAzCAG,EAAS8S,GAAW,oBAAoBjT,CAAQ,EAChDM,EAAO2S,GAAW,oBAAoB9S,CAAM,EAmBvCG,EAAK,CAAC,EAAE,CAAC,EAAE,WAEd4U,EAAe,KAAK,iBAAiBlV,EAAS,CAAC,EAAGrrE,CAAK,EACnDugF,GAGFR,EAA2BQ,EAAa,SACxC5U,EAAK,QAAQ4U,CAAY,EAGzB5U,EAAK,YAAc4U,EAAa,WAChC5U,EAAK,UAAY4U,EAAa,SAC9B5U,EAAK,IAAM4U,EAAa,IACxB5U,EAAK,IAAM4U,EAAa,IACxB5U,EAAK,UAAY4U,EAAa,UAG9B5U,EAAO2S,GAAW,oBAAoB3S,CAAI,GAI1C0U,EAAgB,OAAQ,CAC1B,IAAIK,GAMJ,GALInpF,EAAQ,eACVmpF,GAAc,KAAK,gBAAgB/U,CAAI,EAEvC+U,GAAc,KAAK,kBAAkB/U,CAAI,EAEvC,CAAC+U,GAAa,CAEhB,KAAK,UAAU,QAAQ,CACrB,IAAK/U,EAAK,IAAK,EACf,IAAK3rE,EAAM,IACX,IAAKA,EAAM,GACvB,CAAW,EAED,KAAK,UAAU,OAAS,KAAK,IAAI,EAAG,KAAK,UAAU,MAAM,EAEzDqrE,EAAW,CAAA,EAEX,KAAK,aAAc,EACnB,KAAK,QAAQ,OAAQ,oBAAoB,EACzC,MACD,CAGDmT,GAAgB,aAAax+E,CAAK,EAClC2rE,EAAO+U,EACf,CACMlC,GAAgB,eAAex+E,EAAO2rE,CAAI,EAG1C3rE,EAAM,QAAUs+E,GAAW,oBAAoB3S,CAAI,EAEnDtE,EAAOgX,GAAI,KAAKC,GAAW,mBAAmB3S,CAAI,CAAC,EACnD3rE,EAAM,oBAAsBw+E,GAAgB,kCAAkCx+E,EAAOzI,EAAQ,sBAAsB,EACnH,KAAK,QAAQ,oBAAqBo0E,EAAK,IAAI,SAAUgV,GAAK,CACxD,MAAO,CACL,IAAKA,GAAI,IACT,IAAKA,GAAI,IACT,WAAYA,GAAI,UACjB,CACT,CAAO,CAAC,EACFH,EAAW7U,EAAK,CAAC,EACjB8U,EAAU9U,EAAKA,EAAK,OAAS,CAAC,EAC9B,KAAK,QAAQ,oBAAqB+T,GAA0B1/E,EAAM,oBAAqBwgF,EAAS,IAAKA,EAAS,IAAKC,EAAQ,IAAMA,EAAQ,SAAUA,EAAQ,IAAMA,EAAQ,SAAUV,CAAwB,CAAC,EAC5M,KAAK,QAAQ,aAAc,CACzB,MAAOpU,EAAK,CAAC,EAAE,IACf,IAAKA,EAAKA,EAAK,OAAS,CAAC,EAAE,IAAMA,EAAKA,EAAK,OAAS,CAAC,EAAE,QAC/D,CAAO,EAED,KAAK,UAAU,QAAQ,CACrB,IAAKA,EAAK,IAAK,EACf,IAAK3rE,EAAM,IACX,IAAKA,EAAM,GACnB,CAAO,EAED,KAAK,UAAU,OAAS,KAAK,IAAI,EAAG,KAAK,UAAU,MAAM,EAEzDqrE,EAAW,CAAE,EACb,KAAK,QAAQ,sBAAuBrrE,EAAM,mBAAmB,EAC7D,KAAK,QAAQ,oBAAqBA,EAAM,iBAAiB,EACzDwnE,EAAO6W,GAAI,KAAKjV,EAAgB,CAACppE,CAAK,CAAC,EAGvCsB,EAAQ,IAAI,WAAWkmE,EAAK,WAAaH,EAAK,UAAU,EAExD+B,IACA9nE,EAAM,IAAIkmE,CAAI,EACdlmE,EAAM,IAAI+lE,EAAMG,EAAK,UAAU,EAC/B,KAAK,QAAQ,OAAQ,CACnB,MAAOxnE,EACP,MAAOsB,CACf,CAAO,EACD,KAAK,aAAY,EAEjB,KAAK,QAAQ,OAAQ,oBAAoB,CAC1C,EACD,KAAK,MAAQ,UAAY,CACvB,KAAK,aAAc,EACnB+pE,EAAW,CAAE,EACb,KAAK,UAAU,OAAS,EACxBgV,EAAgB,OAAS,EACzB,KAAK,QAAQ,OAAO,CACrB,EACD,KAAK,aAAe,UAAY,CAC9B7B,GAAgB,aAAax+E,CAAK,EAGlCmgB,EAAS,OACTupD,EAAM,MACZ,EAGI,KAAK,iBAAmB,SAAU4W,EAAS,CACtC,IAACM,EAAa,KAIfC,EAAkB,IAClBC,EACAC,EACArV,EACAsV,EACAhrF,EAEF,IAAKA,EAAI,EAAGA,EAAI,KAAK,UAAU,OAAQA,IACrCgrF,EAAgB,KAAK,UAAUhrF,CAAC,EAChC01E,EAAasV,EAAc,IAEvB,IAAEhhF,EAAM,KAAOy/E,GAAYz/E,EAAM,IAAI,CAAC,EAAGghF,EAAc,IAAI,CAAC,CAAC,IAAM,EAAEhhF,EAAM,KAAOy/E,GAAYz/E,EAAM,IAAI,CAAC,EAAGghF,EAAc,IAAI,CAAC,CAAC,MAIhItV,EAAW,IAAM1rE,EAAM,kBAAkB,MAI7C8gF,EAAcR,EAAQ,IAAM5U,EAAW,IAAMA,EAAW,SAGpDoV,GAAe,MAAqBA,GAAeF,IAGjD,CAACG,GAAiBF,EAAkBC,KACtCC,EAAgBC,EAChBH,EAAkBC,KAIxB,OAAIC,EACKA,EAAc,IAEhB,IACb,EAGI,KAAK,kBAAoB,SAAUpV,EAAM,CACvC,IAAIsV,EAAYC,EAAUl8E,EAAO27E,EAAKQ,EAAYC,EAAU18D,EAAUg8D,EAKtE,IAJAS,EAAaxV,EAAK,WAClByV,EAAWzV,EAAK,SAChBjnD,EAAWinD,EAAK,SAChBsV,EAAaC,EAAW,EACjBD,EAAaZ,EAAgB,QAAUa,EAAWvV,EAAK,SAC5D3mE,EAAQq7E,EAAgBY,CAAU,EAClCN,EAAMhV,EAAKuV,CAAQ,EACfl8E,EAAM,MAAQ27E,EAAI,MAH8C,CAMpE,GAAIA,EAAI,IAAM37E,EAAM,IAAK,CAGvBi8E,IACA,QACD,CAGDC,IACAC,GAAcR,EAAI,WAClBS,GAAYT,EAAI,SAChBj8D,GAAYi8D,EAAI,QACxB,CACM,OAAIO,IAAa,EAERvV,EAELuV,IAAavV,EAAK,OAEb,MAET+U,EAAc/U,EAAK,MAAMuV,CAAQ,EACjCR,EAAY,WAAaS,EACzBT,EAAY,SAAWh8D,EACvBg8D,EAAY,SAAWU,EACvBV,EAAY,IAAMA,EAAY,CAAC,EAAE,IACjCA,EAAY,IAAMA,EAAY,CAAC,EAAE,IAC1BA,EACb,EAGI,KAAK,gBAAkB,SAAU/U,EAAM,CACrC,IAAIsV,EAAYC,EAAUl8E,EAAO27E,EAAKU,EAAeC,EAKrD,IAJAL,EAAaZ,EAAgB,OAAS,EACtCa,EAAWvV,EAAK,OAAS,EACzB0V,EAAgB,KAChBC,EAAa,GACNL,GAAc,GAAKC,GAAY,GAAG,CAGvC,GAFAl8E,EAAQq7E,EAAgBY,CAAU,EAClCN,EAAMhV,EAAKuV,CAAQ,EACfl8E,EAAM,MAAQ27E,EAAI,IAAK,CACzBW,EAAa,GACb,KACV,CACQ,GAAIt8E,EAAM,IAAM27E,EAAI,IAAK,CACvBM,IACA,QACV,CACYA,IAAeZ,EAAgB,OAAS,IAI1CgB,EAAgBH,GAElBA,GACR,CACM,GAAI,CAACI,GAAcD,IAAkB,KACnC,OAAO,KAET,IAAIE,EAMJ,GALID,EACFC,EAAYL,EAEZK,EAAYF,EAEVE,IAAc,EAChB,OAAO5V,EAET,IAAI+U,EAAc/U,EAAK,MAAM4V,CAAS,EAClC1kB,GAAW6jB,EAAY,OAAO,SAAUjvE,GAAOkvE,GAAK,CACtD,OAAAlvE,GAAM,YAAckvE,GAAI,WACxBlvE,GAAM,UAAYkvE,GAAI,SACtBlvE,GAAM,UAAYkvE,GAAI,SACflvE,EACf,EAAS,CACD,WAAY,EACZ,SAAU,EACV,SAAU,CAClB,CAAO,EACD,OAAAivE,EAAY,WAAa7jB,GAAS,WAClC6jB,EAAY,SAAW7jB,GAAS,SAChC6jB,EAAY,SAAW7jB,GAAS,SAChC6jB,EAAY,IAAMA,EAAY,CAAC,EAAE,IACjCA,EAAY,IAAMA,EAAY,CAAC,EAAE,IAC1BA,CACR,EACD,KAAK,cAAgB,SAAUc,EAAoB,CACjDnB,EAAkBmB,CACnB,CACF,EACDvC,GAAmB,UAAY,IAAI/1E,GAUnCk2E,GAAiB,SAAU7nF,EAASo/E,EAAgB,CAIlD,KAAK,eAAiB,EACtB,KAAK,eAAiBA,EACtBp/E,EAAUA,GAAW,CAAE,EACnB,OAAOA,EAAQ,MAAU,IAC3B,KAAK,YAAc,CAAC,CAACA,EAAQ,MAE7B,KAAK,YAAc,GAEjB,OAAOA,EAAQ,wBAA2B,UAC5C,KAAK,uBAAyBA,EAAQ,uBAEtC,KAAK,uBAAyB,GAEhC,KAAK,cAAgB,CAAE,EACvB,KAAK,WAAa,KAClB,KAAK,aAAe,CAAE,EACtB,KAAK,gBAAkB,CAAE,EACzB,KAAK,gBAAkB,CAAE,EACzB,KAAK,aAAe,EACpB,KAAK,cAAgB,EACrB6nF,GAAe,UAAU,KAAK,KAAK,IAAI,EAEvC,KAAK,KAAO,SAAUqC,EAAQ,CAG5B,GAAIA,EAAO,SAAWA,EAAO,KAC3B,OAAO,KAAK,gBAAgB,KAAKA,CAAM,EAGzC,GAAIA,EAAO,OACT,OAAO,KAAK,gBAAgB,KAAKA,CAAM,EAKzC,KAAK,cAAc,KAAKA,EAAO,KAAK,EACpC,KAAK,cAAgBA,EAAO,MAAM,WAO9BA,EAAO,MAAM,OAAS,UACxB,KAAK,WAAaA,EAAO,MACzB,KAAK,aAAa,KAAKA,EAAO,KAAK,GAEjCA,EAAO,MAAM,OAAS,UACxB,KAAK,WAAaA,EAAO,MACzB,KAAK,aAAa,QAAQA,EAAO,KAAK,EAEzC,CACF,EACDrC,GAAe,UAAY,IAAIl2E,GAC/Bk2E,GAAe,UAAU,MAAQ,SAAUtY,EAAa,CACtD,IAAIj0D,EAAS,EACXlI,EAAQ,CACN,SAAU,CAAE,EACZ,eAAgB,CAAE,EAClB,SAAU,CAAE,EACZ,KAAM,CAAA,CACP,EACD+2E,EACAnL,EACArwD,EACAynD,EAAmB,EACnB33E,EACF,GAAI,KAAK,cAAc,OAAS,KAAK,eAAgB,CACnD,GAAI8wE,IAAgB,sBAAwBA,IAAgB,qBAI1D,OACK,GAAI,KAAK,YAGd,OACK,GAAI,KAAK,cAAc,SAAW,EAAG,CAO1C,KAAK,gBACD,KAAK,eAAiB,KAAK,iBAC7B,KAAK,QAAQ,MAAM,EACnB,KAAK,cAAgB,GAEvB,MACR,CACA,CAYI,GAXI,KAAK,YACP6G,EAAmB,KAAK,WAAW,kBAAkB,IACrDqR,GAAiB,QAAQ,SAAU1+E,EAAM,CACvCqK,EAAM,KAAKrK,CAAI,EAAI,KAAK,WAAWA,CAAI,CACxC,EAAE,IAAI,GACE,KAAK,aACdqtE,EAAmB,KAAK,WAAW,kBAAkB,IACrDoR,GAAiB,QAAQ,SAAUz+E,EAAM,CACvCqK,EAAM,KAAKrK,CAAI,EAAI,KAAK,WAAWA,CAAI,CACxC,EAAE,IAAI,GAEL,KAAK,YAAc,KAAK,WAAY,CAgBtC,IAfI,KAAK,cAAc,SAAW,EAChCqK,EAAM,KAAO,KAAK,cAAc,CAAC,EAAE,KAEnCA,EAAM,KAAO,WAEf,KAAK,eAAiB,KAAK,cAAc,OACzCub,EAAcm4D,GAAI,YAAY,KAAK,aAAa,EAEhD1zE,EAAM,YAAc,IAAI,WAAWub,EAAY,UAAU,EAGzDvb,EAAM,YAAY,IAAIub,CAAW,EAEjCvb,EAAM,KAAO,IAAI,WAAW,KAAK,YAAY,EAExC3U,EAAI,EAAGA,EAAI,KAAK,aAAa,OAAQA,IACxC2U,EAAM,KAAK,IAAI,KAAK,aAAa3U,CAAC,EAAG6c,CAAM,EAC3CA,GAAU,KAAK,aAAa7c,CAAC,EAAE,WAIjC,IAAKA,EAAI,EAAGA,EAAI,KAAK,gBAAgB,OAAQA,IAC3C0rF,EAAU,KAAK,gBAAgB1rF,CAAC,EAChC0rF,EAAQ,UAAY/qD,GAAM,oBAAoB+qD,EAAQ,SAAU/T,EAAkB,KAAK,sBAAsB,EAC7G+T,EAAQ,QAAU/qD,GAAM,oBAAoB+qD,EAAQ,OAAQ/T,EAAkB,KAAK,sBAAsB,EACzGhjE,EAAM,eAAe+2E,EAAQ,MAAM,EAAI,GACvC/2E,EAAM,SAAS,KAAK+2E,CAAO,EAI7B,IAAK1rF,EAAI,EAAGA,EAAI,KAAK,gBAAgB,OAAQA,IAC3CugF,EAAM,KAAK,gBAAgBvgF,CAAC,EAC5BugF,EAAI,QAAU5/C,GAAM,oBAAoB4/C,EAAI,IAAK5I,EAAkB,KAAK,sBAAsB,EAC9FhjE,EAAM,SAAS,KAAK4rE,CAAG,EAoBzB,IAhBA5rE,EAAM,SAAS,aAAe,KAAK,eAAe,aAElD,KAAK,cAAc,OAAS,EAC5B,KAAK,WAAa,KAClB,KAAK,aAAa,OAAS,EAC3B,KAAK,gBAAgB,OAAS,EAC9B,KAAK,aAAe,EACpB,KAAK,gBAAgB,OAAS,EAI9B,KAAK,QAAQ,OAAQA,CAAK,EAKrB3U,EAAI,EAAGA,EAAI2U,EAAM,SAAS,OAAQ3U,IACrC0rF,EAAU/2E,EAAM,SAAS3U,CAAC,EAC1B,KAAK,QAAQ,UAAW0rF,CAAO,EAMjC,IAAK1rF,EAAI,EAAGA,EAAI2U,EAAM,SAAS,OAAQ3U,IACrCugF,EAAM5rE,EAAM,SAAS3U,CAAC,EACtB,KAAK,QAAQ,WAAYugF,CAAG,CAE/B,CAEG,KAAK,eAAiB,KAAK,iBAC7B,KAAK,QAAQ,MAAM,EACnB,KAAK,cAAgB,EAExB,EACD6I,GAAe,UAAU,SAAW,SAAU7+E,EAAK,CACjD,KAAK,YAAcA,CACpB,EAQD4+E,GAAa,SAAU5nF,EAAS,CAC9B,IAAIqM,EAAO,KACT+9E,EAAa,GACbC,EACAC,EACF1C,GAAW,UAAU,KAAK,KAAK,IAAI,EACnC5nF,EAAUA,GAAW,CAAE,EACvB,KAAK,oBAAsBA,EAAQ,qBAAuB,EAC1D,KAAK,kBAAoB,CAAE,EAC3B,KAAK,iBAAmB,UAAY,CAClC,IAAIioF,EAAW,CAAE,EACjB,KAAK,kBAAoBA,EACzBA,EAAS,KAAO,MAChBA,EAAS,eAAiB,IAAIf,GAAK,eAEnCe,EAAS,UAAY,IAAIZ,GACzBY,EAAS,6BAA+B,IAAIf,GAAK,wBAAwB,OAAO,EAChFe,EAAS,qCAAuC,IAAIf,GAAK,wBAAwB,gBAAgB,EACjGe,EAAS,WAAa,IAAId,GAC1Bc,EAAS,eAAiB,IAAIJ,GAAe7nF,EAASioF,EAAS,cAAc,EAC7EA,EAAS,eAAiBA,EAAS,UACnCA,EAAS,UAAU,KAAKA,EAAS,4BAA4B,EAAE,KAAKA,EAAS,UAAU,EACvFA,EAAS,UAAU,KAAKA,EAAS,oCAAoC,EAAE,KAAKA,EAAS,cAAc,EAAE,KAAKA,EAAS,cAAc,EACjIA,EAAS,eAAe,GAAG,YAAa,SAAUzT,EAAO,CACvDyT,EAAS,UAAU,aAAazT,EAAM,SAAS,CACvD,CAAO,EACDyT,EAAS,UAAU,GAAG,OAAQ,SAAUx8E,EAAM,CACxCA,EAAK,OAAS,kBAAoBA,EAAK,OAAS,SAAWw8E,EAAS,qBAGxEqC,EAAaA,GAAc,CACzB,kBAAmB,CACjB,oBAAqBj+E,EAAK,mBAC3B,EACD,MAAO,OACP,KAAM,OAChB,EAEQ47E,EAAS,eAAe,iBACxBA,EAAS,mBAAqB,IAAIN,GAAmB2C,EAAYtqF,CAAO,EACxEioF,EAAS,mBAAmB,GAAG,MAAO57E,EAAK,eAAe,oBAAoB,CAAC,EAC/E47E,EAAS,mBAAmB,GAAG,aAAc57E,EAAK,QAAQ,KAAKA,EAAM,iBAAiB,CAAC,EAEvF47E,EAAS,WAAW,KAAKA,EAAS,kBAAkB,EAAE,KAAKA,EAAS,cAAc,EAElF57E,EAAK,QAAQ,YAAa,CACxB,SAAU,CAAC,CAACi+E,EACZ,SAAU,CAAC,CAACD,CACtB,CAAS,EACT,CAAO,EAEDpC,EAAS,eAAe,GAAG,OAAQ,KAAK,QAAQ,KAAK,KAAM,MAAM,CAAC,EAElEA,EAAS,eAAe,GAAG,OAAQ,KAAK,QAAQ,KAAK,KAAM,MAAM,CAAC,EAClEF,GAAyB,KAAME,CAAQ,CACxC,EACD,KAAK,gBAAkB,UAAY,CACjC,IAAIA,EAAW,CAAE,EACjB,KAAK,kBAAoBA,EACzBA,EAAS,KAAO,KAChBA,EAAS,eAAiB,IAAIf,GAAK,eAEnCe,EAAS,aAAe,IAAIf,GAAK,sBACjCe,EAAS,YAAc,IAAIf,GAAK,qBAChCe,EAAS,iBAAmB,IAAIf,GAAK,iBACrCe,EAAS,wBAA0B,IAAIf,GAAK,wBAC5Ce,EAAS,WAAa,IAAId,GAC1Bc,EAAS,WAAa,IAAIb,GAC1Ba,EAAS,cAAgB,IAAIf,GAAK,cAAclnF,CAAO,EACvDioF,EAAS,eAAiB,IAAIJ,GAAe7nF,EAASioF,EAAS,cAAc,EAC7EA,EAAS,eAAiBA,EAAS,aAEnCA,EAAS,aAAa,KAAKA,EAAS,WAAW,EAAE,KAAKA,EAAS,gBAAgB,EAAE,KAAKA,EAAS,uBAAuB,EAGtHA,EAAS,wBAAwB,KAAKA,EAAS,UAAU,EACzDA,EAAS,wBAAwB,KAAKA,EAAS,UAAU,EACzDA,EAAS,wBAAwB,KAAKA,EAAS,cAAc,EAAE,KAAKA,EAAS,cAAc,EAE3FA,EAAS,WAAW,KAAKA,EAAS,aAAa,EAAE,KAAKA,EAAS,cAAc,EAC7EA,EAAS,iBAAiB,GAAG,OAAQ,SAAUx8E,EAAM,CACnD,IAAIhN,EACJ,GAAIgN,EAAK,OAAS,WAAY,CAG5B,IAFAhN,EAAIgN,EAAK,OAAO,OAEThN,KACD,CAAC4rF,GAAc5+E,EAAK,OAAOhN,CAAC,EAAE,OAAS,SACzC4rF,EAAa5+E,EAAK,OAAOhN,CAAC,EAC1B4rF,EAAW,kBAAkB,oBAAsBh+E,EAAK,qBAC/C,CAACi+E,GAAc7+E,EAAK,OAAOhN,CAAC,EAAE,OAAS,UAChD6rF,EAAa7+E,EAAK,OAAOhN,CAAC,EAC1B6rF,EAAW,kBAAkB,oBAAsBj+E,EAAK,qBAIxDg+E,GAAc,CAACpC,EAAS,qBAC1BA,EAAS,eAAe,iBACxBA,EAAS,mBAAqB,IAAIP,GAAmB2C,EAAYrqF,CAAO,EACxEioF,EAAS,mBAAmB,GAAG,MAAO57E,EAAK,eAAe,oBAAoB,CAAC,EAC/E47E,EAAS,mBAAmB,GAAG,oBAAqB,SAAUsC,EAAmB,CAK3ED,GAAc,CAACtqF,EAAQ,yBACzBsqF,EAAW,kBAAoBC,EAK/BtC,EAAS,mBAAmB,eAAesC,EAAkB,IAAMl+E,EAAK,mBAAmB,EAE3G,CAAa,EACD47E,EAAS,mBAAmB,GAAG,oBAAqB57E,EAAK,QAAQ,KAAKA,EAAM,SAAS,CAAC,EACtF47E,EAAS,mBAAmB,GAAG,oBAAqB57E,EAAK,QAAQ,KAAKA,EAAM,wBAAwB,CAAC,EACrG47E,EAAS,mBAAmB,GAAG,sBAAuB,SAAUlQ,EAAqB,CAC/EuS,GACFrC,EAAS,mBAAmB,4BAA4BlQ,CAAmB,CAE3F,CAAa,EACDkQ,EAAS,mBAAmB,GAAG,aAAc57E,EAAK,QAAQ,KAAKA,EAAM,iBAAiB,CAAC,EAEvF47E,EAAS,WAAW,KAAKA,EAAS,kBAAkB,EAAE,KAAKA,EAAS,cAAc,GAEhFqC,GAAc,CAACrC,EAAS,qBAE1BA,EAAS,eAAe,iBACxBA,EAAS,mBAAqB,IAAIN,GAAmB2C,EAAYtqF,CAAO,EACxEioF,EAAS,mBAAmB,GAAG,MAAO57E,EAAK,eAAe,oBAAoB,CAAC,EAC/E47E,EAAS,mBAAmB,GAAG,aAAc57E,EAAK,QAAQ,KAAKA,EAAM,iBAAiB,CAAC,EACvF47E,EAAS,mBAAmB,GAAG,oBAAqB57E,EAAK,QAAQ,KAAKA,EAAM,wBAAwB,CAAC,EAErG47E,EAAS,WAAW,KAAKA,EAAS,kBAAkB,EAAE,KAAKA,EAAS,cAAc,GAGpF57E,EAAK,QAAQ,YAAa,CACxB,SAAU,CAAC,CAACi+E,EACZ,SAAU,CAAC,CAACD,CACxB,CAAW,CACX,CACA,CAAO,EAEDpC,EAAS,eAAe,GAAG,OAAQ,KAAK,QAAQ,KAAK,KAAM,MAAM,CAAC,EAClEA,EAAS,eAAe,GAAG,WAAY,SAAUuC,EAAU,CACzDA,EAAS,aAAevC,EAAS,eAAe,aAChD57E,EAAK,QAAQ,WAAYm+E,CAAQ,CACzC,CAAO,EACDvC,EAAS,eAAe,GAAG,UAAW,KAAK,QAAQ,KAAK,KAAM,SAAS,CAAC,EAExEA,EAAS,eAAe,GAAG,OAAQ,KAAK,QAAQ,KAAK,KAAM,MAAM,CAAC,EAClEF,GAAyB,KAAME,CAAQ,CAC7C,EAEI,KAAK,uBAAyB,SAAUlQ,EAAqB,CAC3D,IAAIkQ,EAAW,KAAK,kBACfjoF,EAAQ,yBACX,KAAK,oBAAsB+3E,GAEzBuS,IACFA,EAAW,kBAAkB,IAAM,OACnCA,EAAW,kBAAkB,IAAM,OACnCrD,GAAgB,aAAaqD,CAAU,EACnCrC,EAAS,8BACXA,EAAS,6BAA6B,cAAe,GAGrDoC,IACEpC,EAAS,qBACXA,EAAS,mBAAmB,UAAY,CAAE,GAE5CoC,EAAW,kBAAkB,IAAM,OACnCA,EAAW,kBAAkB,IAAM,OACnCpD,GAAgB,aAAaoD,CAAU,EACvCpC,EAAS,cAAc,MAAO,GAE5BA,EAAS,yBACXA,EAAS,wBAAwB,cAAe,CAEnD,EACD,KAAK,oBAAsB,SAAU9R,EAAW,CAC1CmU,GACF,KAAK,kBAAkB,mBAAmB,oBAAoBnU,CAAS,CAE1E,EACD,KAAK,SAAW,SAAUntE,EAAK,CAC7B,IAAIi/E,EAAW,KAAK,kBACpBjoF,EAAQ,MAAQgJ,EACZi/E,GAAYA,EAAS,gBACvBA,EAAS,eAAe,SAASj/E,CAAG,CAEvC,EACD,KAAK,cAAgB,SAAU8/E,EAAiB,CAC1CuB,GAAc,KAAK,kBAAkB,oBACvC,KAAK,kBAAkB,mBAAmB,cAAcvB,CAAe,CAE1E,EACD,KAAK,eAAiB,SAAU/mF,EAAK,CACnC,IAAIsK,EAAO,KACX,OAAO,SAAU+G,EAAO,CACtBA,EAAM,OAASrR,EACfsK,EAAK,QAAQ,MAAO+G,CAAK,CAC1B,CACP,EAEI,KAAK,KAAO,SAAU3H,EAAM,CAC1B,GAAI2+E,EAAY,CACd,IAAIK,EAAQnD,GAAgB77E,CAAI,EAC5Bg/E,GAAS,KAAK,kBAAkB,OAAS,MAC3C,KAAK,iBAAkB,EACd,CAACA,GAAS,KAAK,kBAAkB,OAAS,MACnD,KAAK,gBAAiB,EAExBL,EAAa,EACrB,CACM,KAAK,kBAAkB,eAAe,KAAK3+E,CAAI,CACrD,EAEI,KAAK,MAAQ,UAAY,CACvB2+E,EAAa,GAEb,KAAK,kBAAkB,eAAe,MAAO,CAC9C,EACD,KAAK,YAAc,UAAY,CAC7B,KAAK,kBAAkB,eAAe,YAAa,CACpD,EACD,KAAK,MAAQ,UAAY,CACnB,KAAK,kBAAkB,gBACzB,KAAK,kBAAkB,eAAe,MAAO,CAErD,EAEI,KAAK,cAAgB,UAAY,CAC3B,KAAK,kBAAkB,eACzB,KAAK,kBAAkB,cAAc,MAAO,CAE/C,CACF,EACDxC,GAAW,UAAY,IAAIj2E,GAC3B,IAAIq2E,GAAa,CACf,WAAYJ,EAOd,EAQI8C,GAAe,SAAUxpF,EAAO,CAClC,OAAOA,IAAU,CAClB,EACGypF,GAAgB,SAAUzpF,EAAO,CACnC,OAAQ,KAAOA,EAAM,SAAS,EAAE,GAAG,MAAM,EAAE,CAC5C,EACG0pF,GAAM,CACR,WAAYF,GACZ,YAAaC,EACd,EACGE,GAAc,SAAUt+E,EAAQ,CAClC,IAAI3K,EAAS,GACb,OAAAA,GAAU,OAAO,aAAa2K,EAAO,CAAC,CAAC,EACvC3K,GAAU,OAAO,aAAa2K,EAAO,CAAC,CAAC,EACvC3K,GAAU,OAAO,aAAa2K,EAAO,CAAC,CAAC,EACvC3K,GAAU,OAAO,aAAa2K,EAAO,CAAC,CAAC,EAChC3K,CACR,EACGkpF,GAAcD,GACdE,GAAeH,GAAI,WACnBI,GAAcF,GACdG,GAAY,SAAUx/E,EAAMwF,EAAM,CACpC,IAAI2rB,EAAU,CAAE,EACdn+B,EACAyM,EACAjM,EACAgmB,EACAimE,EACF,GAAI,CAACj6E,EAAK,OAER,OAAO,KAET,IAAKxS,EAAI,EAAGA,EAAIgN,EAAK,YACnBP,EAAO6/E,GAAat/E,EAAKhN,CAAC,GAAK,GAAKgN,EAAKhN,EAAI,CAAC,GAAK,GAAKgN,EAAKhN,EAAI,CAAC,GAAK,EAAIgN,EAAKhN,EAAI,CAAC,CAAC,EACtFQ,EAAO+rF,GAAYv/E,EAAK,SAAShN,EAAI,EAAGA,EAAI,CAAC,CAAC,EAC9CwmB,EAAM/Z,EAAO,EAAIzM,EAAIyM,EAAOO,EAAK,WAC7BxM,IAASgS,EAAK,CAAC,IACbA,EAAK,SAAW,EAGlB2rB,EAAQ,KAAKnxB,EAAK,SAAShN,EAAI,EAAGwmB,CAAG,CAAC,GAGtCimE,EAAaD,GAAUx/E,EAAK,SAAShN,EAAI,EAAGwmB,CAAG,EAAGhU,EAAK,MAAM,CAAC,CAAC,EAC3Di6E,EAAW,SACbtuD,EAAUA,EAAQ,OAAOsuD,CAAU,KAIzCzsF,EAAIwmB,EAGN,OAAO2X,CACR,EACGuuD,GAAYF,GACZG,GAAeR,GAAI,WACnBS,GAAcvvD,EAAQ,UACtBwvD,GAAO,SAAU7/E,EAAM,CACzB,IAAI7J,EAAS,CACX,QAAS6J,EAAK,CAAC,EACf,MAAO,IAAI,WAAWA,EAAK,SAAS,EAAG,CAAC,CAAC,CAC1C,EACD,OAAI7J,EAAO,UAAY,EACrBA,EAAO,oBAAsBypF,GAAY5/E,EAAK,SAAS,CAAC,CAAC,EAEzD7J,EAAO,oBAAsBwpF,GAAa3/E,EAAK,CAAC,GAAK,GAAKA,EAAK,CAAC,GAAK,GAAKA,EAAK,CAAC,GAAK,EAAIA,EAAK,CAAC,CAAC,EAE3F7J,CACR,EACG2pF,GAAcD,GACdE,GAAqB,SAAUtyD,EAAO,CACxC,MAAO,CACL,WAAYA,EAAM,CAAC,EAAI,MAAU,EACjC,UAAWA,EAAM,CAAC,EAAI,EACtB,cAAeA,EAAM,CAAC,EAAI,OAAU,EACpC,eAAgBA,EAAM,CAAC,EAAI,MAAU,EACrC,cAAeA,EAAM,CAAC,EAAI,MAAU,EACpC,gBAAiBA,EAAM,CAAC,EAAI,EAC5B,oBAAqBA,EAAM,CAAC,GAAK,EAAIA,EAAM,CAAC,CAC7C,CACF,EACGuyD,GAAqBD,GACrBE,GAAmBD,GACnBE,GAAO,SAAUlgF,EAAM,CACzB,IAAI7J,EAAS,CACT,QAAS6J,EAAK,CAAC,EACf,MAAO,IAAI,WAAWA,EAAK,SAAS,EAAG,CAAC,CAAC,EACzC,QAAS,CAAA,CACV,EACDqP,EAAO,IAAI,SAASrP,EAAK,OAAQA,EAAK,WAAYA,EAAK,UAAU,EAEjEmgF,EAAoBhqF,EAAO,MAAM,CAAC,EAAI,EAEtCiqF,EAA0BjqF,EAAO,MAAM,CAAC,EAAI,EAE5CkqF,EAAwBlqF,EAAO,MAAM,CAAC,EAAI,EAE1CmqF,EAAoBnqF,EAAO,MAAM,CAAC,EAAI,EAEtCoqF,EAAqBpqF,EAAO,MAAM,CAAC,EAAI,EAEvCqqF,EAAqCrqF,EAAO,MAAM,CAAC,EAAI,EAEvDsgF,EAAcpnE,EAAK,UAAU,CAAC,EAC9BQ,EAAS,EACTm4D,EAgCF,IA/BImY,IAEFhqF,EAAO,WAAakZ,EAAK,SAASQ,CAAM,EACxCA,GAAU,GAIRuwE,GAA2B3J,IAC7BzO,EAAS,CACP,MAAOiY,GAAiBjgF,EAAK,SAAS6P,EAAQA,EAAS,CAAC,CAAC,CAC1D,EACDA,GAAU,EACNwwE,IACFrY,EAAO,SAAW34D,EAAK,UAAUQ,CAAM,EACvCA,GAAU,GAERywE,IACFtY,EAAO,KAAO34D,EAAK,UAAUQ,CAAM,EACnCA,GAAU,GAER2wE,IACErqF,EAAO,UAAY,EACrB6xE,EAAO,sBAAwB34D,EAAK,SAASQ,CAAM,EAEnDm4D,EAAO,sBAAwB34D,EAAK,UAAUQ,CAAM,EAEtDA,GAAU,GAEZ1Z,EAAO,QAAQ,KAAK6xE,CAAM,EAC1ByO,KAEKA,KACLzO,EAAS,CAAE,EACPqY,IACFrY,EAAO,SAAW34D,EAAK,UAAUQ,CAAM,EACvCA,GAAU,GAERywE,IACFtY,EAAO,KAAO34D,EAAK,UAAUQ,CAAM,EACnCA,GAAU,GAER0wE,IACFvY,EAAO,MAAQiY,GAAiBjgF,EAAK,SAAS6P,EAAQA,EAAS,CAAC,CAAC,EACjEA,GAAU,GAER2wE,IACErqF,EAAO,UAAY,EACrB6xE,EAAO,sBAAwB34D,EAAK,SAASQ,CAAM,EAEnDm4D,EAAO,sBAAwB34D,EAAK,UAAUQ,CAAM,EAEtDA,GAAU,GAEZ1Z,EAAO,QAAQ,KAAK6xE,CAAM,EAE5B,OAAO7xE,CACR,EACGsqF,GAAcP,GACdQ,GAAO,SAAU1gF,EAAM,CACzB,IAAIqP,EAAO,IAAI,SAASrP,EAAK,OAAQA,EAAK,WAAYA,EAAK,UAAU,EACnE7J,EAAS,CACP,QAAS6J,EAAK,CAAC,EACf,MAAO,IAAI,WAAWA,EAAK,SAAS,EAAG,CAAC,CAAC,EACzC,QAASqP,EAAK,UAAU,CAAC,CAC1B,EACDsxE,EAAwBxqF,EAAO,MAAM,CAAC,EAAI,EAC1CyqF,EAAgCzqF,EAAO,MAAM,CAAC,EAAI,EAClD0qF,EAA+B1qF,EAAO,MAAM,CAAC,EAAI,EACjD2qF,EAA2B3qF,EAAO,MAAM,CAAC,EAAI,GAC7C4qF,EAA4B5qF,EAAO,MAAM,CAAC,EAAI,GAC9C6qF,EAAkB7qF,EAAO,MAAM,CAAC,EAAI,MACpC8qF,EAAoB9qF,EAAO,MAAM,CAAC,EAAI,OACtCnD,EACF,OAAAA,EAAI,EACA2tF,IACF3tF,GAAK,EAGLmD,EAAO,eAAiBkZ,EAAK,UAAU,EAAE,EACzCrc,GAAK,GAEH4tF,IACFzqF,EAAO,uBAAyBkZ,EAAK,UAAUrc,CAAC,EAChDA,GAAK,GAEH6tF,IACF1qF,EAAO,sBAAwBkZ,EAAK,UAAUrc,CAAC,EAC/CA,GAAK,GAEH8tF,IACF3qF,EAAO,kBAAoBkZ,EAAK,UAAUrc,CAAC,EAC3CA,GAAK,GAEH+tF,IACF5qF,EAAO,mBAAqBkZ,EAAK,UAAUrc,CAAC,GAE1CguF,IACF7qF,EAAO,gBAAkB,IAEvB,CAACwqF,GAAyBM,IAC5B9qF,EAAO,qBAAuB,IAEzBA,CACR,EACG+qF,GAAcR,GACdvvF,GACA,OAAO,OAAW,IACpBA,GAAM,OACG,OAAOyyE,EAAmB,IACnCzyE,GAAMyyE,EACG,OAAO,KAAS,IACzBzyE,GAAM,KAENA,GAAM,CAAE,EAEV,IAAIE,GAAWF,GAWXihC,GAAkCm7C,GAAoB,gCACtD4T,GAAgB9P,GAAc,cAC9B+P,GAAY1B,GACZ2B,GAAcvB,GACdwB,GAAcb,GACdc,GAAcL,GACdM,GAAWnwF,GAYXowF,GAAc,SAAU5xE,EAAQy2D,EAAS,CAE3C,QADIob,EAAoB7xE,EACf7c,EAAI,EAAGA,EAAIszE,EAAQ,OAAQtzE,IAAK,CACvC,IAAIg1E,EAAS1B,EAAQtzE,CAAC,EACtB,GAAI0uF,EAAoB1Z,EAAO,KAC7B,OAAOA,EAET0Z,GAAqB1Z,EAAO,IAClC,CACI,OAAO,IACR,EAgBG2Z,GAAc,SAAUC,EAAWtb,EAAS4R,EAAS,CACvD,IAAI2J,EAAU,IAAI,SAASD,EAAU,OAAQA,EAAU,WAAYA,EAAU,UAAU,EACrFzrF,EAAS,CACP,KAAM,CAAE,EACR,QAAS,CAAA,CACV,EACD2rF,EACA9uF,EACAqT,EACA07E,EACF,IAAK/uF,EAAI,EAAGA,EAAI,EAAI4uF,EAAU,OAAQ5uF,GAAKqT,EAIzC,GAHAA,EAASw7E,EAAQ,UAAU7uF,CAAC,EAC5BA,GAAK,EAED,EAAAqT,GAAU,GAGd,OAAQu7E,EAAU5uF,CAAC,EAAI,GAAI,CACzB,IAAK,GACH,IAAIgN,EAAO4hF,EAAU,SAAS5uF,EAAI,EAAGA,EAAI,EAAIqT,CAAM,EAC/C27E,EAAiBP,GAAYzuF,EAAGszE,CAAO,EAQ3C,GAPAwb,EAAS,CACP,YAAa,WACb,KAAMz7E,EACN,KAAMrG,EACN,YAAaoyB,GAAgCpyB,CAAI,EACjD,QAASk4E,CACV,EACG8J,EACFF,EAAO,IAAME,EAAe,IAC5BF,EAAO,IAAME,EAAe,IAC5BD,EAAoBC,UACXD,EAGTD,EAAO,IAAMC,EAAkB,IAC/BD,EAAO,IAAMC,EAAkB,QAC1B,CACL5rF,EAAO,KAAK,KAAK,CACf,MAAO,OACP,QAAS,gDAAmDnD,EAAI,gBAAkBklF,EAAU,mBAC1G,CAAa,EACD,KACZ,CACU/hF,EAAO,QAAQ,KAAK2rF,CAAM,EAC1B,KACV,CAEI,OAAO3rF,CACR,EAeG8rF,GAAe,SAAUC,EAAO5V,EAAqBoU,EAAM,CAC7D,IAAItI,EAAa9L,EACb6V,EAAwBzB,EAAK,uBAAyB,EACtD0B,EAAoB1B,EAAK,mBAAqB,EAC9CxI,EAAUwI,EAAK,QACf2B,EAAa,CAAE,EACnB,OAAAH,EAAM,QAAQ,SAAUhC,EAAM,CAI5B,IAAIoC,EAAWhB,GAAYpB,CAAI,EAC3B5Z,EAAUgc,EAAS,QACvBhc,EAAQ,QAAQ,SAAU0B,EAAQ,CAC5BA,EAAO,WAAa,SACtBA,EAAO,SAAWma,GAEhBna,EAAO,OAAS,SAClBA,EAAO,KAAOoa,GAEhBpa,EAAO,QAAUkQ,EACjBlQ,EAAO,IAAMoQ,EACTpQ,EAAO,wBAA0B,SACnCA,EAAO,sBAAwB,GAE7B,OAAOoQ,GAAe,UACxBpQ,EAAO,IAAMoQ,EAAaoJ,GAAS,OAAOxZ,EAAO,qBAAqB,EACtEoQ,GAAcoJ,GAAS,OAAOxZ,EAAO,QAAQ,IAE7CA,EAAO,IAAMoQ,EAAapQ,EAAO,sBACjCoQ,GAAcpQ,EAAO,SAE/B,CAAO,EACDqa,EAAaA,EAAW,OAAO/b,CAAO,CAC5C,CAAK,EACM+b,CACR,EAUGE,GAAmB,SAAU95E,EAAS+5E,EAAc,CAEtD,IAAIC,EAAQrB,GAAU34E,EAAS,CAAC,OAAQ,MAAM,CAAC,EAE3Ci6E,EAAQtB,GAAU34E,EAAS,CAAC,MAAM,CAAC,EACnCk6E,EAAc,CAAE,EAChBC,EAAgB,CAAA,EAEpB,OAAAF,EAAM,QAAQ,SAAUre,EAAMhuE,EAAO,CACnC,IAAIwsF,EAAeJ,EAAMpsF,CAAK,EAC9BusF,EAAc,KAAK,CACjB,KAAMve,EACN,KAAMwe,CACd,CAAO,CACP,CAAK,EACDD,EAAc,QAAQ,SAAUE,EAAM,CACpC,IAAIze,EAAOye,EAAK,KACZ1d,EAAO0d,EAAK,KACZpC,EAAOU,GAAUhc,EAAM,CAAC,MAAM,CAAC,EAE/B2d,EAAaxB,GAAYb,EAAK,CAAC,CAAC,EAChCxI,EAAU6K,EAAW,QACrBlD,EAAOuB,GAAUhc,EAAM,CAAC,MAAM,CAAC,EAE/BkH,EAAsBuT,EAAK,OAAS,EAAIwB,GAAYxB,EAAK,CAAC,CAAC,EAAE,oBAAsB,EACnFqC,EAAQd,GAAUhc,EAAM,CAAC,MAAM,CAAC,EAChCkB,EACAnwE,GAEAqsF,IAAiBtK,GAAWgK,EAAM,OAAS,IAC7C5b,EAAU2b,GAAaC,EAAO5V,EAAqByW,CAAU,EAC7D5sF,GAASwrF,GAAYtd,EAAMiC,EAAS4R,CAAO,EACtCyK,EAAYzK,CAAO,IACtByK,EAAYzK,CAAO,EAAI,CACrB,QAAS,CAAE,EACX,KAAM,CAAA,CACP,GAEHyK,EAAYzK,CAAO,EAAE,QAAUyK,EAAYzK,CAAO,EAAE,QAAQ,OAAO/hF,GAAO,OAAO,EACjFwsF,EAAYzK,CAAO,EAAE,KAAOyK,EAAYzK,CAAO,EAAE,KAAK,OAAO/hF,GAAO,IAAI,EAEhF,CAAK,EACMwsF,CACR,EAqBGK,GAAwB,SAAUv6E,EAASyvE,EAASv2D,EAAW,CACjE,IAAIghE,EAEJ,GAAIzK,IAAY,KACd,OAAO,KAETyK,EAAcJ,GAAiB95E,EAASyvE,CAAO,EAC/C,IAAI+K,EAAYN,EAAYzK,CAAO,GAAK,CAAE,EAC1C,MAAO,CACL,QAAS+K,EAAU,QACnB,KAAMA,EAAU,KAChB,UAAWthE,CACZ,CACF,EAKGuhE,GAAgB,UAAY,CAC9B,IAAIC,EAAgB,GAChB9R,EAEA+R,EAEAlL,EAEAv2D,EAEA0hE,EAEAC,EAMJ,KAAK,cAAgB,UAAY,CAC/B,OAAOH,CACR,EAMD,KAAK,KAAO,SAAU5uF,EAAS,CAC7B88E,EAAgB,IAAI8P,GACpBgC,EAAgB,GAChBG,EAAiB/uF,EAAUA,EAAQ,UAAY,GAE/C88E,EAAc,GAAG,OAAQ,SAAU1pE,EAAO,CAExCA,EAAM,UAAYA,EAAM,SAAWga,EACnCha,EAAM,QAAUA,EAAM,OAASga,EAC/B0hE,EAAe,SAAS,KAAK17E,CAAK,EAClC07E,EAAe,eAAe17E,EAAM,MAAM,EAAI,EACtD,CAAO,EACD0pE,EAAc,GAAG,MAAO,SAAU18C,EAAK,CACrC0uD,EAAe,KAAK,KAAK1uD,CAAG,CACpC,CAAO,CACF,EAOD,KAAK,UAAY,SAAU4uD,EAAeC,EAAY,CACpD,OAAID,GAAiBA,EAAc,SAAW,GAAKC,GAAc,OAAOA,GAAe,UAAY,OAAO,KAAKA,CAAU,EAAE,SAAW,EAC7H,GAEFtL,IAAYqL,EAAc,CAAC,GAAK5hE,IAAc6hE,EAAWtL,CAAO,CACxE,EAYD,KAAK,MAAQ,SAAUzvE,EAAS86E,EAAeC,EAAY,CACzD,IAAIC,EACJ,GAAK,KAAK,gBAEH,IAAI,CAACF,GAAiB,CAACC,EAC5B,OAAO,KACF,GAAI,KAAK,UAAUD,EAAeC,CAAU,EAGjDtL,EAAUqL,EAAc,CAAC,EACzB5hE,EAAY6hE,EAAWtL,CAAO,UAGrBA,IAAY,MAAQ,CAACv2D,EAC9B,OAAAyhE,EAAa,KAAK36E,CAAO,EAClB,SAZP,QAAO,KAeT,KAAO26E,EAAa,OAAS,GAAG,CAC9B,IAAIM,EAAgBN,EAAa,MAAO,EACxC,KAAK,MAAMM,EAAeH,EAAeC,CAAU,CAC3D,CAKM,OAJAC,EAAaT,GAAsBv6E,EAASyvE,EAASv2D,CAAS,EAC1D8hE,GAAcA,EAAW,OAC3BJ,EAAe,KAAOA,EAAe,KAAK,OAAOI,EAAW,IAAI,GAE9DA,IAAe,MAAQ,CAACA,EAAW,QACjCJ,EAAe,KAAK,OACf,CACL,KAAMA,EAAe,KACrB,SAAU,CAAE,EACZ,eAAgB,CAAA,CACjB,EAEI,MAET,KAAK,SAASI,EAAW,OAAO,EAEhC,KAAK,YAAa,EACXJ,EACR,EAQD,KAAK,SAAW,SAAUM,EAAM,CAC9B,GAAI,CAAC,KAAK,cAAe,GAAI,CAACA,GAAQA,EAAK,SAAW,EACpD,OAAO,KAETA,EAAK,QAAQ,SAAUC,EAAK,CAC1BvS,EAAc,KAAKuS,CAAG,CAC9B,CAAO,CACF,EAMD,KAAK,YAAc,UAAY,CAC7B,GAAI,CAAC,KAAK,gBACR,OAAO,KAEJN,EAGHjS,EAAc,aAAc,EAF5BA,EAAc,MAAO,CAIxB,EAKD,KAAK,oBAAsB,UAAY,CACrCgS,EAAe,SAAW,CAAE,EAC5BA,EAAe,eAAiB,CAAE,EAClCA,EAAe,KAAO,CAAE,CACzB,EAMD,KAAK,mBAAqB,UAAY,CACpC,GAAI,CAAC,KAAK,gBACR,OAAO,KAEThS,EAAc,MAAO,CACtB,EAOD,KAAK,iBAAmB,UAAY,CAClC,KAAK,oBAAqB,EAC1B,KAAK,mBAAoB,CAC1B,EAKD,KAAK,MAAQ,UAAY,CACvB+R,EAAe,CAAE,EACjBlL,EAAU,KACVv2D,EAAY,KACP0hE,EAQH,KAAK,oBAAqB,EAP1BA,EAAiB,CACf,SAAU,CAAE,EAEZ,eAAgB,CAAE,EAClB,KAAM,CAAA,CACP,EAIH,KAAK,mBAAoB,CAC1B,EACD,KAAK,MAAO,CACb,EACGQ,GAAgBX,GAOhBY,GAAmB,SAAU9jF,EAAM,CAIrC,QAHI3J,EAAQ,EACR0tF,EAAU,OAAO,aAAa/jF,EAAK3J,CAAK,CAAC,EACzC2tF,EAAY,GACTD,IAAY,MACjBC,GAAaD,EACb1tF,IACA0tF,EAAU,OAAO,aAAa/jF,EAAK3J,CAAK,CAAC,EAG3C,OAAA2tF,GAAaD,EACNC,CACR,EACGtxF,GAAS,CACX,eAAgBoxF,EACjB,EACGG,GAAiBvxF,GAAO,eACxBwxF,GAAc7zD,EAAQ,UAYtB8zD,GAAe,SAAUC,EAAS,CAEpC,IAAIv0E,EAAS,EACToF,EAAUmvE,EAAQ,CAAC,EACnBC,EAAe5uF,EAAOksB,EAAW2iE,EAAmBC,EAAyBC,EAAgBpsE,EAAIqsE,EACrG,GAAIxvE,IAAY,EAAG,CACjBovE,EAAgBJ,GAAeG,EAAQ,SAASv0E,CAAM,CAAC,EACvDA,GAAUw0E,EAAc,OACxB5uF,EAAQwuF,GAAeG,EAAQ,SAASv0E,CAAM,CAAC,EAC/CA,GAAUpa,EAAM,OAChB,IAAI26B,EAAK,IAAI,SAASg0D,EAAQ,MAAM,EACpCziE,EAAYyO,EAAG,UAAUvgB,CAAM,EAC/BA,GAAU,EACV00E,EAA0Bn0D,EAAG,UAAUvgB,CAAM,EAC7CA,GAAU,EACV20E,EAAiBp0D,EAAG,UAAUvgB,CAAM,EACpCA,GAAU,EACVuI,EAAKgY,EAAG,UAAUvgB,CAAM,EACxBA,GAAU,CAChB,SAAeoF,IAAY,EAAG,CACxB,IAAImb,EAAK,IAAI,SAASg0D,EAAQ,MAAM,EACpCziE,EAAYyO,EAAG,UAAUvgB,CAAM,EAC/BA,GAAU,EACVy0E,EAAoBJ,GAAYE,EAAQ,SAASv0E,CAAM,CAAC,EACxDA,GAAU,EACV20E,EAAiBp0D,EAAG,UAAUvgB,CAAM,EACpCA,GAAU,EACVuI,EAAKgY,EAAG,UAAUvgB,CAAM,EACxBA,GAAU,EACVw0E,EAAgBJ,GAAeG,EAAQ,SAASv0E,CAAM,CAAC,EACvDA,GAAUw0E,EAAc,OACxB5uF,EAAQwuF,GAAeG,EAAQ,SAASv0E,CAAM,CAAC,EAC/CA,GAAUpa,EAAM,MACtB,CACIgvF,EAAe,IAAI,WAAWL,EAAQ,SAASv0E,EAAQu0E,EAAQ,UAAU,CAAC,EAC1E,IAAIM,EAAU,CACZ,cAAAL,EACA,MAAA5uF,EAEA,UAAWksB,GAAwB,EACnC,kBAAA2iE,EACA,wBAAAC,EACA,eAAAC,EACA,GAAApsE,EACA,aAAAqsE,CACD,EACD,OAAOE,GAAe1vE,EAASyvE,CAAO,EAAIA,EAAU,MACrD,EAUGE,GAAY,SAAU3hE,EAAkBtB,EAAWkjE,EAAWh1E,EAAQ,CACxE,OAAOoT,GAAoBA,IAAqB,EAAIA,EAAmBtB,EAAY9R,EAASg1E,EAAYljE,CACzG,EAQGgjE,GAAiB,SAAU1vE,EAAS6vE,EAAM,CAC5C,IAAIC,EAAYD,EAAK,gBAAkB,KACnCE,EAAe/vE,IAAY,GAAKgwE,GAAUH,EAAK,uBAAuB,GAAKC,EAC3EG,EAAejwE,IAAY,GAAKgwE,GAAUH,EAAK,iBAAiB,GAAKC,EAEzE,MAAO,EAAE9vE,EAAU,IAAM+vE,GAAgBE,CAC7C,EAEMD,GAAY,SAAUjlF,EAAM,CAC9B,OAAOA,IAAS,QAAaA,IAAS,IACvC,EACGmlF,GAAS,CACX,aAAchB,GACd,UAAWS,EACZ,EAUGQ,GAAajG,GAAI,WACjBvP,GAAcuP,GAAI,YAClBluD,GAAUyuD,GACV2F,GAAchG,GACdyF,GAAOK,GACPG,GAAYpE,GACZqE,GAAY9E,GACZ+E,GAAY1F,GACZ5vD,GAAYG,EAAQ,UACpB1O,GAAWzf,GAAWujF,GAAsBC,GAAkBC,GAAWC,GAA6BC,GACtG5wD,GAAW5jC,GACXy0F,GAAiB1S,GAAS,eAoB9BzxD,GAAY,SAAUokE,EAAM,CAC1B,IAAI5vF,EAAS,CAAE,EACb6vF,EAAQ/0D,GAAQ80D,EAAM,CAAC,OAAQ,MAAM,CAAC,EAExC,OAAOC,EAAM,OAAO,SAAU7vF,EAAQyuE,EAAM,CAC1C,IAAIC,EAAM5vD,EAAS5e,EAAO+hB,EAAI2sD,EAS9B,OARAF,EAAO5zC,GAAQ2zC,EAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAC5B,CAACC,IAGL5vD,EAAU4vD,EAAK,CAAC,EAChBxuE,EAAQ4e,IAAY,EAAI,GAAK,GAC7BmD,EAAKgtE,GAAWvgB,EAAKxuE,CAAK,GAAK,GAAKwuE,EAAKxuE,EAAQ,CAAC,GAAK,GAAKwuE,EAAKxuE,EAAQ,CAAC,GAAK,EAAIwuE,EAAKxuE,EAAQ,CAAC,CAAC,EAClG0uE,EAAO9zC,GAAQ2zC,EAAM,CAAC,OAAQ,MAAM,CAAC,EAAE,CAAC,EACpC,CAACG,GACI,MAET9vD,EAAU8vD,EAAK,CAAC,EAChB1uE,EAAQ4e,IAAY,EAAI,GAAK,GAC7B9e,EAAOiiB,CAAE,EAAIgtE,GAAWrgB,EAAK1uE,CAAK,GAAK,GAAK0uE,EAAK1uE,EAAQ,CAAC,GAAK,GAAK0uE,EAAK1uE,EAAQ,CAAC,GAAK,EAAI0uE,EAAK1uE,EAAQ,CAAC,CAAC,EACnGF,EACR,EAAEA,CAAM,CACV,EAkBD+L,GAAY,SAAUyf,EAAWk0D,EAAU,CACzC,IAAI4M,EAEJA,EAAQxxD,GAAQ4kD,EAAU,CAAC,OAAQ,MAAM,CAAC,EAE1C,IAAIoQ,EAAaxD,EAAM,OAAO,SAAU76E,EAAKw9D,EAAM,CACjD,IAAIsb,EAAOzvD,GAAQm0C,EAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAEhChtD,EAAKgtE,GAAW1E,EAAK,CAAC,GAAK,GAAKA,EAAK,CAAC,GAAK,GAAKA,EAAK,CAAC,GAAK,EAAIA,EAAK,CAAC,CAAC,EAEtEnU,EAAQ5qD,EAAUvJ,CAAE,GAAK,IAEzBynE,EAAO5uD,GAAQm0C,EAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAChCh1C,EAAK,IAAI,SAASyvD,EAAK,OAAQA,EAAK,WAAYA,EAAK,UAAU,EAC/DqG,EAEArG,EAAK,CAAC,IAAM,EACdqG,EAAWh2D,GAAU2vD,EAAK,SAAS,EAAG,EAAE,CAAC,EAEzCqG,EAAW91D,EAAG,UAAU,CAAC,EAG3B,IAAIuW,EACJ,OAAI,OAAOu/C,GAAa,SACtBv/C,EAAUu/C,EAAWjxD,GAAS,OAAOs3C,CAAK,EACjC,OAAO2Z,GAAa,UAAY,CAAC,MAAMA,CAAQ,IACxDv/C,EAAUu/C,EAAW3Z,GAEnB5lC,EAAU,OAAO,mBACnBA,EAAU,OAAOA,CAAO,GAEtBA,EAAU/+B,IACZA,EAAM++B,GAED/+B,CACR,EAAE,GAAQ,EACX,OAAO,OAAOq+E,GAAe,UAAY,SAASA,CAAU,EAAIA,EAAa,CAC9E,EAqBDR,GAAuB,SAAUjC,EAAY3N,EAAU,CACrD,IAAIsQ,EAAYl1D,GAAQ4kD,EAAU,CAAC,OAAQ,MAAM,CAAC,EAC9CvJ,EAAsB,EACtBzE,EAAwB,EACxBqQ,EACJ,GAAIiO,GAAaA,EAAU,OAAQ,CAIjC,IAAIzF,EAAOzvD,GAAQk1D,EAAU,CAAC,EAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EACxCjG,EAAOjvD,GAAQk1D,EAAU,CAAC,EAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EACxCtG,EAAO5uD,GAAQk1D,EAAU,CAAC,EAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAC5C,GAAIzF,EAAM,CACR,IAAI0F,EAAad,GAAU5E,CAAI,EAC/BxI,EAAUkO,EAAW,OAC7B,CACM,GAAIvG,EAAM,CACR,IAAIwG,EAAab,GAAU3F,CAAI,EAC/BvT,EAAsB+Z,EAAW,mBACzC,CACM,GAAInG,EAAM,CACR,IAAIoG,EAAaf,GAAUrF,CAAI,EAC3BoG,EAAW,SAAWA,EAAW,QAAQ,SAC3Cze,EAAwBye,EAAW,QAAQ,CAAC,EAAE,uBAAyB,EAEjF,CACK,CAGD,IAAI3kE,EAAY6hE,EAAWtL,CAAO,GAAK,IAEnC,OAAO5L,GAAwB,WACjCzE,EAAwB5yC,GAAS,OAAO4yC,CAAqB,EAC7DlmD,EAAYsT,GAAS,OAAOtT,CAAS,GAEvC,IAAIxrB,GAAUm2E,EAAsBzE,GAAyBlmD,EAC7D,OAAI,OAAOxrB,GAAW,UAAYA,EAAS,OAAO,mBAChDA,EAAS,OAAOA,CAAM,GAEjBA,CACR,EAaDuvF,GAAmB,SAAUK,EAAM,CACjC,IAAIC,EAAQ/0D,GAAQ80D,EAAM,CAAC,OAAQ,MAAM,CAAC,EACtCxC,EAAgB,CAAE,EACtB,OAAAyC,EAAM,QAAQ,SAAUphB,EAAM,CAC5B,IAAI2hB,EAAQt1D,GAAQ2zC,EAAM,CAAC,OAAQ,MAAM,CAAC,EACtC4hB,EAAQv1D,GAAQ2zC,EAAM,CAAC,MAAM,CAAC,EAClC2hB,EAAM,QAAQ,SAAUvhB,EAAM3uE,EAAO,CACnC,IAAIowF,EAAcpB,GAAYrgB,EAAK,SAAS,EAAG,EAAE,CAAC,EAC9CH,EAAO2hB,EAAMnwF,CAAK,EAClBgZ,EACA4F,EACAijE,EACAuO,IAAgB,SAClBp3E,EAAO,IAAI,SAASw1D,EAAK,OAAQA,EAAK,WAAYA,EAAK,UAAU,EACjE5vD,EAAU5F,EAAK,SAAS,CAAC,EACzB6oE,EAAUjjE,IAAY,EAAI5F,EAAK,UAAU,EAAE,EAAIA,EAAK,UAAU,EAAE,EAChEk0E,EAAc,KAAKrL,CAAO,EAEpC,CAAO,CACP,CAAK,EACMqL,CACR,EACDqC,GAA8B,SAAU7gB,EAAM,CAE5C,IAAI9vD,EAAU8vD,EAAK,CAAC,EAChB1uE,EAAQ4e,IAAY,EAAI,GAAK,GACjC,OAAOmwE,GAAWrgB,EAAK1uE,CAAK,GAAK,GAAK0uE,EAAK1uE,EAAQ,CAAC,GAAK,GAAK0uE,EAAK1uE,EAAQ,CAAC,GAAK,EAAI0uE,EAAK1uE,EAAQ,CAAC,CAAC,CACrG,EAMDsvF,GAAY,SAAUI,EAAM,CAC1B,IAAIC,EAAQ/0D,GAAQ80D,EAAM,CAAC,OAAQ,MAAM,CAAC,EACtC38C,EAAS,CAAE,EACf,OAAA48C,EAAM,QAAQ,SAAUphB,EAAM,CAC5B,IAAI5nE,EAAQ,CAAE,EACV6nE,EAAO5zC,GAAQ2zC,EAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAChCv1D,EAAMq3E,EAEN7hB,IACFx1D,EAAO,IAAI,SAASw1D,EAAK,OAAQA,EAAK,WAAYA,EAAK,UAAU,EACjE6hB,EAAcr3E,EAAK,SAAS,CAAC,EAC7BrS,EAAM,GAAK0pF,IAAgB,EAAIr3E,EAAK,UAAU,EAAE,EAAIA,EAAK,UAAU,EAAE,GAEvE,IAAI21D,EAAO/zC,GAAQ2zC,EAAM,CAAC,OAAQ,MAAM,CAAC,EAAE,CAAC,EAE5C,GAAII,EAAM,CACR,IAAIxxE,EAAO6xF,GAAYrgB,EAAK,SAAS,EAAG,EAAE,CAAC,EACvCxxE,IAAS,OACXwJ,EAAM,KAAO,QACJxJ,IAAS,OAClBwJ,EAAM,KAAO,QAEbA,EAAM,KAAOxJ,CAEhB,CAED,IAAI2xE,EAAOl0C,GAAQ2zC,EAAM,CAAC,OAAQ,OAAQ,OAAQ,MAAM,CAAC,EAAE,CAAC,EAC5D,GAAIO,EAAM,CACR,IAAIwhB,EAAqBxhB,EAAK,SAAS,CAAC,EAExCnoE,EAAM,MAAQqoF,GAAYsB,EAAmB,SAAS,EAAG,CAAC,CAAC,EAC3D,IAAIC,EAAW31D,GAAQ01D,EAAoB,CAAC3pF,EAAM,KAAK,CAAC,EAAE,CAAC,EACvD6pF,EAAaC,EACbF,IAEE,kBAAkB,KAAK5pF,EAAM,KAAK,GAGpC6pF,EAAcD,EAAS,SAAS,EAAE,EAClCE,EAAkBzB,GAAYwB,EAAY,SAAS,EAAG,CAAC,CAAC,EACpDC,IAAoB,QAAUD,EAAY,OAAS,IACrD7pF,EAAM,OAAS,IAGfA,EAAM,OAAS4yE,GAAYiX,EAAY,CAAC,CAAC,EAEzC7pF,EAAM,OAAS4yE,GAAYiX,EAAY,EAAE,CAAC,EAE1C7pF,EAAM,OAAS4yE,GAAYiX,EAAY,EAAE,CAAC,GAI1C7pF,EAAM,MAAQ,eAEP,cAAc,KAAKA,EAAM,KAAK,GAEvC6pF,EAAcD,EAAS,SAAS,EAAE,EAClCE,EAAkBzB,GAAYwB,EAAY,SAAS,EAAG,CAAC,CAAC,EACpDC,IAAoB,QAAUD,EAAY,OAAS,IAAMA,EAAY,EAAE,IAAM,GAC/E7pF,EAAM,OAAS,IAAM4yE,GAAYiX,EAAY,EAAE,CAAC,EAEhD7pF,EAAM,OAAS,IAAM4yE,GAAYiX,EAAY,EAAE,IAAM,EAAI,EAAI,EAAE,QAAQ,KAAM,EAAE,GAI/E7pF,EAAM,MAAQ,aAIhBA,EAAM,MAAQA,EAAM,MAAM,YAAa,EAGnD,CACM,IAAI+nE,EAAO9zC,GAAQ2zC,EAAM,CAAC,OAAQ,MAAM,CAAC,EAAE,CAAC,EACxCG,IACF/nE,EAAM,UAAY4oF,GAA4B7gB,CAAI,GAEpD37B,EAAO,KAAKpsC,CAAK,CACvB,CAAK,EACMosC,CACR,EAYDy8C,GAAa,SAAUkB,EAAal3E,EAAS,EAAG,CAC9C,IAAIm3E,EAAY/1D,GAAQ81D,EAAa,CAAC,MAAM,CAAC,EAC7C,OAAOC,EAAU,IAAIhnF,GAAQ,CAC3B,IAAIinF,EAAYnC,GAAK,aAAa,IAAI,WAAW9kF,CAAI,CAAC,EAClDknF,EAAkBpB,GAAemB,EAAU,YAAY,EAC3D,MAAO,CACL,QAASnC,GAAK,UAAUmC,EAAU,kBAAmBA,EAAU,UAAWA,EAAU,wBAAyBp3E,CAAM,EACnH,SAAUi1E,GAAK,UAAUmC,EAAU,eAAgBA,EAAU,SAAS,EACtE,OAAQC,CACT,CACP,CAAK,CACF,EACD,IAAIC,GAAU,CAEZ,QAASl2D,GACT,UAAWo0D,GACX,UAAW1jE,GACX,UAAWzf,GACX,qBAAsBujF,GACtB,cAAeC,GACf,OAAQC,GACR,4BAA6BC,GAC7B,WAAYC,EACb,EAUGuB,GAAgB9V,GAChB+V,GAAW,SAAUpZ,EAAQ,CAC/B,IAAIgH,EAAMhH,EAAO,CAAC,EAAI,GACtB,OAAAgH,IAAQ,EACRA,GAAOhH,EAAO,CAAC,EACRgH,CACR,EACGqS,GAAiC,SAAUrZ,EAAQ,CACrD,MAAO,CAAC,EAAEA,EAAO,CAAC,EAAI,GACvB,EACGsZ,GAAqB,SAAUtZ,EAAQ,CACzC,IAAIp+D,EAAS,EAMb,OAAKo+D,EAAO,CAAC,EAAI,MAAU,EAAI,IAC7Bp+D,GAAUo+D,EAAO,CAAC,EAAI,GAEjBp+D,CACR,EACG23E,GAAY,SAAUvZ,EAAQwZ,EAAQ,CACxC,IAAIxS,EAAMoS,GAASpZ,CAAM,EACzB,OAAIgH,IAAQ,EACH,MACEA,IAAQwS,EACV,MACEA,EACF,MAEF,IACR,EACGjT,GAAW,SAAUvG,EAAQ,CAC/B,IAAIyZ,EAAOJ,GAA+BrZ,CAAM,EAC5Cp+D,EAAS,EAAI03E,GAAmBtZ,CAAM,EAC1C,OAAIyZ,IACF73E,GAAUo+D,EAAOp+D,CAAM,EAAI,IAErBo+D,EAAOp+D,EAAS,EAAE,EAAI,KAAS,EAAIo+D,EAAOp+D,EAAS,EAAE,CAC9D,EACG4kE,GAAW,SAAUxG,EAAQ,CAC/B,IAAIoH,EAAkB,CAAE,EACpBqS,EAAOJ,GAA+BrZ,CAAM,EAC5C0Z,EAAgB,EAAIJ,GAAmBtZ,CAAM,EASjD,GARIyZ,IACFC,GAAiB1Z,EAAO0Z,CAAa,EAAI,GAOvC,GAAE1Z,EAAO0Z,EAAgB,CAAC,EAAI,GAGlC,KAAI9S,EAAeC,EAAUC,EAE7BF,GAAiB5G,EAAO0Z,EAAgB,CAAC,EAAI,KAAS,EAAI1Z,EAAO0Z,EAAgB,CAAC,EAClF7S,EAAW,EAAID,EAAgB,EAG/BE,GAAqB9G,EAAO0Z,EAAgB,EAAE,EAAI,KAAS,EAAI1Z,EAAO0Z,EAAgB,EAAE,EAGxF,QADI93E,EAAS,GAAKklE,EACXllE,EAASilE,GAAU,CACxB,IAAI9hF,EAAI20F,EAAgB93E,EAExBwlE,GAAiBpH,EAAOj7E,EAAI,CAAC,EAAI,KAAS,EAAIi7E,EAAOj7E,EAAI,CAAC,CAAC,EAAIi7E,EAAOj7E,CAAC,EAGvE6c,KAAYo+D,EAAOj7E,EAAI,CAAC,EAAI,KAAS,EAAIi7E,EAAOj7E,EAAI,CAAC,GAAK,CAChE,CACI,OAAOqiF,EACR,EACGuS,GAAe,SAAU3Z,EAAQoH,EAAiB,CACpD,IAAIJ,EAAMoS,GAASpZ,CAAM,EACrBz6E,EAAO6hF,EAAgBJ,CAAG,EAC9B,OAAQzhF,EAAI,CACV,KAAK4zF,GAAc,iBACjB,MAAO,QACT,KAAKA,GAAc,iBACjB,MAAO,QACT,KAAKA,GAAc,qBACjB,MAAO,iBACT,QACE,OAAO,IACf,CACG,EACGS,GAAe,SAAU5Z,EAAQ,CACnC,IAAIyZ,EAAOJ,GAA+BrZ,CAAM,EAChD,GAAI,CAACyZ,EACH,OAAO,KAET,IAAI73E,EAAS,EAAI03E,GAAmBtZ,CAAM,EAC1C,GAAIp+D,GAAUo+D,EAAO,WAWnB,OAAO,KAET,IAAIsH,EAAM,KACNC,EAIJ,OAAAA,EAAcvH,EAAOp+D,EAAS,CAAC,EAS3B2lE,EAAc,MAChBD,EAAM,CAAA,EAINA,EAAI,KAAOtH,EAAOp+D,EAAS,CAAC,EAAI,KAAS,IAAMo+D,EAAOp+D,EAAS,EAAE,EAAI,MAAS,IAAMo+D,EAAOp+D,EAAS,EAAE,EAAI,MAAS,IAAMo+D,EAAOp+D,EAAS,EAAE,EAAI,MAAS,GAAKo+D,EAAOp+D,EAAS,EAAE,EAAI,OAAU,EAC7L0lE,EAAI,KAAO,EAEXA,EAAI,MAAQtH,EAAOp+D,EAAS,EAAE,EAAI,KAAU,EAE5C0lE,EAAI,IAAMA,EAAI,IACVC,EAAc,KAChBD,EAAI,KAAOtH,EAAOp+D,EAAS,EAAE,EAAI,KAAS,IAAMo+D,EAAOp+D,EAAS,EAAE,EAAI,MAAS,IAAMo+D,EAAOp+D,EAAS,EAAE,EAAI,MAAS,IAAMo+D,EAAOp+D,EAAS,EAAE,EAAI,MAAS,GAAKo+D,EAAOp+D,EAAS,EAAE,EAAI,OAAU,EAC9L0lE,EAAI,KAAO,EAEXA,EAAI,MAAQtH,EAAOp+D,EAAS,EAAE,EAAI,KAAU,IAIzC0lE,CACR,EACGuS,GAAmB,SAAUt0F,EAAM,CACrC,OAAQA,EAAI,CACV,IAAK,GACH,MAAO,4CACT,IAAK,GACH,MAAO,WACT,IAAK,GACH,MAAO,yBACT,IAAK,GACH,MAAO,yBACT,IAAK,GACH,MAAO,6BACT,QACE,OAAO,IACf,CACG,EACGu0F,GAA8B,SAAU9Z,EAAQ,CAQlD,QAPIp+D,EAAS,EAAI03E,GAAmBtZ,CAAM,EACtC+Z,EAAc/Z,EAAO,SAASp+D,CAAM,EACpCo4E,EAAS,EACTC,EAAiB,EACjBC,EAAgB,GAChBn1D,EAEGk1D,EAAiBF,EAAY,WAAa,EAAGE,IAClD,GAAIF,EAAYE,EAAiB,CAAC,IAAM,EAAG,CAEzCD,EAASC,EAAiB,EAC1B,KACR,CAEI,KAAOD,EAASD,EAAY,YAG1B,OAAQA,EAAYC,CAAM,EAAC,CACzB,IAAK,GAEH,GAAID,EAAYC,EAAS,CAAC,IAAM,EAAG,CACjCA,GAAU,EACV,KACD,SAAUD,EAAYC,EAAS,CAAC,IAAM,EAAG,CACxCA,IACA,KACZ,CACcC,EAAiB,IAAMD,EAAS,IAClCj1D,EAAU80D,GAAiBE,EAAYE,EAAiB,CAAC,EAAI,EAAI,EAC7Dl1D,IAAY,8CACdm1D,EAAgB,KAIpB,GACEF,UACOD,EAAYC,CAAM,IAAM,GAAKA,EAASD,EAAY,QAC3DE,EAAiBD,EAAS,EAC1BA,GAAU,EACV,MACF,IAAK,GAEH,GAAID,EAAYC,EAAS,CAAC,IAAM,GAAKD,EAAYC,EAAS,CAAC,IAAM,EAAG,CAClEA,GAAU,EACV,KACZ,CACUj1D,EAAU80D,GAAiBE,EAAYE,EAAiB,CAAC,EAAI,EAAI,EAC7Dl1D,IAAY,8CACdm1D,EAAgB,IAElBD,EAAiBD,EAAS,EAC1BA,GAAU,EACV,MACF,QAGEA,GAAU,EACV,KACV,CAEI,OAAAD,EAAcA,EAAY,SAASE,CAAc,EACjDD,GAAUC,EACVA,EAAiB,EAEbF,GAAeA,EAAY,WAAa,IAC1Ch1D,EAAU80D,GAAiBE,EAAYE,EAAiB,CAAC,EAAI,EAAI,EAC7Dl1D,IAAY,8CACdm1D,EAAgB,KAGbA,CACR,EACGC,GAAU,CACZ,UAAWZ,GACX,SAAUhT,GACV,SAAUC,GACV,+BAAgC6S,GAChC,aAAcM,GACd,aAAcC,GACd,4BAA6BE,EAC9B,EAUGM,GAAc/W,GACdgX,GAAiBvW,GAAwB,eACzCwW,GAAQ,CAAE,EACdA,GAAM,GAAKH,GACXG,GAAM,IAAMhrB,GACZ,IAAIirB,GAAmB3d,GAAQ,iBAC3B4d,GAAqB,IAEvBC,GAAY,GAMVC,GAAY,SAAU36E,EAAO4mE,EAAK,CAKpC,QAJIz2D,EAAa,EACfwF,EAAW8kE,GACXxa,EACAz6E,EACKmwB,EAAW3V,EAAM,YAAY,CAElC,GAAIA,EAAMmQ,CAAU,IAAMuqE,IAAa16E,EAAM2V,CAAQ,IAAM+kE,GAAW,CAIpE,OAFAza,EAASjgE,EAAM,SAASmQ,EAAYwF,CAAQ,EAC5CnwB,EAAO+0F,GAAM,GAAG,UAAUta,EAAQ2G,EAAI,GAAG,EACjCphF,EAAI,CACV,IAAK,MACHohF,EAAI,IAAM2T,GAAM,GAAG,SAASta,CAAM,EAClC,MACF,IAAK,MACH,IAAI2a,EAAQL,GAAM,GAAG,SAASta,CAAM,EACpC2G,EAAI,MAAQA,EAAI,OAAS,CAAE,EAC3B,OAAO,KAAKgU,CAAK,EAAE,QAAQ,SAAUtyF,EAAK,CACxCs+E,EAAI,MAAMt+E,CAAG,EAAIsyF,EAAMtyF,CAAG,CACxC,CAAa,EACD,KACZ,CACQ6nB,GAAcsqE,GACd9kE,GAAY8kE,GACZ,QACD,CAIDtqE,IACAwF,GACN,CACG,EAMGklE,GAAiB,SAAU76E,EAAO4mE,EAAKz+E,EAAQ,CAUjD,QATIgoB,EAAa,EACfwF,EAAW8kE,GACXxa,EACAz6E,EACAs1F,EACApB,EACAqB,EACEC,EAAU,GAEPrlE,GAAY3V,EAAM,YAAY,CAEnC,GAAIA,EAAMmQ,CAAU,IAAMuqE,KAAc16E,EAAM2V,CAAQ,IAAM+kE,IAAa/kE,IAAa3V,EAAM,YAAa,CAIvG,OAFAigE,EAASjgE,EAAM,SAASmQ,EAAYwF,CAAQ,EAC5CnwB,EAAO+0F,GAAM,GAAG,UAAUta,EAAQ2G,EAAI,GAAG,EACjCphF,EAAI,CACV,IAAK,MACHs1F,EAAUP,GAAM,GAAG,aAAata,EAAQ2G,EAAI,KAAK,EACjD8S,EAAOa,GAAM,GAAG,+BAA+Bta,CAAM,EACjD6a,IAAY,SAAWpB,IACzBqB,EAASR,GAAM,GAAG,aAAata,CAAM,EACjC8a,IACFA,EAAO,KAAO,QACd5yF,EAAO,MAAM,KAAK4yF,CAAM,EACxBC,EAAU,KAGd,KACZ,CACQ,GAAIA,EACF,MAEF7qE,GAAcsqE,GACd9kE,GAAY8kE,GACZ,QACD,CAIDtqE,IACAwF,GACD,CAKD,IAHAA,EAAW3V,EAAM,WACjBmQ,EAAawF,EAAW8kE,GACxBO,EAAU,GACH7qE,GAAc,GAAG,CAEtB,GAAInQ,EAAMmQ,CAAU,IAAMuqE,KAAc16E,EAAM2V,CAAQ,IAAM+kE,IAAa/kE,IAAa3V,EAAM,YAAa,CAIvG,OAFAigE,EAASjgE,EAAM,SAASmQ,EAAYwF,CAAQ,EAC5CnwB,EAAO+0F,GAAM,GAAG,UAAUta,EAAQ2G,EAAI,GAAG,EACjCphF,EAAI,CACV,IAAK,MACHs1F,EAAUP,GAAM,GAAG,aAAata,EAAQ2G,EAAI,KAAK,EACjD8S,EAAOa,GAAM,GAAG,+BAA+Bta,CAAM,EACjD6a,IAAY,SAAWpB,IACzBqB,EAASR,GAAM,GAAG,aAAata,CAAM,EACjC8a,IACFA,EAAO,KAAO,QACd5yF,EAAO,MAAM,KAAK4yF,CAAM,EACxBC,EAAU,KAGd,KACZ,CACQ,GAAIA,EACF,MAEF7qE,GAAcsqE,GACd9kE,GAAY8kE,GACZ,QACD,CAIDtqE,IACAwF,GACN,CACG,EAOGslE,GAAiB,SAAUj7E,EAAO4mE,EAAKz+E,EAAQ,CAiBjD,QAhBIgoB,EAAa,EACfwF,EAAW8kE,GACXxa,EACAz6E,EACAs1F,EACApB,EACAqB,EACAhgB,EACA/1E,EACAuiF,EACEyT,EAAU,GACVzgB,EAAe,CACjB,KAAM,CAAE,EACR,KAAM,CACZ,EAEW5kD,EAAW3V,EAAM,YAAY,CAElC,GAAIA,EAAMmQ,CAAU,IAAMuqE,IAAa16E,EAAM2V,CAAQ,IAAM+kE,GAAW,CAIpE,OAFAza,EAASjgE,EAAM,SAASmQ,EAAYwF,CAAQ,EAC5CnwB,EAAO+0F,GAAM,GAAG,UAAUta,EAAQ2G,EAAI,GAAG,EACjCphF,EAAI,CACV,IAAK,MAGH,GAFAs1F,EAAUP,GAAM,GAAG,aAAata,EAAQ2G,EAAI,KAAK,EACjD8S,EAAOa,GAAM,GAAG,+BAA+Bta,CAAM,EACjD6a,IAAY,UACVpB,GAAQ,CAACsB,IACXD,EAASR,GAAM,GAAG,aAAata,CAAM,EACjC8a,IACFA,EAAO,KAAO,QACd5yF,EAAO,MAAM,KAAK4yF,CAAM,EACxBC,EAAU,KAGV,CAAC7yF,EAAO,eAAe,CACzB,GAAIuxF,GACEnf,EAAa,OAAS,EAAG,CAG3B,IAFAQ,EAAQ,IAAI,WAAWR,EAAa,IAAI,EACxCv1E,EAAI,EACGu1E,EAAa,KAAK,QACvBgN,EAAMhN,EAAa,KAAK,MAAO,EAC/BQ,EAAM,IAAIwM,EAAKviF,CAAC,EAChBA,GAAKuiF,EAAI,WAEX,GAAIgT,GAAM,GAAG,4BAA4Bxf,CAAK,EAAG,CAC/C,IAAImgB,EAAgBX,GAAM,GAAG,aAAaxf,CAAK,EAI3CmgB,GACF/yF,EAAO,cAAgB+yF,EACvB/yF,EAAO,cAAc,KAAO,SAG5B,QAAQ,KAAK,6RAAiT,CAEtV,CACoBoyE,EAAa,KAAO,CACxC,CAEgBA,EAAa,KAAK,KAAK0F,CAAM,EAC7B1F,EAAa,MAAQ0F,EAAO,UAC5C,CAEY,KACZ,CACQ,GAAI+a,GAAW7yF,EAAO,cACpB,MAEFgoB,GAAcsqE,GACd9kE,GAAY8kE,GACZ,QACD,CAIDtqE,IACAwF,GACD,CAKD,IAHAA,EAAW3V,EAAM,WACjBmQ,EAAawF,EAAW8kE,GACxBO,EAAU,GACH7qE,GAAc,GAAG,CAEtB,GAAInQ,EAAMmQ,CAAU,IAAMuqE,IAAa16E,EAAM2V,CAAQ,IAAM+kE,GAAW,CAIpE,OAFAza,EAASjgE,EAAM,SAASmQ,EAAYwF,CAAQ,EAC5CnwB,EAAO+0F,GAAM,GAAG,UAAUta,EAAQ2G,EAAI,GAAG,EACjCphF,EAAI,CACV,IAAK,MACHs1F,EAAUP,GAAM,GAAG,aAAata,EAAQ2G,EAAI,KAAK,EACjD8S,EAAOa,GAAM,GAAG,+BAA+Bta,CAAM,EACjD6a,IAAY,SAAWpB,IACzBqB,EAASR,GAAM,GAAG,aAAata,CAAM,EACjC8a,IACFA,EAAO,KAAO,QACd5yF,EAAO,MAAM,KAAK4yF,CAAM,EACxBC,EAAU,KAGd,KACZ,CACQ,GAAIA,EACF,MAEF7qE,GAAcsqE,GACd9kE,GAAY8kE,GACZ,QACD,CAIDtqE,IACAwF,GACN,CACG,EAMGwlE,GAAmB,SAAU9+D,EAAa++D,EAAe,CAC3D,GAAI/+D,EAAY,OAASA,EAAY,MAAM,OAAQ,CACjD,IAAIg/D,EAAqBD,GACrB,OAAOC,EAAuB,KAAe,MAAMA,CAAkB,KACvEA,EAAqBh/D,EAAY,MAAM,CAAC,EAAE,KAE5CA,EAAY,MAAM,QAAQ,SAAUi/D,EAAM,CACxCA,EAAK,IAAMhB,GAAegB,EAAK,IAAKD,CAAkB,EACtDC,EAAK,IAAMhB,GAAegB,EAAK,IAAKD,CAAkB,EAEtDC,EAAK,QAAUA,EAAK,IAAMd,GAC1Bc,EAAK,QAAUA,EAAK,IAAMd,EAClC,CAAO,CACP,CACI,GAAIn+D,EAAY,OAASA,EAAY,MAAM,OAAQ,CACjD,IAAIk/D,EAAqBH,EAWzB,IAVI,OAAOG,EAAuB,KAAe,MAAMA,CAAkB,KACvEA,EAAqBl/D,EAAY,MAAM,CAAC,EAAE,KAE5CA,EAAY,MAAM,QAAQ,SAAUi/D,EAAM,CACxCA,EAAK,IAAMhB,GAAegB,EAAK,IAAKC,CAAkB,EACtDD,EAAK,IAAMhB,GAAegB,EAAK,IAAKC,CAAkB,EAEtDD,EAAK,QAAUA,EAAK,IAAMd,GAC1Bc,EAAK,QAAUA,EAAK,IAAMd,EAClC,CAAO,EACGn+D,EAAY,cAAe,CAC7B,IAAI0+C,EAAQ1+C,EAAY,cACxB0+C,EAAM,IAAMuf,GAAevf,EAAM,IAAKwgB,CAAkB,EACxDxgB,EAAM,IAAMuf,GAAevf,EAAM,IAAKwgB,CAAkB,EAExDxgB,EAAM,QAAUA,EAAM,IAAMyf,GAC5Bzf,EAAM,QAAUA,EAAM,IAAMyf,EACpC,CACA,CACG,EAKGgB,GAAc,SAAUx7E,EAAO,CAQjC,QAPIg7E,EAAU,GACZS,EAAa,EACbhf,EAAa,KACbC,EAAY,KACZqI,EAAY,EACZ7jE,EAAY,EACZ++D,EACKjgE,EAAM,OAASkB,GAAa,GAAG,CACpC,IAAI1b,EAAO+0F,GAAM,IAAI,UAAUv6E,EAAOkB,CAAS,EAC/C,OAAQ1b,EAAI,CACV,IAAK,iBAGH,GAAIwa,EAAM,OAASkB,EAAY,GAAI,CACjC85E,EAAU,GACV,KACZ,CAIU,GAHAjW,EAAYwV,GAAM,IAAI,gBAAgBv6E,EAAOkB,CAAS,EAGlD6jE,EAAY/kE,EAAM,OAAQ,CAC5Bg7E,EAAU,GACV,KACZ,CACcte,IAAc,OAChBuD,EAASjgE,EAAM,SAASkB,EAAWA,EAAY6jE,CAAS,EACxDrI,EAAY6d,GAAM,IAAI,kBAAkBta,CAAM,GAEhD/+D,GAAa6jE,EACb,MACF,IAAK,QAGH,GAAI/kE,EAAM,OAASkB,EAAY,EAAG,CAChC85E,EAAU,GACV,KACZ,CAIU,GAHAjW,EAAYwV,GAAM,IAAI,cAAcv6E,EAAOkB,CAAS,EAGhD6jE,EAAY/kE,EAAM,OAAQ,CAC5Bg7E,EAAU,GACV,KACZ,CACcve,IAAe,OACjBwD,EAASjgE,EAAM,SAASkB,EAAWA,EAAY6jE,CAAS,EACxDtI,EAAa8d,GAAM,IAAI,gBAAgBta,CAAM,GAE/Cwb,IACAv6E,GAAa6jE,EACb,MACF,QACE7jE,IACA,KACV,CACM,GAAI85E,EACF,OAAO,IAEf,CACI,GAAIve,IAAe,MAAQC,IAAc,KACvC,OAAO,KAET,IAAIgf,EAAiBlB,GAAmB/d,EACpCt0E,EAAS,CACX,MAAO,CAAC,CACN,KAAM,QACN,IAAKu0E,EACL,IAAKA,CACb,EAAS,CACD,KAAM,QACN,IAAKA,EAAY+e,EAAa,KAAOC,EACrC,IAAKhf,EAAY+e,EAAa,KAAOC,CACtC,CAAA,CACF,EACD,OAAOvzF,CACR,EAOGwzF,GAAa,SAAU37E,EAAO,CAChC,IAAI4mE,EAAM,CACR,IAAK,KACL,MAAO,IACR,EACGz+E,EAAS,CAAE,EACfwyF,GAAU36E,EAAO4mE,CAAG,EACpB,QAASK,KAAOL,EAAI,MAClB,GAAIA,EAAI,MAAM,eAAeK,CAAG,EAAG,CACjC,IAAIzhF,EAAOohF,EAAI,MAAMK,CAAG,EACxB,OAAQzhF,EAAI,CACV,KAAK60F,GAAY,iBACflyF,EAAO,MAAQ,CAAE,EACjB8yF,GAAej7E,EAAO4mE,EAAKz+E,CAAM,EAC7BA,EAAO,MAAM,SAAW,GAC1B,OAAOA,EAAO,MAEhB,MACF,KAAKkyF,GAAY,iBACflyF,EAAO,MAAQ,CAAE,EACjB0yF,GAAe76E,EAAO4mE,EAAKz+E,CAAM,EAC7BA,EAAO,MAAM,SAAW,GAC1B,OAAOA,EAAO,MAEhB,KACZ,CACA,CAEI,OAAOA,CACR,EAUGyzF,GAAU,SAAU57E,EAAOo7E,EAAe,CAC5C,IAAIS,EAAYtB,GAAM,IAAI,gBAAgBv6E,CAAK,EAC3C7X,EAMJ,OALI0zF,EACF1zF,EAASqzF,GAAYx7E,CAAK,EAE1B7X,EAASwzF,GAAW37E,CAAK,EAEvB,CAAC7X,GAAU,CAACA,EAAO,OAAS,CAACA,EAAO,MAC/B,MAETgzF,GAAiBhzF,EAAQizF,CAAa,EAC/BjzF,EACR,EACG2zF,GAAc,CAChB,QAASF,GACT,eAAgBf,EACjB,EAWD,MAAMkB,GAAuB,SAAUnpF,EAAM27E,EAAY,CACvDA,EAAW,GAAG,OAAQ,SAAU9zE,EAAS,CAKvC,MAAMuhF,EAAYvhF,EAAQ,YAC1BA,EAAQ,YAAc,CACpB,KAAMuhF,EAAU,OAChB,WAAYA,EAAU,WACtB,WAAYA,EAAU,UACvB,EACD,MAAM/X,EAAaxpE,EAAQ,KAC3BA,EAAQ,KAAOwpE,EAAW,OAC1BrxE,EAAK,YAAY,CACf,OAAQ,OACR,QAAA6H,EACA,WAAYwpE,EAAW,WACvB,WAAYA,EAAW,UAC/B,EAAS,CAACxpE,EAAQ,IAAI,CAAC,CACvB,CAAK,EACD8zE,EAAW,GAAG,OAAQ,SAAUv8E,EAAM,CACpCY,EAAK,YAAY,CACf,OAAQ,MAChB,CAAO,CACP,CAAK,EACD27E,EAAW,GAAG,UAAW,SAAU0N,EAAS,CAC1CrpF,EAAK,YAAY,CACf,OAAQ,UACR,QAAAqpF,CACR,CAAO,CACP,CAAK,EACD1N,EAAW,GAAG,yBAA0B,SAAU2N,EAAY,CAC5D,MAAMC,EAAyB,CAC7B,MAAO,CACL,OAAQtf,GAAQ,iBAAiBqf,EAAW,MAAM,GAAG,EACrD,aAAcrf,GAAQ,iBAAiBqf,EAAW,MAAM,GAAG,CAC5D,EACD,IAAK,CACH,OAAQrf,GAAQ,iBAAiBqf,EAAW,IAAI,GAAG,EACnD,aAAcrf,GAAQ,iBAAiBqf,EAAW,IAAI,GAAG,CAC1D,EACD,oBAAqBrf,GAAQ,iBAAiBqf,EAAW,mBAAmB,CAC7E,EACGA,EAAW,2BACbC,EAAuB,yBAA2Btf,GAAQ,iBAAiBqf,EAAW,wBAAwB,GAEhHtpF,EAAK,YAAY,CACf,OAAQ,yBACR,uBAAAupF,CACR,CAAO,CACP,CAAK,EACD5N,EAAW,GAAG,yBAA0B,SAAU2N,EAAY,CAE5D,MAAME,EAAyB,CAC7B,MAAO,CACL,OAAQvf,GAAQ,iBAAiBqf,EAAW,MAAM,GAAG,EACrD,aAAcrf,GAAQ,iBAAiBqf,EAAW,MAAM,GAAG,CAC5D,EACD,IAAK,CACH,OAAQrf,GAAQ,iBAAiBqf,EAAW,IAAI,GAAG,EACnD,aAAcrf,GAAQ,iBAAiBqf,EAAW,IAAI,GAAG,CAC1D,EACD,oBAAqBrf,GAAQ,iBAAiBqf,EAAW,mBAAmB,CAC7E,EACGA,EAAW,2BACbE,EAAuB,yBAA2Bvf,GAAQ,iBAAiBqf,EAAW,wBAAwB,GAEhHtpF,EAAK,YAAY,CACf,OAAQ,yBACR,uBAAAwpF,CACR,CAAO,CACP,CAAK,EACD7N,EAAW,GAAG,WAAY,SAAUwC,EAAU,CAC5Cn+E,EAAK,YAAY,CACf,OAAQ,WACR,SAAAm+E,CACR,CAAO,CACP,CAAK,EACDxC,EAAW,GAAG,UAAW,SAAUmC,EAAS,CAC1C99E,EAAK,YAAY,CACf,OAAQ,UACR,QAAA89E,CACR,CAAO,CACP,CAAK,EACDnC,EAAW,GAAG,YAAa,SAAU8N,EAAW,CAC9CzpF,EAAK,YAAY,CACf,OAAQ,YACR,UAAAypF,CACR,CAAO,CACP,CAAK,EACD9N,EAAW,GAAG,kBAAmB,SAAU+N,EAAiB,CAE1D1pF,EAAK,YAAY,CACf,OAAQ,kBACR,gBAAiB,CACf,MAAOiqE,GAAQ,iBAAiByf,EAAgB,KAAK,EACrD,IAAKzf,GAAQ,iBAAiByf,EAAgB,GAAG,CAC3D,CACA,CAAO,CACP,CAAK,EACD/N,EAAW,GAAG,kBAAmB,SAAUxe,EAAiB,CAC1Dn9D,EAAK,YAAY,CACf,OAAQ,kBACR,gBAAiB,CACf,MAAOiqE,GAAQ,iBAAiB9M,EAAgB,KAAK,EACrD,IAAK8M,GAAQ,iBAAiB9M,EAAgB,GAAG,CAC3D,CACA,CAAO,CACP,CAAK,EACDwe,EAAW,GAAG,MAAO,SAAU5nD,EAAK,CAClC/zB,EAAK,YAAY,CACf,OAAQ,MACR,IAAA+zB,CACR,CAAO,CACP,CAAK,CACF,EASD,MAAM41D,EAAgB,CACpB,YAAY3pF,EAAMrM,EAAS,CACzB,KAAK,QAAUA,GAAW,CAAE,EAC5B,KAAK,KAAOqM,EACZ,KAAK,KAAM,CACjB,CAKI,MAAO,CACD,KAAK,YACP,KAAK,WAAW,QAAS,EAE3B,KAAK,WAAa,IAAI27E,GAAW,WAAW,KAAK,OAAO,EACxDwN,GAAqB,KAAK,KAAM,KAAK,UAAU,CACrD,CACI,gBAAgB/pF,EAAM,CACf,KAAK,gBACR,KAAK,cAAgB,IAAI6jF,GACzB,KAAK,cAAc,KAAM,GAE3B,MAAMp7E,EAAU,IAAI,WAAWzI,EAAK,KAAMA,EAAK,WAAYA,EAAK,UAAU,EACpE+oF,EAAS,KAAK,cAAc,MAAMtgF,EAASzI,EAAK,SAAUA,EAAK,UAAU,EAC/E,KAAK,KAAK,YAAY,CACpB,OAAQ,cACR,SAAU+oF,GAAUA,EAAO,UAAY,CAAE,EACzC,KAAMA,GAAUA,EAAO,MAAQ,CAAE,EACjC,KAAMtgF,EAAQ,MACtB,EAAS,CAACA,EAAQ,MAAM,CAAC,CACzB,CACI,kBAAkB,CAChB,WAAA+6E,EACA,KAAAxjF,CACN,EAAO,CACD,MAAMkC,EAAYilF,GAAQ,UAAU3D,EAAYxjF,CAAI,EACpD,KAAK,KAAK,YAAY,CACpB,OAAQ,oBACR,UAAAkC,EACA,KAAAlC,CACR,EAAS,CAACA,EAAK,MAAM,CAAC,CACtB,CACI,eAAe,CACb,KAAAA,CACN,EAAO,CACD,MAAMopC,EAAS+9C,GAAQ,OAAOnnF,CAAI,EAClC,KAAK,KAAK,YAAY,CACpB,OAAQ,iBACR,OAAAopC,EACA,KAAAppC,CACR,EAAS,CAACA,EAAK,MAAM,CAAC,CACtB,CAUI,aAAa,CACX,KAAAA,EACA,OAAA6P,CACN,EAAO,CACD,MAAM26E,EAAYrD,GAAQ,WAAWnnF,EAAM6P,CAAM,EACjD,KAAK,KAAK,YAAY,CACpB,OAAQ,eACR,UAAA26E,EACA,SAAUxqF,CAClB,EAAS,CAACA,EAAK,MAAM,CAAC,CACtB,CAeI,QAAQ,CACN,KAAAA,EACA,cAAAyqF,CACN,EAAO,CACD,MAAMC,EAAc,OAAOD,GAAkB,UAAY,CAAC,MAAMA,CAAa,EAAIA,EAAgB5f,GAAQ,iBAAmB,OACtH8f,EAAWb,GAAY,QAAQ9pF,EAAM0qF,CAAW,EACtD,IAAIv0F,EAAS,KACTw0F,IACFx0F,EAAS,CAEP,SAAUw0F,EAAS,OAASA,EAAS,MAAM,SAAW,GAAK,GAC3D,SAAUA,EAAS,OAASA,EAAS,MAAM,SAAW,GAAK,EAC5D,EACGx0F,EAAO,WACTA,EAAO,WAAaw0F,EAAS,MAAM,CAAC,EAAE,SAEpCx0F,EAAO,WACTA,EAAO,WAAaw0F,EAAS,MAAM,CAAC,EAAE,UAG1C,KAAK,KAAK,YAAY,CACpB,OAAQ,UACR,OAAAx0F,EACA,KAAA6J,CACR,EAAS,CAACA,EAAK,MAAM,CAAC,CACtB,CACI,qBAAsB,CAChB,KAAK,eACP,KAAK,cAAc,iBAAkB,CAE7C,CACI,wBAAyB,CACnB,KAAK,eACP,KAAK,cAAc,oBAAqB,CAEhD,CAQI,KAAKA,EAAM,CAET,MAAMyI,EAAU,IAAI,WAAWzI,EAAK,KAAMA,EAAK,WAAYA,EAAK,UAAU,EAC1E,KAAK,WAAW,KAAKyI,CAAO,CAClC,CAMI,OAAQ,CACN,KAAK,WAAW,MAAO,CAC7B,CASI,mBAAmBzI,EAAM,CACvB,MAAM4qF,EAAkB5qF,EAAK,iBAAmB,EAChD,KAAK,WAAW,uBAAuB,KAAK,MAAM6qE,GAAQ,iBAAiB+f,CAAe,CAAC,CAAC,CAClG,CACI,oBAAoB5qF,EAAM,CACxB,KAAK,WAAW,oBAAoB,KAAK,KAAK6qE,GAAQ,iBAAiB7qE,EAAK,WAAW,CAAC,CAAC,CAC/F,CACI,SAASA,EAAM,CACb,KAAK,WAAW,SAASA,EAAK,KAAK,CACzC,CAQI,MAAMA,EAAM,CACV,KAAK,WAAW,QAEhB,KAAK,YAAY,CACf,OAAQ,OACR,KAAM,YACd,CAAO,CACP,CACI,aAAc,CACZ,KAAK,WAAW,cAGhB,KAAK,YAAY,CACf,OAAQ,gBACR,KAAM,YACd,CAAO,CACP,CACI,cAAcA,EAAM,CAClB,KAAK,WAAW,cAAcA,EAAK,gBAAgB,MAAK,CAAE,CAChE,CACA,CASE,KAAK,UAAY,SAAU2H,EAAO,CAChC,GAAIA,EAAM,KAAK,SAAW,QAAUA,EAAM,KAAK,QAAS,CACtD,KAAK,gBAAkB,IAAI4iF,GAAgB,KAAM5iF,EAAM,KAAK,OAAO,EACnE,MACN,CACS,KAAK,kBACR,KAAK,gBAAkB,IAAI4iF,GAAgB,IAAI,GAE7C5iF,EAAM,MAAQA,EAAM,KAAK,QAAUA,EAAM,KAAK,SAAW,QACvD,KAAK,gBAAgBA,EAAM,KAAK,MAAM,GACxC,KAAK,gBAAgBA,EAAM,KAAK,MAAM,EAAEA,EAAM,IAAI,CAGvD,CACH,CAAC,CAAC,EACF,IAAIkjF,GAAiBvnB,GAAQK,EAAY,EAGzC,MAAMmnB,GAAc,CAACnjF,EAAOojF,EAAgBh2F,IAAa,CACvD,KAAM,CACJ,KAAAvB,EACA,YAAA0vB,EACA,SAAAqF,EACA,eAAAyiE,EACA,SAAAnxB,EACA,kBAAAoxB,EACA,kBAAAC,CACJ,EAAMvjF,EAAM,KAAK,QACfojF,EAAe,OAAO,KAAK,CACzB,SAAAxiE,EACA,eAAAyiE,EACA,SAAAnxB,CACJ,CAAG,EACD,MAAMv7D,EAAQqJ,EAAM,KAAK,QAAQ,OAAS,CACxC,KAAMA,EAAM,KAAK,QAAQ,IAC1B,EACKxR,EAAS,CACb,KAAA3C,EAEA,KAAM,IAAI,WAAW8K,EAAM,KAAMA,EAAM,KAAK,WAAYA,EAAM,KAAK,UAAU,EAC7E,YAAa,IAAI,WAAW4kB,EAAY,KAAMA,EAAY,WAAYA,EAAY,UAAU,CAC7F,EACG,OAAO+nE,EAAsB,MAC/B90F,EAAO,kBAAoB80F,GAEzB,OAAOC,EAAsB,MAC/B/0F,EAAO,kBAAoB+0F,GAE7Bn2F,EAASoB,CAAM,CACjB,EACMg1F,GAAc,CAAC,CACnB,eAAAJ,EACA,SAAAh2F,CACF,IAAM,CAGJg2F,EAAe,OAAS,GAGxBh2F,EAASg2F,CAAc,CACzB,EACMK,GAAiB,CAACzjF,EAAOojF,IAAmB,CAChDA,EAAe,QAAUpjF,EAAM,KAAK,OACtC,EACM0jF,GAAkB92F,GAAW,CACjC,KAAM,CACJ,WAAAgoF,EACA,MAAAvuE,EACA,iBAAAs9E,EACA,gBAAAjO,EACA,MAAAkO,EACA,OAAAC,EACA,YAAAC,EACA,kBAAAC,EACA,kBAAAC,EACA,yBAAAC,EACA,yBAAAC,EACA,MAAAC,EACA,WAAAC,EACA,OAAAC,EACA,gBAAAC,EACA,gBAAAC,EACA,gBAAAC,EACA,QAAA1jF,EACA,sBAAA2jF,CACJ,EAAM73F,EACEw2F,EAAiB,CACrB,OAAQ,CAAA,CACT,EACD,IAAIsB,EAA4BF,EAChC,MAAMG,EAAgB3kF,GAAS,CACzB40E,EAAW,kBAAoBhoF,IAI/BoT,EAAM,KAAK,SAAW,QACxBmjF,GAAYnjF,EAAOojF,EAAgBS,CAAM,EAEvC7jF,EAAM,KAAK,SAAW,aACxB8jF,EAAY9jF,EAAM,KAAK,SAAS,EAE9BA,EAAM,KAAK,SAAW,WACxByjF,GAAezjF,EAAOojF,CAAc,EAElCpjF,EAAM,KAAK,SAAW,mBACxB+jF,EAAkB/jF,EAAM,KAAK,eAAe,EAE1CA,EAAM,KAAK,SAAW,mBACxBgkF,EAAkBhkF,EAAM,KAAK,eAAe,EAE1CA,EAAM,KAAK,SAAW,0BACxBikF,EAAyBjkF,EAAM,KAAK,sBAAsB,EAExDA,EAAM,KAAK,SAAW,0BACxBkkF,EAAyBlkF,EAAM,KAAK,sBAAsB,EAExDA,EAAM,KAAK,SAAW,YACxBmkF,EAAM,CAACnkF,EAAM,KAAK,QAAQ,EAAGA,EAAM,KAAK,SAAS,YAAY,EAE3DA,EAAM,KAAK,SAAW,WACxBokF,EAAWpkF,EAAM,KAAK,OAAO,EAE3BA,EAAM,KAAK,SAAW,kBACxB0kF,EAA4B,GAC5BJ,EAAiB,GAEftkF,EAAM,KAAK,SAAW,OACxBukF,EAAgBvkF,EAAM,KAAK,GAAG,EAG5BA,EAAM,KAAK,OAAS,eAOpB0kF,IAGJ9P,EAAW,UAAY,KACvB4O,GAAY,CACV,eAAAJ,EACA,SAAUiB,CAChB,CAAK,EAGDO,GAAQhQ,CAAU,IAEnB,EAEKiQ,EAAc,IAAM,CACxB,MAAMv6F,EAAQ,CACZ,QAAS,uDACT,SAAU,CACR,UAAWk9D,EAAQ,MAAM,iCACzB,YAAas9B,GAAmB,CAC9B,QAAAhkF,CACD,CAAA,CACT,CACK,EACDujF,EAAO,KAAM/5F,CAAK,CACnB,EAsBD,GArBAsqF,EAAW,UAAY+P,EACvB/P,EAAW,QAAUiQ,EACjBlB,GACF/O,EAAW,YAAY,CACrB,OAAQ,sBACR,YAAa+O,CACnB,CAAK,EAGC,MAAM,QAAQjO,CAAe,GAC/Bd,EAAW,YAAY,CACrB,OAAQ,gBACR,gBAAAc,CACN,CAAK,EAEC,OAAOkO,EAAU,KACnBhP,EAAW,YAAY,CACrB,OAAQ,WACR,MAAAgP,CACN,CAAK,EAECv9E,EAAM,WAAY,CACpB,MAAMlN,EAASkN,aAAiB,YAAcA,EAAQA,EAAM,OACtD0+E,EAAa1+E,aAAiB,YAAc,EAAIA,EAAM,WAC5Do+E,EAAsB,CACpB,KAAM,0BACN,QAAA3jF,CACN,CAAK,EACD8zE,EAAW,YAAY,CACrB,OAAQ,OAIR,KAAMz7E,EAGN,WAAA4rF,EACA,WAAY1+E,EAAM,UACxB,EAAO,CAAClN,CAAM,CAAC,CACf,CACMqrF,GACF5P,EAAW,YAAY,CACrB,OAAQ,aACd,CAAK,EAIHA,EAAW,YAAY,CACrB,OAAQ,OACZ,CAAG,CACH,EACMgQ,GAAUhQ,GAAc,CAC5BA,EAAW,gBAAkB,KACzBA,EAAW,cAAc,SAC3BA,EAAW,gBAAkBA,EAAW,cAAc,MAAO,EACzD,OAAOA,EAAW,iBAAoB,WACxCA,EAAW,gBAAiB,EAE5B8O,GAAgB9O,EAAW,eAAe,EAGhD,EACMoQ,GAAgB,CAACpQ,EAAYprC,IAAW,CAC5CorC,EAAW,YAAY,CACrB,OAAAprC,CACJ,CAAG,EACDo7C,GAAQhQ,CAAU,CACpB,EACMqQ,GAAgB,CAACz7C,EAAQorC,IAAe,CAC5C,GAAI,CAACA,EAAW,gBAAiB,CAC/BA,EAAW,gBAAkBprC,EAC7Bw7C,GAAcpQ,EAAYprC,CAAM,EAChC,MACJ,CACEorC,EAAW,cAAc,KAAKoQ,GAAc,KAAK,KAAMpQ,EAAYprC,CAAM,CAAC,CAC5E,EACM07C,GAAQtQ,GAAc,CAC1BqQ,GAAc,QAASrQ,CAAU,CACnC,EACMuQ,GAAcvQ,GAAc,CAChCqQ,GAAc,cAAerQ,CAAU,CACzC,EACMwQ,GAAWx4F,GAAW,CAC1B,GAAI,CAACA,EAAQ,WAAW,gBAAiB,CACvCA,EAAQ,WAAW,gBAAkBA,EACrC82F,GAAgB92F,CAAO,EACvB,MACJ,CACEA,EAAQ,WAAW,cAAc,KAAKA,CAAO,CAC/C,EACMy4F,GAAmBz4F,GAAW,CAClC,MAAMgoF,EAAa,IAAIsO,GACvBtO,EAAW,gBAAkB,KAC7BA,EAAW,cAAgB,CAAE,EAC7B,MAAM0Q,EAAO1Q,EAAW,UACxB,OAAAA,EAAW,UAAY,KACrBA,EAAW,gBAAkB,KAC7BA,EAAW,cAAc,OAAS,EAC3B0Q,EAAK,KAAK1Q,CAAU,GAE7BA,EAAW,YAAY,CACrB,OAAQ,OACR,QAAAhoF,CACJ,CAAG,EACMgoF,CACT,EACA,IAAI2Q,GAAoB,CACtB,MAAAL,GACA,YAAAC,GACA,SAAAC,GACA,iBAAAC,EACF,EACA,MAAMG,GAAiB,SAAU54F,EAAS,CACxC,MAAMgoF,EAAahoF,EAAQ,WACrB64F,EAAY74F,EAAQ,WAAaA,EAAQ,OACzCQ,EAAWR,EAAQ,SACnBsE,EAAU1G,GAAS,CAAE,EAAEoC,EAAS,CACpC,UAAW,KACX,WAAY,KACZ,SAAU,IACd,CAAG,EACK84F,EAAoB1lF,GAAS,CAC7BA,EAAM,KAAK,SAAWylF,IAG1B7Q,EAAW,oBAAoB,UAAW8Q,CAAiB,EAEvD1lF,EAAM,KAAK,OACbA,EAAM,KAAK,KAAO,IAAI,WAAWA,EAAM,KAAK,KAAMpT,EAAQ,YAAc,EAAGA,EAAQ,YAAcoT,EAAM,KAAK,KAAK,UAAU,EACvHpT,EAAQ,OACVA,EAAQ,KAAOoT,EAAM,KAAK,OAG9B5S,EAAS4S,EAAM,IAAI,EACpB,EAED,GADA40E,EAAW,iBAAiB,UAAW8Q,CAAiB,EACpD94F,EAAQ,KAAM,CAChB,MAAM+4F,EAAgB/4F,EAAQ,gBAAgB,YAC9CsE,EAAQ,WAAay0F,EAAgB,EAAI/4F,EAAQ,KAAK,WACtDsE,EAAQ,WAAatE,EAAQ,KAAK,WAClC,MAAMg5F,EAAY,CAACD,EAAgB/4F,EAAQ,KAAOA,EAAQ,KAAK,MAAM,EACrEgoF,EAAW,YAAY1jF,EAAS00F,CAAS,CAC7C,MACIhR,EAAW,YAAY1jF,CAAO,CAElC,EACM20F,GAAiB,CACrB,QAAS,EACT,QAAS,KACT,QAAS,IACX,EAOMC,GAAWC,GAAc,CAC7BA,EAAW,QAAQn2F,GAAO,CACxBA,EAAI,MAAO,CACf,CAAG,CACH,EAOMo2F,GAAkBnlC,IACf,CACL,UAAWA,EAAQ,UACnB,cAAeA,EAAQ,eAAiB,EACxC,cAAeA,EAAQ,eAAiB,CACzC,GASGolC,GAAmBC,GAAiB,CACxC,MAAMrlC,EAAUqlC,EAAc,OAExBC,EAAQ,CACZ,UAAW,IACX,cAAe,EACf,cAJoB,KAAK,IAAK,EAAGtlC,EAAQ,aAIT,CACjC,EACD,OAAAslC,EAAM,cAAgBD,EAAc,OAIpCC,EAAM,UAAY,KAAK,MAAMA,EAAM,cAAgBA,EAAM,cAAgB,EAAI,GAAI,EAC1EA,CACT,EASMC,GAAe,CAAC97F,EAAOu2D,IAAY,CACvC,KAAM,CACJ,YAAAwO,CACJ,EAAMxO,EACEqR,EAAW9C,GAAiC,CAChD,YAAAC,EACA,QAAAxO,EACA,MAAAv2D,CACJ,CAAG,EACD,OAAIu2D,EAAQ,SACH,CACL,OAAQA,EAAQ,OAChB,QAAS,iCAAmCA,EAAQ,IACpD,KAAMglC,GAAe,QACrB,IAAKhlC,EACL,SAAAqR,CACD,EAECrR,EAAQ,QACH,CACL,OAAQA,EAAQ,OAChB,QAAS,+BAAiCA,EAAQ,IAClD,KAAMglC,GAAe,QACrB,IAAKhlC,EACL,SAAAqR,CACD,EAEC5nE,EACK,CACL,OAAQu2D,EAAQ,OAChB,QAAS,+BAAiCA,EAAQ,IAClD,KAAMglC,GAAe,QACrB,IAAKhlC,EACL,SAAAqR,CACD,EAECrR,EAAQ,eAAiB,eAAiBA,EAAQ,SAAS,aAAe,EACrE,CACL,OAAQA,EAAQ,OAChB,QAAS,8BAAgCA,EAAQ,IACjD,KAAMglC,GAAe,QACrB,IAAKhlC,EACL,SAAAqR,CACD,EAEI,IACT,EAYMm0B,GAAoB,CAACvlF,EAAS8X,EAAS0tE,EAAoB7B,IAA0B,CAACn6F,EAAOu2D,IAAY,CAC7G,MAAMvzD,EAAWuzD,EAAQ,SACnB0lC,EAAWH,GAAa97F,EAAOu2D,CAAO,EAC5C,GAAI0lC,EACF,OAAOD,EAAmBC,EAAUzlF,CAAO,EAE7C,GAAIxT,EAAS,aAAe,GAC1B,OAAOg5F,EAAmB,CACxB,OAAQzlC,EAAQ,OAChB,QAAS,2BAA6BA,EAAQ,IAC9C,KAAMglC,GAAe,QACrB,IAAKhlC,CACN,EAAE//C,CAAO,EAEZ,MAAM4G,EAAO,IAAI,SAASpa,CAAQ,EAC5B+Y,EAAQ,IAAI,YAAY,CAACqB,EAAK,UAAU,CAAC,EAAGA,EAAK,UAAU,CAAC,EAAGA,EAAK,UAAU,CAAC,EAAGA,EAAK,UAAU,EAAE,CAAC,CAAC,EAC3G,QAASrc,EAAI,EAAGA,EAAIutB,EAAQ,OAAQvtB,IAClCutB,EAAQvtB,CAAC,EAAE,MAAQgb,EAErB,MAAMmgF,EAAU,CACd,IAAK3lC,EAAQ,GACd,EACD,OAAA4jC,EAAsB,CACpB,KAAM,yBACN,QAAA3jF,EACA,QAAA0lF,CACJ,CAAG,EACMF,EAAmB,KAAMxlF,CAAO,CACzC,EACM2lF,GAAmB,CAAC3lF,EAAS1T,IAAa,CAC9C,MAAMvB,EAAOigC,GAAwBhrB,EAAQ,IAAI,KAAK,EAGtD,GAAIjV,IAAS,MAAO,CAClB,MAAMmD,EAAM8R,EAAQ,IAAI,aAAeA,EAAQ,IAAI,IAC7C8H,EAAY/c,GAAQ,UAC1B,OAAOuB,EAAS,CACd,SAAU,GACV,QAAS,qBAAqBwb,CAAS,iDAAiD5Z,CAAG,GAC3F,KAAM62F,GAAe,QACrB,SAAU,CACR,UAAAj9E,CACR,CACA,CAAK,CACL,CACE48E,GAAe,CACb,OAAQ,iBACR,KAAM1kF,EAAQ,IAAI,MAClB,WAAYA,EAAQ,WACpB,SAAU,CAAC,CACT,OAAA2gC,EACA,KAAAppC,CACN,KAEMyI,EAAQ,IAAI,MAAQzI,EACpBopC,EAAO,QAAQ,SAAUpsC,EAAO,CAC9ByL,EAAQ,IAAI,OAASA,EAAQ,IAAI,QAAU,GAEvC,CAAAA,EAAQ,IAAI,OAAOzL,EAAM,IAAI,IAGjCyL,EAAQ,IAAI,OAAOzL,EAAM,IAAI,EAAIA,EAC7B,OAAOA,EAAM,IAAO,UAAYA,EAAM,YACxCyL,EAAQ,IAAI,WAAaA,EAAQ,IAAI,YAAc,CAAE,EACrDA,EAAQ,IAAI,WAAWzL,EAAM,EAAE,EAAIA,EAAM,WAEnD,CAAO,EACMjI,EAAS,IAAI,EAE1B,CAAG,CACH,EAUMs5F,GAA4B,CAAC,CACjC,QAAA5lF,EACA,mBAAAwlF,EACA,sBAAA7B,CACF,IAAM,CAACn6F,EAAOu2D,IAAY,CACxB,MAAM0lC,EAAWH,GAAa97F,EAAOu2D,CAAO,EAC5C,GAAI0lC,EACF,OAAOD,EAAmBC,EAAUzlF,CAAO,EAE7C,MAAMuF,EAAQ,IAAI,WAAWw6C,EAAQ,QAAQ,EAO7C,GANA4jC,EAAsB,CACpB,KAAM,gBACN,QAAA3jF,CACJ,CAAG,EAGGA,EAAQ,IAAI,IACd,OAAAA,EAAQ,IAAI,eAAiBuF,EACtBigF,EAAmB,KAAMxlF,CAAO,EAEzCA,EAAQ,IAAI,MAAQuF,EACpBogF,GAAiB3lF,EAAS,SAAU6lF,EAAY,CAC9C,GAAIA,EACF,OAAAA,EAAW,IAAM9lC,EACjB8lC,EAAW,OAAS9lC,EAAQ,OACrBylC,EAAmBK,EAAY7lF,CAAO,EAE/CwlF,EAAmB,KAAMxlF,CAAO,CACpC,CAAG,CACH,EAYM8lF,GAAwB,CAAC,CAC7B,QAAA9lF,EACA,mBAAAwlF,EACA,aAAAO,EACA,sBAAApC,CACF,IAAM,CAACn6F,EAAOu2D,IAAY,CACxB,MAAM0lC,EAAWH,GAAa97F,EAAOu2D,CAAO,EAC5C,GAAI0lC,EACF,OAAOD,EAAmBC,EAAUzlF,CAAO,EAE7C2jF,EAAsB,CACpB,KAAM,gBACN,QAAA3jF,CACJ,CAAG,EACD,MAAMgmF,EAMND,IAAiB,eAAiB,CAAChmC,EAAQ,aAAeA,EAAQ,SAAWya,GAAoBza,EAAQ,aAAa,UAAU//C,EAAQ,iBAAmB,CAAC,CAAC,EAC7J,OAAAA,EAAQ,MAAQklF,GAAgBnlC,CAAO,EACnC//C,EAAQ,IACVA,EAAQ,eAAiB,IAAI,WAAWgmF,CAAQ,EAEhDhmF,EAAQ,MAAQ,IAAI,WAAWgmF,CAAQ,EAElCR,EAAmB,KAAMxlF,CAAO,CACzC,EACMimF,GAAoB,CAAC,CACzB,QAAAjmF,EACA,MAAAuF,EACA,YAAA2gF,EACA,aAAAC,EACA,yBAAAC,EACA,yBAAAC,EACA,MAAAC,EACA,WAAAC,EACA,gBAAA7C,EACA,gBAAA8C,EACA,OAAAC,EACA,OAAAC,EACA,gBAAAjD,EACA,sBAAAE,CACF,IAAM,CACJ,MAAMgD,EAAa3mF,EAAQ,KAAOA,EAAQ,IAAI,QAAU,CAAE,EACpD4mF,EAAU,GAAQD,EAAW,OAASA,EAAW,OAIvD,IAAIE,EAAeV,EAAa,KAAK,KAAMnmF,EAAS,QAAS,OAAO,EACpE,MAAM8mF,EAAaX,EAAa,KAAK,KAAMnmF,EAAS,QAAS,KAAK,EAClE,IAAI+mF,EAAeZ,EAAa,KAAK,KAAMnmF,EAAS,QAAS,OAAO,EACpE,MAAMgnF,EAAab,EAAa,KAAK,KAAMnmF,EAAS,QAAS,KAAK,EAC5DinF,EAAS,IAAM3C,GAAS,CAC5B,MAAA/+E,EACA,WAAYvF,EAAQ,WACpB,iBAAkBA,EAAQ,iBAC1B,gBAAiBA,EAAQ,gBACzB,MAAO4mF,EACP,OAAQl5F,GAAU,CAChBA,EAAO,KAAOA,EAAO,OAAS,WAAa,QAAUA,EAAO,KAC5D+4F,EAAOzmF,EAAStS,CAAM,CACvB,EACD,YAAak0F,GAAa,CACpBsE,IACEU,IACFhF,EAAU,QAAU,IAEtBsE,EAAYlmF,EAAS4hF,CAAS,EAEjC,EACD,kBAAmBC,GAAmB,CAEhCgF,GAAgB,OAAOhF,EAAgB,MAAU,MACnDgF,EAAahF,EAAgB,KAAK,EAClCgF,EAAe,MAGbC,GAAc,OAAOjF,EAAgB,IAAQ,KAC/CiF,EAAWjF,EAAgB,GAAG,CAEjC,EACD,kBAAmBvsB,GAAmB,CAEhCyxB,GAAgB,OAAOzxB,EAAgB,MAAU,MACnDyxB,EAAazxB,EAAgB,KAAK,EAClCyxB,EAAe,MAGbC,GAAc,OAAO1xB,EAAgB,IAAQ,KAC/C0xB,EAAW1xB,EAAgB,GAAG,CAEjC,EACD,yBAA0BosB,GAA0B,CAClD,MAAMD,EAAa,CACjB,IAAK,CACH,MAAOC,EAAuB,MAAM,aACpC,IAAKA,EAAuB,IAAI,YACjC,EACD,IAAK,CACH,MAAOA,EAAuB,MAAM,OACpC,IAAKA,EAAuB,IAAI,MAC1C,CACO,EACDiC,EAAsB,CACpB,KAAM,wCACN,QAAA3jF,EACA,WAAAyhF,CACR,CAAO,EACD2E,EAAyB1E,CAAsB,CAChD,EACD,yBAA0BC,GAA0B,CAClD,MAAMF,EAAa,CACjB,IAAK,CACH,MAAOE,EAAuB,MAAM,IACpC,IAAKA,EAAuB,IAAI,GACjC,EACD,IAAK,CACH,MAAOA,EAAuB,MAAM,IACpC,IAAKA,EAAuB,IAAI,GAC1C,CACO,EACDgC,EAAsB,CACpB,KAAM,wCACN,QAAA3jF,EACA,WAAAyhF,CACR,CAAO,EACD4E,EAAyB1E,CAAsB,CAChD,EACD,MAAO,CAACI,EAAWmF,IAAiB,CAClCZ,EAAMtmF,EAAS+hF,EAAWmF,CAAY,CACvC,EACD,WAAYpnE,GAAY,CACtBymE,EAAWvmF,EAAS,CAAC8f,CAAQ,CAAC,CAC/B,EACD,gBAAA4jE,EACA,gBAAiB,IAAM,CACrB8C,EAAiB,CAClB,EACD,gBAAA/C,EACA,OAAQ,CAAC/1F,EAAQlE,IAAU,CACpBk9F,IAGLh5F,EAAO,KAAOA,EAAO,OAAS,WAAa,QAAUA,EAAO,KAC5Di2F,EAAsB,CACpB,KAAM,6BACN,QAAA3jF,CACR,CAAO,EACD0mF,EAAOl9F,EAAOwW,EAAStS,CAAM,EAC9B,EACD,QAAAsS,EACA,sBAAA2jF,CACJ,CAAG,EAIDe,GAAe,CACb,OAAQ,UACR,WAAY1kF,EAAQ,WACpB,KAAMuF,EACN,cAAevF,EAAQ,cACvB,SAAUzI,GAAQ,CAChByI,EAAQ,MAAQuF,EAAQhO,EAAK,KAC7B,MAAM4vF,EAAc5vF,EAAK,OACrB4vF,IACFjB,EAAYlmF,EAAS,CACnB,SAAUmnF,EAAY,SACtB,SAAUA,EAAY,SACtB,QAAAP,CACV,CAAS,EACDV,EAAc,MAEhBe,EAAQ,CACd,CACA,CAAG,CACH,EACMG,GAAqB,CAAC,CAC1B,QAAApnF,EACA,MAAAuF,EACA,YAAA2gF,EACA,aAAAC,EACA,yBAAAC,EACA,yBAAAC,EACA,MAAAC,EACA,WAAAC,EACA,gBAAA7C,EACA,gBAAA8C,EACA,OAAAC,EACA,OAAAC,EACA,gBAAAjD,EACA,sBAAAE,CACF,IAAM,CACJ,IAAI0D,EAAoB,IAAI,WAAW9hF,CAAK,EAM5C,GAAI0lB,GAAyBo8D,CAAiB,EAAG,CAC/CrnF,EAAQ,OAAS,GACjB,KAAM,CACJ,OAAA2gC,CACD,EAAG3gC,EAAQ,IACN4hF,EAAY,CAChB,OAAQ,GACR,SAAU,CAAC,CAACjhD,EAAO,MACnB,SAAU,CAAC,CAACA,EAAO,KACzB,EAGQA,EAAO,OAASA,EAAO,MAAM,OAASA,EAAO,MAAM,QAAU,SAC/DihD,EAAU,WAAajhD,EAAO,MAAM,OAIlCA,EAAO,OAASA,EAAO,MAAM,OAASA,EAAO,MAAM,QAAU,SAC/DihD,EAAU,WAAajhD,EAAO,MAAM,OAElCA,EAAO,OAASA,EAAO,QACzBihD,EAAU,QAAU,IAItBsE,EAAYlmF,EAAS4hF,CAAS,EAO9B,MAAM0F,EAAgB,CAACxnE,EAAUiiE,IAAc,CAK7C0E,EAAOzmF,EAAS,CACd,KAAMqnF,EACN,KAAMzF,EAAU,UAAY,CAACA,EAAU,QAAU,QAAU,OACnE,CAAO,EACGG,GAAaA,EAAU,QACzBuE,EAAMtmF,EAAS+hF,CAAS,EAEtBjiE,GAAYA,EAAS,QACvBymE,EAAWvmF,EAAS8f,CAAQ,EAE9B4mE,EAAO,KAAM1mF,EAAS,EAAE,CACzB,EACD0kF,GAAe,CACb,OAAQ,oBACR,WAAY1kF,EAAQ,IAAI,WACxB,KAAMqnF,EACN,WAAYrnF,EAAQ,WACpB,SAAU,CAAC,CACT,KAAAzI,EACA,UAAAkC,CACR,IAAY,CAEJ8L,EAAQhO,EAAK,OACbyI,EAAQ,MAAQqnF,EAAoB9vF,EAChCqqF,EAAU,UAAY,CAACA,EAAU,SACnCuE,EAAanmF,EAAS,QAAS,QAASvG,CAAS,EAE/CmoF,EAAU,UACZuE,EAAanmF,EAAS,QAAS,QAASvG,CAAS,EAEnDirF,GAAe,CACb,OAAQ,eACR,KAAM2C,EACN,WAAYrnF,EAAQ,WACpB,OAAQvG,EACR,SAAU,CAAC,CACT,SAAA8tF,EACA,UAAAxF,CACZ,IAAgB,CAMJ,GAJAx8E,EAAQgiF,EAAS,OACjBvnF,EAAQ,MAAQqnF,EAAoBE,EAGhC,CAAC5mD,EAAO,OAAS,CAAC4mD,EAAS,YAAc,CAACvnF,EAAQ,WAAY,CAChEsnF,EAAc,OAAWvF,CAAS,EAClC,MACd,CACY2C,GAAe,CACb,OAAQ,kBACR,UAAW,cACX,WAAY1kF,EAAQ,WACpB,KAAMqnF,EACN,WAAYrnF,EAAQ,IAAI,WACxB,SAAU,CAAC2gC,EAAO,MAAM,EAAE,EAC1B,SAAUvwC,GAAW,CAEnBmV,EAAQnV,EAAQ,KAAK,OACrB4P,EAAQ,MAAQqnF,EAAoBj3F,EAAQ,KAC5CA,EAAQ,KAAK,QAAQ,SAAU87B,EAAK,CAClCu3D,EAAgB5rE,GAAMqU,EAAK,CACzB,OAAQ,kBAC5B,CAAmB,CAAC,CACpB,CAAiB,EACDo7D,EAAcl3F,EAAQ,SAAU2xF,CAAS,CACzD,CACA,CAAa,CACb,CACA,CAAS,CACT,CACA,CAAK,EACD,MACD,CAED,GAAI,CAAC/hF,EAAQ,WAAY,CACvB0mF,EAAO,KAAM1mF,EAAS,EAAE,EACxB,MACJ,CAIE,GAHI,OAAOA,EAAQ,UAAc,MAC/BA,EAAQ,UAAYgrB,GAAwBq8D,CAAiB,GAE3DrnF,EAAQ,YAAc,MAAQA,EAAQ,YAAc,MAAO,CAC7DkmF,EAAYlmF,EAAS,CACnB,SAAU,GACV,SAAU,EAChB,CAAK,EACD0mF,EAAO,KAAM1mF,EAAS,EAAE,EACxB,MACD,CAEDimF,GAAkB,CAChB,QAAAjmF,EACA,MAAAuF,EACA,YAAA2gF,EACA,aAAAC,EACA,yBAAAC,EACA,yBAAAC,EACA,MAAAC,EACA,WAAAC,EACA,gBAAA7C,EACA,gBAAA8C,EACA,OAAAC,EACA,OAAAC,EACA,gBAAAjD,EACA,sBAAAE,CACJ,CAAG,CACH,EACM6D,GAAU,SAAU,CACxB,GAAA73E,EACA,IAAA9hB,EACA,eAAA45F,EACA,iBAAAC,EACA,QAAA1nF,EACA,OAAA0mF,CACF,EAAGp6F,EAAU,CACX,MAAMq7F,EAAoBzoF,GAAS,CACjC,GAAIA,EAAM,KAAK,SAAWyQ,EAAI,CAC5B+3E,EAAiB,oBAAoB,UAAWC,CAAiB,EACjE,MAAMC,EAAY1oF,EAAM,KAAK,UAC7B5S,EAAS,IAAI,WAAWs7F,EAAU,MAAOA,EAAU,WAAYA,EAAU,UAAU,CAAC,CAC1F,CACG,EACDF,EAAiB,QAAU,IAAM,CAC/B,MAAMt3F,EAAU,6CACVwxB,EAAcoiE,GAAmB,CACrC,QAAAhkF,CACN,CAAK,EACK6nF,EAAe,CACnB,QAAAz3F,EACA,SAAU,CACR,MAAO,IAAI,MAAMA,CAAO,EACxB,UAAWs2D,EAAQ,MAAM,gCACzB,YAAA9kC,EACA,QAAS,CACP,IAAK5hB,EAAQ,IAAI,aAAeA,EAAQ,IAAI,IAAI,WAC1D,CACA,CACK,EACD0mF,EAAOmB,EAAc7nF,CAAO,CAC7B,EACD0nF,EAAiB,iBAAiB,UAAWC,CAAiB,EAC9D,IAAIG,EACAj6F,EAAI,MAAM,MACZi6F,EAAWj6F,EAAI,MAAM,MAAO,EAE5Bi6F,EAAW,IAAI,YAAY,MAAM,UAAU,MAAM,KAAKj6F,EAAI,KAAK,CAAC,EAGlE65F,EAAiB,YAAYpzB,GAA0B,CACrD,OAAQ3kD,EACR,UAAW83E,EACX,IAAKK,EACL,GAAIj6F,EAAI,EACT,CAAA,EAAG,CAAC45F,EAAe,OAAQK,EAAS,MAAM,CAAC,CAC9C,EA0BMC,GAAiB,CAAC,CACtB,iBAAAL,EACA,QAAA1nF,EACA,YAAAkmF,EACA,aAAAC,EACA,yBAAAC,EACA,yBAAAC,EACA,MAAAC,EACA,WAAAC,EACA,gBAAA7C,EACA,gBAAA8C,EACA,OAAAC,EACA,OAAAC,EACA,gBAAAjD,EACA,sBAAAE,CACF,IAAM,CACJA,EAAsB,CACpB,KAAM,wBACV,CAAG,EACD6D,GAAQ,CACN,GAAIxnF,EAAQ,UACZ,IAAKA,EAAQ,IACb,eAAgBA,EAAQ,eACxB,iBAAA0nF,EACA,QAAA1nF,EACA,OAAA0mF,CACD,EAAEsB,GAAkB,CACnBhoF,EAAQ,MAAQgoF,EAChBrE,EAAsB,CACpB,KAAM,4BACN,QAAA3jF,CACN,CAAK,EACDonF,GAAmB,CACjB,QAAApnF,EACA,MAAOA,EAAQ,MACf,YAAAkmF,EACA,aAAAC,EACA,yBAAAC,EACA,yBAAAC,EACA,MAAAC,EACA,WAAAC,EACA,gBAAA7C,EACA,gBAAA8C,EACA,OAAAC,EACA,OAAAC,EACA,gBAAAjD,EACA,sBAAAE,CACN,CAAK,CACL,CAAG,CACH,EA+BMsE,GAAoB,CAAC,CACzB,WAAAhD,EACA,iBAAAyC,EACA,YAAAxB,EACA,aAAAC,EACA,yBAAAC,EACA,yBAAAC,EACA,MAAAC,EACA,WAAAC,EACA,gBAAA7C,EACA,gBAAA8C,EACA,OAAAC,EACA,OAAAC,EACA,gBAAAjD,EACA,sBAAAE,CACF,IAAM,CACJ,IAAIlvF,EAAQ,EACRyzF,EAAW,GACf,MAAO,CAAC1+F,EAAOwW,IAAY,CACzB,GAAI,CAAAkoF,EAGJ,IAAI1+F,EACF,OAAA0+F,EAAW,GAEXlD,GAASC,CAAU,EAYZyB,EAAOl9F,EAAOwW,CAAO,EAG9B,GADAvL,GAAS,EACLA,IAAUwwF,EAAW,OAAQ,CAC/B,MAAMkD,EAAgB,UAAY,CAChC,GAAInoF,EAAQ,eACV,OAAO+nF,GAAe,CACpB,iBAAAL,EACA,QAAA1nF,EACA,YAAAkmF,EACA,aAAAC,EACA,yBAAAC,EACA,yBAAAC,EACA,MAAAC,EACA,WAAAC,EACA,gBAAA7C,EACA,gBAAA8C,EACA,OAAAC,EACA,OAAAC,EACA,gBAAAjD,EACA,sBAAAE,CACZ,CAAW,EAGHyD,GAAmB,CACjB,QAAApnF,EACA,MAAOA,EAAQ,MACf,YAAAkmF,EACA,aAAAC,EACA,yBAAAC,EACA,yBAAAC,EACA,MAAAC,EACA,WAAAC,EACA,gBAAA7C,EACA,gBAAA8C,EACA,OAAAC,EACA,OAAAC,EACA,gBAAAjD,EACA,sBAAAE,CACV,CAAS,CACT,EAGM,GADA3jF,EAAQ,iBAAmB,KAAK,IAAK,EACjCA,EAAQ,KAAOA,EAAQ,IAAI,gBAAkB,CAACA,EAAQ,IAAI,MAC5D,OAAA2jF,EAAsB,CACpB,KAAM,yBACN,QAAA3jF,CACV,CAAS,EACMwnF,GAAQ,CACb,iBAAAE,EAIA,GAAI1nF,EAAQ,UAAY,QACxB,eAAgBA,EAAQ,IAAI,eAC5B,IAAKA,EAAQ,IAAI,IACjB,QAAAA,EACA,OAAA0mF,CACD,EAAEsB,GAAkB,CACnBhoF,EAAQ,IAAI,MAAQgoF,EACpBrE,EAAsB,CACpB,KAAM,4BACN,QAAA3jF,CACZ,CAAW,EACD2lF,GAAiB3lF,EAAS6lF,GAAc,CACtC,GAAIA,EACF,OAAAb,GAASC,CAAU,EACZyB,EAAOb,EAAY7lF,CAAO,EAEnCmoF,EAAe,CAC3B,CAAW,CACX,CAAS,EAEHA,EAAe,CACrB,EACG,CACH,EASMC,GAAgB,CAAC,CACrB,aAAAC,EACA,QAAAC,CACF,IAAMppF,GAAS,CACGA,EAAM,OACV,SAAWopF,GAAW,CAACD,EAAa,gBAC9CC,EAAS,EACTD,EAAa,cAAgB,GAEjC,EA2BME,GAAiB,CAAC,CACtB,QAAAvoF,EACA,WAAAwoF,EACA,YAAAtC,EACA,aAAAC,EACA,yBAAAC,EACA,yBAAAC,EACA,MAAAC,EACA,WAAAC,EACA,gBAAA7C,EACA,gBAAA8C,EACA,OAAAC,CACF,IAAMvnF,GAAS,CAEb,GAAI,CADYA,EAAM,OACV,QAGZ,OAAAc,EAAQ,MAAQ6X,GAAM7X,EAAQ,MAAOmlF,GAAiBjmF,CAAK,CAAC,EAExD,CAACc,EAAQ,MAAM,sBAAwBA,EAAQ,MAAM,gBACvDA,EAAQ,MAAM,qBAAuB,KAAK,IAAK,GAE1CwoF,EAAWtpF,EAAOc,CAAO,CAClC,EAsEMyoF,GAAsB,CAAC,CAC3B,IAAA35F,EACA,WAAA45F,EACA,iBAAAhB,EACA,QAAA1nF,EACA,QAAAsoF,EACA,WAAAE,EACA,YAAAtC,EACA,aAAAC,EACA,yBAAAC,EACA,yBAAAC,EACA,MAAAC,EACA,WAAAC,EACA,gBAAA7C,EACA,gBAAA8C,EACA,OAAAC,EACA,OAAAC,EACA,gBAAAjD,EACA,sBAAAE,CACF,IAAM,CACJ,MAAMsB,EAAa,CAAE,EACfO,EAAqByC,GAAkB,CAC3C,WAAAhD,EACA,iBAAAyC,EACA,YAAAxB,EACA,aAAAC,EACA,yBAAAC,EACA,yBAAAC,EACA,MAAAC,EACA,WAAAC,EACA,gBAAA7C,EACA,gBAAA8C,EACA,OAAAC,EACA,OAAAC,EACA,gBAAAjD,EACA,sBAAAE,CACJ,CAAG,EAED,GAAI3jF,EAAQ,KAAO,CAACA,EAAQ,IAAI,MAAO,CACrC,MAAM8X,EAAU,CAAC9X,EAAQ,GAAG,EACxBA,EAAQ,KAAO,CAACA,EAAQ,IAAI,OAASA,EAAQ,IAAI,KAAOA,EAAQ,IAAI,IAAI,cAAgBA,EAAQ,IAAI,aACtG8X,EAAQ,KAAK9X,EAAQ,IAAI,GAAG,EAE9B,MAAM2oF,EAAoB9wE,GAAM6wE,EAAY,CAC1C,IAAK1oF,EAAQ,IAAI,YACjB,aAAc,cACd,YAAa,aACnB,CAAK,EACK4oF,GAAqBrD,GAAkBvlF,EAAS8X,EAAS0tE,EAAoB7B,CAAqB,EAClG+B,EAAU,CACd,IAAK1lF,EAAQ,IAAI,WAClB,EACD2jF,EAAsB,CACpB,KAAM,sBACN,QAAA3jF,EACA,QAAA0lF,CACN,CAAK,EACD,MAAMmD,GAAS/5F,EAAI65F,EAAmBC,EAAkB,EACxD3D,EAAW,KAAK4D,EAAM,CACvB,CAED,GAAI7oF,EAAQ,KAAO,CAACA,EAAQ,IAAI,MAAO,CAErC,GADwBA,EAAQ,IAAI,MAAQ,CAACA,EAAQ,KAAOA,EAAQ,IAAI,cAAgBA,EAAQ,IAAI,IAAI,aACnF,CACnB,MAAM8oF,GAAuBjxE,GAAM6wE,EAAY,CAC7C,IAAK1oF,EAAQ,IAAI,IAAI,YACrB,aAAc,cACd,YAAa,aACrB,CAAO,EACK+oF,EAAwBxD,GAAkBvlF,EAAS,CAACA,EAAQ,IAAI,GAAG,EAAGwlF,EAAoB7B,CAAqB,EAC/G+B,EAAU,CACd,IAAK1lF,EAAQ,IAAI,IAAI,WACtB,EACD2jF,EAAsB,CACpB,KAAM,sBACN,QAAA3jF,EACA,QAAA0lF,CACR,CAAO,EACD,MAAMsD,GAAYl6F,EAAIg6F,GAAsBC,CAAqB,EACjE9D,EAAW,KAAK+D,EAAS,CAC/B,CACI,MAAMC,EAAqBpxE,GAAM6wE,EAAY,CAC3C,IAAK1oF,EAAQ,IAAI,YACjB,aAAc,cACd,QAASk0D,GAAkBl0D,EAAQ,GAAG,EACtC,YAAa,8BACnB,CAAK,EACKkpF,GAA6BtD,GAA0B,CAC3D,QAAA5lF,EACA,mBAAAwlF,EACA,sBAAA7B,CACN,CAAK,EACDA,EAAsB,CACpB,KAAM,mBACN,QAAA3jF,CACN,CAAK,EACD,MAAMmpF,EAAiBr6F,EAAIm6F,EAAoBC,EAA0B,EACzEjE,EAAW,KAAKkE,CAAc,CAClC,CACE,MAAMC,EAAwBvxE,GAAM6wE,EAAY,CAC9C,IAAK1oF,EAAQ,MAAQA,EAAQ,KAAK,aAAeA,EAAQ,YACzD,aAAc,cACd,QAASk0D,GAAkBl0D,CAAO,EAClC,YAAa,SACjB,CAAG,EACKqpF,EAAyBvD,GAAsB,CACnD,QAAA9lF,EACA,mBAAAwlF,EACA,aAAc4D,EAAsB,aACpC,sBAAAzF,CACJ,CAAG,EACDA,EAAsB,CACpB,KAAM,mBACN,QAAA3jF,CACJ,CAAG,EACD,MAAMspF,EAAax6F,EAAIs6F,EAAuBC,CAAsB,EACpEC,EAAW,iBAAiB,WAAYf,GAAe,CACrD,QAAAvoF,EACA,WAAAwoF,EACA,YAAAtC,EACA,aAAAC,EACA,yBAAAC,EACA,yBAAAC,EACA,MAAAC,EACA,WAAAC,EACA,gBAAA7C,EACA,gBAAA8C,EACA,OAAAC,CACJ,CAAG,CAAC,EACFxB,EAAW,KAAKqE,CAAU,EAG1B,MAAMjB,EAAe,CAAE,EACvB,OAAApD,EAAW,QAAQsE,GAAa,CAC9BA,EAAU,iBAAiB,UAAWnB,GAAc,CAClD,aAAAC,EACA,QAAAC,CACN,CAAK,CAAC,CACN,CAAG,EACM,IAAMtD,GAASC,CAAU,CAClC,EAMMuE,GAAU3hC,GAAO,YAAY,EAS7B4hC,GAAY,SAAUnpE,EAAO,CAGjC,MAAMopE,EAAkBppE,EAAM,YAAc,CAAE,EAC9C,GAAIopE,EAAgB,OAClB,OAAO7lF,GAAY6lF,EAAgB,MAAM,CAE7C,EACMC,GAAS,CAAC3/B,EAAM1pC,IAAU,CAC9B,MAAMopE,EAAkBppE,EAAM,YAAc,CAAE,EAC9C,OAAO0pC,GAAQA,EAAK,aAAeA,EAAK,YAAY,OAAS0/B,EAAgB,OAAS1/B,EAAK,YAAY,MAAM0/B,EAAgB,KAAK,CACpI,EACM9C,GAAU,CAAC58B,EAAM1pC,IAAU,CAC/B,GAAI,CAACqpE,GAAO3/B,EAAM1pC,CAAK,EACrB,MAAO,GAET,MAAMopE,EAAkBppE,EAAM,YAAc,CAAE,EACxCjc,EAAa2lD,EAAK,YAAY,MAAM0/B,EAAgB,KAAK,EAC/D,UAAW77B,KAAWxpD,EAKpB,GAAI,CAACA,EAAWwpD,CAAO,EAAE,KAAO,CAACxpD,EAAWwpD,CAAO,EAAE,UACnD,MAAO,GAGX,MAAO,EACT,EACM+7B,GAAkB,SAAUC,EAAW,CAC3C,MAAM9lF,EAAS,CAAE,EACjB,OAAA8lF,EAAU,QAAQ,CAAC,CACjB,UAAA/hF,EACA,KAAA/c,EACA,QAAAkZ,CACJ,IAAQ,CACJF,EAAO+D,CAAS,EAAI/D,EAAO+D,CAAS,GAAK,CAAE,EAC3C/D,EAAO+D,CAAS,EAAE,KAAKxE,GAAqB,GAAGvY,CAAI,GAAGkZ,CAAO,EAAE,CAAC,CACpE,CAAG,EACD,OAAO,KAAKF,CAAM,EAAE,QAAQ,SAAU+D,EAAW,CAC/C,GAAI/D,EAAO+D,CAAS,EAAE,OAAS,EAAG,CAChC0hF,GAAQ,YAAY1hF,CAAS,gCAAgC/D,EAAO+D,CAAS,EAAE,KAAK,IAAI,CAAC,iGAAiG,EAC1L/D,EAAO+D,CAAS,EAAI,KACpB,MACN,CACI/D,EAAO+D,CAAS,EAAI/D,EAAO+D,CAAS,EAAE,CAAC,CAC3C,CAAG,EACM/D,CACT,EACM+lF,GAAa,SAAUC,EAAU,CACrC,IAAIt1F,EAAQ,EACZ,OAAIs1F,EAAS,OACXt1F,IAEEs1F,EAAS,OACXt1F,IAEKA,CACT,EAcMu1F,GAAoB,SAAUhgC,EAAM1pC,EAAO,CAC/C,MAAMopE,EAAkBppE,EAAM,YAAc,CAAE,EACxC2pE,EAAYL,GAAgBH,GAAUnpE,CAAK,GAAK,CAAE,CAAA,EAGxD,GAAIqpE,GAAO3/B,EAAM1pC,CAAK,GAAK,CAAC2pE,EAAU,OAChC,CAACrD,GAAQ58B,EAAM1pC,CAAK,EAAG,CAIzB,MAAM4pE,EAAgBN,GAAgB1lF,GAAkB8lD,EAAM0/B,EAAgB,KAAK,GAAK,EAAE,EACtFQ,EAAc,QAChBD,EAAU,MAAQC,EAAc,MAExC,CAEE,OAAOD,CACT,EACME,GAAQtiC,GAAO,kBAAkB,EACjCuiC,GAAyB,SAAU9lE,EAAgB,CACvD,GAAI,CAACA,GAAkB,CAACA,EAAe,SACrC,OAEF,MAAM1J,EAAW0J,EAAe,SAChC,OAAO,KAAK,UAAU,CACpB,GAAI1J,EAAS,GACb,UAAW0J,EAAe,UAC1B,MAAOA,EAAe,MACtB,OAAQA,EAAe,OACvB,OAAQ1J,EAAS,YAAcA,EAAS,WAAW,QAAU,EACjE,CAAG,CACH,EAaMyvE,GAAuB,SAAUz+E,EAAI0+E,EAAU,CACnD,GAAI,CAAC1+E,EACH,MAAO,GAET,MAAMle,EAAS8+B,EAAS,iBAAiB5gB,CAAE,EAC3C,OAAKle,EAGEA,EAAO48F,CAAQ,EAFb,EAGX,EASMC,GAAa,SAAUl8F,EAAOm8F,EAAQ,CAC1C,MAAMC,EAAWp8F,EAAM,MAAO,EAC9BA,EAAM,KAAK,SAAUgkC,EAAMq4D,EAAO,CAChC,MAAMC,EAAMH,EAAOn4D,EAAMq4D,CAAK,EAC9B,OAAIC,IAAQ,EACHF,EAAS,QAAQp4D,CAAI,EAAIo4D,EAAS,QAAQC,CAAK,EAEjDC,CACX,CAAG,CACH,EAYMC,GAA2B,SAAUv4D,EAAMq4D,EAAO,CACtD,IAAIG,EACAC,EACJ,OAAIz4D,EAAK,WAAW,YAClBw4D,EAAgBx4D,EAAK,WAAW,WAElCw4D,EAAgBA,GAAiBr+D,EAAS,OAAO,UAC7Ck+D,EAAM,WAAW,YACnBI,EAAiBJ,EAAM,WAAW,WAEpCI,EAAiBA,GAAkBt+D,EAAS,OAAO,UAC5Cq+D,EAAgBC,CACzB,EAYMC,GAA4B,SAAU14D,EAAMq4D,EAAO,CACvD,IAAIM,EACAC,EAWJ,OAVI54D,EAAK,WAAW,YAAcA,EAAK,WAAW,WAAW,QAC3D24D,EAAY34D,EAAK,WAAW,WAAW,OAEzC24D,EAAYA,GAAax+D,EAAS,OAAO,UACrCk+D,EAAM,WAAW,YAAcA,EAAM,WAAW,WAAW,QAC7DO,EAAaP,EAAM,WAAW,WAAW,OAE3CO,EAAaA,GAAcz+D,EAAS,OAAO,UAGvCw+D,IAAcC,GAAc54D,EAAK,WAAW,WAAaq4D,EAAM,WAAW,UACrEr4D,EAAK,WAAW,UAAYq4D,EAAM,WAAW,UAE/CM,EAAYC,CACrB,EAqBA,IAAIC,GAAiB,SAAUlhC,EAAMmhC,EAAiBj/C,EAAaC,EAAci/C,EAAkCC,EAAoB,CAErI,GAAI,CAACrhC,EACH,OAEF,MAAMl+D,EAAU,CACd,UAAWq/F,EACX,MAAOj/C,EACP,OAAQC,EACR,iCAAAi/C,CACD,EACD,IAAI5vE,EAAYwuC,EAAK,UAEjB2C,GAAS,YAAY3C,CAAI,IAC3BxuC,EAAY6vE,EAAmB,0BAG/Bv/F,EAAQ,UAAY,IAGtB,IAAIw/F,EAAqB9vE,EAAU,IAAIZ,GAAY,CACjD,IAAIqxC,EACJ,MAAM12D,EAAQqlB,EAAS,YAAcA,EAAS,WAAW,YAAcA,EAAS,WAAW,WAAW,MAChGtlB,EAASslB,EAAS,YAAcA,EAAS,WAAW,YAAcA,EAAS,WAAW,WAAW,OACvG,OAAAqxC,EAAYrxC,EAAS,YAAcA,EAAS,WAAW,UACvDqxC,EAAYA,GAAaz/B,EAAS,OAAO,UAClC,CACL,UAAAy/B,EACA,MAAA12D,EACA,OAAAD,EACA,SAAAslB,CACD,CACL,CAAG,EACD2vE,GAAWe,EAAoB,CAACj5D,EAAMq4D,IAAUr4D,EAAK,UAAYq4D,EAAM,SAAS,EAGhFY,EAAqBA,EAAmB,OAAOC,GAAO,CAAC5+B,GAAS,eAAe4+B,EAAI,QAAQ,CAAC,EAG5F,IAAIC,EAAsBF,EAAmB,OAAOC,GAAO5+B,GAAS,UAAU4+B,EAAI,QAAQ,CAAC,EACtFC,EAAoB,SAIvBA,EAAsBF,EAAmB,OAAOC,GAAO,CAAC5+B,GAAS,WAAW4+B,EAAI,QAAQ,CAAC,GAI3F,MAAME,EAAwBD,EAAoB,OAAOD,GAAOA,EAAI,UAAYhxB,GAAO,mBAAqB4wB,CAAe,EAC3H,IAAIO,EAA+BD,EAAsBA,EAAsB,OAAS,CAAC,EAGzF,MAAME,EAAmBF,EAAsB,OAAOF,GAAOA,EAAI,YAAcG,EAA6B,SAAS,EAAE,CAAC,EAExH,GAAIN,IAAqC,GAAO,CAC9C,MAAMQ,EAAYD,GAAoBH,EAAoB,CAAC,GAAKF,EAAmB,CAAC,EACpF,GAAIM,GAAaA,EAAU,SAAU,CACnC,IAAI7gG,EAAO,qBACX,OAAI4gG,IACF5gG,EAAO,oBAELygG,EAAoB,CAAC,IACvBzgG,EAAO,uBAETo/F,GAAM,YAAYC,GAAuBwB,CAAS,CAAC,UAAU7gG,CAAI,gBAAiBe,CAAO,EAClF8/F,EAAU,QACvB,CACI,OAAAzB,GAAM,2CAA4Cr+F,CAAO,EAClD,IACR,CAED,MAAM+/F,EAAiBJ,EAAsB,OAAOF,GAAOA,EAAI,OAASA,EAAI,MAAM,EAElFhB,GAAWsB,EAAgB,CAACx5D,EAAMq4D,IAAUr4D,EAAK,MAAQq4D,EAAM,KAAK,EAEpE,MAAMoB,EAAwBD,EAAe,OAAON,GAAOA,EAAI,QAAUr/C,GAAeq/C,EAAI,SAAWp/C,CAAY,EACnHu/C,EAA+BI,EAAsBA,EAAsB,OAAS,CAAC,EAErF,MAAMC,EAAoBD,EAAsB,OAAOP,GAAOA,EAAI,YAAcG,EAA6B,SAAS,EAAE,CAAC,EACzH,IAAIM,EACAC,EACAC,EAGCH,IACHC,EAAwBH,EAAe,OAAON,GAAOA,EAAI,MAAQr/C,GAAeq/C,EAAI,OAASp/C,CAAY,EAEzG8/C,EAA4BD,EAAsB,OAAOT,GAAOA,EAAI,QAAUS,EAAsB,CAAC,EAAE,OAAST,EAAI,SAAWS,EAAsB,CAAC,EAAE,MAAM,EAG9JN,EAA+BO,EAA0BA,EAA0B,OAAS,CAAC,EAC7FC,EAAuBD,EAA0B,OAAOV,GAAOA,EAAI,YAAcG,EAA6B,SAAS,EAAE,CAAC,GAE5H,IAAIS,EAIJ,GAAId,EAAmB,uBAAwB,CAE7C,MAAMe,EAAqBP,EAAe,IAAIN,IAC5CA,EAAI,UAAY,KAAK,IAAIA,EAAI,MAAQr/C,CAAW,EAAI,KAAK,IAAIq/C,EAAI,OAASp/C,CAAY,EAC/Eo/C,EACR,EAEDhB,GAAW6B,EAAoB,CAAC/5D,EAAMq4D,IAEhCr4D,EAAK,YAAcq4D,EAAM,UACpBA,EAAM,UAAYr4D,EAAK,UAEzBA,EAAK,UAAYq4D,EAAM,SAC/B,EACDyB,EAAoBC,EAAmB,CAAC,CACzC,CAED,MAAMR,EAAYO,GAAqBD,GAAwBH,GAAqBJ,GAAoBH,EAAoB,CAAC,GAAKF,EAAmB,CAAC,EACtJ,GAAIM,GAAaA,EAAU,SAAU,CACnC,IAAI7gG,EAAO,qBACX,OAAIohG,EACFphG,EAAO,oBACEmhG,EACTnhG,EAAO,uBACEghG,EACThhG,EAAO,oBACE4gG,EACT5gG,EAAO,mBACEygG,EAAoB,CAAC,IAC9BzgG,EAAO,uBAETo/F,GAAM,YAAYC,GAAuBwB,CAAS,CAAC,UAAU7gG,CAAI,gBAAiBe,CAAO,EAClF8/F,EAAU,QACrB,CACE,OAAAzB,GAAM,2CAA4Cr+F,CAAO,EAClD,IACT,EAaA,MAAMugG,GAAwB,UAAY,CACxC,IAAIC,EAAa,KAAK,qBAAsB9/D,EAAS,kBAAoB,EACzE,OAAK,MAAM,KAAK,gBAAgB,IAC9B8/D,EAAa,KAAK,kBAEbpB,GAAe,KAAK,UAAU,KAAM,KAAK,gBAAiB,SAASb,GAAqB,KAAK,MAAM,GAAE,EAAI,OAAO,EAAG,EAAE,EAAIiC,EAAY,SAASjC,GAAqB,KAAK,MAAM,GAAE,EAAI,QAAQ,EAAG,EAAE,EAAIiC,EAAY,KAAK,iCAAkC,KAAK,mBAAmB,CACzR,EAgBMC,GAAiC,SAAUC,EAAO,CACtD,IAAIC,EAAU,GACVC,EAAsB,GAC1B,GAAIF,EAAQ,GAAKA,EAAQ,EACvB,MAAM,IAAI,MAAM,yDAAyD,EAE3E,OAAO,UAAY,CACjB,IAAIF,EAAa,KAAK,qBAAsB9/D,EAAS,kBAAoB,EACzE,OAAK,MAAM,KAAK,gBAAgB,IAC9B8/D,EAAa,KAAK,kBAEhBG,EAAU,IACZA,EAAU,KAAK,gBACfC,EAAsB,KAAK,iBAOzB,KAAK,gBAAkB,GAAK,KAAK,kBAAoBA,IACvDD,EAAUD,EAAQ,KAAK,iBAAmB,EAAIA,GAASC,EACvDC,EAAsB,KAAK,iBAEtBxB,GAAe,KAAK,UAAU,KAAMuB,EAAS,SAASpC,GAAqB,KAAK,MAAM,GAAI,EAAE,OAAO,EAAG,EAAE,EAAIiC,EAAY,SAASjC,GAAqB,KAAK,MAAM,GAAI,EAAE,QAAQ,EAAG,EAAE,EAAIiC,EAAY,KAAK,iCAAkC,KAAK,mBAAmB,CAC3Q,CACH,EA8BMK,GAAkC,SAAU76F,EAAU,CAC1D,KAAM,CACJ,KAAAk4D,EACA,YAAA/Z,EACA,UAAAgc,EACA,SAAAhzC,EACA,gBAAAI,EACA,kBAAA0vC,EACA,gBAAAxnD,EACA,eAAAqrF,CACD,EAAG96F,EAGE+6F,EAAsB7iC,EAAK,UAAU,OAAOpvC,GAAY,CAAC+xC,GAAS,eAAe/xC,CAAQ,CAAC,EAGhG,IAAIkyE,EAAmBD,EAAoB,OAAOlgC,GAAS,SAAS,EAC/DmgC,EAAiB,SAIpBA,EAAmBD,EAAoB,OAAOjyE,GAAY,CAAC+xC,GAAS,WAAW/xC,CAAQ,CAAC,GAG1F,MAAMmyE,EADqBD,EAAiB,OAAOngC,GAAS,aAAa,KAAK,KAAM,WAAW,CAAC,EAChD,IAAI/xC,GAAY,CAI9D,MAAMoyE,EAHYJ,EAAe,aAAahyE,EAAU3B,EAAU1X,EAAiB0uC,CAAW,EAG9D,EAAI,EAE9Bg9C,EADsBtgC,GAAS,2BAA2BtzC,EAAiB4yC,EAAWrxC,CAAQ,EACpDoyE,EAAcjkC,EAC9D,MAAO,CACL,SAAAnuC,EACA,kBAAAqyE,CACD,CACL,CAAG,EACKC,EAAyBH,EAAqB,OAAOI,GAAYA,EAAS,mBAAqB,CAAC,EAGtG,OADA5C,GAAW2C,EAAwB,CAACj8F,EAAGwF,IAAMm0F,GAAyBn0F,EAAE,SAAUxF,EAAE,QAAQ,CAAC,EACzFi8F,EAAuB,OAClBA,EAAuB,CAAC,GAEjC3C,GAAWwC,EAAsB,CAAC97F,EAAGwF,IAAMxF,EAAE,kBAAoBwF,EAAE,iBAAiB,EAC7Es2F,EAAqB,CAAC,GAAK,KACpC,EAaMK,GAAyC,UAAY,CAGzD,MAAM5xE,EAAY,KAAK,UAAU,KAAK,UAAU,OAAOmxC,GAAS,SAAS,EAEzE,OAAA49B,GAAW/uE,EAAW,CAACvqB,EAAGwF,IAAMm0F,GAAyB35F,EAAGwF,CAAC,CAAC,EAMnC+kB,EAAU,OAAOZ,GAAY,CAAC,CAACovE,GAAkB,KAAK,UAAU,KAAMpvE,CAAQ,EAAE,KAAK,EACtF,CAAC,GAAK,IAClC,EASMyyE,GAAiBC,GAAc,CACnC,IAAIlmF,EAAS,EACTD,EACJ,OAAImmF,EAAW,QACbnmF,EAAa,IAAI,WAAWmmF,EAAW,KAAK,EAE5CA,EAAW,SAAS,QAAQttF,GAAW,CACrCmH,EAAW,IAAInH,EAASoH,CAAM,EAC9BA,GAAUpH,EAAQ,UACxB,CAAK,GAEImH,CACT,EAWA,SAASomF,GAA6BC,EAAa,CACjD,GAAI,CACF,OAAO,IAAI,IAAIA,CAAW,EAAE,SAAS,MAAM,GAAG,EAAE,MAAM,EAAE,EAAE,KAAK,GAAG,CACnE,MAAW,CACV,MAAO,EACX,CACA,CAcA,MAAMC,GAAiC,SAAUC,EAAkBtuD,EAAMwpC,EAAe,CACtF,GAAI,CAAC8kB,EAAiB9kB,CAAa,EAAG,CACpCxpC,EAAK,QAAQ,CACX,KAAM,QACN,KAAM,SACZ,CAAK,EACD,IAAIuuD,EAAa/kB,EAEb,UAAU,KAAKA,CAAa,IAC9B+kB,EAAa,UAAY/kB,EAAc,MAAM,GAAG,EAAE,CAAC,GAErD,MAAMr0E,EAAQ6qC,EAAK,WAAU,EAAG,aAAauuD,CAAU,EACvD,GAAIp5F,EAIFm5F,EAAiB9kB,CAAa,EAAIr0E,MAC7B,CAGL,MAAMgqB,EAAkB6gB,EAAK,SAAS,KAAOA,EAAK,SAAS,IAAI,iBAAmB,CAAE,EACpF,IAAIvjB,EAAQ+sD,EACR3qD,EAAW2qD,EACXglB,EAAM,GACV,MAAMC,EAAiBtvE,EAAgBovE,CAAU,EAC7CE,IACFhyE,EAAQgyE,EAAe,MACvB5vE,EAAW4vE,EAAe,SAC1BD,EAAMC,EAAe,SAIvBH,EAAiB9kB,CAAa,EAAIxpC,EAAK,mBAAmB,CACxD,KAAM,WACN,GAAIuuD,EAEJ,QAASC,EACT,MAAA/xE,EACA,SAAAoC,CACR,EAAS,EAAK,EAAE,KAChB,CACA,CACA,EAWM6vE,GAAiB,SAAU,CAC/B,iBAAAJ,EACA,aAAAK,EACA,gBAAA5L,CACF,EAAG,CACD,GAAI,CAAC4L,EACH,OAEF,MAAMC,EAAMxhE,EAAS,eAAiBA,EAAS,OAC/CuhE,EAAa,QAAQ9X,GAAW,CAC9B,MAAM1hF,EAAQ0hF,EAAQ,OAGlBA,EAAQ,QACVA,EAAQ,QAAQ,QAAQjpF,GAAS,CAC/B,MAAMwE,EAAM,IAAIw8F,EAAI/X,EAAQ,UAAYkM,EAAiBlM,EAAQ,QAAUkM,EAAiBn1F,EAAM,IAAI,EACtGwE,EAAI,KAAOxE,EAAM,KACjBwE,EAAI,MAAQ,OACZA,EAAI,SAAWxE,EAAM,SACrBwE,EAAI,cAAgB,YACpBk8F,EAAiBn5F,CAAK,EAAE,OAAO/C,CAAG,CAC1C,CAAO,EAGDk8F,EAAiBn5F,CAAK,EAAE,OAAO,IAAIy5F,EAAI/X,EAAQ,UAAYkM,EAAiBlM,EAAQ,QAAUkM,EAAiBlM,EAAQ,IAAI,CAAC,CAElI,CAAG,CACH,EAUMgY,GAAkB,SAAUz8F,EAAK,CACrC,OAAO,iBAAiBA,EAAI,MAAO,CACjC,GAAI,CACF,KAAM,CACJ,OAAAk1D,EAAQ,IAAI,KAAK,wDAAwD,EAClEl1D,EAAI,MAAM,GACzB,CACK,EACD,MAAO,CACL,KAAM,CACJ,OAAAk1D,EAAQ,IAAI,KAAK,4DAA4D,EACtEl1D,EAAI,MAAM,IACzB,CACK,EACD,YAAa,CACX,KAAM,CACJ,OAAAk1D,EAAQ,IAAI,KAAK,kEAAkE,EAC5El1D,EAAI,MAAM,IACzB,CACA,CACA,CAAG,CACH,EAYM08F,GAAc,CAAC,CACnB,iBAAAR,EACA,cAAAtzB,EACA,gBAAA+nB,EACA,cAAAgM,CACF,IAAM,CACJ,GAAI,CAAC/zB,EACH,OAEF,MAAM4zB,EAAMxhE,EAAS,eAAiBA,EAAS,OACzC4hE,EAAgBV,EAAiB,eAyBvC,GAxBI,CAACU,IAGLh0B,EAAc,QAAQhJ,GAAY,CAChC,MAAMjxC,EAAOixC,EAAS,QAAU+wB,EAK5B,OAAOhiE,GAAS,UAAYqM,EAAS,MAAMrM,CAAI,GAAKA,EAAO,GAAK,EAAEA,EAAO,MAIzE,CAACixC,EAAS,QAAU,CAACA,EAAS,OAAO,QAGzCA,EAAS,OAAO,QAAQkP,GAAS,CAC/B,MAAM9uE,EAAM,IAAIw8F,EAAI7tE,EAAMA,EAAMmgD,EAAM,OAASA,EAAM,KAAOA,EAAM,MAAQ,EAAE,EAC5E9uE,EAAI,MAAQ8uE,EACZ9uE,EAAI,MAAQ8uE,EACZ2tB,GAAgBz8F,CAAG,EACnB48F,EAAc,OAAO58F,CAAG,CAC9B,CAAK,CACL,CAAG,EACG,CAAC48F,EAAc,MAAQ,CAACA,EAAc,KAAK,QAC7C,OAKF,MAAMx2F,EAAOw2F,EAAc,KACrBC,EAAY,CAAA,EAGlB,QAAS9jG,EAAI,EAAGA,EAAIqN,EAAK,OAAQrN,IAC3BqN,EAAKrN,CAAC,GACR8jG,EAAU,KAAKz2F,EAAKrN,CAAC,CAAC,EAI1B,MAAM+jG,EAAyBD,EAAU,OAAO,CAAChlG,EAAKmI,IAAQ,CAC5D,MAAM+8F,EAAWllG,EAAImI,EAAI,SAAS,GAAK,CAAE,EACzC,OAAA+8F,EAAS,KAAK/8F,CAAG,EACjBnI,EAAImI,EAAI,SAAS,EAAI+8F,EACdllG,CACR,EAAE,CAAE,CAAA,EAECmlG,EAAmB,OAAO,KAAKF,CAAsB,EAAE,KAAK,CAACr9F,EAAGwF,IAAM,OAAOxF,CAAC,EAAI,OAAOwF,CAAC,CAAC,EAEjG+3F,EAAiB,QAAQ,CAAC/0F,EAAW8rE,IAAQ,CAC3C,MAAMkpB,EAAWH,EAAuB70F,CAAS,EAC3Ci1F,EAAiB,SAASP,CAAa,EAAIA,EAAgB10F,EAC3Dk1F,EAAW,OAAOH,EAAiBjpB,EAAM,CAAC,CAAC,GAAKmpB,EAEtDD,EAAS,QAAQj9F,GAAO,CACtBA,EAAI,QAAUm9F,CACpB,CAAK,CACL,CAAG,CACH,EAEMC,GAAgB,CACpB,GAAI,KACJ,MAAO,QACP,UAAW,aACX,SAAU,WACV,QAAS,WACT,UAAW,cACX,gBAAiB,mBACjB,UAAW,aACX,SAAU,WACZ,EACMC,GAAsB,IAAI,IAAI,CAAC,KAAM,QAAS,YAAa,WAAY,UAAW,YAAa,YAAa,UAAW,kBAAkB,CAAC,EAU1IC,GAAuB,CAAC,CAC5B,iBAAApB,EACA,WAAA1/B,CACF,IAAM,CACJ,MAAMogC,EAAgBV,EAAiB,eACvC,GAAI,CAACU,EACH,OAEF,MAAMJ,EAAMxhE,EAAS,eAAiBA,EAAS,OAC/CwhC,EAAW,QAAQtrD,GAAa,CAE9B,UAAW7U,KAAO,OAAO,KAAK6U,CAAS,EAAG,CACxC,GAAImsF,GAAoB,IAAIhhG,CAAG,EAC7B,SAEF,MAAM2D,EAAM,IAAIw8F,EAAItrF,EAAU,UAAWA,EAAU,QAAS,EAAE,EAC9DlR,EAAI,GAAKkR,EAAU,GACnBlR,EAAI,KAAO,0BACXA,EAAI,MAAQ,CACV,IAAKo9F,GAAc/gG,CAAG,EACtB,KAAM6U,EAAU7U,CAAG,CACpB,GACGA,IAAQ,aAAeA,IAAQ,cACjC2D,EAAI,MAAM,KAAO,IAAI,WAAWA,EAAI,MAAM,KAAK,MAAM,cAAc,CAAC,EAAE,QAExE48F,EAAc,OAAO58F,CAAG,CAC9B,CACIkR,EAAU,iBAAkB,CAChC,CAAG,CACH,EAUMqsF,GAAiC,CAACrB,EAAkBxG,EAAc9nD,IAAS,CAC3EsuD,EAAiB,iBAGrBA,EAAiB,eAAiBtuD,EAAK,mBAAmB,CACxD,KAAM,WACN,MAAO,gBACX,EAAK,EAAK,EAAE,MACLsnB,EAAQ,QAAQ,gBACnBgnC,EAAiB,eAAe,gCAAkCxG,GAEtE,EAUM8H,GAAsB,SAAUl+E,EAAOC,EAAKxc,EAAO,CACvD,IAAIhK,EACAiH,EACJ,GAAK+C,GAGAA,EAAM,KAIX,IADAhK,EAAIgK,EAAM,KAAK,OACRhK,KACLiH,EAAM+C,EAAM,KAAKhK,CAAC,EAEdiH,EAAI,WAAasf,GAAStf,EAAI,SAAWuf,GAC3Cxc,EAAM,UAAU/C,CAAG,CAGzB,EASMy9F,GAA+B,SAAU16F,EAAO,CACpD,MAAMqD,EAAOrD,EAAM,KACnB,GAAI,CAACqD,EACH,OAEF,MAAMs3F,EAAa,CAAE,EACrB,QAAS3kG,EAAIqN,EAAK,OAAS,EAAGrN,GAAK,EAAGA,IAAK,CACzC,MAAMiH,EAAMoG,EAAKrN,CAAC,EACZ4kG,EAAS,GAAG39F,EAAI,SAAS,IAAIA,EAAI,OAAO,IAAIA,EAAI,IAAI,GACtD09F,EAAWC,CAAM,EACnB56F,EAAM,UAAU/C,CAAG,EAEnB09F,EAAWC,CAAM,EAAI39F,CAE3B,CACA,EAgBM49F,GAAsB,CAAC/2F,EAAQ43C,EAAao/C,IAAY,CAC5D,GAAI,OAAOp/C,EAAgB,KAAeA,IAAgB,MAAQ,CAAC53C,EAAO,OACxE,MAAO,CAAE,EAGX,MAAMi3F,EAAiB,KAAK,MAAMr/C,EAAco/C,EAAU,GAAKtP,mBAAgB,EAC/E,IAAIx1F,EACJ,IAAKA,EAAI,EAAGA,EAAI8N,EAAO,QACjB,EAAAA,EAAO9N,CAAC,EAAE,IAAM+kG,GADS/kG,IAC7B,CAIF,OAAO8N,EAAO,MAAM9N,CAAC,CACvB,EAgBMglG,GAAkB,CAACl3F,EAAQ6nE,EAAMsvB,IAAY,CACjD,GAAI,CAACtvB,EAAK,OACR,OAAO7nE,EAET,GAAIm3F,EAKF,OAAOtvB,EAAK,MAAO,EAErB,MAAMpvD,EAAQovD,EAAK,CAAC,EAAE,IACtB,IAAI31E,EAAI,EACR,IAAKA,EAAGA,EAAI8N,EAAO,QACb,EAAAA,EAAO9N,CAAC,EAAE,KAAOumB,GADIvmB,IACzB,CAIF,OAAO8N,EAAO,MAAM,EAAG9N,CAAC,EAAE,OAAO21E,CAAI,CACvC,EAcMuvB,GAAkB,CAACp3F,EAAQyY,EAAOC,EAAKs+E,IAAY,CACvD,MAAMlb,EAAW,KAAK,MAAMrjE,EAAQu+E,GAAWtP,mBAAgB,EACzD1L,EAAS,KAAK,MAAMtjE,EAAMs+E,GAAWtP,mBAAgB,EACrD2P,EAAgBr3F,EAAO,MAAO,EACpC,IAAI9N,EAAI8N,EAAO,OACf,KAAO9N,KACD,EAAA8N,EAAO9N,CAAC,EAAE,KAAO8pF,IAArB,CAIF,GAAI9pF,IAAM,GAER,OAAOmlG,EAET,IAAIplD,EAAI//C,EAAI,EACZ,KAAO+/C,KACD,EAAAjyC,EAAOiyC,CAAC,EAAE,KAAO6pC,IAArB,CAKF,OAAA7pC,EAAI,KAAK,IAAIA,EAAG,CAAC,EACjBolD,EAAc,OAAOplD,EAAG//C,EAAI+/C,EAAI,CAAC,EAC1BolD,CACT,EACMC,GAAe,SAAU1+F,EAAGwF,EAAG,CAInC,GAAI,CAACxF,GAAK,CAACwF,GAAK,CAACxF,GAAKwF,GAAKxF,GAAK,CAACwF,EAC/B,MAAO,GAGT,GAAIxF,IAAMwF,EACR,MAAO,GAIT,MAAMm5F,EAAQ,OAAO,KAAK3+F,CAAC,EAAE,KAAM,EAC7B4+F,EAAQ,OAAO,KAAKp5F,CAAC,EAAE,KAAI,EAEjC,GAAIm5F,EAAM,SAAWC,EAAM,OACzB,MAAO,GAET,QAAStlG,EAAI,EAAGA,EAAIqlG,EAAM,OAAQrlG,IAAK,CACrC,MAAMsD,EAAM+hG,EAAMrlG,CAAC,EAMnB,GAJIsD,IAAQgiG,EAAMtlG,CAAC,GAIf0G,EAAEpD,CAAG,IAAM4I,EAAE5I,CAAG,EAClB,MAAO,EAEb,CACE,MAAO,EACT,EAYMiiG,GAA0B,SAAUvuF,EAAiB6Y,EAAU21E,EAAY,CAC/E31E,EAAWA,GAAY,CAAE,EACzB,MAAM41E,EAAmB,CAAE,EAC3B,IAAI7vE,EAAO,EACX,QAAS51B,EAAI,EAAGA,EAAI6vB,EAAS,OAAQ7vB,IAAK,CACxC,MAAMyV,EAAUoa,EAAS7vB,CAAC,EAC1B,GAAIgX,IAAoBvB,EAAQ,WAC9BgwF,EAAiB,KAAKzlG,CAAC,EACvB41B,GAAQngB,EAAQ,SACZmgB,EAAO4vE,GACT,OAAOxlG,CAGf,CACE,OAAIylG,EAAiB,SAAW,EACvB,EAGFA,EAAiBA,EAAiB,OAAS,CAAC,CACrD,EAKMC,GAAkB,EAElBC,GAAqB,IACrBC,GAAS/0D,GAAO,OAAOA,GAAQ,UAAY,SAASA,CAAG,EAIvDg1D,GAAqC,EAAI,GACzCC,GAAqB,CAACC,EAAYC,EAAe3O,IAGjD0O,IAAe,QAAU,CAACC,GAAiB,CAAC3O,EACvC,KAEL,CAACA,EAAU,UAAY,CAACA,EAAU,SAC7B,4CAEL2O,EAAc,UAAY,CAAC3O,EAAU,SAChC,4LAEL,CAAC2O,EAAc,UAAY3O,EAAU,SAChC,kMAEF,KAgBH4O,GAAyB,CAAC13C,EAAU7I,EAAaxvC,IAAmB,CAMxE,IAAIgwF,EAAWxgD,EAAcsqB,GAAO,mBAChCzhB,EAAS,SAGX23C,EAAW,KAAK,IAAIA,EAAU33C,EAAS,MAAM,CAAC,CAAC,GAIjD,MAAM43C,EAAczgD,EAAcxvC,EAClC,OAAO,KAAK,IAAIiwF,EAAaD,CAAQ,CACvC,EACME,GAAoB/uE,GAAe,CACvC,KAAM,CACJ,eAAAuzC,EACA,SAAAl8C,EACA,QAAAjZ,EACA,KAAAmC,EACA,SAAU,CACR,cAAeyuF,EACf,GAAAjhF,EACA,SAAAyK,EAAW,CAAA,CACZ,EACD,WAAYxsB,EACZ,UAAAwU,EACA,SAAA0Y,CACJ,EAAM8G,EACEivE,EAAaz2E,EAAS,OAAS,EACrC,IAAI02E,EAAY,iCACZlvE,EAAY,oBACdkvE,EAAY,wBAAwBlvE,EAAY,mBAAmB,IAC1DA,EAAY,gBACrBkvE,EAAY,2CAEVlvE,EAAY,cACdkvE,GAAa,qBAAqBlvE,EAAY,WAAW,IAE3D,MAAMmvE,EAAe,OAAO3uF,GAAc,SACpCnP,EAAO2uB,EAAY,QAAQ,IAAM,UAAY,cAC7CovE,EAAqBD,EAAepnC,GAAkB,CAC1D,eAAgB3pD,CACpB,CAAG,EAAI,EAAI,EACT,MAAO,GAAG/M,CAAI,KAAK29F,EAAMhjG,CAAK,IAAIgjG,EAAMC,CAAU,KAAOE,EAAe,UAAU3uF,CAAS,IAAI4uF,CAAkB,IAAM,IAAM,uBAAuBhxF,EAAQ,KAAK,OAAOA,EAAQ,GAAG,KAAO+wF,EAAe,oBAAoB5uF,EAAK,KAAK,OAAOA,EAAK,GAAG,IAAM,IAAM,oBAAoBgzD,CAAc,eAAoBl8C,CAAQ,eAAoB6B,CAAQ,kBAAuBg2E,CAAS,eAAoBnhF,CAAE,GACpZ,EACMshF,GAA6BnpF,GAAa,GAAGA,CAAS,aAqBtDopF,GAA4B,CAAC,CACjC,gBAAA7wE,EACA,gBAAA9e,EACA,eAAA4zD,EACA,SAAAt2B,EACA,cAAAsyD,CACF,IAOM,CAACA,GAAiB9wE,IAAoB9e,EACjC,KA0BL8e,EAAkB9e,EACb4zD,EAOFt2B,EAAS,OAASA,EAAS,IAAIA,EAAS,OAAS,CAAC,EAAIs2B,EAkGzDi8B,GAA8B,CAAC,CACnC,yBAAAC,EACA,gBAAA9vF,EACA,gBAAA8e,EACA,WAAAiwE,EACA,cAAAgB,CACF,IAAM,CACJ,GAAI/vF,IAAoB8e,EACtB,MAAO,GAET,GAAIiwE,IAAe,QAAS,CAC1B,MAAMiB,EAAyBF,EAAyB,mBAAmB,CACzE,KAAM,MACZ,CAAK,EAKD,MAAO,CAACE,GAA0BA,EAAuB,KAAOlxE,CACjE,CAKD,GAAIiwE,IAAe,QAAUgB,EAAe,CAC1C,MAAME,EAA6BH,EAAyB,sBAAsB,CAChF,KAAM,OACZ,CAAK,EAmBD,MAAI,EAAAG,GAA8BA,EAA2B,KAAOnxE,EAIxE,CACE,MAAO,EACT,EACMoxE,GAAgBC,GAAe,CACnC,IAAIC,EAAc,EAClB,OAAC,QAAS,OAAO,EAAE,QAAQ,SAAU5mG,EAAM,CACzC,MAAM6mG,EAAiBF,EAAY,GAAG3mG,CAAI,YAAY,EACtD,GAAI,CAAC6mG,EACH,OAEF,KAAM,CACJ,MAAA9gF,EACA,IAAAC,CACN,EAAQ6gF,EACJ,IAAI34E,EACA,OAAOnI,GAAU,UAAY,OAAOC,GAAQ,SAC9CkI,EAAWuT,EAAS,OAAOzb,CAAG,EAAIyb,EAAS,OAAO1b,CAAK,EAC9C,OAAOA,GAAU,UAAY,OAAOC,GAAQ,WACrDkI,EAAWlI,EAAMD,GAEf,OAAOmI,EAAa,KAAeA,EAAW04E,IAChDA,EAAc14E,EAEpB,CAAG,EAGG,OAAO04E,GAAgB,UAAYA,EAAc,OAAO,mBAC1DA,EAAc,OAAOA,CAAW,GAE3BA,CACT,EACME,GAAiB,CAAC,CACtB,gBAAAx4E,EACA,YAAAs4E,CACF,IAGOt4E,EAcE,KAAK,MAAMA,CAAe,EAAIs4E,EAAc1pC,GAb1C,GAeL6pC,GAAuC,CAAClwE,EAAamwE,IAAe,CAGxE,GAAIA,IAAe,MACjB,OAAO,KAET,MAAM14E,EAAkBo4E,GAAc,CACpC,gBAAiB7vE,EAAY,gBAC7B,gBAAiBA,EAAY,eACjC,CAAG,EAKD,GAAI,CAACvI,EACH,OAAO,KAET,MAAM5Y,EAAiBmhB,EAAY,SAAS,eACtCowE,EAAsBH,GAAe,CACzC,gBAAAx4E,EACA,YAAa5Y,EAAiB,CAClC,CAAG,EACKwxF,EAA2BJ,GAAe,CAC9C,gBAAAx4E,EACA,YAAa5Y,CACjB,CAAG,EACKyxF,EAAwB,sBAAsBtwE,EAAY,UAAU,kBAAuBA,EAAY,SAAS,EAAE,sBAA2BvI,CAAe,kCAAuCuI,EAAY,QAAQ,+BAAoCnhB,CAAc,4PAC/Q,OAAIuxF,GAAuBC,EAClB,CACL,SAAUD,EAAsB,OAAS,OACzC,QAASE,CACV,EAEI,IACT,EAOMlO,GAAqB,CAAC,CAC1B,KAAAj5F,EACA,QAAAiV,CACF,IAAM,CACJ,GAAI,CAACA,EACH,OAEF,MAAMmyF,EAAc,GAAQnyF,EAAQ,KAAOA,EAAQ,KAAOA,EAAQ,IAAI,IAChEoyF,EAAwB,GAAQpyF,EAAQ,KAAO,CAACA,EAAQ,IAAI,OAC5D8Q,EAAQ9Q,EAAQ,iBAAmB,OAAYA,EAAQ,MAAQA,EAAQ,eAC7E,MAAO,CACL,KAAMjV,GAAQiV,EAAQ,KACtB,IAAKA,EAAQ,aAAeA,EAAQ,IACpC,MAAA8Q,EACA,SAAU9Q,EAAQ,SAClB,YAAAmyF,EACA,sBAAAC,CACD,CACH,EASA,MAAMC,WAAsB3rC,EAAQ,WAAY,CAC9C,YAAY50D,EAAUhG,EAAU,GAAI,CAGlC,GAFA,QAEI,CAACgG,EACH,MAAM,IAAI,UAAU,sCAAsC,EAE5D,GAAI,OAAOA,EAAS,aAAgB,WAClC,MAAM,IAAI,UAAU,iCAAiC,EAEvD,GAAI,CAACA,EAAS,YACZ,MAAM,IAAI,UAAU,0BAA0B,EAGhD,KAAK,UAAYA,EAAS,UAC1B,KAAK,WAAa,CAChB,KAAM,EACN,MAAO,CACR,EACD,KAAK,UAAY,IACjB,KAAK,YAAa,EAClB,KAAK,WAAa,KAClB,KAAK,UAAY,KAEjB,KAAK,WAAaA,EAAS,UAC3B,KAAK,aAAeA,EAAS,YAC7B,KAAK,UAAYA,EAAS,SAC1B,KAAK,SAAWA,EAAS,QACzB,KAAK,UAAYA,EAAS,SAC1B,KAAK,aAAeA,EAAS,YAC7B,KAAK,KAAOA,EAAS,IACrB,KAAK,YAAcA,EAAS,WAC5B,KAAK,kBAAoB,OACzB,KAAK,mBAAqB,OAC1B,KAAK,sBAAwBA,EAAS,qBACtC,KAAK,kBAAoBA,EAAS,iBAClC,KAAK,YAAcA,EAAS,WAC5B,KAAK,eAAiBA,EAAS,cAC/B,KAAK,kBAAoBA,EAAS,iBAClC,KAAK,OAAS,OACd,KAAK,0BAA4BA,EAAS,yBAC1C,KAAK,6BAA+B,GACpC,KAAK,kBAAoBA,EAAS,iBAClC,KAAK,0BAA4BA,EAAS,yBAC1C,KAAK,iBAAmBA,EAAS,gBACjC,KAAK,qBAAuBA,EAAS,qBACrC,KAAK,uBAAyBA,EAAS,uBAEvC,KAAK,oBAAsB,KAC3B,KAAK,OAAS,OACd,KAAK,iBAAmB,GACxB,KAAK,uCAAyC,GAC9C,KAAK,gBAAkB,KACvB,KAAK,YAAc,KACnB,KAAK,iBAAmB,CAAE,EAC1B,KAAK,eAAiB,GACtB,KAAK,0BAA4B,GAEjC,KAAK,WAAa,CAAE,EACpB,KAAK,aAAe,EACpB,KAAK,YAAc,GACnB,KAAK,mBAAqB,CACxB,MAAO,GACP,MAAO,EACR,EACD,KAAK,2BAA6B,CAChC,MAAO,KACP,MAAO,IACR,EACD,KAAK,WAAa,GAMlB,KAAK,WAAa,CAAE,EACpB,KAAK,eAAiB,CACpB,IAAK,CAAE,EACP,QAAS,CAAA,CACV,EACD,KAAK,iBAAmB,GACxB,KAAK,gCAAkC,KAEvC,KAAK,qBAAuB,KAC5B,KAAK,cAAgB,GAErB,KAAK,qBAAuBA,EAAS,oBACrC,KAAK,UAAY,CAAE,EACnB,KAAK,WAAaA,EAAS,UAI3B,KAAK,gBAAkBA,EAAS,eAChC,KAAK,WAAa,CAChB,aAAc,EACd,KAAM,CACP,EACD,KAAK,YAAc,KAAK,kBAAmB,EAC3C,KAAK,uBAAyB,IAAM,KAAK,QAAQ,gBAAgB,EACjE,KAAK,gBAAgB,GAAG,iBAAkB,KAAK,sBAAsB,EACrE,KAAK,aAAa,iBAAiB,aAAc,IAAM,CAChD,KAAK,mBACR,KAAK,OAAS,GAEtB,CAAK,EAED,KAAK,eAAiB,GACtB,KAAK,QAAU+1D,GAAO,iBAAiB,KAAK,WAAW,GAAG,EAC1D,OAAO,eAAe,KAAM,QAAS,CACnC,KAAM,CACJ,OAAO,KAAK,MACb,EACD,IAAIyqC,EAAU,CACRA,IAAa,KAAK,SACpB,KAAK,QAAQ,GAAG,KAAK,MAAM,OAAOA,CAAQ,EAAE,EAC5C,KAAK,OAASA,EACd,KAAK,QAAQ,aAAa,EAEpC,CACA,CAAK,EACD,KAAK,eAAe,GAAG,QAAS,IAAM,CAChC,KAAK,0BACP,KAAK,kBAAmB,CAEhC,CAAK,EACD,KAAK,eAAe,GAAG,eAAgBlhC,GAAY,CACjD,KAAK,QAAQ1nE,GAAS,CACpB,KAAM,cACP,EAAE0nE,CAAQ,CAAC,CAClB,CAAK,EAKG,KAAK,cAAgB,QACvB,KAAK,0BAA0B,GAAG,wBAAyB,IAAM,CAC3D,KAAK,0BACP,KAAK,kBAAmB,CAElC,CAAO,EAKC,KAAK,cAAgB,SACvB,KAAK,0BAA0B,GAAG,iBAAkBA,GAAY,CAC9D,KAAK,QAAQ1nE,GAAS,CACpB,KAAM,gBACP,EAAE0nE,CAAQ,CAAC,EACR,KAAK,wBACP,KAAK,kBAAmB,EAEtB,KAAK,0BACP,KAAK,kBAAmB,CAElC,CAAO,CAEP,CAUE,IAAI,oBAAqB,CACvB,OAAO,KAAK,gBAAgB,qBAAqB,KAAK,WAAW,CACrE,CACE,mBAAoB,CAClB,OAAOqzB,GAAkB,iBAAiB,CACxC,MAAO,GACP,eAAgB,KAAK,YACrB,uBAAwB,GACxB,iBAAkB,KAAK,kBACvB,gBAAiB,KAAK,gBAC5B,CAAK,CACL,CAOE,aAAc,CACZ,KAAK,sBAAwB,EAC7B,KAAK,cAAgB,EACrB,KAAK,qBAAuB,EAC5B,KAAK,sBAAwB,EAC7B,KAAK,qBAAuB,EAC5B,KAAK,sBAAwB,EAC7B,KAAK,mBAAqB,EAC1B,KAAK,aAAe,CACxB,CAKE,SAAU,CACR,KAAK,QAAQ,SAAS,EACtB,KAAK,MAAQ,WACb,KAAK,MAAO,EACZ,KAAK,OAAQ,EACT,KAAK,aACP,KAAK,YAAY,UAAW,EAE9B,KAAK,YAAa,EACd,KAAK,qBACPj4D,EAAS,aAAa,KAAK,mBAAmB,EAE5C,KAAK,iBAAmB,KAAK,wBAC/B,KAAK,gBAAgB,IAAI,iBAAkB,KAAK,sBAAsB,EAExE,KAAK,IAAK,CACd,CACE,SAASy6B,EAAQ,CACf,KAAK,eAAiB,CAACA,EACnBA,EACF,KAAK,mBAAmB,MAAQ,GAGhC,KAAK,eAAe,YAAY,EAAG,KAAK,UAAS,CAAE,CAEzD,CAME,OAAQ,CACN,GAAI,KAAK,QAAU,UAAW,CACxB,KAAK,kBACP,KAAK,gBAAkB,MAEzB,MACN,CACI,KAAK,OAAM,EAKX,KAAK,MAAQ,QAGR,KAAK,UACR,KAAK,eAAgB,CAE3B,CAOE,QAAS,CACH,KAAK,iBAAmB,KAAK,gBAAgB,eAC/C,KAAK,gBAAgB,cAAe,EAGtC,KAAK,gBAAkB,KACvB,KAAK,WAAa,CAAE,EACpB,KAAK,WAAa,CAAE,EACpB,KAAK,eAAe,IAAM,CAAE,EAC5B,KAAK,eAAe,QAAU,CAAE,EAChC,KAAK,0BAA0B,2BAA2B,KAAK,WAAW,EAC1E,KAAK,iBAAmB,GACxBz6B,EAAS,aAAa,KAAK,+BAA+B,EAC1D,KAAK,gCAAkC,IAC3C,CACE,eAAe+lE,EAAW,CAGxB,OAAI,KAAK,QAAU,aAAe,CAAC,KAAK,iBACtC,KAAK,MAAQ,QACN,IAEL,CAAC,KAAK,iBAAmB,KAAK,gBAAgB,YAAcA,CAIpE,CAQE,MAAM/oG,EAAO,CACX,OAAI,OAAOA,EAAU,MACnB,KAAK,QAAQ,kBAAmBA,CAAK,EACrC,KAAK,OAASA,GAEhB,KAAK,gBAAkB,KAChB,KAAK,MAChB,CACE,aAAc,CACZ,KAAK,OAAS,GACV,KAAK,aAEPi7F,GAAkB,MAAM,KAAK,WAAW,EAE1C,KAAK,WAAW,OAAS,EACzB,KAAK,MAAO,EACZ,KAAK,QAAQ,OAAO,CACxB,CAQE,WAAY,CACV,MAAM7C,EAAY,KAAK,cAAe,EACtC,GAAI,CAAC,KAAK,gBAAkB,CAACA,EAC3B,OAAO95B,GAAkB,EAE3B,GAAI,KAAK,cAAgB,OAAQ,CAC/B,KAAM,CACJ,SAAA0qC,EACA,SAAAC,EACA,QAAA7L,CACR,EAAUhF,EACJ,GAAI6Q,GAAYD,GAAY,CAAC,KAAK,gBAAkB,CAAC5L,EACnD,OAAO,KAAK,eAAe,SAAU,EAEvC,GAAI6L,EACF,OAAO,KAAK,eAAe,cAAe,CAE7C,CAGD,OAAO,KAAK,eAAe,cAAe,CAC9C,CAYE,kBAAkBxyF,EAAKkuB,EAAM,GAAO,CAClC,GAAI,CAACluB,EACH,OAAO,KAET,MAAM0P,EAAK6kD,GAAcv0D,CAAG,EAC5B,IAAIyyF,EAAY,KAAK,cAAc/iF,CAAE,EACrC,OAAIwe,GAAO,CAACukE,GAAazyF,EAAI,QAC3B,KAAK,cAAc0P,CAAE,EAAI+iF,EAAY,CACnC,YAAazyF,EAAI,YACjB,UAAWA,EAAI,UACf,MAAOA,EAAI,MACX,OAAQA,EAAI,OACZ,WAAYA,EAAI,UACjB,GAEIyyF,GAAazyF,CACxB,CAYE,WAAWpS,EAAKsgC,EAAM,GAAO,CAC3B,GAAI,CAACtgC,EACH,OAAO,KAET,MAAM8hB,EAAK8kD,GAAa5mE,CAAG,EAC3B,IAAI8kG,EAAY,KAAK,UAAUhjF,CAAE,EAG7B,KAAK,sBAAwBwe,GAAO,CAACwkE,GAAa9kG,EAAI,QACxD,KAAK,UAAU8hB,CAAE,EAAIgjF,EAAY,CAC/B,YAAa9kG,EAAI,YACjB,MAAOA,EAAI,KACZ,GAEH,MAAMH,EAAS,CACb,aAAcilG,GAAa9kG,GAAK,WACjC,EACD,OAAI8kG,IACFjlG,EAAO,MAAQilG,EAAU,OAEpBjlG,CACX,CAQE,oBAAqB,CACnB,OAAO,KAAK,WAAa,CAAC,KAAK,OAAQ,CAC3C,CAKE,MAAO,CAKL,GAHA,KAAK,eAAc,EAGf,EAAC,KAAK,UAIV,IAAI,KAAK,QAAU,QAAU,KAAK,mBAAkB,EAClD,OAAO,KAAK,MAAO,EAIjB,CAAC,KAAK,mBAAkB,GAAM,KAAK,QAAU,SAAW,KAAK,QAAU,SAG3E,KAAK,MAAQ,SACjB,CASE,OAAQ,CACN,YAAK,MAAQ,QAGb,KAAK,gBAAiB,EACf,KAAK,eAAgB,CAChC,CAOE,SAASklG,EAAa9mG,EAAU,GAAI,CAClC,GAAI,CAAC8mG,EACH,OAEF,MAAMz2E,EAAc,KAAK,UACnByF,EAAc,KAAK,gBACzB,KAAK,UAAYgxE,EACjB,KAAK,YAAc9mG,EAQf,KAAK,QAAU,SACjB8mG,EAAY,SAAW,CACrB,cAAeA,EAAY,cAC3B,KAAM,CACd,EASU,KAAK,cAAgB,QACvB,KAAK,gBAAgB,2BAA2BA,CAAW,GAG/D,IAAIC,EAAQ,KAqBZ,GApBI12E,IACEA,EAAY,GACd02E,EAAQ12E,EAAY,GACXA,EAAY,MACrB02E,EAAQ12E,EAAY,MAGxB,KAAK,QAAQ,oBAAoB02E,CAAK,OAAOD,EAAY,IAAMA,EAAY,GAAG,GAAG,EAC7E,KAAK,qBACP,KAAK,mBAAmB,OAAOA,EAAa,KAAK,aAAY,CAAE,EAC/D,KAAK,QAAQ;AAAA,eACJ,KAAK,aAAc,CAAA;AAAA,eACnBzpC,GAAgB,KAAK,WAAW,CAAC;AAAA,EAC7C,KAAK,mBAAmB,WAAW,GAIlC,KAAK,QAAQ,gBAAgB,EAGzB,KAAK,QAAU,QAAU,KAAK,mBAAkB,EAClD,OAAO,KAAK,MAAO,EAErB,GAAI,CAAChtC,GAAeA,EAAY,MAAQy2E,EAAY,IAAK,CACnD,KAAK,aAAe,OASN,CAACA,EAAY,SAAW,OAAOA,EAAY,oBAAuB,SAEhF,KAAK,YAAa,EAElB,KAAK,aAAc,GAGvB,KAAK,kBAAoB,OACzB,KAAK,QAAQ,gBAAgB,EAE7B,MACD,CAGD,MAAME,EAAoBF,EAAY,cAAgBz2E,EAAY,cAKlE,GAJA,KAAK,QAAQ,sBAAsB22E,CAAiB,GAAG,EAInD,KAAK,aAAe,KAKtB,GAJA,KAAK,YAAcA,EAIf,KAAK,WAAa,EACpB,KAAK,WAAa,KAClB,KAAK,UAAY,SACZ,CACL,MAAM9yF,EAAU,KAAK,UAAU,SAAS,KAAK,UAAU,EAIvD,GAAI,KAAK,YAAc,CAACA,EAAQ,OAAS,CAACA,EAAQ,MAAM,QAAU,CAACA,EAAQ,MAAM,KAAK,SAAS,GAAI,CACjG,MAAM+yF,EAAa,KAAK,WACxB,KAAK,QAAQ,oCAAoC,KAAK,SAAS,qBAAqB,EACpF,KAAK,YAAW,EAIhB,KAAK,WAAaA,CAC5B,CACA,CAKQnxE,IACFA,EAAY,YAAckxE,EACtBlxE,EAAY,WAAa,GAC3BA,EAAY,WAAa,KACzBA,EAAY,UAAY,OAKpBA,EAAY,YAAc,IAC5BA,EAAY,QAAUgxE,EAAY,SAAShxE,EAAY,UAAU,GAE/DA,EAAY,WAAa,GAAKA,EAAY,QAAQ,QACpDA,EAAY,KAAOA,EAAY,QAAQ,MAAMA,EAAY,SAAS,KAIxE,KAAK,gBAAgB,uBAAuBzF,EAAay2E,CAAW,CACxE,CAQE,OAAQ,CACF,KAAK,sBACPpmE,EAAS,aAAa,KAAK,mBAAmB,EAC9C,KAAK,oBAAsB,KAEjC,CAOE,QAAS,CACP,OAAO,KAAK,sBAAwB,IACxC,CAQE,gBAAgBitC,EAAM,CACpB,KAAK,OAAS,GACd,KAAK,qBAAuB,KAC5B,KAAK,mBAAqB,CACxB,MAAO,GACP,MAAO,EACR,EACD,KAAK,YAAW,EAIhB,KAAK,OAAO,EAAG,IAAUA,CAAI,EAEzB,KAAK,cACP,KAAK,YAAY,YAAY,CAC3B,OAAQ,qBAChB,CAAO,EAED,KAAK,YAAY,YAAY,CAC3B,OAAQ,OAChB,CAAO,EAEP,CAQE,aAAc,CACZ,KAAK,eAAiB,GAClB,KAAK,oBACP,KAAK,mBAAmB,oBAAqB,EAE/C,KAAK,aAAc,CACvB,CAME,cAAe,CACT,KAAK,aAEPgrB,GAAkB,MAAM,KAAK,WAAW,EAE1C,KAAK,WAAa,KAClB,KAAK,UAAY,KACjB,KAAK,WAAa,KAClB,KAAK,0BAA4B,GAGjC,MAAMuO,EAAS,KAAK,mBAAqB,KAAK,kBAAkB,OAChD,KAAK,cAAgB,OAAS,CAACA,IAE7C,KAAK,uCAAyC,IAEhD,KAAK,WAAa,CAAE,EACpB,KAAK,WAAa,CAAE,EACpB,KAAK,eAAe,IAAM,CAAE,EAC5B,KAAK,eAAe,QAAU,CAAE,EAChC,KAAK,MAAO,EACR,KAAK,aACP,KAAK,YAAY,YAAY,CAC3B,OAAQ,wBAChB,CAAO,CAEP,CAWE,OAAOliF,EAAOC,EAAK0oD,EAAO,IAAM,CAAE,EAAEw5B,EAAQ,GAAO,CAUjD,GANIliF,IAAQ,MACVA,EAAM,KAAK,UAAW,GAKpBA,GAAOD,EAAO,CAChB,KAAK,QAAQ,yDAAyD,EACtE,MACN,CACI,GAAI,CAAC,KAAK,gBAAkB,CAAC,KAAK,cAAa,EAAI,CACjD,KAAK,QAAQ,kEAAkE,EAE/E,MACD,CAED,IAAIoiF,EAAmB,EACvB,MAAMC,EAAiB,IAAM,CAC3BD,IACIA,IAAqB,GACvBz5B,EAAM,CAET,GACGw5B,GAAS,CAAC,KAAK,kBACjBC,IACA,KAAK,eAAe,YAAYpiF,EAAOC,EAAKoiF,CAAc,IAUxDF,GAAS,KAAK,cAAgB,UAChC,KAAK,WAAaxD,GAAgB,KAAK,WAAY3+E,EAAOC,EAAK,KAAK,YAAY,EAChFmiF,IACA,KAAK,eAAe,YAAYpiF,EAAOC,EAAKoiF,CAAc,GAG5D,UAAW5+F,KAAS,KAAK,kBACvBy6F,GAAoBl+E,EAAOC,EAAK,KAAK,kBAAkBxc,CAAK,CAAC,EAE/Dy6F,GAAoBl+E,EAAOC,EAAK,KAAK,qBAAqB,EAE1DoiF,EAAgB,CACpB,CAOE,gBAAiB,CACX,KAAK,qBACP3mE,EAAS,aAAa,KAAK,mBAAmB,EAEhD,KAAK,oBAAsBA,EAAS,WAAW,KAAK,mBAAmB,KAAK,IAAI,EAAG,CAAC,CACxF,CAQE,oBAAqB,CACf,KAAK,QAAU,SACjB,KAAK,YAAa,EAEhB,KAAK,qBACPA,EAAS,aAAa,KAAK,mBAAmB,EAEhD,KAAK,oBAAsBA,EAAS,WAAW,KAAK,mBAAmB,KAAK,IAAI,EAAG0jE,EAAkB,CACzG,CAWE,aAAc,CAGZ,GAAI,KAAK,eAAe,WACtB,OAGF,MAAMtuE,EAAc,KAAK,mBAAoB,EAC7C,GAAI,CAACA,EACH,OAEF,MAAMwvC,EAAW,CACf,YAAa4yB,GAAmB,CAC9B,KAAM,KAAK,YACX,QAASpiE,CACV,CAAA,CACF,EACD,KAAK,QAAQ,CACX,KAAM,kBACN,SAAAwvC,CACN,CAAK,EACG,OAAOxvC,EAAY,iBAAoB,WACzC,KAAK,0BAA4B,GACjC,KAAK,0BAA0B,sBAAsB,CACnD,KAAM,KAAK,YACX,KAAM,KAAK,iBACX,GAAIA,EAAY,QACxB,CAAO,GAEH,KAAK,aAAaA,CAAW,CACjC,CAWE,eAAemxE,EAAa,KAAK,WAAYn4E,EAAW,KAAK,UAAWxY,EAAY,KAAK,UAAW,CAClG,GAAI,CAACwY,GAAY,CAAC,KAAK,aACrB,MAAO,GAET,MAAM5a,EAAU,OAAO+yF,GAAe,UAAYn4E,EAAS,SAASm4E,CAAU,EAExEK,EAAsBL,EAAa,IAAMn4E,EAAS,SAAS,OAE3Dy4E,EAAmB,CAACrzF,GAAW,CAACA,EAAQ,OAASoC,EAAY,IAAMpC,EAAQ,MAAM,OAIvF,OAAO4a,EAAS,SAAW,KAAK,aAAa,aAAe,QAAUw4E,GAAuBC,CACjG,CAOE,oBAAqB,CACnB,MAAMx0D,EAAW,KAAK,UAAW,EAC3BiQ,EAAcqa,GAAgBtqB,CAAQ,GAAK,EAC3Cy0D,EAAelqC,GAAYvqB,EAAU,KAAK,aAAY,CAAE,EACxD00D,EAAY,CAAC,KAAK,WAAY,GAAID,GAAgB,EAClDE,EAAmBF,GAAgB,KAAK,kBAAmB,EAC3Dl5E,EAAW,KAAK,UAAU,SAKhC,GAAI,CAACA,EAAS,QAAUm5E,GAAaC,EACnC,OAAO,KAET,KAAK,WAAa,KAAK,YAAc,KAAK,gBAAgB,aAAa,KAAK,UAAW,KAAK,UAAS,EAAI,KAAK,iBAAkB,KAAK,aAAc,EAAE,KAAK,WAAW,EACrK,MAAM/lF,EAAO,CACX,UAAW,KACX,WAAY,KACZ,eAAgB,KAChB,SAAU,KAAK,UACf,cAAuB,CAAC,KAAK,UAC9B,EACD,GAAIA,EAAK,cACPA,EAAK,WAAaqiF,GAAwB,KAAK,iBAAkB11E,EAAU00B,CAAW,EACtF,KAAK,QAAQ,0EAA0ErhC,EAAK,UAAU,EAAE,UAC/F,KAAK,aAAe,KAAM,CACnC,MAAMzN,EAAUoa,EAAS,KAAK,UAAU,EAClChY,EAAY,OAAO,KAAK,WAAc,SAAW,KAAK,UAAY,GACxEqL,EAAK,eAAiBzN,EAAQ,IAAMA,EAAQ,IAAM8uC,EAC9C9uC,EAAQ,OAASA,EAAQ,MAAMoC,EAAY,CAAC,GAC9CqL,EAAK,WAAa,KAAK,WACvBA,EAAK,UAAYrL,EAAY,GAE7BqL,EAAK,WAAa,KAAK,WAAa,CAE5C,KAAW,CACL,IAAIvL,EACAE,EACA3I,EACJ,MAAMs2F,EAAa,KAAK,eAAiBjhD,EAAc,KAAK,aAAc,EAS1E,GARI,KAAK,oBACP,KAAK,QAAQ;AAAA,kBACHihD,CAAU;AAAA,eACb,KAAK,aAAc,CAAA;AAAA,eACnBjhD,CAAW;AAAA,mBACP,KAAK,cAAc;AAAA,EACnC,KAAK,mBAAmB,WAAW,EAE5B,KAAK,oBAAsB,KAAK,mBAAmB,WAAY,CACjE,MAAM2kD,EAAW,KAAK,kCAAkC1D,CAAU,EAClE,GAAI,CAAC0D,EAAU,CACb,MAAMrjG,EAAU,qDAChB,YAAK,MAAM,CACT,QAAAA,EACA,SAAU,CACR,UAAWs2D,EAAQ,MAAM,mCACzB,MAAO,IAAI,MAAMt2D,CAAO,CACtC,CACA,CAAW,EACD,KAAK,QAAQ,mEAAmE,EAEzE,IACjB,CACQ,KAAK,QAAQ,8CAA8CqjG,EAAS,KAAK,QAAQA,EAAS,GAAG,GAAG,EAChGvxF,EAAeuxF,EAAS,aACxBrxF,EAAYqxF,EAAS,UACrBh6F,EAAYg6F,EAAS,KAC7B,KAAa,CACL,KAAK,QAAQ,+FAA+F,EAE5G,MAAMC,EAAmB/mC,GAAS,oBAAoB,CACpD,qBAAsB,KAAK,qBAC3B,SAAU,KAAK,UACf,YAAaojC,EACb,kBAAmB,KAAK,WAAW,UACnC,qBAAsB,KAAK,WAAW,aACtC,UAAW,KAAK,WAAW,IACrC,CAAS,EACD7tF,EAAewxF,EAAiB,aAChCtxF,EAAYsxF,EAAiB,UAC7Bj6F,EAAYi6F,EAAiB,SACrC,CACMjmF,EAAK,oBAAsB,KAAK,eAAiB,eAAesiF,CAAU,GAAK,eAAeA,CAAU,GACxGtiF,EAAK,WAAavL,EAClBuL,EAAK,eAAiBhU,EACtBgU,EAAK,UAAYrL,EACjB,KAAK,QAAQ,iFAAiFqL,EAAK,UAAU,GAAG,CACtH,CACI,MAAMkmF,EAAcv5E,EAAS3M,EAAK,UAAU,EAC5C,IAAIyhD,EAAWykC,GAAe,OAAOlmF,EAAK,WAAc,UAAYkmF,EAAY,OAASA,EAAY,MAAMlmF,EAAK,SAAS,EAGzH,GAAI,CAACkmF,GAAe,OAAOlmF,EAAK,WAAc,UAAY,CAACyhD,EACzD,OAAO,KAIL,OAAOzhD,EAAK,WAAc,UAAYkmF,EAAY,QACpDlmF,EAAK,UAAY,EACjByhD,EAAWykC,EAAY,MAAM,CAAC,GAKhC,MAAMC,EAAyB,KAAK,KAAK,WAAa,KAAK,KAAK,UAAU,MAAQ,KAAK,KAAK,UAAU,KAAK,qBAAuB,KAAK,UAAU,oBAKjJ,GAAI,CAACN,GAAgBpkC,GAAY,CAAC0kC,GAA0B,CAAC1kC,EAAS,YACpE,GAAIzhD,EAAK,YAAc,EAAG,CACxB,MAAMi8C,EAActvC,EAAS3M,EAAK,WAAa,CAAC,EAC1ComF,EAAsBnqC,EAAY,OAASA,EAAY,MAAM,QAAUA,EAAY,MAAMA,EAAY,MAAM,OAAS,CAAC,EACvHmqC,GAAuBA,EAAoB,cAC7CpmF,EAAK,YAAc,EACnBA,EAAK,UAAYi8C,EAAY,MAAM,OAAS,EAC5Cj8C,EAAK,YAAc,mBAE7B,MAAiBkmF,EAAY,MAAMlmF,EAAK,UAAY,CAAC,EAAE,cAC/CA,EAAK,WAAa,EAClBA,EAAK,YAAc,iBAGvB,MAAMqmF,EAAQ,KAAK,cAAgB,KAAK,aAAa,aAAe,QAKpE,OAAIrmF,EAAK,YAAc2M,EAAS,OAAS,GAAK05E,GAAS,CAAC,KAAK,WACpD,MAEL,KAAK,yCACP,KAAK,uCAAyC,GAC9CrmF,EAAK,qBAAuB,GAC5B,KAAK,QAAQ,iEAAiE,GAEzE,KAAK,qBAAqBA,CAAI,EACzC,CACE,kCAAkCsiF,EAAY,CAC5C,GAAI,CAAC,KAAK,mBACR,OAAO,KAGT,MAAMgE,EAAkB,KAAK,IAAIhE,EAAY,KAAK,mBAAmB,KAAK,EACtEA,IAAegE,GACjB,KAAK,QAAQ,8DAA8DhE,CAAU,OAAOgE,CAAe,EAAE,EAE/G,MAAMC,EAAwB,KAAK,mBAAmB,mBAAmBD,CAAe,EACxF,GAAI,CAACC,EAEH,OAAO,KAET,GAAI,CAACA,EAAsB,WAEzB,OAAOA,EAIT,MAAMC,EAA4B,KAAK,mBAAmB,mBAAmBD,EAAsB,GAAG,EACtG,OAAKC,GAIDA,EAA0B,YAC5B,KAAK,QAAQ,2HAA2H,EAGnIA,GANE,IAOb,CACE,qBAAqBnoG,EAAS,CAC5B,KAAM,CACJ,YAAAooG,EACA,SAAAt5E,EACA,WAAAm4E,EACA,eAAA59B,EACA,cAAAg/B,EACA,UAAA/xF,EACA,qBAAAgyF,EACA,oBAAAppC,CACN,EAAQl/D,EACEkU,EAAU4a,EAAS,SAASm4E,CAAU,EACtC5wF,EAAO,OAAOC,GAAc,UAAYpC,EAAQ,MAAMoC,CAAS,EAC/Dwf,EAAc,CAClB,UAAW,kBAAoB,KAAK,OAAQ,EAE5C,IAAKzf,GAAQA,EAAK,aAAenC,EAAQ,YAEzC,WAAA+yF,EACA,UAAW5wF,EAAOC,EAAY,KAG9B,cAAA+xF,EACA,eAAAh/B,EAEA,SAAAv6C,EAEA,MAAO,KAEP,eAAgB,KAGhB,gBAAiB,KAEjB,SAAU5a,EAAQ,SAElB,SAAUmC,GAAQA,EAAK,UAAYnC,EAAQ,SAE3C,QAAAA,EACA,KAAAmC,EACA,WAAY,EACZ,WAAY,KAAK,YAEjB,oBAAA6oD,EACA,YAAAkpC,CACD,EACK/C,EAAgB,OAAOiD,EAAyB,IAAcA,EAAuB,KAAK,0BAChGxyE,EAAY,gBAAkB,KAAK,2BAA2B,CAC5D,gBAAiB5hB,EAAQ,SACzB,gBAAiB,KAAK,iBACtB,eAAAm1D,EACA,SAAU,KAAK,UAAW,EAC1B,cAAAg8B,CACN,CAAK,EACD,MAAMkD,EAAmBlrC,GAAgB,KAAK,eAAe,cAAa,CAAE,EAC5E,OAAI,OAAOkrC,GAAqB,WAG9BzyE,EAAY,iBAAmByyE,EAAmB,KAAK,eAAe,qBAAsB,GAE1F,KAAK,eAAe,cAAa,EAAG,SACtCzyE,EAAY,gBAAkBwtE,GAAoB,KAAK,WAGvD,KAAK,aAAY,EAAK,KAAK,eAAe,qBAAsB,EAAE,KAAK,YAAY,GAE9ExtE,CACR,CAID,2BAA2B91B,EAAS,CAClC,OAAOolG,GAA0BplG,CAAO,CAC5C,CAWE,sBAAsBu5F,EAAO,CAa3B,GAZI,KAAK,KAAK,MAAM,OAAQ,GAI5B,CAAC,KAAK,YAAY,SAElB,CAAC,KAAK,UAAU,WAAW,WAMvB,KAAK,IAAG,GAAMA,EAAM,sBAAwB,KAAK,OAAS,IAC5D,OAEF,MAAMp1C,EAAc,KAAK,aAAc,EACjCqkD,EAAoBjP,EAAM,UAC1BhsE,EAAkB,KAAK,gBAAgB,SACvCk7E,EAAuB5nC,GAAS,2BAA2BtzC,EAAiBi7E,EAAmB,KAAK,UAAWjP,EAAM,aAAa,EAIlImP,EAAsBzrC,GAAkB,KAAK,UAAS,EAAI9Y,EAAa,KAAK,KAAK,MAAM,aAAc,CAAA,EAAI,EAG/G,GAAIskD,GAAwBC,EAC1B,OAEF,MAAMC,EAAkB9H,GAAgC,CACtD,KAAM,KAAK,KAAK,UAAU,KAC1B,YAAA18C,EACA,UAAWqkD,EACX,SAAU,KAAK,UAAW,EAC1B,gBAAAj7E,EACA,kBAAmBm7E,EACnB,gBAAiB,KAAK,iBACtB,eAAgB,KAAK,eAC3B,CAAK,EACD,GAAI,CAACC,EACH,OAGF,MAAMC,EADoBH,EAAuBC,EACAC,EAAgB,kBACjE,IAAIE,EAAoB,GAIpBH,GAAuBvsC,KACzB0sC,EAAoB,GAElB,GAACF,EAAgB,UAAYA,EAAgB,SAAS,MAAQ,KAAK,UAAU,KAAOC,EAAuBC,KAM/G,KAAK,UAAYF,EAAgB,SAAS,WAAW,UAAYl6B,GAAO,mBAAqB,EAC7F,KAAK,QAAQ,YAAY,EAC7B,CACE,aAAa34C,EAAa,CACxB,KAAK,QAAQ,YAAY+uE,GAAkB/uE,CAAW,CAAC,EAAE,EACzD,KAAK,sBAAwB,CACjC,CAWE,gBAAgB1iB,EAAO01F,EAAe,CACpC,KAAK,sBAAsBA,EAAc,KAAK,EAC1C,MAAK,eAAeA,EAAc,SAAS,GAG/C,KAAK,QAAQ,UAAU,CAC3B,CACE,iBAAiBA,EAAehT,EAAW,CACzC,KAAM,CACJ,SAAA4Q,EACA,SAAAC,CACN,EAAQ7Q,EACExwB,EAAW,CACf,YAAa4yB,GAAmB,CAC9B,KAAM,KAAK,YACX,QAAS4Q,CACjB,CAAO,EACD,UAAW,CACT,SAAApC,EACA,SAAAC,CACR,CACK,EACD,KAAK,QAAQ,CACX,KAAM,uCACN,SAAArhC,CACN,CAAK,EACD,KAAK,sBAAsBwjC,EAAc,KAAK,EAC1C,MAAK,eAAeA,EAAc,SAAS,IAG3C,KAAK,2BAA2BhT,CAAS,IAG7CA,EAAYA,GAAa,GAIpB+N,GAAa,KAAK,kBAAmB/N,CAAS,IACjD,KAAK,mBAAqB,CACxB,MAAO,GACP,MAAO,EACR,EACD,KAAK,mBAAqBA,EAC1B,KAAK,kBAAoBA,EACzB,KAAK,QAAQ,mBAAoBA,CAAS,EAC1C,KAAK,QAAQ,WAAW,GAItB,MAAK,eAAegT,EAAc,SAAS,IAK/C,KAAK,gBAAgB,UAAYhT,EAE7B,KAAK,0BACP,KAAK,kBAAmB,IAE9B,CACE,kBAAkBgT,EAAe9sF,EAAW+sF,EAAU10E,EAAM,CAE1D,GADA,KAAK,sBAAsBy0E,EAAc,KAAK,EAC1C,KAAK,eAAeA,EAAc,SAAS,EAC7C,OAEF,MAAMhzE,EAAc,KAAK,gBACnBkzE,EAAqB7D,GAA2BnpF,CAAS,EAC/D8Z,EAAYkzE,CAAkB,EAAIlzE,EAAYkzE,CAAkB,GAAK,CAAE,EACvElzE,EAAYkzE,CAAkB,EAAED,CAAQ,EAAI10E,EAC5C,KAAK,QAAQ,eAAerY,CAAS,MAAM+sF,CAAQ,MAAM10E,CAAI,EAAE,EAE3D,KAAK,0BACP,KAAK,kBAAmB,CAE9B,CACE,gBAAgBy0E,EAAeG,EAAa,CAE1C,GADA,KAAK,sBAAsBH,EAAc,KAAK,EAC1C,KAAK,eAAeA,EAAc,SAAS,EAC7C,OAIF,GAAIG,EAAY,SAAW,EAAG,CAC5B,KAAK,QAAQ,yDAAyD,EACtE,MACN,CAII,GAAI,CAHgB,KAAK,gBAGR,iBAAkB,CACjC,KAAK,eAAe,QAAQ,KAAK,KAAK,gBAAgB,KAAK,KAAMH,EAAeG,CAAW,CAAC,EAC5F,MACN,CACI,MAAM5S,EAAkB,KAAK,eAAe,qBAAsB,IAAK,KAAO,KAAK,eAAe,qBAAsB,EAAG,KAAK,eAAe,qBAAsB,EAC/J6S,EAAgB,CAAA,EAEtBD,EAAY,QAAQ9e,GAAW,CAG7B+e,EAAc/e,EAAQ,MAAM,EAAI+e,EAAc/e,EAAQ,MAAM,GAAK,CAE/D,UAAW,IACX,SAAU,CAAE,EAEZ,QAAS,CACV,EACD,MAAMgf,EAAeD,EAAc/e,EAAQ,MAAM,EACjDgf,EAAa,UAAY,KAAK,IAAIA,EAAa,UAAWhf,EAAQ,UAAYkM,CAAe,EAC7F8S,EAAa,QAAU,KAAK,IAAIA,EAAa,QAAShf,EAAQ,QAAUkM,CAAe,EACvF8S,EAAa,SAAS,KAAKhf,CAAO,CACxC,CAAK,EACD,OAAO,KAAK+e,CAAa,EAAE,QAAQE,GAAa,CAC9C,KAAM,CACJ,UAAAz7F,EACA,QAAAC,EACA,SAAAomB,CACR,EAAUk1E,EAAcE,CAAS,EACrBxH,EAAmB,KAAK,kBAC9B,KAAK,QAAQ,oBAAoBj0F,CAAS,OAAOC,CAAO,QAAQw7F,CAAS,EAAE,EAC3EzH,GAA+BC,EAAkB,KAAK,KAAK,MAAOwH,CAAS,EAK3ElG,GAAoBv1F,EAAWC,EAASg0F,EAAiBwH,CAAS,CAAC,EACnEpH,GAAe,CACb,aAAchuE,EACd,iBAAA4tE,EACA,gBAAAvL,CACR,CAAO,CACP,CAAK,EAGG,KAAK,aACP,KAAK,YAAY,YAAY,CAC3B,OAAQ,wBAChB,CAAO,CAEP,CACE,WAAWyS,EAAe7S,EAAWmF,EAAc,CAEjD,GADA,KAAK,sBAAsB0N,EAAc,KAAK,EAC1C,KAAK,eAAeA,EAAc,SAAS,EAC7C,OAIF,GAAI,CAFgB,KAAK,gBAER,iBAAkB,CACjC,KAAK,eAAe,IAAI,KAAK,KAAK,WAAW,KAAK,KAAMA,EAAe7S,EAAWmF,CAAY,CAAC,EAC/F,MACN,CACI,KAAK,uBAAuBA,EAAcnF,EAAW,KAAK,UAAS,CAAE,CACzE,CACE,uBAAwB,CACtB,KAAK,eAAe,IAAI,QAAQ/3F,GAAMA,EAAE,CAAE,EAC1C,KAAK,eAAe,QAAQ,QAAQA,GAAMA,EAAE,CAAE,EAC9C,KAAK,eAAe,IAAM,CAAE,EAC5B,KAAK,eAAe,QAAU,CAAE,CACpC,CACE,mBAAoB,CAClB,MAAMmrG,EAAY,KAAK,WAIvB,KAAK,WAAa,CAAE,EACpBA,EAAU,QAAQC,GAAOA,GAAK,CAClC,CACE,mBAAoB,CAClB,MAAMC,EAAY,KAAK,WAIvB,KAAK,WAAa,CAAE,EACpBA,EAAU,QAAQD,GAAOA,GAAK,CAClC,CAQE,sBAAuB,CAGrB,GAAI,KAAK,cAAgB,QACvB,MAAO,GAET,MAAMxzE,EAAc,KAAK,gBAGzB,OAAKA,EAOA,KAAK,uBAmBV,CAAAwvE,GAA4B,CAC1B,yBAA0B,KAAK,0BAC/B,gBAAiB,KAAK,iBACtB,gBAAiBxvE,EAAY,SAC7B,WAAY,KAAK,YACjB,cAAe,KAAK,cAC1B,CAAK,EAxBQ,GAPA,EAmCb,CACE,qBAAqBA,EAAc,KAAK,gBAAiB,CACvD,OAAOA,GAAeA,EAAY,WAAa,KAAK,iBACxD,CACE,cAAcA,EAAc,KAAK,gBAAiB,CAChD,OAAO,KAAK,qBAAqBA,CAAW,GAAK,KAAK,kBAC1D,CACE,2BAA4B,CAC1B,OAAO,KAAK,gBAAkB,KAAK,gBAAgB,SAAW,IAClE,CACE,wBAAyB,CAMvB,GALI,CAAC,KAAK,eAAe,SAKrB,KAAK,kBAAoB,KAAK,gCAChC,MAAO,GAET,MAAMA,EAAc,KAAK,gBACnBggE,EAAY,KAAK,uBAIvB,GAAI,CAAChgE,GAAe,CAACggE,EACnB,MAAO,GAET,KAAM,CACJ,SAAA4Q,EACA,SAAAC,EACA,QAAA7L,CACN,EAAQhF,EAQJ,MAPI,EAAA6Q,GAAY,CAAC7wE,EAAY,iBAIzB4wE,GAAY,CAAC,KAAK,gBAAkB,CAAC5L,GAAW,CAAChlE,EAAY,iBAG7DwvE,GAA4B,CAC9B,yBAA0B,KAAK,0BAC/B,gBAAiB,KAAK,iBACtB,gBAAiBxvE,EAAY,SAC7B,WAAY,KAAK,YACjB,cAAe,KAAK,cAC1B,CAAK,EAIL,CACE,YAAYgzE,EAAelnG,EAAQ,CAEjC,GADA,KAAK,sBAAsBknG,EAAc,KAAK,EAC1C,KAAK,eAAeA,EAAc,SAAS,EAC7C,OAIF,GAAI,KAAK,WAAW,QAAU,CAAC,KAAK,uBAAsB,EAAI,CAC5D,KAAK,WAAW,KAAK,KAAK,YAAY,KAAK,KAAMA,EAAelnG,CAAM,CAAC,EACvE,MACN,CACI,MAAMk0B,EAAc,KAAK,gBAUzB,GARA,KAAK,gBAAgBA,EAAY,QAAQ,EAEzC,KAAK,0BAA0BA,EAAY,MAAQA,EAAY,OAAO,EAMlE,KAAK,aAAa,aAAe,SAgBrC,IAXIgzE,EAAc,MAChBA,EAAc,IAAM,KAAK,kBAAkBA,EAAc,IAAK,EAAI,EAElEhzE,EAAY,QAAQ,IAAMgzE,EAAc,KAGtCA,EAAc,KAChB,KAAK,WAAWA,EAAc,IAAK,EAAI,EAEzChzE,EAAY,OAASgzE,EAAc,OACnChzE,EAAY,WAAaA,EAAY,YAAc,CAAE,EACjDA,EAAY,OACd,KAAK,QAAQ,MAAM,EACnBA,EAAY,WAAW,MAAQA,EAAYqvE,GAA2BvjG,EAAO,IAAI,CAAC,EAAE,UAC/E,CACL,MAAMk0F,EAAY,KAAK,qBAAsB,EACvC0T,EAAqB,KAAK,cAAgB,QAAU1T,GAAaA,EAAU,SACjF,IAAI2T,EACAD,IACFC,EAA6B3zE,EAAY,gBAAgB,OAK3DA,EAAY,WAAW,MAAQ,KAAK,kBAAkB,CACpD,aAAcA,EAAY,WAAW,MACrC,SAAUA,EAAY,SACtB,WAAYA,EAAY,WACxB,4BAA6B,KAAK,eAAe,qBAAsB,EACvE,mBAAA0zE,EACA,2BAAAC,EACA,gBAAiB3zE,EAAY,gBAC7B,gBAAiBA,EAAY,eACrC,CAAO,CACF,CAWD,GAPA,KAAK,8BAA8BA,EAAal0B,EAAO,IAAI,EAI3D,KAAK,mCAAmCk0B,CAAW,EAG/CA,EAAY,cAAe,CAI7B,KAAK,qBAAqBA,CAAW,EACrC,KAAK,gBAAgB,sBAAsB,CACzC,YAAAA,EACA,0BAA2B,KAAK,cAAgB,MACxD,CAAO,EACD,MAAMnU,EAAO,KAAK,qBAGlB,GAAIA,EAAK,aAAemU,EAAY,YAAcnU,EAAK,YAAcmU,EAAY,UAAW,CAC1F,KAAK,QAAQ,2CAA2C,EACxD,MACD,CAED,KAAK,QAAQ,qCAAqC,CACnD,CAKDA,EAAY,iBAAmB,GAE/B,KAAK,sBAAuB,EAC5B,KAAK,YAAYA,EAAal0B,CAAM,EACxC,CACE,8BAA8Bk0B,EAAa72B,EAAM,CAE3C,KAAK,cAAgB,QAAU,OAAO62B,EAAY,iBAAoB,UAG1E,CAACA,EAAY,yBAGX,KAAK,mBAAqB,CACxB,MAAO,GACP,MAAO,EACR,GAEC,KAAK,2BAA2B72B,CAAI,IAAM62B,EAAY,WAGxD,KAAK,mBAAmB72B,CAAI,EAAI,GAEtC,CACE,8BAA8B,CAC5B,KAAAA,EACA,YAAA0vB,EACA,IAAAxa,EACA,SAAA2a,CACJ,EAAK,CAMD,GAAI3a,EAAK,CACP,MAAM0P,EAAK6kD,GAAcv0D,CAAG,EAC5B,GAAI,KAAK,uBAAyB0P,EAEhC,OAAO,KAMT8K,EAAc,KAAK,kBAAkBxa,EAAK,EAAI,EAAE,MAChD,KAAK,qBAAuB0P,CAC7B,CAMD,OAAI8K,GAAe,KAAK,mBAAmB1vB,CAAI,GAI7C,KAAK,2BAA2BA,CAAI,EAAI6vB,EAExC,KAAK,mBAAmB7vB,CAAI,EAAI,GAGhC,KAAK,qBAAuB,KACrB0vB,GAEF,IACX,CACE,0BAA0B,CACxB,YAAAmH,EACA,KAAA72B,EACA,MAAAwa,CACD,EAAE/b,EAAO,CACR,MAAMgsG,EAAgB,KAAK,eAAe,cAAe,EACnDC,EAAgB,KAAK,eAAe,cAAa,EAInDD,EAAc,OAAS,GACzB,KAAK,QAAQ,0DAA4DxsC,GAAkBwsC,CAAa,EAAE,KAAK,IAAI,CAAC,EAElHC,EAAc,OAAS,GACzB,KAAK,QAAQ,0DAA4DzsC,GAAkBysC,CAAa,EAAE,KAAK,IAAI,CAAC,EAEtH,MAAMC,EAAmBF,EAAc,OAASA,EAAc,MAAM,CAAC,EAAI,EACnEG,EAAiBH,EAAc,OAASA,EAAc,IAAIA,EAAc,OAAS,CAAC,EAAI,EACtFI,EAAmBH,EAAc,OAASA,EAAc,MAAM,CAAC,EAAI,EACnEI,EAAiBJ,EAAc,OAASA,EAAc,IAAIA,EAAc,OAAS,CAAC,EAAI,EAC5F,GAAIE,EAAiBD,GAAoBzF,IAAmB4F,EAAiBD,GAAoB3F,GAAiB,CAKhH,KAAK,QAAQ,mHAA6H1qF,EAAM,UAAU,mBAAwByjD,GAAkBwsC,CAAa,EAAE,KAAK,IAAI,CAAC,mBAAwBxsC,GAAkBysC,CAAa,EAAE,KAAK,IAAI,CAAC,IAAI,EACpS,KAAK,MAAM,CACT,QAAS,kEACT,aAAc,GACtB,CAAO,EACD,KAAK,QAAQ,OAAO,EACpB,MACD,CAaD,KAAK,iBAAmB,GACxB,KAAK,WAAW,KAAK,KAAK,sBAAsB,KAAK,KAAM,CACzD,YAAA7zE,EACA,KAAA72B,EACA,MAAAwa,CACN,CAAK,CAAC,EAIF,MAAMuwF,EAHc,KAAK,eAGe7F,GACxC,KAAK,QAAQ,yDAAyD6F,CAAiB,EAAE,EACzF,KAAK,OAAO,EAAGA,EAAmB,IAAM,CACtC,KAAK,QAAQ,6CAA6C7F,EAAe,GAAG,EAC5E,KAAK,iBAAmB,GAGxB,KAAK,gCAAkCzjE,EAAS,WAAW,IAAM,CAC/D,KAAK,QAAQ,iDAAiD,EAC9D,KAAK,gCAAkC,KACvC,KAAK,kBAAmB,CAChC,EAASyjE,GAAkB,GAAI,CAC1B,EAAE,EAAI,CACX,CACE,mBAAmB,CACjB,YAAAruE,EACA,KAAA72B,EACA,MAAAwa,CACD,EAAE/b,EAAO,CAER,GAAKA,EAGL,IAAIA,EAAM,OAAS6kE,GAAoB,CACrC,KAAK,0BAA0B,CAC7B,YAAAzsC,EACA,KAAA72B,EACA,MAAAwa,CACR,CAAO,EAGD,MACN,CACI,KAAK,QAAQ,4CAA6C/b,CAAK,EAM/D,KAAK,MAAM,CACT,QAAS,GAAGuB,CAAI,cAAcwa,EAAM,MAAM,yBAA8Bqc,EAAY,UAAU,gBAAgBA,EAAY,SAAS,EAAE,GACrI,SAAU,CACR,UAAW8kC,EAAQ,MAAM,8BACjC,CACA,CAAK,EACD,KAAK,QAAQ,aAAa,EAC9B,CACE,sBAAsB,CACpB,YAAA9kC,EACA,KAAA72B,EACA,YAAA0vB,EACA,KAAAljB,EACA,MAAAgO,CACJ,EAAK,CAED,GAAI,CAACA,EAAO,CACV,MAAM6U,EAAW,CAAC7iB,CAAI,EACtB,IAAIm+E,EAAan+E,EAAK,WAClBkjB,IAGFL,EAAS,QAAQK,CAAW,EAC5Bi7D,GAAcj7D,EAAY,YAI5BlV,EAAQ8nF,GAAe,CACrB,MAAO3X,EACP,SAAAt7D,CACR,CAAO,CACP,CACI,MAAMg3C,EAAW,CACf,YAAa4yB,GAAmB,CAC9B,KAAM,KAAK,YACX,QAASpiE,CACV,CAAA,CACF,EACD,KAAK,QAAQ,CACX,KAAM,qBACN,SAAAwvC,CACN,CAAK,EACD,KAAK,eAAe,aAAa,CAC/B,YAAAxvC,EACA,KAAA72B,EACA,MAAAwa,CACD,EAAE,KAAK,mBAAmB,KAAK,KAAM,CACpC,YAAAqc,EACA,KAAA72B,EACA,MAAAwa,CACN,CAAK,CAAC,CACN,CACE,yBAAyBxa,EAAMwnG,EAAWwD,EAAmB,CAC3D,GAAI,CAAC,KAAK,iBAAmBxD,IAAc,KAAK,gBAAgB,UAC9D,OAEF,MAAMvyF,EAAU,KAAK,gBAAgB,QAC/B80F,EAAqB,GAAG/pG,CAAI,aAC7BiV,EAAQ80F,CAAkB,IAC7B90F,EAAQ80F,CAAkB,EAAI,CAAE,GAElC90F,EAAQ80F,CAAkB,EAAE,2BAA6BiB,EAAkB,0BAA4B,EACvG/1F,EAAQ80F,CAAkB,EAAE,4BAA8BiB,EAAkB,MAAM,aAClF/1F,EAAQ80F,CAAkB,EAAE,sBAAwBiB,EAAkB,MAAM,OAC5E/1F,EAAQ80F,CAAkB,EAAE,0BAA4BiB,EAAkB,IAAI,aAC9E/1F,EAAQ80F,CAAkB,EAAE,oBAAsBiB,EAAkB,IAAI,OAExE/1F,EAAQ80F,CAAkB,EAAE,oBAAsBiB,EAAkB,mBACxE,CACE,YAAYn0E,EAAal0B,EAAQ,CAC/B,KAAM,CACJ,KAAA3C,EACA,KAAAwM,CACN,EAAQ7J,EAIJ,GAHI,CAAC6J,GAAQ,CAACA,EAAK,YAGfxM,IAAS,SAAW,KAAK,eAC3B,OAEF,MAAM0vB,EAAc,KAAK,8BAA8B,CACrD,KAAA1vB,EACA,YAAa2C,EAAO,YACpB,SAAUk0B,EAAY,SACtB,IAAKA,EAAY,OAASA,EAAY,QAAQ,IAAM,IAC1D,CAAK,EACD,KAAK,sBAAsB,CACzB,YAAAA,EACA,KAAA72B,EACA,YAAA0vB,EACA,KAAAljB,CACN,CAAK,CACL,CAOE,aAAaqqB,EAAa,CAWxB,GAVA,KAAK,MAAQ,UACb,KAAK,gBAAkBA,EACvB,KAAK,gBAAgBA,CAAW,EAC5B,OAAOA,EAAY,iBAAoB,UACrC,KAAK,aACP,KAAK,YAAY,YAAY,CAC3B,OAAQ,qBAClB,CAAS,EAGD,CAAC,KAAK,uBAAwB,CAChC,KAAK,WAAW,KAAK,IAAM,CAGzB,MAAM91B,EAAUpC,GAAS,CAAE,EAAEk4B,EAAa,CACxC,qBAAsB,EAChC,CAAS,EACDl4B,GAASk4B,EAAa,KAAK,qBAAqB91B,CAAO,CAAC,EACxD,KAAK,0BAA4B,GACjC,KAAK,mCAAmC81B,CAAW,CAC3D,CAAO,EACD,MACN,CACI,KAAK,mCAAmCA,CAAW,CACvD,CACE,mCAAmCA,EAAa,CAM1C,KAAK,uCAAuCA,EAAY,eAAe,IACzE,KAAK,WAAW,OAAS,EAEzBA,EAAY,gBAAkB,CAAE,EAChC,KAAK,aAAe,EAEpB,KAAK,YAAY,YAAY,CAC3B,OAAQ,OAChB,CAAO,EACD,KAAK,YAAY,YAAY,CAC3B,OAAQ,qBACR,gBAAiBA,EAAY,eACrC,CAAO,GAEH,MAAMgzE,EAAgB,KAAK,4BAA4BhzE,CAAW,EAC5Do0E,EAAgB,KAAK,eAAep0E,EAAY,WAAYA,EAAY,SAAUA,EAAY,SAAS,EACvGq0E,EAAmB,KAAK,aAAe,KACvCC,EAAkBt0E,EAAY,WAAa,KAAK,kBAGtDA,EAAY,SAAW,EACjB8hE,EAAkBsS,GAAiBC,GAAoBC,EAC7D,KAAK,QAAQ;AAAA,EACf3I,GAA6B3rE,EAAY,GAAG,CAAC;AAAA,EAC7C+uE,GAAkB/uE,CAAW,CAAC,EAAE,EAM1BgzE,EAAc,KAAO,CAACA,EAAc,IAAI,QAC1C,KAAK,QAAQ,gCAAgC,EAC7C,KAAK,mBAAqB,CACxB,MAAO,GACP,MAAO,EACR,GAEHhzE,EAAY,cAAgB6mE,GAAoB,CAC9C,IAAK,KAAK,KAAK,IACf,WAAY,KAAK,YACjB,iBAAkB,KAAK,WACvB,QAASmM,EACT,QAAS,KAAK,aAAa,KAAK,KAAMhzE,CAAW,EACjD,WAAY,KAAK,gBAAgB,KAAK,IAAI,EAC1C,YAAa,KAAK,iBAAiB,KAAK,IAAI,EAC5C,aAAc,KAAK,kBAAkB,KAAK,IAAI,EAC9C,yBAA0B,KAAK,yBAAyB,KAAK,KAAM,QAASA,EAAY,SAAS,EACjG,yBAA0B,KAAK,yBAAyB,KAAK,KAAM,QAASA,EAAY,SAAS,EACjG,WAAY,KAAK,gBAAgB,KAAK,IAAI,EAC1C,gBAAA8hE,EACA,gBAAiB,IAAM,CACrB,KAAK,QAAQ,iCAAiC,CAC/C,EACD,MAAO,KAAK,WAAW,KAAK,IAAI,EAChC,OAAQ,KAAK,YAAY,KAAK,IAAI,EAClC,OAAQ,KAAK,wBAAwB,KAAK,IAAI,EAC9C,gBAAiB,CAAC,CAChB,QAAAtzF,EACA,MAAA+7B,EACA,OAAAmvC,CACR,IAAY,CACJ,KAAK,QAAQ,GAAGq1B,GAAkB/uE,CAAW,CAAC,kCAAkC05C,CAAM,SAASnvC,CAAK,KAAK/7B,CAAO,EAAE,CACnH,EACD,sBAAuB,CAAC,CACtB,KAAArF,EACA,QAAAiV,EACA,QAAA0lF,EACA,UAAA9D,EACA,WAAAH,CACR,IAAY,CAIJ,MAAMrwB,EAAW,CACf,YAJc4yB,GAAmB,CACjC,QAAAhkF,CACV,CAAS,CAGT,EAEY0lF,IACFt0B,EAAS,QAAUs0B,GAEjB9D,IACFxwB,EAAS,UAAYwwB,GAEnBH,IACFrwB,EAAS,WAAaqwB,GAExB,KAAK,QAAQ,CACX,KAAA12F,EACA,SAAAqmE,CACV,CAAS,CACT,CACA,CAAK,CACL,CAUE,gBAAgBxvC,EAAa,CAC3B,MAAMu0E,EAAe3F,GAAuB,KAAK,UAAS,EAAI,KAAK,aAAY,EAAI,KAAK,UAAU,gBAAkB,EAAE,EAMlH2F,EAAe,GACjB,KAAK,OAAO,EAAGA,CAAY,CAEjC,CAWE,4BAA4Bv0E,EAAa,CACvC,MAAM5hB,EAAU4hB,EAAY,QACtBzf,EAAOyf,EAAY,KACnBuwE,EAAcvwE,EAAY,QAAQ,KAAOA,EAAY,QAAQ,KAAOA,EAAY,QAAQ,IAAI,IAC5FwwE,EAAwBxwE,EAAY,QAAQ,KAAO,CAACA,EAAY,QAAQ,IAAI,MAC5EgzE,EAAgB,CACpB,YAAazyF,EAAOA,EAAK,YAAcnC,EAAQ,YAC/C,UAAWmC,EAAOA,EAAK,UAAYnC,EAAQ,UAC3C,UAAW4hB,EAAY,UACvB,WAAYA,EAAY,WACxB,iBAAkBA,EAAY,iBAC9B,gBAAiBA,EAAY,gBAC7B,KAAMA,EAAY,KAClB,KAAM,KAAK,YACX,MAAOA,EAAY,eACnB,SAAUA,EAAY,SACtB,YAAAuwE,EACA,sBAAAC,CACD,EACKgE,EAAkBx0E,EAAY,SAAS,SAASA,EAAY,WAAa,CAAC,EAgBhF,GAfIw0E,GAAmBA,EAAgB,WAAap2F,EAAQ,WAStDo2F,EAAgB,gBAClBxB,EAAc,cAAgBwB,EAAgB,gBAAgB,oBACrDA,EAAgB,kBACzBxB,EAAc,cAAgBwB,EAAgB,gBAAgB,sBAG9Dp2F,EAAQ,IAAK,CAGf,MAAMq2F,EAAKr2F,EAAQ,IAAI,IAAM,IAAI,YAAY,CAAC,EAAG,EAAG,EAAG4hB,EAAY,WAAaA,EAAY,SAAS,aAAa,CAAC,EACnHgzE,EAAc,IAAM,KAAK,WAAW50F,EAAQ,GAAG,EAC/C40F,EAAc,IAAI,GAAKyB,CAC7B,CACI,OAAIr2F,EAAQ,MACV40F,EAAc,IAAM,KAAK,kBAAkB50F,EAAQ,GAAG,GAEjD40F,CACX,CACE,mBAAmBvP,EAAO,CAGxB,KAAK,eAAiB,EAClBA,IACF,KAAK,uBAAyBA,EAAM,cACpC,KAAK,uBAAyBA,EAAM,cAE1C,CACE,2BAA2BpsE,EAAUosE,EAAO,CAK1C,GADA,KAAK,gBAAgB,WAAaA,EAAM,cACpCpsE,EAAWm3E,GAAoC,CACjD,KAAK,QAAQ,wDAAwDn3E,CAAQ,mCAAwCm3E,EAAkC,EAAE,EACzJ,MACN,CACI,MAAMh/B,EAAW,CACf,cAAe,CACb,KAAM,KAAK,UACX,GAAIi0B,EAAM,SAClB,CACA,EAEI,KAAK,QAAQ,CACX,KAAM,mBACN,SAAAj0B,CACN,CAAK,EACD,KAAK,UAAYi0B,EAAM,UACvB,KAAK,UAAYA,EAAM,aAC3B,CACE,gBAAiB,CAGf,KAAK,uBAAyB,EAC9B,KAAK,UAAY,EACjB,KAAK,UAAY,IACjB,KAAK,QAAQ,iBAAiB,EAC9B,KAAK,QAAQ,SAAS,CAC1B,CAQE,wBAAwB77F,EAAOorG,EAAelnG,EAAQ,CAKpD,GAAI,KAAK,WAAW,OAAQ,CAC1B,KAAK,WAAW,KAAK,KAAK,wBAAwB,KAAK,KAAMlE,EAAOorG,EAAelnG,CAAM,CAAC,EAC1F,MACN,CAUI,GATA,KAAK,mBAAmBknG,EAAc,KAAK,EAEvC,CAAC,KAAK,iBAONA,EAAc,YAAc,KAAK,gBAAgB,UACnD,OAGF,GAAIprG,EAAO,CAIT,GAHA,KAAK,gBAAkB,KACvB,KAAK,MAAQ,QAETA,EAAM,OAASu7F,GAAe,QAChC,OAMF,GAJA,KAAK,MAAK,EAINv7F,EAAM,OAASu7F,GAAe,QAAS,CACzC,KAAK,eAAgB,EACrB,MACD,CAGD,KAAK,sBAAwB,EAC7B,KAAK,MAAMv7F,CAAK,EAChB,KAAK,QAAQ,OAAO,EACpB,MACN,CACI,MAAMo4B,EAAc,KAAK,gBAGzB,KAAK,2BAA2BA,EAAY,SAAUgzE,EAAc,KAAK,EACzEhzE,EAAY,iBAAmBgzE,EAAc,iBACzClnG,EAAO,UACT,KAAK,WAAa6hG,GAAgB,KAAK,WAAY7hG,EAAO,QAAS,KAAK,WAAW,GAIrF,KAAK,MAAQ,YAEb,KAAK,QAAQ,WAAW,EACxB,KAAK,0BAA0Bk0B,CAAW,CAC9C,CACE,gBAAgB9G,EAAU,CACxB,MAAMw7E,EAAkB,KAAK,gBAAgB,mBAAmBx7E,CAAQ,EACpEw7E,IAAoB,OACtB,KAAK,aAAeA,EAE1B,CACE,0BAA0Bt2F,EAAS,CAC7B,OAAOA,EAAQ,OAAU,UAAY,OAAOA,EAAQ,KAAQ,SAC9D,KAAK,oBAAsBA,EAAQ,IAAMA,EAAQ,MAEjD,KAAK,oBAAsBA,EAAQ,QAEzC,CACE,uCAAuCmiF,EAAiB,CACtD,OAAIA,IAAoB,KACf,GAIL,KAAK,cAAgB,QAAUA,IAAoB,KAAK,eAAe,wBAGvE,CAAC,KAAK,gBAAkBA,IAAoB,KAAK,eAAe,sBAIxE,CACE,kBAAkB,CAChB,aAAAoU,EACA,SAAA37E,EACA,WAAAm4E,EACA,2BAAAwC,EACA,4BAAAiB,EACA,mBAAAlB,EACA,gBAAAhgC,EACA,gBAAAusB,CACJ,EAAK,CACD,GAAI,OAAO0U,EAAiB,IAE1B,OAAOA,EAET,GAAI,CAACjB,EACH,OAAOzT,EAAgB,MAEzB,MAAMuU,EAAkBx7E,EAAS,SAASm4E,EAAa,CAAC,EAMxD,OAAIA,IAAe,GAAK,CAACqD,GAAmB,OAAOA,EAAgB,MAAU,KAAeA,EAAgB,MAAQb,EAA6BiB,EACxIjB,EAEFjgC,EAAgB,KAC3B,CACE,0BAA0B1zC,EAAa,CACrC,MAAMggE,EAAY,KAAK,qBAAqBhgE,CAAW,EACvD,GAAI,CAACggE,EAAW,CACd,KAAK,MAAM,CACT,QAAS,yEACT,0BAA2B,GACnC,CAAO,EACD,KAAK,QAAQ,OAAO,EACpB,MACD,CAID,KAAM,CACJ,SAAA4Q,EACA,SAAAC,EACA,QAAA7L,CACN,EAAQhF,EACE6U,EAAe,KAAK,cAAgB,QAAUhE,EAC9CiE,EAAe,CAAC,KAAK,gBAAkBlE,GAAY,CAAC5L,EAG1D,GAFAhlE,EAAY,iBAAmB,EAE3B,CAACA,EAAY,iBAAkB,CAC7B,CAACA,EAAY,YAAc,OAAOA,EAAY,iBAAoB,WASpE,KAAK,0BAA4B,IAGnCA,EAAY,WAAa,CACvB,MAAO,CACR,EACDA,EAAY,mBACP,KAAK,4BAER,KAAK,mCAAmCA,CAAW,EAGnD,KAAK,sBAAuB,GAG9B,KAAK,kBAAkBA,CAAW,EAClC,MACD,CAEG60E,GACF70E,EAAY,mBAEV80E,GACF90E,EAAY,mBAEV60E,GACF,KAAK,eAAe,mBAAmB,KAAK,kBAAkB,KAAK,KAAM70E,CAAW,CAAC,EAEnF80E,GACF,KAAK,eAAe,mBAAmB,KAAK,kBAAkB,KAAK,KAAM90E,CAAW,CAAC,CAE3F,CACE,kBAAkBA,EAAa,CACzB,KAAK,eAAeA,EAAY,SAAS,IAG7CA,EAAY,mBACRA,EAAY,mBAAqB,GACnC,KAAK,mBAAoB,EAE/B,CACE,2BAA2BggE,EAAW,CACpC,MAAM+U,EAA0BtG,GAAmB,KAAK,YAAa,KAAK,qBAAsB,EAAEzO,CAAS,EAC3G,OAAI+U,GACF,KAAK,MAAM,CACT,QAASA,EACT,0BAA2B,GACnC,CAAO,EACD,KAAK,QAAQ,OAAO,EACb,IAEF,EACX,CACE,mCAAmC/0E,EAAa,CAC9C,GAAIA,EAAY,kBAAoB,MAGpC,OAAOA,EAAY,WAAW,OAAU,UAExCA,EAAY,wBAEZ,KAAK,cAAgB,OACnB,OAEF,IAAIg1E,EAAY,GAKhBh1E,EAAY,iBAAmB,KAAK,kDAAkD,CACpF,gBAAiBA,EAAY,QAAQ,gBACrC,gBAAiBA,EAAY,QAAQ,gBACrC,WAAYA,EAAY,UAC9B,CAAK,EAIDA,EAAY,uBAAyB,GACjCA,EAAY,kBAAoB,KAAK,eAAe,qBAAoB,IAC1E,KAAK,eAAe,qBAAqBA,EAAY,eAAe,EACpEg1E,EAAY,IAEVh1E,EAAY,kBAAoB,KAAK,eAAe,qBAAoB,IAC1E,KAAK,eAAe,qBAAqBA,EAAY,eAAe,EACpEg1E,EAAY,IAEVA,GACF,KAAK,QAAQ,iBAAiB,CAEpC,CACE,kDAAkD,CAChD,gBAAAthC,EACA,gBAAAusB,EACA,WAAAJ,CACJ,EAAK,CACD,OAAK,KAAK,0BAGNnsB,GAAmB,OAAOA,EAAgB,uBAA0B,SAC/DA,EAAgB,sBAGrBusB,GAAmB,OAAOA,EAAgB,uBAA0B,SAC/DA,EAAgB,sBAGlBJ,EAAW,MAVTA,EAAW,KAWxB,CACE,qBAAqB7/D,EAAa,CAChCA,EAAY,WAAaA,EAAY,YAAc,CAAE,EACrD,MAAMggE,EAAY,KAAK,cAAe,EAEhCiV,EADqB,KAAK,cAAgB,QAAUjV,GAAaA,EAAU,UAC7BhgE,EAAY,gBAAkBA,EAAY,gBAAkBA,EAAY,gBACvHi1E,IAGLj1E,EAAY,WAAW,IAAM,OAAOi1E,EAAsB,KAAQ,SAIlEA,EAAsB,IAAMA,EAAsB,MAAQj1E,EAAY,SAC1E,CASE,oBAAqB,CAEnB,GAAI,KAAK,gBAAiB,CACxB,MAAMwvC,EAAW,CACf,YAAa4yB,GAAmB,CAC9B,KAAM,KAAK,YACX,QAAS,KAAK,eACf,CAAA,CACF,EACD,KAAK,QAAQ,CACX,KAAM,cACN,SAAA5yB,CACR,CAAO,CACP,CACI,GAAI,CAAC,KAAK,gBAAiB,CACzB,KAAK,MAAQ,QAGR,KAAK,UACR,KAAK,eAAgB,EAEvB,MACN,CACI,MAAMxvC,EAAc,KAAK,gBACrBA,EAAY,MAAQA,EAAY,KAAK,SAEvCA,EAAY,KAAK,SAAS,aAAc,EAC/BA,EAAY,QAAQ,UAE7BA,EAAY,QAAQ,SAAS,aAAc,EAK7C,KAAK,qBAAqBA,CAAW,EACjC,KAAK,8BAkBP,KAAK,gBAAgB,sBAAsB,CACzC,YAAAA,EACA,0BAA2B,KAAK,cAAgB,MACxD,CAAO,EAEH,MAAMk1E,EAAyBhF,GAAqClwE,EAAa,KAAK,WAAW,EAWjG,GAVIk1E,IACEA,EAAuB,WAAa,OACtCpwC,EAAQ,IAAI,KAAKowC,EAAuB,OAAO,EAE/C,KAAK,QAAQA,EAAuB,OAAO,GAG/C,KAAK,kBAAkBl1E,CAAW,EAClC,KAAK,gBAAkB,KACvB,KAAK,MAAQ,QACTA,EAAY,gBACd,KAAK,QAAQ,gBAAgB,EAKzB,CAACA,EAAY,kBAAkB,CACjC,KAAK,QAAQ,0CAA0C+uE,GAAkB/uE,CAAW,CAAC,EAAE,EACvF,MACR,CAEI,KAAK,QAAQ,YAAY+uE,GAAkB/uE,CAAW,CAAC,EAAE,EACzD,KAAK,uBAAuBA,CAAW,EACvC,KAAK,eAAiB,GAClB,KAAK,mBAAqBA,EAAY,WACxC,KAAK,0BAA0B,mBAAmB,CAChD,KAAM,KAAK,YACX,KAAM,KAAK,iBACX,GAAIA,EAAY,QACxB,CAAO,EAIG,KAAK,cAAgB,QAAU,CAAC,KAAK,gBACvC,KAAK,0BAA0B,mBAAmB,CAChD,KAAM,QACN,KAAM,KAAK,iBACX,GAAIA,EAAY,QAC1B,CAAS,GAGL,KAAK,iBAAmBA,EAAY,SAKpC,KAAK,QAAQ,gBAAgB,EAC7B,MAAM5hB,EAAU4hB,EAAY,QACtBzf,EAAOyf,EAAY,KACnBm1E,EAAkB/2F,EAAQ,KAAO,KAAK,aAAY,EAAKA,EAAQ,IAAM4hB,EAAY,SAAS,eAAiB,EAC3Go1E,EAAe70F,GAAQA,EAAK,KAAO,KAAK,eAAiBA,EAAK,IAAMyf,EAAY,SAAS,mBAAqB,EAKpH,GAAIm1E,GAAmBC,EAAc,CACnC,KAAK,QAAQ,OAAOD,EAAkB,UAAY,MAAM,IAAIpG,GAAkB/uE,CAAW,CAAC,EAAE,EAC5F,KAAK,gBAAiB,EACtB,MACN,CAC6B,KAAK,aAAe,MAI3C,KAAK,QAAQ,iBAAiB,EAEhC,KAAK,QAAQ,UAAU,EACvB,KAAK,WAAaA,EAAY,WAC9B,KAAK,UAAYA,EAAY,UAIzB,KAAK,eAAeA,EAAY,WAAYA,EAAY,SAAUA,EAAY,SAAS,GACzF,KAAK,YAAa,EAGpB,KAAK,QAAQ,UAAU,EACnBA,EAAY,kBACd,KAAK,eAEF,KAAK,UACR,KAAK,eAAgB,CAE3B,CAWE,kBAAkBA,EAAa,CAC7B,GAAIA,EAAY,SAAWwuE,GAAoC,CAC7D,KAAK,QAAQ,yDAAyDxuE,EAAY,QAAQ,mCAAwCwuE,EAAkC,EAAE,EACtK,MACN,CACI,MAAM76C,EAAO,KAAK,WAAW,KAGvB0hD,EAAwB,KAAK,IAAK,EAAGr1E,EAAY,iBAAmB,EAEpEs1E,EAA8B,KAAK,MAAMt1E,EAAY,WAAaq1E,EAAwB,EAAI,GAAI,EAGxG,KAAK,WAAW,OAASC,EAA8B3hD,GAAQ,EAAE,KAAK,WAAW,KACrF,CAWE,uBAAuB3zB,EAAa,CAClC,GAAI,CAAC,KAAK,sBACR,OAEF,MAAM5hB,EAAU4hB,EAAY,QACtB9Q,EAAQ9Q,EAAQ,MAChB+Q,EAAM/Q,EAAQ,IAEpB,GAAI,CAACmwF,GAAOr/E,CAAK,GAAK,CAACq/E,GAAOp/E,CAAG,EAC/B,OAEFi+E,GAAoBl+E,EAAOC,EAAK,KAAK,qBAAqB,EAC1D,MAAMi9E,EAAMxhE,EAAS,eAAiBA,EAAS,OACzCx/B,EAAQ,CACZ,OAAQgT,EAAQ,OAChB,eAAgBA,EAAQ,eACxB,eAAgBA,EAAQ,eACxB,gBAAiBA,EAAQ,gBACzB,UAAW4hB,EAAY,SAAS,WAAW,UAC3C,WAAYA,EAAY,SAAS,WAAW,WAC5C,OAAQA,EAAY,SAAS,WAAW,OACxC,WAAYA,EAAY,WACxB,IAAKA,EAAY,IACjB,SAAUA,EAAY,SACtB,SAAUA,EAAY,SAAS,GAC/B,MAAA9Q,EACA,IAAAC,CACD,EACKxZ,EAAO,KAAK,UAAUvK,CAAK,EAC3BwE,EAAM,IAAIw8F,EAAIl9E,EAAOC,EAAKxZ,CAAI,EAGpC/F,EAAI,MAAQxE,EACZ,KAAK,sBAAsB,OAAOwE,CAAG,CACzC,CACA,CACA,SAASzD,IAAO,CAAA,CAChB,MAAMopG,GAAc,SAAUltG,EAAQ,CACpC,OAAI,OAAOA,GAAW,SACbA,EAEFA,EAAO,QAAQ,IAAKgvC,GAAKA,EAAE,aAAa,CACjD,EAKMm+D,GAAc,CAAC,QAAS,OAAO,EAC/BC,GAAW,CAACtsG,EAAMusG,IAAkB,CACxC,MAAMC,EAAeD,EAAc,GAAGvsG,CAAI,QAAQ,EAClD,OAAOwsG,GAAgBA,EAAa,UAAYD,EAAc,aAAavsG,CAAI,CACjF,EACMysG,GAAuB,CAACzsG,EAAMy1D,IAAU,CAC5C,QAASj2D,EAAI,EAAGA,EAAIi2D,EAAM,OAAQj2D,IAAK,CACrC,MAAMktG,EAAaj3C,EAAMj2D,CAAC,EAC1B,GAAIktG,EAAW,OAAS,cAGtB,OAAO,KAET,GAAIA,EAAW,OAAS1sG,EACtB,OAAOR,CAEb,CACE,OAAO,IACT,EACMmtG,GAAa,CAAC3sG,EAAMusG,IAAkB,CAC1C,GAAIA,EAAc,MAAM,SAAW,EACjC,OAEF,IAAIK,EAAa,EACbF,EAAaH,EAAc,MAAMK,CAAU,EAC/C,GAAIF,EAAW,OAAS,cAAe,CACjC,CAACH,EAAc,SAAU,GAAIA,EAAc,YAAY,aAAe,WACxEA,EAAc,MAAM,MAAO,EAC3BG,EAAW,OAAOH,CAAa,EAC3BG,EAAW,QACbA,EAAW,OAAQ,EAKrBC,GAAW,QAASJ,CAAa,EACjCI,GAAW,QAASJ,CAAa,GAKnC,MACJ,CACE,GAAIvsG,IAAS,eAUT,GAACusG,EAAc,MAAO,GAAIA,EAAc,YAAY,aAAe,UAAYD,GAAStsG,EAAMusG,CAAa,GAG/G,IAAIG,EAAW,OAAS1sG,EAAM,CAE5B,GADA4sG,EAAaH,GAAqBzsG,EAAMusG,EAAc,KAAK,EACvDK,IAAe,KAIjB,OAEFF,EAAaH,EAAc,MAAMK,CAAU,CAC/C,CAWE,GAVAL,EAAc,MAAM,OAAOK,EAAY,CAAC,EAQxCL,EAAc,aAAavsG,CAAI,EAAI0sG,EACnCA,EAAW,OAAO1sG,EAAMusG,CAAa,EACjC,CAACG,EAAW,OAAQ,CAEtBH,EAAc,aAAavsG,CAAI,EAAI,KACnC2sG,GAAW3sG,EAAMusG,CAAa,EAC9B,MACJ,EACA,EACMM,GAAgB,CAAC7sG,EAAMusG,IAAkB,CAC7C,MAAMj/F,EAASi/F,EAAc,GAAGvsG,CAAI,QAAQ,EACtC8sG,EAAYV,GAAYpsG,CAAI,EAC7BsN,IAGLA,EAAO,oBAAoB,YAAai/F,EAAc,KAAKO,CAAS,YAAY,CAAC,EACjFx/F,EAAO,oBAAoB,QAASi/F,EAAc,KAAKO,CAAS,QAAQ,CAAC,EACzEP,EAAc,OAAOvsG,CAAI,EAAI,KAC7BusG,EAAc,GAAGvsG,CAAI,QAAQ,EAAI,KACnC,EACM+sG,GAAkB,CAACC,EAAaR,IAAiBQ,GAAeR,GAAgB,MAAM,UAAU,QAAQ,KAAKQ,EAAY,cAAeR,CAAY,IAAM,GAC1JS,GAAU,CACd,aAAc,CAACzyF,EAAOqc,EAAaq2E,IAAY,CAACltG,EAAMusG,IAAkB,CACtE,MAAMC,EAAeD,EAAc,GAAGvsG,CAAI,QAAQ,EAGlD,GAAK+sG,GAAgBR,EAAc,YAAaC,CAAY,EAG5D,CAAAD,EAAc,QAAQ,qBAAqB11E,EAAY,UAAU,MAAMrc,EAAM,MAAM,aAAaxa,CAAI,QAAQ,EAC5G,GAAI,CACFwsG,EAAa,aAAahyF,CAAK,CAChC,OAAQ1V,EAAG,CACVynG,EAAc,QAAQ,mBAAmBznG,EAAE,IAAI,KAAOA,EAAE,OAASw+D,GAAqB,wBAA0B,IAAM,0BAA0BzsC,EAAY,UAAU,OAAO72B,CAAI,QAAQ,EACzLusG,EAAc,aAAavsG,CAAI,EAAI,KACnCktG,EAAQpoG,CAAC,CACf,EACG,EACD,OAAQ,CAACihB,EAAOC,IAAQ,CAAChmB,EAAMusG,IAAkB,CAC/C,MAAMC,EAAeD,EAAc,GAAGvsG,CAAI,QAAQ,EAGlD,GAAK+sG,GAAgBR,EAAc,YAAaC,CAAY,EAG5D,CAAAD,EAAc,QAAQ,YAAYxmF,CAAK,OAAOC,CAAG,SAAShmB,CAAI,QAAQ,EACtE,GAAI,CACFwsG,EAAa,OAAOzmF,EAAOC,CAAG,CAC/B,MAAW,CACVumF,EAAc,QAAQ,UAAUxmF,CAAK,OAAOC,CAAG,SAAShmB,CAAI,eAAe,CACjF,EACG,EACD,gBAAiBqc,GAAU,CAACrc,EAAMusG,IAAkB,CAClD,MAAMC,EAAeD,EAAc,GAAGvsG,CAAI,QAAQ,EAG7C+sG,GAAgBR,EAAc,YAAaC,CAAY,IAG5DD,EAAc,QAAQ,WAAWvsG,CAAI,sBAAsBqc,CAAM,EAAE,EACnEmwF,EAAa,gBAAkBnwF,EAChC,EACD,SAAU9a,GAAY,CAACvB,EAAMusG,IAAkB,CAC7ChrG,EAAU,CACX,EACD,YAAa9C,GAAS8tG,GAAiB,CACrC,GAAIA,EAAc,YAAY,aAAe,OAG7C,CAAAA,EAAc,QAAQ,mCAAmC9tG,GAAS,EAAE,GAAG,EACvE,GAAI,CACF8tG,EAAc,YAAY,YAAY9tG,CAAK,CAC5C,OAAQqG,EAAG,CACV62D,EAAQ,IAAI,KAAK,0CAA2C72D,CAAC,CACnE,EACG,EACD,SAAUopB,GAAYq+E,GAAiB,CACrCA,EAAc,QAAQ,mCAAmCr+E,CAAQ,EAAE,EACnE,GAAI,CACFq+E,EAAc,YAAY,SAAWr+E,CACtC,OAAQppB,EAAG,CACV62D,EAAQ,IAAI,KAAK,sCAAuC72D,CAAC,CAC/D,CACG,EACD,MAAO,IAAM,CAAC9E,EAAMusG,IAAkB,CACpC,GAAIA,EAAc,YAAY,aAAe,OAC3C,OAEF,MAAMC,EAAeD,EAAc,GAAGvsG,CAAI,QAAQ,EAGlD,GAAK+sG,GAAgBR,EAAc,YAAaC,CAAY,EAG5D,CAAAD,EAAc,QAAQ,oBAAoBvsG,CAAI,QAAQ,EACtD,GAAI,CACFwsG,EAAa,MAAO,CACrB,OAAQ1nG,EAAG,CACV62D,EAAQ,IAAI,KAAK,sBAAsB37D,CAAI,SAAU8E,CAAC,CAC5D,EACG,EACD,gBAAiB,CAAC9E,EAAMwY,IAAU+zF,GAAiB,CACjD,MAAMO,EAAYV,GAAYpsG,CAAI,EAC5BmtG,EAAOzzF,GAAgBlB,CAAK,EAClC+zF,EAAc,QAAQ,UAAUvsG,CAAI,qBAAqBwY,CAAK,iBAAiB,EAC/E,MAAMg0F,EAAeD,EAAc,YAAY,gBAAgBY,CAAI,EACnEX,EAAa,iBAAiB,YAAaD,EAAc,KAAKO,CAAS,YAAY,CAAC,EACpFN,EAAa,iBAAiB,QAASD,EAAc,KAAKO,CAAS,QAAQ,CAAC,EAC5EP,EAAc,OAAOvsG,CAAI,EAAIwY,EAC7B+zF,EAAc,GAAGvsG,CAAI,QAAQ,EAAIwsG,CAClC,EACD,mBAAoBxsG,GAAQusG,GAAiB,CAC3C,MAAMC,EAAeD,EAAc,GAAGvsG,CAAI,QAAQ,EAIlD,GAHA6sG,GAAc7sG,EAAMusG,CAAa,EAG7B,EAACQ,GAAgBR,EAAc,YAAaC,CAAY,EAG5D,CAAAD,EAAc,QAAQ,YAAYvsG,CAAI,qBAAqBusG,EAAc,OAAOvsG,CAAI,CAAC,mBAAmB,EACxG,GAAI,CACFusG,EAAc,YAAY,mBAAmBC,CAAY,CAC1D,OAAQ1nG,EAAG,CACV62D,EAAQ,IAAI,KAAK,gCAAgC37D,CAAI,SAAU8E,CAAC,CACtE,EACG,EACD,WAAY0T,GAAS,CAACxY,EAAMusG,IAAkB,CAC5C,MAAMC,EAAeD,EAAc,GAAGvsG,CAAI,QAAQ,EAC5CmtG,EAAOzzF,GAAgBlB,CAAK,EAGlC,GAAI,CAACu0F,GAAgBR,EAAc,YAAaC,CAAY,EAC1D,OAKF,MAAMY,EAAe50F,EAAM,UAAU,EAAGA,EAAM,QAAQ,GAAG,CAAC,EACpD60F,EAAWd,EAAc,OAAOvsG,CAAI,EAE1C,GADqBqtG,EAAS,UAAU,EAAGA,EAAS,QAAQ,GAAG,CAAC,IAC3CD,EACnB,OAEF,MAAM/mC,EAAW,CACf,iBAAkB,CAChB,KAAMgnC,EACN,GAAI70F,CACZ,CACK,EACD+zF,EAAc,QAAQ,CACpB,KAAM,eACN,SAAAlmC,CACN,CAAK,EACDkmC,EAAc,QAAQ,YAAYvsG,CAAI,qBAAqBqtG,CAAQ,OAAO70F,CAAK,EAAE,EAEjF,GAAI,CACFg0F,EAAa,WAAWW,CAAI,EAC5BZ,EAAc,OAAOvsG,CAAI,EAAIwY,CAC9B,OAAQ1T,EAAG,CACVuhE,EAAS,UAAY1K,EAAQ,MAAM,2BACnC0K,EAAS,MAAQvhE,EACjBA,EAAE,SAAWuhE,EACbkmC,EAAc,OAASznG,EACvBynG,EAAc,QAAQ,OAAO,EAC7B5wC,EAAQ,IAAI,KAAK,2BAA2B37D,CAAI,SAAU8E,CAAC,CACjE,CACA,CACA,EACMwoG,GAAY,CAAC,CACjB,KAAAttG,EACA,cAAAusG,EACA,OAAA5uD,EACA,OAAAg+C,EACA,KAAAzzF,CACF,IAAM,CACJqkG,EAAc,MAAM,KAAK,CACvB,KAAAvsG,EACA,OAAA29C,EACA,OAAAg+C,EACA,KAAAzzF,CACJ,CAAG,EACDykG,GAAW3sG,EAAMusG,CAAa,CAChC,EACMgB,GAAc,CAACvtG,EAAMusG,IAAkBznG,GAAK,CAOhD,MAAM0oG,EAAwBjB,EAAc,GAAGvsG,CAAI,UAAU,EAAG,EAC1DytG,EAAoBzwC,GAAuBwwC,CAAqB,EAEtE,GADAjB,EAAc,QAAQ,kCAAkCvsG,CAAI,mBAAoBytG,CAAiB,EAC7FlB,EAAc,aAAavsG,CAAI,EAAG,CACpC,MAAM27F,EAAS4Q,EAAc,aAAavsG,CAAI,EAAE,OAChDusG,EAAc,aAAavsG,CAAI,EAAI,KAC/B27F,GAEFA,EAAO4Q,EAAc,GAAGvsG,CAAI,QAAQ,CAAC,CAE3C,CACE2sG,GAAW3sG,EAAMusG,CAAa,CAChC,EAYA,MAAMmB,WAAsB/xC,EAAQ,WAAY,CAC9C,YAAYqxC,EAAa,CACvB,MAAO,EACP,KAAK,YAAcA,EACnB,KAAK,oBAAsB,IAAML,GAAW,cAAe,IAAI,EAC/D,KAAK,YAAY,iBAAiB,aAAc,KAAK,mBAAmB,EACxE,KAAK,QAAU7vC,GAAO,eAAe,EAErC,KAAK,sBAAwB,EAC7B,KAAK,sBAAwB,EAC7B,KAAK,MAAQ,CAAE,EACf,KAAK,aAAe,CAClB,MAAO,KACP,MAAO,IACR,EACD,KAAK,yBAA2B,CAAE,EAClC,KAAK,mBAAqB,GAC1B,KAAK,OAAS,CAAE,EAChB,KAAK,kBAAoBywC,GAAY,QAAS,IAAI,EAClD,KAAK,kBAAoBA,GAAY,QAAS,IAAI,EAClD,KAAK,cAAgBzoG,GAAK,CAExB,KAAK,YAAcA,CACpB,EACD,KAAK,cAAgBA,GAAK,CAExB,KAAK,YAAcA,CACpB,EACD,KAAK,sBAAwB,GAC7B,KAAK,gBAAkB,GACvB,KAAK,gBAAkB,EAC3B,CACE,gBAAiB,CACf,KAAK,gBAAkB,GACvB,KAAK,aAAc,CACvB,CACE,yBAA0B,CAGxB,OAAO,KAAK,qBAChB,CACE,sBAAuB,CACrB,OAAO,KAAK,eAChB,CACE,OAAQ,CACN,OAAO,KAAK,2BAA6B,KAAK,qBAAsB,CACxE,CACE,oBAAoBkU,EAAQ,CACtB,KAAK,4BAMT,KAAK,yBAAyBA,CAAM,EACpC,KAAK,sBAAwB,GAC7B,KAAK,QAAQ,sBAAsB,EACnC,KAAK,aAAc,EACvB,CACE,cAAe,CAOT,KAAK,MAAK,GAAM,CAAC,KAAK,kBACxB,KAAK,gBAAkB,GACvB,KAAK,QAAQ,OAAO,EAE1B,CAWE,gBAAgBhZ,EAAMwY,EAAO,CAC3B80F,GAAU,CACR,KAAM,cACN,cAAe,KACf,OAAQL,GAAQ,gBAAgBjtG,EAAMwY,CAAK,EAC3C,KAAM,iBACZ,CAAK,CACL,CAQE,MAAMxY,EAAM,CACVstG,GAAU,CACR,KAAAttG,EACA,cAAe,KACf,OAAQitG,GAAQ,MAAMjtG,CAAI,EAC1B,KAAM,OACZ,CAAK,CACL,CASE,mBAAmBA,EAAM,CACvB,GAAI,CAAC,KAAK,wBAAyB,CACjC27D,EAAQ,IAAI,MAAM,sCAAsC,EACxD,MACN,CACI2xC,GAAU,CACR,KAAM,cACN,cAAe,KACf,OAAQL,GAAQ,mBAAmBjtG,CAAI,EACvC,KAAM,oBACZ,CAAK,CACL,CASE,uBAAwB,CAGtB,MAAO,CAAC27D,EAAQ,QAAQ,YAAcl6B,EAAS,aAAeA,EAAS,YAAY,WAAa,OAAOA,EAAS,YAAY,UAAU,oBAAuB,UACjK,CASE,OAAO,eAAgB,CACrB,OAAOA,EAAS,cAAgBA,EAAS,aAAa,WAAa,OAAOA,EAAS,aAAa,UAAU,YAAe,UAC7H,CASE,eAAgB,CACd,OAAO,KAAK,YAAY,cAAe,CAC3C,CAWE,WAAWzhC,EAAMwY,EAAO,CACtB,GAAI,CAAC,KAAK,gBAAiB,CACzBmjD,EAAQ,IAAI,MAAM,8BAA8B,EAChD,MACN,CACI2xC,GAAU,CACR,KAAAttG,EACA,cAAe,KACf,OAAQitG,GAAQ,WAAWz0F,CAAK,EAChC,KAAM,YACZ,CAAK,CACL,CASE,yBAAyBQ,EAAQ,CAC/B,GAAI,CAACA,GAAU,OAAOA,GAAW,UAAY,OAAO,KAAKA,CAAM,EAAE,SAAW,EAC1E,MAAM,IAAI,MAAM,qDAAqD,EAEvE,OAAO,KAAKA,CAAM,EAAE,QAAQhZ,GAAQ,CAClC,MAAMwY,EAAQQ,EAAOhZ,CAAI,EACzB,GAAI,CAAC,KAAK,0BACR,OAAO,KAAK,gBAAgBA,EAAMwY,CAAK,EAErC,KAAK,iBACP,KAAK,WAAWxY,EAAMwY,CAAK,CAEnC,CAAK,CACL,CASE,aAAazX,EAAS46F,EAAQ,CAC5B,KAAM,CACJ,YAAA9kE,EACA,KAAA72B,EACA,MAAAwa,CACN,EAAQzZ,EAEJ,GADA,KAAK,iBAAmB,GACpBf,IAAS,SAAW,KAAK,aAAe,CAAC,KAAK,mBAAoB,CACpE,KAAK,yBAAyB,KAAK,CAACe,EAAS46F,CAAM,CAAC,EACpD,KAAK,QAAQ,2BAA2BnhF,EAAM,MAAM,qBAAqB,EACzE,MACD,CAKD,MAAM0yF,EAAUvR,EAUhB,GATA2R,GAAU,CACR,KAAAttG,EACA,cAAe,KACf,OAAQitG,GAAQ,aAAazyF,EAAOqc,GAAe,CACjD,WAAY,EACb,EAAEq2E,CAAO,EACV,OAAAvR,EACA,KAAM,cACZ,CAAK,EACG37F,IAAS,QAAS,CAEpB,GADA,KAAK,mBAAqB,GACtB,CAAC,KAAK,yBAAyB,OACjC,OAEF,MAAMy1D,EAAQ,KAAK,yBAAyB,MAAO,EACnD,KAAK,QAAQ,yBAAyBA,EAAM,MAAM,gBAAgB,EAClE,KAAK,yBAAyB,OAAS,EACvCA,EAAM,QAAQk4C,GAAO,CACnB,KAAK,aAAa,MAAM,KAAMA,CAAG,CACzC,CAAO,CACP,CACA,CAQE,eAAgB,CAGd,OAAKZ,GAAgB,KAAK,YAAa,KAAK,WAAW,GAGhD,KAAK,YAAY,SAAW,KAAK,YAAY,SAF3ChwC,GAAkB,CAG/B,CAQE,eAAgB,CAGd,OAAKgwC,GAAgB,KAAK,YAAa,KAAK,WAAW,GAGhD,KAAK,YAAY,SAAW,KAAK,YAAY,SAF3ChwC,GAAkB,CAG/B,CAQE,UAAW,CACT,MAAMlL,EAAQk7C,GAAgB,KAAK,YAAa,KAAK,WAAW,EAAI,KAAK,YAAc,KACjFprB,EAAQorB,GAAgB,KAAK,YAAa,KAAK,WAAW,EAAI,KAAK,YAAc,KACvF,OAAIprB,GAAS,CAAC9vB,EACL,KAAK,cAAe,EAEzBA,GAAS,CAAC8vB,EACL,KAAK,cAAe,EAEtBlkB,GAAmB,KAAK,cAAe,EAAE,KAAK,cAAa,CAAE,CACxE,CAWE,YAAYvvC,EAAUytE,EAAS34F,GAAM,CAKnCsqG,GAAU,CACR,KAAM,cACN,cAAe,KACf,OAAQL,GAAQ,SAAS/+E,CAAQ,EACjC,KAAM,WACN,OAAAytE,CACN,CAAK,CACL,CAYE,YAAYl9F,EAAQ,KAAMk9F,EAAS34F,GAAM,CACnC,OAAOvE,GAAU,WACnBA,EAAQ,QAMV6uG,GAAU,CACR,KAAM,cACN,cAAe,KACf,OAAQL,GAAQ,YAAYxuG,CAAK,EACjC,KAAM,cACN,OAAAk9F,CACN,CAAK,CACL,CAWE,YAAY51E,EAAOC,EAAK0oD,EAAO1rE,GAAM,CACnC,GAAI,CAAC,KAAK,cAAe,EAAC,QAAU,KAAK,cAAa,EAAG,IAAI,CAAC,IAAM,EAAG,CACrE0rE,EAAM,EACN,MACN,CACI4+B,GAAU,CACR,KAAM,QACN,cAAe,KACf,OAAQL,GAAQ,OAAOlnF,EAAOC,CAAG,EACjC,OAAQ0oD,EACR,KAAM,QACZ,CAAK,CACL,CAWE,YAAY3oD,EAAOC,EAAK0oD,EAAO1rE,GAAM,CACnC,GAAI,CAAC,KAAK,cAAe,EAAC,QAAU,KAAK,cAAa,EAAG,IAAI,CAAC,IAAM,EAAG,CACrE0rE,EAAM,EACN,MACN,CACI4+B,GAAU,CACR,KAAM,QACN,cAAe,KACf,OAAQL,GAAQ,OAAOlnF,EAAOC,CAAG,EACjC,OAAQ0oD,EACR,KAAM,QACZ,CAAK,CACL,CAOE,UAAW,CAET,MAAI,GAAA49B,GAAS,QAAS,IAAI,GAAKA,GAAS,QAAS,IAAI,EAIzD,CAOE,qBAAqBjwF,EAAQ,CAC3B,OAAI,OAAOA,EAAW,KAAe,KAAK,aAE1C,KAAK,wBAA0BA,IAC7BixF,GAAU,CACR,KAAM,QACN,cAAe,KACf,OAAQL,GAAQ,gBAAgB5wF,CAAM,EACtC,KAAM,iBACd,CAAO,EACD,KAAK,sBAAwBA,GAExB,KAAK,qBAChB,CAOE,qBAAqBA,EAAQ,CAC3B,OAAI,OAAOA,EAAW,KAAe,KAAK,aAE1C,KAAK,uBAAyBA,IAC5BixF,GAAU,CACR,KAAM,QACN,cAAe,KACf,OAAQL,GAAQ,gBAAgB5wF,CAAM,EACtC,KAAM,iBACd,CAAO,EACD,KAAK,sBAAwBA,GAExB,KAAK,qBAChB,CASE,mBAAmB9a,EAAU,CACtB,KAAK,aAGV+rG,GAAU,CACR,KAAM,QACN,cAAe,KACf,OAAQL,GAAQ,SAAS1rG,CAAQ,EACjC,KAAM,UACZ,CAAK,CACL,CASE,mBAAmBA,EAAU,CACtB,KAAK,aAGV+rG,GAAU,CACR,KAAM,QACN,cAAe,KACf,OAAQL,GAAQ,SAAS1rG,CAAQ,EACjC,KAAM,UACZ,CAAK,CACL,CAKE,SAAU,CACR,KAAK,QAAQ,SAAS,EACtB8qG,GAAY,QAAQrsG,GAAQ,CAC1B,KAAK,MAAMA,CAAI,EACX,KAAK,wBACP,KAAK,mBAAmBA,CAAI,EAE5B,KAAK,GAAGA,CAAI,eAAe,EAAE,IAAM6sG,GAAc7sG,EAAM,IAAI,CAAC,CAEpE,CAAK,EACD,KAAK,mBAAqB,GAC1B,KAAK,yBAAyB,OAAS,EACnC,KAAK,qBACP,KAAK,YAAY,oBAAoB,aAAc,KAAK,mBAAmB,EAE7E,KAAK,IAAK,CACd,CACA,CACA,MAAM4tG,GAAcC,GAAa,mBAAmB,OAAO,OAAO,aAAa,MAAM,KAAMA,CAAS,CAAC,CAAC,EAChGC,GAAoBxgG,GAAU,CAClC,MAAMygG,EAAc,IAAI,WAAWzgG,CAAM,EACzC,OAAO,MAAM,KAAKygG,CAAW,EAAE,IAAI7yF,GAAQA,EAAK,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAAE,KAAK,EAAE,CACxF,EAKM8yF,GAAuB,IAAI,WAAW;AAAA;AAAA,EAAO,MAAM,EAAE,EAAE,IAAI9xB,GAAQA,EAAK,WAAW,CAAC,CAAC,CAAC,EAC5F,MAAM+xB,WAAqB,KAAM,CAC/B,aAAc,CACZ,MAAM,wFAAwF,CAClG,CACA,CASA,MAAMC,WAAyB5G,EAAc,CAC3C,YAAYvgG,EAAUhG,EAAU,GAAI,CAClC,MAAMgG,EAAUhG,CAAO,EAGvB,KAAK,aAAe,KACpB,KAAK,gBAAkB,KACvB,KAAK,0BAA4BgG,EAAS,yBAC1C,KAAK,UAAYA,EAAS,UAG1B,KAAK,6BAA+B,EACxC,CACE,mBAAoB,CAElB,OAAO,IACX,CAQE,WAAY,CACV,GAAI,CAAC,KAAK,iBAAmB,CAAC,KAAK,gBAAgB,MAAQ,CAAC,KAAK,gBAAgB,KAAK,OACpF,OAAOg2D,GAAkB,EAE3B,MAAMlwD,EAAO,KAAK,gBAAgB,KAC5BkZ,EAAQlZ,EAAK,CAAC,EAAE,UAChBmZ,EAAMnZ,EAAKA,EAAK,OAAS,CAAC,EAAE,UAClC,OAAOkwD,GAAiB,CAAC,CAACh3C,EAAOC,CAAG,CAAC,CAAC,CAC1C,CAYE,kBAAkB9Q,EAAKkuB,EAAM,GAAO,CAClC,GAAI,CAACluB,EACH,OAAO,KAET,MAAM0P,EAAK6kD,GAAcv0D,CAAG,EAC5B,IAAIyyF,EAAY,KAAK,cAAc/iF,CAAE,EACrC,GAAIwe,GAAO,CAACukE,GAAazyF,EAAI,MAAO,CAKlC,MAAMi5F,EAAqBH,GAAqB,WAAa94F,EAAI,MAAM,WACjEk5F,EAAkB,IAAI,WAAWD,CAAkB,EACzDC,EAAgB,IAAIl5F,EAAI,KAAK,EAC7Bk5F,EAAgB,IAAIJ,GAAsB94F,EAAI,MAAM,UAAU,EAC9D,KAAK,cAAc0P,CAAE,EAAI+iF,EAAY,CACnC,YAAazyF,EAAI,YACjB,UAAWA,EAAI,UACf,MAAOk5F,CACR,CACP,CACI,OAAOzG,GAAazyF,CACxB,CAQE,oBAAqB,CACnB,OAAO,KAAK,WAAa,KAAK,iBAAmB,CAAC,KAAK,OAAQ,CACnE,CASE,OAAQ,CACN,YAAK,MAAQ,QACb,KAAK,gBAAiB,EACf,KAAK,eAAgB,CAChC,CAUE,MAAM1L,EAAO,CACX,OAAI,OAAOA,EAAU,IACZ,KAAK,iBAEd,KAAK,gBAAkBA,EAGnB,KAAK,QAAU,QAAU,KAAK,mBAAkB,GAClD,KAAK,MAAO,EAEP,KAAK,gBAChB,CAQE,OAAOuc,EAAOC,EAAK,CACjBi+E,GAAoBl+E,EAAOC,EAAK,KAAK,eAAe,CACxD,CAWE,aAAc,CAEZ,MAAM6Q,EAAc,KAAK,mBAAoB,EAC7C,GAAKA,EAGL,IAAI,KAAK,gBAAgB,2BAA2BA,EAAY,QAAQ,IAAM,KAAM,CAGlF,MAAMw3E,EAAuB,IAAM,CACjC,KAAK,MAAQ,QACR,KAAK,UAER,KAAK,eAAgB,CAExB,EACD,KAAK,gBAAgB,IAAI,kBAAmBA,CAAoB,EAChE,KAAK,MAAQ,sBACb,MACN,CACI,KAAK,aAAax3E,CAAW,EAC9B,CAED,4BAA6B,CAC3B,OAAO,IACX,CACE,oBAAqB,CACnB,OAAO,KAAK,mBAAmB,MAAM,mBAAkB,CAAE,CAC7D,CAYE,mBAAmBA,EAAa,CAC9B,KAAOA,GAAeA,EAAY,QAAQ,OAAO,CAE/C,GAAIA,EAAY,WAAa,GAAKA,EAAY,SAAS,SAAS,OAAQ,CACtEA,EAAc,KACd,KACR,CACMA,EAAc,KAAK,qBAAqB,CACtC,SAAUA,EAAY,SACtB,WAAYA,EAAY,WAAa,EACrC,eAAgBA,EAAY,eAAiBA,EAAY,SACzD,cAAeA,EAAY,aACnC,CAAO,CACP,CACI,OAAOA,CACX,CACE,aAAap4B,EAAO,CAClB,KAAK,MAAMA,CAAK,EAChB,KAAK,MAAQ,QACb,KAAK,MAAO,EACZ,KAAK,QAAQ,OAAO,CACxB,CAOE,wBAAwBA,EAAOorG,EAAelnG,EAAQ,CACpD,GAAI,CAAC,KAAK,gBAAiB,CACzB,KAAK,MAAQ,QACb,MACN,CAGI,GAFA,KAAK,mBAAmBknG,EAAc,KAAK,EAEvC,CAAC,KAAK,gBAAiB,CACzB,KAAK,MAAQ,QACb,KAAK,sBAAwB,EAC7B,MACN,CACI,GAAIprG,EAAO,CACLA,EAAM,OAASu7F,GAAe,SAChC,KAAK,eAAgB,EAEnBv7F,EAAM,OAASu7F,GAAe,QAChC,KAAK,sBAAwB,EAE7B,KAAK,sBAAwB,EAE/B,KAAK,aAAav7F,CAAK,EACvB,MACN,CACI,MAAMo4B,EAAc,KAAK,gBAGzB,KAAK,2BAA2BA,EAAY,SAAUgzE,EAAc,KAAK,EAErEA,EAAc,KAChB,KAAK,WAAWA,EAAc,IAAK,EAAI,EAEzC,KAAK,MAAQ,YAEb,KAAK,QAAQ,WAAW,EACxB,MAAM50F,EAAU4hB,EAAY,QAM5B,GALI5hB,EAAQ,MACVA,EAAQ,IAAI,MAAQ40F,EAAc,IAAI,OAExChzE,EAAY,MAAQgzE,EAAc,MAE9B,OAAOpoE,EAAS,QAAW,YAAc,OAAO,KAAK,WAAc,WAAY,CACjF,KAAK,MAAQ,mBAGb,KAAK,UAAS,EAAG,KAAK,IAAM,KAAK,wBAAwBhjC,EAAOorG,EAAelnG,CAAM,EAAG,IAAM,KAAK,aAAa,CAC9G,QAAS,sBACjB,CAAO,CAAC,EACF,MACN,CACIsS,EAAQ,UAAY,GACpB,GAAI,CACF,KAAK,cAAc4hB,CAAW,CAC/B,OAAQ/xB,EAAG,CACV,KAAK,aAAa,CAChB,QAASA,EAAE,QACX,SAAU,CACR,UAAW62D,EAAQ,MAAM,wBACzB,MAAO72D,CACjB,CACA,CAAO,EACD,MACN,CAaI,GAZA,KAAK,mBAAmB+xB,EAAa,KAAK,gBAAgB,UAAUA,EAAY,QAAQ,EAAG,KAAK,SAAS,EACrGA,EAAY,KAAK,OACnBA,EAAY,WAAa,CACvB,MAAOA,EAAY,KAAK,CAAC,EAAE,UAC3B,IAAKA,EAAY,KAAKA,EAAY,KAAK,OAAS,CAAC,EAAE,OACpD,EAEDA,EAAY,WAAa,CACvB,MAAOA,EAAY,eACnB,IAAKA,EAAY,eAAiBA,EAAY,QAC/C,EAECA,EAAY,cAAe,CAC7B,KAAK,QAAQ,gBAAgB,EAC7B,KAAK,gBAAkB,KACvB,KAAK,MAAQ,QACb,MACN,CACIA,EAAY,WAAaA,EAAY,MAAM,WAC3C,KAAK,oBAAsB5hB,EAAQ,SAGnC4hB,EAAY,KAAK,QAAQpwB,GAAO,CAC9B,KAAK,gBAAgB,OAAO,KAAK,0BAA4B,IAAIg7B,EAAS,OAAOh7B,EAAI,UAAWA,EAAI,QAASA,EAAI,IAAI,EAAIA,CAAG,CAClI,CAAK,EAKDy9F,GAA6B,KAAK,eAAe,EACjD,KAAK,mBAAoB,CAC7B,CACE,aAAc,CAEhB,CACE,sBAAuB,CACzB,CAWE,cAAcrtE,EAAa,CACzB,IAAI1pB,EACAmhG,EAAsB,GAC1B,GAAI,OAAO7sE,EAAS,QAAW,WAE7B,MAAM,IAAIwsE,GAER,OAAOxsE,EAAS,aAAgB,WAClCt0B,EAAU,IAAIs0B,EAAS,YAAY,MAAM,GAEzCt0B,EAAUs0B,EAAS,OAAO,cAAe,EACzC6sE,EAAsB,IAExB,MAAMnyE,EAAS,IAAIsF,EAAS,OAAO,OAAOA,EAAUA,EAAS,MAAOt0B,CAAO,EAa3E,GAZA0pB,EAAY,KAAO,CAAE,EACrBA,EAAY,aAAe,CACzB,OAAQ,EACR,MAAO,CACR,EACDsF,EAAO,MAAQtF,EAAY,KAAK,KAAK,KAAKA,EAAY,IAAI,EAC1DsF,EAAO,eAAiBjnB,GAAO,CAC7B2hB,EAAY,aAAe3hB,CAC5B,EACDinB,EAAO,eAAiB19B,GAAS,CAC/Bk9D,EAAQ,IAAI,KAAK,wCAA0Cl9D,EAAM,OAAO,CACzE,EACGo4B,EAAY,QAAQ,IAAK,CAC3B,IAAI03E,EAAU13E,EAAY,QAAQ,IAAI,MAClCy3E,IACFC,EAAUX,GAAYW,CAAO,GAE/BpyE,EAAO,MAAMoyE,CAAO,CAC1B,CACI,IAAIhb,EAAc18D,EAAY,MAC1By3E,IACF/a,EAAcqa,GAAYra,CAAW,GAEvCp3D,EAAO,MAAMo3D,CAAW,EACxBp3D,EAAO,MAAO,CAClB,CAeE,mBAAmBtF,EAAa23E,EAAY3+E,EAAU,CACpD,MAAM5a,EAAU4hB,EAAY,QAC5B,GAAI,CAAC23E,EAIH,OAEF,GAAI,CAAC33E,EAAY,KAAK,OAAQ,CAI5B5hB,EAAQ,MAAQ,GAChB,MACN,CACI,KAAM,CACJ,OAAAw5F,EACA,MAAAC,CACD,EAAG73E,EAAY,aAQV83E,EADkBF,EAASzZ,GAAgB,iBAClB0Z,EAAQF,EAAW,QAOlD,GANA33E,EAAY,KAAK,QAAQpwB,GAAO,CAC9B,MAAMynB,EAAWznB,EAAI,QAAUA,EAAI,UAC7BiI,EAAY+/F,IAAW,EAAIhoG,EAAI,UAAYkoG,EAAO,KAAK,gBAAgBloG,EAAI,UAAYkoG,EAAMH,EAAW,IAAI,EAClH/nG,EAAI,UAAY,KAAK,IAAIiI,EAAW,CAAC,EACrCjI,EAAI,QAAU,KAAK,IAAIiI,EAAYwf,EAAU,CAAC,CACpD,CAAK,EACG,CAAC2B,EAAS,SAAU,CACtB,MAAM++E,EAAa/3E,EAAY,KAAK,CAAC,EAAE,UACjCg4E,EAAYh4E,EAAY,KAAKA,EAAY,KAAK,OAAS,CAAC,EAAE,UAChEhH,EAAS,SAAW,CAClB,cAAeA,EAAS,cAAgBgH,EAAY,WACpD,KAAM,KAAK,IAAI+3E,EAAYC,EAAY55F,EAAQ,QAAQ,CACxD,CACP,CACA,CAoBE,gBAAgBhT,EAAOkJ,EAAW,CAChC,GAAIA,IAAc,KAChB,OAAOlJ,EAET,IAAI6sG,EAAe7sG,EAAQ+yF,GAAgB,iBAC3C,MAAM+Z,EAAmB5jG,EAAY6pF,GAAgB,iBACrD,IAAI34E,EASJ,IARI0yF,EAAmBD,EAErBzyF,EAAS,YAGTA,EAAS,WAGJ,KAAK,IAAIyyF,EAAeC,CAAgB,EAAI,YACjDD,GAAgBzyF,EAElB,OAAOyyF,EAAe9Z,GAAgB,gBAC1C,CACA,CAkBA,MAAMga,GAAY,SAAUxlG,EAAOylG,EAAW,CAC5C,MAAMpiG,EAAOrD,EAAM,KACnB,QAAShK,EAAI,EAAGA,EAAIqN,EAAK,OAAQrN,IAAK,CACpC,MAAMiH,EAAMoG,EAAKrN,CAAC,EAClB,GAAIyvG,GAAaxoG,EAAI,aAAewoG,GAAaxoG,EAAI,UACnD,OAAOA,CAEb,CACE,OAAO,IACT,EACMyoG,GAAe,SAAU35E,EAAO/rB,EAAO6S,EAAS,EAAG,CACvD,GAAI,CAACkZ,EAAM,SACT,OAEF,IAAI05E,EAAY5yF,EACZ5V,EACJ,QAASjH,EAAI,EAAGA,EAAI+1B,EAAM,SAAS,OAAQ/1B,IAAK,CAC9C,MAAMyV,EAAUsgB,EAAM,SAAS/1B,CAAC,EAQhC,GAPKiH,IAKHA,EAAMuoG,GAAUxlG,EAAOylG,EAAYh6F,EAAQ,SAAW,CAAC,GAErDxO,EAAK,CACP,GAAI,UAAWwO,EAAS,CAEtBxO,EAAI,QAAUwoG,EACdxoG,EAAI,UAAYwoG,EAChBA,GAAah6F,EAAQ,SACrBxO,EAAM,KACN,QACR,CACM,GAAIwoG,EAAYxoG,EAAI,QAAS,CAE3BwoG,GAAah6F,EAAQ,SACrB,QACD,CAEDxO,EAAI,SAAWwO,EAAQ,QAC7B,SACU,WAAYA,IACdxO,EAAM,IAAIg7B,EAAS,OAAOwtE,EAAWA,EAAYh6F,EAAQ,SAAUA,EAAQ,MAAM,EACjFxO,EAAI,YAAcwoG,EAGlBxoG,EAAI,UAAYwoG,EAAY,WAAWh6F,EAAQ,MAAM,EACrDzL,EAAM,OAAO/C,CAAG,GAEd,eAAgBwO,EAAS,CAI3B,KAAM,CAACk6F,EAAUC,CAAO,EAAIn6F,EAAQ,WAAW,MAAM,GAAG,EAAE,IAAI,UAAU,EACxExO,EAAM,IAAIg7B,EAAS,OAAOwtE,EAAWA,EAAYh6F,EAAQ,SAAU,EAAE,EACrExO,EAAI,YAAcwoG,EAAYE,EAC9B1oG,EAAI,UAAYA,EAAI,YAAc2oG,EAClC5lG,EAAM,OAAO/C,CAAG,CACxB,CAEIwoG,GAAah6F,EAAQ,QACzB,CACA,EACA,MAAMo6F,EAAS,CASb,YAAY,CACV,MAAAtpF,EACA,IAAAC,EACA,aAAA7O,EACA,UAAAE,EAAY,KACZ,SAAAi4F,EAAW,EACf,EAAK,CACD,KAAK,OAASvpF,EACd,KAAK,KAAOC,EACZ,KAAK,cAAgB7O,EACrB,KAAK,WAAaE,EAClB,KAAK,UAAYi4F,CACrB,CACE,UAAUtK,EAAY,CACpB,OAAOA,GAAc,KAAK,OAASA,EAAa,KAAK,GACzD,CACE,cAAe,CACb,KAAK,UAAY,EACrB,CACE,qBAAsB,CACpB,KAAK,UAAY,EACrB,CACE,IAAI,YAAa,CACf,OAAO,KAAK,SAChB,CACE,IAAI,OAAQ,CACV,OAAO,KAAK,MAChB,CACE,IAAI,KAAM,CACR,OAAO,KAAK,IAChB,CACE,IAAI,cAAe,CACjB,OAAO,KAAK,aAChB,CACE,IAAI,WAAY,CACd,OAAO,KAAK,UAChB,CACA,CACA,MAAMuK,EAAa,CAMjB,YAAYC,EAAiBC,EAAgB,GAAI,CAC/C,KAAK,iBAAmBD,EACxB,KAAK,eAAiBC,CAC1B,CACE,IAAI,iBAAkB,CACpB,OAAO,KAAK,gBAChB,CACE,IAAI,eAAgB,CAClB,OAAO,KAAK,cAChB,CACE,IAAI,kBAAmB,CACrB,OAAO,KAAK,eAAe,OAAS,CACxC,CACE,mBAAoB,CAClB,KAAK,iBAAiB,oBAAqB,EAC3C,KAAK,eAAe,QAAQC,GAAgBA,EAAa,oBAAmB,CAAE,CAClF,CACA,CACA,MAAMC,EAAkB,CACtB,aAAc,CAKZ,KAAK,SAAW,IAAI,IACpB,KAAK,aAAe,GACpB,KAAK,YAAc,GACnB,KAAK,OAAS,KACd,KAAK,KAAO,GAChB,CACE,IAAI,OAAQ,CACV,OAAO,KAAK,MAChB,CACE,IAAI,KAAM,CACR,OAAO,KAAK,IAChB,CACE,IAAI,aAAc,CAChB,OAAO,KAAK,YAChB,CACE,IAAI,YAAa,CACf,OAAO,KAAK,WAChB,CACE,qBAAsB,CACpB,KAAK,SAAS,QAAQC,GAAgBA,EAAa,kBAAiB,CAAE,CAC1E,CAUE,OAAO//E,EAAUq1B,EAAa,CAC5B,KAAM,CACJ,cAAAl0B,EACA,SAAA3B,CACN,EAAQQ,EAEJ,GADA,KAAK,YAAc,KAAK,oBAAoBmB,EAAe3B,CAAQ,EAC/D,EAAC,KAAK,YAGV,OAAO,KAAK,eAAeA,EAAU2B,EAAe,KAAK,mBAAmBA,EAAek0B,CAAW,CAAC,CAC3G,CAME,mBAAmB8/C,EAAY,CAC7B,SAAW,CACT,gBAAAwK,EACA,cAAAC,CACN,IAAS,KAAK,SAAS,SAEjB,GAAKA,EAAc,QAMjB,UAAWC,KAAgBD,EACzB,GAAIC,EAAa,UAAU1K,CAAU,EACnC,OAAO0K,UAPPF,EAAgB,UAAUxK,CAAU,EACtC,OAAOwK,EAWb,OAAO,IACX,CACE,4BAA4Bx+E,EAAe,CACzC,OAAO,KAAK,SAAS,IAAIA,CAAa,CAC1C,CACE,eAAe3B,EAAUwgF,EAAuBC,EAAc,CAC5D,MAAMC,EAAa,IAAI,IACvB,IAAIC,EAAiB;AAAA,EACjBxE,EAAesE,EACfG,EAAuBJ,EAC3B,KAAK,OAASrE,EACdn8E,EAAS,QAAQ,CAACpa,EAASkC,IAAiB,CAC1C,MAAM+4F,EAAmB,KAAK,SAAS,IAAID,CAAoB,EACzDE,EAAe3E,EACfxgC,EAAamlC,EAAel7F,EAAQ,SACpCm7F,EAAoB,GAAQF,GAAoBA,EAAiB,iBAAmBA,EAAiB,gBAAgB,YACrHV,EAAkB,IAAIH,GAAS,CACnC,MAAOc,EACP,IAAKnlC,EACL,SAAUolC,EACV,aAAAj5F,CACR,CAAO,EACDlC,EAAQ,SAAWu6F,EACnB,IAAIa,EAAmB7E,EACvB,MAAMiE,GAAiBx6F,EAAQ,OAAS,CAAE,GAAE,IAAI,CAACmC,EAAMC,IAAc,CACnE,MAAMi5F,EAAYD,EACZE,EAAUF,EAAmBj5F,EAAK,SAClCo5F,EAAiB,GAAQN,GAAoBA,EAAiB,eAAiBA,EAAiB,cAAc74F,CAAS,GAAK64F,EAAiB,cAAc74F,CAAS,EAAE,YACtKq4F,EAAe,IAAIL,GAAS,CAChC,MAAOiB,EACP,IAAKC,EACL,SAAUC,EACV,aAAAr5F,EACA,UAAAE,CACV,CAAS,EACD,OAAAg5F,EAAmBE,EACnBP,GAAkB,mBAAmBC,CAAoB,IAAI54F,CAAS,aAAai5F,CAAS,QAAQC,CAAO,gBAAgBC,CAAc;AAAA,EACzIp5F,EAAK,SAAWs4F,EACTA,CACf,CAAO,EACDK,EAAW,IAAIE,EAAsB,IAAIV,GAAaC,EAAiBC,CAAa,CAAC,EACrFO,GAAkB,GAAGxN,GAA6BvtF,EAAQ,WAAW,CAAC,sBAAsBg7F,CAAoB,aAAaE,CAAY,QAAQnlC,CAAU,gBAAgBolC,CAAiB;AAAA,EAC5LH,IACAzE,EAAexgC,CACrB,CAAK,EACD,KAAK,KAAOwgC,EACZ,KAAK,SAAWuE,EAChB,KAAK,aAAeC,CACxB,CACE,mBAAmBh/E,EAAey/E,EAAU,CAC1C,OAAK,KAAK,SAAS,KAIf,KAAK,SAAS,IAAIz/E,CAAa,EAE1B,KAAK,SAAS,IAAIA,CAAa,EAAE,gBAAgB,MAInDy/E,EARE,CASb,CACE,oBAAoBz/E,EAAe3B,EAAU,CAC3C,OAAsC2B,GAAkB,MAAQ,MAAM,QAAQ3B,CAAQ,GAAKA,EAAS,MACxG,CACA,CACA,MAAMqhF,WAAmCf,EAAkB,CACzD,YAAY5rF,EAAQ,CAClB,MAAO,EACP,KAAK,QAAUA,CACnB,CACE,mBAAmBiN,EAAey/E,EAAU,CAC1C,GAAI,CAAC,KAAK,SAAS,KAAM,CACvB,MAAM3a,EAAO,KAAK,QAAQ,4BAA4B9kE,CAAa,EACnE,OAAI8kE,EACKA,EAAK,gBAAgB,MAEvB,CACb,CACI,OAAO,MAAM,mBAAmB9kE,EAAey/E,CAAQ,CAC3D,CACA,CAUA,MAAME,GAAmC,MACnCC,GAAsB,CAG5B,CACE,KAAM,MACN,IAAK,CAAC/O,EAAgBhyE,EAAU3B,EAAU1X,EAAiB0uC,IACrDh3B,IAAa,IACG,CAChB,KAAM,EACN,aAAc,EACd,UAAW,IACZ,EAGI,IAEX,EAAG,CACD,KAAM,gBAWN,IAAK,CAAC2zE,EAAgBhyE,EAAU3B,EAAU1X,EAAiB0uC,EAAallD,IAAS,CAC/E,MAAM6wG,EAAoBhP,EAAe,qBAAqB7hG,CAAI,EAIlE,GAHI,CAAC6wG,GAGD,CAACA,EAAkB,WACrB,OAAO,KAET,MAAMnI,EAAWmI,EAAkB,mBAAmB3rD,CAAW,EACjE,OAAKwjD,EAGE,CACL,KAAMA,EAAS,MACf,UAAWA,EAAS,UACpB,aAAcA,EAAS,YACxB,EANQ,IAOb,CACA,EAEA,CACE,KAAM,kBACN,IAAK,CAAC7G,EAAgBhyE,EAAU3B,EAAU1X,EAAiB0uC,IAAgB,CACzE,GAAI,CAAC,OAAO,KAAK28C,EAAe,0BAA0B,EAAE,OAC1D,OAAO,KAET,IAAItd,EAAY,KACZusB,EAAe,KACnB,MAAMzwC,EAAmB9B,GAAoB1uC,CAAQ,EACrDq1B,EAAcA,GAAe,EAC7B,QAAS1lD,EAAI,EAAGA,EAAI6gE,EAAiB,OAAQ7gE,IAAK,CAGhD,MAAMqD,EAAQgtB,EAAS,SAAWq1B,IAAgB,EAAI1lD,EAAI6gE,EAAiB,QAAU7gE,EAAI,GACnF8gE,EAAiBD,EAAiBx9D,CAAK,EACvCoS,EAAUqrD,EAAe,QACzBywC,EAAkBlP,EAAe,2BAA2B5sF,EAAQ,QAAQ,EAClF,GAAI,CAAC87F,GAAmB,CAAC97F,EAAQ,eAC/B,SAGF,IAAI8Q,EADgB9Q,EAAQ,eAAe,QAAS,EAAG,IAC7B87F,EAE1B,GAAI97F,EAAQ,OAAS,OAAOqrD,EAAe,WAAc,SACvD,QAAS0wC,EAAI,EAAGA,EAAI1wC,EAAe,UAAW0wC,IAC5CjrF,GAAS9Q,EAAQ,MAAM+7F,CAAC,EAAE,SAG9B,MAAMnyD,EAAW,KAAK,IAAIqG,EAAcn/B,CAAK,EAG7C,GAAI+qF,IAAiB,OAASjyD,IAAa,GAAKiyD,EAAejyD,GAC7D,MAEFiyD,EAAejyD,EACf0lC,EAAY,CACV,KAAMx+D,EACN,aAAcu6C,EAAe,aAC7B,UAAWA,EAAe,SAC3B,CACP,CACI,OAAOikB,CACX,CACA,EAGA,CACE,KAAM,UACN,IAAK,CAACsd,EAAgBhyE,EAAU3B,EAAU1X,EAAiB0uC,IAAgB,CACzE,IAAIq/B,EAAY,KACZusB,EAAe,KACnB5rD,EAAcA,GAAe,EAC7B,MAAMmb,EAAmB9B,GAAoB1uC,CAAQ,EACrD,QAASrwB,EAAI,EAAGA,EAAI6gE,EAAiB,OAAQ7gE,IAAK,CAGhD,MAAMqD,EAAQgtB,EAAS,SAAWq1B,IAAgB,EAAI1lD,EAAI6gE,EAAiB,QAAU7gE,EAAI,GACnF8gE,EAAiBD,EAAiBx9D,CAAK,EACvCoS,EAAUqrD,EAAe,QACzBv6C,EAAQu6C,EAAe,MAAQA,EAAe,KAAK,OAASrrD,GAAWA,EAAQ,MACrF,GAAIA,EAAQ,WAAauB,GAAmB,OAAOuP,EAAU,IAAa,CACxE,MAAM84B,EAAW,KAAK,IAAIqG,EAAcn/B,CAAK,EAG7C,GAAI+qF,IAAiB,MAAQA,EAAejyD,EAC1C,OAEE,CAAC0lC,GAAausB,IAAiB,MAAQA,GAAgBjyD,KACzDiyD,EAAejyD,EACf0lC,EAAY,CACV,KAAMx+D,EACN,aAAcu6C,EAAe,aAC7B,UAAWA,EAAe,SAC3B,EAEX,CACA,CACI,OAAOikB,CACX,CACA,EAGA,CACE,KAAM,gBACN,IAAK,CAACsd,EAAgBhyE,EAAU3B,EAAU1X,EAAiB0uC,IAAgB,CACzE,IAAIq/B,EAAY,KAEhB,GADAr/B,EAAcA,GAAe,EACzBr1B,EAAS,qBAAuBA,EAAS,oBAAoB,OAAQ,CACvE,IAAIihF,EAAe,KACnB,QAAStxG,EAAI,EAAGA,EAAIqwB,EAAS,oBAAoB,OAAQrwB,IAAK,CAC5D,MAAM2X,EAAe0Y,EAAS,oBAAoBrwB,CAAC,EAC7CyxG,EAAgBphF,EAAS,sBAAwBrwB,EAAI,EACrD0xG,EAAoBrP,EAAe,gBAAgBoP,CAAa,EACtE,GAAIC,EAAmB,CACrB,MAAMryD,EAAW,KAAK,IAAIqG,EAAcgsD,EAAkB,IAAI,EAG9D,GAAIJ,IAAiB,MAAQA,EAAejyD,EAC1C,OAEE,CAAC0lC,GAAausB,IAAiB,MAAQA,GAAgBjyD,KACzDiyD,EAAejyD,EACf0lC,EAAY,CACV,KAAM2sB,EAAkB,KACxB,aAAA/5F,EACA,UAAW,IACZ,EAEb,CACA,CACA,CACI,OAAOotE,CACX,CACA,EAGA,CACE,KAAM,WACN,IAAK,CAACsd,EAAgBhyE,EAAU3B,EAAU1X,EAAiB0uC,IACrDr1B,EAAS,SACO,CAChB,KAAMA,EAAS,SAAS,KACxB,aAAcA,EAAS,SAAS,cAAgBA,EAAS,cACzD,UAAW,IACZ,EAGI,IAEX,CAAC,EACD,MAAMshF,WAAuBx1C,EAAQ,WAAY,CAC/C,YAAY56D,EAAU,GAAI,CACxB,QAEA,KAAK,UAAY,CAAE,EACnB,KAAK,gBAAkB,CAAE,EACzB,KAAK,2BAA6B,GAKlC,MAAMk+D,EAAO,IAAI0wC,GACXhuB,EAAQ,IAAI+uB,GAA2BzxC,CAAI,EAC3ChxD,EAAM,IAAIyiG,GAA2BzxC,CAAI,EAC/C,KAAK,sBAAwB,CAC3B,KAAAA,EACA,MAAA0iB,EACA,IAAA1zE,CACD,EACD,KAAK,QAAU6uD,GAAO,gBAAgB,CAC1C,CAOE,qBAAqByoC,EAAY,CAC/B,OAAO,KAAK,sBAAsBA,CAAU,GAAK,IACrD,CAqBE,aAAa11E,EAAU3B,EAAU1X,EAAiB0uC,EAAallD,EAAM,CAEnE,GAAIkuB,IAAa,IAIf,OAH6B0iF,GAAoB,KAAK,CAAC,CACrD,KAAA1oG,CACR,IAAYA,IAAS,KAAK,EACQ,IAAI,KAAM2nB,EAAU3B,CAAQ,EAE1D,MAAMkjF,EAAa,KAAK,eAAevhF,EAAU3B,EAAU1X,EAAiB0uC,EAAallD,CAAI,EAC7F,GAAI,CAACoxG,EAAW,OAId,OAAO,KAGT,UAAWC,KAAiBD,EAAY,CACtC,KAAM,CACJ,UAAA7sB,EACA,SAAA+sB,CACR,EAAUD,EACE,CACJ,aAAAl6F,EACA,KAAAie,CACR,EAAUmvD,EACJ,GAAIptE,EAAe,EACjB,SAEF,MAAMo6F,EAAkB1hF,EAAS,SAAS1Y,CAAY,EAChD4O,EAAQqP,EACRpP,EAAMD,EAAQwrF,EAAgB,SAEpC,GADA,KAAK,QAAQ,aAAaD,CAAQ,mBAAmBpsD,CAAW,uBAAuB/tC,CAAY,YAAY4O,CAAK,OAAOC,CAAG,IAAI,EAC9Hk/B,GAAen/B,GAASm/B,EAAcl/B,EACxC,YAAK,QAAQ,sCAAuCu+D,CAAS,EACtDA,CAEV,CAID,OAAO,KAAK,iBAAiB6sB,EAAY,CACvC,IAAK,OACL,MAAOlsD,CACb,CAAK,CACL,CAaE,eAAer1B,EAAU3B,EAAU,CACjC,GAAI,CAAC2B,GAAY,CAACA,EAAS,SACzB,OAAO,KAET,MAAMuhF,EAAa,KAAK,eAAevhF,EAAU3B,EAAU2B,EAAS,sBAAuB,CAAC,EAE5F,GAAI,CAACuhF,EAAW,OACd,OAAO,KAET,MAAM7sB,EAAY,KAAK,iBAAiB6sB,EAAY,CAClD,IAAK,eACL,MAAO,CACb,CAAK,EAGD,OAAI7sB,EAAU,aAAe,IAC3BA,EAAU,MAAQ,IAEb,KAAK,IAAIA,EAAU,KAAO9kB,GAAa,CAC5C,gBAAiB5vC,EAAS,eAC1B,aAAcA,EAAS,SACvB,WAAY00D,EAAU,aACtB,SAAU,CAChB,CAAK,CAAC,CACN,CAoBE,eAAe10D,EAAU3B,EAAU1X,EAAiB0uC,EAAallD,EAAM,CACrE,MAAMoxG,EAAa,CAAA,EAEnB,QAAS5xG,EAAI,EAAGA,EAAIoxG,GAAoB,OAAQpxG,IAAK,CACnD,MAAM8xG,EAAWV,GAAoBpxG,CAAC,EAChC+kF,EAAY+sB,EAAS,IAAI,KAAMzhF,EAAU3B,EAAU1X,EAAiB0uC,EAAallD,CAAI,EACvFukF,IACFA,EAAU,SAAW+sB,EAAS,KAC9BF,EAAW,KAAK,CACd,SAAUE,EAAS,KACnB,UAAA/sB,CACV,CAAS,EAET,CACI,OAAO6sB,CACX,CAiBE,iBAAiBA,EAAYxzF,EAAQ,CACnC,IAAI4zF,EAAgBJ,EAAW,CAAC,EAAE,UAC9BK,EAAe,KAAK,IAAIL,EAAW,CAAC,EAAE,UAAUxzF,EAAO,GAAG,EAAIA,EAAO,KAAK,EAC1E8zF,EAAeN,EAAW,CAAC,EAAE,SACjC,QAAS5xG,EAAI,EAAGA,EAAI4xG,EAAW,OAAQ5xG,IAAK,CAC1C,MAAMmyG,EAAc,KAAK,IAAIP,EAAW5xG,CAAC,EAAE,UAAUoe,EAAO,GAAG,EAAIA,EAAO,KAAK,EAC3E+zF,EAAcF,IAChBA,EAAeE,EACfH,EAAgBJ,EAAW5xG,CAAC,EAAE,UAC9BkyG,EAAeN,EAAW5xG,CAAC,EAAE,SAErC,CACI,YAAK,QAAQ,kBAAkBoe,EAAO,GAAG,KAAKA,EAAO,KAAK,2BAAgC8zF,CAAY,YAAYF,EAAc,IAAI,kBAAuBA,EAAc,YAAY,IAAM,OAAOA,EAAc,WAAc,SAAW,cAAcA,EAAc,SAAS,GAAK,IAAM,GAAG,EACrRA,CACX,CAUE,uBAAuBpgF,EAAay2E,EAAa,CAC/C,MAAME,EAAoBF,EAAY,cAAgBz2E,EAAY,cAElE,GAAI22E,EAAoB4I,GAAkC,CACxDh1C,EAAQ,IAAI,KAAK,uDAAuDosC,CAAiB,gBAAgB,EACzG,MACD,CAGD,QAASvoG,EAAIuoG,EAAoB,EAAGvoG,GAAK,EAAGA,IAAK,CAC/C,MAAMoyG,EAAqBxgF,EAAY,SAAS5xB,CAAC,EACjD,GAAIoyG,GAAsB,OAAOA,EAAmB,MAAU,IAAa,CACzE/J,EAAY,SAAW,CACrB,cAAez2E,EAAY,cAAgB5xB,EAC3C,KAAMoyG,EAAmB,KAC1B,EACD,KAAK,QAAQ,gCAAgC/J,EAAY,SAAS,IAAI,oBAAyBA,EAAY,SAAS,aAAa,GAAG,EACpI,KAAK,QAAQ,gBAAgB,EAC7B,KACR,CACA,CACA,CAQE,2BAA2Bh4E,EAAU,CAMnC,GADA,KAAK,2BAA6B,CAAE,EAChCA,EAAS,UAAYA,EAAS,SAAS,QAAUA,EAAS,SAAS,CAAC,EAAE,eAAgB,CACxF,MAAMmzC,EAAenzC,EAAS,SAAS,CAAC,EAClCgiF,EAAoB7uC,EAAa,eAAe,QAAS,EAAG,IAClE,KAAK,2BAA2BA,EAAa,QAAQ,EAAI,CAAC6uC,CAChE,CACA,CAcE,sBAAsB,CACpB,YAAAh7E,EACA,0BAAAi7E,CACJ,EAAK,CACD,MAAMC,EAAiC,KAAK,6BAA6Bl7E,EAAaA,EAAY,WAAYi7E,CAAyB,EACjI78F,EAAU4hB,EAAY,QACxBk7E,IACF,KAAK,2BAA2Bl7E,CAAW,EAGtCA,EAAY,SAAS,WACxBA,EAAY,SAAS,SAAW,CAC9B,cAAeA,EAAY,SAAS,cAAgBA,EAAY,WAChE,KAAM5hB,EAAQ,KACf,IAGL,MAAM+8F,EAAW/8F,EAAQ,eACrBA,EAAQ,eAAiB68F,GAA6BE,IACxD,KAAK,2BAA2B/8F,EAAQ,QAAQ,EAAI,EAAE+8F,EAAS,QAAS,EAAG,KAEjF,CACE,2BAA2BjiF,EAAU,CACnC,OAAI,OAAO,KAAK,UAAUA,CAAQ,EAAM,IAC/B,KAEF,KAAK,UAAUA,CAAQ,EAAE,IACpC,CACE,mBAAmBA,EAAU,CAC3B,OAAI,OAAO,KAAK,UAAUA,CAAQ,EAAM,IAC/B,KAEF,KAAK,UAAUA,CAAQ,EAAE,OACpC,CAiBE,6BAA6B8G,EAAa6/D,EAAYob,EAA2B,CAE/E,MAAM78F,EAAU4hB,EAAY,QACtBzf,EAAOyf,EAAY,KACzB,IAAI23E,EAAa,KAAK,UAAU33E,EAAY,QAAQ,EAChD9Q,EACAC,EACJ,GAAI,OAAO6Q,EAAY,iBAAoB,SACzC23E,EAAa,CACX,KAAM33E,EAAY,eAClB,QAASA,EAAY,eAAiB6/D,EAAW,KAClD,EACGob,IACF,KAAK,UAAUj7E,EAAY,QAAQ,EAAI23E,EACvC,KAAK,QAAQ,iBAAiB,EAC9B,KAAK,QAAQ,6BAA6B33E,EAAY,QAAQ,YAAiB23E,EAAW,IAAI,eAAeA,EAAW,OAAO,GAAG,GAEpIzoF,EAAQ8Q,EAAY,eACpB7Q,EAAM0wE,EAAW,IAAM8X,EAAW,gBACzBA,EACTzoF,EAAQ2wE,EAAW,MAAQ8X,EAAW,QACtCxoF,EAAM0wE,EAAW,IAAM8X,EAAW,YAElC,OAAO,GAET,OAAIp3F,IACFA,EAAK,MAAQ2O,EACb3O,EAAK,IAAM4O,IAOT,CAAC/Q,EAAQ,OAAS8Q,EAAQ9Q,EAAQ,SACpCA,EAAQ,MAAQ8Q,GAElB9Q,EAAQ,IAAM+Q,EACP,EACX,CAUE,2BAA2B6Q,EAAa,CACtC,MAAMhH,EAAWgH,EAAY,SACvB5hB,EAAU4hB,EAAY,QAI5B,GAAI5hB,EAAQ,cACV,KAAK,gBAAgBA,EAAQ,QAAQ,EAAI,CACvC,KAAMA,EAAQ,MACd,SAAU,CACX,UACQ4a,EAAS,qBAAuBA,EAAS,oBAAoB,OAGtE,QAASrwB,EAAI,EAAGA,EAAIqwB,EAAS,oBAAoB,OAAQrwB,IAAK,CAC5D,MAAM2X,EAAe0Y,EAAS,oBAAoBrwB,CAAC,EAC7CyxG,EAAgBphF,EAAS,sBAAwBrwB,EAAI,EACrDyyG,EAAiB96F,EAAe0f,EAAY,WAC5Cq7E,EAAW,KAAK,IAAID,CAAc,EACxC,GAAI,CAAC,KAAK,gBAAgBhB,CAAa,GAAK,KAAK,gBAAgBA,CAAa,EAAE,SAAWiB,EAAU,CACnG,IAAI98E,EACA68E,EAAiB,EACnB78E,EAAOngB,EAAQ,MAAQwqD,GAAa,CAClC,gBAAiB5vC,EAAS,eAC1B,aAAcA,EAAS,SACvB,WAAYgH,EAAY,WACxB,SAAU1f,CACxB,CAAa,EAEDie,EAAOngB,EAAQ,IAAMwqD,GAAa,CAChC,gBAAiB5vC,EAAS,eAC1B,aAAcA,EAAS,SACvB,WAAYgH,EAAY,WAAa,EACrC,SAAU1f,CACxB,CAAa,EAEH,KAAK,gBAAgB85F,CAAa,EAAI,CACpC,KAAA77E,EACA,SAAA88E,CACD,CACX,CACA,CAEA,CACE,SAAU,CACR,KAAK,QAAQ,SAAS,EACtB,KAAK,IAAK,CACd,CACA,CAYA,MAAMC,WAAiCx2C,EAAQ,WAAY,CACzD,aAAc,CACZ,MAAO,EACP,KAAK,wBAA0B,CAAE,EACjC,KAAK,qBAAuB,CAAE,CAClC,CACE,2BAA2B37D,EAAM,CAC/B,KAAK,wBAAwBA,CAAI,EAAI,KACrC,KAAK,QAAQ,uBAAuB,CACxC,CACE,sBAAsB,CACpB,KAAAA,EACA,KAAAotB,EACA,GAAAglF,CACJ,EAAK,CACD,OAAI,OAAOhlF,GAAS,UAAY,OAAOglF,GAAO,WAC5C,KAAK,wBAAwBpyG,CAAI,EAAI,CACnC,KAAAA,EACA,KAAAotB,EACA,GAAAglF,CACD,EACD,KAAK,QAAQ,uBAAuB,GAE/B,KAAK,wBAAwBpyG,CAAI,CAC5C,CACE,mBAAmB,CACjB,KAAAA,EACA,KAAAotB,EACA,GAAAglF,CACJ,EAAK,CACD,GAAI,OAAOhlF,GAAS,UAAY,OAAOglF,GAAO,SAAU,CACtD,KAAK,qBAAqBpyG,CAAI,EAAI,CAChC,KAAAA,EACA,KAAAotB,EACA,GAAAglF,CACD,EACD,OAAO,KAAK,wBAAwBpyG,CAAI,EACxC,MAAMqmE,EAAW,CACf,mBAAoB,CAClB,KAAAj5C,EACA,GAAAglF,CACV,CACO,EACD,KAAK,QAAQ,CACX,KAAM,iBACN,SAAA/rC,CACR,CAAO,CACP,CACI,OAAO,KAAK,qBAAqBrmE,CAAI,CACzC,CACE,SAAU,CACR,KAAK,QAAQ,SAAS,EACtB,KAAK,wBAA0B,CAAE,EACjC,KAAK,qBAAuB,CAAE,EAC9B,KAAK,IAAK,CACd,CACA,CAGA,MAAMqyG,GAAa5qE,GAAUyoC,GAAgB,UAAY,CAWvD,IAAIx9D,EAAsB,UAAY,CACpC,SAASA,GAAS,CAChB,KAAK,UAAY,CAAE,CACzB,CASI,IAAI3S,EAAS2S,EAAO,UACpB,OAAA3S,EAAO,GAAK,SAAYC,EAAM2S,EAAU,CACjC,KAAK,UAAU3S,CAAI,IACtB,KAAK,UAAUA,CAAI,EAAI,CAAE,GAE3B,KAAK,UAAUA,CAAI,EAAE,KAAK2S,CAAQ,CACxC,EAUI5S,EAAO,IAAM,SAAaC,EAAM2S,EAAU,CACxC,GAAI,CAAC,KAAK,UAAU3S,CAAI,EACtB,MAAO,GAET,IAAI6C,EAAQ,KAAK,UAAU7C,CAAI,EAAE,QAAQ2S,CAAQ,EASjD,YAAK,UAAU3S,CAAI,EAAI,KAAK,UAAUA,CAAI,EAAE,MAAM,CAAC,EACnD,KAAK,UAAUA,CAAI,EAAE,OAAO6C,EAAO,CAAC,EAC7BA,EAAQ,EACrB,EAQI9C,EAAO,QAAU,SAAiBC,EAAM,CACtC,IAAI4S,EAAY,KAAK,UAAU5S,CAAI,EACnC,GAAK4S,EAOL,GAAI,UAAU,SAAW,EAEvB,QADIC,EAASD,EAAU,OACdpT,EAAI,EAAGA,EAAIqT,EAAQ,EAAErT,EAC5BoT,EAAUpT,CAAC,EAAE,KAAK,KAAM,UAAU,CAAC,CAAC,MAKtC,SAFIsT,EAAO,MAAM,UAAU,MAAM,KAAK,UAAW,CAAC,EAC9CC,EAAUH,EAAU,OACfI,EAAK,EAAGA,EAAKD,EAAS,EAAEC,EAC/BJ,EAAUI,CAAE,EAAE,MAAM,KAAMF,CAAI,CAGxC,EAKI/S,EAAO,QAAU,UAAmB,CAClC,KAAK,UAAY,CAAE,CACzB,EAUIA,EAAO,KAAO,SAAckT,EAAa,CACvC,KAAK,GAAG,OAAQ,SAAUzG,EAAM,CAC9ByG,EAAY,KAAKzG,CAAI,CAC7B,CAAO,CACF,EACMkG,CACX,EAAK,EACL,qDAUE,SAAS4/F,EAAMC,EAAQ,CACrB,OAAOA,EAAO,SAAS,EAAGA,EAAO,WAAaA,EAAOA,EAAO,WAAa,CAAC,CAAC,CAC/E,CACA,6DA+CE,MAAMC,EAAa,UAAY,CAC7B,MAAMC,EAAS,CAAC,CAAC,CAAE,EAAE,CAAE,EAAE,CAAE,EAAE,CAAE,EAAE,CAAE,CAAA,EAAG,CAAC,CAAE,EAAE,CAAE,EAAE,CAAE,EAAE,CAAE,EAAE,CAAE,CAAA,CAAC,EACpDC,EAAWD,EAAO,CAAC,EACnBE,EAAWF,EAAO,CAAC,EACnBG,EAAOF,EAAS,CAAC,EACjBG,EAAUF,EAAS,CAAC,EAC1B,IAAInzG,EACAwL,EACA8nG,EACJ,MAAM5yB,EAAI,CAAE,EACN6yB,EAAK,CAAE,EACb,IAAIC,EACAC,GACAC,EACAvtG,GACAwtG,EACAC,EAEJ,IAAK5zG,EAAI,EAAGA,EAAI,IAAKA,IACnBuzG,GAAI7yB,EAAE1gF,CAAC,EAAIA,GAAK,GAAKA,GAAK,GAAK,KAAOA,CAAC,EAAIA,EAE7C,IAAKwL,EAAI8nG,EAAO,EAAG,CAACF,EAAK5nG,CAAC,EAAGA,GAAKgoG,GAAM,EAAGF,EAAOC,EAAGD,CAAI,GAAK,EAU5D,IARAntG,GAAImtG,EAAOA,GAAQ,EAAIA,GAAQ,EAAIA,GAAQ,EAAIA,GAAQ,EACvDntG,GAAIA,IAAK,EAAIA,GAAI,IAAM,GACvBitG,EAAK5nG,CAAC,EAAIrF,GACVktG,EAAQltG,EAAC,EAAIqF,EAEbkoG,EAAKhzB,EAAE+yB,GAAK/yB,EAAE8yB,EAAK9yB,EAAEl1E,CAAC,CAAC,CAAC,EACxBooG,EAAOF,EAAK,SAAYD,GAAK,MAAUD,EAAK,IAAQhoG,EAAI,SACxDmoG,EAAOjzB,EAAEv6E,EAAC,EAAI,IAAQA,GAAI,SACrBnG,EAAI,EAAGA,EAAI,EAAGA,IACjBkzG,EAASlzG,CAAC,EAAEwL,CAAC,EAAImoG,EAAOA,GAAQ,GAAKA,IAAS,EAC9CR,EAASnzG,CAAC,EAAEmG,EAAC,EAAIytG,EAAOA,GAAQ,GAAKA,IAAS,EAIlD,IAAK5zG,EAAI,EAAGA,EAAI,EAAGA,IACjBkzG,EAASlzG,CAAC,EAAIkzG,EAASlzG,CAAC,EAAE,MAAM,CAAC,EACjCmzG,EAASnzG,CAAC,EAAImzG,EAASnzG,CAAC,EAAE,MAAM,CAAC,EAEnC,OAAOizG,CACR,EACD,IAAIY,EAAY,KAShB,MAAMC,CAAI,CACR,YAAYxwG,EAAK,CAeVuwG,IACHA,EAAYb,EAAY,GAG1B,KAAK,QAAU,CAAC,CAACa,EAAU,CAAC,EAAE,CAAC,EAAE,MAAK,EAAIA,EAAU,CAAC,EAAE,CAAC,EAAE,MAAO,EAAEA,EAAU,CAAC,EAAE,CAAC,EAAE,MAAO,EAAEA,EAAU,CAAC,EAAE,CAAC,EAAE,MAAK,EAAIA,EAAU,CAAC,EAAE,CAAC,EAAE,OAAO,EAAG,CAACA,EAAU,CAAC,EAAE,CAAC,EAAE,MAAO,EAAEA,EAAU,CAAC,EAAE,CAAC,EAAE,MAAO,EAAEA,EAAU,CAAC,EAAE,CAAC,EAAE,MAAO,EAAEA,EAAU,CAAC,EAAE,CAAC,EAAE,MAAK,EAAIA,EAAU,CAAC,EAAE,CAAC,EAAE,MAAO,CAAA,CAAC,EAC5Q,IAAI7zG,EACA+/C,EACAg0D,EACJ,MAAMX,EAAO,KAAK,QAAQ,CAAC,EAAE,CAAC,EACxBD,EAAW,KAAK,QAAQ,CAAC,EACzBa,EAAS1wG,EAAI,OACnB,IAAI2wG,EAAO,EACX,GAAID,IAAW,GAAKA,IAAW,GAAKA,IAAW,EAC7C,MAAM,IAAI,MAAM,sBAAsB,EAExC,MAAME,EAAS5wG,EAAI,MAAM,CAAC,EACpB6wG,EAAS,CAAE,EAGjB,IAFA,KAAK,KAAO,CAACD,EAAQC,CAAM,EAEtBn0G,EAAIg0G,EAAQh0G,EAAI,EAAIg0G,EAAS,GAAIh0G,IACpC+zG,EAAMG,EAAOl0G,EAAI,CAAC,GAEdA,EAAIg0G,IAAW,GAAKA,IAAW,GAAKh0G,EAAIg0G,IAAW,KACrDD,EAAMX,EAAKW,IAAQ,EAAE,GAAK,GAAKX,EAAKW,GAAO,GAAK,GAAG,GAAK,GAAKX,EAAKW,GAAO,EAAI,GAAG,GAAK,EAAIX,EAAKW,EAAM,GAAG,EAEnG/zG,EAAIg0G,IAAW,IACjBD,EAAMA,GAAO,EAAIA,IAAQ,GAAKE,GAAQ,GACtCA,EAAOA,GAAQ,GAAKA,GAAQ,GAAK,MAGrCC,EAAOl0G,CAAC,EAAIk0G,EAAOl0G,EAAIg0G,CAAM,EAAID,EAGnC,IAAKh0D,EAAI,EAAG//C,EAAG+/C,IAAK//C,IAClB+zG,EAAMG,EAAOn0D,EAAI,EAAI//C,EAAIA,EAAI,CAAC,EAC1BA,GAAK,GAAK+/C,EAAI,EAChBo0D,EAAOp0D,CAAC,EAAIg0D,EAEZI,EAAOp0D,CAAC,EAAIozD,EAAS,CAAC,EAAEC,EAAKW,IAAQ,EAAE,CAAC,EAAIZ,EAAS,CAAC,EAAEC,EAAKW,GAAO,GAAK,GAAG,CAAC,EAAIZ,EAAS,CAAC,EAAEC,EAAKW,GAAO,EAAI,GAAG,CAAC,EAAIZ,EAAS,CAAC,EAAEC,EAAKW,EAAM,GAAG,CAAC,CAG1J,CAeI,QAAQK,EAAYC,EAAYC,EAAYC,EAAYC,EAAK33F,EAAQ,CACnE,MAAMvZ,EAAM,KAAK,KAAK,CAAC,EAEvB,IAAIoD,EAAI0tG,EAAa9wG,EAAI,CAAC,EACtB4I,EAAIqoG,EAAajxG,EAAI,CAAC,EACtB6W,EAAIm6F,EAAahxG,EAAI,CAAC,EACtBo9E,GAAI2zB,EAAa/wG,EAAI,CAAC,EACtBmxG,EACAppG,GACAqpG,EAEJ,MAAMC,EAAerxG,EAAI,OAAS,EAAI,EACtC,IAAItD,GACA40G,GAAS,EACb,MAAMhf,GAAQ,KAAK,QAAQ,CAAC,EAEtBif,GAASjf,GAAM,CAAC,EAChBkf,GAASlf,GAAM,CAAC,EAChBmf,GAASnf,GAAM,CAAC,EAChBof,GAASpf,GAAM,CAAC,EAChBwd,GAAOxd,GAAM,CAAC,EAEpB,IAAK51F,GAAI,EAAGA,GAAI20G,EAAc30G,KAC5By0G,EAAKI,GAAOnuG,IAAM,EAAE,EAAIouG,GAAO5oG,GAAK,GAAK,GAAG,EAAI6oG,GAAO56F,GAAK,EAAI,GAAG,EAAI66F,GAAOt0B,GAAI,GAAG,EAAIp9E,EAAIsxG,EAAM,EACnGvpG,GAAKwpG,GAAO3oG,IAAM,EAAE,EAAI4oG,GAAO36F,GAAK,GAAK,GAAG,EAAI46F,GAAOr0B,IAAK,EAAI,GAAG,EAAIs0B,GAAOtuG,EAAI,GAAG,EAAIpD,EAAIsxG,GAAS,CAAC,EACvGF,EAAKG,GAAO16F,IAAM,EAAE,EAAI26F,GAAOp0B,IAAK,GAAK,GAAG,EAAIq0B,GAAOruG,GAAK,EAAI,GAAG,EAAIsuG,GAAO9oG,EAAI,GAAG,EAAI5I,EAAIsxG,GAAS,CAAC,EACvGl0B,GAAIm0B,GAAOn0B,KAAM,EAAE,EAAIo0B,GAAOpuG,GAAK,GAAK,GAAG,EAAIquG,GAAO7oG,GAAK,EAAI,GAAG,EAAI8oG,GAAO76F,EAAI,GAAG,EAAI7W,EAAIsxG,GAAS,CAAC,EACtGA,IAAU,EACVluG,EAAI+tG,EACJvoG,EAAIb,GACJ8O,EAAIu6F,EAGN,IAAK10G,GAAI,EAAGA,GAAI,EAAGA,KACjBw0G,GAAK,EAAI,CAACx0G,IAAK6c,CAAM,EAAIu2F,GAAK1sG,IAAM,EAAE,GAAK,GAAK0sG,GAAKlnG,GAAK,GAAK,GAAG,GAAK,GAAKknG,GAAKj5F,GAAK,EAAI,GAAG,GAAK,EAAIi5F,GAAK1yB,GAAI,GAAG,EAAIp9E,EAAIsxG,IAAQ,EAClIH,EAAK/tG,EACLA,EAAIwF,EACJA,EAAIiO,EACJA,EAAIumE,GACJA,GAAI+zB,CAEZ,CACA,CAaE,MAAMQ,UAAoB/hG,CAAO,CAC/B,aAAc,CACZ,MAAMA,CAAM,EACZ,KAAK,KAAO,CAAE,EACd,KAAK,MAAQ,EACb,KAAK,SAAW,IACtB,CAOI,aAAc,CACZ,KAAK,KAAK,QAAS,EACf,KAAK,KAAK,OACZ,KAAK,SAAW,WAAW,KAAK,YAAY,KAAK,IAAI,EAAG,KAAK,KAAK,EAElE,KAAK,SAAW,IAExB,CAOI,KAAKgiG,EAAK,CACR,KAAK,KAAK,KAAKA,CAAG,EACb,KAAK,WACR,KAAK,SAAW,WAAW,KAAK,YAAY,KAAK,IAAI,EAAG,KAAK,KAAK,EAE1E,CACA,CAaE,MAAMC,EAAO,SAAUC,EAAM,CAC3B,OAAOA,GAAQ,IAAMA,EAAO,QAAW,GAAKA,EAAO,WAAa,EAAIA,IAAS,EAC9E,EAeKnY,EAAU,SAAUoY,EAAW/xG,EAAKgyG,EAAY,CAEpD,MAAMC,EAAc,IAAI,WAAWF,EAAU,OAAQA,EAAU,WAAYA,EAAU,YAAc,CAAC,EAC9FG,EAAW,IAAI1B,EAAI,MAAM,UAAU,MAAM,KAAKxwG,CAAG,CAAC,EAElD+5F,EAAY,IAAI,WAAWgY,EAAU,UAAU,EAC/CI,EAAc,IAAI,WAAWpY,EAAU,MAAM,EAGnD,IAAIqY,EACAC,EACAC,EACAC,EACAzB,GACAC,EACAC,GACAC,EAEAuB,EASJ,IANAJ,EAAQJ,EAAW,CAAC,EACpBK,EAAQL,EAAW,CAAC,EACpBM,EAAQN,EAAW,CAAC,EACpBO,EAAQP,EAAW,CAAC,EAGfQ,EAAS,EAAGA,EAASP,EAAY,OAAQO,GAAU,EAGtD1B,GAAae,EAAKI,EAAYO,CAAM,CAAC,EACrCzB,EAAac,EAAKI,EAAYO,EAAS,CAAC,CAAC,EACzCxB,GAAaa,EAAKI,EAAYO,EAAS,CAAC,CAAC,EACzCvB,EAAaY,EAAKI,EAAYO,EAAS,CAAC,CAAC,EAEzCN,EAAS,QAAQpB,GAAYC,EAAYC,GAAYC,EAAYkB,EAAaK,CAAM,EAGpFL,EAAYK,CAAM,EAAIX,EAAKM,EAAYK,CAAM,EAAIJ,CAAK,EACtDD,EAAYK,EAAS,CAAC,EAAIX,EAAKM,EAAYK,EAAS,CAAC,EAAIH,CAAK,EAC9DF,EAAYK,EAAS,CAAC,EAAIX,EAAKM,EAAYK,EAAS,CAAC,EAAIF,CAAK,EAC9DH,EAAYK,EAAS,CAAC,EAAIX,EAAKM,EAAYK,EAAS,CAAC,EAAID,CAAK,EAE9DH,EAAQtB,GACRuB,EAAQtB,EACRuB,EAAQtB,GACRuB,EAAQtB,EAEV,OAAOlX,CACR,EAaD,MAAM0Y,CAAU,CACd,YAAYV,EAAW/xG,EAAKgyG,EAAYpmC,EAAM,CAC5C,MAAMxiE,EAAOqpG,EAAU,KACjBR,EAAc,IAAI,WAAWF,EAAU,MAAM,EAC7ChY,EAAY,IAAI,WAAWgY,EAAU,UAAU,EACrD,IAAIr1G,EAAI,EAIR,IAHA,KAAK,aAAe,IAAIi1G,EAExB,KAAK,aAAa,KAAK,KAAK,cAAcM,EAAY,SAASv1G,EAAGA,EAAI0M,CAAI,EAAGpJ,EAAKgyG,EAAYjY,CAAS,CAAC,EACnGr9F,EAAI0M,EAAM1M,EAAIu1G,EAAY,OAAQv1G,GAAK0M,EAC1C4oG,EAAa,IAAI,YAAY,CAACH,EAAKI,EAAYv1G,EAAI,CAAC,CAAC,EAAGm1G,EAAKI,EAAYv1G,EAAI,CAAC,CAAC,EAAGm1G,EAAKI,EAAYv1G,EAAI,CAAC,CAAC,EAAGm1G,EAAKI,EAAYv1G,EAAI,CAAC,CAAC,CAAC,CAAC,EACrI,KAAK,aAAa,KAAK,KAAK,cAAcu1G,EAAY,SAASv1G,EAAGA,EAAI0M,CAAI,EAAGpJ,EAAKgyG,EAAYjY,CAAS,CAAC,EAG1G,KAAK,aAAa,KAAK,UAAY,CAEjCnuB,EAAK,KAAM4jC,EAAMzV,CAAS,CAAC,CACnC,CAAO,CACP,CAOI,WAAW,MAAO,CAEhB,MAAO,KACb,CAKI,cAAcgY,EAAW/xG,EAAKgyG,EAAYjY,EAAW,CACnD,OAAO,UAAY,CACjB,MAAMriF,EAAQiiF,EAAQoY,EAAW/xG,EAAKgyG,CAAU,EAChDjY,EAAU,IAAIriF,EAAOq6F,EAAU,UAAU,CAC1C,CACP,CACA,CACE,IAAIzkC,EAAiB,OAAO,WAAe,IAAc,WAAa,OAAO,OAAW,IAAc,OAAS,OAAO,OAAW,IAAc,OAAS,OAAO,KAAS,IAAc,KAAO,CAAE,EAC3LzyE,EACA,OAAO,OAAW,IACpBA,EAAM,OACG,OAAOyyE,EAAmB,IACnCzyE,EAAMyyE,EACG,OAAO,KAAS,IACzBzyE,EAAM,KAENA,EAAM,CAAE,EAEV,IAAIE,EAAWF,EACX0c,EAAoB,SAA2B/b,EAAK,CACtD,OAAI,YAAY,SAAW,WAClB,YAAY,OAAOA,CAAG,EAExBA,GAAOA,EAAI,kBAAkB,WACrC,EACGmc,EAAS5c,EAAS,QAAU,OAC/B4c,EAAO,KAAK,EAAGA,EAAO,OAAO,EAAGA,EAAO,SAAS,EAAGA,EAAO,WAAW,EAAGA,EAAO,aAAa,EAAGA,EAAO,eAAe,EAAGA,EAAO,iBAAiB,EAAGA,EAAO,mBAAmB,EAAGA,EAAO,qBAAqB,EAC5M,UAAY,CACX,IAAIvU,EAAI,IAAI,YAAY,CAAC,KAAM,CAAC,EAC5BwF,EAAI,IAAI,WAAWxF,EAAE,OAAQA,EAAE,WAAYA,EAAE,UAAU,EAC3D,OAAIwF,EAAE,CAAC,IAAM,IACJ,MAELA,EAAE,CAAC,IAAM,IACJ,SAEF,SACX,EAAM,EAYJ,MAAM69D,EAA4B,SAAUlkE,EAAS,CACnD,MAAMmkE,EAAe,CAAE,EACvB,cAAO,KAAKnkE,CAAO,EAAE,QAAQvC,GAAO,CAClC,MAAMb,EAAQoD,EAAQvC,CAAG,EACrBuX,EAAkBpY,CAAK,EACzBunE,EAAa1mE,CAAG,EAAI,CAClB,MAAOb,EAAM,OACb,WAAYA,EAAM,WAClB,WAAYA,EAAM,UACnB,EAEDunE,EAAa1mE,CAAG,EAAIb,CAE5B,CAAK,EACMunE,CACR,EASD,KAAK,UAAY,SAAUr1D,EAAO,CAChC,MAAM3H,EAAO2H,EAAM,KACb0gG,EAAY,IAAI,WAAWroG,EAAK,UAAU,MAAOA,EAAK,UAAU,WAAYA,EAAK,UAAU,UAAU,EACrG1J,EAAM,IAAI,YAAY0J,EAAK,IAAI,MAAOA,EAAK,IAAI,WAAYA,EAAK,IAAI,WAAa,CAAC,EAClF8+F,EAAK,IAAI,YAAY9+F,EAAK,GAAG,MAAOA,EAAK,GAAG,WAAYA,EAAK,GAAG,WAAa,CAAC,EAGpF,IAAI+oG,EAAUV,EAAW/xG,EAAKwoG,EAAI,SAAU5sG,EAAK8b,EAAO,CACtD,KAAK,YAAY+uD,EAA0B,CACzC,OAAQ/8D,EAAK,OACb,UAAWgO,CACnB,CAAO,EAAG,CAACA,EAAM,MAAM,CAAC,CACxB,CAAK,CAEF,CACH,CAAC,CAAC,EAEF,IAAI+6F,GAAYzlC,GAAQuiC,EAAU,EASlC,MAAMmD,GAAkB5kF,GAAc,CACpC,IAAIwoB,EAAOxoB,EAAW,QAAU,OAAS,cACzC,OAAIA,EAAW,iBAAmBA,EAAW,gBAAgB,QAAQ,sCAAsC,GAAK,IAC9GwoB,EAAO,aAEFA,CACT,EAWMq8D,GAAc,CAACC,EAAe34F,IAAc,CAChD24F,EAAc,MAAO,EACrBA,EAAc,MAAO,EACjB34F,GAAaA,EAAU,uBACzBA,EAAU,qBAAqB,MAAO,EACtCA,EAAU,qBAAuB,KAErC,EAWM44F,GAAe,CAACC,EAAgB74F,IAAc,CAGlDA,EAAU,qBAAuB64F,EACjCA,EAAe,KAAM,CACvB,EAiBMC,GAAiB,CAAC71G,EAAM+G,IAAa,IAAM,CAC/C,KAAM,CACJ,eAAgB,CACd,CAAC/G,CAAI,EAAG01G,EACR,KAAMI,CACP,EACD,WAAY,CACV,CAAC91G,CAAI,EAAG+c,CACd,CACA,EAAMhW,EACEgvG,EAAch5F,EAAU,YAAa,EACrCi5F,EAAcj5F,EAAU,eAAgB,EACxCk5F,EAAuBl5F,EAAU,qBACjCm5F,EAAYn5F,EAAU,WAE5B,GAAI,EAAAi5F,GAAeE,GAAaF,EAAY,KAAOE,EAAU,MAG7Dn5F,EAAU,WAAai5F,EACvBj5F,EAAU,WAAag5F,EACvBN,GAAYC,EAAe34F,CAAS,EAChC,GAACi5F,GAAeA,EAAY,iBAIhC,IAAI,CAACA,EAAY,eAAgB,CAC3BC,GAKFH,EAAkB,gBAAiB,EAErC,MACD,CAEDJ,EAAc,aAAc,EAC5BC,GAAaK,EAAY,eAAgBj5F,CAAS,EACpD,EACMo5F,GAAkB,CAACn2G,EAAM+G,IAAa,IAAM,CAChD,KAAM,CACJ,eAAgB,CACd,CAAC/G,CAAI,EAAG01G,CACT,EACD,WAAY,CACV,CAAC11G,CAAI,EAAG+c,CACd,CACA,EAAMhW,EACJgW,EAAU,WAAa,KACvB24F,EAAc,MAAO,EACrBA,EAAc,MAAO,CACvB,EAgBMU,GAAiB,CAACp2G,EAAM+G,IAAa,IAAM,CAC/C,KAAM,CACJ,mBAAAonE,EACA,eAAgB,CACd,CAACnuE,CAAI,EAAG01G,EACR,KAAMI,CACP,EACD,WAAY,CACV,CAAC91G,CAAI,EAAG+c,CACd,CACA,EAAMhW,EACEgvG,EAAch5F,EAAU,YAAa,EACrCi5F,EAAcj5F,EAAU,eAAgB,EACxCk5F,EAAuBl5F,EAAU,qBACjCs5F,EAAYt5F,EAAU,WAE5B,GAAI,EAAAs5F,GAAaN,GAAeM,EAAU,KAAON,EAAY,MAG7Dh5F,EAAU,WAAai5F,EACvBj5F,EAAU,WAAag5F,EACvBN,GAAYC,EAAe34F,CAAS,EAChC,EAACi5F,GAIL,IAAIA,EAAY,eAAgB,CAE9B,GAAI,CAACD,GAAe,CAACM,GAAaN,EAAY,KAAOM,EAAU,GAC7D,OAEF,MAAMC,EAAKvvG,EAAS,IAAI,oBAClB8gG,EAAcyO,EAAG,iBAEvB,GAAIA,EAAG,MAAO,IAAKzO,EACjB,OAEF9qF,EAAU,QAAQ,2CAA2Cs5F,EAAU,EAAE,OAAON,EAAY,EAAE,EAAE,EAChG5nC,EAAmB,MAAO,EAC1B2nC,EAAkB,gBAAiB,EACnCQ,EAAG,mBAAmBzO,CAAW,EACjC,MACJ,CACE,GAAI7nG,IAAS,QAAS,CACpB,GAAI,CAACg2G,EAAY,eAAgB,CAI/BF,EAAkB,SAAS,EAAI,EAG/BA,EAAkB,gBAAiB,EACnC,MACD,CAIDJ,EAAc,SAAS,EAAI,EAC3BI,EAAkB,SAAS,EAAK,CACpC,CACE,GAAIG,IAAyBD,EAAY,eAAgB,CAIvDL,GAAaK,EAAY,eAAgBj5F,CAAS,EAClD,MACJ,CACM24F,EAAc,OAEhBA,EAAc,MAAMK,CAAW,EAGjCL,EAAc,gBAAiB,EAC/BC,GAAaK,EAAY,eAAgBj5F,CAAS,EACpD,EACMmwF,GAAU,CAcd,MAAO,CAACltG,EAAM+G,IAAa,IAAM,CAC/B,KAAM,CACJ,WAAY,CACV,CAAC/G,CAAI,EAAG+c,CACT,EACD,gBAAAw5F,CACD,EAAGxvG,EAEEgvG,EAAch5F,EAAU,YAAa,EACrCi5F,EAAcj5F,EAAU,YAAa,EACrC6H,GAAMoxF,EAAY,OAAOnlF,GAASA,EAAM,OAAO,EAAE,CAAC,GAAKmlF,EAAY,CAAC,GAAG,GACvEQ,EAAez5F,EAAU,OAAO6H,CAAE,EACxC,GAAImxF,IAAgBS,EAAc,CAGhCD,EAAgB,CACd,MAAO,CACL,QAAS,sDACnB,CACA,CAAO,EACD,MACN,CACI56C,EAAQ,IAAI,KAAK,kFAAuF,EACxG,UAAW+oB,KAAW3nE,EAAU,OAC9BA,EAAU,OAAO2nE,CAAO,EAAE,QAAU3nE,EAAU,OAAO2nE,CAAO,IAAM8xB,EAEpEz5F,EAAU,eAAgB,CAC3B,EAaD,UAAW,CAAC/c,EAAM+G,IAAa,IAAM,CACnC,KAAM,CACJ,WAAY,CACV,CAAC/G,CAAI,EAAG+c,CAChB,CACA,EAAQhW,EACJ40D,EAAQ,IAAI,KAAK,0EAA+E,EAChG,MAAMnyD,EAAQuT,EAAU,YAAa,EACjCvT,IACFA,EAAM,KAAO,YAEfuT,EAAU,eAAgB,CAC9B,CACA,EACM05F,GAAiB,CAYrB,MAAO,CAACz2G,EAAM41G,EAAgB7uG,IAAa,CACzC,GAAI,CAAC6uG,EAEH,OAEF,KAAM,CACJ,KAAAvhE,EACA,eAAAqiE,EACA,eAAgB,CACd,CAAC12G,CAAI,EAAG01G,CAChB,CACA,EAAQ3uG,EACJ6uG,EAAe,GAAG,iBAAkB,IAAM,CACxC,MAAMrgF,EAAQqgF,EAAe,MAAO,EACpCF,EAAc,SAASngF,EAAOmhF,CAAc,GAGxC,CAACriE,EAAK,UAAY9e,EAAM,SAAW8e,EAAK,QAAS,IAAK,SACxDqhE,EAAc,KAAM,CAE5B,CAAK,EACDE,EAAe,GAAG,iBAAkB,IAAM,CACxCF,EAAc,SAASE,EAAe,MAAO,EAAEc,CAAc,EAExDriE,EAAK,UACRqhE,EAAc,KAAM,CAE5B,CAAK,EACDE,EAAe,GAAG,QAAS1I,GAAQltG,CAAI,EAAEA,EAAM+G,CAAQ,CAAC,CACzD,EAYD,UAAW,CAAC/G,EAAM41G,EAAgB7uG,IAAa,CAC7C,KAAM,CACJ,KAAAstC,EACA,eAAAqiE,EACA,eAAgB,CACd,CAAC12G,CAAI,EAAG01G,CACT,EACD,WAAY,CACV,CAAC11G,CAAI,EAAG+c,CAChB,CACA,EAAQhW,EACJ6uG,EAAe,GAAG,iBAAkB,IAAM,CACxC,MAAMrgF,EAAQqgF,EAAe,MAAO,EACpCF,EAAc,SAASngF,EAAOmhF,CAAc,EAC5ChB,EAAc,MAAM34F,EAAU,YAAa,CAAA,GAGvC,CAACs3B,EAAK,UAAY9e,EAAM,SAAW8e,EAAK,QAAS,IAAK,SACxDqhE,EAAc,KAAM,CAE5B,CAAK,EACDE,EAAe,GAAG,iBAAkB,IAAM,CACxCF,EAAc,SAASE,EAAe,MAAO,EAAEc,CAAc,EAExDriE,EAAK,UACRqhE,EAAc,KAAM,CAE5B,CAAK,EACDE,EAAe,GAAG,QAAS1I,GAAQltG,CAAI,EAAEA,EAAM+G,CAAQ,CAAC,CAC5D,CACA,EACM4vG,GAAa,CAUjB,MAAS,CAAC32G,EAAM+G,IAAa,CAC3B,KAAM,CACJ,IAAA++D,EACA,WAAAkhC,EACA,eAAgB,CACd,CAAChnG,CAAI,EAAG01G,CACT,EACD,eAAAgB,EACA,KAAM,CACJ,YAAAE,CACD,EACD,WAAY,CACV,CAAC52G,CAAI,EAAG,CACN,OAAAsG,EACA,OAAAsvC,EACA,QAAAihE,CACV,CACO,EACD,mBAAA1oC,CACN,EAAQpnE,EACE87D,EAAgBnwC,GAAYy7C,EAAmB,IAAI,GAErD,CAACyoC,EAAY52G,CAAI,GAAK,OAAO,KAAK42G,EAAY52G,CAAI,CAAC,EAAE,SAAW,KAClE42G,EAAY52G,CAAI,EAAI,CAClB,KAAM,CACJ,QAAS,CACP,QAAS,EACrB,CACA,CACO,EACG6iE,IACF+zC,EAAY52G,CAAI,EAAE,KAAK,QAAQ,UAAYmuE,EAAmB,KAAK,YAGvE,UAAWrL,KAAW8zC,EAAY52G,CAAI,EAAG,CAClCsG,EAAOw8D,CAAO,IACjBx8D,EAAOw8D,CAAO,EAAI,CAAE,GAEtB,UAAWg0C,KAAgBF,EAAY52G,CAAI,EAAE8iE,CAAO,EAAG,CACrD,IAAIlyC,EAAagmF,EAAY52G,CAAI,EAAE8iE,CAAO,EAAEg0C,CAAY,EACpDlB,EAwBJ,GAvBI/yC,GACFg0C,EAAQ,gBAAgB/zC,CAAO,YAAYg0C,CAAY,sBAAsB,EAC7ElmF,EAAW,eAAiB,GAC5BglF,EAAiB,MAER5O,IAAe,YAAcp2E,EAAW,UACjDglF,EAAiB,IAAI/vC,GAAej1C,EAAW,UAAU,CAAC,EAAGk1C,EAAK4wC,CAAc,EACvE9lF,EAAW,YACpBglF,EAAiB,IAAI/vC,GAAej1C,EAAW,YAAak1C,EAAK4wC,CAAc,EAEtE9lF,EAAW,WAAao2E,IAAe,OAChD4O,EAAiB,IAAI3nC,GAAmBr9C,EAAW,UAAU,CAAC,EAAGk1C,EAAK4wC,EAAgBvoC,CAAkB,EAIxGynC,EAAiB,KAEnBhlF,EAAa9D,GAAM,CACjB,GAAIgqF,EACJ,eAAAlB,CACD,EAAEhlF,CAAU,EACb6lF,GAAez2G,CAAI,EAAEA,EAAM4wB,EAAW,eAAgB7pB,CAAQ,EAC9DT,EAAOw8D,CAAO,EAAE,KAAKlyC,CAAU,EAC3B,OAAOglB,EAAOkhE,CAAY,EAAM,IAAa,CAC/C,MAAMttG,EAAQ,IAAImyD,EAAQ,WAAW,CACnC,GAAIm7C,EACJ,KAAMtB,GAAgB5kF,CAAU,EAChC,QAAS,GACT,SAAUA,EAAW,SACrB,QAASA,EAAW,QACpB,MAAOkmF,CACnB,CAAW,EACDlhE,EAAOkhE,CAAY,EAAIttG,CACjC,CACA,CACK,CAEDksG,EAAc,GAAG,QAASxI,GAAQltG,CAAI,EAAEA,EAAM+G,CAAQ,CAAC,CACxD,EAUD,UAAa,CAAC/G,EAAM+G,IAAa,CAC/B,KAAM,CACJ,KAAAstC,EACA,IAAAyxB,EACA,WAAAkhC,EACA,eAAgB,CACd,CAAChnG,CAAI,EAAG01G,CACT,EACD,eAAAgB,EACA,KAAM,CACJ,YAAAE,CACD,EACD,WAAY,CACV,CAAC52G,CAAI,EAAG,CACN,OAAAsG,EACA,OAAAsvC,CACV,CACO,EACD,mBAAAu4B,CACN,EAAQpnE,EACJ,UAAW+7D,KAAW8zC,EAAY52G,CAAI,EAAG,CAClCsG,EAAOw8D,CAAO,IACjBx8D,EAAOw8D,CAAO,EAAI,CAAE,GAEtB,UAAWg0C,KAAgBF,EAAY52G,CAAI,EAAE8iE,CAAO,EAAG,CACrD,GAAI,CAACgD,EAAI,SAAS,oBAAsB8wC,EAAY52G,CAAI,EAAE8iE,CAAO,EAAEg0C,CAAY,EAAE,OAS/E,SAEF,IAAIlmF,EAAagmF,EAAY52G,CAAI,EAAE8iE,CAAO,EAAEg0C,CAAY,EACpDlB,EACJ,GAAI5O,IAAe,MACjB4O,EAAiB,IAAI/vC,GAAej1C,EAAW,YAAak1C,EAAK4wC,CAAc,UACtE1P,IAAe,OAAQ,CAEhC,GAAI,CADcp2E,EAAW,UAAU,OAAO9kB,GAAKA,EAAE,eAAiB,GAAQ,EAC/D,OACb,OAEF8pG,EAAiB,IAAI3nC,GAAmBr9C,EAAW,UAAU,CAAC,EAAGk1C,EAAK4wC,EAAgBvoC,CAAkB,CAClH,MAAmB64B,IAAe,aACxB4O,EAAiB,IAAI/vC,GAGrBj1C,EAAW,UAAYA,EAAW,UAAU,CAAC,EAAIA,EAAW,YAAak1C,EAAK4wC,CAAc,GAQ9F,GANA9lF,EAAa9D,GAAM,CACjB,GAAIgqF,EACJ,eAAAlB,CACD,EAAEhlF,CAAU,EACb6lF,GAAez2G,CAAI,EAAEA,EAAM4wB,EAAW,eAAgB7pB,CAAQ,EAC9DT,EAAOw8D,CAAO,EAAE,KAAKlyC,CAAU,EAC3B,OAAOglB,EAAOkhE,CAAY,EAAM,IAAa,CAC/C,MAAMttG,EAAQ6qC,EAAK,mBAAmB,CACpC,GAAIyiE,EACJ,KAAM,YACN,QAASlmF,EAAW,SAAWA,EAAW,WAC1C,SAAUA,EAAW,SACrB,MAAOkmF,CACnB,EAAa,EAAK,EAAE,MACVlhE,EAAOkhE,CAAY,EAAIttG,CACjC,CACA,CACK,CAEDksG,EAAc,GAAG,QAASxI,GAAQltG,CAAI,EAAEA,EAAM+G,CAAQ,CAAC,CACxD,EAUD,kBAAmB,CAAC/G,EAAM+G,IAAa,CACrC,KAAM,CACJ,KAAAstC,EACA,KAAM,CACJ,YAAAuiE,CACD,EACD,WAAY,CACV,CAAC52G,CAAI,EAAG,CACN,OAAAsG,EACA,OAAAsvC,CACV,CACA,CACA,EAAQ7uC,EACJ,UAAW+7D,KAAW8zC,EAAY52G,CAAI,EAAG,CAClCsG,EAAOw8D,CAAO,IACjBx8D,EAAOw8D,CAAO,EAAI,CAAE,GAEtB,UAAWg0C,KAAgBF,EAAY52G,CAAI,EAAE8iE,CAAO,EAAG,CACrD,MAAMlyC,EAAagmF,EAAY52G,CAAI,EAAE8iE,CAAO,EAAEg0C,CAAY,EAE1D,GAAI,CAAC,kBAAkB,KAAKlmF,EAAW,UAAU,EAC/C,SAEF,MAAM4C,EAAkB6gB,EAAK,SAAS,KAAOA,EAAK,SAAS,IAAI,iBAAmB,CAAE,EACpF,IAAIozB,EAAW,CACb,MAAOqvC,EACP,SAAUlmF,EAAW,SACrB,WAAYA,EAAW,WACvB,QAASA,EAAW,SAAWA,EAAW,UAC3C,EAYD,GAXI4C,EAAgBi0C,EAAS,UAAU,IACrCA,EAAW36C,GAAM26C,EAAUj0C,EAAgBi0C,EAAS,UAAU,CAAC,GAE7DA,EAAS,UAAY,QACvB,OAAOA,EAAS,QAIlBnhE,EAAOw8D,CAAO,EAAE,KAAKh2C,GAAM,CACzB,GAAIgqF,CACL,EAAElmF,CAAU,CAAC,EACV,OAAOglB,EAAOkhE,CAAY,EAAM,IAAa,CAC/C,MAAMttG,EAAQ6qC,EAAK,mBAAmB,CACpC,GAAIozB,EAAS,WACb,KAAM,WACN,QAASA,EAAS,QAClB,SAAUA,EAAS,SACnB,MAAOA,EAAS,KAC5B,EAAa,EAAK,EAAE,MACV7xB,EAAOkhE,CAAY,EAAIttG,CACjC,CACA,CACA,CACA,CACA,EACMutG,GAAa,CAAC35F,EAAMmY,IAAU,CAClC,QAAS/1B,EAAI,EAAGA,EAAI4d,EAAK,OAAQ5d,IAI/B,GAHI8hE,GAAc/rC,EAAOnY,EAAK5d,CAAC,CAAC,GAG5B4d,EAAK5d,CAAC,EAAE,WAAau3G,GAAW35F,EAAK5d,CAAC,EAAE,UAAW+1B,CAAK,EAC1D,MAAO,GAGX,MAAO,EACT,EAgBMygF,GAAc,CAACh2G,EAAM+G,IAAayC,GAAS,CAC/C,KAAM,CACJ,mBAAA2kE,EACA,WAAY,CACV,CAACnuE,CAAI,EAAG,CACN,OAAAsG,CACR,CACA,CACA,EAAMS,EACEwuB,EAAQ44C,EAAmB,MAAO,EACxC,GAAI,CAAC54C,EACH,OAAO,KAET,IAAIyhF,EAAW,KAEXzhF,EAAM,WAAWv1B,CAAI,IACvBg3G,EAAW1wG,EAAOivB,EAAM,WAAWv1B,CAAI,CAAC,GAE1C,MAAMi3G,EAAY,OAAO,KAAK3wG,CAAM,EACpC,GAAI,CAAC0wG,EAIH,GAAIh3G,IAAS,SAAWi3G,EAAU,OAAS,GAAKvkF,GAAY3rB,EAAS,IAAI,EACvE,QAASvH,EAAI,EAAGA,EAAIy3G,EAAU,OAAQz3G,IAAK,CACzC,MAAM03G,EAAoB5wG,EAAO2wG,EAAUz3G,CAAC,CAAC,EAC7C,GAAIu3G,GAAWG,EAAmB3hF,CAAK,EAAG,CACxCyhF,EAAWE,EACX,KACV,CACO,MACQ5wG,EAAO,KAChB0wG,EAAW1wG,EAAO,KACT2wG,EAAU,SAAW,IAC9BD,EAAW1wG,EAAO2wG,EAAU,CAAC,CAAC,GAGlC,OAAI,OAAOztG,EAAU,IACZwtG,EAELxtG,IAAU,MAAQ,CAACwtG,EAGd,KAEFA,EAAS,OAAO39D,GAASA,EAAM,KAAO7vC,EAAM,EAAE,EAAE,CAAC,GAAK,IAC/D,EACMusG,GAAc,CAalB,MAAO,CAAC/1G,EAAM+G,IAAa,IAAM,CAC/B,KAAM,CACJ,WAAY,CACV,CAAC/G,CAAI,EAAG,CACN,OAAA41C,CACV,CACA,CACA,EAAQ7uC,EACJ,UAAW6d,KAAMgxB,EACf,GAAIA,EAAOhxB,CAAE,EAAE,QACb,OAAOgxB,EAAOhxB,CAAE,EAGpB,OAAO,IACR,EAaD,UAAW,CAAC5kB,EAAM+G,IAAa,IAAM,CACnC,KAAM,CACJ,WAAY,CACV,CAAC/G,CAAI,EAAG,CACN,OAAA41C,CACV,CACA,CACA,EAAQ7uC,EACJ,UAAW6d,KAAMgxB,EACf,GAAIA,EAAOhxB,CAAE,EAAE,OAAS,WAAagxB,EAAOhxB,CAAE,EAAE,OAAS,SACvD,OAAOgxB,EAAOhxB,CAAE,EAGpB,OAAO,IACX,CACA,EACMuyF,GAAiB,CAACn3G,EAAM,CAC5B,WAAAqY,CACF,IAAM,IAAM,CACV,MAAM++F,EAAe/+F,EAAWrY,CAAI,EAAE,YAAa,EACnD,OAAKo3G,EAGE/+F,EAAWrY,CAAI,EAAE,YAAYo3G,CAAY,EAFvC,IAGX,EAwBMC,GAAmBtwG,GAAY,CACnC,CAAC,QAAS,YAAa,iBAAiB,EAAE,QAAQ/G,GAAQ,CACxD22G,GAAW32G,CAAI,EAAEA,EAAM+G,CAAQ,CACnC,CAAG,EACD,KAAM,CACJ,WAAAsR,EACA,mBAAA81D,EACA,KAAA95B,EACA,IAAAyxB,EACA,eAAgB,CACd,CAAC,OAAO,EAAGwxC,EACX,KAAMxB,CACZ,CACG,EAAG/uG,EAEJ,CAAC,QAAS,WAAW,EAAE,QAAQ/G,GAAQ,CACrCqY,EAAWrY,CAAI,EAAE,YAAcg2G,GAAYh2G,EAAM+G,CAAQ,EACzDsR,EAAWrY,CAAI,EAAE,YAAc+1G,GAAY/1G,CAAI,EAAEA,EAAM+G,CAAQ,EAC/DsR,EAAWrY,CAAI,EAAE,eAAiB61G,GAAe71G,EAAM+G,CAAQ,EAC/DsR,EAAWrY,CAAI,EAAE,gBAAkBm2G,GAAgBn2G,EAAM+G,CAAQ,EACjEsR,EAAWrY,CAAI,EAAE,eAAiBo2G,GAAep2G,EAAM+G,CAAQ,EAC/DsR,EAAWrY,CAAI,EAAE,eAAiBm3G,GAAen3G,EAAM+G,CAAQ,CACnE,CAAG,EAGD,MAAMuS,EAAajB,EAAW,MAAM,YAAa,EACjD,GAAIiB,EAAY,CACd,MAAMwpD,GAAWxpD,EAAW,OAAOuX,GAASA,EAAM,OAAO,EAAE,CAAC,GAAKvX,EAAW,CAAC,GAAG,GAChFjB,EAAW,MAAM,OAAOyqD,CAAO,EAAE,QAAU,GAC3CzqD,EAAW,MAAM,eAAgB,EACjCA,EAAW,MAAM,eAAgB,EACRA,EAAW,MAAM,eAAc,EAIlC,gBAKpBy9F,EAAkB,SAAS,EAAK,EAChCwB,EAAmB,SAAS,EAAI,GAJhCxB,EAAkB,SAAS,EAAI,CAMrC,CACE3nC,EAAmB,GAAG,cAAe,IAAM,CACzC,CAAC,QAAS,WAAW,EAAE,QAAQnuE,GAAQqY,EAAWrY,CAAI,EAAE,gBAAgB,CAC5E,CAAG,EACDmuE,EAAmB,GAAG,gBAAiB,IAAM,CAC3C,CAAC,QAAS,WAAW,EAAE,QAAQnuE,GAAQqY,EAAWrY,CAAI,EAAE,iBAAiB,CAC7E,CAAG,EAED,MAAMu3G,EAAsB,IAAM,CAChCl/F,EAAW,MAAM,eAAgB,EACjCg8B,EAAK,QAAQ,CACX,KAAM,QACN,KAAM,kBACZ,CAAK,CACF,EACDA,EAAK,YAAa,EAAC,iBAAiB,SAAUkjE,CAAmB,EACjEljE,EAAK,iBAAgB,EAAG,iBAAiB,SAAUh8B,EAAW,UAAU,cAAc,EACtFytD,EAAI,GAAG,UAAW,IAAM,CACtBzxB,EAAK,YAAa,EAAC,oBAAoB,SAAUkjE,CAAmB,EACpEljE,EAAK,iBAAgB,EAAG,oBAAoB,SAAUh8B,EAAW,UAAU,cAAc,CAC7F,CAAG,EAEDg8B,EAAK,YAAY,OAAO,EACxB,UAAWzvB,KAAMvM,EAAW,MAAM,OAChCg8B,EAAK,YAAW,EAAG,SAASh8B,EAAW,MAAM,OAAOuM,CAAE,CAAC,CAE3D,EAUM4yF,GAAmB,IAAM,CAC7B,MAAMn/F,EAAa,CAAE,EACrB,OAAC,QAAS,YAAa,iBAAiB,EAAE,QAAQrY,GAAQ,CACxDqY,EAAWrY,CAAI,EAAI,CACjB,OAAQ,CAAE,EACV,OAAQ,CAAE,EACV,qBAAsB,KACtB,YAAagD,GACb,YAAaA,GACb,eAAgBA,GAChB,eAAgBA,GAChB,eAAgBA,GAChB,WAAY,KACZ,QAAS85D,GAAO,eAAe98D,CAAI,GAAG,CACvC,CACL,CAAG,EACMqY,CACT,EAaA,MAAMo/F,EAAiB,CACrB,aAAc,CACZ,KAAK,UAAY,CAAE,EACnB,KAAK,eAAiB,IAAI,GAC9B,CACE,IAAI,QAAQz8F,EAAQ,CAEdA,IAAW,IACb,KAAK,SAAWA,EAEtB,CACE,IAAI,IAAIm4B,EAAS,CAEf,KAAK,KAAOA,GAAW,GAC3B,CACE,IAAI,UAAUhwC,EAAK,CACbA,IAEF,KAAK,WAAagP,GAAW,KAAK,WAAYhP,CAAG,EAEvD,CACE,IAAI,SAASG,EAAO,CAEdA,GAASA,EAAM,SACjB,KAAK,UAAYA,EAEvB,CACE,IAAI,cAAcA,EAAO,CAEnBA,GAASA,EAAM,SACjB,KAAK,eAAiB,IAAI,IAAIA,EAAM,IAAI4tD,GAAS,CAACA,EAAM,GAAIA,CAAK,CAAC,CAAC,EAEzE,CACE,IAAI,SAAU,CACZ,OAAO,KAAK,QAChB,CACE,IAAI,KAAM,CACR,OAAO,KAAK,IAChB,CACE,IAAI,WAAY,CACd,OAAO,KAAK,UAChB,CACE,IAAI,UAAW,CACb,OAAO,KAAK,SAChB,CACE,IAAI,eAAgB,CAClB,OAAO,KAAK,cAChB,CACA,CAWA,MAAMwmD,WAAkC/7C,EAAQ,WAAY,CAC1D,YAAY53D,EAAKm9D,EAAW,CAC1B,MAAO,EACP,KAAK,eAAiB,KACtB,KAAK,eAAiB,KACtB,KAAK,iBAAmB,GACxB,KAAK,mBAAqB,IAAI,IAC9B,KAAK,iBAAmB,IAAIu2C,GAC5B,KAAK,gBAAkB,KACvB,KAAK,cAAgB,KACrB,KAAK,YAAc,KACnB,KAAK,SAAW,KAChB,KAAK,qBAAuB,IAAI,IAChC,KAAK,kBAAoB,IAAI,IAC7B,KAAK,6BAA+B,IAAI,IACxC,KAAK,QAAU36C,GAAO,kBAAkB,EACxC,KAAK,KAAO/4D,EACZ,KAAK,cAAgBm9D,CACzB,CAQE,oBAAoB9uD,EAASulG,EAAa,CACxC,KAAK,cAAgBA,EAAY,UAAY,MAAQ,OAErD,MAAMC,EAAcD,EAAY,WAAaA,EAAY,UACzD,GAAI,CAACC,EAAa,CAChB,KAAK,QAAQ,4BAA4BA,CAAW,qCAAqC,EACzF,KAAK,QAAQ,OAAO,EACpB,MACD,CAED,GAAIA,EAAY,WAAW,OAAO,EAAG,CACnC,KAAK,uBAAuBA,EAAY,UAAUA,EAAY,QAAQ,GAAG,EAAI,CAAC,CAAC,EAC/E,MACD,CAED,KAAK,iBAAiB,UAAYzlG,GAAWC,EAASwlG,CAAW,EAEjE,KAAK,eAAiBD,EAAY,WAAaA,EAAY,uBAE3D,KAAK,iBAAmBA,EAAY,iBACpC,KAAK,gBAAkBA,EAAY,eAI/B,KAAK,gBAAkB,CAAC,KAAK,kBAC/B,KAAK,QAAQ,kBAAkB,CAErC,CAUE,wBAAwB/0E,EAAS,CAC/B,MAAMi1E,EAAY,KAAK,iBAAiB,UACxC,GAAI,CAACA,EACH,OAKF,MAAM10G,EAAMy/B,EAAUi1E,EAAY,KAAK,cAAcA,CAAS,EAE9D,GAAI,CAAC10G,EAAK,CACR,KAAK,QAAQ,qEAAqE,EAClF,KAAK,QAAQ,OAAO,EACpB,KAAK,QAAS,EACd,MACN,CACI,MAAMkjE,EAAW,CACf,oBAAqB,CACnB,IAAAljE,CACR,CACK,EACD,KAAK,QAAQ,CACX,KAAM,2BACN,SAAAkjE,CACN,CAAK,EACD,KAAK,SAAW,KAAK,KAAK,CACxB,IAAAljE,EACA,YAAa,2BACnB,EAAO,CAAC1E,EAAOq5G,IAAc,CACvB,GAAIr5G,EAAO,CAKT,GAAIq5G,EAAU,SAAW,IAAK,CAC5B,KAAK,QAAQ,wBAAwBr5G,CAAK,GAAG,EAC7C,KAAK,QAAQ,sDAAsD0E,CAAG,gBAAgB,EACtF,KAAK,6BAA6B,IAAIA,CAAG,EACzC,MACD,CAID,GAAI20G,EAAU,SAAW,IAAK,CAC5B,MAAMC,EAAeD,EAAU,gBAAgB,aAAa,EAC5D,KAAK,QAAQ,wBAAwBr5G,CAAK,GAAG,EAC7C,KAAK,QAAQ,kCAAkCs5G,CAAY,WAAW,EACtE,KAAK,iBAAiB,SAASA,EAAc,EAAE,CAAC,EAChD,MACD,CAKD,KAAK,QAAQ,2BAA2Bt5G,CAAK,GAAG,EAChD,KAAK,iBAAkB,EACvB,MACR,CACM,KAAK,QAAQ,CACX,KAAM,8BACN,SAAA4nE,CACR,CAAO,EACD,IAAI2xC,EACJ,GAAI,CACFA,EAAuB,KAAK,MAAM,KAAK,SAAS,YAAY,CAC7D,OAAQld,EAAY,CACnB,MAAMl3B,EAAgB,CACpB,UAAWjI,EAAQ,MAAM,oCACzB,MAAOm/B,CACR,EACD,KAAK,QAAQ,CACX,KAAM,QACN,SAAUl3B,CACpB,CAAS,CACT,CACM,KAAK,0BAA0Bo0C,CAAoB,EACnD,MAAMC,EAAiB,CACrB,oBAAqB5xC,EAAS,oBAC9B,wBAAyB,CACvB,QAAS,KAAK,iBAAiB,QAC/B,UAAW,KAAK,iBAAiB,UACjC,SAAU,KAAK,iBAAiB,QAC1C,CACO,EACD,KAAK,QAAQ,CACX,KAAM,wBACN,SAAU4xC,CAClB,CAAO,EACD,KAAK,iBAAkB,CAC7B,CAAK,CACL,CAQE,mBAAmBC,EAAa,CAC9B,MAAMC,EAAoB,IAAI12E,EAAS,IAAIy2E,CAAW,EAChDE,EAAuB,IAAI32E,EAAS,IAAI,KAAK,eAAe,EAClE,OAAA22E,EAAqB,aAAa,IAAI,MAAO,UAAUD,EAAkB,SAAQ,CAAE,CAAC,EAC7E,KAAK,mBAAmBC,EAAqB,SAAQ,CAAE,CAClE,CAOE,uBAAuBC,EAAS,CAC9B,MAAML,EAAuB,KAAK,MAAMv2E,EAAS,KAAK42E,CAAO,CAAC,EAC9D,KAAK,0BAA0BL,CAAoB,CACvD,CAUE,mBAAmBlmG,EAAK,CACtB,MAAMwmG,EAAY,IAAI72E,EAAS,IAAI3vB,CAAG,EAChCE,EAAO,KAAK,WAAY,EACxBumG,EAAoB,KAAK,cAAe,EAC9C,GAAIvmG,EAAM,CACR,MAAMwmG,EAAa,IAAI,KAAK,aAAa,WACzCF,EAAU,aAAa,IAAIE,EAAYxmG,CAAI,CACjD,CACI,GAAIumG,EAAmB,CACrB,MAAME,EAAgB,IAAI,KAAK,aAAa,cAC5CH,EAAU,aAAa,IAAIG,EAAeF,CAAiB,CACjE,CACI,OAAOD,EAAU,SAAU,CAC/B,CAOE,0BAA0BI,EAAc,CAEtC,GADA,KAAK,iBAAiB,QAAUA,EAAa,QACzC,CAAC,KAAK,iBAAiB,QAAS,CAClC,KAAK,QAAQ,uBAAuBA,EAAa,OAAO,2BAA2B,EACnF,KAAK,QAAQ,OAAO,EACpB,MACN,CACI,KAAK,iBAAiB,IAAMA,EAAa,IACzC,KAAK,iBAAiB,UAAYA,EAAa,YAAY,EAE3D,KAAK,iBAAiB,SAAWA,EAAa,kBAAkB,GAAKA,EAAa,2BAA2B,EAG7G,KAAK,iBAAiB,cAAgBA,EAAa,gBAAgB,EACnE,KAAK,kBAAoB,KAAK,iBAAiB,cAS1C,KAAK,mBAAmB,OAC3B,KAAK,QAAQ,gFAAgF,EAC7F,KAAK,QAAQ,OAAO,EACpB,KAAK,QAAS,GAWhB,MAAMC,GAToBC,GAAsB,CAC9C,UAAW5mG,KAAQ4mG,EACjB,GAAI,KAAK,mBAAmB,IAAI5mG,CAAI,EAClC,OAAOA,EAIX,MAAO,CAAC,GAAG,KAAK,kBAAkB,EAAE,CAAC,CACtC,GACqC,KAAK,iBAAiB,QAAQ,EAChE,KAAK,iBAAmB2mG,IAC1B,KAAK,eAAiBA,EACtB,KAAK,QAAQ,kBAAkB,EAErC,CAOE,YAAa,CACX,OAAO,KAAK,gBAAkB,KAAK,cACvC,CAUE,cAAcd,EAAW,CACvB,GAAI,CAACA,EACH,OAAO,KAET,MAAMn3C,EAAav9D,GAAO,KAAK,6BAA6B,IAAIA,CAAG,EACnE,GAAI,KAAK,gBAAiB,CACxB,MAAM01G,EAAW,KAAK,mBAAmBhB,CAAS,EAClD,GAAI,CAACn3C,EAAWm4C,CAAQ,EACtB,OAAOA,CAEf,CACI,MAAMC,EAAc,KAAK,mBAAmBjB,CAAS,EACrD,OAAKn3C,EAAWo4C,CAAW,EAIpB,KAHEA,CAIb,CAQE,iBAAiBC,EAAM,KAAK,iBAAiB,IAAK,CAEhD,MAAMC,EAAQD,EAAM,IACpB,KAAK,YAAct3E,EAAS,WAAW,IAAM,CAC3C,KAAK,wBAAyB,CAC/B,EAAEu3E,CAAK,CACZ,CAKE,kBAAmB,CACjBv3E,EAAS,aAAa,KAAK,WAAW,EACtC,KAAK,YAAc,IACvB,CAKE,OAAQ,CACF,KAAK,UACP,KAAK,SAAS,MAAO,EAEvB,KAAK,SAAW,IACpB,CAKE,SAAU,CACR,KAAK,IAAI,kBAAkB,EAC3B,KAAK,IAAI,OAAO,EAChB,KAAK,MAAO,EACZ,KAAK,iBAAkB,EACvB,KAAK,eAAiB,KACtB,KAAK,eAAiB,KACtB,KAAK,iBAAmB,KACxB,KAAK,gBAAkB,KACvB,KAAK,cAAgB,KACrB,KAAK,YAAc,KACnB,KAAK,SAAW,KAChB,KAAK,6BAA+B,IAAI,IACxC,KAAK,mBAAqB,IAAI,IAC9B,KAAK,iBAAmB,IAAIg2E,EAChC,CAOE,oBAAoB7wC,EAAS,CACvBA,GACF,KAAK,mBAAmB,IAAIA,CAAO,CAEzC,CAKE,wBAAyB,CACvB,KAAK,mBAAmB,MAAO,CACnC,CAKE,eAAeA,EAAS,CACtB,OAAO,KAAK,mBAAmB,OAAOA,CAAO,CACjD,CASE,iBAAiBx1D,EAAS6nG,EAAQ,CAChC,MAAO,CAACA,GAAU,KAAK,iBAAiB,WAAaA,IAAW9mG,GAAWf,EAAS6nG,EAAO,SAAS,IAAM,KAAK,iBAAiB,WAAaA,EAAO,yBAA2B,KAAK,gBAAkBA,EAAO,mBAAqB,KAAK,kBAAoBA,EAAO,iBAAmB,KAAK,gBAC9R,CACE,sBAAuB,CACrB,OAAO,KAAK,kBAChB,CACA,CACA,MAAMC,GAAgC,GACtC,IAAIC,GAGJ,MAAMC,GAAc,CAAC,gBAAiB,uBAAwB,wBAAyB,uBAAwB,wBAAyB,wBAAyB,cAAc,EACzKC,GAAgB,SAAUC,EAAM,CACpC,OAAO,KAAK,oBAAoBA,CAAI,EAAI,KAAK,mBAAmBA,CAAI,CACtE,EACMC,GAAsB,SAAU,CACpC,gBAAAC,EACA,SAAA1lE,EACA,YAAAoR,EACA,aAAAu0D,EACA,mBAAAC,EACA,oBAAAC,EACA,SAAAzrF,EACA,eAAA0rF,EACA,IAAAz4E,CACF,EAAG,CAED,GAAI,CAACs4E,EACH,OAAA99C,EAAQ,IAAI,KAAK,iEAAiE,EAC3E,GAET,MAAMk+C,EAAgB,mBAAmBL,GAAmBA,EAAgB,IAAM,MAAM,OAAOC,EAAa,EAAE,GAC9G,GAAI,CAACD,EACH,OAAAr4E,EAAI,GAAG04E,CAAa,iCAAiC,EAC9C,GAGT,GAAIJ,EAAa,KAAOD,EAAgB,GACtC,MAAO,GAGT,MAAMM,EAAa,EAAQx8C,GAAUxpB,EAAUoR,CAAW,EAAE,OAK5D,GAAI,CAACs0D,EAAgB,QAGnB,MAAI,CAACM,GAAc,OAAON,EAAgB,oBAAuB,UAC/Dr4E,EAAI,OAAO04E,CAAa,wEAAwE,EACzF,KAET14E,EAAI,GAAG04E,CAAa,8BAA8B,EAC3C,IAET,MAAME,EAAgB17C,GAAYvqB,EAAUoR,CAAW,EACjD80D,EAAwBJ,EAAiBpqC,GAAO,uCAAyCA,GAAO,0BAGtG,GAAIthD,EAAW8rF,EACb,OAAA74E,EAAI,GAAG04E,CAAa,sCAAsC3rF,CAAQ,MAAM8rF,CAAqB,GAAG,EACzF,GAET,MAAMC,EAAgBR,EAAa,WAAW,UACxCS,EAAgBV,EAAgB,WAAW,UAGjD,GAAIS,EAAgBC,IAAkB,CAACN,GAAkBG,EAAgBJ,GAAsB,CAC7F,IAAIQ,EAAU,GAAGN,CAAa,2CAA2CI,CAAa,MAAMC,CAAa,IACzG,OAAIN,IACFO,GAAW,6CAA6CJ,CAAa,MAAMJ,CAAmB,KAEhGx4E,EAAIg5E,CAAO,EACJ,EACR,CAGD,IAAK,CAACP,GAAkBK,EAAgBC,IAAkBH,GAAiBL,EAAoB,CAC7F,IAAIS,EAAU,GAAGN,CAAa,4CAA4CE,CAAa,OAAOL,CAAkB,IAChH,OAAIE,IACFO,GAAW,4CAA4CF,CAAa,MAAMC,CAAa,KAEzF/4E,EAAIg5E,CAAO,EACJ,EACX,CACE,OAAAh5E,EAAI,OAAO04E,CAAa,+BAA+B,EAChD,EACT,EAWA,MAAMO,WAA2Bz+C,EAAQ,WAAY,CACnD,YAAY56D,EAAS,CACnB,MAAO,EACP,KAAM,CACJ,IAAAwd,EACA,gBAAAo5B,EACA,KAAAtD,EACA,UAAA6sB,EACA,UAAAm5C,EACA,WAAAC,EACA,0BAAAC,EACA,yBAAAC,EACA,WAAAxT,EACA,oBAAAyT,EACA,eAAAb,EACA,uBAAAc,EACA,gBAAAlnF,CACN,EAAQzyB,EACJ,GAAI,CAACwd,EACH,MAAM,IAAI,MAAM,8DAA8D,EAEhF,GAAI,CACF,mBAAAo8F,CACN,EAAQ55G,GACA45G,IAAuB,MAAQ,OAAOA,EAAuB,OAC/DA,EAAqB,KAEvBxB,GAAQkB,EACR,KAAK,eAAiB,EAAQT,EAC9B,KAAK,uBAAyB,EAAQc,EACtC,KAAK,gBAAkB/iE,EACvB,KAAK,MAAQtD,EACb,KAAK,KAAOA,EAAK,IACjB,KAAK,QAAUtzC,EAAQ,QACvB,KAAK,YAAcimG,EACnB,KAAK,YAAcsT,EACnB,KAAK,0BAA4BC,EACjC,KAAK,mBAAqBI,EAC1B,KAAK,yBAA2BH,EAC5B,KAAK,cACP,KAAK,cAAgB,KAAK,MAAM,aAAa,WAAY,SAAS,EAClE,KAAK,cAAc,gCAAkC,IAEvD,KAAK,gBAAkB,CACrB,gBAAA7iE,EACA,mBAAAgjE,EACA,QAAS,IACV,EACD,KAAK,GAAG,QAAS,KAAK,YAAY,EAClC,KAAK,YAAcnD,GAAkB,EACrC,KAAK,YAAc,IAAI/1E,EAAS,YAChC,KAAK,sBAAwB,KAAK,sBAAsB,KAAK,IAAI,EACjE,KAAK,kBAAoB,KAAK,kBAAkB,KAAK,IAAI,EACzD,KAAK,mBAAqB,KAAK,mBAAmB,KAAK,IAAI,EAC3D,KAAK,YAAY,iBAAiB,iBAAkB,KAAK,qBAAqB,EAE9E,KAAK,YAAY,iBAAiB,aAAc,KAAK,iBAAiB,EACtE,KAAK,YAAY,iBAAiB,cAAe,KAAK,kBAAkB,EAGxE,KAAK,UAAYs7B,GAAkB,EACnC,KAAK,WAAa,GAClB,KAAK,gBAAkB,IAAIo0C,GAAepwG,CAAO,EACjD,KAAK,sBAAwBszC,EAAK,mBAAmB,CACnD,KAAM,WACN,MAAO,kBACb,EAAO,EAAK,EAAE,MACV,KAAK,WAAa,IAAIkhE,GACtB,KAAK,eAAiB,IAAI7H,GAAc,KAAK,WAAW,EACxD,KAAK,kBAAoB,CAAE,EAC3B,KAAK,0BAA4B,IAAIyE,GACrC,KAAK,cAAgB,IAAI,IACzB,MAAMyI,EAAwB,CAC5B,IAAK,KAAK,KACV,iBAAkB75G,EAAQ,iBAC1B,yBAA0BA,EAAQ,yBAClC,gBAAAyyB,EACA,YAAa,KAAK,YAClB,YAAa,KAAK,MAAM,YAAY,KAAK,KAAK,KAAK,EACnD,SAAU,IAAM,KAAK,SAAU,EAC/B,QAAS,IAAM,KAAK,MAAM,QAAS,EACnC,SAAU,IAAM,KAAK,SAAU,EAC/B,UAAW,IAAM,KAAK,WACtB,iBAAkB,IAAM,KAAK,iBAAkB,EAC/C,UAAA0tC,EACA,eAAgB,KAAK,gBACrB,UAAW,KAAK,WAChB,WAAY,KAAK,YACjB,iBAAkB,KAAK,kBACvB,oBAAAu5C,EACA,cAAe,KAAK,eACpB,yBAA0B,KAAK,0BAC/B,qBAAsB15G,EAAQ,qBAC9B,uBAAwB,KAAK,uBAAuB,KAAK,IAAI,CACnE,EAKI,KAAK,oBAAsB,KAAK,cAAgB,OAAS,IAAIktE,GAAmB1vD,EAAK,KAAK,KAAMuO,GAAM,KAAK,gBAAiB,CAC1H,uBAAwB,KAAK,uBAAuB,KAAK,IAAI,CACnE,CAAK,CAAC,EAAI,IAAI+4C,GAAetnD,EAAK,KAAK,KAAMuO,GAAM,KAAK,gBAAiB,CACnE,yBAA0B,KAAK,0BAA0B,KAAK,IAAI,CACxE,CAAK,CAAC,EACF,KAAK,kCAAiC,EAGtC,KAAK,mBAAqB,IAAIw6E,GAAcx6E,GAAM8tF,EAAuB,CACvE,qBAAsB,KAAK,sBAC3B,WAAY,MAClB,CAAK,EAAG75G,CAAO,EAEX,KAAK,oBAAsB,IAAIumG,GAAcx6E,GAAM8tF,EAAuB,CACxE,WAAY,OACb,CAAA,EAAG75G,CAAO,EACX,KAAK,uBAAyB,IAAImtG,GAAiBphF,GAAM8tF,EAAuB,CAC9E,WAAY,MACZ,yBAA0B,KAAK,MAAM,yBACrC,UAAW,IAAM,IAAI,QAAQ,CAACtlD,EAASU,IAAW,CAChD,SAAS6kD,GAAS,CAChBxmE,EAAK,IAAI,aAAc64D,CAAO,EAC9B53C,EAAS,CACnB,CACQ,SAAS43C,GAAU,CACjB74D,EAAK,IAAI,cAAewmE,CAAM,EAC9B7kD,EAAQ,CAClB,CACQ3hB,EAAK,IAAI,cAAewmE,CAAM,EAC9BxmE,EAAK,IAAI,aAAc64D,CAAO,EAE9B74D,EAAK,iBAAkB,CACxB,CAAA,CACF,CAAA,EAAGtzC,CAAO,EACX,MAAM+5G,EAAe,IACZ,KAAK,mBAAmB,UAEjC,KAAK,2BAA6B,IAAIpD,GAA0B,KAAK,KAAK,IAAKoD,CAAY,EAC3F,KAAK,6BAA8B,EAC/B,KAAK,iBACP,KAAK,oBAAoB,IAAI,iBAAkB,IAAM,KAAK,gBAAgB,EAC1E,KAAK,MAAM,GAAG,QAAS,IAAM,KAAK,eAAe,EACjD,KAAK,MAAM,GAAG,OAAQ,IAAM,KAAK,gBAAgB,GAUnD1B,GAAY,QAAQE,GAAQ,CAC1B,KAAKA,EAAO,GAAG,EAAID,GAAc,KAAK,KAAMC,CAAI,CACtD,CAAK,EACD,KAAK,QAAUx8C,GAAO,IAAI,EAC1B,KAAK,mBAAqB,GACtB,KAAK,MAAM,QAAO,IAAO,QAC3B,KAAK,YAAc,IAAM,CACvB,KAAK,YAAc,KACnB,KAAK,oBAAoB,KAAM,CAChC,EACD,KAAK,MAAM,IAAI,OAAQ,KAAK,WAAW,GAEvC,KAAK,oBAAoB,KAAM,EAEjC,KAAK,mBAAqB,GAC1B,KAAK,0BAA4B,GACjC,KAAK,2BAA6B,GAClC,MAAM3oD,EAAQ,KAAK,MAAM,QAAO,IAAO,OAAS,OAAS,YAEzD,KAAK,MAAM,IAAIA,EAAO,IAAM,CAC1B,MAAM4mG,EAAwB,KAAK,IAAK,EACxC,KAAK,MAAM,IAAI,aAAc,IAAM,CACjC,KAAK,mBAAqB,KAAK,IAAK,EAAGA,EACvC,KAAK,0BAA4B,KAAK,mBAAmB,aACzD,KAAK,2BAA6B,KAAK,oBAAoB,YACnE,CAAO,CACP,CAAK,CACL,CACE,0BAA2B,CACzB,OAAO,KAAK,yBAChB,CACE,2BAA4B,CAC1B,OAAO,KAAK,0BAChB,CACE,sBAAuB,CACrB,MAAM97C,EAAO,KAAK,yBAA0B,EACtC0iB,EAAQ,KAAK,0BAA2B,EAC9C,OAAI1iB,IAAS,IAAM0iB,IAAU,GACpB,GAEF1iB,EAAO0iB,CAClB,CACE,mBAAoB,CAClB,OAAO,KAAK,kBAChB,CAQE,UAAUtvC,EAAS,MAAO,CACxB,MAAMonE,EAAe,KAAK,eAAgB,EACtCA,GAAgB,KAAK,qBAAqBA,CAAY,GACxD,KAAK,aAAaA,EAAcpnE,CAAM,CAE5C,CACE,aAAaxiB,EAAUluB,EAAO6kE,EAAO,CACnC,MAAMrB,EAAW,KAAK,MAAO,EACvB2iC,EAAQ3iC,IAAaA,EAAS,IAAMA,EAAS,KAC7C61C,EAAQnrF,IAAaA,EAAS,IAAMA,EAAS,KACnD,GAAIi4E,GAASA,IAAUkT,EAAO,CAC5B,KAAK,QAAQ,gBAAgBlT,CAAK,OAAOkT,CAAK,SAASr5G,CAAK,EAAE,EAC9D,MAAM0kE,EAAW,CACf,cAAe,CACb,GAAI20C,EACJ,UAAWnrF,EAAS,WAAW,UAC/B,WAAYA,EAAS,WAAW,WAChC,OAAQA,EAAS,WAAW,MAC7B,EACD,MAAAluB,CACD,EACD,KAAK,QAAQ,CACX,KAAM,oBACN,SAAA0kE,CACR,CAAO,EACD,KAAK,MAAM,QAAQ,CACjB,KAAM,QACN,KAAM,wBAAwB1kE,CAAK,EAC3C,CAAO,CACP,CACI,KAAK,oBAAoB,MAAMkuB,EAAU22C,CAAK,CAClD,CAWE,oCAAqC,CACnC,CAAC,QAAS,YAAa,iBAAiB,EAAE,QAAQxmE,GAAQ,CACxD,MAAM+c,EAAY,KAAK,YAAY/c,CAAI,EACjCg2G,EAAcj5F,EAAYA,EAAU,YAAa,EAAG,KACpD6pD,EAAU,KAAK,2BAA2B,WAAY,EAC5D,GAAIovC,GAAepvC,EAAS,CAG1B,MAAMq0C,GADiBjF,EAAY,OAASA,EAAY,CAAC,EAAE,UAAYA,EAAY,WACzC,OAAOlqG,GAAKA,EAAE,WAAW,kBAAoB86D,CAAO,EAE1Fq0C,EAAmB,QACrB,KAAK,YAAYj7G,CAAI,EAAE,qBAAqB,MAAMi7G,EAAmB,CAAC,CAAC,CAEjF,CACA,CAAK,CACL,CAOE,gBAAiB,CACf,KAAK,cAAe,EACpB,KAAK,UAAYx5E,EAAS,YAAY,IAAM,KAAK,UAAW,EAAE,GAAG,CACrE,CAOE,eAAgB,CAGV,KAAK,MAAM,WAAa,KAAK,MAAM,cAGvCA,EAAS,cAAc,KAAK,SAAS,EACrC,KAAK,UAAY,KACrB,CAOE,yBAA0B,CACxB,MAAMw9B,EAAO,KAAK,KAAM,EAClBi8C,EAAmBj8C,GAAQA,EAAK,WAAa,CAAA,EAInD,GAAI,CAACA,GAAQ,CAACA,EAAK,aAAe,CAACA,EAAK,YAAY,MAClD,OAAOi8C,EAET,MAAM15C,EAAQvC,EAAK,YAAY,MACzBg4C,EAAY,OAAO,KAAKz1C,CAAK,EACnC,IAAIh4D,EAEJ,GAAI,OAAO,KAAK,KAAK,YAAY,MAAM,MAAM,EAAE,OAC7CA,EAAQ,KAAK,YAAY,MAAM,YAAW,MACrC,CAEL,MAAM2xG,EAAe35C,EAAM,MAAQy1C,EAAU,QAAUz1C,EAAMy1C,EAAU,CAAC,CAAC,EACzE,UAAWnmF,KAASqqF,EAClB,GAAIA,EAAarqF,CAAK,EAAE,QAAS,CAC/BtnB,EAAQ,CACN,MAAAsnB,CACD,EACD,KACV,CAEK,CAED,GAAI,CAACtnB,EACH,OAAO0xG,EAET,MAAMzqF,EAAY,CAAA,EAGlB,UAAWI,KAAS2wC,EAClB,GAAIA,EAAM3wC,CAAK,EAAErnB,EAAM,KAAK,EAAG,CAC7B,MAAMonB,EAAa4wC,EAAM3wC,CAAK,EAAErnB,EAAM,KAAK,EAC3C,GAAIonB,EAAW,WAAaA,EAAW,UAAU,OAC/CH,EAAU,KAAK,MAAMA,EAAWG,EAAW,SAAS,UAC3CA,EAAW,IACpBH,EAAU,KAAKG,CAAU,UAChBquC,EAAK,UAAU,OAIxB,QAASz/D,EAAI,EAAGA,EAAIy/D,EAAK,UAAU,OAAQz/D,IAAK,CAC9C,MAAMqwB,EAAWovC,EAAK,UAAUz/D,CAAC,EAC7BqwB,EAAS,YAAcA,EAAS,WAAW,OAASA,EAAS,WAAW,QAAUgB,GACpFJ,EAAU,KAAKZ,CAAQ,CAErC,CAEA,CAEI,OAAKY,EAAU,OAGRA,EAFEyqF,CAGb,CAQE,mCAAoC,CAClC,KAAK,oBAAoB,GAAG,iBAAkB,IAAM,CAClD,MAAM3lF,EAAQ,KAAK,oBAAoB,MAAO,EACxC6lF,EAAiB7lF,EAAM,eAAiB,IAAM,IAGhD6rC,GAAyB,KAAK,oBAAoB,KAAM,KAAK,oBAAoB,MAAK,CAAE,EAC1F,KAAK,gBAAgB,QAAU,EAE/B,KAAK,gBAAgB,QAAUg6C,EAI7B7lF,EAAM,SAAW,KAAK,MAAM,QAAS,IAAK,SAC5C,KAAK,mBAAmB,SAASA,EAAO,KAAK,eAAe,EAC5D,KAAK,mBAAmB,KAAM,GAEhC8hF,GAAiB,CACf,WAAY,KAAK,YACjB,eAAgB,CACd,MAAO,KAAK,oBACZ,UAAW,KAAK,uBAChB,KAAM,KAAK,kBACZ,EACD,KAAM,KAAK,MACX,eAAgB,KAAK,gBACrB,mBAAoB,KAAK,oBACzB,IAAK,KAAK,KACV,KAAM,KAAK,KAAM,EACjB,WAAY,KAAK,YACjB,gBAAiB,KAAK,gBAAgB,KAAK,IAAI,CACvD,CAAO,EACD,KAAK,sBAAsB,KAAK,KAAI,EAAI9hF,CAAK,EAC7C,KAAK,eAAgB,EACjB,CAAC,KAAK,YAAY,MAAM,sBAAwB,KAAK,YAAY,MAAM,qBAAqB,QAC9F,KAAK,QAAQ,sBAAsB,EAKnC,KAAK,YAAY,MAAM,qBAAqB,IAAI,iBAAkB,IAAM,CACtE,KAAK,QAAQ,sBAAsB,CAC7C,CAAS,CAET,CAAK,EACD,KAAK,oBAAoB,GAAG,iBAAkB,IAAM,CAC9C,KAAK,aACP,KAAK,MAAM,IAAI,OAAQ,KAAK,WAAW,EAEzC,IAAI0xC,EAAkB,KAAK,oBAAoB,MAAO,EACtD,GAAI,CAACA,EAAiB,CAEpB,KAAK,gCAAiC,EACtC,KAAK,+BAA8B,EAGnC,KAAK,4BAA6B,EAClC,IAAIo0C,EAmBJ,GAlBI,KAAK,2BACPA,EAAgB,KAAK,sBAAuB,GAEzCA,IACHA,EAAgB,KAAK,eAAgB,GAEnC,CAACA,GAAiB,CAAC,KAAK,qBAAqBA,CAAa,IAG9D,KAAK,cAAgBA,EACrB,KAAK,aAAa,KAAK,cAAe,SAAS,EAQ3C,EADmB,KAAK,cAAgB,YAAc,KAAK,cAAc,WAE3E,OAEFp0C,EAAkB,KAAK,aAC/B,CACM,KAAK,2BAA2BA,CAAe,CACrD,CAAK,EACD,KAAK,oBAAoB,GAAG,QAAS,IAAM,CACzC,MAAMxoE,EAAQ,KAAK,oBAAoB,MACvC,KAAK,gBAAgB,CACnB,kBAAmBA,EAAM,SACzB,MAAAA,CACR,CAAO,CACP,CAAK,EACD,KAAK,oBAAoB,GAAG,gBAAiB,IAAM,CACjD,KAAK,mBAAmB,MAAO,EAC/B,KAAK,mBAAmB,MAAO,CACrC,CAAK,EACD,KAAK,oBAAoB,GAAG,cAAe,IAAM,CAC/C,MAAM82B,EAAQ,KAAK,oBAAoB,MAAO,EACxC6lF,EAAiB7lF,EAAM,eAAiB,IAAM,IAGhD6rC,GAAyB,KAAK,oBAAoB,KAAM,KAAK,oBAAoB,MAAK,CAAE,EAC1F,KAAK,gBAAgB,QAAU,EAE/B,KAAK,gBAAgB,QAAUg6C,EAE7B,KAAK,cAAgB,QAEvB,KAAK,oBAAoB,KAAM,EAMjC,KAAK,mBAAmB,MAAO,EAC/B,KAAK,mBAAmB,SAAS7lF,EAAO,KAAK,eAAe,EACxD,KAAK,uCACP,KAAK,sBAAuB,EAE5B,KAAK,mBAAmB,KAAM,EAEhC,KAAK,MAAM,QAAQ,CACjB,KAAM,cACN,QAAS,EACjB,CAAO,CACP,CAAK,EACD,KAAK,oBAAoB,GAAG,oBAAqB,IAAM,CACrD,MAAM0xC,EAAkB,KAAK,oBAAoB,MAAK,EAItD,GAAIA,EAAgB,qBAAuB,qBACzC,OAEuB,KAAK,oBAAoBA,CAAe,IAM/D,KAAK,gBAAgB,CACnB,MAAO,CACL,QAAS,+BACT,OAAQ,oBACpB,CACA,CAAS,EAED,KAAK,MAAM,QAAQ,eAAe,EAE1C,CAAK,EACD,KAAK,oBAAoB,GAAG,oBAAqB,IAAM,CACrD,KAAK,MAAM,QAAQ,CACjB,KAAM,QACN,KAAM,wBACd,CAAO,CACP,CAAK,EACD,KAAK,oBAAoB,GAAG,mBAAoB,IAAM,CACpD,KAAK,MAAM,QAAQ,CACjB,KAAM,QACN,KAAM,uBACd,CAAO,CACP,CAAK,EAC4B,CAAC,uBAAwB,0BAA2B,qBAAsB,wBAAyB,uBAAwB,0BAA2B,qBAAsB,wBAAyB,oBAAqB,kBAAkB,EACpP,QAAQtW,GAAa,CACxC,KAAK,oBAAoB,GAAGA,EAAW0V,GAAY,CAEjD,KAAK,QAAQ,QAAQ1nE,GAAS,CAAE,EAAE0nE,CAAQ,CAAC,CACnD,CAAO,CACP,CAAK,CACL,CAWE,2BAA2BY,EAAiB,CACtC,KAAK,aACP,KAAK,cAAcA,CAAe,EAMpC,KAAK,mBAAmB,MAAO,EAC/B,KAAK,mBAAmB,SAASA,EAAiB,KAAK,eAAe,EAClE,KAAK,wCACP,KAAK,sBAAuB,EAE9B,KAAK,eAAe,CAACA,EAAgB,OAAO,EAIvC,KAAK,MAAM,WACd,KAAK,mBAAmB,KAAM,EAC1B,KAAK,qBACP,KAAK,oBAAoB,KAAM,EAGvC,CAOE,sBAAsBhI,EAAM1pC,EAAO,CACjC,MAAMqhF,EAAc33C,EAAK,aAAe,CAAE,EAC1C,IAAIq8C,EAAiB,GACrB,MAAMC,EAAiB,OAAO,KAAK3E,EAAY,KAAK,EACpD,UAAW//F,KAAc+/F,EAAY,MACnC,UAAW9lF,KAAS8lF,EAAY,MAAM//F,CAAU,EAC3B+/F,EAAY,MAAM//F,CAAU,EAAEia,CAAK,EACtC,MACdwqF,EAAiB,IAInBA,GACF,KAAK,MAAM,QAAQ,CACjB,KAAM,QACN,KAAM,aACd,CAAO,EAEC,OAAO,KAAK1E,EAAY,SAAS,EAAE,QACrC,KAAK,MAAM,QAAQ,CACjB,KAAM,QACN,KAAM,YACd,CAAO,EAECuC,GAAM,SAAS,MAAM5jF,CAAK,GAC5B,KAAK,MAAM,QAAQ,CACjB,KAAM,QACN,KAAM,SACd,CAAO,EAECgmF,EAAe,QAAU,OAAO,KAAK3E,EAAY,MAAM2E,EAAe,CAAC,CAAC,CAAC,EAAE,OAAS,GACtF,KAAK,MAAM,QAAQ,CACjB,KAAM,QACN,KAAM,qBACd,CAAO,EAEC,KAAK,aACP,KAAK,MAAM,QAAQ,CACjB,KAAM,QACN,KAAM,uBACd,CAAO,CAEP,CACE,qBAAqB9B,EAAc,CACjC,MAAMD,EAAkB,KAAK,oBAAoB,MAAK,GAAM,KAAK,oBAAoB,cAC/Et0D,EAAc,KAAK,MAAM,YAAa,EACtCw0D,EAAqB,KAAK,mBAAoB,EAC9CC,EAAsB,KAAK,oBAAqB,EAChD7lE,EAAW,KAAK,MAAM,SAAU,EACtC,OAAOylE,GAAoB,CACzB,SAAAzlE,EACA,YAAAoR,EACA,gBAAAs0D,EACA,aAAAC,EACA,mBAAAC,EACA,oBAAAC,EACA,SAAU,KAAK,SAAU,EACzB,eAAgB,KAAK,eACrB,IAAK,KAAK,OAChB,CAAK,CACL,CAQE,8BAA+B,CAC7B,KAAK,mBAAmB,GAAG,kBAAmB,IAAM,CAGlD,KAAK,UAAU,iBAAiB,EAChC,KAAK,MAAM,QAAQ,iBAAiB,CAC1C,CAAK,EACD,KAAK,mBAAmB,GAAG,UAAW,IAAM,CACtC,KAAK,gBAKP,KAAK,mBAAmB,KAAM,CAEtC,CAAK,EAGI,KAAK,gBACR,KAAK,mBAAmB,GAAG,WAAY,IAAM,CAC3C,KAAK,QAAQ,UAAU,CAC/B,CAAO,EAEH,KAAK,mBAAmB,GAAG,QAAS,IAAM,CACxC,MAAMl7G,EAAQ,KAAK,mBAAmB,MAAO,EAC7C,KAAK,gBAAgB,CACnB,kBAAmBA,EAAM,SACzB,MAAAA,CACR,CAAO,CACP,CAAK,EACD,KAAK,mBAAmB,GAAG,cAAe,IAAM,CAC9C,KAAK,MAAQ,KAAK,mBAAmB,OACrC,KAAK,QAAQ,OAAO,CAC1B,CAAK,EACD,KAAK,mBAAmB,GAAG,iBAAkB,IAAM,CACjD,KAAK,kBAAmB,CAC9B,CAAK,EACD,KAAK,mBAAmB,GAAG,kBAAmB,IAAM,CAClD,KAAK,MAAM,QAAQ,CACjB,KAAM,QACN,KAAM,sBACd,CAAO,CACP,CAAK,EACD,KAAK,oBAAoB,GAAG,iBAAkB,IAAM,CAClD,KAAK,kBAAmB,CAC9B,CAAK,EACD,KAAK,oBAAoB,GAAG,cAAe,IAAM,CAC/C,KAAK,MAAQ,KAAK,oBAAoB,OACtC,KAAK,QAAQ,OAAO,CAC1B,CAAK,EACD,KAAK,mBAAmB,GAAG,QAAS,IAAM,CACxC,KAAK,QAAQ,2BAA2B,EACxC,KAAK,cAAe,CAC1B,CAAK,EACD,KAAK,mBAAmB,GAAG,aAAc0V,GAAS,CAE5C,KAAK,iBAGT,KAAK,iBAAiB,MAAO,CAAC,OAAO,CAAC,EACtC,KAAK,gBAAgB,CACnB,MAAO,CACL,QAAS,iGACV,EACD,0BAA2B+kG,EACnC,CAAO,EACP,CAAK,EACD,MAAMsC,EAAe,IAAM,CACzB,GAAI,CAAC,KAAK,eAAe,0BACvB,OAAO,KAAK,0BAA2B,EAEzC,MAAMxiG,EAAS,KAAK,sBAEfA,GAGL,KAAK,eAAe,yBAAyBA,CAAM,CACpD,EACD,KAAK,mBAAmB,GAAG,YAAawiG,CAAY,EACpD,KAAK,oBAAoB,GAAG,YAAaA,CAAY,EACrD,KAAK,mBAAmB,GAAG,OAAQ,IAAM,CAClC,KAAK,qBACR,KAAK,MAAM,QAAQ,CACjB,KAAM,QACN,KAAM,UAChB,CAAS,EACD,KAAK,mBAAqB,GAElC,CAAK,EACD,KAAK,oBAAoB,GAAG,OAAQ,IAAM,CACnC,KAAK,qBACR,KAAK,MAAM,QAAQ,CACjB,KAAM,QACN,KAAM,UAChB,CAAS,EACD,KAAK,mBAAqB,GAElC,CAAK,EACD,KAAK,oBAAoB,GAAG,QAAS,IAAM,CACzC,KAAK,QAAQ,0BAA0B,EACvC,KAAK,cAAe,CAC1B,CAAK,EAC2B,CAAC,kBAAmB,mBAAoB,gBAAiB,sBAAuB,yBAA0B,yBAA0B,4BAA6B,0BAA2B,6BAA8B,uCAAwC,wCAAyC,qBAAsB,cAAe,mBAAoB,iBAAkB,cAAc,EAC5Y,QAAQ7qD,GAAa,CACvC,KAAK,mBAAmB,GAAGA,EAAW0V,GAAY,CAChD,KAAK,QAAQ,QAAQ1nE,GAAS,CAAE,EAAE0nE,CAAQ,CAAC,CACnD,CAAO,EACD,KAAK,oBAAoB,GAAG1V,EAAW0V,GAAY,CACjD,KAAK,QAAQ,QAAQ1nE,GAAS,CAAE,EAAE0nE,CAAQ,CAAC,CACnD,CAAO,EACD,KAAK,uBAAuB,GAAG1V,EAAW0V,GAAY,CACpD,KAAK,QAAQ,QAAQ1nE,GAAS,CAAE,EAAE0nE,CAAQ,CAAC,CACnD,CAAO,CACP,CAAK,CACL,CACE,qBAAsB,CACpB,OAAO,KAAK,IAAI,KAAK,oBAAoB,mBAAqB,KAAK,mBAAmB,kBAAkB,CAC5G,CAKE,MAAO,CACL,KAAK,mBAAmB,KAAM,EAC1B,KAAK,YAAY,MAAM,sBACzB,KAAK,oBAAoB,KAAM,EAE7B,KAAK,YAAY,UAAU,sBAC7B,KAAK,uBAAuB,KAAM,CAExC,CAUE,mBAAmB9wC,EAAQ,KAAK,iBAAkB,CAChD,GAAIA,GAASA,IAAU,KAAK,oBAAoB,MAAK,EAAI,CACvD,KAAK,QAAQ,6DAA6D,EAC1E,MACN,CACI,KAAK,aAAaA,EAAO,cAAc,EAGvC,KAAK,uCAAyC,EAClD,CACE,uBAAwB,CACtB,KAAK,uCAAyC,GAO9C,KAAK,mBAAmB,MAAO,EAC/B,KAAK,mBAAmB,gBAAgB,IAAM,CAC5C,KAAK,MAAM,eAAe,KAAK,MAAM,YAAW,CAAE,CACxD,CAAK,CACL,CAKE,MAAO,CACL,GAAI,KAAK,iBACP,OAEE,KAAK,MAAM,SACb,KAAK,MAAM,eAAe,CAAC,EAEzB,KAAK,YACP,KAAK,KAAM,EAEb,MAAMw4B,EAAW,KAAK,MAAM,SAAQ,EAGpC,GAAI,KAAK,MAAM,SAAQ,IAAO,KACxB,KAAK,MAAM,YAAW,EAAKA,EAAS,MAAM,CAAC,EAC7C,OAAO,KAAK,MAAM,eAAeA,EAAS,IAAIA,EAAS,OAAS,CAAC,CAAC,CAG1E,CAME,gBAAiB,CACf,MAAMx4B,EAAQ,KAAK,oBAAoB,MAAK,EAM5C,GAAI,CAACA,GAAS,KAAK,MAAM,OAAQ,GAAI,KAAK,WACxC,MAAO,GAGT,GAAI,CAACA,EAAM,SAAWA,EAAM,MAAO,CACjC,MAAMw4B,EAAW,KAAK,SAAU,EAChC,GAAI,CAACA,EAAS,OAGZ,MAAO,GAET,MAAMzI,EAAcyI,EAAS,IAAI,CAAC,EAClC,IAAI0tD,EAAan2D,EACjB,GAAI/vB,EAAM,MAAO,CACf,MAAMlZ,EAASkZ,EAAM,MAAM,WACvBlZ,EAAS,EACXo/F,EAAa,KAAK,IAAIn2D,EAAcjpC,EAAQ0xC,EAAS,MAAM,CAAC,CAAC,EAE7D0tD,EAAa,KAAK,IAAIn2D,EAAajpC,CAAM,CAE5C,CAED,KAAK,QAAQ,WAAW,EAExB,KAAK,MAAM,eAAeo/F,CAAU,CAC1C,CACI,YAAK,WAAa,GAElB,KAAK,KAAM,EACJ,EACX,CAOE,mBAAoB,CAQlB,GAJA,KAAK,0BAAyB,EAI1B,KAAK,MAAM,WAAY,CACzB,MAAMx5D,EAAc,KAAK,MAAM,KAAI,EAG/B,OAAOA,EAAgB,KAAe,OAAOA,EAAY,MAAS,YACpEA,EAAY,KAAK,KAAMn9C,GAAK,CAAA,CAAE,CAEtC,CACI,KAAK,QAAQ,YAAY,CAC7B,CAOE,oBAAqB,CACnB,GAAI,CAAC,KAAK,kBAAkB,eAC1B,OAEF,MAAM+H,EAAO,KAAK,kBAAkB,eAAe,KACnD,GAAI,CAACA,GAAQ,CAACA,EAAK,OACjB,OAEF,MAAMqhB,EAAW,KAAK,SAAU,EAChCrhB,EAAKA,EAAK,OAAS,CAAC,EAAE,QAAU,MAAMqhB,CAAQ,GAAK,KAAK,IAAIA,CAAQ,IAAM,IAAW,OAAO,UAAYA,CAC5G,CAOE,uBAAwB,CACtB,KAAK,MAAM,QAAQ,gBAAgB,CACvC,CAUE,eAAgB,CACd,IAAI+8E,EAAgB,KAAK,mBAAmB,OAC5C,GAAI,KAAK,YAAY,MAAM,qBAAsB,CAC/C,MAAMyQ,EAAgB,KAAK,mBAAmB,qBAAoB,EAE9D,CAACA,GAAiBA,EAAc,SAIlCzQ,EAAgBA,GAAiB,KAAK,oBAAoB,OAG1DA,EAAgB,KAAK,oBAAoB,MAEjD,CACSA,IAGL,KAAK,cAAe,EACpB,KAAK,eAAe,YAAa,EACrC,CAQE,oBAAoBp7E,EAAU,CAE5B,GAAI,CADa,KAAK,SAAU,EAClB,OAEZ,MAAO,GAET,MAAMyvC,EAAU,KAAK,gBAAgB,eAAezvC,EAAU,KAAK,UAAU,EAC7E,GAAIyvC,IAAY,KACd,MAAO,GAIT,MAAMq8C,EAAsBxC,GAAM,SAAS,YAAYtpF,EAAUyvC,CAAO,EAClEpa,EAAc,KAAK,MAAM,YAAa,EACtCpR,EAAW,KAAK,MAAM,SAAU,EACtC,GAAI,CAACA,EAAS,OAEZ,OAAO6nE,EAAsBz2D,GAAeiY,GAE9C,MAAMpZ,EAAcjQ,EAAS,IAAIA,EAAS,OAAS,CAAC,EAGpD,OAAOiQ,EAAcmB,GAAeiY,IAAmBw+C,EAAsB53D,GAAeoZ,EAChG,CAaE,gBAAgB,CACd,kBAAAy+C,EAAoB,KAAK,oBAAoB,MAAO,EACpD,MAAAn9G,EAAQ,CAAE,EACV,0BAAA87G,CACJ,EAAK,CASD,GAJAqB,EAAoBA,GAAqB,KAAK,oBAAoB,MAAO,EACzErB,EAA4BA,GAA6B97G,EAAM,2BAA6B,KAAK,0BAG7F,CAACm9G,EAAmB,CACtB,KAAK,MAAQn9G,EACT,KAAK,YAAY,aAAe,OAClC,KAAK,QAAQ,OAAO,EAEpB,KAAK,eAAe,YAAY,SAAS,EAE3C,MACN,CACIm9G,EAAkB,kBAClB,MAAMnrF,EAAY,KAAK,oBAAoB,KAAK,UAC1CsxE,EAAmBtxE,EAAU,OAAOmwC,EAAS,EAC7C4N,EAAmBuzB,EAAiB,SAAW,GAAKA,EAAiB,CAAC,IAAM6Z,EAGlF,GAAInrF,EAAU,SAAW,GAAK8pF,IAA8B,IAC1D,OAAA5+C,EAAQ,IAAI,KAAK,qCAAqCigD,EAAkB,EAAE,+CAAoD,EAC9H,KAAK,MAAM,QAAQ,eAAe,EAE3B,KAAK,oBAAoB,KAAKptC,CAAgB,EAEvD,GAAIA,EAAkB,CAEpB,GAAI,KAAK,KAAM,EAAC,gBAAiB,CAC/B,MAAM5H,EAAU,KAAK,kBAAkBg1C,CAAiB,EAElDC,EAAiB,KAAK,2BAA2B,iBAAiB,IAAM,IAC9E,KAAK,2BAA2B,eAAej1C,CAAO,EACtD,KAAK,0BAA2B,EAChC,WAAW,IAAM,CACf,KAAK,2BAA2B,oBAAoBA,CAAO,CAC5D,EAAEi1C,CAAc,EACjB,MACD,CAKD,IAAIC,EAAa,GACjBrrF,EAAU,QAAQZ,GAAY,CAE5B,GAAIA,IAAa+rF,EACf,OAEF,MAAMG,EAAelsF,EAAS,aAE1B,OAAOksF,EAAiB,KAAeA,IAAiB,MAC1DD,EAAa,GACb,OAAOjsF,EAAS,aAE1B,CAAO,EACGisF,IACFngD,EAAQ,IAAI,KAAK,sGAA2G,EAI5H,KAAK,MAAM,QAAQ,eAAe,EAErC,CAED,IAAIogD,EACAH,EAAkB,gBAAkB,KAAK,mBAC3CG,EAAe,IAEfA,EAAe,KAAK,IAAK,EAAGxB,EAA4B,IAE1DqB,EAAkB,aAAeG,EAC7Bt9G,EAAM,SACRm9G,EAAkB,mBAAqBn9G,EAAM,QAE/C,KAAK,MAAM,QAAQ,iBAAiB,EACpC,KAAK,MAAM,QAAQ,CACjB,KAAM,QACN,KAAM,wBACZ,CAAK,EAKD,MAAMg7G,EAAe,KAAK,eAAgB,EAC1C,GAAI,CAACA,EAAc,CACjB,KAAK,MAAQ,yEACb,KAAK,QAAQ,OAAO,EACpB,MACN,CACI,MAAMra,EAAQ3gG,EAAM,SAAW,KAAK,QAAUk9D,EAAQ,IAAI,KACpDqgD,EAAev9G,EAAM,QAAU,IAAMA,EAAM,QAAU,GAC3D2gG,EAAM,GAAG3gG,EAAM,SAAW,mBAAqB,SAAS,8BAA8Bm9G,EAAkB,EAAE,IAASI,CAAY,0BAA0BvC,EAAa,EAAE,GAAG,EAEvKA,EAAa,WAAW,QAAUmC,EAAkB,WAAW,OACjE,KAAK,iBAAiB,QAAS,CAAC,QAAS,OAAO,CAAC,EAG/CnC,EAAa,WAAW,YAAcmC,EAAkB,WAAW,WACrE,KAAK,iBAAiB,WAAY,CAAC,QAAS,OAAO,CAAC,EAEtD,KAAK,iBAAiB,OAAQ,CAAC,QAAS,OAAO,CAAC,EAChD,MAAMK,EAAgBxC,EAAa,eAAiB,EAAI,KAAQ,EAAI,IAC9DlzC,EAAc,OAAOkzC,EAAa,aAAgB,UAAY,KAAK,MAAQA,EAAa,aAAewC,EAE7G,OAAO,KAAK,aAAaxC,EAAc,UAAWjrC,GAAoBjI,CAAW,CACrF,CAKE,cAAe,CACb,KAAK,iBAAiB,MAAO,CAAC,QAAS,OAAO,CAAC,EAC/C,KAAK,cAAe,CACxB,CAgBE,iBAAiB21C,EAAQC,EAAS,CAChC,MAAMC,EAAU,CAAE,EACZC,EAAqBH,IAAW,OAClCG,GAAsBH,IAAW,SACnCE,EAAQ,KAAK,KAAK,mBAAmB,EAEvC,MAAM/jG,EAAa,CAAE,GACjBgkG,GAAsBH,IAAW,UACnC7jG,EAAW,KAAK,OAAO,GAErBgkG,GAAsBH,IAAW,cACnC7jG,EAAW,KAAK,iBAAiB,EACjCA,EAAW,KAAK,WAAW,GAE7BA,EAAW,QAAQ0E,GAAa,CAC9B,MAAMu/F,EAAS,KAAK,YAAYv/F,CAAS,GAAK,KAAK,YAAYA,CAAS,EAAE,qBACtEu/F,GACFF,EAAQ,KAAKE,CAAM,CAE3B,CAAK,EACD,CAAC,OAAQ,QAAS,UAAU,EAAE,QAAQp0G,GAAQ,CAC5C,MAAMo0G,EAAS,KAAK,GAAGp0G,CAAI,gBAAgB,EACvCo0G,IAAWJ,IAAWh0G,GAAQg0G,IAAW,QAC3CE,EAAQ,KAAKE,CAAM,CAE3B,CAAK,EACDF,EAAQ,QAAQE,GAAUH,EAAQ,QAAQrvE,GAAU,CAC9C,OAAOwvE,EAAOxvE,CAAM,GAAM,YAC5BwvE,EAAOxvE,CAAM,EAAG,CAExB,CAAK,CAAC,CACN,CAQE,eAAeoY,EAAa,CAC1B,MAAMpR,EAAWwpB,GAAU,KAAK,MAAM,SAAU,EAAEpY,CAAW,EAO7D,GANI,EAAE,KAAK,qBAAuB,KAAK,oBAAoB,MAAK,IAM5D,CAAC,KAAK,oBAAoB,MAAK,EAAG,SACpC,MAAO,GAGT,GAAIpR,GAAYA,EAAS,OACvB,OAAOoR,EAIT,KAAK,mBAAmB,MAAO,EAC/B,KAAK,mBAAmB,gBAAiB,EACrC,KAAK,YAAY,MAAM,uBACzB,KAAK,oBAAoB,MAAO,EAChC,KAAK,oBAAoB,gBAAiB,GAExC,KAAK,YAAY,UAAU,uBAC7B,KAAK,uBAAuB,MAAO,EACnC,KAAK,uBAAuB,gBAAiB,GAG/C,KAAK,KAAM,CACf,CAOE,UAAW,CACT,GAAI,CAAC,KAAK,oBACR,MAAO,GAET,MAAM3vB,EAAQ,KAAK,oBAAoB,MAAO,EAC9C,OAAKA,EAcAA,EAAM,QAKP,KAAK,YACA,KAAK,YAAY,SAEnB4jF,GAAM,SAAS,SAAS5jF,CAAK,EAP3B,IAbA,CAqBb,CAOE,UAAW,CACT,OAAO,KAAK,SAChB,CACE,mBAAoB,CAClB,IAAIgnF,EAoBJ,GAAI,CAAC,KAAK,oBACR,OAEF,IAAIhnF,EAAQ,KAAK,oBAAoB,MAAO,EAC5C,GAAI,CAACA,EACH,OAEF,IAAI+pC,EAAU,KAAK,gBAAgB,eAAe/pC,EAAO,KAAK,UAAU,EACxE,GAAI+pC,IAAY,KAEd,OAEF,MAAML,EAAO,KAAK,oBAAoB,KAChCu9C,EAAerD,GAAM,SAAS,SAAS5jF,EAAO+pC,EAAS65C,GAAM,SAAS,cAAcl6C,EAAM1pC,CAAK,CAAC,EAItG,GAHIinF,EAAa,SAAW,GAGxB,KAAK,YAAY,MAAM,uBACzBjnF,EAAQ,KAAK,YAAY,MAAM,qBAAqB,MAAO,EAC3D+pC,EAAU,KAAK,gBAAgB,eAAe/pC,EAAO,KAAK,UAAU,EAChE+pC,IAAY,OAGhBi9C,EAAgBpD,GAAM,SAAS,SAAS5jF,EAAO+pC,EAAS65C,GAAM,SAAS,cAAcl6C,EAAM1pC,CAAK,CAAC,EAC7FgnF,EAAc,SAAW,IAC3B,OAGJ,IAAIE,EACAC,EAgBJ,GAfI,KAAK,WAAa,KAAK,UAAU,SACnCD,EAAS,KAAK,UAAU,IAAI,CAAC,EAC7BC,EAAW,KAAK,UAAU,MAAM,CAAC,GAE9BH,EAIMA,EAAc,MAAM,CAAC,EAAIC,EAAa,IAAI,CAAC,GAAKA,EAAa,MAAM,CAAC,EAAID,EAAc,IAAI,CAAC,EAEpG,KAAK,UAAYC,EAEjB,KAAK,UAAYz/C,GAAiB,CAAC,CAACw/C,EAAc,MAAM,CAAC,EAAIC,EAAa,MAAM,CAAC,EAAID,EAAc,MAAM,CAAC,EAAIC,EAAa,MAAM,CAAC,EAAGD,EAAc,IAAI,CAAC,EAAIC,EAAa,IAAI,CAAC,EAAID,EAAc,IAAI,CAAC,EAAIC,EAAa,IAAI,CAAC,CAAC,CAAC,CAAC,EAL9N,KAAK,UAAYA,EAQf,KAAK,WAAa,KAAK,UAAU,QAC/B,KAAK,UAAU,IAAI,CAAC,IAAMC,GAAU,KAAK,UAAU,MAAM,CAAC,IAAMC,EAClE,OAGJ,KAAK,QAAQ,qBAAqB5+C,GAAe,KAAK,SAAS,CAAC,GAAG,EACnE,MAAMuI,EAAW,CACf,eAAgB,KAAK,SACtB,EACD,KAAK,QAAQ,CACX,KAAM,wBACN,SAAAA,CACN,CAAK,EACD,KAAK,MAAM,QAAQ,iBAAiB,CACxC,CAKE,eAAeZ,EAAQ,CAKrB,GAJI,KAAK,kBACP,KAAK,YAAY,oBAAoB,aAAc,KAAK,eAAe,EACvE,KAAK,gBAAkB,MAErB,KAAK,YAAY,aAAe,OAAQ,CAC1C,KAAK,gBAAkB,KAAK,eAAe,KAAK,KAAMA,CAAM,EAC5D,KAAK,YAAY,iBAAiB,aAAc,KAAK,eAAe,EACpE,MACN,CACI,GAAIA,EAAQ,CACV,MAAM1X,EAAW,KAAK,SAAU,EAChC,GAAI,CAACA,EAAS,OACZ,QAyBE,MAAM,KAAK,YAAY,QAAQ,GAAK,KAAK,YAAY,SAAWA,EAAS,IAAIA,EAAS,OAAS,CAAC,IAClG,KAAK,eAAe,YAAYA,EAAS,IAAIA,EAAS,OAAS,CAAC,CAAC,EAEnE,MACN,CACI,MAAMja,EAAW,KAAK,MAAM,SAAU,EACtC,IAAI5lB,EAAWirF,GAAM,SAAS,SAAS,KAAK,oBAAoB,OAAO,EACnErlE,EAAS,OAAS,IACpB5lB,EAAW,KAAK,IAAIA,EAAU4lB,EAAS,IAAIA,EAAS,OAAS,CAAC,CAAC,GAE7D,KAAK,YAAY,WAAa5lB,GAChC,KAAK,eAAe,YAAYA,CAAQ,CAE9C,CAME,SAAU,CACR,KAAK,QAAQ,SAAS,EACtB,KAAK,WAAW,UAAW,EAC3B,KAAK,oBAAoB,QAAS,EAClC,KAAK,mBAAmB,QAAS,EACjC,KAAK,2BAA2B,QAAS,EACzC,KAAK,cAAc,MAAO,EACtB,KAAK,aACP,KAAK,MAAM,IAAI,OAAQ,KAAK,WAAW,EAEzC,CAAC,QAAS,WAAW,EAAE,QAAQluB,GAAQ,CACrC,MAAMsG,EAAS,KAAK,YAAYtG,CAAI,EAAE,OACtC,UAAW4kB,KAAMte,EACfA,EAAOse,CAAE,EAAE,QAAQiM,GAAS,CACtBA,EAAM,gBACRA,EAAM,eAAe,QAAS,CAE1C,CAAS,CAET,CAAK,EACD,KAAK,oBAAoB,QAAS,EAClC,KAAK,uBAAuB,QAAS,EACrC,KAAK,eAAe,QAAS,EAC7B,KAAK,0BAA0B,QAAS,EACxC,KAAK,cAAe,EAChB,KAAK,iBACP,KAAK,YAAY,oBAAoB,aAAc,KAAK,eAAe,EAEzE,KAAK,YAAY,oBAAoB,iBAAkB,KAAK,qBAAqB,EAEjF,KAAK,YAAY,oBAAoB,aAAc,KAAK,iBAAiB,EACzE,KAAK,YAAY,oBAAoB,cAAe,KAAK,kBAAkB,EAC3E,KAAK,IAAK,CACd,CAOE,MAAO,CACL,OAAO,KAAK,oBAAoB,IACpC,CAOE,OAAQ,CAEN,OAAO,KAAK,oBAAoB,MAAO,GAAI,KAAK,aACpD,CACE,qBAAsB,CACpB,MAAM8rF,EAAmB,CAAC,CAAC,KAAK,YAAY,MAAM,qBAC5CC,EAAmB,CAAC,CAAC,KAAK,mBAAmB,qBAAoB,EAGjEC,EAAqBF,EAA0B,CAAC,CAAC,KAAK,oBAAoB,uBAAlC,GAE9C,MAAI,GAACC,GAAoB,CAACC,EAI3B,CAED,qBAAsB,CACpB,MAAMtnF,EAAQ,CACZ,KAAM,KAAK,mBAAmB,qBAAsB,GAAI,CAAE,EAC1D,MAAO,KAAK,oBAAoB,wBAA0B,CAAA,CAC3D,EACK1F,EAAW,KAAK,mBAAmB,0BAAyB,GAAM,KAAK,QAE7E0F,EAAM,MAAQA,EAAM,KACpB,MAAMunF,EAAiB7d,GAAkB,KAAK,KAAI,EAAIpvE,CAAQ,EACxD7W,EAAS,CAAE,EACX2jG,EAAmB,CAAC,CAAC,KAAK,YAAY,MAAM,qBAalD,GAZIpnF,EAAM,KAAK,WACbvc,EAAO,MAAQ8jG,EAAe,OAASvnF,EAAM,KAAK,YAAcxb,IAE9Dwb,EAAM,KAAK,UACbvc,EAAO,OAAS,IAAI8jG,EAAe,OAASvnF,EAAM,KAAK,YAAczb,EAAmB,KAEtFyb,EAAM,KAAK,UAAY,CAACA,EAAM,KAAK,SAAWA,EAAM,MAAM,UAAYonF,KACxE3jG,EAAO,MAAQ8jG,EAAe,OAASvnF,EAAM,KAAK,YAAcA,EAAM,MAAM,YAAczb,GAE1Fyb,EAAM,MAAM,OAASA,EAAM,KAAK,UAAY,CAACA,EAAM,KAAK,QAAUA,EAAM,KAAK,OAASA,EAAM,MAAM,QAGhG,CAACvc,EAAO,OAAS,CAACA,EAAO,MAAO,CAClC,KAAK,gBAAgB,CACnB,kBAAmB6W,EACnB,MAAO,CACL,QAAS,0CACV,EACD,0BAA2B,GACnC,CAAO,EACD,MACD,CAED,MAAMktF,EAAkB,CAAC9U,EAAQzvF,IAAUyvF,EAASruF,GAAqBpB,CAAK,EAAIqB,GAAmBrB,CAAK,EACpGwkG,EAAoB,CAAE,EAC5B,IAAIC,EAWJ,GAVA,CAAC,QAAS,OAAO,EAAE,QAAQ,SAAUj9G,EAAM,CACzC,GAAIgZ,EAAO,eAAehZ,CAAI,GAAK,CAAC+8G,EAAgBxnF,EAAMv1B,CAAI,EAAE,OAAQgZ,EAAOhZ,CAAI,CAAC,EAAG,CACrF,MAAMk9G,EAAY3nF,EAAMv1B,CAAI,EAAE,OAAS,UAAY,QACnDg9G,EAAkBE,CAAS,EAAIF,EAAkBE,CAAS,GAAK,CAAE,EACjEF,EAAkBE,CAAS,EAAE,KAAKlkG,EAAOhZ,CAAI,CAAC,EAC1CA,IAAS,UACXi9G,EAAmBC,EAE7B,CACA,CAAK,EACGP,GAAoBM,GAAoBptF,EAAS,WAAW,MAAO,CACrE,MAAMvW,EAAauW,EAAS,WAAW,MACvC,KAAK,KAAM,EAAC,UAAU,QAAQ6xC,GAAW,EACbA,EAAQ,YAAcA,EAAQ,WAAW,SACzCpoD,GAAcooD,IAAY7xC,IAClD6xC,EAAQ,aAAe,IAEjC,CAAO,EACD,KAAK,QAAQ,yBAAyBpoD,CAAU,OAAO2jG,CAAgB,gCAAgCjkG,EAAO,KAAK,GAAG,CACvH,CAED,GAAI,OAAO,KAAKgkG,CAAiB,EAAE,OAAQ,CACzC,MAAM33G,EAAU,OAAO,KAAK23G,CAAiB,EAAE,OAAO,CAAC5oG,EAAK8oG,KACtD9oG,IACFA,GAAO,MAETA,GAAO,GAAG8oG,CAAS,gCAAgCF,EAAkBE,CAAS,EAAE,KAAK,GAAG,CAAC,IAClF9oG,GACN,EAAE,EAAI,IACT,KAAK,gBAAgB,CACnB,kBAAmByb,EACnB,MAAO,CACL,SAAU,GACV,QAAAxqB,CACD,EACD,0BAA2B,GACnC,CAAO,EACD,MACD,CAED,GAAI,KAAK,eAAe,wBAAuB,GAAM,CAAC,KAAK,eAAe,gBAAiB,CACzF,MAAM83G,EAAiB,CAAE,EAQzB,GAPA,CAAC,QAAS,OAAO,EAAE,QAAQn9G,GAAQ,CACjC,MAAMo9G,GAAYtkG,GAAY,KAAK,eAAe,OAAO9Y,CAAI,GAAK,EAAE,EAAE,CAAC,GAAK,CAAE,GAAE,KAC1EqtG,GAAYv0F,GAAYE,EAAOhZ,CAAI,GAAK,EAAE,EAAE,CAAC,GAAK,CAAA,GAAI,KACxDo9G,GAAY/P,GAAY+P,EAAS,YAAW,IAAO/P,EAAS,eAC9D8P,EAAe,KAAK,IAAI,KAAK,eAAe,OAAOn9G,CAAI,CAAC,SAASgZ,EAAOhZ,CAAI,CAAC,GAAG,CAE1F,CAAO,EACGm9G,EAAe,OAAQ,CACzB,KAAK,gBAAgB,CACnB,kBAAmBttF,EACnB,MAAO,CACL,QAAS,kCAAkCstF,EAAe,KAAK,IAAI,CAAC,IACpE,SAAU,EACX,EACD,0BAA2B,GACrC,CAAS,EACD,MACR,CACK,CAGD,OAAOnkG,CACX,CAOE,2BAA4B,CAM1B,GAHI,KAAK,YAAY,aAAe,QAAU,KAAK,eAAe,2BAG9D,CAAC,KAAK,sBACR,OAEF,MAAMA,EAAS,KAAK,sBAEpB,GAAI,CAACA,EACH,OAEF,KAAK,eAAe,oBAAoBA,CAAM,EAC9C,MAAMD,EAAc,CAACC,EAAO,MAAOA,EAAO,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EACzE,KAAK,6BAA6BD,CAAW,CACjD,CAKE,6BAA8B,CAC5B,MAAM0X,EAAY,KAAK,KAAI,EAAG,UACxB4sF,EAAM,CAAA,EAGZ,OAAO,KAAK5sF,CAAS,EAAE,QAAQ3tB,GAAO,CACpC,MAAM4+D,EAAUjxC,EAAU3tB,CAAG,EAE7B,GAAIu6G,EAAI,QAAQ37C,EAAQ,EAAE,IAAM,GAC9B,OAEF27C,EAAI,KAAK37C,EAAQ,EAAE,EACnB,MAAM1oD,EAASimF,GAAkB,KAAK,KAAMv9B,CAAO,EAC7C47C,EAAc,CAAE,EAClBtkG,EAAO,OAAS,CAACa,GAAmBb,EAAO,KAAK,GAAK,CAACY,GAAqBZ,EAAO,KAAK,GACzFskG,EAAY,KAAK,eAAetkG,EAAO,KAAK,EAAE,EAE5CA,EAAO,OAAS,CAACa,GAAmBb,EAAO,KAAK,GAAK,CAACY,GAAqBZ,EAAO,KAAK,GACzFskG,EAAY,KAAK,eAAetkG,EAAO,KAAK,EAAE,EAE5CA,EAAO,MAAQA,EAAO,OAAS,kBACjCskG,EAAY,KAAK,cAActkG,EAAO,IAAI,EAAE,EAE1CskG,EAAY,SACd57C,EAAQ,aAAe,IACvB,KAAK,QAAQ,aAAaA,EAAQ,EAAE,qBAAqB47C,EAAY,KAAK,IAAI,CAAC,EAAE,EAEzF,CAAK,CACL,CAgBE,6BAA6BvkG,EAAa,CACxC,MAAMskG,EAAM,CAAE,EACR5sF,EAAY,KAAK,KAAI,EAAG,UACxBzX,EAAS6lF,GAAgB/lF,GAAYC,CAAW,CAAC,EACjDwkG,EAAcxe,GAAW/lF,CAAM,EAC/BwkG,EAAexkG,EAAO,OAASF,GAAYE,EAAO,KAAK,EAAE,CAAC,GAAK,KAC/DykG,EAAezkG,EAAO,OAASF,GAAYE,EAAO,KAAK,EAAE,CAAC,GAAK,KACrE,OAAO,KAAKyX,CAAS,EAAE,QAAQ3tB,GAAO,CACpC,MAAM4+D,EAAUjxC,EAAU3tB,CAAG,EAG7B,GAAIu6G,EAAI,QAAQ37C,EAAQ,EAAE,IAAM,IAAMA,EAAQ,eAAiB,IAC7D,OAEF27C,EAAI,KAAK37C,EAAQ,EAAE,EACnB,MAAMg8C,EAAmB,CAAA,EAEnBC,EAAgB1e,GAAkB,KAAK,oBAAoB,KAAMv9B,CAAO,EACxEk8C,EAAoB7e,GAAW4e,CAAa,EAGlD,GAAI,GAACA,EAAc,OAAS,CAACA,EAAc,OAW3C,IALIC,IAAsBL,GACxBG,EAAiB,KAAK,gBAAgBE,CAAiB,UAAUL,CAAW,GAAG,EAI7E,CAAC,KAAK,eAAe,gBAAiB,CACxC,MAAMM,EAAsBF,EAAc,OAAS7kG,GAAY6kG,EAAc,KAAK,EAAE,CAAC,GAAK,KACpFG,EAAsBH,EAAc,OAAS7kG,GAAY6kG,EAAc,KAAK,EAAE,CAAC,GAAK,KAEtFE,GAAuBL,GAAgBK,EAAoB,KAAK,YAAW,IAAOL,EAAa,KAAK,eACtGE,EAAiB,KAAK,gBAAgBG,EAAoB,IAAI,UAAUL,EAAa,IAAI,GAAG,EAG1FM,GAAuBL,GAAgBK,EAAoB,KAAK,YAAW,IAAOL,EAAa,KAAK,eACtGC,EAAiB,KAAK,gBAAgBI,EAAoB,IAAI,UAAUL,EAAa,IAAI,GAAG,CAEtG,CACUC,EAAiB,SACnBh8C,EAAQ,aAAe,IACvB,KAAK,QAAQ,aAAaA,EAAQ,EAAE,KAAKg8C,EAAiB,KAAK,MAAM,CAAC,EAAE,GAEhF,CAAK,CACL,CACE,cAAcnoF,EAAO,CACnB,IAAIlZ,EAAS,EACb,MAAM0xC,EAAW,KAAK,SAAU,EAC5BA,EAAS,SACX1xC,EAAS0xC,EAAS,MAAM,CAAC,GAE3BmhD,GAAa35E,EAAO,KAAK,cAAelZ,CAAM,CAClD,CAOE,kBAAmB,CACjB,MAAM6oC,EAAc,KAAK,MAAM,YAAa,EACtCtiB,EAAU4sC,GAAO,mBACjBhlB,EAAOglB,GAAO,wBACdp0D,EAAM,KAAK,IAAIwnB,EAAS4sC,GAAO,sBAAsB,EAC3D,OAAO,KAAK,IAAI5sC,EAAUsiB,EAAcsF,EAAMpvC,CAAG,CACrD,CAOE,oBAAqB,CACnB,MAAM8pC,EAAc,KAAK,MAAM,YAAa,EACtCtiB,EAAU4sC,GAAO,sBACjBhlB,EAAOglB,GAAO,2BACdp0D,EAAM,KAAK,IAAIwnB,EAAS4sC,GAAO,yBAAyB,EACxDuuC,EAAS,KAAK,IAAIn7E,EAAS4sC,GAAO,sCAAsC,EAC9E,OAAO,KAAK,IAAI5sC,EAAUsiB,EAAcsF,EAAM,KAAK,eAAiBuzD,EAAS3iG,CAAG,CACpF,CACE,qBAAsB,CACpB,OAAOo0D,GAAO,sBAClB,CACE,0BAA0BvM,EAAY,CACpC+gC,GAA+B,KAAK,kBAAmB,sBAAuB,KAAK,KAAK,EACxFD,GAAqB,CACnB,iBAAkB,KAAK,kBACvB,WAAA9gC,CACN,CAAK,CACL,CACE,uBAAuBk5B,EAAc9sB,EAAe+zB,EAAe,CACjE,MAAMhM,EAAkB,KAAK,eAAe,YAAc,KAAK,eAAe,uBAAyB,KAAK,eAAe,qBAAoB,EAI/I4M,GAA+B,KAAK,kBAAmB7H,EAAc,KAAK,KAAK,EAC/EgH,GAAY,CACV,iBAAkB,KAAK,kBACvB,cAAA9zB,EACA,gBAAA+nB,EACA,cAAAgM,CACN,CAAK,CACL,CAQE,kBAAkBvzE,EAAU,CAC1B,OAAOA,EAAS,WAAW,YAAY,GAAKA,EAAS,WAAW,eACpE,CAKE,gCAAiC,CAC/B,MAAMovC,EAAO,KAAK,KAAM,EACxB,GAAKA,EAAK,gBAGV,WAAWpvC,KAAYovC,EAAK,UAC1B,KAAK,2BAA2B,oBAAoB,KAAK,kBAAkBpvC,CAAQ,CAAC,EAItF,GAFA,KAAK,2BAA2B,oBAAoBovC,EAAK,IAAKA,EAAK,eAAe,EAE9E,KAAK,2BAA2B,iBAAkB,CAEpD,KAAK,2BAA2B,wBAAwB,EAAI,EAC5D,MACD,CAED,KAAK,MAAM,IAAI,UAAW,IAAM,CAC9B,KAAK,2BAA2B,wBAAyB,CAC/D,CAAK,EACL,CAKE,iCAAkC,CAChC,KAAK,2BAA2B,uBAAwB,EACxD,KAAK,2BAA2B,QAAS,EACzC,KAAK,+BAAgC,CACzC,CAKE,iCAAkC,CAChC,KAAK,2BAA2B,GAAG,mBAAoB,KAAK,0BAA0B,KAAK,IAAI,CAAC,EAClE,CAAC,2BAA4B,8BAA+B,uBAAuB,EAC3F,QAAQtO,GAAa,CACzC,KAAK,2BAA2B,GAAGA,EAAW0V,GAAY,CACxD,KAAK,QAAQ1nE,GAAS,CAAE,EAAE0nE,CAAQ,CAAC,CAC3C,CAAO,CACP,CAAK,EACG,KAAK,cAAgB,QACvB,KAAK,oBAAoB,GAAG,iBAAkB,IAAM,CAClD,MAAMpH,EAAO,KAAK,QAEO,KAAK,2BAA2B,iBAAiBA,EAAK,IAAKA,EAAK,eAAe,IAC9E,IAAM,CAC9B,MAAM++C,EAAoB,KAAK,2BAA2B,qBAAsB,EAC1EC,EAAc,CAAE,EACtB,UAAWpuF,KAAYovC,EAAK,UAAW,CACrC,MAAMi/C,EAAkBruF,EAAS,WAAW,gBAC5C,GAAIquF,IACFD,EAAY,KAAKC,CAAe,EAC5B,CAACF,EAAkB,IAAIE,CAAe,GACxC,MAAO,EAGZ,CAED,MAAI,IAACD,EAAY,QAAUD,EAAkB,KAI9C,OAEC,KAAK,gCAAiC,CAEhD,CAAO,CAEP,CAKE,2BAA4B,CAC1B,MAAMG,EAAiB,KAAK,2BAA2B,WAAY,EACnE,GAAI,CAACA,EACH,OAEF,KAAK,qBAAsB,EAE3B,MAAM1tF,EADO,KAAK,KAAM,EACD,UACjB4sF,EAAM,IAAI,IAChB,IAAIe,EAAqB,GACzB,OAAO,KAAK3tF,CAAS,EAAE,QAAQ3tB,GAAO,CACpC,MAAM4+D,EAAUjxC,EAAU3tB,CAAG,EACvBu7G,EAAY,KAAK,kBAAkB38C,CAAO,EAC1C48C,EAAqBD,GAAaF,IAAmBE,EACjC38C,EAAQ,eAAiB,KAAYA,EAAQ,qBAAuB,oBACrE,CAAC48C,IACxB,OAAO58C,EAAQ,aACf,OAAOA,EAAQ,mBACf08C,EAAqB,IAEvB,MAAMG,EAAiB,CAAC78C,EAAQ,cAAgBA,EAAQ,eAAiB,IACnD,CAAC27C,EAAI,IAAI37C,EAAQ,EAAE,GAAK48C,GAAsBC,IAIpElB,EAAI,IAAI37C,EAAQ,EAAE,EAClBA,EAAQ,aAAe,IACvBA,EAAQ,mBAAqB,mBAE7B,KAAK,QAAQ,aAAaA,EAAQ,EAAE,QAAQA,EAAQ,kBAAkB,EAAE,EAC9E,CAAK,EACG,KAAK,2BAA2B,gBAAkB,QACpD,OAAO,KAAK,KAAK,WAAW,EAAE,QAAQ5+D,GAAO,CAC3C,MAAM9C,EAAO,KAAK,YAAY8C,CAAG,EACjC,GAAI9C,EAAK,qBAAsB,CAC7B,MAAMw5G,EAAkBx5G,EAAK,qBAAqB,OAE9Cw5G,GAAmBA,EAAgB,WAAW,kBAAoB2E,IACpEC,EAAqB,GAEjC,CACA,CAAO,EAECA,GACF,KAAK,sBAAuB,CAElC,CAYE,sBAAuB,CAErB,MAAM3tF,EADO,KAAK,KAAM,EACD,UACjB+tF,EAAuB,KAAK,2BAA2B,qBACvDC,EAAoB,KAAK,2BAA2B,kBAE1D,GADkBD,GAAwBA,EAAqB,MAAQC,GAAqBA,EAAkB,KAI9G,UAAW,CAAC75F,EAAIssC,CAAK,IAAKstD,EAAqB,QAAO,EACnCC,EAAkB,IAAI75F,CAAE,IAGvC,KAAK,oBAAoB,oBAAoBssC,CAAK,EAClD,KAAK,2BAA2B,eAAetsC,CAAE,GAGrD,SAAW,CAACA,EAAIssC,CAAK,IAAKutD,EAAkB,QAAO,EAAI,CACrD,MAAMC,EAAWF,EAAqB,IAAI55F,CAAE,EAE5C,GAAI,CAAC85F,EAAU,CACYjuF,EAAU,OAAO3kB,GACjCA,EAAE,WAAW,YAAY,IAAMolD,EAAM,SAAS,CACtD,EACgB,QAAQplD,GAAK,CAC5B,KAAK,oBAAoB,gBAAgBolD,EAAOplD,CAAC,CAC3D,CAAS,EACD,KAAK,2BAA2B,oBAAoB8Y,CAAE,EACtD,QACD,CAEG,KAAK,oBAAoB85F,EAAUxtD,CAAK,IAK5C,KAAK,oBAAoB,oBAAoBA,EAAO,EAAI,EACxD,KAAK,2BAA2B,oBAAoBtsC,CAAE,EACvD,CAED,KAAK,2BAA2B,qBAAuB,IAAI,IAAI,KAAK,MAAM,KAAK,UAAU,CAAC,GAAG65F,CAAiB,CAAC,CAAC,CAAC,EACrH,CASE,oBAAoBv4G,EAAGwF,EAAG,CACxB,GAAIxF,EAAE,SAAS,IAAMwF,EAAE,SAAS,GAAKxF,EAAE,KAAOwF,EAAE,IAAMxF,EAAE,iBAAiB,EAAE,OAASwF,EAAE,iBAAiB,EAAE,KACvG,MAAO,GAET,MAAMizG,EAAUz4G,EAAE,iBAAiB,EAAE,OAC/B04G,EAAUlzG,EAAE,iBAAiB,EAAE,OAGrC,UAAWI,KAAK6yG,EACd,GAAIA,EAAQ7yG,CAAC,IAAM8yG,EAAQ9yG,CAAC,EAC1B,MAAO,GAGX,UAAWA,KAAK8yG,EACd,GAAID,EAAQ7yG,CAAC,IAAM8yG,EAAQ9yG,CAAC,EAC1B,MAAO,GAGX,MAAO,EACX,CAME,uBAAwB,CACtB,MAAM2tG,EAAe,KAAK,eAAgB,EAC1C,KAAK,aAAY,EAEb,KAAK,2BAA2B,gBAAkB,QACpD,KAAK,mCAAoC,EAE3C,KAAK,aAAaA,EAAc,kBAAkB,CACtD,CAOE,mCAAoC,CAClC,GAAI,CAAC,KAAK,qBAAuB,CAAC,KAAK,oBAAoB,KACzD,OAEF,IAAIoF,EAA0B,EAC9B,MAAMC,EAAa,aACnB,KAAK,oBAAoB,KAAK,UAAU,QAAQjvF,GAAY,CAC1D,MAAMkvF,EAAW,KAAK,oBAAoB,YAAYlvF,CAAQ,EAE1D,CAACkvF,GAAY,CAACA,EAAS,MAG3BA,EAAS,QAAQj8G,GAAO,CACtB,MAAMk8G,EAAS,SACTC,EAAqB,KAAK,cAAc,IAAIn8G,CAAG,GAAK,KAAK,cAAc,IAAIA,CAAG,IAAMk8G,EACpFE,EAAqBrvF,EAAS,qBAAuBivF,GAAcjvF,EAAS,eAAiB,IAC9FovF,EASMA,GAAsBC,IAC/B,OAAOrvF,EAAS,aAChB,OAAOA,EAAS,mBAChB,KAAK,QAAQ,qBAAqBA,EAAS,EAAE,mBAAmB/sB,CAAG,OAAOk8G,CAAM,EAAE,IAV9EnvF,EAAS,eAAiB,KAAYA,EAAS,qBAAuBivF,IACxEjvF,EAAS,aAAe,IACxBA,EAAS,mBAAqBivF,EAC9B,KAAK,QAAQ,sBAAsBjvF,EAAS,EAAE,uBAAuB/sB,CAAG,gDAAgDk8G,CAAM,EAAE,GAGlIH,IAMV,CAAO,CACP,CAAK,EAEGA,GAA2B,KAAK,oBAAoB,KAAK,UAAU,QACrE,KAAK,oBAAoB,KAAK,UAAU,QAAQhvF,GAAY,CAC1D,MAAMsvF,EAAUtvF,GAAYA,EAAS,YAAcA,EAAS,WAAW,YAAcA,EAAS,WAAW,WAAW,OAAS,IACvHuvF,EAA0BvvF,EAAS,eAAiB,KAAYA,EAAS,qBAAuBivF,EAClGK,GAAWC,IAEb,OAAOvvF,EAAS,aAChB8rC,EAAQ,IAAI,KAAK,4BAA4B9rC,EAAS,EAAE,+CAA+CivF,CAAU,UAAU,EAErI,CAAO,CAEP,CAQE,cAAch3C,EAAOnjE,EAAQ,CAG3B,MAAM06G,GAFW,OAAOv3C,GAAU,SACAA,EAAQgmC,GAAkBhmC,CAAK,GACrB,MAAM,EAAG,EAAE,EAAE,YAAa,EACtE,KAAK,QAAQ,cAAcnjE,CAAM,iBAAiB06G,CAAoB,4BAA4B,EAClG,KAAK,cAAc,IAAIA,EAAsB16G,CAAM,CACvD,CAQE,0BAA0BmjE,EAAOnjE,EAAQ,CACvC,KAAK,cAAcmjE,EAAOnjE,CAAM,EAC3B,KAAK,wCACR,KAAK,oCAAqC,EAG5C,KAAK,oBAAoB,IAAI,iBAAkB,KAAK,oCAAoC,KAAK,IAAI,CAAC,EAClG,KAAK,oBAAoB,GAAG,iBAAkB,KAAK,oCAAoC,KAAK,IAAI,CAAC,CACrG,CACE,qCAAsC,CACpC,KAAK,kCAAmC,EACxC,KAAK,mBAAoB,CAC7B,CACA,CAeA,MAAM26G,GAAiB,CAAChD,EAAQiD,EAAYC,IAAqBtjD,GAAU,CACzE,MAAMrsC,EAAWysF,EAAO,KAAK,UAAUiD,CAAU,EAC3CE,EAAe9+C,GAAe9wC,CAAQ,EACtC6vF,EAAmB9+C,GAAU/wC,CAAQ,EAC3C,GAAI,OAAOqsC,EAAW,IACpB,OAAOwjD,EAELxjD,EACF,OAAOrsC,EAAS,SAEhBA,EAAS,SAAW,GAEtB,MAAMw2C,EAAW,CACf,cAAe,CACb,GAAIk5C,EACJ,UAAW1vF,EAAS,WAAW,UAC/B,WAAYA,EAAS,WAAW,WAChC,OAAQA,EAAS,WAAW,MAC7B,EACD,MAAO,cACR,EACD,OAAIqsC,IAAWwjD,GAAoB,CAACD,IAElCD,EAAiB3vF,CAAQ,EACrBqsC,EACFogD,EAAO,QAAQ,CACb,KAAM,mBACN,SAAAj2C,CACR,CAAO,EAEDi2C,EAAO,QAAQ,CACb,KAAM,oBACN,SAAAj2C,CACR,CAAO,GAGEnK,CACT,EASA,MAAMyjD,EAAe,CACnB,YAAYC,EAAY/vF,EAAUjL,EAAI,CACpC,KAAM,CACJ,oBAAqB0xF,CAC3B,EAAQsJ,EACEC,EAAwBvJ,EAAG,mBAAmB,KAAKA,CAAE,EAE3D,GAAIzmF,EAAS,WAAY,CACvB,MAAMpb,EAAaob,EAAS,WAAW,WACvC,KAAK,MAAQpb,GAAcA,EAAW,MACtC,KAAK,OAASA,GAAcA,EAAW,OACvC,KAAK,UAAYob,EAAS,WAAW,UACrC,KAAK,UAAYA,EAAS,WAAW,YAAY,CACvD,CACI,KAAK,OAASovE,GAAkBqX,EAAG,KAAI,EAAIzmF,CAAQ,EACnD,KAAK,SAAWA,EAGhB,KAAK,GAAKjL,EAGV,KAAK,QAAU06F,GAAeM,EAAW,UAAW/vF,EAAS,GAAIgwF,CAAqB,CAC1F,CACA,CASA,MAAMC,GAA0B,SAAUF,EAAY,CAEpDA,EAAW,gBAAkB,IAAM,CACjC,MAAM3gD,EAAO2gD,EAAW,oBAAoB,KAAM,EAC5CnvF,EAAYiC,GAAYusC,CAAI,EAAI2gD,EAAW,oBAAoB,0BAA4B3gD,EAAK,UACtG,OAAKxuC,EAGEA,EAAU,OAAO8E,GAAS,CAACorC,GAAeprC,CAAK,CAAC,EAAE,IAAI,CAACzwB,EAAGtF,IAAM,IAAImgH,GAAeC,EAAY96G,EAAGA,EAAE,EAAE,CAAC,EAFrG,CAAE,CAGZ,CACH,EAYMi7G,GAAoB,CAAC,UAAW,SAAU,QAAS,UAAW,OAAO,EAK3E,MAAMC,WAAwBrkD,EAAQ,WAAY,CAOhD,YAAY56D,EAAS,CACnB,MAAO,EACP,KAAK,oBAAsBA,EAAQ,mBACnC,KAAK,MAAQA,EAAQ,KACrB,KAAK,SAAWA,EAAQ,SACxB,KAAK,iCAAmCA,EAAQ,iCAChD,KAAK,uBAAyBA,EAAQ,uBACtC,KAAK,MAAQA,EAAQ,MACrB,KAAK,cAAgB,CAAE,EACvB,KAAK,mBAAqB,EAC1B,KAAK,iBAAmB,KACxB,KAAK,yBAA2B,KAChC,KAAK,QAAU+7D,GAAO,iBAAiB,EACvC,KAAK,QAAQ,YAAY,EACzB,MAAMmjD,EAAc,IAAM,KAAK,oBAAqB,EAC9CC,EAAiB,IAAM,KAAK,oBAAqB,EACjDC,EAAiB,IAAM,KAAK,aAAc,EAC1CC,EAAqB,IAAM,KAAK,iBAAkB,EAClD9J,EAAK,KAAK,oBACV+J,EAAc,CAAC,OAAQ,WAAY,OAAO,EAC1CC,EAAe,CAAE,EACvBD,EAAY,QAAQrgH,GAAQ,CAC1BsgH,EAAatgH,CAAI,EAAI,CACnB,MAAO,IAAM,KAAK,uBAAuBA,CAAI,EAC7C,UAAW,IAAM,KAAK,uBAAuBA,CAAI,CAClD,EACDs2G,EAAG,GAAGt2G,CAAI,gBAAgB,EAAE,GAAG,cAAesgH,EAAatgH,CAAI,EAAE,SAAS,EAI1Es2G,EAAG,GAAGt2G,CAAI,gBAAgB,EAAE,GAAG,iBAAkBsgH,EAAatgH,CAAI,EAAE,KAAK,EAKzE,KAAK,MAAM,GAAG,CAAC,SAAU,SAAS,EAAGsgH,EAAatgH,CAAI,EAAE,KAAK,CACnE,CAAK,EAUD,MAAMugH,EAAqBthH,GAAM,CAC/B,CAAC,OAAQ,OAAO,EAAE,QAAQe,GAAQ,CAChCs2G,EAAG,GAAGt2G,CAAI,gBAAgB,EAAEf,CAAE,EAAE,WAAY,KAAK,mBAAmB,CAC5E,CAAO,CACF,EACD,KAAK,oBAAsB,IAAM,CAC3B,KAAK,mBACP,KAAK,mBAAqB,EAC1B,KAAK,iBAAmB,KAAK,MAAM,YAAa,EAChDshH,EAAmB,KAAK,EAE3B,EACD,KAAK,yBAA2B,IAAMA,EAAmB,KAAK,EAC9D,KAAK,oBAAsB,IAAM,CAC/B,KAAK,yBAA0B,EAC/BA,EAAmB,IAAI,CACxB,EACD,KAAK,MAAM,GAAG,SAAU,KAAK,wBAAwB,EACrD,KAAK,MAAM,GAAG,UAAW,KAAK,mBAAmB,EACjD,KAAK,MAAM,GAAG,UAAWJ,CAAc,EACvC,KAAK,MAAM,GAAGJ,GAAmBK,CAAkB,EACnD,KAAK,MAAM,GAAG,UAAWF,CAAc,EAYvC,KAAK,MAAM,IAAI,OAAQD,CAAW,EAElC,KAAK,QAAU,IAAM,CACnB,KAAK,yBAA0B,EAC/B,KAAK,QAAQ,SAAS,EACtB,KAAK,MAAM,IAAI,UAAWE,CAAc,EACxC,KAAK,MAAM,IAAIJ,GAAmBK,CAAkB,EACpD,KAAK,MAAM,IAAI,UAAWF,CAAc,EACxC,KAAK,MAAM,IAAI,OAAQD,CAAW,EAClC,KAAK,MAAM,IAAI,UAAW,KAAK,mBAAmB,EAClD,KAAK,MAAM,IAAI,SAAU,KAAK,wBAAwB,EACtDI,EAAY,QAAQrgH,GAAQ,CAC1Bs2G,EAAG,GAAGt2G,CAAI,gBAAgB,EAAE,IAAI,cAAesgH,EAAatgH,CAAI,EAAE,SAAS,EAC3Es2G,EAAG,GAAGt2G,CAAI,gBAAgB,EAAE,IAAI,iBAAkBsgH,EAAatgH,CAAI,EAAE,KAAK,EAC1E,KAAK,MAAM,IAAI,CAAC,SAAU,SAAS,EAAGsgH,EAAatgH,CAAI,EAAE,KAAK,CACtE,CAAO,EACG,KAAK,0BACPyhC,EAAS,aAAa,KAAK,wBAAwB,EAErD,KAAK,iBAAkB,CACxB,CACL,CAOE,qBAAsB,CACpB,KAAK,kBAAmB,EACpB,KAAK,0BACPA,EAAS,aAAa,KAAK,wBAAwB,EAGrD,KAAK,yBAA2BA,EAAS,WAAW,KAAK,oBAAoB,KAAK,IAAI,EAAG,GAAG,CAChG,CAYE,uBAAuBzhC,EAAM,CAC3B,MAAMs8G,EAAS,KAAK,oBAAoB,GAAGt8G,CAAI,gBAAgB,EAC3D,KAAK,GAAGA,CAAI,mBAAmB,EAAI,GACrC,KAAK,QAAQ,iDAAiDA,CAAI,SAAS,EAE7E,KAAK,GAAGA,CAAI,mBAAmB,EAAI,EACnC,KAAK,GAAGA,CAAI,WAAW,EAAIs8G,EAAO,UAAW,CACjD,CAYE,uBAAuBt8G,EAAM,CAC3B,MAAMs2G,EAAK,KAAK,oBACVgG,EAAShG,EAAG,GAAGt2G,CAAI,gBAAgB,EACnC8zC,EAAWwoE,EAAO,UAAW,EAC7BkE,EAAsBriD,GAAiB,KAAK,GAAGn+D,CAAI,WAAW,EAAG8zC,CAAQ,EAK/E,GAJA,KAAK,GAAG9zC,CAAI,WAAW,EAAI8zC,EAIvB0sE,EAAqB,CACvB,MAAMn6C,EAAW,CACf,eAAgBvyB,CACjB,EACDwiE,EAAG,QAAQ,CACT,KAAM,wBACN,SAAAjwC,CACR,CAAO,EACD,KAAK,uBAAuBrmE,CAAI,EAChC,MACN,CACI,KAAK,GAAGA,CAAI,mBAAmB,IAC/B,KAAK,QAAQ,UAAU,KAAK,GAAGA,CAAI,mBAAmB,CAAC,IAAIA,CAAI,oEAAqE,CAClI,WAAYs8G,EAAO,WAAaA,EAAO,UAAU,GACjD,SAAUr+C,GAAkBnqB,CAAQ,CAC1C,CAAK,EAEG,OAAK,GAAG9zC,CAAI,mBAAmB,EAAI,MAGvC,KAAK,QAAQ,GAAGA,CAAI,oCAAoC,EACxD,KAAK,uBAAuBA,CAAI,EAChC,KAAK,MAAM,QAAQ,CACjB,KAAM,QACN,KAAM,OAAOA,CAAI,qBACvB,CAAK,EACGA,IAAS,YAKbs2G,EAAG,gBAAgB,CACjB,MAAO,CACL,QAAS,aAAat2G,CAAI,gCAC3B,EACD,0BAA2B,GACjC,CAAK,EACL,CASE,mBAAoB,CAClB,GAAI,KAAK,MAAM,OAAM,GAAM,KAAK,MAAM,UACpC,OAEF,MAAMklD,EAAc,KAAK,MAAM,YAAa,EACtCpR,EAAW,KAAK,MAAM,SAAU,EACtC,GAAI,KAAK,mBAAqBoR,IAAgB,CAACpR,EAAS,QAAUoR,EAAciY,IAAmBrpB,EAAS,IAAIA,EAAS,OAAS,CAAC,GAMjI,OAAO,KAAK,aAAc,EAE5B,GAAI,KAAK,oBAAsB,GAAKoR,IAAgB,KAAK,iBACvD,KAAK,qBACL,KAAK,SAAU,UACNA,IAAgB,KAAK,iBAC9B,KAAK,yBACA,CACL,KAAK,cAAc,KAAK6X,GAAiB,CAAC,KAAK,iBAAkB7X,CAAW,CAAC,CAAC,EAC9E,MAAMmhB,EAAW,CACf,aAAc,KAAK,aACpB,EACD,KAAK,oBAAoB,QAAQ,CAC/B,KAAM,sBACN,SAAAA,CACR,CAAO,EACD,KAAK,mBAAqB,EAC1B,KAAK,iBAAmBnhB,CAC9B,CACA,CAOE,kBAAmB,CACjB,KAAK,mBAAqB,CAC9B,CAQE,gBAAiB,CAEf,GAAI,CADY,KAAK,MAAM,QAAS,EAElC,MAAO,GAMT,MAAM6I,EAAW,KAAK,SAAU,EAC1B7I,EAAc,KAAK,MAAM,YAAa,EACtCu7D,EAAuB,KAAK,qBAAqB1yD,EAAU7I,EAAa,KAAK,MAAK,EAAI,KAAK,gCAAgC,EACjI,IAAIymB,EAMJ,GALI80C,IAGF90C,EAFoB5d,EAAS,IAAIA,EAAS,OAAS,CAAC,GAIlD,KAAK,sBAAsBA,EAAU7I,CAAW,EAAG,CACrD,MAAMG,EAAgB0I,EAAS,MAAM,CAAC,EAGtC4d,EAAStmB,GAGTA,IAAkB0I,EAAS,IAAI,CAAC,EAAI,EAAIoP,GAC9C,CACI,GAAI,OAAOwO,EAAW,IACpB,YAAK,QAAQ,8CAA8CzmB,CAAW,wBAA6B4Y,GAAe/P,CAAQ,CAAC,gBAAqB4d,CAAM,GAAG,EACzJ,KAAK,MAAM,eAAeA,CAAM,EACzB,GAET,MAAM4gC,EAAgB,KAAK,oBAAoB,eACzCz4D,EAAW,KAAK,MAAM,SAAU,EAChC22D,EAAgB8B,EAAc,YAAcA,EAAc,cAAe,EAAG,KAC5E7B,EAAgB6B,EAAc,YAAcA,EAAc,cAAe,EAAG,KAC5Eh3E,EAAQ,KAAK,QAGbmrF,EAAsBnrF,EAAM,mBAAqBA,EAAM,oBAAsBA,EAAM,eAAiB2nC,IAAqB,EAGzHyjD,EAAkB,CAAClW,EAAeC,CAAa,EACrD,QAASlrG,EAAI,EAAGA,EAAImhH,EAAgB,OAAQnhH,IAAK,CAE/C,GAAI,CAACmhH,EAAgBnhH,CAAC,EACpB,SAKF,GAHkB6+D,GAAYsiD,EAAgBnhH,CAAC,EAAG0lD,CAAW,EAG7Cw7D,EACd,MAAO,EAEf,CACI,MAAME,EAAYrjD,GAAczpB,EAAUoR,CAAW,EAGrD,OAAI07D,EAAU,SAAW,EAChB,IAETj1C,EAASi1C,EAAU,MAAM,CAAC,EAAIzjD,GAC9B,KAAK,QAAQ,2BAA2ByjD,EAAU,MAAM,CAAC,CAAC,8BAAmC17D,CAAW,iBAAiBymB,CAAM,GAAG,EAClI,KAAK,MAAM,eAAeA,CAAM,EACzB,GACX,CAOE,UAAW,CACT,GAAI,KAAK,eACP,OAGF,MAAMzmB,EAAc,KAAK,MAAM,YAAa,EACtCpR,EAAW,KAAK,MAAM,SAAU,EAChC9qC,EAAes0D,GAAUxpB,EAAUoR,CAAW,EASpD,GAAIl8C,EAAa,QAAUk8C,EAAc,GAAKl8C,EAAa,IAAI,CAAC,EAAG,CACjE,KAAK,iBAAkB,EACvB,KAAK,MAAM,eAAek8C,CAAW,EACrC,KAAK,QAAQ,cAAcA,CAAW,oCAAyCl8C,EAAa,MAAM,CAAC,CAAC,OAAOA,EAAa,IAAI,CAAC,CAAC,kEAAuE,EAErM,KAAK,MAAM,QAAQ,CACjB,KAAM,QACN,KAAM,qBACd,CAAO,EACD,MACN,CACA,CAUE,cAAe,CACb,MAAM+kD,EAAW,KAAK,SAAU,EAC1B7I,EAAc,KAAK,MAAM,YAAa,EAC5C,GAAI,KAAK,MAAM,UAEb,MAAO,GAET,GAAI,KAAK,sBAAsB6I,EAAU7I,CAAW,EAAG,CACrD,MAAM27D,EAAY9yD,EAAS,IAAIA,EAAS,OAAS,CAAC,EAClD,YAAK,QAAQ,mCAAmC7I,CAAW,0CAA+C27D,CAAS,EAAE,EACrH,KAAK,iBAAkB,EACvB,KAAK,MAAM,eAAeA,CAAS,EAEnC,KAAK,MAAM,QAAQ,CACjB,KAAM,QACN,KAAM,iBACd,CAAO,EACM,EACb,CACI,MAAMtU,EAAgB,KAAK,MAAM,IAAI,oBAAoB,eACnDz4D,EAAW,KAAK,MAAM,SAAU,EAMtC,GALuB,KAAK,gBAAgB,CAC1C,cAAey4D,EAAc,cAAe,EAC5C,cAAeA,EAAc,cAAe,EAC5C,YAAArnD,CACN,CAAK,EAMC,YAAK,iBAAkB,EACvB,KAAK,MAAM,eAAeA,CAAW,EAErC,KAAK,MAAM,QAAQ,CACjB,KAAM,QACN,KAAM,qBACd,CAAO,EACM,GAET,MAAM07D,EAAYrjD,GAAczpB,EAAUoR,CAAW,EAErD,OAAI07D,EAAU,OAAS,GACrB,KAAK,QAAQ,cAAc17D,CAAW,mBAAmB07D,EAAU,MAAM,CAAC,CAAC,EAAE,EAC7E,KAAK,iBAAkB,EACvB,KAAK,YAAY17D,CAAW,EACrB,IAGF,EACX,CACE,qBAAqB6I,EAAU7I,EAAar1B,EAAUixF,EAAmC,GAAO,CAC9F,GAAI,CAAC/yD,EAAS,OAEZ,MAAO,GAET,IAAIgzD,EAAahzD,EAAS,IAAIA,EAAS,OAAS,CAAC,EAAIoP,GACrD,MAAMsI,EAAS,CAAC51C,EAAS,QACnBmxF,EAAU,OAAOnxF,EAAS,oBAAuB,SAIvD,OAHI41C,IAAWu7C,GAAWF,KACxBC,EAAahzD,EAAS,IAAIA,EAAS,OAAS,CAAC,EAAIl+B,EAAS,eAAiB,GAEzEq1B,EAAc67D,CAItB,CACE,sBAAsBhzD,EAAU7I,EAAa,CAC3C,MAAI,GAAA6I,EAAS,QAEbA,EAAS,MAAM,CAAC,EAAI,GAAK7I,EAAc6I,EAAS,MAAM,CAAC,EAAI,KAAK,uBAIpE,CACE,gBAAgB,CACd,cAAA28C,EACA,cAAAD,EACA,YAAAvlD,CACJ,EAAK,CAED,GAAI,CAACwlD,EACH,OAEF,IAAIuW,EAEJ,GAAIvW,EAAc,QAAUD,EAAc,OAAQ,CAIhD,MAAMyW,EAAiB5jD,GAAUotC,EAAexlD,EAAc,CAAC,EACzDi8D,EAAa7jD,GAAUotC,EAAexlD,CAAW,EACjDk8D,EAAa9jD,GAAUmtC,EAAevlD,CAAW,EACnDk8D,EAAW,QAAU,CAACD,EAAW,QAAUD,EAAe,SAC5DD,EAAM,CACJ,MAAOC,EAAe,IAAI,CAAC,EAC3B,IAAKE,EAAW,IAAI,CAAC,CACtB,EAET,MACwB7jD,GAAcmtC,EAAexlD,CAAW,EAG3C,SACb+7D,EAAM,KAAK,uBAAuBvW,EAAexlD,CAAW,GAGhE,OAAI+7D,GACF,KAAK,QAAQ,mCAAmCA,EAAI,KAAK,OAAOA,EAAI,GAAG,6BAAkC/7D,CAAW,EAAE,EAC/G,IAEF,EACX,CAQE,YAAYm8D,EAAsB,CAChC,MAAMvtE,EAAW,KAAK,MAAM,SAAU,EAChCoR,EAAc,KAAK,MAAM,YAAa,EACtC07D,EAAYrjD,GAAczpB,EAAUoR,CAAW,EAErD,GADA,KAAK,iBAAkB,EACnB07D,EAAU,SAAW,GAAK17D,IAAgBm8D,EAC5C,OAEF,KAAK,QAAQ,eAAgB,eAAgBn8D,EAAa,yBAA0Bm8D,EAAsB,mBAAoBT,EAAU,MAAM,CAAC,CAAC,EAEhJ,KAAK,MAAM,eAAeA,EAAU,MAAM,CAAC,EAAI1jD,EAAiB,EAChE,MAAMmJ,EAAW,CACf,QAAS,CACP,KAAMnhB,EACN,GAAI07D,EAAU,MAAM,CAAC,CAC7B,CACK,EACD,KAAK,oBAAoB,QAAQ,CAC/B,KAAM,YACN,SAAAv6C,CACN,CAAK,EACD,KAAK,MAAM,QAAQ,CACjB,KAAM,QACN,KAAM,cACZ,CAAK,CACL,CACE,uBAAuBvyB,EAAUoR,EAAa,CAuB5C,MAAMo8D,EAAO9jD,GAAS1pB,CAAQ,EAC9B,QAASt0C,EAAI,EAAGA,EAAI8hH,EAAK,OAAQ9hH,IAAK,CACpC,MAAMumB,EAAQu7F,EAAK,MAAM9hH,CAAC,EACpBwmB,EAAMs7F,EAAK,IAAI9hH,CAAC,EAEtB,GAAI0lD,EAAcn/B,EAAQ,GAAKm/B,EAAcn/B,EAAQ,EACnD,MAAO,CACL,MAAAA,EACA,IAAAC,CACD,CAET,CACI,OAAO,IACX,CACA,CACA,MAAMu7F,GAAiB,CACrB,cAAe,GACf,UAAU7+F,EAAM,CAId,MAAMiyC,EAHO,KAAK,KAAK,CACrB,yBAA0B,EAChC,CAAK,EACsB,gBAAkB,KAAK,cAAe,EAC7D,OAAOjyC,EAAKiyC,CAAS,CACzB,CACA,EASM6sD,GAAa,SAAU/yE,EAAQ1tC,EAAS,CAC5C,IAAI0gH,EAAa,EACb91C,EAAS,EACb,MAAM+1C,EAAe50F,GAAMy0F,GAAgBxgH,CAAO,EAClD0tC,EAAO,MAAM,IAAM,CACjBA,EAAO,QAAQ,CACb,KAAM,QACN,KAAM,8BACZ,CAAK,CACL,CAAG,EAQD,MAAMkzE,EAAwB,UAAY,CACpCh2C,GACFl9B,EAAO,YAAYk9B,CAAM,CAE5B,EAQK3wB,EAAY,SAAU2Z,EAAW,CACjCA,GAAc,OAGlBgX,EAASl9B,EAAO,SAAU,IAAK,KAAYA,EAAO,YAAW,GAAM,EACnEA,EAAO,IAAI,iBAAkBkzE,CAAqB,EAClDlzE,EAAO,IAAIkmB,CAAS,EACpBlmB,EAAO,QAAQ,CACb,KAAM,QACN,KAAM,kBACZ,CAAK,EACDA,EAAO,KAAM,EACd,EAQK3lB,EAAe,UAAY,CAG/B,GAAI,KAAK,IAAK,EAAG24F,EAAaC,EAAa,cAAgB,IAAM,CAC/DjzE,EAAO,QAAQ,CACb,KAAM,QACN,KAAM,2BACd,CAAO,EACD,MACN,CACI,GAAI,CAACizE,EAAa,WAAa,OAAOA,EAAa,WAAc,WAAY,CAC3E/lD,EAAQ,IAAI,MAAM,uEAAuE,EACzF,MACN,CACI,OAAA8lD,EAAa,KAAK,IAAK,EAChBC,EAAa,UAAU,KAAKjzE,EAAQuM,CAAS,CACrD,EAOK4mE,EAAgB,UAAY,CAChCnzE,EAAO,IAAI,iBAAkBkzE,CAAqB,EAClDlzE,EAAO,IAAI,QAAS3lB,CAAY,EAChC2lB,EAAO,IAAI,UAAWmzE,CAAa,CACpC,EAQKC,EAAe,SAAU15C,EAAY,CACzCy5C,EAAe,EACfJ,GAAW/yE,EAAQ05B,CAAU,CAC9B,EACD15B,EAAO,GAAG,QAAS3lB,CAAY,EAC/B2lB,EAAO,GAAG,UAAWmzE,CAAa,EAGlCnzE,EAAO,oBAAsBozE,CAC/B,EAQMC,GAAsB,SAAU/gH,EAAS,CAC7CygH,GAAW,KAAMzgH,CAAO,CAC1B,EACA,IAAIghH,GAAY,SACZC,GAAY,QACZC,GAAY,QACZC,GAAY,QACZzgG,GAAU,QACd,MAAM0gG,GAAM,CACV,eAAAt8C,GACA,SAAAjE,GACA,MAAAmI,GACA,2BAA4Bu3B,GAC5B,0BAA2Be,GAC3B,sBAAAf,GACA,+BAAAE,GACA,yBAAA3B,GACA,0BAAAG,GACA,IAAKx3B,GAAU,CACjB,EAEA,OAAO,KAAKgH,EAAM,EAAE,QAAQ1lE,GAAQ,CAClC,OAAO,eAAeq4G,GAAKr4G,EAAM,CAC/B,KAAM,CACJ,OAAA6xD,EAAQ,IAAI,KAAK,aAAa7xD,CAAI,gDAAgD,EAC3E0lE,GAAO1lE,CAAI,CACnB,EACD,IAAI7H,EAAO,CAET,GADA05D,EAAQ,IAAI,KAAK,aAAa7xD,CAAI,gDAAgD,EAC9E,OAAO7H,GAAU,UAAYA,EAAQ,EAAG,CAC1C05D,EAAQ,IAAI,KAAK,gBAAgB7xD,CAAI,qCAAqC,EAC1E,MACR,CACM0lE,GAAO1lE,CAAI,EAAI7H,CACrB,CACA,CAAG,CACH,CAAC,EACD,MAAMmgH,GAAoB,cASpBC,GAAuB,SAAU3lD,EAAek5C,EAAgB,CACpE,MAAM/N,EAAc+N,EAAe,MAAO,EAC1C,IAAI0M,EAAgB,GACpB,QAAS9iH,EAAI,EAAGA,EAAIk9D,EAAc,OAAQl9D,IACxC,GAAIk9D,EAAcl9D,CAAC,EAAE,KAAOqoG,EAAY,GAAI,CAC1Cya,EAAgB9iH,EAChB,KACN,CAEEk9D,EAAc,eAAiB4lD,EAC/B5lD,EAAc,QAAQ,CACpB,cAAA4lD,EACA,KAAM,QACV,CAAG,CACH,EASMC,GAA0B,SAAU7lD,EAAeoJ,EAAK,CAC5DA,EAAI,gBAAe,EAAG,QAAQ06B,GAAO,CACnC9jC,EAAc,gBAAgB8jC,CAAG,CACrC,CAAG,EACD6hB,GAAqB3lD,EAAeoJ,EAAI,SAAS,CACnD,EAGAq8C,GAAI,cAAgB,UAAY,CAC9B,OAAOxmD,EAAQ,IAAI,KAAK,yEAA+E,CACzG,EACA,MAAM6mD,GAAgB,CAACC,EAAkB1vF,EAAc2vF,IAAkB,CACvE,GAAI,CAACD,EACH,OAAOA,EAET,IAAIzpG,EAAS,CAAE,EACX+Z,GAAgBA,EAAa,YAAcA,EAAa,WAAW,SACrE/Z,EAAS6lF,GAAgB/lF,GAAYia,EAAa,WAAW,MAAM,CAAC,GAElE2vF,GAAiBA,EAAc,YAAcA,EAAc,WAAW,SACxE1pG,EAAO,MAAQ0pG,EAAc,WAAW,QAE1C,MAAMC,EAAmBjpG,GAAgBV,EAAO,KAAK,EAC/C4pG,EAAmBlpG,GAAgBV,EAAO,KAAK,EAE/C6pG,EAAwB,CAAE,EAChC,UAAWhpF,KAAa4oF,EACtBI,EAAsBhpF,CAAS,EAAI,CAAE,EACjC+oF,IACFC,EAAsBhpF,CAAS,EAAE,iBAAmB+oF,GAElDD,IACFE,EAAsBhpF,CAAS,EAAE,iBAAmB8oF,GAQlD5vF,EAAa,mBAAqBA,EAAa,kBAAkB8G,CAAS,GAAK9G,EAAa,kBAAkB8G,CAAS,EAAE,OAC3HgpF,EAAsBhpF,CAAS,EAAE,KAAO9G,EAAa,kBAAkB8G,CAAS,EAAE,MAIhF,OAAO4oF,EAAiB5oF,CAAS,GAAM,WACzCgpF,EAAsBhpF,CAAS,EAAE,IAAM4oF,EAAiB5oF,CAAS,GAGrE,OAAO/M,GAAM21F,EAAkBI,CAAqB,CACtD,EAyBMC,GAA8B,CAACryF,EAAWsyF,IACvCtyF,EAAU,OAAO,CAACuyF,EAAenzF,IAAa,CACnD,GAAI,CAACA,EAAS,kBACZ,OAAOmzF,EAET,MAAMC,EAAoBF,EAAW,OAAO,CAACG,EAAerpF,IAAc,CACxE,MAAM4oF,EAAmB5yF,EAAS,kBAAkBgK,CAAS,EAC7D,OAAI4oF,GAAoBA,EAAiB,OACvCS,EAAcrpF,CAAS,EAAI,CACzB,KAAM4oF,EAAiB,IACxB,GAEIS,CACR,EAAE,EAAE,EACL,OAAI,OAAO,KAAKD,CAAiB,EAAE,QACjCD,EAAc,KAAKC,CAAiB,EAE/BD,CACR,EAAE,EAAE,EA2BDG,GAA4B,CAAC,CACjC,OAAA10E,EACA,iBAAA20E,EACA,WAAAC,EACA,cAAAC,CACF,IAAM,CACJ,GAAI,CAAC70E,EAAO,IAAI,oBACd,OAAO,QAAQ,QAAS,EAU1B,MAAMhe,EAAY4yF,EAAaC,EAAc,OAAO,CAACD,CAAU,CAAC,EAAIC,EAC9DC,EAAuBT,GAA4BryF,EAAW,OAAO,KAAK2yF,CAAgB,CAAC,EAC3FI,EAAiC,CAAE,EACnCC,EAA4B,CAAA,EAMlC,OAAAF,EAAqB,QAAQN,GAAqB,CAChDQ,EAA0B,KAAK,IAAI,QAAQ,CAACnuD,EAASU,IAAW,CAC9DvnB,EAAO,MAAM,IAAI,oBAAqB6mB,CAAO,CACnD,CAAK,CAAC,EACFkuD,EAA+B,KAAK,IAAI,QAAQ,CAACluD,EAASU,IAAW,CACnEvnB,EAAO,IAAI,oBAAoB,CAC7B,WAAYw0E,CACb,EAAEvkH,GAAO,CACR,GAAIA,EAAK,CACPs3D,EAAOt3D,CAAG,EACV,MACV,CACQ42D,EAAS,CACjB,CAAO,CACP,CAAK,CAAC,CACN,CAAG,EAOM,QAAQ,KAAK,CAIpB,QAAQ,IAAIkuD,CAA8B,EAE1C,QAAQ,KAAKC,CAAyB,CAAC,CAAC,CAC1C,EAmBMC,GAAkB,CAAC,CACvB,OAAAj1E,EACA,iBAAA20E,EACA,MAAA7tF,EACA,WAAA8tF,CACF,IAAM,CACJ,MAAMM,EAAgBnB,GAAcY,EAAkB7tF,EAAO8tF,CAAU,EACvE,OAAKM,GAGLl1E,EAAO,cAAa,EAAG,WAAak1E,EAGhCA,GAAiB,CAACl1E,EAAO,KAC3BktB,EAAQ,IAAI,KAAK,+DAA+D,EACzE,IAEF,IATE,EAUX,EACMioD,GAAqB,IAAM,CAC/B,GAAI,CAACniF,EAAS,aACZ,OAAO,KAET,MAAMoiF,EAAepiF,EAAS,aAAa,QAAQ2gF,EAAiB,EACpE,GAAI,CAACyB,EACH,OAAO,KAET,GAAI,CACF,OAAO,KAAK,MAAMA,CAAY,CAC/B,MAAW,CAEV,OAAO,IACX,CACA,EACMC,GAAwB/iH,GAAW,CACvC,GAAI,CAAC0gC,EAAS,aACZ,MAAO,GAET,IAAIsiF,EAAgBH,GAAoB,EACxCG,EAAgBA,EAAgBj3F,GAAMi3F,EAAehjH,CAAO,EAAIA,EAChE,GAAI,CACF0gC,EAAS,aAAa,QAAQ2gF,GAAmB,KAAK,UAAU2B,CAAa,CAAC,CAC/E,MAAW,CAKV,MAAO,EACX,CACE,OAAOA,CACT,EAcMC,GAAgB3L,GAChBA,EAAQ,YAAa,EAAC,QAAQ,wCAAwC,IAAM,EACvE,KAAK,MAAMA,EAAQ,UAAUA,EAAQ,QAAQ,GAAG,EAAI,CAAC,CAAC,EAGxDA,EASH4L,GAAmB,CAAClgH,EAAKxC,IAAa,CACrCwC,EAAI,sBACPA,EAAI,oBAAsB,IAAI,KAEhCA,EAAI,oBAAoB,IAAIxC,CAAQ,CACtC,EAQM2iH,GAAoB,CAACngH,EAAKxC,IAAa,CACtCwC,EAAI,uBACPA,EAAI,qBAAuB,IAAI,KAEjCA,EAAI,qBAAqB,IAAIxC,CAAQ,CACvC,EAQM4iH,GAAsB,CAACpgH,EAAKxC,IAAa,CACxCwC,EAAI,sBAGTA,EAAI,oBAAoB,OAAOxC,CAAQ,EAClCwC,EAAI,oBAAoB,MAC3B,OAAOA,EAAI,oBAEf,EAQMqgH,GAAuB,CAACrgH,EAAKxC,IAAa,CACzCwC,EAAI,uBAGTA,EAAI,qBAAqB,OAAOxC,CAAQ,EACnCwC,EAAI,qBAAqB,MAC5B,OAAOA,EAAI,qBAEf,EAKAo+G,GAAI,kBAAoB,UAAY,CAClC,GAAI,CAACnhF,GAAc,CAACA,EAAW,cAC7B,MAAO,GAET,MAAM6wB,EAAQ7wB,EAAW,cAAc,OAAO,EAE9C,OAAK26B,EAAQ,QAAQ,OAAO,EAAE,YAAW,EAIzB,CAEhB,gCAEA,gBAEA,kBAEA,wBAEA,kBAAmB,gBAAiB,qBAAqB,EAC1C,KAAK,SAAU0oD,EAAW,CACvC,MAAO,kBAAkB,KAAKxyD,EAAM,YAAYwyD,CAAS,CAAC,CAC9D,CAAG,EAhBQ,EAiBX,EAAG,EACHlC,GAAI,mBAAqB,UAAY,CACnC,MAAI,CAACnhF,GAAc,CAACA,EAAW,eAAiB,CAAC26B,EAAQ,QAAQ,OAAO,EAAE,cACjE,GAEF,kBAAkB,KAAK36B,EAAW,cAAc,OAAO,EAAE,YAAY,sBAAsB,CAAC,CACrG,EAAG,EACHmhF,GAAI,qBAAuBniH,GACrBA,IAAS,MACJmiH,GAAI,kBAETniH,IAAS,OACJmiH,GAAI,mBAEN,GAOTA,GAAI,YAAc,UAAY,CAC5B,OAAOxmD,EAAQ,IAAI,KAAK,yEAA+E,CACzG,EAOAwmD,GAAI,IAAI,UAAY,SAAU5gH,EAAU,CACtC0iH,GAAiB9B,GAAI,IAAK5gH,CAAQ,CACpC,EAOA4gH,GAAI,IAAI,WAAa,SAAU5gH,EAAU,CACvC2iH,GAAkB/B,GAAI,IAAK5gH,CAAQ,CACrC,EAOA4gH,GAAI,IAAI,WAAa,SAAU5gH,EAAU,CACvC4iH,GAAoBhC,GAAI,IAAK5gH,CAAQ,CACvC,EAOA4gH,GAAI,IAAI,YAAc,SAAU5gH,EAAU,CACxC6iH,GAAqBjC,GAAI,IAAK5gH,CAAQ,CACxC,EACA,MAAM+iH,GAAY3oD,EAAQ,aAAa,WAAW,EAYlD,MAAM4oD,WAAmBD,EAAU,CACjC,YAAYzmG,EAAQw2B,EAAMtzC,EAAS,CAUjC,GATA,MAAMszC,EAAMtzC,EAAQ,GAAG,EAGnB,OAAOA,EAAQ,kBAAqB,WACtC,KAAK,SAAS,UAAYA,EAAQ,kBAEpC,KAAK,QAAU+7D,GAAO,YAAY,EAG9BzoB,EAAK,UAAYA,EAAK,SAAS,SAAU,CAC3C,MAAMmwE,EAAU7oD,EAAQ,UAAUtnB,EAAK,SAAS,QAAQ,EACxD,KAAK,QAAUmwE,CACrB,CAMI,GALA,KAAK,MAAQnwE,EACb,KAAK,QAAUx2B,EACf,KAAK,MAAQ,CAAE,EACf,KAAK,wBAA0B,GAC/B,KAAK,YAAa,EACd,KAAK,SAAS,gBAAkBw2B,EAAK,2BAA6BA,EAAK,0BACzEA,EAAK,0BAA0B,EAAI,EACnCA,EAAK,0BAA0B,EAAI,UAC1B,KAAK,SAAS,iBAAmBA,EAAK,2BAA6BA,EAAK,2BAGjF,MAAM,IAAI,MAAM,0EAA+E,EAIjG,KAAK,GAAGrT,EAAY,CAAC,mBAAoB,yBAA0B,sBAAuB,oBAAoB,EAAG7sB,GAAS,CACxH,MAAMswG,EAAoBzjF,EAAW,mBAAqBA,EAAW,yBAA2BA,EAAW,sBAAwBA,EAAW,oBAC1IyjF,GAAqBA,EAAkB,SAAS,KAAK,MAAM,GAAE,CAAE,EACjE,KAAK,oBAAoB,mBAAoB,EAK7C,KAAK,oBAAoB,UAAW,CAE5C,CAAK,EACD,KAAK,GAAG,KAAK,MAAO,UAAW,UAAY,CACzC,GAAI,KAAK,wBAAyB,CAChC,KAAK,wBAA0B,GAC/B,MACR,CACM,KAAK,eAAe,KAAK,MAAM,YAAW,CAAE,CAClD,CAAK,EACD,KAAK,GAAG,KAAK,MAAO,QAAS,UAAY,CAGnC,KAAK,MAAM,MAAK,GAAM,KAAK,qBAC7B,KAAK,oBAAoB,aAAc,CAE/C,CAAK,EACD,KAAK,GAAG,KAAK,MAAO,OAAQ,KAAK,IAAI,CACzC,CAQE,YAAY1jH,EAAU,GAAI,CAkBxB,GAjBA,KAAK,SAAW+rB,GAAM,KAAK,SAAU/rB,CAAO,EAE5C,KAAK,SAAS,gBAAkB,KAAK,SAAS,iBAAmB,GACjE,KAAK,SAAS,iCAAmC,KAAK,SAAS,mCAAqC,GACpG,KAAK,SAAS,oBAAsB,KAAK,SAAS,qBAAuB,GACzE,KAAK,SAAS,6BAA+B,OAAO,KAAK,QAAQ,6BAAiC,IAAc,KAAK,QAAQ,6BAA+B,KAAK,SAAS,8BAAgC,GAC1M,KAAK,SAAS,mBAAqB,KAAK,SAAS,oBAAsB,GACvE,KAAK,SAAS,yBAA2B,KAAK,SAAS,0BAA4B,GACnF,KAAK,SAAS,yBAA2B,KAAK,SAAS,0BAA4B,GACnF,KAAK,SAAS,iBAAmB,KAAK,SAAS,kBAAoB,CAAE,EACrE,KAAK,SAAS,iBAAmB,KAAK,SAAS,kBAAoB,CAAE,EACrE,KAAK,SAAS,oBAAsB,KAAK,SAAS,qBAAuB,GACzE,KAAK,SAAS,MAAQ,KAAK,SAAS,QAAU,GAC9C,KAAK,SAAS,eAAiB,KAAK,SAAS,gBAAkB,GAC3D,OAAO,KAAK,SAAS,2BAA8B,WACrD,KAAK,SAAS,0BAA4B,IAExC,OAAO,KAAK,SAAS,WAAc,UACjC,KAAK,SAAS,6BAA8B,CAC9C,MAAM8iH,EAAeD,GAAoB,EACrCC,GAAgBA,EAAa,YAC/B,KAAK,SAAS,UAAYA,EAAa,UACvC,KAAK,MAAM,QAAQ,CACjB,KAAM,QACN,KAAM,kCAClB,CAAW,GAECA,GAAgBA,EAAa,aAC/B,KAAK,SAAS,WAAaA,EAAa,WACxC,KAAK,MAAM,QAAQ,CACjB,KAAM,QACN,KAAM,mCAClB,CAAW,EAEX,CAIQ,OAAO,KAAK,SAAS,WAAc,WACrC,KAAK,SAAS,UAAYr0C,GAAO,mBAInC,KAAK,SAAS,yBAA2B,KAAK,SAAS,0BAA4B,KAAK,SAAS,YAAcA,GAAO,kBAEtH,CAAC,kBAAmB,sBAAuB,mBAAoB,mCAAoC,YAAa,mBAAoB,mBAAoB,sBAAuB,mBAAoB,0BAA2B,iBAAkB,yBAA0B,QAAS,qBAAsB,2BAA4B,2BAA4B,uBAAwB,wBAAwB,EAAE,QAAQtkB,GAAU,CAC/Z,OAAO,KAAK,QAAQA,CAAM,EAAM,MAClC,KAAK,SAASA,CAAM,EAAI,KAAK,QAAQA,CAAM,EAEnD,CAAK,EACD,KAAK,iCAAmC,KAAK,SAAS,iCACtD,KAAK,oBAAsB,KAAK,SAAS,oBACzC,MAAMw5D,EAAmB,KAAK,SAAS,iBAEnC,OAAOA,GAAqB,UAAYA,GAAoB,IAC9D,KAAK,iBAAmBA,EAE3B,CAED,WAAW3jH,EAAU,GAAI,CACvB,KAAK,YAAYA,CAAO,CAC5B,CAOE,IAAIwd,EAAKve,EAAM,CAEb,GAAI,CAACue,EACH,OAEF,KAAK,YAAW,EAEhB,KAAK,SAAS,IAAMylG,GAAc,KAAK,QAAQ,GAAG,EAClD,KAAK,SAAS,KAAO,KAAK,MAC1B,KAAK,SAAS,UAAY7B,GAC1B,KAAK,SAAS,WAAajoG,GAAyBla,CAAI,EAExD,KAAK,SAAS,OAASo1B,GAAQ,CAC7B,KAAK,MAAM,eAAeA,CAAI,CACpC,EAEI,KAAK,SAAS,QAAU,KAAK,QAC7B,KAAK,oBAAsB,IAAIglF,GAAmB,KAAK,QAAQ,EAC/D,MAAMuK,EAAyB73F,GAAM,CACnC,uBAAwBqwC,EAC9B,EAAO,KAAK,SAAU,CAChB,SAAU,IAAM,KAAK,SAAU,EAC/B,MAAO,IAAM,KAAK,oBAAoB,MAAO,EAC7C,mBAAoB,KAAK,mBAC/B,CAAK,EACD,KAAK,iBAAmB,IAAI6iD,GAAgB2E,CAAsB,EAClE,KAAK,+BAAgC,EACrC,KAAK,oBAAoB,GAAG,QAAS,IAAM,CACzC,MAAMl2E,EAASktB,EAAQ,QAAQ,KAAK,MAAM,SAAS,QAAQ,EAC3D,IAAIl9D,EAAQ,KAAK,oBAAoB,MACjC,OAAOA,GAAU,UAAY,CAACA,EAAM,KACtCA,EAAM,KAAO,EACJ,OAAOA,GAAU,WAC1BA,EAAQ,CACN,QAASA,EACT,KAAM,CACP,GAEHgwC,EAAO,MAAMhwC,CAAK,CACxB,CAAK,EACD,MAAMmmH,EAAkB,KAAK,SAAS,eAAiBzC,GAAI,+BAA+B,GAAI,EAAIA,GAAI,2BAGtG,KAAK,oBAAoB,eAAiB,KAAK,eAAiB,KAAK,eAAe,KAAK,IAAI,EAAIyC,EAAgB,KAAK,IAAI,EAC1H,KAAK,oBAAoB,sBAAwBzC,GAAI,0BAA0B,KAAK,IAAI,EAExF,KAAK,UAAY,KAAK,oBAAoB,oBAC1C,KAAK,YAAc,KAAK,oBAAoB,YAI5C,OAAO,iBAAiB,KAAM,CAC5B,eAAgB,CACd,KAAM,CACJ,OAAO,KAAK,oBAAoB,cACjC,EACD,IAAI0C,EAAgB,CAClB,KAAK,oBAAoB,eAAiBA,EAAe,KAAK,IAAI,CAC5E,CACO,EACD,WAAY,CACV,KAAM,CACJ,OAAO,KAAK,oBAAoB,mBAAmB,WAAW,IAC/D,EACD,IAAIC,EAAY,CACd,KAAK,oBAAoB,mBAAmB,WAAW,KAAOA,EAG9D,KAAK,oBAAoB,mBAAmB,WAAW,MAAQ,CACzE,CACO,EACD,UAAW,CACT,KAAM,CACJ,IAAIC,EAAqB,KAAK,oBAAoB,mBAAmB,UACrE,MAAMC,EAAqBvjF,EAAS,UAAU,YAAcA,EAAS,UAAU,eAAiBA,EAAS,UAAU,iBAC7GwjF,EAAyB,IAC/B,GAAI,KAAK,SAAS,0BAA4BD,EAAoB,CAGhE,MAAME,EAAoCF,EAAmB,SAAW,IAAO,IAI3EE,GAAqCD,GAA0BF,GAAsBE,EACvFF,EAAqB,KAAK,IAAIA,EAAoBG,CAAiC,EAEnFH,EAAqBG,CAEnC,CACU,OAAOH,CACR,EACD,IAAI7jD,EAAW,CACb,KAAK,oBAAoB,mBAAmB,UAAYA,EAIxD,KAAK,oBAAoB,mBAAmB,WAAa,CACvD,KAAM,EACN,MAAO,CACR,CACX,CACO,EAUD,gBAAiB,CACf,KAAM,CACJ,MAAMikD,EAAe,GAAK,KAAK,WAAa,GAC5C,IAAIC,EACJ,OAAI,KAAK,WAAa,EACpBA,EAAgB,EAAI,KAAK,WAEzBA,EAAgB,EAEI,KAAK,MAAM,GAAKD,EAAeC,EAAc,CAEpE,EACD,KAAM,CACJzpD,EAAQ,IAAI,MAAM,6CAA6C,CACzE,CACA,CACA,CAAK,EACG,KAAK,SAAS,YAChB,KAAK,UAAY,KAAK,SAAS,WAE7B,KAAK,SAAS,aAChB,KAAK,WAAa,KAAK,SAAS,YAElC,OAAO,iBAAiB,KAAK,MAAO,CAClC,UAAW,CACT,IAAK,IAAM,KAAK,WAAa,EAC7B,WAAY,EACb,EACD,cAAe,CACb,IAAK,IAAM,KAAK,oBAAoB,eAAgB,GAAI,EACxD,WAAY,EACb,EACD,qBAAsB,CACpB,IAAK,IAAM,KAAK,oBAAoB,sBAAuB,GAAI,EAC/D,WAAY,EACb,EACD,sBAAuB,CACrB,IAAK,IAAM,KAAK,oBAAoB,uBAAwB,GAAI,EAChE,WAAY,EACb,EACD,qBAAsB,CACpB,IAAK,IAAM,KAAK,oBAAoB,sBAAuB,GAAI,EAC/D,WAAY,EACb,EACD,sBAAuB,CACrB,IAAK,IAAM,KAAK,oBAAoB,uBAAwB,GAAI,EAChE,WAAY,EACb,EACD,sBAAuB,CACrB,IAAK,IAAM,KAAK,oBAAoB,uBAAwB,GAAI,EAChE,WAAY,EACb,EACD,mBAAoB,CAClB,IAAK,IAAM,KAAK,oBAAoB,oBAAqB,GAAI,EAC7D,WAAY,EACb,EACD,aAAc,CACZ,IAAK,IAAM,KAAK,oBAAoB,cAAe,GAAI,EACvD,WAAY,EACb,EACD,wBAAyB,CACvB,IAAK,IAAM,KAAK,oBAAoB,yBAA0B,GAAI,EAClE,WAAY,EACb,EACD,yBAA0B,CACxB,IAAK,IAAM,KAAK,oBAAoB,0BAA2B,GAAI,EACnE,WAAY,EACb,EACD,oBAAqB,CACnB,IAAK,IAAM,KAAK,oBAAoB,qBAAsB,GAAI,EAC9D,WAAY,EACb,EACD,iBAAkB,CAChB,IAAK,IAAM,KAAK,oBAAoB,kBAAmB,GAAI,EAC3D,WAAY,EACb,EACD,SAAU,CACR,IAAK,IAAMsC,GAAkB,KAAK,MAAM,SAAQ,CAAE,EAClD,WAAY,EACb,EACD,YAAa,CACX,IAAK,IAAM,KAAK,MAAM,YAAa,EACnC,WAAY,EACb,EACD,cAAe,CACb,IAAK,IAAM,KAAK,MAAM,eACtB,WAAY,EACb,EACD,YAAa,CACX,IAAK,IAAM,KAAK,MAAM,MACtB,WAAY,EACb,EACD,SAAU,CACR,IAAK,IAAM,KAAK,MAAM,SAAU,EAChC,WAAY,EACb,EACD,KAAM,CACJ,IAAK,IAAM,KAAK,UAAU,KAC1B,WAAY,EACb,EACD,iBAAkB,CAChB,IAAK,IAAM,KAAK,MAAM,kBAAmB,EACzC,WAAY,EACb,EACD,SAAU,CACR,IAAK,IAAMA,GAAkB,KAAK,MAAM,SAAQ,CAAE,EAClD,WAAY,EACb,EACD,UAAW,CACT,IAAK,IAAM,KAAK,IAAK,EACrB,WAAY,EACb,EACD,qBAAsB,CACpB,IAAK,IAAM,KAAK,MAAM,wBAAyB,EAC/C,WAAY,EACpB,CACA,CAAK,EACD,KAAK,MAAM,IAAI,UAAW,KAAK,oBAAoB,eAAe,KAAK,KAAK,mBAAmB,CAAC,EAChG,KAAK,MAAM,GAAG,kBAAmB,IAAM,CACjC,KAAK,SAAS,8BAChB6lD,GAAsB,CACpB,UAAW,KAAK,UAChB,WAAY,KAAK,MAAM,KAAK,UAAU,CAChD,CAAS,CAET,CAAK,EACD,KAAK,oBAAoB,GAAG,uBAAwB,IAAM,CAExDhE,GAAwB,IAAI,CAClC,CAAK,EACD,KAAK,oBAAoB,eAAe,GAAG,uBAAwB,IAAM,CACvE,KAAK,UAAW,CACtB,CAAK,EAGD,KAAK,GAAG,KAAK,oBAAqB,WAAY,UAAY,CACxD,KAAK,MAAM,QAAQ,UAAU,CACnC,CAAK,EAGD,KAAK,GAAG,KAAK,oBAAqB,YAAa,UAAY,CACzD,KAAK,wBAA0B,EACrC,CAAK,EACD,KAAK,oBAAmB,EAGnB,KAAK,MAAM,OAGhB,KAAK,gBAAkBr+E,EAAS,IAAI,gBAAgB,KAAK,oBAAoB,WAAW,EACxF,KAAK,MAAM,IAAI,KAAK,eAAe,EACvC,CACE,oBAAqB,CACnB,MAAM4jF,EAAsB,KAAK,oBAAoB,YAAY,MAAM,qBACvE,KAAK,QAAQ,sCAAsC,EACnDlC,GAA0B,CACxB,OAAQ,KAAK,QACb,iBAAkB,KAAK,QAAQ,WAC/B,WAAYkC,GAAuBA,EAAoB,MAAO,EAC9D,cAAe,KAAK,UAAU,KAAK,SACzC,CAAK,EAAE,KAAK,IAAM,CACZ,KAAK,QAAQ,yBAAyB,EACtC,KAAK,oBAAoB,eAAe,eAAgB,CAC9D,CAAK,EAAE,MAAM3mH,GAAO,CACd,KAAK,QAAQ,uCAAwCA,CAAG,EACxD,KAAK,QAAQ,MAAM,CACjB,QAAS,0CACT,KAAM,CACd,CAAO,CACP,CAAK,CACL,CACE,sBAAuB,CASrB,KAAK,QAAQ,gEAAgE,EAC7E,KAAK,mBAAoB,CAC7B,CAUE,WAAY,CACV,MAAM2mH,EAAsB,KAAK,oBAAoB,YAAY,MAAM,qBACjEC,EAAqB5B,GAAgB,CACzC,OAAQ,KAAK,QACb,iBAAkB,KAAK,QAAQ,WAC/B,MAAO,KAAK,UAAU,MAAO,EAC7B,WAAY2B,GAAuBA,EAAoB,MAAK,CAClE,CAAK,EAMD,GALA,KAAK,QAAQ,MAAM,GAAG,kBAAmBvgH,GAAK,CAC5C,KAAK,oBAAoB,0BAA0BA,EAAE,MAAOA,EAAE,MAAM,CAC1E,CAAK,EACD,KAAK,qBAAuB,KAAK,qBAAqB,KAAK,IAAI,EAC/D,KAAK,QAAQ,MAAM,GAAG,gBAAiB,KAAK,oBAAoB,EAC5D,CAACwgH,EAAoB,CAEvB,KAAK,oBAAoB,eAAe,eAAgB,EACxD,MACN,CACI,KAAK,mBAAoB,CAC7B,CAQE,qBAAsB,CACpB,MAAM72E,EAASktB,EAAQ,QAAQ,KAAK,MAAM,SAAS,QAAQ,EAGvD,CAACltB,GAAU,CAACA,EAAO,eAAiB,KAAK,iBAG7C,KAAK,eAAiBA,EAAO,cAAe,EAC5C,KAAK,oBAAoB,GAAG,uBAAwB,IAAM,CACxD8zE,GAAwB,KAAK,eAAgB,IAAI,CACvD,CAAK,EACD,KAAK,UAAU,GAAG,cAAe,IAAM,CACrCF,GAAqB,KAAK,eAAgB,KAAK,SAAS,CAC9D,CAAK,EACL,CAKE,OAAO,SAAU,CACf,MAAO,CACL,0BAA2BN,GAC3B,SAAUC,GACV,aAAcC,GACd,cAAeC,GACf,gBAAiBzgG,EAClB,CACL,CAKE,SAAU,CACR,OAAO,KAAK,YAAY,QAAS,CACrC,CACE,eAAgB,CACd,OAAOisF,GAAc,cAAe,CACxC,CAKE,MAAO,CACL,KAAK,oBAAoB,KAAM,CACnC,CAKE,eAAexoD,EAAa,CAC1B,KAAK,oBAAoB,eAAeA,CAAW,CACvD,CAKE,UAAW,CACT,OAAO,KAAK,oBAAoB,SAAU,CAC9C,CAKE,UAAW,CACT,OAAO,KAAK,oBAAoB,SAAU,CAC9C,CAKE,SAAU,CACJ,KAAK,kBACP,KAAK,iBAAiB,QAAS,EAE7B,KAAK,qBACP,KAAK,oBAAoB,QAAS,EAEhC,KAAK,gBACP,KAAK,eAAe,QAAS,EAE3B,KAAK,OAAS,KAAK,MAAM,KAC3B,OAAO,KAAK,MAAM,IAEhB,KAAK,iBAAmBzjB,EAAS,IAAI,kBACvCA,EAAS,IAAI,gBAAgB,KAAK,eAAe,EACjD,KAAK,gBAAkB,MAErB,KAAK,OACP,KAAK,MAAM,IAAI,gBAAiB,KAAK,oBAAoB,EAE3D,MAAM,QAAS,CACnB,CACE,qBAAqBrM,EAAM7zB,EAAU,CACnC,OAAO+pE,GAAe,CACpB,SAAU,KAAK,oBAAoB,MAAO,EAC1C,KAAAl2C,EACA,SAAA7zB,CACN,CAAK,CACF,CAED,kBAAkBkpE,EAAalpE,EAAUqqE,EAAiB,GAAMF,EAAa,EAAG,CAC9E,OAAOD,GAAkB,CACvB,YAAAhB,EACA,SAAU,KAAK,oBAAoB,MAAO,EAC1C,WAAAiB,EACA,eAAAE,EACA,OAAQ,KAAK,SAAS,OACtB,KAAM,KAAK,SAAS,KACpB,SAAArqE,CACN,CAAK,CACL,CAME,gBAAiB,CAMf,KAAK,IAAI,UAAYA,GAAY,CAC/B0iH,GAAiB,KAAK,IAAK1iH,CAAQ,CACpC,EAOD,KAAK,IAAI,WAAaA,GAAY,CAChC2iH,GAAkB,KAAK,IAAK3iH,CAAQ,CACrC,EAOD,KAAK,IAAI,WAAaA,GAAY,CAChC4iH,GAAoB,KAAK,IAAK5iH,CAAQ,CACvC,EAOD,KAAK,IAAI,YAAcA,GAAY,CACjC6iH,GAAqB,KAAK,IAAK7iH,CAAQ,CAC7C,EAGI,KAAK,QAAQ,QAAQ,iBAAiB,CAC1C,CACE,gCAAiC,CAC/B,MAAMgkH,EAA2B,CAAC,wBAAyB,wBAAyB,2BAA4B,8BAA+B,uBAAuB,EAChKC,EAAkB,CAAC,YAAa,qBAAqB,EAE3DD,EAAyB,QAAQ50D,GAAa,CAC5C,KAAK,oBAAoB,GAAGA,EAAW0V,GAAY,CACjD,KAAK,QAAQ,QAAQ1nE,GAAS,CAAE,EAAE0nE,CAAQ,CAAC,CACnD,CAAO,CACP,CAAK,EACDm/C,EAAgB,QAAQ70D,GAAa,CACnC,KAAK,iBAAiB,GAAGA,EAAW0V,GAAY,CAC9C,KAAK,QAAQ,QAAQ1nE,GAAS,CAAE,EAAE0nE,CAAQ,CAAC,CACnD,CAAO,CACP,CAAK,CACL,CACA,CASA,MAAMo/C,GAAmB,CACvB,KAAM,yBACN,QAAS1D,GACT,gBAAgB1nE,EAAQt5C,EAAU,GAAI,CACpC,MAAM2gH,EAAe50F,GAAM6uC,EAAQ,QAAS56D,CAAO,EACnD,OAAO0kH,GAAiB,YAAYprE,EAAO,KAAMqnE,CAAY,CAC9D,EACD,aAAa7jG,EAAQw2B,EAAMtzC,EAAU,CAAA,EAAI,CACvC,MAAM2gH,EAAe50F,GAAM6uC,EAAQ,QAAS56D,CAAO,EACnD,OAAAszC,EAAK,IAAM,IAAIkwE,GAAW1mG,EAAQw2B,EAAMqtE,CAAY,EACpDrtE,EAAK,IAAI,IAAMm0B,GAAY,EAC3Bn0B,EAAK,IAAI,eAAgB,EACzBA,EAAK,IAAI,IAAIx2B,EAAO,IAAKA,EAAO,IAAI,EAC7Bw2B,EAAK,GACb,EACD,YAAYr0C,EAAMe,EAAS,CACzB,MAAM2kH,EAAaxrG,GAAyBla,CAAI,EAChD,GAAI,CAAC0lH,EACH,MAAO,GAET,MAAMC,EAAiBF,GAAiB,kBAAkB1kH,CAAO,EAGjE,MAD0B,CADGohH,GAAI,qBAAqBuD,CAAU,GACbC,EACxB,QAAU,EACtC,EACD,kBAAkB5kH,EAAU,GAAI,CAC9B,KAAM,CACJ,IAAA+kE,EAAM,CAAA,CACZ,EAAQ/kE,EACE6kH,EAAwB,EAAEjqD,EAAQ,QAAQ,eAAiBA,EAAQ,QAAQ,QAC3E,CACJ,eAAAgqD,EAAiBC,CACvB,EAAQ9/C,EACJ,OAAO6/C,CACX,CACA,EAQME,GAA6B,IAC1BjsG,GAAqB,uBAAuB,EAGjDisG,MACFlqD,EAAQ,QAAQ,OAAO,EAAE,sBAAsB8pD,GAAkB,CAAC,EAEpE9pD,EAAQ,WAAa4oD,GACrB5oD,EAAQ,iBAAmB8pD,GAC3B9pD,EAAQ,IAAMwmD,GACTxmD,EAAQ,KACXA,EAAQ,kBAAkB,MAAOwmD,EAAG,EAEtCxmD,EAAQ,QAAQ,IAAMA,EAAQ,QAAQ,KAAO,CAAE,GAC3C,CAACA,EAAQ,WAAa,CAACA,EAAQ,UAAU,qBAAqB,IAChEA,EAAQ,eAAe,sBAAuBmmD,EAAmB","x_google_ignoreList":[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39]}